diff options
Diffstat (limited to 'src')
209 files changed, 20476 insertions, 2333 deletions
diff --git a/src/audio_core/codec.cpp b/src/audio_core/codec.cpp index 7a3bd7eb3..6fba9fdae 100644 --- a/src/audio_core/codec.cpp +++ b/src/audio_core/codec.cpp @@ -117,7 +117,9 @@ StereoBuffer16 DecodePCM16(const unsigned num_channels, const u8* const data, ret[i].fill(sample); } } else { - std::memcpy(ret.data(), data, sample_count * 2 * sizeof(u16)); + for (size_t i = 0; i < sample_count; ++i) { + std::memcpy(&ret[i], data + i * sizeof(s16) * 2, 2 * sizeof(s16)); + } } return ret; diff --git a/src/audio_core/codec.h b/src/audio_core/codec.h index 2b0c395e6..877b2202d 100644 --- a/src/audio_core/codec.h +++ b/src/audio_core/codec.h @@ -5,13 +5,13 @@ #pragma once #include <array> -#include <vector> +#include <deque> #include "common/common_types.h" namespace Codec { /// A variable length buffer of signed PCM16 stereo samples. -using StereoBuffer16 = std::vector<std::array<s16, 2>>; +using StereoBuffer16 = std::deque<std::array<s16, 2>>; /// See: Codec::DecodeADPCM struct ADPCMState { diff --git a/src/audio_core/hle/source.cpp b/src/audio_core/hle/source.cpp index 92484c526..c12287700 100644 --- a/src/audio_core/hle/source.cpp +++ b/src/audio_core/hle/source.cpp @@ -244,17 +244,27 @@ void Source::GenerateFrame() { break; } - const size_t size_to_copy = - std::min(state.current_buffer.size(), current_frame.size() - frame_position); - - std::copy(state.current_buffer.begin(), state.current_buffer.begin() + size_to_copy, - current_frame.begin() + frame_position); - state.current_buffer.erase(state.current_buffer.begin(), - state.current_buffer.begin() + size_to_copy); - - frame_position += size_to_copy; - state.next_sample_number += static_cast<u32>(size_to_copy); + switch (state.interpolation_mode) { + case InterpolationMode::None: + AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier, + current_frame, frame_position); + break; + case InterpolationMode::Linear: + AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier, + current_frame, frame_position); + break; + case InterpolationMode::Polyphase: + // TODO(merry): Implement polyphase interpolation + LOG_DEBUG(Audio_DSP, "Polyphase interpolation unimplemented; falling back to linear"); + AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier, + current_frame, frame_position); + break; + default: + UNIMPLEMENTED(); + break; + } } + state.next_sample_number += static_cast<u32>(frame_position); state.filters.ProcessFrame(current_frame); } @@ -305,25 +315,6 @@ bool Source::DequeueBuffer() { return true; } - switch (state.interpolation_mode) { - case InterpolationMode::None: - state.current_buffer = - AudioInterp::None(state.interp_state, state.current_buffer, state.rate_multiplier); - break; - case InterpolationMode::Linear: - state.current_buffer = - AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier); - break; - case InterpolationMode::Polyphase: - // TODO(merry): Implement polyphase interpolation - state.current_buffer = - AudioInterp::Linear(state.interp_state, state.current_buffer, state.rate_multiplier); - break; - default: - UNIMPLEMENTED(); - break; - } - // the first playthrough starts at play_position, loops start at the beginning of the buffer state.current_sample_number = (!buf.has_played) ? buf.play_position : 0; state.next_sample_number = state.current_sample_number; diff --git a/src/audio_core/hle/source.h b/src/audio_core/hle/source.h index ccb7f064f..c4d2debc2 100644 --- a/src/audio_core/hle/source.h +++ b/src/audio_core/hle/source.h @@ -108,7 +108,7 @@ private: u32 current_sample_number = 0; u32 next_sample_number = 0; - std::vector<std::array<s16, 2>> current_buffer; + AudioInterp::StereoBuffer16 current_buffer; // buffer_id state diff --git a/src/audio_core/interpolate.cpp b/src/audio_core/interpolate.cpp index 8a5d4181a..83573d772 100644 --- a/src/audio_core/interpolate.cpp +++ b/src/audio_core/interpolate.cpp @@ -13,74 +13,64 @@ namespace AudioInterp { constexpr u64 scale_factor = 1 << 24; constexpr u64 scale_mask = scale_factor - 1; -/// Here we step over the input in steps of rate_multiplier, until we consume all of the input. +/// Here we step over the input in steps of rate, until we consume all of the input. /// Three adjacent samples are passed to fn each step. template <typename Function> -static StereoBuffer16 StepOverSamples(State& state, const StereoBuffer16& input, - float rate_multiplier, Function fn) { - ASSERT(rate_multiplier > 0); +static void StepOverSamples(State& state, StereoBuffer16& input, float rate, + DSP::HLE::StereoFrame16& output, size_t& outputi, Function fn) { + ASSERT(rate > 0); - if (input.size() < 2) - return {}; + if (input.empty()) + return; - StereoBuffer16 output; - output.reserve(static_cast<size_t>(input.size() / rate_multiplier)); + input.insert(input.begin(), {state.xn2, state.xn1}); - u64 step_size = static_cast<u64>(rate_multiplier * scale_factor); + const u64 step_size = static_cast<u64>(rate * scale_factor); + u64 fposition = state.fposition; + size_t inputi = 0; - u64 fposition = 0; - const u64 max_fposition = input.size() * scale_factor; + while (outputi < output.size()) { + inputi = static_cast<size_t>(fposition / scale_factor); - while (fposition < 1 * scale_factor) { - u64 fraction = fposition & scale_mask; - - output.push_back(fn(fraction, state.xn2, state.xn1, input[0])); - - fposition += step_size; - } - - while (fposition < 2 * scale_factor) { - u64 fraction = fposition & scale_mask; - - output.push_back(fn(fraction, state.xn1, input[0], input[1])); - - fposition += step_size; - } + if (inputi + 2 >= input.size()) { + inputi = input.size() - 2; + break; + } - while (fposition < max_fposition) { u64 fraction = fposition & scale_mask; - - size_t index = static_cast<size_t>(fposition / scale_factor); - output.push_back(fn(fraction, input[index - 2], input[index - 1], input[index])); + output[outputi++] = fn(fraction, input[inputi], input[inputi + 1], input[inputi + 2]); fposition += step_size; } - state.xn2 = input[input.size() - 2]; - state.xn1 = input[input.size() - 1]; + state.xn2 = input[inputi]; + state.xn1 = input[inputi + 1]; + state.fposition = fposition - inputi * scale_factor; - return output; + input.erase(input.begin(), std::next(input.begin(), inputi + 2)); } -StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier) { - return StepOverSamples( - state, input, rate_multiplier, +void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output, + size_t& outputi) { + StepOverSamples( + state, input, rate, output, outputi, [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { return x0; }); } -StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier) { +void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output, + size_t& outputi) { // Note on accuracy: Some values that this produces are +/- 1 from the actual firmware. - return StepOverSamples(state, input, rate_multiplier, - [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { - // This is a saturated subtraction. (Verified by black-box fuzzing.) - s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767); - s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767); - - return std::array<s16, 2>{ - static_cast<s16>(x0[0] + fraction * delta0 / scale_factor), - static_cast<s16>(x0[1] + fraction * delta1 / scale_factor), - }; - }); + StepOverSamples(state, input, rate, output, outputi, + [](u64 fraction, const auto& x0, const auto& x1, const auto& x2) { + // This is a saturated subtraction. (Verified by black-box fuzzing.) + s64 delta0 = MathUtil::Clamp<s64>(x1[0] - x0[0], -32768, 32767); + s64 delta1 = MathUtil::Clamp<s64>(x1[1] - x0[1], -32768, 32767); + + return std::array<s16, 2>{ + static_cast<s16>(x0[0] + fraction * delta0 / scale_factor), + static_cast<s16>(x0[1] + fraction * delta1 / scale_factor), + }; + }); } } // namespace AudioInterp diff --git a/src/audio_core/interpolate.h b/src/audio_core/interpolate.h index 19a7b66cb..8dff6111a 100644 --- a/src/audio_core/interpolate.h +++ b/src/audio_core/interpolate.h @@ -5,40 +5,45 @@ #pragma once #include <array> -#include <vector> +#include <deque> +#include "audio_core/hle/common.h" #include "common/common_types.h" namespace AudioInterp { /// A variable length buffer of signed PCM16 stereo samples. -using StereoBuffer16 = std::vector<std::array<s16, 2>>; +using StereoBuffer16 = std::deque<std::array<s16, 2>>; struct State { - // Two historical samples. + /// Two historical samples. std::array<s16, 2> xn1 = {}; ///< x[n-1] std::array<s16, 2> xn2 = {}; ///< x[n-2] + /// Current fractional position. + u64 fposition = 0; }; /** * No interpolation. This is equivalent to a zero-order hold. There is a two-sample predelay. * @param state Interpolation state. * @param input Input buffer. - * @param rate_multiplier Stretch factor. Must be a positive non-zero value. - * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0 - * performs upsampling. - * @return The resampled audio buffer. + * @param rate Stretch factor. Must be a positive non-zero value. + * rate > 1.0 performs decimation and rate < 1.0 performs upsampling. + * @param output The resampled audio buffer. + * @param outputi The index of output to start writing to. */ -StereoBuffer16 None(State& state, const StereoBuffer16& input, float rate_multiplier); +void None(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output, + size_t& outputi); /** * Linear interpolation. This is equivalent to a first-order hold. There is a two-sample predelay. * @param state Interpolation state. * @param input Input buffer. - * @param rate_multiplier Stretch factor. Must be a positive non-zero value. - * rate_multiplier > 1.0 performs decimation and rate_multipler < 1.0 - * performs upsampling. - * @return The resampled audio buffer. + * @param rate Stretch factor. Must be a positive non-zero value. + * rate > 1.0 performs decimation and rate < 1.0 performs upsampling. + * @param output The resampled audio buffer. + * @param outputi The index of output to start writing to. */ -StereoBuffer16 Linear(State& state, const StereoBuffer16& input, float rate_multiplier); +void Linear(State& state, StereoBuffer16& input, float rate, DSP::HLE::StereoFrame16& output, + size_t& outputi); } // namespace AudioInterp diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 14574e56c..e524c5535 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -165,6 +165,8 @@ int main(int argc, char** argv) { break; // Expected case } + Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "SDL"); + while (emu_window->IsOpen()) { system.RunLoop(); } diff --git a/src/citra/citra.rc b/src/citra/citra.rc index fea603004..c490ef302 100644 --- a/src/citra/citra.rc +++ b/src/citra/citra.rc @@ -1,3 +1,4 @@ +#include "winresrc.h" ///////////////////////////////////////////////////////////////////////////// // // Icon @@ -7,3 +8,10 @@ // remains consistent on all systems. CITRA_ICON ICON "../../dist/citra.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "../../dist/citra.manifest" diff --git a/src/citra/config.cpp b/src/citra/config.cpp index 69247b166..45c28ad09 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -76,6 +76,11 @@ void Config::ReadValues() { Settings::values.analogs[i] = default_param; } + Settings::values.motion_device = sdl2_config->Get( + "Controls", "motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01"); + Settings::values.touch_device = + sdl2_config->Get("Controls", "touch_device", "engine:emu_window"); + // Core Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); @@ -153,8 +158,14 @@ void Config::ReadValues() { static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689)); // Web Service + Settings::values.enable_telemetry = + sdl2_config->GetBoolean("WebService", "enable_telemetry", true); Settings::values.telemetry_endpoint_url = sdl2_config->Get( "WebService", "telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry"); + Settings::values.verify_endpoint_url = sdl2_config->Get( + "WebService", "verify_endpoint_url", "https://services.citra-emu.org/api/profile"); + Settings::values.citra_username = sdl2_config->Get("WebService", "citra_username", ""); + Settings::values.citra_token = sdl2_config->Get("WebService", "citra_token", ""); } void Config::Reload() { diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h index a12498e0f..59faf773f 100644 --- a/src/citra/default_ini.h +++ b/src/citra/default_ini.h @@ -12,7 +12,7 @@ const char* sdl2_config_file = R"( # It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." # Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values -# for button input, the following devices are avaible: +# for button input, the following devices are available: # - "keyboard" (default) for keyboard input. Required parameters: # - "code": the code of the key to bind # - "sdl" for joystick input using SDL. Required parameters: @@ -21,7 +21,7 @@ const char* sdl2_config_file = R"( # - "hat"(optional): the index of the hat to bind as direction buttons # - "axis"(optional): the index of the axis to bind # - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right" -# - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is +# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is # triggered if the axis value crosses # - "direction"(only used for axis): "+" means the button is triggered when the axis value # is greater than the threshold; "-" means the button is triggered when the axis value @@ -42,8 +42,8 @@ button_zl= button_zr= button_home= -# for analog input, the following devices are avaible: -# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: +# for analog input, the following devices are available: +# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: # - "up", "down", "left", "right": sub-devices for each direction. # Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00" # - "modifier": sub-devices as a modifier. @@ -56,6 +56,16 @@ button_home= circle_pad= c_stick= +# for motion input, the following devices are available: +# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: +# - "update_period": update period in milliseconds (default to 100) +# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01) +motion_device= + +# for touch input, the following devices are available: +# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required +touch_device= + [Core] # Whether to use the Just-In-Time (JIT) compiler for CPU emulation # 0: Interpreter (slow), 1 (default): JIT (fast) @@ -170,7 +180,16 @@ use_gdbstub=false gdbstub_port=24689 [WebService] +# Whether or not to enable telemetry +# 0: No, 1 (default): Yes +enable_telemetry = # Endpoint URL for submitting telemetry data -telemetry_endpoint_url = +telemetry_endpoint_url = https://services.citra-emu.org/api/telemetry +# Endpoint URL to verify the username and token +verify_endpoint_url = https://services.citra-emu.org/api/profile +# Username and token for Citra Web Service +# See https://services.citra-emu.org/ for more info +citra_username = +citra_token = )"; } diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index b0f808399..25643715a 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -16,11 +16,12 @@ #include "core/settings.h" #include "input_common/keyboard.h" #include "input_common/main.h" +#include "input_common/motion_emu.h" #include "network/network.h" void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) { TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0)); - motion_emu->Tilt(x, y); + InputCommon::GetMotionEmu()->Tilt(x, y); } void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { @@ -32,9 +33,9 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { } } else if (button == SDL_BUTTON_RIGHT) { if (state == SDL_PRESSED) { - motion_emu->BeginTilt(x, y); + InputCommon::GetMotionEmu()->BeginTilt(x, y); } else { - motion_emu->EndTilt(); + InputCommon::GetMotionEmu()->EndTilt(); } } } @@ -61,8 +62,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() { InputCommon::Init(); Network::Init(); - motion_emu = std::make_unique<Motion::MotionEmu>(*this); - SDL_SetMainReady(); // Initialize the window @@ -117,7 +116,6 @@ EmuWindow_SDL2::EmuWindow_SDL2() { EmuWindow_SDL2::~EmuWindow_SDL2() { SDL_GL_DeleteContext(gl_context); SDL_Quit(); - motion_emu = nullptr; Network::Shutdown(); InputCommon::Shutdown(); diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 1ce2991f7..3664d2fbe 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -7,7 +7,6 @@ #include <memory> #include <utility> #include "core/frontend/emu_window.h" -#include "core/frontend/motion_emu.h" struct SDL_Window; @@ -57,7 +56,4 @@ private: using SDL_GLContext = void*; /// The OpenGL context associated with the window SDL_GLContext gl_context; - - /// Motion sensors emulation - std::unique_ptr<Motion::MotionEmu> motion_emu; }; diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index f364b2284..add7566c2 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -12,6 +12,7 @@ set(SRCS configuration/configure_graphics.cpp configuration/configure_input.cpp configuration/configure_system.cpp + configuration/configure_web.cpp debugger/graphics/graphics.cpp debugger/graphics/graphics_breakpoint_observer.cpp debugger/graphics/graphics_breakpoints.cpp @@ -42,6 +43,7 @@ set(HEADERS configuration/configure_graphics.h configuration/configure_input.h configuration/configure_system.h + configuration/configure_web.h debugger/graphics/graphics.h debugger/graphics/graphics_breakpoint_observer.h debugger/graphics/graphics_breakpoints.h @@ -71,11 +73,13 @@ set(UIS configuration/configure_graphics.ui configuration/configure_input.ui configuration/configure_system.ui + configuration/configure_web.ui debugger/registers.ui hotkeys.ui main.ui ) +file(GLOB_RECURSE ICONS ${CMAKE_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE THEMES ${CMAKE_SOURCE_DIR}/dist/qt_themes/*) create_directory_groups(${SRCS} ${HEADERS} ${UIS}) @@ -89,10 +93,10 @@ endif() if (APPLE) set(MACOSX_ICON "../../dist/citra.icns") set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES} ${MACOSX_ICON}) + add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES} ${MACOSX_ICON}) set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) else() - add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${THEMES}) + add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS} ${ICONS} ${THEMES}) endif() target_link_libraries(citra-qt PRIVATE audio_core common core input_common network video_core) target_link_libraries(citra-qt PRIVATE Boost::boost glad nihstro-headers Qt5::OpenGL Qt5::Widgets) diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index 30554890f..7107bfc60 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -17,6 +17,7 @@ #include "core/settings.h" #include "input_common/keyboard.h" #include "input_common/main.h" +#include "input_common/motion_emu.h" #include "network/network.h" EmuThread::EmuThread(GRenderWindow* render_window) @@ -201,7 +202,6 @@ qreal GRenderWindow::windowPixelRatio() { } void GRenderWindow::closeEvent(QCloseEvent* event) { - motion_emu = nullptr; emit Closed(); QWidget::closeEvent(event); } @@ -221,7 +221,7 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) { this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio), static_cast<unsigned>(pos.y() * pixelRatio)); } else if (event->button() == Qt::RightButton) { - motion_emu->BeginTilt(pos.x(), pos.y()); + InputCommon::GetMotionEmu()->BeginTilt(pos.x(), pos.y()); } } @@ -230,14 +230,14 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) { qreal pixelRatio = windowPixelRatio(); this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u), std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u)); - motion_emu->Tilt(pos.x(), pos.y()); + InputCommon::GetMotionEmu()->Tilt(pos.x(), pos.y()); } void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) this->TouchReleased(); else if (event->button() == Qt::RightButton) - motion_emu->EndTilt(); + InputCommon::GetMotionEmu()->EndTilt(); } void GRenderWindow::focusOutEvent(QFocusEvent* event) { @@ -290,13 +290,11 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest( } void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) { - motion_emu = std::make_unique<Motion::MotionEmu>(*this); this->emu_thread = emu_thread; child->DisablePainting(); } void GRenderWindow::OnEmulationStopping() { - motion_emu = nullptr; emu_thread = nullptr; child->EnablePainting(); } diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h index 4b3a3b3cc..6974edcbb 100644 --- a/src/citra_qt/bootmanager.h +++ b/src/citra_qt/bootmanager.h @@ -12,7 +12,6 @@ #include "common/thread.h" #include "core/core.h" #include "core/frontend/emu_window.h" -#include "core/frontend/motion_emu.h" class QKeyEvent; class QScreen; @@ -158,9 +157,6 @@ private: EmuThread* emu_thread; - /// Motion sensors emulation - std::unique_ptr<Motion::MotionEmu> motion_emu; - protected: void showEvent(QShowEvent* event) override; }; diff --git a/src/citra_qt/citra-qt.rc b/src/citra_qt/citra-qt.rc index fea603004..a48a9440d 100644 --- a/src/citra_qt/citra-qt.rc +++ b/src/citra_qt/citra-qt.rc @@ -1,3 +1,4 @@ +#include "winresrc.h" ///////////////////////////////////////////////////////////////////////////// // // Icon @@ -5,5 +6,14 @@ // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -CITRA_ICON ICON "../../dist/citra.ico" +// QT requires that the default application icon is named IDI_ICON1 +IDI_ICON1 ICON "../../dist/citra.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "../../dist/citra.manifest" diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 75abb4ce6..5261f4c4c 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -57,6 +57,13 @@ void Config::ReadValues() { Settings::values.analogs[i] = default_param; } + Settings::values.motion_device = + qt_config->value("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01") + .toString() + .toStdString(); + Settings::values.touch_device = + qt_config->value("touch_device", "engine:emu_window").toString().toStdString(); + qt_config->endGroup(); qt_config->beginGroup("Core"); @@ -134,10 +141,17 @@ void Config::ReadValues() { qt_config->endGroup(); qt_config->beginGroup("WebService"); + Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool(); Settings::values.telemetry_endpoint_url = qt_config->value("telemetry_endpoint_url", "https://services.citra-emu.org/api/telemetry") .toString() .toStdString(); + Settings::values.verify_endpoint_url = + qt_config->value("verify_endpoint_url", "https://services.citra-emu.org/api/profile") + .toString() + .toStdString(); + Settings::values.citra_username = qt_config->value("citra_username").toString().toStdString(); + Settings::values.citra_token = qt_config->value("citra_token").toString().toStdString(); qt_config->endGroup(); qt_config->beginGroup("UI"); @@ -189,6 +203,7 @@ void Config::ReadValues() { UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool(); UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool(); UISettings::values.first_start = qt_config->value("firstStart", true).toBool(); + UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt(); qt_config->endGroup(); } @@ -203,6 +218,8 @@ void Config::SaveValues() { qt_config->setValue(QString::fromStdString(Settings::NativeAnalog::mapping[i]), QString::fromStdString(Settings::values.analogs[i])); } + qt_config->setValue("motion_device", QString::fromStdString(Settings::values.motion_device)); + qt_config->setValue("touch_device", QString::fromStdString(Settings::values.touch_device)); qt_config->endGroup(); qt_config->beginGroup("Core"); @@ -277,8 +294,13 @@ void Config::SaveValues() { qt_config->endGroup(); qt_config->beginGroup("WebService"); + qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry); qt_config->setValue("telemetry_endpoint_url", QString::fromStdString(Settings::values.telemetry_endpoint_url)); + qt_config->setValue("verify_endpoint_url", + QString::fromStdString(Settings::values.verify_endpoint_url)); + qt_config->setValue("citra_username", QString::fromStdString(Settings::values.citra_username)); + qt_config->setValue("citra_token", QString::fromStdString(Settings::values.citra_token)); qt_config->endGroup(); qt_config->beginGroup("UI"); @@ -314,6 +336,7 @@ void Config::SaveValues() { qt_config->setValue("showStatusBar", UISettings::values.show_status_bar); qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing); qt_config->setValue("firstStart", UISettings::values.first_start); + qt_config->setValue("calloutFlags", UISettings::values.callout_flags); qt_config->endGroup(); } diff --git a/src/citra_qt/configuration/configure.ui b/src/citra_qt/configuration/configure.ui index 85e206e42..6abd1917e 100644 --- a/src/citra_qt/configuration/configure.ui +++ b/src/citra_qt/configuration/configure.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>441</width> - <height>501</height> + <width>740</width> + <height>500</height> </rect> </property> <property name="windowTitle"> @@ -49,6 +49,11 @@ <string>Debug</string> </attribute> </widget> + <widget class="ConfigureWeb" name="webTab"> + <attribute name="title"> + <string>Web</string> + </attribute> + </widget> </widget> </item> <item> @@ -97,6 +102,12 @@ <header>configuration/configure_graphics.h</header> <container>1</container> </customwidget> + <customwidget> + <class>ConfigureWeb</class> + <extends>QWidget</extends> + <header>configuration/configure_web.h</header> + <container>1</container> + </customwidget> </customwidgets> <resources/> <connections> diff --git a/src/citra_qt/configuration/configure_dialog.cpp b/src/citra_qt/configuration/configure_dialog.cpp index dfc8c03a7..b87dc0e6c 100644 --- a/src/citra_qt/configuration/configure_dialog.cpp +++ b/src/citra_qt/configuration/configure_dialog.cpp @@ -23,5 +23,6 @@ void ConfigureDialog::applyConfiguration() { ui->graphicsTab->applyConfiguration(); ui->audioTab->applyConfiguration(); ui->debugTab->applyConfiguration(); + ui->webTab->applyConfiguration(); Settings::Apply(); } diff --git a/src/citra_qt/configuration/configure_graphics.ui b/src/citra_qt/configuration/configure_graphics.ui index 228f2a869..5667b14b6 100644 --- a/src/citra_qt/configuration/configure_graphics.ui +++ b/src/citra_qt/configuration/configure_graphics.ui @@ -63,57 +63,57 @@ <widget class="QComboBox" name="resolution_factor_combobox"> <item> <property name="text"> - <string notr="true">Auto (Window Size)</string> + <string>Auto (Window Size)</string> </property> </item> <item> <property name="text"> - <string notr="true">Native (400x240)</string> + <string>Native (400x240)</string> </property> </item> <item> <property name="text"> - <string notr="true">2x Native (800x480)</string> + <string>2x Native (800x480)</string> </property> </item> <item> <property name="text"> - <string notr="true">3x Native (1200x720)</string> + <string>3x Native (1200x720)</string> </property> </item> <item> <property name="text"> - <string notr="true">4x Native (1600x960)</string> + <string>4x Native (1600x960)</string> </property> </item> <item> <property name="text"> - <string notr="true">5x Native (2000x1200)</string> + <string>5x Native (2000x1200)</string> </property> </item> <item> <property name="text"> - <string notr="true">6x Native (2400x1440)</string> + <string>6x Native (2400x1440)</string> </property> </item> <item> <property name="text"> - <string notr="true">7x Native (2800x1680)</string> + <string>7x Native (2800x1680)</string> </property> </item> <item> <property name="text"> - <string notr="true">8x Native (3200x1920)</string> + <string>8x Native (3200x1920)</string> </property> </item> <item> <property name="text"> - <string notr="true">9x Native (3600x2160)</string> + <string>9x Native (3600x2160)</string> </property> </item> <item> <property name="text"> - <string notr="true">10x Native (4000x2400)</string> + <string>10x Native (4000x2400)</string> </property> </item> </widget> @@ -146,17 +146,22 @@ <widget class="QComboBox" name="layout_combobox"> <item> <property name="text"> - <string notr="true">Default</string> + <string>Default</string> </property> </item> <item> <property name="text"> - <string notr="true">Single Screen</string> + <string>Single Screen</string> </property> </item> <item> <property name="text"> - <string notr="true">Large Screen</string> + <string>Large Screen</string> + </property> + </item> + <item> + <property name="text"> + <string>Side by Side</string> </property> </item> </widget> diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp index 9b1e6711d..88a067c12 100644 --- a/src/citra_qt/configuration/configure_system.cpp +++ b/src/citra_qt/configuration/configure_system.cpp @@ -78,7 +78,8 @@ void ConfigureSystem::ReadSystemSettings() { // set the console id u64 console_id = Service::CFG::GetConsoleUniqueId(); - ui->label_console_id->setText("Console ID: 0x" + QString::number(console_id, 16).toUpper()); + ui->label_console_id->setText( + tr("Console ID: 0x%1").arg(QString::number(console_id, 16).toUpper())); } void ConfigureSystem::applyConfiguration() { diff --git a/src/citra_qt/configuration/configure_web.cpp b/src/citra_qt/configuration/configure_web.cpp new file mode 100644 index 000000000..bf8c21ac7 --- /dev/null +++ b/src/citra_qt/configuration/configure_web.cpp @@ -0,0 +1,102 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <QMessageBox> +#include "citra_qt/configuration/configure_web.h" +#include "core/settings.h" +#include "core/telemetry_session.h" +#include "ui_configure_web.h" + +ConfigureWeb::ConfigureWeb(QWidget* parent) + : QWidget(parent), ui(std::make_unique<Ui::ConfigureWeb>()) { + ui->setupUi(this); + connect(ui->button_regenerate_telemetry_id, &QPushButton::clicked, this, + &ConfigureWeb::RefreshTelemetryID); + connect(ui->button_verify_login, &QPushButton::clicked, this, &ConfigureWeb::VerifyLogin); + connect(this, &ConfigureWeb::LoginVerified, this, &ConfigureWeb::OnLoginVerified); + + this->setConfiguration(); +} + +ConfigureWeb::~ConfigureWeb() {} + +void ConfigureWeb::setConfiguration() { + ui->web_credentials_disclaimer->setWordWrap(true); + ui->telemetry_learn_more->setOpenExternalLinks(true); + ui->telemetry_learn_more->setText(tr("<a " + "href='https://citra-emu.org/entry/" + "telemetry-and-why-thats-a-good-thing/'>Learn more</a>")); + + ui->web_signup_link->setOpenExternalLinks(true); + ui->web_signup_link->setText(tr("<a href='https://services.citra-emu.org/'>Sign up</a>")); + ui->web_token_info_link->setOpenExternalLinks(true); + ui->web_token_info_link->setText( + tr("<a href='https://citra-emu.org/wiki/citra-web-service/'>What is my token?</a>")); + + ui->toggle_telemetry->setChecked(Settings::values.enable_telemetry); + ui->edit_username->setText(QString::fromStdString(Settings::values.citra_username)); + ui->edit_token->setText(QString::fromStdString(Settings::values.citra_token)); + // Connect after setting the values, to avoid calling OnLoginChanged now + connect(ui->edit_token, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); + connect(ui->edit_username, &QLineEdit::textChanged, this, &ConfigureWeb::OnLoginChanged); + ui->label_telemetry_id->setText( + tr("Telemetry ID: 0x%1").arg(QString::number(Core::GetTelemetryId(), 16).toUpper())); + user_verified = true; +} + +void ConfigureWeb::applyConfiguration() { + Settings::values.enable_telemetry = ui->toggle_telemetry->isChecked(); + if (user_verified) { + Settings::values.citra_username = ui->edit_username->text().toStdString(); + Settings::values.citra_token = ui->edit_token->text().toStdString(); + } else { + QMessageBox::warning(this, tr("Username and token not verfied"), + tr("Username and token were not verified. The changes to your " + "username and/or token have not been saved.")); + } + Settings::Apply(); +} + +void ConfigureWeb::RefreshTelemetryID() { + const u64 new_telemetry_id{Core::RegenerateTelemetryId()}; + ui->label_telemetry_id->setText( + tr("Telemetry ID: 0x%1").arg(QString::number(new_telemetry_id, 16).toUpper())); +} + +void ConfigureWeb::OnLoginChanged() { + if (ui->edit_username->text().isEmpty() && ui->edit_token->text().isEmpty()) { + user_verified = true; + ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png")); + ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png")); + } else { + user_verified = false; + ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png")); + ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png")); + } +} + +void ConfigureWeb::VerifyLogin() { + verified = + Core::VerifyLogin(ui->edit_username->text().toStdString(), + ui->edit_token->text().toStdString(), [&]() { emit LoginVerified(); }); + ui->button_verify_login->setDisabled(true); + ui->button_verify_login->setText(tr("Verifying")); +} + +void ConfigureWeb::OnLoginVerified() { + ui->button_verify_login->setEnabled(true); + ui->button_verify_login->setText(tr("Verify")); + if (verified.get()) { + user_verified = true; + ui->label_username_verified->setPixmap(QPixmap(":/icons/checked.png")); + ui->label_token_verified->setPixmap(QPixmap(":/icons/checked.png")); + } else { + ui->label_username_verified->setPixmap(QPixmap(":/icons/failed.png")); + ui->label_token_verified->setPixmap(QPixmap(":/icons/failed.png")); + QMessageBox::critical( + this, tr("Verification failed"), + tr("Verification failed. Check that you have entered your username and token " + "correctly, and that your internet connection is working.")); + } +} diff --git a/src/citra_qt/configuration/configure_web.h b/src/citra_qt/configuration/configure_web.h new file mode 100644 index 000000000..ad2d58f6e --- /dev/null +++ b/src/citra_qt/configuration/configure_web.h @@ -0,0 +1,40 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <future> +#include <memory> +#include <QWidget> + +namespace Ui { +class ConfigureWeb; +} + +class ConfigureWeb : public QWidget { + Q_OBJECT + +public: + explicit ConfigureWeb(QWidget* parent = nullptr); + ~ConfigureWeb(); + + void applyConfiguration(); + +public slots: + void RefreshTelemetryID(); + void OnLoginChanged(); + void VerifyLogin(); + void OnLoginVerified(); + +signals: + void LoginVerified(); + +private: + void setConfiguration(); + + bool user_verified = true; + std::future<bool> verified; + + std::unique_ptr<Ui::ConfigureWeb> ui; +}; diff --git a/src/citra_qt/configuration/configure_web.ui b/src/citra_qt/configuration/configure_web.ui new file mode 100644 index 000000000..dd996ab62 --- /dev/null +++ b/src/citra_qt/configuration/configure_web.ui @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureWeb</class> + <widget class="QWidget" name="ConfigureWeb"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>926</width> + <height>561</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QGroupBox" name="groupBoxWebConfig"> + <property name="title"> + <string>Citra Web Service</string> + </property> + <layout class="QVBoxLayout" name="verticalLayoutCitraWebService"> + <item> + <widget class="QLabel" name="web_credentials_disclaimer"> + <property name="text"> + <string>By providing your username and token, you agree to allow Citra to collect additional usage data, which may include user identifying information.</string> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayoutCitraUsername"> + <item row="2" column="3"> + <widget class="QPushButton" name="button_verify_login"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="layoutDirection"> + <enum>Qt::RightToLeft</enum> + </property> + <property name="text"> + <string>Verify</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="web_signup_link"> + <property name="text"> + <string>Sign up</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="3"> + <widget class="QLineEdit" name="edit_username"> + <property name="maxLength"> + <number>36</number> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_token"> + <property name="text"> + <string>Token: </string> + </property> + </widget> + </item> + <item row="1" column="4"> + <widget class="QLabel" name="label_token_verified"> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_username"> + <property name="text"> + <string>Username: </string> + </property> + </widget> + </item> + <item row="0" column="4"> + <widget class="QLabel" name="label_username_verified"> + </widget> + </item> + <item row="1" column="1" colspan="3"> + <widget class="QLineEdit" name="edit_token"> + <property name="maxLength"> + <number>36</number> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="web_token_info_link"> + <property name="text"> + <string>What is my token?</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Telemetry</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QCheckBox" name="toggle_telemetry"> + <property name="text"> + <string>Share anonymous usage data with the Citra team</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="telemetry_learn_more"> + <property name="text"> + <string>Learn more</string> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayoutTelemetryId"> + <item row="0" column="0"> + <widget class="QLabel" name="label_telemetry_id"> + <property name="text"> + <string>Telemetry ID:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QPushButton" name="button_regenerate_telemetry_id"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="layoutDirection"> + <enum>Qt::RightToLeft</enum> + </property> + <property name="text"> + <string>Regenerate</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp index 7d06ec28a..ce2b9fa50 100644 --- a/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp +++ b/src/citra_qt/debugger/graphics/graphics_cmdlists.cpp @@ -26,8 +26,8 @@ namespace { QImage LoadTexture(const u8* src, const Pica::Texture::TextureInfo& info) { QImage decoded_image(info.width, info.height, QImage::Format_ARGB32); - for (int y = 0; y < info.height; ++y) { - for (int x = 0; x < info.width; ++x) { + for (u32 y = 0; y < info.height; ++y) { + for (u32 x = 0; x < info.width; ++x) { Math::Vec4<u8> color = Pica::Texture::LookupTexture(src, x, y, info, true); decoded_image.setPixel(x, y, qRgba(color.r(), color.g(), color.b(), color.a())); } diff --git a/src/citra_qt/debugger/graphics/graphics_surface.cpp b/src/citra_qt/debugger/graphics/graphics_surface.cpp index 47d9924e1..c974545ef 100644 --- a/src/citra_qt/debugger/graphics/graphics_surface.cpp +++ b/src/citra_qt/debugger/graphics/graphics_surface.cpp @@ -273,7 +273,8 @@ void GraphicsSurfaceWidget::Pick(int x, int y) { surface_picker_x_control->setValue(x); surface_picker_y_control->setValue(y); - if (x < 0 || x >= surface_width || y < 0 || y >= surface_height) { + if (x < 0 || x >= static_cast<int>(surface_width) || y < 0 || + y >= static_cast<int>(surface_height)) { surface_info_label->setText(tr("Pixel out of bounds")); surface_info_label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); return; diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp index e3f3194db..7f4ec0c52 100644 --- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp +++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp @@ -183,23 +183,13 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con print_input(output, src1, swizzle.negate_src1, SelectorToString(swizzle.src1_selector)); AlignToColumn(kInputOperandColumnWidth); - if (src_is_inverted) { - print_input(output, src2, swizzle.negate_src2, - SelectorToString(swizzle.src2_selector)); - } else { - print_input(output, src2, swizzle.negate_src2, - SelectorToString(swizzle.src2_selector), true, - instr.mad.AddressRegisterName()); - } + print_input(output, src2, swizzle.negate_src2, + SelectorToString(swizzle.src2_selector), true, + src_is_inverted ? "" : instr.mad.AddressRegisterName()); AlignToColumn(kInputOperandColumnWidth); - if (src_is_inverted) { - print_input(output, src3, swizzle.negate_src3, - SelectorToString(swizzle.src3_selector), true, - instr.mad.AddressRegisterName()); - } else { - print_input(output, src3, swizzle.negate_src3, - SelectorToString(swizzle.src3_selector)); - } + print_input(output, src3, swizzle.negate_src3, + SelectorToString(swizzle.src3_selector), true, + src_is_inverted ? instr.mad.AddressRegisterName() : ""); AlignToColumn(kInputOperandColumnWidth); break; } @@ -222,16 +212,15 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con SourceRegister src1 = instr.common.GetSrc1(src_is_inverted); print_input(output, src1, swizzle.negate_src1, swizzle.SelectorToString(false), true, - instr.common.AddressRegisterName()); + src_is_inverted ? "" : instr.common.AddressRegisterName()); AlignToColumn(kInputOperandColumnWidth); } - // TODO: In some cases, the Address Register is used as an index for SRC2 - // instead of SRC1 if (opcode_info.subtype & OpCode::Info::Src2) { SourceRegister src2 = instr.common.GetSrc2(src_is_inverted); print_input(output, src2, swizzle.negate_src2, - swizzle.SelectorToString(true)); + swizzle.SelectorToString(true), true, + src_is_inverted ? instr.common.AddressRegisterName() : ""); AlignToColumn(kInputOperandColumnWidth); } break; @@ -247,7 +236,9 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con switch (opcode.EffectiveOpCode()) { case OpCode::Id::LOOP: - output << "(unknown instruction format)"; + output << 'i' << instr.flow_control.int_uniform_id << " (end on 0x" + << std::setw(4) << std::right << std::setfill('0') << std::hex + << (4 * instr.flow_control.dest_offset) << ")"; break; default: @@ -255,7 +246,7 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con output << '('; if (instr.flow_control.op != instr.flow_control.JustY) { - if (instr.flow_control.refx) + if (!instr.flow_control.refx) output << '!'; output << "cc.x"; } @@ -267,13 +258,17 @@ QVariant GraphicsVertexShaderModel::data(const QModelIndex& index, int role) con } if (instr.flow_control.op != instr.flow_control.JustX) { - if (instr.flow_control.refy) + if (!instr.flow_control.refy) output << '!'; output << "cc.y"; } output << ") "; } else if (opcode_info.subtype & OpCode::Info::HasUniformIndex) { + if (opcode.EffectiveOpCode() == OpCode::Id::JMPU && + (instr.flow_control.num_instructions & 1) == 1) { + output << '!'; + } output << 'b' << instr.flow_control.bool_uniform_id << ' '; } diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 02bfdca3d..8adbcfe86 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -48,6 +48,47 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); #endif +/** + * "Callouts" are one-time instructional messages shown to the user. In the config settings, there + * is a bitfield "callout_flags" options, used to track if a message has already been shown to the + * user. This is 32-bits - if we have more than 32 callouts, we should retire and recyle old ones. + */ +enum class CalloutFlag : uint32_t { + Telemetry = 0x1, +}; + +static void ShowCalloutMessage(const QString& message, CalloutFlag flag) { + if (UISettings::values.callout_flags & static_cast<uint32_t>(flag)) { + return; + } + + UISettings::values.callout_flags |= static_cast<uint32_t>(flag); + + QMessageBox msg; + msg.setText(message); + msg.setStandardButtons(QMessageBox::Ok); + msg.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + msg.setStyleSheet("QLabel{min-width: 900px;}"); + msg.exec(); +} + +void GMainWindow::ShowCallouts() { + static const QString telemetry_message = + tr("To help improve Citra, the Citra Team collects anonymous usage data. No private or " + "personally identifying information is collected. This data helps us to understand how " + "people use Citra and prioritize our efforts. Furthermore, it helps us to more easily " + "identify emulation bugs and performance issues. This data includes:<ul><li>Information" + " about the version of Citra you are using</li><li>Performance data about the games you " + "play</li><li>Your configuration settings</li><li>Information about your computer " + "hardware</li><li>Emulation errors and crash information</li></ul>By default, this " + "feature is enabled. To disable this feature, click 'Emulation' from the menu and then " + "select 'Configure...'. Then, on the 'Web' tab, uncheck 'Share anonymous usage data with" + " the Citra team'. <br/><br/>By using this software, you agree to the above terms.<br/>" + "<br/><a href='https://citra-emu.org/entry/telemetry-and-why-thats-a-good-thing/'>Learn " + "more</a>"); + ShowCalloutMessage(telemetry_message, CalloutFlag::Telemetry); +} + GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) { Pica::g_debug_context = Pica::DebugContext::Construct(); setAcceptDrops(true); @@ -73,6 +114,9 @@ GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) { UpdateUITheme(); + // Show one-time "callout" messages to the user + ShowCallouts(); + QStringList args = QApplication::arguments(); if (args.length() >= 2) { BootGame(args[1]); @@ -311,7 +355,7 @@ bool GMainWindow::LoadROM(const QString& filename) { if (!gladLoadGL()) { QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"), - tr("Your GPU may not support OpenGL 3.3, or you do not" + tr("Your GPU may not support OpenGL 3.3, or you do not " "have the latest graphics driver.")); return false; } @@ -320,6 +364,8 @@ bool GMainWindow::LoadROM(const QString& filename) { const Core::System::ResultStatus result{system.Load(render_window, filename.toStdString())}; + Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt"); + if (result != Core::System::ResultStatus::Success) { switch (result) { case Core::System::ResultStatus::ErrorGetLoader: diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h index 360de2ced..d59a6d67d 100644 --- a/src/citra_qt/main.h +++ b/src/citra_qt/main.h @@ -80,6 +80,8 @@ private: void BootGame(const QString& filename); void ShutdownGame(); + void ShowCallouts(); + /** * Stores the filename in the recently loaded files list. * The new filename is stored at the beginning of the recently loaded files list. diff --git a/src/citra_qt/ui_settings.h b/src/citra_qt/ui_settings.h index 025c73f84..d85c92765 100644 --- a/src/citra_qt/ui_settings.h +++ b/src/citra_qt/ui_settings.h @@ -48,6 +48,8 @@ struct Values { // Shortcut name <Shortcut, context> std::vector<Shortcut> shortcuts; + + uint32_t callout_flags; }; extern Values values; diff --git a/src/common/common_types.h b/src/common/common_types.h index e8f7ac6be..844d34965 100644 --- a/src/common/common_types.h +++ b/src/common/common_types.h @@ -24,6 +24,7 @@ #pragma once +#include <array> #include <cstdint> #ifdef _MSC_VER @@ -50,6 +51,9 @@ typedef double f64; ///< 64-bit floating point typedef u64 VAddr; ///< Represents a pointer in the userspace virtual address space. typedef u64 PAddr; ///< Represents a pointer in the ARM11 physical address space. +using u128 = std::array<std::uint64_t, 2>; +static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide"); + // An inheritable class to disallow the copy constructor and operator= functions class NonCopyable { protected: diff --git a/src/common/quaternion.h b/src/common/quaternion.h index 84ac82ed3..77f626bcb 100644 --- a/src/common/quaternion.h +++ b/src/common/quaternion.h @@ -30,6 +30,11 @@ public: return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz), w * other.w - Dot(xyz, other.xyz)}; } + + Quaternion<T> Normalized() const { + T length = std::sqrt(xyz.Length2() + w * w); + return {xyz / length, w / length}; + } }; template <typename T> diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in index 0080db5d5..4083095d5 100644 --- a/src/common/scm_rev.cpp.in +++ b/src/common/scm_rev.cpp.in @@ -8,6 +8,7 @@ #define GIT_BRANCH "@GIT_BRANCH@" #define GIT_DESC "@GIT_DESC@" #define BUILD_NAME "@REPO_NAME@" +#define BUILD_DATE "@BUILD_DATE@" namespace Common { @@ -15,6 +16,7 @@ const char g_scm_rev[] = GIT_REV; const char g_scm_branch[] = GIT_BRANCH; const char g_scm_desc[] = GIT_DESC; const char g_build_name[] = BUILD_NAME; +const char g_build_date[] = BUILD_DATE; } // namespace diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h index e22389803..18aaa1735 100644 --- a/src/common/scm_rev.h +++ b/src/common/scm_rev.h @@ -10,5 +10,6 @@ extern const char g_scm_rev[]; extern const char g_scm_branch[]; extern const char g_scm_desc[]; extern const char g_build_name[]; +extern const char g_build_date[]; } // namespace diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index bad311793..6959915fa 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -117,7 +117,7 @@ std::string StringFromFormat(const char* format, ...) { } // For Debugging. Read out an u8 array. -std::string ArrayToString(const u8* data, u32 size, int line_len, bool spaces) { +std::string ArrayToString(const u8* data, size_t size, int line_len, bool spaces) { std::ostringstream oss; oss << std::setfill('0') << std::hex; diff --git a/src/common/string_util.h b/src/common/string_util.h index 075bf4ecb..259360aec 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -33,7 +33,7 @@ inline void CharArrayFromFormat(char (&out)[Count], const char* format, ...) { } // Good -std::string ArrayToString(const u8* data, u32 size, int line_len = 20, bool spaces = true); +std::string ArrayToString(const u8* data, size_t size, int line_len = 20, bool spaces = true); std::string StripSpaces(const std::string& s); std::string StripQuotes(const std::string& s); diff --git a/src/common/vector_math.h b/src/common/vector_math.h index c7a461a1e..3f0057d9e 100644 --- a/src/common/vector_math.h +++ b/src/common/vector_math.h @@ -90,8 +90,9 @@ public: x -= other.x; y -= other.y; } - template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> - Vec2<decltype(-T{})> operator-() const { + + template <typename U = T> + Vec2<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const { return MakeVec(-x, -y); } Vec2<decltype(T{} * T{})> operator*(const Vec2& other) const { @@ -103,8 +104,7 @@ public: } template <typename V> void operator*=(const V& f) { - x *= f; - y *= f; + *this = *this * f; } template <typename V> Vec2<decltype(T{} / V{})> operator/(const V& f) const { @@ -247,8 +247,9 @@ public: y -= other.y; z -= other.z; } - template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> - Vec3<decltype(-T{})> operator-() const { + + template <typename U = T> + Vec3<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const { return MakeVec(-x, -y, -z); } Vec3<decltype(T{} * T{})> operator*(const Vec3& other) const { @@ -260,9 +261,7 @@ public: } template <typename V> void operator*=(const V& f) { - x *= f; - y *= f; - z *= f; + *this = *this * f; } template <typename V> Vec3<decltype(T{} / V{})> operator/(const V& f) const { @@ -462,8 +461,9 @@ public: z -= other.z; w -= other.w; } - template <typename Q = T, class = typename std::enable_if<std::is_signed<Q>::value>::type> - Vec4<decltype(-T{})> operator-() const { + + template <typename U = T> + Vec4<std::enable_if_t<std::is_signed<U>::value, U>> operator-() const { return MakeVec(-x, -y, -z, -w); } Vec4<decltype(T{} * T{})> operator*(const Vec4& other) const { @@ -475,10 +475,7 @@ public: } template <typename V> void operator*=(const V& f) { - x *= f; - y *= f; - z *= f; - w *= f; + *this = *this * f; } template <typename V> Vec4<decltype(T{} / V{})> operator/(const V& f) const { @@ -721,4 +718,4 @@ static inline Vec4<T> MakeVec(const T& x, const Vec3<T>& yzw) { return MakeVec(x, yzw[0], yzw[1], yzw[2]); } -} // namespace +} // namespace Math diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 33ce8dc81..8b25eaf0a 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -6,6 +6,8 @@ set(SRCS arm/dyncom/arm_dyncom_interpreter.cpp arm/dyncom/arm_dyncom_thumb.cpp arm/dyncom/arm_dyncom_trans.cpp + arm/unicorn/arm_unicorn.cpp + arm/unicorn/unicorn_dynload.c arm/skyeye_common/armstate.cpp arm/skyeye_common/armsupp.cpp arm/skyeye_common/vfp/vfp.cpp @@ -26,14 +28,15 @@ set(SRCS file_sys/archive_systemsavedata.cpp file_sys/disk_archive.cpp file_sys/ivfc_archive.cpp + file_sys/ncch_container.cpp file_sys/path_parser.cpp file_sys/savedata_archive.cpp + file_sys/title_metadata.cpp frontend/camera/blank_camera.cpp frontend/camera/factory.cpp frontend/camera/interface.cpp frontend/emu_window.cpp frontend/framebuffer_layout.cpp - frontend/motion_emu.cpp gdbstub/gdbstub.cpp hle/config_mem.cpp hle/applets/applet.cpp @@ -60,6 +63,7 @@ set(SRCS hle/kernel/timer.cpp hle/kernel/vm_manager.cpp hle/kernel/wait_object.cpp + hle/lock.cpp hle/romfs.cpp hle/service/ac/ac.cpp hle/service/ac/ac_i.cpp @@ -135,7 +139,8 @@ set(SRCS hle/service/nim/nim_aoc.cpp hle/service/nim/nim_s.cpp hle/service/nim/nim_u.cpp - hle/service/ns_s.cpp + hle/service/ns/ns.cpp + hle/service/ns/ns_s.cpp hle/service/nwm/nwm.cpp hle/service/nwm/nwm_cec.cpp hle/service/nwm/nwm_ext.cpp @@ -145,6 +150,7 @@ set(SRCS hle/service/nwm/nwm_tst.cpp hle/service/nwm/nwm_uds.cpp hle/service/nwm/uds_beacon.cpp + hle/service/nwm/uds_connection.cpp hle/service/nwm/uds_data.cpp hle/service/pm_app.cpp hle/service/ptm/ptm.cpp @@ -198,6 +204,8 @@ set(HEADERS arm/dyncom/arm_dyncom_run.h arm/dyncom/arm_dyncom_thumb.h arm/dyncom/arm_dyncom_trans.h + arm/unicorn/arm_unicorn.h + arm/unicorn/unicorn_dynload.h arm/skyeye_common/arm_regformat.h arm/skyeye_common/armstate.h arm/skyeye_common/armsupp.h @@ -229,7 +237,6 @@ set(HEADERS frontend/emu_window.h frontend/framebuffer_layout.h frontend/input.h - frontend/motion_emu.h gdbstub/gdbstub.h hle/config_mem.h hle/function_wrappers.h @@ -261,6 +268,7 @@ set(HEADERS hle/kernel/timer.h hle/kernel/vm_manager.h hle/kernel/wait_object.h + hle/lock.h hle/result.h hle/romfs.h hle/service/ac/ac.h @@ -337,7 +345,8 @@ set(HEADERS hle/service/nim/nim_aoc.h hle/service/nim/nim_s.h hle/service/nim/nim_u.h - hle/service/ns_s.h + hle/service/ns/ns.h + hle/service/ns/ns_s.h hle/service/nwm/nwm.h hle/service/nwm/nwm_cec.h hle/service/nwm/nwm_ext.h @@ -347,6 +356,7 @@ set(HEADERS hle/service/nwm/nwm_tst.h hle/service/nwm/nwm_uds.h hle/service/nwm/uds_beacon.h + hle/service/nwm/uds_connection.h hle/service/nwm/uds_data.h hle/service/pm_app.h hle/service/ptm/ptm.h @@ -394,7 +404,7 @@ set(HEADERS create_directory_groups(${SRCS} ${HEADERS}) add_library(core STATIC ${SRCS} ${HEADERS}) -target_link_libraries(core PUBLIC common PRIVATE audio_core video_core) +target_link_libraries(core PUBLIC common PRIVATE audio_core network video_core) target_link_libraries(core PUBLIC Boost::boost PRIVATE cryptopp dynarmic fmt lz4_static) if (ENABLE_WEB_SERVICE) target_link_libraries(core PUBLIC json-headers web_service) diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index f613556dd..0b3096347 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -5,6 +5,7 @@ #pragma once #include "common/common_types.h" +#include "core/hle/kernel/vm_manager.h" #include "core/arm/skyeye_common/arm_regformat.h" #include "core/arm/skyeye_common/vfp/asm_vfp.h" @@ -19,10 +20,11 @@ public: u64 sp; u64 pc; u64 cpsr; - u64 fpu_registers[64]; + u128 fpu_registers[32]; u64 fpscr; u64 fpexc; + // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT VAddr tls_address; }; @@ -41,9 +43,14 @@ public: Run(1); } + virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) {} + /// Clear all instruction cache virtual void ClearInstructionCache() = 0; + /// Notify CPU emulation that page tables have changed + virtual void PageTableChanged() = 0; + /** * Set the Program Counter to an address * @param addr Address to set PC to @@ -70,6 +77,10 @@ public: */ virtual void SetReg(int index, u64 value) = 0; + virtual const u128& GetExtReg(int index) const = 0; + + virtual void SetExtReg(int index, u128& value) = 0; + /** * Gets the value of a VFP register * @param index Register index (0-31) @@ -129,12 +140,6 @@ public: virtual void SetTlsAddress(VAddr address) = 0; /** - * Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time) - * @param ticks Number of ticks to advance the CPU core - */ - virtual void AddTicks(u64 ticks) = 0; - - /** * Saves the current CPU context * @param ctx Thread context to save */ @@ -154,9 +159,6 @@ public: return num_instructions; } - s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event, - /// decreased by the cpu run loop - protected: /** * Executes the given number of instructions diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 0ea1d76e4..6dcab5bab 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -16,24 +16,6 @@ static void InterpreterFallback(u64 pc, Dynarmic::Jit* jit, void* user_arg) { UNIMPLEMENTED_MSG("InterpreterFallback for ARM64 JIT does not exist!"); - //ARMul_State* state = static_cast<ARMul_State*>(user_arg); - - //state->Reg = jit->Regs(); - //state->Cpsr = jit->Cpsr(); - //state->Reg[15] = static_cast<u32>(pc); - //state->ExtReg = jit->ExtRegs(); - //state->VFP[VFP_FPSCR] = jit->Fpscr(); - //state->NumInstrsToExecute = 1; - - //InterpreterMainLoop(state); - - //bool is_thumb = (state->Cpsr & (1 << 5)) != 0; - //state->Reg[15] &= (is_thumb ? 0xFFFFFFFE : 0xFFFFFFFC); - - //jit->Regs() = state->Reg; - //jit->Cpsr() = state->Cpsr; - //jit->ExtRegs() = state->ExtReg; - //jit->SetFpscr(state->VFP[VFP_FPSCR]); } static bool IsReadOnlyMemory(u64 vaddr) { @@ -73,11 +55,10 @@ void MemoryWrite64(const u64 addr, const u64 data) { Memory::Write64(static_cast<VAddr>(addr), data); } -static Dynarmic::UserCallbacks GetUserCallbacks( - const std::shared_ptr<ARMul_State>& interpeter_state) { +static Dynarmic::UserCallbacks GetUserCallbacks(ARM_Dynarmic* this_) { Dynarmic::UserCallbacks user_callbacks{}; - //user_callbacks.InterpreterFallback = &InterpreterFallback; - //user_callbacks.user_arg = static_cast<void*>(interpeter_state.get()); + user_callbacks.InterpreterFallback = &InterpreterFallback; + user_callbacks.user_arg = static_cast<void*>(this_); user_callbacks.CallSVC = &SVC::CallSVC; user_callbacks.memory.IsReadOnlyMemory = &IsReadOnlyMemory; user_callbacks.memory.ReadCode = &MemoryRead32; @@ -90,13 +71,13 @@ static Dynarmic::UserCallbacks GetUserCallbacks( user_callbacks.memory.Write32 = &MemoryWrite32; user_callbacks.memory.Write64 = &MemoryWrite64; //user_callbacks.page_table = Memory::GetCurrentPageTablePointers(); - user_callbacks.coprocessors[15] = std::make_shared<DynarmicCP15>(interpeter_state); return user_callbacks; } ARM_Dynarmic::ARM_Dynarmic(PrivilegeMode initial_mode) { - interpreter_state = std::make_shared<ARMul_State>(initial_mode); - jit = std::make_unique<Dynarmic::Jit>(GetUserCallbacks(interpreter_state), Dynarmic::Arch::ARM64); +} + +void ARM_Dynarmic::MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) { } void ARM_Dynarmic::SetPC(u64 pc) { @@ -115,30 +96,26 @@ void ARM_Dynarmic::SetReg(int index, u64 value) { jit->Regs64()[index] = value; } +const u128& ARM_Dynarmic::GetExtReg(int index) const { + return jit->ExtRegs64()[index]; +} + +void ARM_Dynarmic::SetExtReg(int index, u128& value) { + jit->ExtRegs64()[index] = value; +} + u32 ARM_Dynarmic::GetVFPReg(int index) const { - return jit->ExtRegs()[index]; + return {}; } void ARM_Dynarmic::SetVFPReg(int index, u32 value) { - jit->ExtRegs()[index] = value; } u32 ARM_Dynarmic::GetVFPSystemReg(VFPSystemRegister reg) const { - if (reg == VFP_FPSCR) { - return jit->Fpscr(); - } - - // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state - return interpreter_state->VFP[reg]; + return {}; } void ARM_Dynarmic::SetVFPSystemReg(VFPSystemRegister reg, u32 value) { - if (reg == VFP_FPSCR) { - jit->SetFpscr(value); - } - - // Dynarmic does not implement and/or expose other VFP registers, fallback to interpreter state - interpreter_state->VFP[reg] = value; } u32 ARM_Dynarmic::GetCPSR() const { @@ -150,11 +127,10 @@ void ARM_Dynarmic::SetCPSR(u32 cpsr) { } u32 ARM_Dynarmic::GetCP15Register(CP15Register reg) { - return interpreter_state->CP15[reg]; + return {}; } void ARM_Dynarmic::SetCP15Register(CP15Register reg, u32 value) { - interpreter_state->CP15[reg] = value; } VAddr ARM_Dynarmic::GetTlsAddress() const { @@ -165,51 +141,39 @@ void ARM_Dynarmic::SetTlsAddress(VAddr address) { jit->TlsAddr() = address; } -void ARM_Dynarmic::AddTicks(u64 ticks) { - down_count -= ticks; - if (down_count < 0) { - CoreTiming::Advance(); - } -} - MICROPROFILE_DEFINE(ARM_Jit, "ARM JIT", "ARM JIT", MP_RGB(255, 64, 64)); void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { + ASSERT(Memory::GetCurrentPageTable() == current_page_table); MICROPROFILE_SCOPE(ARM_Jit); - unsigned ticks_executed = jit->Run(1 /*static_cast<unsigned>(num_instructions)*/); + std::size_t ticks_executed = jit->Run(static_cast<unsigned>(num_instructions)); - AddTicks(ticks_executed); + CoreTiming::AddTicks(ticks_executed); } void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { memcpy(ctx.cpu_registers, jit->Regs64().data(), sizeof(ctx.cpu_registers)); - //memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers)); + memcpy(ctx.fpu_registers, jit->ExtRegs64().data(), sizeof(ctx.fpu_registers)); ctx.lr = jit->Regs64()[30]; ctx.sp = jit->Regs64()[31]; ctx.pc = jit->Regs64()[32]; ctx.cpsr = jit->Cpsr(); - ctx.fpscr = jit->Fpscr(); - ctx.fpexc = interpreter_state->VFP[VFP_FPEXC]; - // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT ctx.tls_address = jit->TlsAddr(); } void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { memcpy(jit->Regs64().data(), ctx.cpu_registers, sizeof(ctx.cpu_registers)); - //memcpy(jit->ExtRegs().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers)); + memcpy(jit->ExtRegs64().data(), ctx.fpu_registers, sizeof(ctx.fpu_registers)); jit->Regs64()[30] = ctx.lr; jit->Regs64()[31] = ctx.sp; jit->Regs64()[32] = ctx.pc; jit->Cpsr() = ctx.cpsr; - jit->SetFpscr(ctx.fpscr); - interpreter_state->VFP[VFP_FPEXC] = ctx.fpexc; - // TODO(bunnei): Fix once we have proper support for tpidrro_el0, etc. in the JIT jit->TlsAddr() = ctx.tls_address; } @@ -223,3 +187,16 @@ void ARM_Dynarmic::PrepareReschedule() { void ARM_Dynarmic::ClearInstructionCache() { jit->ClearCache(); } + +void ARM_Dynarmic::PageTableChanged() { + current_page_table = Memory::GetCurrentPageTable(); + + auto iter = jits.find(current_page_table); + if (iter != jits.end()) { + jit = iter->second.get(); + return; + } + + jit = new Dynarmic::Jit(GetUserCallbacks(this), Dynarmic::Arch::ARM64); + jits.emplace(current_page_table, std::unique_ptr<Dynarmic::Jit>(jit)); +} diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index fcdc1c0e0..6567359b0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -4,20 +4,29 @@ #pragma once +#include <map> #include <memory> #include <dynarmic/dynarmic.h> #include "common/common_types.h" #include "core/arm/arm_interface.h" #include "core/arm/skyeye_common/armstate.h" +namespace Memory { +struct PageTable; +} // namespace Memory + class ARM_Dynarmic final : public ARM_Interface { public: ARM_Dynarmic(PrivilegeMode initial_mode); + void MapBackingMemory(VAddr address, size_t size, u8* memory, Kernel::VMAPermission perms) override; + void SetPC(u64 pc) override; u64 GetPC() const override; u64 GetReg(int index) const override; void SetReg(int index, u64 value) override; + const u128& GetExtReg(int index) const override; + void SetExtReg(int index, u128& value) override; u32 GetVFPReg(int index) const override; void SetVFPReg(int index, u32 value) override; u32 GetVFPSystemReg(VFPSystemRegister reg) const override; @@ -29,8 +38,6 @@ public: VAddr GetTlsAddress() const override; void SetTlsAddress(VAddr address) override; - void AddTicks(u64 ticks) override; - void SaveContext(ThreadContext& ctx) override; void LoadContext(const ThreadContext& ctx) override; @@ -38,8 +45,10 @@ public: void ExecuteInstructions(int num_instructions) override; void ClearInstructionCache() override; + void PageTableChanged() override; private: - std::unique_ptr<Dynarmic::Jit> jit; - std::shared_ptr<ARMul_State> interpreter_state; + Dynarmic::Jit* jit = nullptr; + Memory::PageTable* current_page_table = nullptr; + std::map<Memory::PageTable*, std::unique_ptr<Dynarmic::Jit>> jits; }; diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index 99758fc2a..5ebf7a2f1 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -29,6 +29,10 @@ void ARM_DynCom::SetPC(u64 pc) { state->Reg[15] = pc; } +void ARM_DynCom::PageTableChanged() { + ClearInstructionCache(); +} + u64 ARM_DynCom::GetPC() const { return state->Reg[15]; } @@ -41,6 +45,13 @@ void ARM_DynCom::SetReg(int index, u64 value) { state->Reg[index] = value; } +const u128& ARM_DynCom::GetExtReg(int index) const { + return {}; +} + +void ARM_DynCom::SetExtReg(int index, u128& value) { +} + u32 ARM_DynCom::GetVFPReg(int index) const { return state->ExtReg[index]; } @@ -80,12 +91,6 @@ VAddr ARM_DynCom::GetTlsAddress() const { void ARM_DynCom::SetTlsAddress(VAddr /*address*/) { } -void ARM_DynCom::AddTicks(u64 ticks) { - down_count -= ticks; - if (down_count < 0) - CoreTiming::Advance(); -} - void ARM_DynCom::ExecuteInstructions(int num_instructions) { state->NumInstrsToExecute = num_instructions; @@ -93,7 +98,7 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) { // executing one instruction at a time. Otherwise, if a block is being executed, more // instructions may actually be executed than specified. unsigned ticks_executed = InterpreterMainLoop(state.get()); - AddTicks(ticks_executed); + CoreTiming::AddTicks(ticks_executed); } void ARM_DynCom::SaveContext(ThreadContext& ctx) { diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index 44e674ae2..cc3c0f3da 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h @@ -16,11 +16,14 @@ public: ~ARM_DynCom(); void ClearInstructionCache() override; + void PageTableChanged() override; void SetPC(u64 pc) override; u64 GetPC() const override; u64 GetReg(int index) const override; void SetReg(int index, u64 value) override; + const u128& GetExtReg(int index) const override; + void SetExtReg(int index, u128& value) override; u32 GetVFPReg(int index) const override; void SetVFPReg(int index, u32 value) override; u32 GetVFPSystemReg(VFPSystemRegister reg) const override; @@ -32,8 +35,6 @@ public: VAddr GetTlsAddress() const override; void SetTlsAddress(VAddr address) override; - void AddTicks(u64 ticks) override; - void SaveContext(ThreadContext& ctx) override; void LoadContext(const ThreadContext& ctx) override; diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp index f4fbb8d04..3522d1e82 100644 --- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp +++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp @@ -759,7 +759,7 @@ static ThumbDecodeStatus DecodeThumbInstruction(u32 inst, u32 addr, u32* arm_ins ThumbDecodeStatus ret = TranslateThumbInstruction(addr, inst, arm_inst, inst_size); if (ret == ThumbDecodeStatus::BRANCH) { int inst_index; - int table_length = arm_instruction_trans_len; + int table_length = static_cast<int>(arm_instruction_trans_len); u32 tinstr = GetThumbInstruction(inst, addr); switch ((tinstr & 0xF800) >> 11) { @@ -838,7 +838,7 @@ static unsigned int InterpreterTranslateInstruction(const ARMul_State* cpu, cons return inst_size; } -static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) { +static int InterpreterTranslateBlock(ARMul_State* cpu, std::size_t& bb_start, u32 addr) { MICROPROFILE_SCOPE(DynCom_Decode); // Decode instruction, get index @@ -871,7 +871,7 @@ static int InterpreterTranslateBlock(ARMul_State* cpu, int& bb_start, u32 addr) return KEEP_GOING; } -static int InterpreterTranslateSingle(ARMul_State* cpu, int& bb_start, u32 addr) { +static int InterpreterTranslateSingle(ARMul_State* cpu, std::size_t& bb_start, u32 addr) { MICROPROFILE_SCOPE(DynCom_Decode); ARM_INST_PTR inst_base = nullptr; @@ -1620,7 +1620,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) { unsigned int addr; unsigned int num_instrs = 0; - int ptr; + std::size_t ptr; LOAD_NZCVT; DISPATCH : { diff --git a/src/core/arm/skyeye_common/armstate.h b/src/core/arm/skyeye_common/armstate.h index 1a707ff7e..893877797 100644 --- a/src/core/arm/skyeye_common/armstate.h +++ b/src/core/arm/skyeye_common/armstate.h @@ -230,7 +230,7 @@ public: // TODO(bunnei): Move this cache to a better place - it should be per codeset (likely per // process for our purposes), not per ARMul_State (which tracks CPU core state). - std::unordered_map<u32, int> instruction_cache; + std::unordered_map<u32, std::size_t> instruction_cache; private: void ResetMPCoreCP15Registers(); diff --git a/src/core/core.cpp b/src/core/core.cpp index d08f18623..c5448630f 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -9,16 +9,19 @@ #include "core/arm/arm_interface.h" #include "core/arm/dynarmic/arm_dynarmic.h" #include "core/arm/dyncom/arm_dyncom.h" +#include "core/arm/unicorn/arm_unicorn.h" #include "core/core.h" #include "core/core_timing.h" #include "core/gdbstub/gdbstub.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/kernel/process.h" #include "core/hle/kernel/thread.h" #include "core/hle/service/service.h" #include "core/hw/hw.h" #include "core/loader/loader.h" #include "core/memory_setup.h" #include "core/settings.h" +#include "network/network.h" #include "video_core/video_core.h" namespace Core { @@ -99,7 +102,7 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file return init_result; } - const Loader::ResultStatus load_result{app_loader->Load()}; + const Loader::ResultStatus load_result{app_loader->Load(Kernel::g_current_process)}; if (Loader::ResultStatus::Success != load_result) { LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); System::Shutdown(); @@ -136,7 +139,6 @@ void System::Reschedule() { } System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { - Memory::InitMemoryMap(); LOG_DEBUG(HW_Memory, "initialized OK"); if (Settings::values.use_cpu_jit) { @@ -188,8 +190,12 @@ void System::Shutdown() { cpu_core = nullptr; app_loader = nullptr; telemetry_session = nullptr; + if (auto room_member = Network::GetRoomMember().lock()) { + Network::GameInfo game_info{}; + room_member->SendGameInfo(game_info); + } LOG_DEBUG(Core, "Shutdown OK"); } -} // namespace +} // namespace Core diff --git a/src/core/core.h b/src/core/core.h index 4e3b6b409..9805cc694 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -7,6 +7,7 @@ #include <memory> #include <string> #include "common/common_types.h" +#include "core/loader/loader.h" #include "core/memory.h" #include "core/perf_stats.h" #include "core/telemetry_session.h" @@ -14,10 +15,6 @@ class EmuWindow; class ARM_Interface; -namespace Loader { -class AppLoader; -} - namespace Core { class System { @@ -119,6 +116,10 @@ public: return status_details; } + Loader::AppLoader& GetAppLoader() const { + return *app_loader; + } + private: /** * Initialize the emulated system. diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 276ecfdf6..5e2a5d00f 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -57,6 +57,9 @@ static s64 idled_cycles; static s64 last_global_time_ticks; static s64 last_global_time_us; +static s64 down_count = 0; ///< A decreasing counter of remaining cycles before the next event, + /// decreased by the cpu run loop + static std::recursive_mutex external_event_section; // Warning: not included in save state. @@ -146,7 +149,7 @@ void UnregisterAllEvents() { } void Init() { - Core::CPU().down_count = INITIAL_SLICE_LENGTH; + down_count = INITIAL_SLICE_LENGTH; g_slice_length = INITIAL_SLICE_LENGTH; global_timer = 0; idled_cycles = 0; @@ -185,8 +188,15 @@ void Shutdown() { } } +void AddTicks(u64 ticks) { + down_count -= ticks; + if (down_count < 0) { + Advance(); + } +} + u64 GetTicks() { - return (u64)global_timer + g_slice_length - Core::CPU().down_count; + return (u64)global_timer + g_slice_length - down_count; } u64 GetIdleTicks() { @@ -460,18 +470,18 @@ void MoveEvents() { } void ForceCheck() { - s64 cycles_executed = g_slice_length - Core::CPU().down_count; + s64 cycles_executed = g_slice_length - down_count; global_timer += cycles_executed; // This will cause us to check for new events immediately. - Core::CPU().down_count = 0; + down_count = 0; // But let's not eat a bunch more time in Advance() because of this. g_slice_length = 0; } void Advance() { - s64 cycles_executed = g_slice_length - Core::CPU().down_count; + s64 cycles_executed = g_slice_length - down_count; global_timer += cycles_executed; - Core::CPU().down_count = g_slice_length; + down_count = g_slice_length; if (has_ts_events) MoveEvents(); @@ -480,7 +490,7 @@ void Advance() { if (!first) { if (g_slice_length < 10000) { g_slice_length += 10000; - Core::CPU().down_count += g_slice_length; + down_count += g_slice_length; } } else { // Note that events can eat cycles as well. @@ -490,7 +500,7 @@ void Advance() { const int diff = target - g_slice_length; g_slice_length += diff; - Core::CPU().down_count += diff; + down_count += diff; } if (advance_callback) advance_callback(static_cast<int>(cycles_executed)); @@ -506,12 +516,12 @@ void LogPendingEvents() { } void Idle(int max_idle) { - s64 cycles_down = Core::CPU().down_count; + s64 cycles_down = down_count; if (max_idle != 0 && cycles_down > max_idle) cycles_down = max_idle; if (first && cycles_down > 0) { - s64 cycles_executed = g_slice_length - Core::CPU().down_count; + s64 cycles_executed = g_slice_length - down_count; s64 cycles_next_event = first->time - global_timer; if (cycles_next_event < cycles_executed + cycles_down) { @@ -526,9 +536,9 @@ void Idle(int max_idle) { cycles_down / (float)(g_clock_rate_arm11 * 0.001f)); idled_cycles += cycles_down; - Core::CPU().down_count -= cycles_down; - if (Core::CPU().down_count == 0) - Core::CPU().down_count = -1; + down_count -= cycles_down; + if (down_count == 0) + down_count = -1; } std::string GetScheduledEventsSummary() { diff --git a/src/core/core_timing.h b/src/core/core_timing.h index d2f85cd4d..897350801 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h @@ -67,6 +67,12 @@ void Shutdown(); typedef void (*MHzChangeCallback)(); typedef std::function<void(u64 userdata, int cycles_late)> TimedCallback; +/** +* Advance the CPU core by the specified number of ticks (e.g. to simulate CPU execution time) +* @param ticks Number of ticks to advance the CPU core +*/ +void AddTicks(u64 ticks); + u64 GetTicks(); u64 GetIdleTicks(); u64 GetGlobalTimeUs(); diff --git a/src/core/file_sys/archive_backend.cpp b/src/core/file_sys/archive_backend.cpp index 1fae0ede0..87a240d7a 100644 --- a/src/core/file_sys/archive_backend.cpp +++ b/src/core/file_sys/archive_backend.cpp @@ -90,6 +90,8 @@ std::u16string Path::AsU16Str() const { LOG_ERROR(Service_FS, "LowPathType cannot be converted to u16string!"); return {}; } + + UNREACHABLE(); } std::vector<u8> Path::AsBinary() const { diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp index 6d9007731..e8c5be983 100644 --- a/src/core/file_sys/archive_ncch.cpp +++ b/src/core/file_sys/archive_ncch.cpp @@ -13,7 +13,10 @@ #include "core/file_sys/archive_ncch.h" #include "core/file_sys/errors.h" #include "core/file_sys/ivfc_archive.h" +#include "core/file_sys/ncch_container.h" +#include "core/file_sys/title_metadata.h" #include "core/hle/service/fs/archive.h" +#include "core/loader/loader.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // FileSys namespace @@ -25,8 +28,18 @@ static std::string GetNCCHContainerPath(const std::string& nand_directory) { } static std::string GetNCCHPath(const std::string& mount_point, u32 high, u32 low) { - return Common::StringFromFormat("%s%08x/%08x/content/00000000.app.romfs", mount_point.c_str(), - high, low); + u32 content_id = 0; + + // TODO(shinyquagsire23): Title database should be doing this path lookup + std::string content_path = + Common::StringFromFormat("%s%08x/%08x/content/", mount_point.c_str(), high, low); + std::string tmd_path = content_path + "00000000.tmd"; + TitleMetadata tmd(tmd_path); + if (tmd.Load() == Loader::ResultStatus::Success) { + content_id = tmd.GetBootContentID(); + } + + return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id); } ArchiveFactory_NCCH::ArchiveFactory_NCCH(const std::string& nand_directory) @@ -38,9 +51,14 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path& u32 high = data[1]; u32 low = data[0]; std::string file_path = GetNCCHPath(mount_point, high, low); - auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb"); - if (!file->IsOpen()) { + std::shared_ptr<FileUtil::IOFile> romfs_file; + u64 romfs_offset = 0; + u64 romfs_size = 0; + auto ncch_container = NCCHContainer(file_path); + + if (ncch_container.ReadRomFS(romfs_file, romfs_offset, romfs_size) != + Loader::ResultStatus::Success) { // High Title ID of the archive: The category (https://3dbrew.org/wiki/Title_list). constexpr u32 shared_data_archive = 0x0004009B; constexpr u32 system_data_archive = 0x000400DB; @@ -74,9 +92,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path& } return ERROR_NOT_FOUND; } - auto size = file->GetSize(); - auto archive = std::make_unique<IVFCArchive>(file, 0, size); + auto archive = std::make_unique<IVFCArchive>(romfs_file, romfs_offset, romfs_size); return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); } diff --git a/src/core/file_sys/archive_sdmc.cpp b/src/core/file_sys/archive_sdmc.cpp index 679909d06..fe3dce5d4 100644 --- a/src/core/file_sys/archive_sdmc.cpp +++ b/src/core/file_sys/archive_sdmc.cpp @@ -121,7 +121,25 @@ ResultCode SDMCArchive::DeleteFile(const Path& path) const { } ResultCode SDMCArchive::RenameFile(const Path& src_path, const Path& dest_path) const { - if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) { + const PathParser path_parser_src(src_path); + + // TODO: Verify these return codes with HW + if (!path_parser_src.IsValid()) { + LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const PathParser path_parser_dest(dest_path); + + if (!path_parser_dest.IsValid()) { + LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const auto src_path_full = path_parser_src.BuildHostPath(mount_point); + const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point); + + if (FileUtil::Rename(src_path_full, dest_path_full)) { return RESULT_SUCCESS; } @@ -260,8 +278,27 @@ ResultCode SDMCArchive::CreateDirectory(const Path& path) const { } ResultCode SDMCArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const { - if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) + const PathParser path_parser_src(src_path); + + // TODO: Verify these return codes with HW + if (!path_parser_src.IsValid()) { + LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const PathParser path_parser_dest(dest_path); + + if (!path_parser_dest.IsValid()) { + LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const auto src_path_full = path_parser_src.BuildHostPath(mount_point); + const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point); + + if (FileUtil::Rename(src_path_full, dest_path_full)) { return RESULT_SUCCESS; + } // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't // exist or similar. Verify. diff --git a/src/core/file_sys/archive_selfncch.cpp b/src/core/file_sys/archive_selfncch.cpp index 298a37a44..3222000cf 100644 --- a/src/core/file_sys/archive_selfncch.cpp +++ b/src/core/file_sys/archive_selfncch.cpp @@ -3,12 +3,14 @@ // Refer to the license.txt file included. #include <array> +#include <cinttypes> #include "common/common_types.h" #include "common/logging/log.h" #include "common/swap.h" #include "core/file_sys/archive_selfncch.h" #include "core/file_sys/errors.h" #include "core/file_sys/ivfc_archive.h" +#include "core/hle/kernel/process.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // FileSys namespace @@ -102,8 +104,7 @@ public: switch (static_cast<SelfNCCHFilePathType>(file_path.type)) { case SelfNCCHFilePathType::UpdateRomFS: - LOG_WARNING(Service_FS, "(STUBBED) open update RomFS"); - return OpenRomFS(); + return OpenUpdateRomFS(); case SelfNCCHFilePathType::RomFS: return OpenRomFS(); @@ -179,6 +180,17 @@ private: } } + ResultVal<std::unique_ptr<FileBackend>> OpenUpdateRomFS() const { + if (ncch_data.update_romfs_file) { + return MakeResult<std::unique_ptr<FileBackend>>(std::make_unique<IVFCFile>( + ncch_data.update_romfs_file, ncch_data.update_romfs_offset, + ncch_data.update_romfs_size)); + } else { + LOG_INFO(Service_FS, "Unable to read update RomFS"); + return ERROR_ROMFS_NOT_FOUND; + } + } + ResultVal<std::unique_ptr<FileBackend>> OpenExeFS(const std::string& filename) const { if (filename == "icon") { if (ncch_data.icon) { @@ -217,31 +229,59 @@ private: NCCHData ncch_data; }; -ArchiveFactory_SelfNCCH::ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader) { +void ArchiveFactory_SelfNCCH::Register(Loader::AppLoader& app_loader) { + u64 program_id = 0; + if (app_loader.ReadProgramId(program_id) != Loader::ResultStatus::Success) { + LOG_WARNING( + Service_FS, + "Could not read program id when registering with SelfNCCH, this might be a 3dsx file"); + } + + LOG_DEBUG(Service_FS, "Registering program %016" PRIX64 " with the SelfNCCH archive factory", + program_id); + + if (ncch_data.find(program_id) != ncch_data.end()) { + LOG_WARNING(Service_FS, "Registering program %016" PRIX64 + " with SelfNCCH will override existing mapping", + program_id); + } + + NCCHData& data = ncch_data[program_id]; + std::shared_ptr<FileUtil::IOFile> romfs_file_; if (Loader::ResultStatus::Success == - app_loader.ReadRomFS(romfs_file_, ncch_data.romfs_offset, ncch_data.romfs_size)) { + app_loader.ReadRomFS(romfs_file_, data.romfs_offset, data.romfs_size)) { + + data.romfs_file = std::move(romfs_file_); + } + + std::shared_ptr<FileUtil::IOFile> update_romfs_file; + if (Loader::ResultStatus::Success == + app_loader.ReadUpdateRomFS(update_romfs_file, data.update_romfs_offset, + data.update_romfs_size)) { - ncch_data.romfs_file = std::move(romfs_file_); + data.update_romfs_file = std::move(update_romfs_file); } std::vector<u8> buffer; if (Loader::ResultStatus::Success == app_loader.ReadIcon(buffer)) - ncch_data.icon = std::make_shared<std::vector<u8>>(std::move(buffer)); + data.icon = std::make_shared<std::vector<u8>>(std::move(buffer)); buffer.clear(); if (Loader::ResultStatus::Success == app_loader.ReadLogo(buffer)) - ncch_data.logo = std::make_shared<std::vector<u8>>(std::move(buffer)); + data.logo = std::make_shared<std::vector<u8>>(std::move(buffer)); buffer.clear(); if (Loader::ResultStatus::Success == app_loader.ReadBanner(buffer)) - ncch_data.banner = std::make_shared<std::vector<u8>>(std::move(buffer)); + data.banner = std::make_shared<std::vector<u8>>(std::move(buffer)); } ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SelfNCCH::Open(const Path& path) { - auto archive = std::make_unique<SelfNCCHArchive>(ncch_data); - return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); + //auto archive = std::make_unique<SelfNCCHArchive>( + // ncch_data[Kernel::g_current_process->codeset->program_id]); + //return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); + return {}; } ResultCode ArchiveFactory_SelfNCCH::Format(const Path&, const FileSys::ArchiveFormatInfo&) { diff --git a/src/core/file_sys/archive_selfncch.h b/src/core/file_sys/archive_selfncch.h index f1b971296..0d6d6766e 100644 --- a/src/core/file_sys/archive_selfncch.h +++ b/src/core/file_sys/archive_selfncch.h @@ -6,6 +6,7 @@ #include <memory> #include <string> +#include <unordered_map> #include <vector> #include "common/common_types.h" #include "core/file_sys/archive_backend.h" @@ -24,12 +25,19 @@ struct NCCHData { std::shared_ptr<FileUtil::IOFile> romfs_file; u64 romfs_offset = 0; u64 romfs_size = 0; + + std::shared_ptr<FileUtil::IOFile> update_romfs_file; + u64 update_romfs_offset = 0; + u64 update_romfs_size = 0; }; /// File system interface to the SelfNCCH archive class ArchiveFactory_SelfNCCH final : public ArchiveFactory { public: - explicit ArchiveFactory_SelfNCCH(Loader::AppLoader& app_loader); + ArchiveFactory_SelfNCCH() = default; + + /// Registers a loaded application so that we can open its SelfNCCH archive when requested. + void Register(Loader::AppLoader& app_loader); std::string GetName() const override { return "SelfNCCH"; @@ -39,7 +47,8 @@ public: ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path) const override; private: - NCCHData ncch_data; + /// Mapping of ProgramId -> NCCHData + std::unordered_map<u64, NCCHData> ncch_data; }; } // namespace FileSys diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp new file mode 100644 index 000000000..b9fb940c7 --- /dev/null +++ b/src/core/file_sys/ncch_container.cpp @@ -0,0 +1,423 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <cinttypes> +#include <cstring> +#include <memory> +#include "common/common_types.h" +#include "common/logging/log.h" +#include "core/core.h" +#include "core/file_sys/ncch_container.h" +#include "core/loader/loader.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// FileSys namespace + +namespace FileSys { + +static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs +static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes) + +/** + * Get the decompressed size of an LZSS compressed ExeFS file + * @param buffer Buffer of compressed file + * @param size Size of compressed buffer + * @return Size of decompressed buffer + */ +static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) { + u32 offset_size = *(u32*)(buffer + size - 4); + return offset_size + size; +} + +/** + * Decompress ExeFS file (compressed with LZSS) + * @param compressed Compressed buffer + * @param compressed_size Size of compressed buffer + * @param decompressed Decompressed buffer + * @param decompressed_size Size of decompressed buffer + * @return True on success, otherwise false + */ +static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed, + u32 decompressed_size) { + const u8* footer = compressed + compressed_size - 8; + u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer); + u32 out = decompressed_size; + u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF); + u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF); + + memset(decompressed, 0, decompressed_size); + memcpy(decompressed, compressed, compressed_size); + + while (index > stop_index) { + u8 control = compressed[--index]; + + for (unsigned i = 0; i < 8; i++) { + if (index <= stop_index) + break; + if (index <= 0) + break; + if (out <= 0) + break; + + if (control & 0x80) { + // Check if compression is out of bounds + if (index < 2) + return false; + index -= 2; + + u32 segment_offset = compressed[index] | (compressed[index + 1] << 8); + u32 segment_size = ((segment_offset >> 12) & 15) + 3; + segment_offset &= 0x0FFF; + segment_offset += 2; + + // Check if compression is out of bounds + if (out < segment_size) + return false; + + for (unsigned j = 0; j < segment_size; j++) { + // Check if compression is out of bounds + if (out + segment_offset >= decompressed_size) + return false; + + u8 data = decompressed[out + segment_offset]; + decompressed[--out] = data; + } + } else { + // Check if compression is out of bounds + if (out < 1) + return false; + decompressed[--out] = compressed[--index]; + } + control <<= 1; + } + } + return true; +} + +NCCHContainer::NCCHContainer(const std::string& filepath) : filepath(filepath) { + file = FileUtil::IOFile(filepath, "rb"); +} + +Loader::ResultStatus NCCHContainer::OpenFile(const std::string& filepath) { + this->filepath = filepath; + file = FileUtil::IOFile(filepath, "rb"); + + if (!file.IsOpen()) { + LOG_WARNING(Service_FS, "Failed to open %s", filepath.c_str()); + return Loader::ResultStatus::Error; + } + + LOG_DEBUG(Service_FS, "Opened %s", filepath.c_str()); + return Loader::ResultStatus::Success; +} + +Loader::ResultStatus NCCHContainer::Load() { + if (is_loaded) + return Loader::ResultStatus::Success; + + if (file.IsOpen()) { + // Reset read pointer in case this file has been read before. + file.Seek(0, SEEK_SET); + + if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header)) + return Loader::ResultStatus::Error; + + // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)... + if (Loader::MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) { + LOG_DEBUG(Service_FS, "Only loading the first (bootable) NCCH within the NCSD file!"); + ncch_offset = 0x4000; + file.Seek(ncch_offset, SEEK_SET); + file.ReadBytes(&ncch_header, sizeof(NCCH_Header)); + } + + // Verify we are loading the correct file type... + if (Loader::MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic) + return Loader::ResultStatus::ErrorInvalidFormat; + + has_header = true; + + // System archives and DLC don't have an extended header but have RomFS + if (ncch_header.extended_header_size) { + if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) != + sizeof(ExHeader_Header)) + return Loader::ResultStatus::Error; + + is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1; + u32 entry_point = exheader_header.codeset_info.text.address; + u32 code_size = exheader_header.codeset_info.text.code_size; + u32 stack_size = exheader_header.codeset_info.stack_size; + u32 bss_size = exheader_header.codeset_info.bss_size; + u32 core_version = exheader_header.arm11_system_local_caps.core_version; + u8 priority = exheader_header.arm11_system_local_caps.priority; + u8 resource_limit_category = + exheader_header.arm11_system_local_caps.resource_limit_category; + + LOG_DEBUG(Service_FS, "Name: %s", + exheader_header.codeset_info.name); + LOG_DEBUG(Service_FS, "Program ID: %016" PRIX64, + ncch_header.program_id); + LOG_DEBUG(Service_FS, "Code compressed: %s", is_compressed ? "yes" : "no"); + LOG_DEBUG(Service_FS, "Entry point: 0x%08X", entry_point); + LOG_DEBUG(Service_FS, "Code size: 0x%08X", code_size); + LOG_DEBUG(Service_FS, "Stack size: 0x%08X", stack_size); + LOG_DEBUG(Service_FS, "Bss size: 0x%08X", bss_size); + LOG_DEBUG(Service_FS, "Core version: %d", core_version); + LOG_DEBUG(Service_FS, "Thread priority: 0x%X", priority); + LOG_DEBUG(Service_FS, "Resource limit category: %d", resource_limit_category); + LOG_DEBUG(Service_FS, "System Mode: %d", + static_cast<int>(exheader_header.arm11_system_local_caps.system_mode)); + + if (exheader_header.system_info.jump_id != ncch_header.program_id) { + LOG_ERROR(Service_FS, + "ExHeader Program ID mismatch: the ROM is probably encrypted."); + return Loader::ResultStatus::ErrorEncrypted; + } + + has_exheader = true; + } + + // DLC can have an ExeFS and a RomFS but no extended header + if (ncch_header.exefs_size) { + exefs_offset = ncch_header.exefs_offset * kBlockSize; + u32 exefs_size = ncch_header.exefs_size * kBlockSize; + + LOG_DEBUG(Service_FS, "ExeFS offset: 0x%08X", exefs_offset); + LOG_DEBUG(Service_FS, "ExeFS size: 0x%08X", exefs_size); + + file.Seek(exefs_offset + ncch_offset, SEEK_SET); + if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header)) + return Loader::ResultStatus::Error; + + exefs_file = FileUtil::IOFile(filepath, "rb"); + has_exefs = true; + } + + if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0) + has_romfs = true; + } + + LoadOverrides(); + + // We need at least one of these or overrides, practically + if (!(has_exefs || has_romfs || is_tainted)) + return Loader::ResultStatus::Error; + + is_loaded = true; + return Loader::ResultStatus::Success; +} + +Loader::ResultStatus NCCHContainer::LoadOverrides() { + // Check for split-off files, mark the archive as tainted if we will use them + std::string romfs_override = filepath + ".romfs"; + if (FileUtil::Exists(romfs_override)) { + is_tainted = true; + } + + // If we have a split-off exefs file/folder, it takes priority + std::string exefs_override = filepath + ".exefs"; + std::string exefsdir_override = filepath + ".exefsdir/"; + if (FileUtil::Exists(exefs_override)) { + exefs_file = FileUtil::IOFile(exefs_override, "rb"); + + if (exefs_file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) == sizeof(ExeFs_Header)) { + LOG_DEBUG(Service_FS, "Loading ExeFS section from %s", exefs_override.c_str()); + exefs_offset = 0; + is_tainted = true; + has_exefs = true; + } else { + exefs_file = FileUtil::IOFile(filepath, "rb"); + } + } else if (FileUtil::Exists(exefsdir_override) && FileUtil::IsDirectory(exefsdir_override)) { + is_tainted = true; + } + + if (is_tainted) + LOG_WARNING(Service_FS, + "Loaded NCCH %s is tainted, application behavior may not be as expected!", + filepath.c_str()); + + return Loader::ResultStatus::Success; +} + +Loader::ResultStatus NCCHContainer::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return result; + + // Check if we have files that can drop-in and replace + result = LoadOverrideExeFSSection(name, buffer); + if (result == Loader::ResultStatus::Success || !has_exefs) + return result; + + // If we don't have any separate files, we'll need a full ExeFS + if (!exefs_file.IsOpen()) + return Loader::ResultStatus::Error; + + LOG_DEBUG(Service_FS, "%d sections:", kMaxSections); + // Iterate through the ExeFs archive until we find a section with the specified name... + for (unsigned section_number = 0; section_number < kMaxSections; section_number++) { + const auto& section = exefs_header.section[section_number]; + + // Load the specified section... + if (strcmp(section.name, name) == 0) { + LOG_DEBUG(Service_FS, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number, + section.offset, section.size, section.name); + + s64 section_offset = + (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset); + exefs_file.Seek(section_offset, SEEK_SET); + + if (strcmp(section.name, ".code") == 0 && is_compressed) { + // Section is compressed, read compressed .code section... + std::unique_ptr<u8[]> temp_buffer; + try { + temp_buffer.reset(new u8[section.size]); + } catch (std::bad_alloc&) { + return Loader::ResultStatus::ErrorMemoryAllocationFailed; + } + + if (exefs_file.ReadBytes(&temp_buffer[0], section.size) != section.size) + return Loader::ResultStatus::Error; + + // Decompress .code section... + u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size); + buffer.resize(decompressed_size); + if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size)) + return Loader::ResultStatus::ErrorInvalidFormat; + } else { + // Section is uncompressed... + buffer.resize(section.size); + if (exefs_file.ReadBytes(&buffer[0], section.size) != section.size) + return Loader::ResultStatus::Error; + } + return Loader::ResultStatus::Success; + } + } + return Loader::ResultStatus::ErrorNotUsed; +} + +Loader::ResultStatus NCCHContainer::LoadOverrideExeFSSection(const char* name, + std::vector<u8>& buffer) { + std::string override_name; + + // Map our section name to the extracted equivalent + if (!strcmp(name, ".code")) + override_name = "code.bin"; + else if (!strcmp(name, "icon")) + override_name = "code.bin"; + else if (!strcmp(name, "banner")) + override_name = "banner.bnr"; + else if (!strcmp(name, "logo")) + override_name = "logo.bcma.lz"; + else + return Loader::ResultStatus::Error; + + std::string section_override = filepath + ".exefsdir/" + override_name; + FileUtil::IOFile section_file(section_override, "rb"); + + if (section_file.IsOpen()) { + auto section_size = section_file.GetSize(); + buffer.resize(section_size); + + section_file.Seek(0, SEEK_SET); + if (section_file.ReadBytes(&buffer[0], section_size) == section_size) { + LOG_WARNING(Service_FS, "File %s overriding built-in ExeFS file", + section_override.c_str()); + return Loader::ResultStatus::Success; + } + } + return Loader::ResultStatus::ErrorNotUsed; +} + +Loader::ResultStatus NCCHContainer::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, + u64& offset, u64& size) { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return result; + + if (ReadOverrideRomFS(romfs_file, offset, size) == Loader::ResultStatus::Success) + return Loader::ResultStatus::Success; + + if (!has_romfs) { + LOG_DEBUG(Service_FS, "RomFS requested from NCCH which has no RomFS"); + return Loader::ResultStatus::ErrorNotUsed; + } + + if (!file.IsOpen()) + return Loader::ResultStatus::Error; + + u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000; + u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000; + + LOG_DEBUG(Service_FS, "RomFS offset: 0x%08X", romfs_offset); + LOG_DEBUG(Service_FS, "RomFS size: 0x%08X", romfs_size); + + if (file.GetSize() < romfs_offset + romfs_size) + return Loader::ResultStatus::Error; + + // We reopen the file, to allow its position to be independent from file's + romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb"); + if (!romfs_file->IsOpen()) + return Loader::ResultStatus::Error; + + offset = romfs_offset; + size = romfs_size; + + return Loader::ResultStatus::Success; +} + +Loader::ResultStatus NCCHContainer::ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, + u64& offset, u64& size) { + // Check for RomFS overrides + std::string split_filepath = filepath + ".romfs"; + if (FileUtil::Exists(split_filepath)) { + romfs_file = std::make_shared<FileUtil::IOFile>(split_filepath, "rb"); + if (romfs_file->IsOpen()) { + LOG_WARNING(Service_FS, "File %s overriding built-in RomFS", split_filepath.c_str()); + offset = 0; + size = romfs_file->GetSize(); + return Loader::ResultStatus::Success; + } + } + + return Loader::ResultStatus::ErrorNotUsed; +} + +Loader::ResultStatus NCCHContainer::ReadProgramId(u64_le& program_id) { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return result; + + if (!has_header) + return Loader::ResultStatus::ErrorNotUsed; + + program_id = ncch_header.program_id; + return Loader::ResultStatus::Success; +} + +bool NCCHContainer::HasExeFS() { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return false; + + return has_exefs; +} + +bool NCCHContainer::HasRomFS() { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return false; + + return has_romfs; +} + +bool NCCHContainer::HasExHeader() { + Loader::ResultStatus result = Load(); + if (result != Loader::ResultStatus::Success) + return false; + + return has_exheader; +} + +} // namespace FileSys diff --git a/src/core/file_sys/ncch_container.h b/src/core/file_sys/ncch_container.h new file mode 100644 index 000000000..2cc9d13dc --- /dev/null +++ b/src/core/file_sys/ncch_container.h @@ -0,0 +1,274 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <cstddef> +#include <memory> +#include <string> +#include <vector> +#include "common/bit_field.h" +#include "common/common_types.h" +#include "common/file_util.h" +#include "common/swap.h" +#include "core/core.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym) + +struct NCCH_Header { + u8 signature[0x100]; + u32_le magic; + u32_le content_size; + u8 partition_id[8]; + u16_le maker_code; + u16_le version; + u8 reserved_0[4]; + u64_le program_id; + u8 reserved_1[0x10]; + u8 logo_region_hash[0x20]; + u8 product_code[0x10]; + u8 extended_header_hash[0x20]; + u32_le extended_header_size; + u8 reserved_2[4]; + u8 flags[8]; + u32_le plain_region_offset; + u32_le plain_region_size; + u32_le logo_region_offset; + u32_le logo_region_size; + u32_le exefs_offset; + u32_le exefs_size; + u32_le exefs_hash_region_size; + u8 reserved_3[4]; + u32_le romfs_offset; + u32_le romfs_size; + u32_le romfs_hash_region_size; + u8 reserved_4[4]; + u8 exefs_super_block_hash[0x20]; + u8 romfs_super_block_hash[0x20]; +}; + +static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong"); + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// ExeFS (executable file system) headers + +struct ExeFs_SectionHeader { + char name[8]; + u32 offset; + u32 size; +}; + +struct ExeFs_Header { + ExeFs_SectionHeader section[8]; + u8 reserved[0x80]; + u8 hashes[8][0x20]; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// ExHeader (executable file system header) headers + +struct ExHeader_SystemInfoFlags { + u8 reserved[5]; + u8 flag; + u8 remaster_version[2]; +}; + +struct ExHeader_CodeSegmentInfo { + u32 address; + u32 num_max_pages; + u32 code_size; +}; + +struct ExHeader_CodeSetInfo { + u8 name[8]; + ExHeader_SystemInfoFlags flags; + ExHeader_CodeSegmentInfo text; + u32 stack_size; + ExHeader_CodeSegmentInfo ro; + u8 reserved[4]; + ExHeader_CodeSegmentInfo data; + u32 bss_size; +}; + +struct ExHeader_DependencyList { + u8 program_id[0x30][8]; +}; + +struct ExHeader_SystemInfo { + u64 save_data_size; + u64_le jump_id; + u8 reserved_2[0x30]; +}; + +struct ExHeader_StorageInfo { + u8 ext_save_data_id[8]; + u8 system_save_data_id[8]; + u8 reserved[8]; + u8 access_info[7]; + u8 other_attributes; +}; + +struct ExHeader_ARM11_SystemLocalCaps { + u64_le program_id; + u32_le core_version; + u8 reserved_flags[2]; + union { + u8 flags0; + BitField<0, 2, u8> ideal_processor; + BitField<2, 2, u8> affinity_mask; + BitField<4, 4, u8> system_mode; + }; + u8 priority; + u8 resource_limit_descriptor[0x10][2]; + ExHeader_StorageInfo storage_info; + u8 service_access_control[0x20][8]; + u8 ex_service_access_control[0x2][8]; + u8 reserved[0xf]; + u8 resource_limit_category; +}; + +struct ExHeader_ARM11_KernelCaps { + u32_le descriptors[28]; + u8 reserved[0x10]; +}; + +struct ExHeader_ARM9_AccessControl { + u8 descriptors[15]; + u8 descversion; +}; + +struct ExHeader_Header { + ExHeader_CodeSetInfo codeset_info; + ExHeader_DependencyList dependency_list; + ExHeader_SystemInfo system_info; + ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps; + ExHeader_ARM11_KernelCaps arm11_kernel_caps; + ExHeader_ARM9_AccessControl arm9_access_control; + struct { + u8 signature[0x100]; + u8 ncch_public_key_modulus[0x100]; + ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps; + ExHeader_ARM11_KernelCaps arm11_kernel_caps; + ExHeader_ARM9_AccessControl arm9_access_control; + } access_desc; +}; + +static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong"); + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// FileSys namespace + +namespace FileSys { + +/** + * Helper which implements an interface to deal with NCCH containers which can + * contain ExeFS archives or RomFS archives for games or other applications. + */ +class NCCHContainer { +public: + NCCHContainer(const std::string& filepath); + NCCHContainer() {} + + Loader::ResultStatus OpenFile(const std::string& filepath); + + /** + * Ensure ExeFS and exheader is loaded and ready for reading sections + * @return ResultStatus result of function + */ + Loader::ResultStatus Load(); + + /** + * Attempt to find overridden sections for the NCCH and mark the container as tainted + * if any are found. + * @return ResultStatus result of function + */ + Loader::ResultStatus LoadOverrides(); + + /** + * Reads an application ExeFS section of an NCCH file (e.g. .code, .logo, etc.) + * @param name Name of section to read out of NCCH file + * @param buffer Vector to read data into + * @return ResultStatus result of function + */ + Loader::ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer); + + /** + * Reads an application ExeFS section from external files instead of an NCCH file, + * (e.g. code.bin, logo.bcma.lz, icon.icn, banner.bnr) + * @param name Name of section to read from external files + * @param buffer Vector to read data into + * @return ResultStatus result of function + */ + Loader::ResultStatus LoadOverrideExeFSSection(const char* name, std::vector<u8>& buffer); + + /** + * Get the RomFS of the NCCH container + * Since the RomFS can be huge, we return a file reference instead of copying to a buffer + * @param romfs_file The file containing the RomFS + * @param offset The offset the romfs begins on + * @param size The size of the romfs + * @return ResultStatus result of function + */ + Loader::ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, + u64& size); + + /** + * Get the override RomFS of the NCCH container + * Since the RomFS can be huge, we return a file reference instead of copying to a buffer + * @param romfs_file The file containing the RomFS + * @param offset The offset the romfs begins on + * @param size The size of the romfs + * @return ResultStatus result of function + */ + Loader::ResultStatus ReadOverrideRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, + u64& offset, u64& size); + + /** + * Get the Program ID of the NCCH container + * @return ResultStatus result of function + */ + Loader::ResultStatus ReadProgramId(u64_le& program_id); + + /** + * Checks whether the NCCH container contains an ExeFS + * @return bool check result + */ + bool HasExeFS(); + + /** + * Checks whether the NCCH container contains a RomFS + * @return bool check result + */ + bool HasRomFS(); + + /** + * Checks whether the NCCH container contains an ExHeader + * @return bool check result + */ + bool HasExHeader(); + + NCCH_Header ncch_header; + ExeFs_Header exefs_header; + ExHeader_Header exheader_header; + +private: + bool has_header = false; + bool has_exheader = false; + bool has_exefs = false; + bool has_romfs = false; + + bool is_tainted = false; // Are there parts of this container being overridden? + bool is_loaded = false; + bool is_compressed = false; + + u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header + u32 exefs_offset = 0; + + std::string filepath; + FileUtil::IOFile file; + FileUtil::IOFile exefs_file; +}; + +} // namespace FileSys diff --git a/src/core/file_sys/savedata_archive.cpp b/src/core/file_sys/savedata_archive.cpp index f540c4a93..f8f811ba0 100644 --- a/src/core/file_sys/savedata_archive.cpp +++ b/src/core/file_sys/savedata_archive.cpp @@ -106,7 +106,25 @@ ResultCode SaveDataArchive::DeleteFile(const Path& path) const { } ResultCode SaveDataArchive::RenameFile(const Path& src_path, const Path& dest_path) const { - if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) { + const PathParser path_parser_src(src_path); + + // TODO: Verify these return codes with HW + if (!path_parser_src.IsValid()) { + LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const PathParser path_parser_dest(dest_path); + + if (!path_parser_dest.IsValid()) { + LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const auto src_path_full = path_parser_src.BuildHostPath(mount_point); + const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point); + + if (FileUtil::Rename(src_path_full, dest_path_full)) { return RESULT_SUCCESS; } @@ -247,8 +265,27 @@ ResultCode SaveDataArchive::CreateDirectory(const Path& path) const { } ResultCode SaveDataArchive::RenameDirectory(const Path& src_path, const Path& dest_path) const { - if (FileUtil::Rename(mount_point + src_path.AsString(), mount_point + dest_path.AsString())) + const PathParser path_parser_src(src_path); + + // TODO: Verify these return codes with HW + if (!path_parser_src.IsValid()) { + LOG_ERROR(Service_FS, "Invalid src path %s", src_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const PathParser path_parser_dest(dest_path); + + if (!path_parser_dest.IsValid()) { + LOG_ERROR(Service_FS, "Invalid dest path %s", dest_path.DebugStr().c_str()); + return ERROR_INVALID_PATH; + } + + const auto src_path_full = path_parser_src.BuildHostPath(mount_point); + const auto dest_path_full = path_parser_dest.BuildHostPath(mount_point); + + if (FileUtil::Rename(src_path_full, dest_path_full)) { return RESULT_SUCCESS; + } // TODO(yuriks): This code probably isn't right, it'll return a Status even if the file didn't // exist or similar. Verify. diff --git a/src/core/file_sys/title_metadata.cpp b/src/core/file_sys/title_metadata.cpp new file mode 100644 index 000000000..1ef8840a0 --- /dev/null +++ b/src/core/file_sys/title_metadata.cpp @@ -0,0 +1,212 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <cinttypes> +#include <cryptopp/sha.h> +#include "common/alignment.h" +#include "common/file_util.h" +#include "common/logging/log.h" +#include "core/file_sys/title_metadata.h" +#include "core/loader/loader.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// FileSys namespace + +namespace FileSys { + +static u32 GetSignatureSize(u32 signature_type) { + switch (signature_type) { + case Rsa4096Sha1: + case Rsa4096Sha256: + return 0x200; + + case Rsa2048Sha1: + case Rsa2048Sha256: + return 0x100; + + case EllipticSha1: + case EcdsaSha256: + return 0x3C; + } +} + +Loader::ResultStatus TitleMetadata::Load() { + FileUtil::IOFile file(filepath, "rb"); + if (!file.IsOpen()) + return Loader::ResultStatus::Error; + + if (!file.ReadBytes(&signature_type, sizeof(u32_be))) + return Loader::ResultStatus::Error; + + // Signature lengths are variable, and the body follows the signature + u32 signature_size = GetSignatureSize(signature_type); + + tmd_signature.resize(signature_size); + if (!file.ReadBytes(&tmd_signature[0], signature_size)) + return Loader::ResultStatus::Error; + + // The TMD body start position is rounded to the nearest 0x40 after the signature + size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40); + file.Seek(body_start, SEEK_SET); + + // Read our TMD body, then load the amount of ContentChunks specified + if (file.ReadBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body)) + return Loader::ResultStatus::Error; + + for (u16 i = 0; i < tmd_body.content_count; i++) { + ContentChunk chunk; + if (file.ReadBytes(&chunk, sizeof(ContentChunk)) == sizeof(ContentChunk)) { + tmd_chunks.push_back(chunk); + } else { + LOG_ERROR(Service_FS, "Malformed TMD %s, failed to load content chunk index %u!", + filepath.c_str(), i); + return Loader::ResultStatus::ErrorInvalidFormat; + } + } + + return Loader::ResultStatus::Success; +} + +Loader::ResultStatus TitleMetadata::Save() { + FileUtil::IOFile file(filepath, "wb"); + if (!file.IsOpen()) + return Loader::ResultStatus::Error; + + if (!file.WriteBytes(&signature_type, sizeof(u32_be))) + return Loader::ResultStatus::Error; + + // Signature lengths are variable, and the body follows the signature + u32 signature_size = GetSignatureSize(signature_type); + + if (!file.WriteBytes(tmd_signature.data(), signature_size)) + return Loader::ResultStatus::Error; + + // The TMD body start position is rounded to the nearest 0x40 after the signature + size_t body_start = Common::AlignUp(signature_size + sizeof(u32), 0x40); + file.Seek(body_start, SEEK_SET); + + // Update our TMD body values and hashes + tmd_body.content_count = static_cast<u16>(tmd_chunks.size()); + + // TODO(shinyquagsire23): Do TMDs with more than one contentinfo exist? + // For now we'll just adjust the first index to hold all content chunks + // and ensure that no further content info data exists. + tmd_body.contentinfo = {}; + tmd_body.contentinfo[0].index = 0; + tmd_body.contentinfo[0].command_count = static_cast<u16>(tmd_chunks.size()); + + CryptoPP::SHA256 chunk_hash; + for (u16 i = 0; i < tmd_body.content_count; i++) { + chunk_hash.Update(reinterpret_cast<u8*>(&tmd_chunks[i]), sizeof(ContentChunk)); + } + chunk_hash.Final(tmd_body.contentinfo[0].hash.data()); + + CryptoPP::SHA256 contentinfo_hash; + for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) { + chunk_hash.Update(reinterpret_cast<u8*>(&tmd_body.contentinfo[i]), sizeof(ContentInfo)); + } + chunk_hash.Final(tmd_body.contentinfo_hash.data()); + + // Write our TMD body, then write each of our ContentChunks + if (file.WriteBytes(&tmd_body, sizeof(TitleMetadata::Body)) != sizeof(TitleMetadata::Body)) + return Loader::ResultStatus::Error; + + for (u16 i = 0; i < tmd_body.content_count; i++) { + ContentChunk chunk = tmd_chunks[i]; + if (file.WriteBytes(&chunk, sizeof(ContentChunk)) != sizeof(ContentChunk)) + return Loader::ResultStatus::Error; + } + + return Loader::ResultStatus::Success; +} + +u64 TitleMetadata::GetTitleID() const { + return tmd_body.title_id; +} + +u32 TitleMetadata::GetTitleType() const { + return tmd_body.title_type; +} + +u16 TitleMetadata::GetTitleVersion() const { + return tmd_body.title_version; +} + +u64 TitleMetadata::GetSystemVersion() const { + return tmd_body.system_version; +} + +size_t TitleMetadata::GetContentCount() const { + return tmd_chunks.size(); +} + +u32 TitleMetadata::GetBootContentID() const { + return tmd_chunks[TMDContentIndex::Main].id; +} + +u32 TitleMetadata::GetManualContentID() const { + return tmd_chunks[TMDContentIndex::Manual].id; +} + +u32 TitleMetadata::GetDLPContentID() const { + return tmd_chunks[TMDContentIndex::DLP].id; +} + +void TitleMetadata::SetTitleID(u64 title_id) { + tmd_body.title_id = title_id; +} + +void TitleMetadata::SetTitleType(u32 type) { + tmd_body.title_type = type; +} + +void TitleMetadata::SetTitleVersion(u16 version) { + tmd_body.title_version = version; +} + +void TitleMetadata::SetSystemVersion(u64 version) { + tmd_body.system_version = version; +} + +void TitleMetadata::AddContentChunk(const ContentChunk& chunk) { + tmd_chunks.push_back(chunk); +} + +void TitleMetadata::Print() const { + LOG_DEBUG(Service_FS, "%s - %u chunks", filepath.c_str(), + static_cast<u32>(tmd_body.content_count)); + + // Content info describes ranges of content chunks + LOG_DEBUG(Service_FS, "Content info:"); + for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) { + if (tmd_body.contentinfo[i].command_count == 0) + break; + + LOG_DEBUG(Service_FS, " Index %04X, Command Count %04X", + static_cast<u32>(tmd_body.contentinfo[i].index), + static_cast<u32>(tmd_body.contentinfo[i].command_count)); + } + + // For each content info, print their content chunk range + for (size_t i = 0; i < tmd_body.contentinfo.size(); i++) { + u16 index = static_cast<u16>(tmd_body.contentinfo[i].index); + u16 count = static_cast<u16>(tmd_body.contentinfo[i].command_count); + + if (count == 0) + continue; + + LOG_DEBUG(Service_FS, "Content chunks for content info index %zu:", i); + for (u16 j = index; j < index + count; j++) { + // Don't attempt to print content we don't have + if (j > tmd_body.content_count) + break; + + const ContentChunk& chunk = tmd_chunks[j]; + LOG_DEBUG(Service_FS, " ID %08X, Index %04X, Type %04x, Size %016" PRIX64, + static_cast<u32>(chunk.id), static_cast<u32>(chunk.index), + static_cast<u32>(chunk.type), static_cast<u64>(chunk.size)); + } + } +} +} // namespace FileSys diff --git a/src/core/file_sys/title_metadata.h b/src/core/file_sys/title_metadata.h new file mode 100644 index 000000000..1fc157bf3 --- /dev/null +++ b/src/core/file_sys/title_metadata.h @@ -0,0 +1,125 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <string> +#include <vector> +#include "common/common_types.h" +#include "common/swap.h" + +namespace Loader { +enum class ResultStatus; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// FileSys namespace + +namespace FileSys { + +enum TMDSignatureType : u32 { + Rsa4096Sha1 = 0x10000, + Rsa2048Sha1 = 0x10001, + EllipticSha1 = 0x10002, + Rsa4096Sha256 = 0x10003, + Rsa2048Sha256 = 0x10004, + EcdsaSha256 = 0x10005 +}; + +enum TMDContentTypeFlag : u16 { + Encrypted = 1 << 1, + Disc = 1 << 2, + CFM = 1 << 3, + Optional = 1 << 14, + Shared = 1 << 15 +}; + +/** + * Helper which implements an interface to read and write Title Metadata (TMD) files. + * If a file path is provided and the file exists, it can be parsed and used, otherwise + * it must be created. The TMD file can then be interpreted, modified and/or saved. + */ +class TitleMetadata { +public: + struct ContentChunk { + u32_be id; + u16_be index; + u16_be type; + u64_be size; + std::array<u8, 0x20> hash; + }; + + static_assert(sizeof(ContentChunk) == 0x30, "TMD ContentChunk structure size is wrong"); + + struct ContentInfo { + u16_be index; + u16_be command_count; + std::array<u8, 0x20> hash; + }; + + static_assert(sizeof(ContentInfo) == 0x24, "TMD ContentInfo structure size is wrong"); + +#pragma pack(push, 1) + + struct Body { + std::array<u8, 0x40> issuer; + u8 version; + u8 ca_crl_version; + u8 signer_crl_version; + u8 reserved; + u64_be system_version; + u64_be title_id; + u32_be title_type; + u16_be group_id; + u32_be savedata_size; + u32_be srl_private_savedata_size; + std::array<u8, 4> reserved_2; + u8 srl_flag; + std::array<u8, 0x31> reserved_3; + u32_be access_rights; + u16_be title_version; + u16_be content_count; + u16_be boot_content; + std::array<u8, 2> reserved_4; + std::array<u8, 0x20> contentinfo_hash; + std::array<ContentInfo, 64> contentinfo; + }; + + static_assert(sizeof(Body) == 0x9C4, "TMD body structure size is wrong"); + +#pragma pack(pop) + + explicit TitleMetadata(std::string& path) : filepath(std::move(path)) {} + Loader::ResultStatus Load(); + Loader::ResultStatus Save(); + + u64 GetTitleID() const; + u32 GetTitleType() const; + u16 GetTitleVersion() const; + u64 GetSystemVersion() const; + size_t GetContentCount() const; + u32 GetBootContentID() const; + u32 GetManualContentID() const; + u32 GetDLPContentID() const; + + void SetTitleID(u64 title_id); + void SetTitleType(u32 type); + void SetTitleVersion(u16 version); + void SetSystemVersion(u64 version); + void AddContentChunk(const ContentChunk& chunk); + + void Print() const; + +private: + enum TMDContentIndex { Main = 0, Manual = 1, DLP = 2 }; + + Body tmd_body; + u32_be signature_type; + std::vector<u8> tmd_signature; + std::vector<ContentChunk> tmd_chunks; + + std::string filepath; +}; + +} // namespace FileSys diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 4f7d54a33..e67394177 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -2,14 +2,55 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include <algorithm> #include <cmath> -#include "common/assert.h" -#include "core/3ds.h" -#include "core/core.h" +#include <mutex> #include "core/frontend/emu_window.h" +#include "core/frontend/input.h" #include "core/settings.h" +class EmuWindow::TouchState : public Input::Factory<Input::TouchDevice>, + public std::enable_shared_from_this<TouchState> { +public: + std::unique_ptr<Input::TouchDevice> Create(const Common::ParamPackage&) override { + return std::make_unique<Device>(shared_from_this()); + } + + std::mutex mutex; + + bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false + + float touch_x = 0.0f; ///< Touchpad X-position + float touch_y = 0.0f; ///< Touchpad Y-position + +private: + class Device : public Input::TouchDevice { + public: + explicit Device(std::weak_ptr<TouchState>&& touch_state) : touch_state(touch_state) {} + std::tuple<float, float, bool> GetStatus() const override { + if (auto state = touch_state.lock()) { + std::lock_guard<std::mutex> guard(state->mutex); + return std::make_tuple(state->touch_x, state->touch_y, state->touch_pressed); + } + return std::make_tuple(0.0f, 0.0f, false); + } + + private: + std::weak_ptr<TouchState> touch_state; + }; +}; + +EmuWindow::EmuWindow() { + // TODO: Find a better place to set this. + config.min_client_area_size = std::make_pair(400u, 480u); + active_config = config; + touch_state = std::make_shared<TouchState>(); + Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state); +} + +EmuWindow::~EmuWindow() { + Input::UnregisterFactory<Input::TouchDevice>("emu_window"); +} + /** * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout * @param layout FramebufferLayout object describing the framebuffer size and screen positions @@ -38,22 +79,26 @@ void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) return; - touch_x = Core::kScreenBottomWidth * (framebuffer_x - framebuffer_layout.bottom_screen.left) / - (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left); - touch_y = Core::kScreenBottomHeight * (framebuffer_y - framebuffer_layout.bottom_screen.top) / - (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top); + std::lock_guard<std::mutex> guard(touch_state->mutex); + touch_state->touch_x = + static_cast<float>(framebuffer_x - framebuffer_layout.bottom_screen.left) / + (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left); + touch_state->touch_y = + static_cast<float>(framebuffer_y - framebuffer_layout.bottom_screen.top) / + (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top); - touch_pressed = true; + touch_state->touch_pressed = true; } void EmuWindow::TouchReleased() { - touch_pressed = false; - touch_x = 0; - touch_y = 0; + std::lock_guard<std::mutex> guard(touch_state->mutex); + touch_state->touch_pressed = false; + touch_state->touch_x = 0; + touch_state->touch_y = 0; } void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { - if (!touch_pressed) + if (!touch_state->touch_pressed) return; if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) @@ -62,29 +107,6 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { TouchPressed(framebuffer_x, framebuffer_y); } -void EmuWindow::AccelerometerChanged(float x, float y, float z) { - constexpr float coef = 512; - - std::lock_guard<std::mutex> lock(accel_mutex); - - // TODO(wwylele): do a time stretch as it in GyroscopeChanged - // The time stretch formula should be like - // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity - accel_x = static_cast<s16>(x * coef); - accel_y = static_cast<s16>(y * coef); - accel_z = static_cast<s16>(z * coef); -} - -void EmuWindow::GyroscopeChanged(float x, float y, float z) { - constexpr float FULL_FPS = 60; - float coef = GetGyroscopeRawToDpsCoefficient(); - float stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale(); - std::lock_guard<std::mutex> lock(gyro_mutex); - gyro_x = static_cast<s16>(x * coef * stretch); - gyro_y = static_cast<s16>(y * coef * stretch); - gyro_z = static_cast<s16>(z * coef * stretch); -} - void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { Layout::FramebufferLayout layout; if (Settings::values.custom_layout == true) { @@ -97,6 +119,9 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) case Settings::LayoutOption::LargeScreen: layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen); break; + case Settings::LayoutOption::SideScreen: + layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen); + break; case Settings::LayoutOption::Default: default: layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen); diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index 9414123a4..c10dee51b 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -4,11 +4,10 @@ #pragma once -#include <mutex> +#include <memory> #include <tuple> #include <utility> #include "common/common_types.h" -#include "common/math_util.h" #include "core/frontend/framebuffer_layout.h" /** @@ -69,84 +68,6 @@ public: void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y); /** - * Signal accelerometer state has changed. - * @param x X-axis accelerometer value - * @param y Y-axis accelerometer value - * @param z Z-axis accelerometer value - * @note all values are in unit of g (gravitational acceleration). - * e.g. x = 1.0 means 9.8m/s^2 in x direction. - * @see GetAccelerometerState for axis explanation. - */ - void AccelerometerChanged(float x, float y, float z); - - /** - * Signal gyroscope state has changed. - * @param x X-axis accelerometer value - * @param y Y-axis accelerometer value - * @param z Z-axis accelerometer value - * @note all values are in deg/sec. - * @see GetGyroscopeState for axis explanation. - */ - void GyroscopeChanged(float x, float y, float z); - - /** - * Gets the current touch screen state (touch X/Y coordinates and whether or not it is pressed). - * @note This should be called by the core emu thread to get a state set by the window thread. - * @todo Fix this function to be thread-safe. - * @return std::tuple of (x, y, pressed) where `x` and `y` are the touch coordinates and - * `pressed` is true if the touch screen is currently being pressed - */ - std::tuple<u16, u16, bool> GetTouchState() const { - return std::make_tuple(touch_x, touch_y, touch_pressed); - } - - /** - * Gets the current accelerometer state (acceleration along each three axis). - * Axis explained: - * +x is the same direction as LEFT on D-pad. - * +y is normal to the touch screen, pointing outward. - * +z is the same direction as UP on D-pad. - * Units: - * 1 unit of return value = 1/512 g (measured by hw test), - * where g is the gravitational acceleration (9.8 m/sec2). - * @note This should be called by the core emu thread to get a state set by the window thread. - * @return std::tuple of (x, y, z) - */ - std::tuple<s16, s16, s16> GetAccelerometerState() { - std::lock_guard<std::mutex> lock(accel_mutex); - return std::make_tuple(accel_x, accel_y, accel_z); - } - - /** - * Gets the current gyroscope state (angular rates about each three axis). - * Axis explained: - * +x is the same direction as LEFT on D-pad. - * +y is normal to the touch screen, pointing outward. - * +z is the same direction as UP on D-pad. - * Orientation is determined by right-hand rule. - * Units: - * 1 unit of return value = (1/coef) deg/sec, - * where coef is the return value of GetGyroscopeRawToDpsCoefficient(). - * @note This should be called by the core emu thread to get a state set by the window thread. - * @return std::tuple of (x, y, z) - */ - std::tuple<s16, s16, s16> GetGyroscopeState() { - std::lock_guard<std::mutex> lock(gyro_mutex); - return std::make_tuple(gyro_x, gyro_y, gyro_z); - } - - /** - * Gets the coefficient for units conversion of gyroscope state. - * The conversion formula is r = coefficient * v, - * where v is angular rate in deg/sec, - * and r is the gyroscope state. - * @return float-type coefficient - */ - f32 GetGyroscopeRawToDpsCoefficient() const { - return 14.375f; // taken from hw test, and gyroscope's document - } - - /** * Returns currently active configuration. * @note Accesses to the returned object need not be consistent because it may be modified in * another thread @@ -180,21 +101,8 @@ public: void UpdateCurrentFramebufferLayout(unsigned width, unsigned height); protected: - EmuWindow() { - // TODO: Find a better place to set this. - config.min_client_area_size = std::make_pair(400u, 480u); - active_config = config; - touch_x = 0; - touch_y = 0; - touch_pressed = false; - accel_x = 0; - accel_y = -512; - accel_z = 0; - gyro_x = 0; - gyro_y = 0; - gyro_z = 0; - } - virtual ~EmuWindow() {} + EmuWindow(); + virtual ~EmuWindow(); /** * Processes any pending configuration changes from the last SetConfig call. @@ -250,20 +158,8 @@ private: /// ProcessConfigurationChanges) WindowConfig active_config; ///< Internal active configuration - bool touch_pressed; ///< True if touchpad area is currently pressed, otherwise false - - u16 touch_x; ///< Touchpad X-position in native 3DS pixel coordinates (0-320) - u16 touch_y; ///< Touchpad Y-position in native 3DS pixel coordinates (0-240) - - std::mutex accel_mutex; - s16 accel_x; ///< Accelerometer X-axis value in native 3DS units - s16 accel_y; ///< Accelerometer Y-axis value in native 3DS units - s16 accel_z; ///< Accelerometer Z-axis value in native 3DS units - - std::mutex gyro_mutex; - s16 gyro_x; ///< Gyroscope X-axis value in native 3DS units - s16 gyro_y; ///< Gyroscope Y-axis value in native 3DS units - s16 gyro_z; ///< Gyroscope Z-axis value in native 3DS units + class TouchState; + std::shared_ptr<TouchState> touch_state; /** * Clip the provided coordinates to be inside the touchscreen area. diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d2d02f9ff..e9f778fcb 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -141,6 +141,40 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped return res; } +FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped) { + ASSERT(width > 0); + ASSERT(height > 0); + + FramebufferLayout res{width, height, true, true, {}, {}}; + // Aspect ratio of both screens side by side + const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) / + (Core::kScreenTopWidth + Core::kScreenBottomWidth); + float window_aspect_ratio = static_cast<float>(height) / width; + MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height}; + // Find largest Rectangle that can fit in the window size with the given aspect ratio + MathUtil::Rectangle<unsigned> screen_rect = + maxRectangle(screen_window_area, emulation_aspect_ratio); + // Find sizes of top and bottom screen + MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO); + MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO); + + if (window_aspect_ratio < emulation_aspect_ratio) { + // Apply borders to the left and right sides of the window. + u32 shift_horizontal = (screen_window_area.GetWidth() - screen_rect.GetWidth()) / 2; + top_screen = top_screen.TranslateX(shift_horizontal); + bot_screen = bot_screen.TranslateX(shift_horizontal); + } else { + // Window is narrower than the emulation content => apply borders to the top and bottom + u32 shift_vertical = (screen_window_area.GetHeight() - screen_rect.GetHeight()) / 2; + top_screen = top_screen.TranslateY(shift_vertical); + bot_screen = bot_screen.TranslateY(shift_vertical); + } + // Move the top screen to the right if we are swapped. + res.top_screen = swapped ? top_screen.TranslateX(bot_screen.GetWidth()) : top_screen; + res.bottom_screen = swapped ? bot_screen : bot_screen.TranslateX(top_screen.GetWidth()); + return res; +} + FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) { ASSERT(width > 0); ASSERT(height > 0); @@ -158,4 +192,4 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) { res.bottom_screen = bot_screen; return res; } -} +} // namespace Layout diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 9a7738969..4983cf103 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -54,6 +54,17 @@ FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool is_swa FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool is_swapped); /** +* Factory method for constructing a Frame with the Top screen and bottom +* screen side by side +* This is useful for devices with small screens, like the GPDWin +* @param width Window framebuffer width in pixels +* @param height Window framebuffer height in pixels +* @param is_swapped if true, the bottom screen will be the left display +* @return Newly created FramebufferLayout object with default screen regions initialized +*/ +FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool is_swapped); + +/** * Factory method for constructing a custom FramebufferLayout * @param width Window framebuffer width in pixels * @param height Window framebuffer height in pixels diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h index 0a5713dc0..8c256beb5 100644 --- a/src/core/frontend/input.h +++ b/src/core/frontend/input.h @@ -11,6 +11,7 @@ #include <utility> #include "common/logging/log.h" #include "common/param_package.h" +#include "common/vector_math.h" namespace Input { @@ -107,4 +108,28 @@ using ButtonDevice = InputDevice<bool>; */ using AnalogDevice = InputDevice<std::tuple<float, float>>; +/** + * A motion device is an input device that returns a tuple of accelerometer state vector and + * gyroscope state vector. + * + * For both vectors: + * x+ is the same direction as LEFT on D-pad. + * y+ is normal to the touch screen, pointing outward. + * z+ is the same direction as UP on D-pad. + * + * For accelerometer state vector + * Units: g (gravitational acceleration) + * + * For gyroscope state vector: + * Orientation is determined by right-hand rule. + * Units: deg/sec + */ +using MotionDevice = InputDevice<std::tuple<Math::Vec3<float>, Math::Vec3<float>>>; + +/** + * A touch device is an input device that returns a tuple of two floats and a bool. The floats are + * x and y coordinates in the range 0.0 - 1.0, and the bool indicates whether it is pressed. + */ +using TouchDevice = InputDevice<std::tuple<float, float, bool>>; + } // namespace Input diff --git a/src/core/frontend/motion_emu.cpp b/src/core/frontend/motion_emu.cpp deleted file mode 100644 index 9a5b3185d..000000000 --- a/src/core/frontend/motion_emu.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include "common/math_util.h" -#include "common/quaternion.h" -#include "core/frontend/emu_window.h" -#include "core/frontend/motion_emu.h" - -namespace Motion { - -static constexpr int update_millisecond = 100; -static constexpr auto update_duration = - std::chrono::duration_cast<std::chrono::steady_clock::duration>( - std::chrono::milliseconds(update_millisecond)); - -MotionEmu::MotionEmu(EmuWindow& emu_window) - : motion_emu_thread(&MotionEmu::MotionEmuThread, this, std::ref(emu_window)) {} - -MotionEmu::~MotionEmu() { - if (motion_emu_thread.joinable()) { - shutdown_event.Set(); - motion_emu_thread.join(); - } -} - -void MotionEmu::MotionEmuThread(EmuWindow& emu_window) { - auto update_time = std::chrono::steady_clock::now(); - Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0); - Math::Quaternion<float> old_q; - - while (!shutdown_event.WaitUntil(update_time)) { - update_time += update_duration; - old_q = q; - - { - std::lock_guard<std::mutex> guard(tilt_mutex); - - // Find the quaternion describing current 3DS tilting - q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x), - tilt_angle); - } - - auto inv_q = q.Inverse(); - - // Set the gravity vector in world space - auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f); - - // Find the angular rate vector in world space - auto angular_rate = ((q - old_q) * inv_q).xyz * 2; - angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180; - - // Transform the two vectors from world space to 3DS space - gravity = QuaternionRotate(inv_q, gravity); - angular_rate = QuaternionRotate(inv_q, angular_rate); - - // Update the sensor state - emu_window.AccelerometerChanged(gravity.x, gravity.y, gravity.z); - emu_window.GyroscopeChanged(angular_rate.x, angular_rate.y, angular_rate.z); - } -} - -void MotionEmu::BeginTilt(int x, int y) { - mouse_origin = Math::MakeVec(x, y); - is_tilting = true; -} - -void MotionEmu::Tilt(int x, int y) { - constexpr float SENSITIVITY = 0.01f; - auto mouse_move = Math::MakeVec(x, y) - mouse_origin; - if (is_tilting) { - std::lock_guard<std::mutex> guard(tilt_mutex); - if (mouse_move.x == 0 && mouse_move.y == 0) { - tilt_angle = 0; - } else { - tilt_direction = mouse_move.Cast<float>(); - tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * SENSITIVITY, 0.0f, - MathUtil::PI * 0.5f); - } - } -} - -void MotionEmu::EndTilt() { - std::lock_guard<std::mutex> guard(tilt_mutex); - tilt_angle = 0; - is_tilting = false; -} - -} // namespace Motion diff --git a/src/core/frontend/motion_emu.h b/src/core/frontend/motion_emu.h deleted file mode 100644 index 99d41a726..000000000 --- a/src/core/frontend/motion_emu.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once -#include "common/thread.h" -#include "common/vector_math.h" - -class EmuWindow; - -namespace Motion { - -class MotionEmu final { -public: - MotionEmu(EmuWindow& emu_window); - ~MotionEmu(); - - /** - * Signals that a motion sensor tilt has begun. - * @param x the x-coordinate of the cursor - * @param y the y-coordinate of the cursor - */ - void BeginTilt(int x, int y); - - /** - * Signals that a motion sensor tilt is occurring. - * @param x the x-coordinate of the cursor - * @param y the y-coordinate of the cursor - */ - void Tilt(int x, int y); - - /** - * Signals that a motion sensor tilt has ended. - */ - void EndTilt(); - -private: - Math::Vec2<int> mouse_origin; - - std::mutex tilt_mutex; - Math::Vec2<float> tilt_direction; - float tilt_angle = 0; - - bool is_tilting = false; - - Common::Event shutdown_event; - std::thread motion_emu_thread; - - void MotionEmuThread(EmuWindow& emu_window); -}; - -} // namespace Motion diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index 123fe7cd4..d6be16ef6 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -644,7 +644,7 @@ static void ReadMemory() { auto start_offset = command_buffer + 1; auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); - PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); + VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); start_offset = addr_pos + 1; u32 len = @@ -656,12 +656,14 @@ static void ReadMemory() { SendReply("E01"); } - const u8* data = Memory::GetPointer(addr); - if (!data) { + if (!Memory::IsValidVirtualAddress(addr)) { return SendReply("E00"); } - MemToGdbHex(reply, data, len); + std::vector<u8> data(len); + Memory::ReadBlock(addr, data.data(), len); + + MemToGdbHex(reply, data.data(), len); reply[len * 2] = '\0'; SendReply(reinterpret_cast<char*>(reply)); } @@ -670,18 +672,20 @@ static void ReadMemory() { static void WriteMemory() { auto start_offset = command_buffer + 1; auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); - PAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); + VAddr addr = HexToInt(start_offset, static_cast<u32>(addr_pos - start_offset)); start_offset = addr_pos + 1; auto len_pos = std::find(start_offset, command_buffer + command_length, ':'); u32 len = HexToInt(start_offset, static_cast<u32>(len_pos - start_offset)); - u8* dst = Memory::GetPointer(addr); - if (!dst) { + if (!Memory::IsValidVirtualAddress(addr)) { return SendReply("E00"); } - GdbHexToMem(dst, len_pos + 1, len); + std::vector<u8> data(len); + + GdbHexToMem(data.data(), len_pos + 1, len); + Memory::WriteBlock(addr, data.data(), len); SendReply("OK"); } @@ -946,7 +950,7 @@ static void Init(u16 port) { WSAStartup(MAKEWORD(2, 2), &InitData); #endif - int tmpsock = socket(PF_INET, SOCK_STREAM, 0); + int tmpsock = static_cast<int>(socket(PF_INET, SOCK_STREAM, 0)); if (tmpsock == -1) { LOG_ERROR(Debug_GDBStub, "Failed to create gdb socket"); } @@ -973,7 +977,7 @@ static void Init(u16 port) { sockaddr_in saddr_client; sockaddr* client_addr = reinterpret_cast<sockaddr*>(&saddr_client); socklen_t client_addrlen = sizeof(saddr_client); - gdbserver_socket = accept(tmpsock, client_addr, &client_addrlen); + gdbserver_socket = static_cast<int>(accept(tmpsock, client_addr, &client_addrlen)); if (gdbserver_socket < 0) { // In the case that we couldn't start the server for whatever reason, just start CPU // execution like normal. diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp index 75d7fd9fc..518f371f5 100644 --- a/src/core/hle/applets/erreula.cpp +++ b/src/core/hle/applets/erreula.cpp @@ -31,8 +31,8 @@ ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& param heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); // Create a SharedMemory that directly points to this heap block. framebuffer_memory = Kernel::SharedMemory::CreateForApplet( - heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, - MemoryPermission::ReadWrite, "ErrEula Memory"); + heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, + "ErrEula Memory"); // Send the response message with the newly created SharedMemory Service::APT::MessageParameter result; diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp index 89f08daa2..f225c23a5 100644 --- a/src/core/hle/applets/mii_selector.cpp +++ b/src/core/hle/applets/mii_selector.cpp @@ -38,8 +38,8 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); // Create a SharedMemory that directly points to this heap block. framebuffer_memory = Kernel::SharedMemory::CreateForApplet( - heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, - MemoryPermission::ReadWrite, "MiiSelector Memory"); + heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, + "MiiSelector Memory"); // Send the response message with the newly created SharedMemory Service::APT::MessageParameter result; @@ -66,7 +66,7 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa // continue. MiiResult result; memset(&result, 0, sizeof(result)); - result.result_code = 0; + result.return_code = 0; // Let the application know that we're closing Service::APT::MessageParameter message; @@ -82,5 +82,5 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa } void MiiSelector::Update() {} -} -} // namespace +} // namespace Applets +} // namespace HLE diff --git a/src/core/hle/applets/mii_selector.h b/src/core/hle/applets/mii_selector.h index ec00e29d2..136ce8948 100644 --- a/src/core/hle/applets/mii_selector.h +++ b/src/core/hle/applets/mii_selector.h @@ -16,51 +16,46 @@ namespace HLE { namespace Applets { struct MiiConfig { - u8 unk_000; - u8 unk_001; - u8 unk_002; - u8 unk_003; - u8 unk_004; + u8 enable_cancel_button; + u8 enable_guest_mii; + u8 show_on_top_screen; + INSERT_PADDING_BYTES(5); + u16 title[0x40]; + INSERT_PADDING_BYTES(4); + u8 show_guest_miis; INSERT_PADDING_BYTES(3); - u16 unk_008; - INSERT_PADDING_BYTES(0x82); - u8 unk_08C; - INSERT_PADDING_BYTES(3); - u16 unk_090; + u32 initially_selected_mii_index; + u8 guest_mii_whitelist[6]; + u8 user_mii_whitelist[0x64]; INSERT_PADDING_BYTES(2); - u32 unk_094; - u16 unk_098; - u8 unk_09A[0x64]; - u8 unk_0FE; - u8 unk_0FF; - u32 unk_100; + u32 magic_value; }; - static_assert(sizeof(MiiConfig) == 0x104, "MiiConfig structure has incorrect size"); #define ASSERT_REG_POSITION(field_name, position) \ static_assert(offsetof(MiiConfig, field_name) == position, \ "Field " #field_name " has invalid position") -ASSERT_REG_POSITION(unk_008, 0x08); -ASSERT_REG_POSITION(unk_08C, 0x8C); -ASSERT_REG_POSITION(unk_090, 0x90); -ASSERT_REG_POSITION(unk_094, 0x94); -ASSERT_REG_POSITION(unk_0FE, 0xFE); +ASSERT_REG_POSITION(title, 0x08); +ASSERT_REG_POSITION(show_guest_miis, 0x8C); +ASSERT_REG_POSITION(initially_selected_mii_index, 0x90); +ASSERT_REG_POSITION(guest_mii_whitelist, 0x94); #undef ASSERT_REG_POSITION struct MiiResult { - u32 result_code; - u8 unk_04; - INSERT_PADDING_BYTES(7); - u8 unk_0C[0x60]; - u8 unk_6C[0x16]; + u32 return_code; + u32 is_guest_mii_selected; + u32 selected_guest_mii_index; + // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii + u8 selected_mii_data[0x5C]; INSERT_PADDING_BYTES(2); + u16 mii_data_checksum; + u16 guest_mii_name[0xC]; }; static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size"); #define ASSERT_REG_POSITION(field_name, position) \ static_assert(offsetof(MiiResult, field_name) == position, \ "Field " #field_name " has invalid position") -ASSERT_REG_POSITION(unk_0C, 0x0C); -ASSERT_REG_POSITION(unk_6C, 0x6C); +ASSERT_REG_POSITION(selected_mii_data, 0x0C); +ASSERT_REG_POSITION(guest_mii_name, 0x6C); #undef ASSERT_REG_POSITION class MiiSelector final : public Applet { @@ -79,5 +74,5 @@ private: MiiConfig config; }; -} -} // namespace +} // namespace Applets +} // namespace HLE diff --git a/src/core/hle/applets/mint.cpp b/src/core/hle/applets/mint.cpp index 31a79ea17..50d79190b 100644 --- a/src/core/hle/applets/mint.cpp +++ b/src/core/hle/applets/mint.cpp @@ -31,8 +31,8 @@ ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& paramete heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); // Create a SharedMemory that directly points to this heap block. framebuffer_memory = Kernel::SharedMemory::CreateForApplet( - heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, - MemoryPermission::ReadWrite, "Mint Memory"); + heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, + "Mint Memory"); // Send the response message with the newly created SharedMemory Service::APT::MessageParameter result; diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp index fdf8807b0..0bc471a3a 100644 --- a/src/core/hle/applets/swkbd.cpp +++ b/src/core/hle/applets/swkbd.cpp @@ -41,8 +41,8 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); // Create a SharedMemory that directly points to this heap block. framebuffer_memory = Kernel::SharedMemory::CreateForApplet( - heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, - MemoryPermission::ReadWrite, "SoftwareKeyboard Memory"); + heap_memory, 0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, + "SoftwareKeyboard Memory"); // Send the response message with the newly created SharedMemory Service::APT::MessageParameter result; diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h index bc81c06b4..31fda6db3 100644 --- a/src/core/hle/function_wrappers.h +++ b/src/core/hle/function_wrappers.h @@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) { Core::CPU().SetReg(0, res); } -/** - * HLE a function return (64-bit) from the current ARM11 userland process - * @param res Result to return (64-bit) - * @todo Verify that this function is correct - */ -static inline void FuncReturn64(u64 res) { - Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF)); - Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF)); -} - //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type ResultCode +template <ResultCode func(u64)> +void Wrap() { + FuncReturn(func(PARAM(0)).raw); +} + +template <ResultCode func(u32, u64, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + +template <ResultCode func(u64, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1)).raw); +} + +template <ResultCode func(u64, u64, u64)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + +template <ResultCode func(u64*, u64, u64, u64)> +void Wrap() { + u64 param_1 = 0; + u32 retval = func(¶m_1, PARAM(1), PARAM(2), PARAM(3)).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + template <ResultCode func(u32, u32, u32, u32)> void Wrap() { FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw); @@ -58,22 +76,21 @@ void Wrap() { FuncReturn(retval); } -template <ResultCode func(s32*, u32*, s32, bool, s64)> +template <ResultCode func(s32*, VAddr, s32, bool, s64)> void Wrap() { s32 param_1 = 0; - s32 retval = func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), - (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) - .raw; + s32 retval = + func(¶m_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) + .raw; Core::CPU().SetReg(1, (u32)param_1); FuncReturn(retval); } -template <ResultCode func(s32*, u32*, s32, u32)> +template <ResultCode func(s32*, VAddr, s32, u32)> void Wrap() { s32 param_1 = 0; - u32 retval = - func(¶m_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw; + u32 retval = func(¶m_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw; Core::CPU().SetReg(1, (u32)param_1); FuncReturn(retval); @@ -85,6 +102,14 @@ void Wrap() { func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw); } +template <ResultCode func(u32, u64*)> +void Wrap() { + u64 param_1 = 0; + u32 retval = func(PARAM(0), ¶m_1).raw; + Core::CPU().SetReg(1, param_1); + FuncReturn(retval); +} + template <ResultCode func(u32*)> void Wrap() { u32 param_1 = 0; @@ -100,16 +125,17 @@ void Wrap() { FuncReturn(retval); } -template <ResultCode func(MemoryInfo*, PageInfo*, u32)> +template <ResultCode func(MemoryInfo*, PageInfo*, u64)> void Wrap() { MemoryInfo memory_info = {}; PageInfo page_info = {}; u32 retval = func(&memory_info, &page_info, PARAM(2)).raw; - Core::CPU().SetReg(1, memory_info.base_address); - Core::CPU().SetReg(2, memory_info.size); - Core::CPU().SetReg(3, memory_info.permission); - Core::CPU().SetReg(4, memory_info.state); - Core::CPU().SetReg(5, page_info.flags); + + Memory::Write64(PARAM(0), memory_info.base_address); + Memory::Write64(PARAM(0) + 8, memory_info.size); + Memory::Write64(PARAM(0) + 16, memory_info.permission); + Memory::Write64(PARAM(0) + 24, memory_info.state); + FuncReturn(retval); } @@ -139,7 +165,7 @@ void Wrap() { FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw); } -template <ResultCode func(u32*, u32)> +template <ResultCode func(u32*, u64)> void Wrap() { u32 param_1 = 0; u32 retval = func(¶m_1, PARAM(1)).raw; @@ -152,21 +178,6 @@ void Wrap() { FuncReturn(func(PARAM(0)).raw); } -template <ResultCode func(s64*, u32, u32*, u32)> -void Wrap() { - FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1), - (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3)) - .raw); -} - -template <ResultCode func(u32*, const char*)> -void Wrap() { - u32 param_1 = 0; - u32 retval = func(¶m_1, (char*)Memory::GetPointer(PARAM(1))).raw; - Core::CPU().SetReg(1, param_1); - FuncReturn(retval); -} - template <ResultCode func(u32*, s32, s32)> void Wrap() { u32 param_1 = 0; @@ -222,13 +233,11 @@ void Wrap() { FuncReturn(func(PARAM(0), PARAM(1)).raw); } -template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)> +template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)> void Wrap() { Kernel::Handle param_1 = 0; Kernel::Handle param_2 = 0; - u32 retval = func(¶m_1, ¶m_2, - reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3)) - .raw; + u32 retval = func(¶m_1, ¶m_2, PARAM(2), PARAM(3)).raw; Core::CPU().SetReg(1, param_1); Core::CPU().SetReg(2, param_2); FuncReturn(retval); @@ -244,6 +253,11 @@ void Wrap() { FuncReturn(retval); } +template <ResultCode func(u32, u32, u32)> +void Wrap() { + FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // Function wrappers that return type u32 @@ -268,14 +282,14 @@ void Wrap() { func(((s64)PARAM(1) << 32) | PARAM(0)); } -template <void func(const char*, int len)> +template <void func(VAddr, int len)> void Wrap() { - func((char*)Memory::GetPointer(PARAM(0)), PARAM(1)); + func(PARAM(0), PARAM(1)); } -template <void func(u8)> +template <void func(u64, u64, u64)> void Wrap() { - func((u8)PARAM(0)); + func(PARAM(0), PARAM(1), PARAM(2)); } #undef PARAM diff --git a/src/core/hle/ipc.h b/src/core/hle/ipc.h index f7f96125a..87ed85df6 100644 --- a/src/core/hle/ipc.h +++ b/src/core/hle/ipc.h @@ -122,11 +122,11 @@ union StaticBufferDescInfo { BitField<14, 18, u32> size; }; -inline u32 StaticBufferDesc(u32 size, u8 buffer_id) { +inline u32 StaticBufferDesc(size_t size, u8 buffer_id) { StaticBufferDescInfo info{}; info.descriptor_type.Assign(StaticBuffer); info.buffer_id.Assign(buffer_id); - info.size.Assign(size); + info.size.Assign(static_cast<u32>(size)); return info.raw; } @@ -160,11 +160,11 @@ union MappedBufferDescInfo { BitField<4, 28, u32> size; }; -inline u32 MappedBufferDesc(u32 size, MappedBufferPermissions perms) { +inline u32 MappedBufferDesc(size_t size, MappedBufferPermissions perms) { MappedBufferDescInfo info{}; info.flags.Assign(MappedBuffer); info.perms.Assign(perms); - info.size.Assign(size); + info.size.Assign(static_cast<u32>(size)); return info.raw; } diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index f0d89cffe..7cb95cbac 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h @@ -117,9 +117,9 @@ public: void PushCurrentPIDHandle(); - void PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id); + void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id); - void PushMappedBuffer(VAddr buffer_vaddr, u32 size, MappedBufferPermissions perms); + void PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms); }; /// Push /// @@ -190,12 +190,12 @@ inline void RequestBuilder::PushCurrentPIDHandle() { Push(u32(0)); } -inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, u32 size, u8 buffer_id) { +inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id) { Push(StaticBufferDesc(size, buffer_id)); Push(buffer_vaddr); } -inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size, +inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms) { Push(MappedBufferDesc(size, perms)); Push(buffer_vaddr); @@ -227,8 +227,8 @@ public: bool validateHeader = true) { if (validateHeader) ValidateHeader(); - Header builderHeader{ - MakeHeader(header.command_id, normal_params_size, translate_params_size)}; + Header builderHeader{MakeHeader(static_cast<u16>(header.command_id), normal_params_size, + translate_params_size)}; if (context != nullptr) return {*context, builderHeader}; else diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 5ebe2eca4..6020e9764 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -37,7 +37,7 @@ SharedPtr<Object> HLERequestContext::GetIncomingHandle(u32 id_from_cmdbuf) const u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) { request_handles.push_back(std::move(object)); - return request_handles.size() - 1; + return static_cast<u32>(request_handles.size() - 1); } void HLERequestContext::ClearIncomingObjects() { diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 9cf288b08..73fab3981 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -8,6 +8,7 @@ #include <string> #include <utility> #include <boost/smart_ptr/intrusive_ptr.hpp> +#include "common/assert.h" #include "common/common_types.h" namespace Kernel { @@ -84,6 +85,8 @@ public: case HandleType::ClientSession: return false; } + + UNREACHABLE(); } public: @@ -129,4 +132,4 @@ void Init(u32 system_mode); /// Shutdown the kernel void Shutdown(); -} // namespace +} // namespace Kernel diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp index 496d07cb5..7f27e9655 100644 --- a/src/core/hle/kernel/memory.cpp +++ b/src/core/hle/kernel/memory.cpp @@ -8,7 +8,6 @@ #include <memory> #include <utility> #include <vector> -#include "audio_core/audio_core.h" #include "common/assert.h" #include "common/common_types.h" #include "common/logging/log.h" @@ -24,7 +23,7 @@ namespace Kernel { -static MemoryRegionInfo memory_regions[3]; +MemoryRegionInfo memory_regions[3]; /// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system /// memory configuration type. @@ -96,9 +95,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region) { } } -std::array<u8, Memory::VRAM_SIZE> vram; -std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram; - void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping) { using namespace Memory; @@ -143,30 +139,14 @@ void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mappin return; } - // TODO(yuriks): Use GetPhysicalPointer when that becomes independent of the virtual - // mappings. - u8* target_pointer = nullptr; - switch (area->paddr_base) { - case VRAM_PADDR: - target_pointer = vram.data(); - break; - case DSP_RAM_PADDR: - target_pointer = AudioCore::GetDspMemory().data(); - break; - case N3DS_EXTRA_RAM_PADDR: - target_pointer = n3ds_extra_ram.data(); - break; - default: - UNREACHABLE(); - } + u8* target_pointer = Memory::GetPhysicalPointer(area->paddr_base + offset_into_region); // TODO(yuriks): This flag seems to have some other effect, but it's unknown what MemoryState memory_state = mapping.unk_flag ? MemoryState::Static : MemoryState::IO; - auto vma = address_space - .MapBackingMemory(mapping.address, target_pointer + offset_into_region, - mapping.size, memory_state) - .Unwrap(); + auto vma = + address_space.MapBackingMemory(mapping.address, target_pointer, mapping.size, memory_state) + .Unwrap(); address_space.Reprotect(vma, mapping.read_only ? VMAPermission::Read : VMAPermission::ReadWrite); } diff --git a/src/core/hle/kernel/memory.h b/src/core/hle/kernel/memory.h index 08c1a9989..da6bb3563 100644 --- a/src/core/hle/kernel/memory.h +++ b/src/core/hle/kernel/memory.h @@ -26,4 +26,6 @@ MemoryRegionInfo* GetMemoryRegion(MemoryRegion region); void HandleSpecialMapping(VMManager& address_space, const AddressMapping& mapping); void MapSharedPages(VMManager& address_space); + +extern MemoryRegionInfo memory_regions[3]; } // namespace Kernel diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp index cef961289..30dade552 100644 --- a/src/core/hle/kernel/mutex.cpp +++ b/src/core/hle/kernel/mutex.cpp @@ -25,10 +25,11 @@ void ReleaseThreadMutexes(Thread* thread) { Mutex::Mutex() {} Mutex::~Mutex() {} -SharedPtr<Mutex> Mutex::Create(bool initial_locked, std::string name) { +SharedPtr<Mutex> Mutex::Create(bool initial_locked, VAddr addr, std::string name) { SharedPtr<Mutex> mutex(new Mutex); mutex->lock_count = 0; + mutex->addr = addr; mutex->name = std::move(name); mutex->holding_thread = nullptr; @@ -90,7 +91,7 @@ void Mutex::UpdatePriority() { if (!holding_thread) return; - s32 best_priority = THREADPRIO_LOWEST; + u32 best_priority = THREADPRIO_LOWEST; for (auto& waiter : GetWaitingThreads()) { if (waiter->current_priority < best_priority) best_priority = waiter->current_priority; diff --git a/src/core/hle/kernel/mutex.h b/src/core/hle/kernel/mutex.h index bacacd690..503d3ee75 100644 --- a/src/core/hle/kernel/mutex.h +++ b/src/core/hle/kernel/mutex.h @@ -21,7 +21,7 @@ public: * @param name Optional name of mutex * @return Pointer to new Mutex object */ - static SharedPtr<Mutex> Create(bool initial_locked, std::string name = "Unknown"); + static SharedPtr<Mutex> Create(bool initial_locked, VAddr addr, std::string name = "Unknown"); std::string GetTypeName() const override { return "Mutex"; @@ -39,6 +39,7 @@ public: u32 priority; ///< The priority of the mutex, used for priority inheritance. std::string name; ///< Name of mutex (optional) SharedPtr<Thread> holding_thread; ///< Thread that has acquired the mutex + VAddr addr; /** * Elevate the mutex priority to the best priority diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 84ebdbc58..9e145866f 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -129,7 +129,8 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { } vm_manager.LogLayout(Log::Level::Debug); - Kernel::SetupMainThread(entry_point, main_thread_priority); + + Kernel::SetupMainThread(entry_point, main_thread_priority, this); } void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp index a8f10a3ee..517dc47a8 100644 --- a/src/core/hle/kernel/resource_limit.cpp +++ b/src/core/hle/kernel/resource_limit.cpp @@ -61,7 +61,7 @@ s32 ResourceLimit::GetCurrentResourceValue(u32 resource) const { } } -s32 ResourceLimit::GetMaxResourceValue(u32 resource) const { +u32 ResourceLimit::GetMaxResourceValue(u32 resource) const { switch (resource) { case PRIORITY: return max_priority; diff --git a/src/core/hle/kernel/resource_limit.h b/src/core/hle/kernel/resource_limit.h index 6cdfbcf8d..42874eb8d 100644 --- a/src/core/hle/kernel/resource_limit.h +++ b/src/core/hle/kernel/resource_limit.h @@ -67,7 +67,7 @@ public: * @param resource Requested resource type * @returns The max value of the resource type */ - s32 GetMaxResourceValue(u32 resource) const; + u32 GetMaxResourceValue(u32 resource) const; /// Name of resource limit object. std::string name; diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp index fcf586728..2605b2595 100644 --- a/src/core/hle/kernel/semaphore.cpp +++ b/src/core/hle/kernel/semaphore.cpp @@ -13,7 +13,7 @@ namespace Kernel { Semaphore::Semaphore() {} Semaphore::~Semaphore() {} -ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, +ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_count, VAddr address, std::string name) { if (initial_count > max_count) @@ -25,6 +25,7 @@ ResultVal<SharedPtr<Semaphore>> Semaphore::Create(s32 initial_count, s32 max_cou // and the rest is reserved for the caller thread semaphore->max_count = max_count; semaphore->available_count = initial_count; + semaphore->address = address; semaphore->name = std::move(name); return MakeResult<SharedPtr<Semaphore>>(std::move(semaphore)); diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h index 7b0cacf2e..77c491a24 100644 --- a/src/core/hle/kernel/semaphore.h +++ b/src/core/hle/kernel/semaphore.h @@ -22,7 +22,7 @@ public: * @param name Optional name of semaphore * @return The created semaphore */ - static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, + static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count, VAddr address, std::string name = "Unknown"); std::string GetTypeName() const override { @@ -39,6 +39,7 @@ public: s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have s32 available_count; ///< Number of free slots left in the semaphore + VAddr address; std::string name; ///< Name of semaphore (optional) bool ShouldWait(Thread* thread) const override; diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index a7b66142f..d45daca35 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -42,7 +42,8 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u memory_region->used += size; shared_memory->linear_heap_phys_address = - Memory::FCRAM_PADDR + memory_region->base + shared_memory->backing_block_offset; + Memory::FCRAM_PADDR + memory_region->base + + static_cast<PAddr>(shared_memory->backing_block_offset); // Increase the amount of used linear heap memory for the owner process. if (shared_memory->owner_process != nullptr) { @@ -54,22 +55,19 @@ SharedPtr<SharedMemory> SharedMemory::Create(SharedPtr<Process> owner_process, u Kernel::g_current_process->vm_manager.RefreshMemoryBlockMappings(linheap_memory.get()); } } else { - // TODO(Subv): What happens if an application tries to create multiple memory blocks - // pointing to the same address? auto& vm_manager = shared_memory->owner_process->vm_manager; // The memory is already available and mapped in the owner process. - auto vma = vm_manager.FindVMA(address)->second; - // Copy it over to our own storage - shared_memory->backing_block = std::make_shared<std::vector<u8>>( - vma.backing_block->data() + vma.offset, vma.backing_block->data() + vma.offset + size); - shared_memory->backing_block_offset = 0; - // Unmap the existing pages - vm_manager.UnmapRange(address, size); - // Map our own block into the address space - vm_manager.MapMemoryBlock(address, shared_memory->backing_block, 0, size, - MemoryState::Shared); - // Reprotect the block with the new permissions - vm_manager.ReprotectRange(address, size, ConvertPermissions(permissions)); + auto vma = vm_manager.FindVMA(address); + ASSERT_MSG(vma != vm_manager.vma_map.end(), "Invalid memory address"); + ASSERT_MSG(vma->second.backing_block, "Backing block doesn't exist for address"); + + // The returned VMA might be a bigger one encompassing the desired address. + auto vma_offset = address - vma->first; + ASSERT_MSG(vma_offset + size <= vma->second.size, + "Shared memory exceeds bounds of mapped block"); + + shared_memory->backing_block = vma->second.backing_block; + shared_memory->backing_block_offset = vma->second.offset + vma_offset; } shared_memory->base_address = address; @@ -183,4 +181,4 @@ u8* SharedMemory::GetPointer(u32 offset) { return backing_block->data() + backing_block_offset + offset; } -} // namespace +} // namespace Kernel diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index 94b335ed1..93a6f2182 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -114,7 +114,7 @@ public: /// Backing memory for this shared memory block. std::shared_ptr<std::vector<u8>> backing_block; /// Offset into the backing block for this shared memory. - u32 backing_block_offset; + size_t backing_block_offset; /// Size of the memory block. Page-aligned. u32 size; /// Permission restrictions applied to the process which created the block. diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index c01d08ebb..75df49ac2 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -111,7 +111,7 @@ void Thread::Stop() { Thread* ArbitrateHighestPriorityThread(u32 address) { Thread* highest_priority_thread = nullptr; - s32 priority = THREADPRIO_LOWEST; + u32 priority = THREADPRIO_LOWEST; // Iterate through threads, find highest priority thread that is waiting to be arbitrated... for (auto& thread : thread_list) { @@ -171,15 +171,24 @@ static void SwitchContext(Thread* new_thread) { // Cancel any outstanding wakeup events for this thread CoreTiming::UnscheduleEvent(ThreadWakeupEventType, new_thread->callback_handle); + auto previous_process = Kernel::g_current_process; + current_thread = new_thread; ready_queue.remove(new_thread->current_priority, new_thread); new_thread->status = THREADSTATUS_RUNNING; + if (previous_process != current_thread->owner_process) { + Kernel::g_current_process = current_thread->owner_process; + SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table); + } + Core::CPU().LoadContext(new_thread->context); Core::CPU().SetCP15Register(CP15_THREAD_URO, new_thread->GetTLSAddress()); } else { current_thread = nullptr; + // Note: We do not reset the current process and current page table when idling because + // technically we haven't changed processes, our threads are just paused. } } @@ -238,12 +247,15 @@ static void ThreadWakeupCallback(u64 thread_handle, int cycles_late) { if (thread->status == THREADSTATUS_WAIT_SYNCH_ANY || thread->status == THREADSTATUS_WAIT_SYNCH_ALL || thread->status == THREADSTATUS_WAIT_ARB) { - thread->wait_set_output = false; + + // Invoke the wakeup callback before clearing the wait objects + if (thread->wakeup_callback) + thread->wakeup_callback(ThreadWakeupReason::Timeout, thread, nullptr); + // Remove the thread from each of its waiting objects' waitlists for (auto& object : thread->wait_objects) object->RemoveWaitingThread(thread.get()); thread->wait_objects.clear(); - thread->SetWaitSynchronizationResult(RESULT_TIMEOUT); } thread->ResumeFromWait(); @@ -269,6 +281,9 @@ void Thread::ResumeFromWait() { break; case THREADSTATUS_READY: + // The thread's wakeup callback must have already been cleared when the thread was first + // awoken. + ASSERT(wakeup_callback == nullptr); // If the thread is waiting on multiple wait objects, it might be awoken more than once // before actually resuming. We can ignore subsequent wakeups if the thread status has // already been set to THREADSTATUS_READY. @@ -284,6 +299,8 @@ void Thread::ResumeFromWait() { return; } + wakeup_callback = nullptr; + ready_queue.push_back(current_priority, this); status = THREADSTATUS_READY; Core::System::GetInstance().PrepareReschedule(); @@ -302,7 +319,7 @@ static void DebugThreadQueue() { } for (auto& t : thread_list) { - s32 priority = ready_queue.contains(t.get()); + u32 priority = ready_queue.contains(t.get()); if (priority != -1) { LOG_DEBUG(Kernel, "0x%02X %u", priority, t->GetObjectId()); } @@ -352,7 +369,8 @@ static void ResetThreadContext(ARM_Interface::ThreadContext& context, VAddr stac } ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, u32 priority, - u32 arg, s32 processor_id, VAddr stack_top) { + u32 arg, s32 processor_id, VAddr stack_top, + SharedPtr<Process> owner_process) { // Check if priority is in ranged. Lowest priority -> highest priority id. if (priority > THREADPRIO_LOWEST) { LOG_ERROR(Kernel_SVC, "Invalid thread priority: %d", priority); @@ -366,7 +384,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, // TODO(yuriks): Other checks, returning 0xD9001BEA - if (!Memory::IsValidVirtualAddress(entry_point)) { + if (!Memory::IsValidVirtualAddress(*owner_process, entry_point)) { LOG_ERROR(Kernel_SVC, "(name=%s): invalid entry %08x", name.c_str(), entry_point); // TODO: Verify error return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, @@ -385,15 +403,14 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, thread->nominal_priority = thread->current_priority = priority; thread->last_running_ticks = CoreTiming::GetTicks(); thread->processor_id = processor_id; - thread->wait_set_output = false; thread->wait_objects.clear(); thread->wait_address = 0; thread->name = std::move(name); thread->callback_handle = wakeup_callback_handle_table.Create(thread).Unwrap(); - thread->owner_process = g_current_process; + thread->owner_process = owner_process; // Find the next available TLS index, and mark it as used - auto& tls_slots = Kernel::g_current_process->tls_slots; + auto& tls_slots = owner_process->tls_slots; bool needs_allocation = true; u32 available_page; // Which allocated page has free space u32 available_slot; // Which slot within the page is free @@ -412,18 +429,18 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, return ERR_OUT_OF_MEMORY; } - u32 offset = linheap_memory->size(); + size_t offset = linheap_memory->size(); // Allocate some memory from the end of the linear heap for this region. linheap_memory->insert(linheap_memory->end(), Memory::PAGE_SIZE, 0); memory_region->used += Memory::PAGE_SIZE; - Kernel::g_current_process->linear_heap_used += Memory::PAGE_SIZE; + owner_process->linear_heap_used += Memory::PAGE_SIZE; tls_slots.emplace_back(0); // The page is completely available at the start - available_page = tls_slots.size() - 1; + available_page = static_cast<u32>(tls_slots.size() - 1); available_slot = 0; // Use the first slot in the new page - auto& vm_manager = Kernel::g_current_process->vm_manager; + auto& vm_manager = owner_process->vm_manager; vm_manager.RefreshMemoryBlockMappings(linheap_memory.get()); // Map the page to the current process' address space. @@ -447,7 +464,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, return MakeResult<SharedPtr<Thread>>(std::move(thread)); } -void Thread::SetPriority(s32 priority) { +void Thread::SetPriority(u32 priority) { ASSERT_MSG(priority <= THREADPRIO_LOWEST && priority >= THREADPRIO_HIGHEST, "Invalid priority value."); // If thread was ready, adjust queues @@ -460,7 +477,7 @@ void Thread::SetPriority(s32 priority) { } void Thread::UpdatePriority() { - s32 best_priority = nominal_priority; + u32 best_priority = nominal_priority; for (auto& mutex : held_mutexes) { if (mutex->priority < best_priority) best_priority = mutex->priority; @@ -468,7 +485,7 @@ void Thread::UpdatePriority() { BoostPriority(best_priority); } -void Thread::BoostPriority(s32 priority) { +void Thread::BoostPriority(u32 priority) { // If thread was ready, adjust queues if (status == THREADSTATUS_READY) ready_queue.move(this, current_priority, priority); @@ -477,21 +494,20 @@ void Thread::BoostPriority(s32 priority) { current_priority = priority; } -SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority) { - DEBUG_ASSERT(!GetCurrentThread()); +SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process) { + // Setup page table so we can write to memory + SetCurrentPageTable(&Kernel::g_current_process->vm_manager.page_table); // Initialize new "main" thread auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, - Memory::HEAP_VADDR_END); + Memory::HEAP_VADDR_END, owner_process); SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); thread->context.fpscr = FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010 - // Run new "main" thread - SwitchContext(thread.get()); - + // Note: The newly created thread will be run when the scheduler fires. return thread; } @@ -525,7 +541,13 @@ void Thread::SetWaitSynchronizationOutput(s32 output) { s32 Thread::GetWaitObjectIndex(WaitObject* object) const { ASSERT_MSG(!wait_objects.empty(), "Thread is not waiting for anything"); auto match = std::find(wait_objects.rbegin(), wait_objects.rend(), object); - return std::distance(match, wait_objects.rend()) - 1; + return static_cast<s32>(std::distance(match, wait_objects.rend()) - 1); +} + +VAddr Thread::GetCommandBufferAddress() const { + // Offset from the start of TLS at which the IPC command buffer begins. + static constexpr int CommandHeaderOffset = 0x80; + return GetTLSAddress() + CommandHeaderOffset; } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index 2cadb91db..fafcab156 100644 --- a/src/core/hle/kernel/thread.h +++ b/src/core/hle/kernel/thread.h @@ -15,7 +15,7 @@ #include "core/hle/kernel/wait_object.h" #include "core/hle/result.h" -enum ThreadPriority : s32 { +enum ThreadPriority : u32 { THREADPRIO_HIGHEST = 0, ///< Highest thread priority THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps THREADPRIO_DEFAULT = 48, ///< Default thread priority for userland apps @@ -41,6 +41,11 @@ enum ThreadStatus { THREADSTATUS_DEAD ///< Run to completion, or forcefully terminated }; +enum class ThreadWakeupReason { + Signal, // The thread was woken up by WakeupAllWaitingThreads due to an object signal. + Timeout // The thread was woken up due to a wait timeout. +}; + namespace Kernel { class Mutex; @@ -56,10 +61,12 @@ public: * @param arg User data to pass to the thread * @param processor_id The ID(s) of the processors on which the thread is desired to be run * @param stack_top The address of the thread's stack top + * @param owner_process The parent process for the thread * @return A shared pointer to the newly created thread */ static ResultVal<SharedPtr<Thread>> Create(std::string name, VAddr entry_point, u32 priority, - u32 arg, s32 processor_id, VAddr stack_top); + u32 arg, s32 processor_id, VAddr stack_top, + SharedPtr<Process> owner_process); std::string GetName() const override { return name; @@ -80,7 +87,7 @@ public: * Gets the thread's current priority * @return The current thread's priority */ - s32 GetPriority() const { + u32 GetPriority() const { return current_priority; } @@ -88,7 +95,7 @@ public: * Sets the thread's current priority * @param priority The new priority */ - void SetPriority(s32 priority); + void SetPriority(u32 priority); /** * Boost's a thread's priority to the best priority among the thread's held mutexes. @@ -100,7 +107,7 @@ public: * Temporarily boosts the thread's priority until the next time it is scheduled * @param priority The new priority */ - void BoostPriority(s32 priority); + void BoostPriority(u32 priority); /** * Gets the thread's thread ID @@ -116,9 +123,9 @@ public: void ResumeFromWait(); /** - * Schedules an event to wake up the specified thread after the specified delay - * @param nanoseconds The time this thread will be allowed to sleep for - */ + * Schedules an event to wake up the specified thread after the specified delay + * @param nanoseconds The time this thread will be allowed to sleep for + */ void WakeAfterDelay(s64 nanoseconds); /** @@ -157,6 +164,12 @@ public: return tls_address; } + /* + * Returns the address of the current thread's command buffer, located in the TLS. + * @returns VAddr of the thread's command buffer. + */ + VAddr GetCommandBufferAddress() const; + /** * Returns whether this thread is waiting for all the objects in * its wait list to become ready, as a result of a WaitSynchronizationN call @@ -174,8 +187,8 @@ public: VAddr entry_point; VAddr stack_top; - s32 nominal_priority; ///< Nominal thread priority, as set by the emulated application - s32 current_priority; ///< Current thread priority, can be temporarily changed + u32 nominal_priority; ///< Nominal thread priority, as set by the emulated application + u32 current_priority; ///< Current thread priority, can be temporarily changed u64 last_running_ticks; ///< CPU tick when thread was last running @@ -197,14 +210,18 @@ public: VAddr wait_address; ///< If waiting on an AddressArbiter, this is the arbitration address - /// True if the WaitSynchronizationN output parameter should be set on thread wakeup. - bool wait_set_output; - std::string name; /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. Handle callback_handle; + using WakeupCallback = void(ThreadWakeupReason reason, SharedPtr<Thread> thread, + SharedPtr<WaitObject> object); + // Callback that will be invoked when the thread is resumed from a waiting state. If the thread + // was waiting via WaitSynchronizationN then the object will be the last object that became + // available. In case of a timeout, the object will be nullptr. + std::function<WakeupCallback> wakeup_callback; + private: Thread(); ~Thread() override; @@ -214,9 +231,10 @@ private: * Sets up the primary application thread * @param entry_point The address at which the thread should start execution * @param priority The priority to give the main thread + * @param owner_process The parent process for the main thread * @return A shared pointer to the main thread */ -SharedPtr<Thread> SetupMainThread(VAddr entry_point, s32 priority); +SharedPtr<Thread> SetupMainThread(u32 entry_point, u32 priority, SharedPtr<Process> owner_process); /** * Returns whether there are any threads that are ready to run. @@ -276,4 +294,4 @@ void ThreadingShutdown(); */ const std::vector<SharedPtr<Thread>>& GetThreadList(); -} // namespace +} // namespace Kernel diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index f70c32501..9762ef535 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -4,8 +4,10 @@ #include <iterator> #include "common/assert.h" +#include "core/arm/arm_interface.h" #include "core/hle/kernel/errors.h" #include "core/hle/kernel/vm_manager.h" +#include "core/core.h" #include "core/memory.h" #include "core/memory_setup.h" #include "core/mmio.h" @@ -56,6 +58,10 @@ void VMManager::Reset() { initial_vma.size = MAX_ADDRESS; vma_map.emplace(initial_vma.base, initial_vma); + page_table.pointers.fill(nullptr); + page_table.attributes.fill(Memory::PageType::Unmapped); + page_table.cached_res_count.fill(0); + //UpdatePageTableForVMA(initial_vma); } @@ -79,6 +85,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target, VirtualMemoryArea& final_vma = vma_handle->second; ASSERT(final_vma.size == size); + Core::CPU().MapBackingMemory(target, size, block->data() + offset, VMAPermission::ReadWriteExecute); + final_vma.type = VMAType::AllocatedMemoryBlock; final_vma.permissions = VMAPermission::ReadWrite; final_vma.meminfo_state = state; @@ -98,6 +106,8 @@ ResultVal<VMManager::VMAHandle> VMManager::MapBackingMemory(VAddr target, u8* me VirtualMemoryArea& final_vma = vma_handle->second; ASSERT(final_vma.size == size); + Core::CPU().MapBackingMemory(target, size, memory, VMAPermission::ReadWriteExecute); + final_vma.type = VMAType::BackingMemory; final_vma.permissions = VMAPermission::ReadWrite; final_vma.meminfo_state = state; @@ -328,16 +338,17 @@ VMManager::VMAIter VMManager::MergeAdjacent(VMAIter iter) { void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) { switch (vma.type) { case VMAType::Free: - Memory::UnmapRegion(vma.base, vma.size); + Memory::UnmapRegion(page_table, vma.base, vma.size); break; case VMAType::AllocatedMemoryBlock: - Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_block->data() + vma.offset); + Memory::MapMemoryRegion(page_table, vma.base, vma.size, + vma.backing_block->data() + vma.offset); break; case VMAType::BackingMemory: - Memory::MapMemoryRegion(vma.base, vma.size, vma.backing_memory); + Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory); break; case VMAType::MMIO: - Memory::MapIoRegion(vma.base, vma.size, vma.mmio_handler); + Memory::MapIoRegion(page_table, vma.base, vma.size, vma.mmio_handler); break; } } diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index aa2265ce6..cb5bb8243 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h @@ -9,6 +9,7 @@ #include <vector> #include "common/common_types.h" #include "core/hle/result.h" +#include "core/memory.h" #include "core/mmio.h" namespace Kernel { @@ -102,7 +103,6 @@ struct VirtualMemoryArea { * - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/ */ class VMManager final { - // TODO(yuriks): Make page tables switchable to support multiple VMManagers public: /** * The maximum amount of address space managed by the kernel. Addresses above this are never @@ -184,6 +184,10 @@ public: /// Dumps the address space layout to the log, for debugging void LogLayout(Log::Level log_level) const; + /// Each VMManager has its own page table, which is set as the main one when the owning process + /// is scheduled. + Memory::PageTable page_table; + private: using VMAIter = decltype(vma_map)::iterator; diff --git a/src/core/hle/kernel/wait_object.cpp b/src/core/hle/kernel/wait_object.cpp index f245eda6c..469554908 100644 --- a/src/core/hle/kernel/wait_object.cpp +++ b/src/core/hle/kernel/wait_object.cpp @@ -34,7 +34,7 @@ void WaitObject::RemoveWaitingThread(Thread* thread) { SharedPtr<Thread> WaitObject::GetHighestPriorityReadyThread() { Thread* candidate = nullptr; - s32 candidate_priority = THREADPRIO_LOWEST + 1; + u32 candidate_priority = THREADPRIO_LOWEST + 1; for (const auto& thread : waiting_threads) { // The list of waiting threads must not contain threads that are not waiting to be awakened. @@ -71,23 +71,20 @@ void WaitObject::WakeupAllWaitingThreads() { while (auto thread = GetHighestPriorityReadyThread()) { if (!thread->IsSleepingOnWaitAll()) { Acquire(thread.get()); - // Set the output index of the WaitSynchronizationN call to the index of this object. - if (thread->wait_set_output) { - thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(this)); - thread->wait_set_output = false; - } } else { for (auto& object : thread->wait_objects) { object->Acquire(thread.get()); } - // Note: This case doesn't update the output index of WaitSynchronizationN. } + // Invoke the wakeup callback before clearing the wait objects + if (thread->wakeup_callback) + thread->wakeup_callback(ThreadWakeupReason::Signal, thread, this); + for (auto& object : thread->wait_objects) object->RemoveWaitingThread(thread.get()); thread->wait_objects.clear(); - thread->SetWaitSynchronizationResult(RESULT_SUCCESS); thread->ResumeFromWait(); } } diff --git a/src/core/hle/lock.cpp b/src/core/hle/lock.cpp new file mode 100644 index 000000000..1c24c7ce9 --- /dev/null +++ b/src/core/hle/lock.cpp @@ -0,0 +1,11 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <core/hle/lock.h> + +namespace HLE { +std::recursive_mutex g_hle_lock; +} diff --git a/src/core/hle/lock.h b/src/core/hle/lock.h new file mode 100644 index 000000000..5c99fe996 --- /dev/null +++ b/src/core/hle/lock.h @@ -0,0 +1,18 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <mutex> + +namespace HLE { +/* + * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest + * application thread performs a syscall. It should be acquired by any host threads that read or + * modify the HLE kernel state. Note: Any operation that directly or indirectly reads from or writes + * to the emulated memory is not protected by this mutex, and should be avoided in any threads other + * than the CPU thread. + */ +extern std::recursive_mutex g_hle_lock; +} // namespace HLE diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 5c44b43bb..912ab550d 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <boost/optional.hpp> #include "common/common_paths.h" #include "common/file_util.h" #include "common/logging/log.h" @@ -18,6 +19,7 @@ #include "core/hle/service/apt/apt_s.h" #include "core/hle/service/apt/apt_u.h" #include "core/hle/service/apt/bcfnt/bcfnt.h" +#include "core/hle/service/cfg/cfg.h" #include "core/hle/service/fs/archive.h" #include "core/hle/service/ptm/ptm.h" #include "core/hle/service/service.h" @@ -33,8 +35,6 @@ static bool shared_font_loaded = false; static bool shared_font_relocated = false; static Kernel::SharedPtr<Kernel::Mutex> lock; -static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event -static Kernel::SharedPtr<Kernel::Event> parameter_event; ///< APT parameter event static u32 cpu_percent; ///< CPU time available to the running application @@ -43,43 +43,344 @@ static u8 unknown_ns_state_field; static ScreencapPostPermission screen_capture_post_permission; -/// Parameter data to be returned in the next call to Glance/ReceiveParameter -static MessageParameter next_parameter; +/// Parameter data to be returned in the next call to Glance/ReceiveParameter. +/// TODO(Subv): Use std::optional once we migrate to C++17. +static boost::optional<MessageParameter> next_parameter; + +enum class AppletPos { Application = 0, Library = 1, System = 2, SysLibrary = 3, Resident = 4 }; + +static constexpr size_t NumAppletSlot = 4; + +enum class AppletSlot : u8 { + Application, + SystemApplet, + HomeMenu, + LibraryApplet, + + // An invalid tag + Error, +}; + +union AppletAttributes { + u32 raw; + + BitField<0, 3, u32> applet_pos; + BitField<29, 1, u32> is_home_menu; + + AppletAttributes() : raw(0) {} + AppletAttributes(u32 attributes) : raw(attributes) {} +}; + +struct AppletSlotData { + AppletId applet_id; + AppletSlot slot; + bool registered; + AppletAttributes attributes; + Kernel::SharedPtr<Kernel::Event> notification_event; + Kernel::SharedPtr<Kernel::Event> parameter_event; +}; + +// Holds data about the concurrently running applets in the system. +static std::array<AppletSlotData, NumAppletSlot> applet_slots = {}; + +// This overload returns nullptr if no applet with the specified id has been started. +static AppletSlotData* GetAppletSlotData(AppletId id) { + auto GetSlot = [](AppletSlot slot) -> AppletSlotData* { + return &applet_slots[static_cast<size_t>(slot)]; + }; + + if (id == AppletId::Application) { + auto* slot = GetSlot(AppletSlot::Application); + if (slot->applet_id != AppletId::None) + return slot; + + return nullptr; + } + + if (id == AppletId::AnySystemApplet) { + auto* system_slot = GetSlot(AppletSlot::SystemApplet); + if (system_slot->applet_id != AppletId::None) + return system_slot; + + // The Home Menu is also a system applet, but it lives in its own slot to be able to run + // concurrently with other system applets. + auto* home_slot = GetSlot(AppletSlot::HomeMenu); + if (home_slot->applet_id != AppletId::None) + return home_slot; + + return nullptr; + } + + if (id == AppletId::AnyLibraryApplet || id == AppletId::AnySysLibraryApplet) { + auto* slot = GetSlot(AppletSlot::LibraryApplet); + if (slot->applet_id == AppletId::None) + return nullptr; + + u32 applet_pos = slot->attributes.applet_pos; + + if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library)) + return slot; + + if (id == AppletId::AnySysLibraryApplet && + applet_pos == static_cast<u32>(AppletPos::SysLibrary)) + return slot; + + return nullptr; + } + + if (id == AppletId::HomeMenu || id == AppletId::AlternateMenu) { + auto* slot = GetSlot(AppletSlot::HomeMenu); + if (slot->applet_id != AppletId::None) + return slot; + + return nullptr; + } + + for (auto& slot : applet_slots) { + if (slot.applet_id == id) + return &slot; + } + + return nullptr; +} + +static AppletSlotData* GetAppletSlotData(AppletAttributes attributes) { + // Mapping from AppletPos to AppletSlot + static constexpr std::array<AppletSlot, 6> applet_position_slots = { + AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet, + AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet}; + + u32 applet_pos = attributes.applet_pos; + if (applet_pos >= applet_position_slots.size()) + return nullptr; + + AppletSlot slot = applet_position_slots[applet_pos]; + + if (slot == AppletSlot::Error) + return nullptr; + + // The Home Menu is a system applet, however, it has its own applet slot so that it can run + // concurrently with other system applets. + if (slot == AppletSlot::SystemApplet && attributes.is_home_menu) + return &applet_slots[static_cast<size_t>(AppletSlot::HomeMenu)]; + + return &applet_slots[static_cast<size_t>(slot)]; +} void SendParameter(const MessageParameter& parameter) { next_parameter = parameter; - // Signal the event to let the application know that a new parameter is ready to be read - parameter_event->Signal(); + // Signal the event to let the receiver know that a new parameter is ready to be read + auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id)); + if (slot_data == nullptr) { + LOG_DEBUG(Service_APT, "No applet was registered with the id %03X", + parameter.destination_id); + return; + } + + slot_data->parameter_event->Signal(); } void Initialize(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x2, 2, 0); // 0x20080 u32 app_id = rp.Pop<u32>(); - u32 flags = rp.Pop<u32>(); + u32 attributes = rp.Pop<u32>(); + + LOG_DEBUG(Service_APT, "called app_id=0x%08X, attributes=0x%08X", app_id, attributes); + + auto* const slot_data = GetAppletSlotData(attributes); + + // Note: The real NS service does not check if the attributes value is valid before accessing + // the data in the array + ASSERT_MSG(slot_data, "Invalid application attributes"); + + if (slot_data->registered) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; + } + + slot_data->applet_id = static_cast<AppletId>(app_id); + slot_data->attributes.raw = attributes; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 3); rb.Push(RESULT_SUCCESS); - rb.PushCopyHandles(Kernel::g_handle_table.Create(notification_event).Unwrap(), - Kernel::g_handle_table.Create(parameter_event).Unwrap()); + rb.PushCopyHandles(Kernel::g_handle_table.Create(slot_data->notification_event).Unwrap(), + Kernel::g_handle_table.Create(slot_data->parameter_event).Unwrap()); + + if (slot_data->applet_id == AppletId::Application || + slot_data->applet_id == AppletId::HomeMenu) { + // Initialize the APT parameter to wake up the application. + next_parameter.emplace(); + next_parameter->signal = static_cast<u32>(SignalType::Wakeup); + next_parameter->sender_id = static_cast<u32>(AppletId::None); + next_parameter->destination_id = app_id; + // Not signaling the parameter event will cause the application (or Home Menu) to hang + // during startup. In the real console, it is usually the Kernel and Home Menu who cause NS + // to signal the HomeMenu and Application parameter events, respectively. + slot_data->parameter_event->Signal(); + } +} - // TODO(bunnei): Check if these events are cleared every time Initialize is called. - notification_event->Clear(); - parameter_event->Clear(); +static u32 DecompressLZ11(const u8* in, u8* out) { + u32_le decompressed_size; + memcpy(&decompressed_size, in, sizeof(u32)); + in += 4; + + u8 type = decompressed_size & 0xFF; + ASSERT(type == 0x11); + decompressed_size >>= 8; - ASSERT_MSG((nullptr != lock), "Cannot initialize without lock"); - lock->Release(); + u32 current_out_size = 0; + u8 flags = 0, mask = 1; + while (current_out_size < decompressed_size) { + if (mask == 1) { + flags = *(in++); + mask = 0x80; + } else { + mask >>= 1; + } - LOG_DEBUG(Service_APT, "called app_id=0x%08X, flags=0x%08X", app_id, flags); + if (flags & mask) { + u8 byte1 = *(in++); + u32 length = byte1 >> 4; + u32 offset; + if (length == 0) { + u8 byte2 = *(in++); + u8 byte3 = *(in++); + length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11; + offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1; + } else if (length == 1) { + u8 byte2 = *(in++); + u8 byte3 = *(in++); + u8 byte4 = *(in++); + length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111; + offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1; + } else { + u8 byte2 = *(in++); + length = (byte1 >> 4) + 0x1; + offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1; + } + + for (u32 i = 0; i < length; i++) { + *out = *(out - offset); + ++out; + } + + current_out_size += length; + } else { + *(out++) = *(in++); + current_out_size++; + } + } + return decompressed_size; +} + +static bool LoadSharedFont() { + u8 font_region_code; + switch (CFG::GetRegionValue()) { + case 4: // CHN + font_region_code = 2; + break; + case 5: // KOR + font_region_code = 3; + break; + case 6: // TWN + font_region_code = 4; + break; + default: // JPN/EUR/USA + font_region_code = 1; + break; + } + + const u64_le shared_font_archive_id_low = 0x0004009b00014002 | ((font_region_code - 1) << 8); + const u64_le shared_font_archive_id_high = 0x00000001ffffff00; + std::vector<u8> shared_font_archive_id(16); + std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64)); + std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64)); + FileSys::Path archive_path(shared_font_archive_id); + auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path); + if (archive_result.Failed()) + return false; + + std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS + FileSys::Path file_path(romfs_path); + FileSys::Mode open_mode = {}; + open_mode.read_flag.Assign(1); + auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode); + if (file_result.Failed()) + return false; + + auto romfs = std::move(file_result).Unwrap(); + std::vector<u8> romfs_buffer(romfs->backend->GetSize()); + romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data()); + romfs->backend->Close(); + + const char16_t* file_name[4] = {u"cbf_std.bcfnt.lz", u"cbf_zh-Hans-CN.bcfnt.lz", + u"cbf_ko-Hang-KR.bcfnt.lz", u"cbf_zh-Hant-TW.bcfnt.lz"}; + const u8* font_file = + RomFS::GetFilePointer(romfs_buffer.data(), {file_name[font_region_code - 1]}); + if (font_file == nullptr) + return false; + + struct { + u32_le status; + u32_le region; + u32_le decompressed_size; + INSERT_PADDING_WORDS(0x1D); + } shared_font_header{}; + static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size"); + + shared_font_header.status = 2; // successfully loaded + shared_font_header.region = font_region_code; + shared_font_header.decompressed_size = + DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80)); + std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header)); + *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU" + + return true; +} + +static bool LoadLegacySharedFont() { + // This is the legacy method to load shared font. + // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header + // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided + // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file + // "shared_font.bin" in the Citra "sysdata" directory. + std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT; + + FileUtil::CreateFullPath(filepath); // Create path if not already created + FileUtil::IOFile file(filepath, "rb"); + if (file.IsOpen()) { + file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize()); + return true; + } + + return false; } void GetSharedFont(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x44, 0, 0); // 0x00440000 IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); + + // Log in telemetry if the game uses the shared font + Core::Telemetry().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", true); + if (!shared_font_loaded) { - LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds"); - rb.Push<u32>(-1); // TODO: Find the right error code - rb.Skip(1 + 2, true); - Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont); - return; + // On real 3DS, font loading happens on booting. However, we load it on demand to coordinate + // with CFG region auto configuration, which happens later than APT initialization. + if (LoadSharedFont()) { + shared_font_loaded = true; + } else if (LoadLegacySharedFont()) { + LOG_WARNING(Service_APT, "Loaded shared font by legacy method"); + shared_font_loaded = true; + } else { + LOG_ERROR(Service_APT, "shared font file missing - go dump it from your 3ds"); + rb.Push<u32>(-1); // TODO: Find the right error code + rb.Skip(1 + 2, true); + Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSharedFont); + return; + } } // The shared font has to be relocated to the new address before being passed to the @@ -115,7 +416,12 @@ void GetLockHandle(Service::Interface* self) { // this will cause the app to wait until parameter_event is signaled. u32 applet_attributes = rp.Pop<u32>(); IPC::RequestBuilder rb = rp.MakeBuilder(3, 2); - rb.Push(RESULT_SUCCESS); // No error + rb.Push(RESULT_SUCCESS); // No error + + // TODO(Subv): The output attributes should have an AppletPos of either Library or System | + // Library (depending on the type of the last launched applet) if the input attributes' + // AppletPos has the Library bit set. + rb.Push(applet_attributes); // Applet Attributes, this value is passed to Enable. rb.Push<u32>(0); // Least significant bit = power button state Kernel::Handle handle_copy = Kernel::g_handle_table.Create(lock).Unwrap(); @@ -128,10 +434,22 @@ void GetLockHandle(Service::Interface* self) { void Enable(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3, 1, 0); // 0x30040 u32 attributes = rp.Pop<u32>(); + + LOG_DEBUG(Service_APT, "called attributes=0x%08X", attributes); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(RESULT_SUCCESS); // No error - parameter_event->Signal(); // Let the application know that it has been started - LOG_WARNING(Service_APT, "(STUBBED) called attributes=0x%08X", attributes); + + auto* const slot_data = GetAppletSlotData(attributes); + + if (!slot_data) { + rb.Push(ResultCode(ErrCodes::InvalidAppletSlot, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; + } + + slot_data->registered = true; + + rb.Push(RESULT_SUCCESS); } void GetAppletManInfo(Service::Interface* self) { @@ -149,22 +467,27 @@ void GetAppletManInfo(Service::Interface* self) { void IsRegistered(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x9, 1, 0); // 0x90040 - u32 app_id = rp.Pop<u32>(); + AppletId app_id = static_cast<AppletId>(rp.Pop<u32>()); IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(RESULT_SUCCESS); // No error - // TODO(Subv): An application is considered "registered" if it has already called APT::Enable - // handle this properly once we implement multiprocess support. - bool is_registered = false; // Set to not registered by default + auto* const slot_data = GetAppletSlotData(app_id); + + // Check if an LLE applet was registered first, then fallback to HLE applets + bool is_registered = slot_data && slot_data->registered; - if (app_id == static_cast<u32>(AppletId::AnyLibraryApplet)) { - is_registered = HLE::Applets::IsLibraryAppletRunning(); - } else if (auto applet = HLE::Applets::Applet::Get(static_cast<AppletId>(app_id))) { - is_registered = true; // Set to registered + if (!is_registered) { + if (app_id == AppletId::AnyLibraryApplet) { + is_registered = HLE::Applets::IsLibraryAppletRunning(); + } else if (auto applet = HLE::Applets::Applet::Get(app_id)) { + // The applet exists, set it as registered. + is_registered = true; + } } + rb.Push(is_registered); - LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X", app_id); + LOG_DEBUG(Service_APT, "called app_id=0x%08X", static_cast<u32>(app_id)); } void InquireNotification(Service::Interface* self) { @@ -186,14 +509,17 @@ void SendParameter(Service::Interface* self) { size_t size; VAddr buffer = rp.PopStaticBuffer(&size); - std::shared_ptr<HLE::Applets::Applet> dest_applet = - HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id)); + LOG_DEBUG(Service_APT, + "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," + "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X", + src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - if (dest_applet == nullptr) { - LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id); - rb.Push<u32>(-1); // TODO(Subv): Find the right error code + // A new parameter can not be sent if the previous one hasn't been consumed yet + if (next_parameter) { + rb.Push(ResultCode(ErrCodes::ParameterPresent, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); return; } @@ -205,12 +531,14 @@ void SendParameter(Service::Interface* self) { param.buffer.resize(buffer_size); Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size()); - rb.Push(dest_applet->ReceiveParameter(param)); + SendParameter(param); - LOG_WARNING(Service_APT, - "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," - "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X", - src_app_id, dst_app_id, signal_type, buffer_size, handle, size, buffer); + // If the applet is running in HLE mode, use the HLE interface to communicate with it. + if (auto dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id))) { + rb.Push(dest_applet->ReceiveParameter(param)); + } else { + rb.Push(RESULT_SUCCESS); + } } void ReceiveParameter(Service::Interface* self) { @@ -226,21 +554,40 @@ void ReceiveParameter(Service::Interface* self) { "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)", buffer_size, static_buff_size); + LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); + + if (!next_parameter) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; + } + + if (next_parameter->destination_id != app_id) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound, + ErrorLevel::Status)); + return; + } + IPC::RequestBuilder rb = rp.MakeBuilder(4, 4); + rb.Push(RESULT_SUCCESS); // No error - rb.Push(next_parameter.sender_id); - rb.Push(next_parameter.signal); // Signal type - ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !"); - rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size + rb.Push(next_parameter->sender_id); + rb.Push(next_parameter->signal); // Signal type + ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !"); + rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size - rb.PushMoveHandles((next_parameter.object != nullptr) - ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap() + rb.PushMoveHandles((next_parameter->object != nullptr) + ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap() : 0); - rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0); - Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size()); + rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0); + + Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size()); - LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); + // Clear the parameter + next_parameter = boost::none; } void GlanceParameter(Service::Interface* self) { @@ -256,37 +603,74 @@ void GlanceParameter(Service::Interface* self) { "buffer_size is bigger than the size in the buffer descriptor (0x%08X > 0x%08zX)", buffer_size, static_buff_size); + LOG_DEBUG(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); + + if (!next_parameter) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrorDescription::NoData, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; + } + + if (next_parameter->destination_id != app_id) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotFound, + ErrorLevel::Status)); + return; + } + IPC::RequestBuilder rb = rp.MakeBuilder(4, 4); rb.Push(RESULT_SUCCESS); // No error - rb.Push(next_parameter.sender_id); - rb.Push(next_parameter.signal); // Signal type - ASSERT_MSG(next_parameter.buffer.size() <= buffer_size, "Input static buffer is too small !"); - rb.Push(static_cast<u32>(next_parameter.buffer.size())); // Parameter buffer size + rb.Push(next_parameter->sender_id); + rb.Push(next_parameter->signal); // Signal type + ASSERT_MSG(next_parameter->buffer.size() <= buffer_size, "Input static buffer is too small !"); + rb.Push(static_cast<u32>(next_parameter->buffer.size())); // Parameter buffer size - rb.PushCopyHandles((next_parameter.object != nullptr) - ? Kernel::g_handle_table.Create(next_parameter.object).Unwrap() + rb.PushMoveHandles((next_parameter->object != nullptr) + ? Kernel::g_handle_table.Create(next_parameter->object).Unwrap() : 0); - rb.PushStaticBuffer(buffer, static_cast<u32>(next_parameter.buffer.size()), 0); - Memory::WriteBlock(buffer, next_parameter.buffer.data(), next_parameter.buffer.size()); + rb.PushStaticBuffer(buffer, next_parameter->buffer.size(), 0); + + Memory::WriteBlock(buffer, next_parameter->buffer.data(), next_parameter->buffer.size()); - LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08zX", app_id, buffer_size); + // Note: The NS module always clears the DSPSleep and DSPWakeup signals even in GlanceParameter. + if (next_parameter->signal == static_cast<u32>(SignalType::DspSleep) || + next_parameter->signal == static_cast<u32>(SignalType::DspWakeup)) + next_parameter = boost::none; } void CancelParameter(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100 - u32 check_sender = rp.Pop<u32>(); + bool check_sender = rp.Pop<bool>(); u32 sender_appid = rp.Pop<u32>(); - u32 check_receiver = rp.Pop<u32>(); + bool check_receiver = rp.Pop<bool>(); u32 receiver_appid = rp.Pop<u32>(); + + bool cancellation_success = true; + + if (!next_parameter) { + cancellation_success = false; + } else { + if (check_sender && next_parameter->sender_id != sender_appid) + cancellation_success = false; + + if (check_receiver && next_parameter->destination_id != receiver_appid) + cancellation_success = false; + } + + if (cancellation_success) + next_parameter = boost::none; + IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); + rb.Push(RESULT_SUCCESS); // No error - rb.Push(true); // Set to Success + rb.Push(cancellation_success); - LOG_WARNING(Service_APT, "(STUBBED) called check_sender=0x%08X, sender_appid=0x%08X, " - "check_receiver=0x%08X, receiver_appid=0x%08X", - check_sender, sender_appid, check_receiver, receiver_appid); + LOG_DEBUG(Service_APT, "called check_sender=%u, sender_appid=0x%08X, " + "check_receiver=%u, receiver_appid=0x%08X", + check_sender, sender_appid, check_receiver, receiver_appid); } void PrepareToStartApplication(Service::Interface* self) { @@ -383,7 +767,12 @@ void PrepareToStartLibraryApplet(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); + LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + + // TODO(Subv): Launch the requested applet application. + auto applet = HLE::Applets::Applet::Get(applet_id); if (applet) { LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); @@ -391,14 +780,32 @@ void PrepareToStartLibraryApplet(Service::Interface* self) { } else { rb.Push(HLE::Applets::Applet::Create(applet_id)); } - LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); +} + +void PrepareToStartNewestHomeMenu(Service::Interface* self) { + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); // 0x1A0000 + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + + // TODO(Subv): This command can only be called by a System Applet (return 0xC8A0CC04 otherwise). + + // This command must return an error when called, otherwise the Home Menu will try to reboot the + // system. + rb.Push(ResultCode(ErrorDescription::AlreadyExists, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status)); + + LOG_DEBUG(Service_APT, "called"); } void PreloadLibraryApplet(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); + LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + + // TODO(Subv): Launch the requested applet application. + auto applet = HLE::Applets::Applet::Get(applet_id); if (applet) { LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); @@ -406,34 +813,40 @@ void PreloadLibraryApplet(Service::Interface* self) { } else { rb.Push(HLE::Applets::Applet::Create(applet_id)); } - LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); } void StartLibraryApplet(Service::Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084 AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); - std::shared_ptr<HLE::Applets::Applet> applet = HLE::Applets::Applet::Get(applet_id); - - LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); - - if (applet == nullptr) { - LOG_ERROR(Service_APT, "unknown applet id=%08X", applet_id); - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, false); - rb.Push<u32>(-1); // TODO(Subv): Find the right error code - return; - } size_t buffer_size = rp.Pop<u32>(); Kernel::Handle handle = rp.PopHandle(); VAddr buffer_addr = rp.PopStaticBuffer(); - AppletStartupParameter parameter; - parameter.object = Kernel::g_handle_table.GetGeneric(handle); - parameter.buffer.resize(buffer_size); - Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size()); + LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(applet->Start(parameter)); + + // Send the Wakeup signal to the applet + MessageParameter param; + param.destination_id = static_cast<u32>(applet_id); + param.sender_id = static_cast<u32>(AppletId::Application); + param.object = Kernel::g_handle_table.GetGeneric(handle); + param.signal = static_cast<u32>(SignalType::Wakeup); + param.buffer.resize(buffer_size); + Memory::ReadBlock(buffer_addr, param.buffer.data(), param.buffer.size()); + SendParameter(param); + + // In case the applet is being HLEd, attempt to communicate with it. + if (auto applet = HLE::Applets::Applet::Get(applet_id)) { + AppletStartupParameter parameter; + parameter.object = Kernel::g_handle_table.GetGeneric(handle); + parameter.buffer.resize(buffer_size); + Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size()); + rb.Push(applet->Start(parameter)); + } else { + rb.Push(RESULT_SUCCESS); + } } void CancelLibraryApplet(Service::Interface* self) { @@ -647,125 +1060,6 @@ void CheckNew3DS(Service::Interface* self) { LOG_WARNING(Service_APT, "(STUBBED) called"); } -static u32 DecompressLZ11(const u8* in, u8* out) { - u32_le decompressed_size; - memcpy(&decompressed_size, in, sizeof(u32)); - in += 4; - - u8 type = decompressed_size & 0xFF; - ASSERT(type == 0x11); - decompressed_size >>= 8; - - u32 current_out_size = 0; - u8 flags = 0, mask = 1; - while (current_out_size < decompressed_size) { - if (mask == 1) { - flags = *(in++); - mask = 0x80; - } else { - mask >>= 1; - } - - if (flags & mask) { - u8 byte1 = *(in++); - u32 length = byte1 >> 4; - u32 offset; - if (length == 0) { - u8 byte2 = *(in++); - u8 byte3 = *(in++); - length = (((byte1 & 0x0F) << 4) | (byte2 >> 4)) + 0x11; - offset = (((byte2 & 0x0F) << 8) | byte3) + 0x1; - } else if (length == 1) { - u8 byte2 = *(in++); - u8 byte3 = *(in++); - u8 byte4 = *(in++); - length = (((byte1 & 0x0F) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111; - offset = (((byte3 & 0x0F) << 8) | byte4) + 0x1; - } else { - u8 byte2 = *(in++); - length = (byte1 >> 4) + 0x1; - offset = (((byte1 & 0x0F) << 8) | byte2) + 0x1; - } - - for (u32 i = 0; i < length; i++) { - *out = *(out - offset); - ++out; - } - - current_out_size += length; - } else { - *(out++) = *(in++); - current_out_size++; - } - } - return decompressed_size; -} - -static bool LoadSharedFont() { - // TODO (wwylele): load different font archive for region CHN/KOR/TWN - const u64_le shared_font_archive_id_low = 0x0004009b00014002; - const u64_le shared_font_archive_id_high = 0x00000001ffffff00; - std::vector<u8> shared_font_archive_id(16); - std::memcpy(&shared_font_archive_id[0], &shared_font_archive_id_low, sizeof(u64)); - std::memcpy(&shared_font_archive_id[8], &shared_font_archive_id_high, sizeof(u64)); - FileSys::Path archive_path(shared_font_archive_id); - auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::NCCH, archive_path); - if (archive_result.Failed()) - return false; - - std::vector<u8> romfs_path(20, 0); // 20-byte all zero path for opening RomFS - FileSys::Path file_path(romfs_path); - FileSys::Mode open_mode = {}; - open_mode.read_flag.Assign(1); - auto file_result = Service::FS::OpenFileFromArchive(*archive_result, file_path, open_mode); - if (file_result.Failed()) - return false; - - auto romfs = std::move(file_result).Unwrap(); - std::vector<u8> romfs_buffer(romfs->backend->GetSize()); - romfs->backend->Read(0, romfs_buffer.size(), romfs_buffer.data()); - romfs->backend->Close(); - - const u8* font_file = RomFS::GetFilePointer(romfs_buffer.data(), {u"cbf_std.bcfnt.lz"}); - if (font_file == nullptr) - return false; - - struct { - u32_le status; - u32_le region; - u32_le decompressed_size; - INSERT_PADDING_WORDS(0x1D); - } shared_font_header{}; - static_assert(sizeof(shared_font_header) == 0x80, "shared_font_header has incorrect size"); - - shared_font_header.status = 2; // successfully loaded - shared_font_header.region = 1; // region JPN/EUR/USA - shared_font_header.decompressed_size = - DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80)); - std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header)); - *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU" - - return true; -} - -static bool LoadLegacySharedFont() { - // This is the legacy method to load shared font. - // The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header - // generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided - // a homebrew app to do this: https://github.com/citra-emu/3dsutils. Put the resulting file - // "shared_font.bin" in the Citra "sysdata" directory. - std::string filepath = FileUtil::GetUserPath(D_SYSDATA_IDX) + SHARED_FONT; - - FileUtil::CreateFullPath(filepath); // Create path if not already created - FileUtil::IOFile file(filepath, "rb"); - if (file.IsOpen()) { - file.ReadBytes(shared_font_mem->GetPointer(), file.GetSize()); - return true; - } - - return false; -} - void Init() { AddService(new APT_A_Interface); AddService(new APT_S_Interface); @@ -789,19 +1083,24 @@ void Init() { shared_font_loaded = false; } - lock = Kernel::Mutex::Create(false, "APT_U:Lock"); + lock = Kernel::Mutex::Create(false, 0, "APT_U:Lock"); cpu_percent = 0; unknown_ns_state_field = 0; screen_capture_post_permission = ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value - // TODO(bunnei): Check if these are created in Initialize or on APT process startup. - notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification"); - parameter_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Start"); - - next_parameter.signal = static_cast<u32>(SignalType::Wakeup); - next_parameter.destination_id = 0x300; + for (size_t slot = 0; slot < applet_slots.size(); ++slot) { + auto& slot_data = applet_slots[slot]; + slot_data.slot = static_cast<AppletSlot>(slot); + slot_data.applet_id = AppletId::None; + slot_data.attributes.raw = 0; + slot_data.registered = false; + slot_data.notification_event = + Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification"); + slot_data.parameter_event = + Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Parameter"); + } } void Shutdown() { @@ -809,10 +1108,14 @@ void Shutdown() { shared_font_loaded = false; shared_font_relocated = false; lock = nullptr; - notification_event = nullptr; - parameter_event = nullptr; - next_parameter.object = nullptr; + for (auto& slot : applet_slots) { + slot.registered = false; + slot.notification_event = nullptr; + slot.parameter_event = nullptr; + } + + next_parameter = boost::none; HLE::Applets::Shutdown(); } diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index ee80926d2..7b79e1f3e 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h @@ -72,6 +72,8 @@ enum class SignalType : u32 { /// App Id's used by APT functions enum class AppletId : u32 { + None = 0, + AnySystemApplet = 0x100, HomeMenu = 0x101, AlternateMenu = 0x103, Camera = 0x110, @@ -83,6 +85,7 @@ enum class AppletId : u32 { Miiverse = 0x117, MiiversePost = 0x118, AmiiboSettings = 0x119, + AnySysLibraryApplet = 0x200, SoftwareKeyboard1 = 0x201, Ed1 = 0x202, PnoteApp = 0x204, @@ -116,6 +119,13 @@ enum class ScreencapPostPermission : u32 { DisableScreenshotPostingToMiiverse = 3 }; +namespace ErrCodes { +enum { + ParameterPresent = 2, + InvalidAppletSlot = 4, +}; +} // namespace ErrCodes + /// Send a parameter to the currently-running application, which will read it via ReceiveParameter void SendParameter(const MessageParameter& parameter); @@ -410,6 +420,16 @@ void GetAppCpuTimeLimit(Service::Interface* self); void PrepareToStartLibraryApplet(Service::Interface* self); /** + * APT::PrepareToStartNewestHomeMenu service function + * Inputs: + * 0 : Command header [0x001A0000] + * Outputs: + * 0 : Return header + * 1 : Result of function + */ +void PrepareToStartNewestHomeMenu(Service::Interface* self); + +/** * APT::PreloadLibraryApplet service function * Inputs: * 0 : Command header [0x00160040] diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp index ec5668d05..bb78ee7d7 100644 --- a/src/core/hle/service/apt/apt_s.cpp +++ b/src/core/hle/service/apt/apt_s.cpp @@ -17,10 +17,10 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00060040, GetAppletInfo, "GetAppletInfo"}, {0x00070000, nullptr, "GetLastSignaledAppletId"}, {0x00080000, nullptr, "CountRegisteredApplet"}, - {0x00090040, nullptr, "IsRegistered"}, + {0x00090040, IsRegistered, "IsRegistered"}, {0x000A0040, nullptr, "GetAttribute"}, {0x000B0040, InquireNotification, "InquireNotification"}, - {0x000C0104, nullptr, "SendParameter"}, + {0x000C0104, SendParameter, "SendParameter"}, {0x000D0080, ReceiveParameter, "ReceiveParameter"}, {0x000E0080, GlanceParameter, "GlanceParameter"}, {0x000F0100, nullptr, "CancelParameter"}, @@ -34,11 +34,11 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, {0x00190040, nullptr, "PrepareToStartSystemApplet"}, - {0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"}, + {0x001A0000, PrepareToStartNewestHomeMenu, "PrepareToStartNewestHomeMenu"}, {0x001B00C4, nullptr, "StartApplication"}, {0x001C0000, nullptr, "WakeupApplication"}, {0x001D0000, nullptr, "CancelApplication"}, - {0x001E0084, nullptr, "StartLibraryApplet"}, + {0x001E0084, StartLibraryApplet, "StartLibraryApplet"}, {0x001F0084, nullptr, "StartSystemApplet"}, {0x00200044, nullptr, "StartNewestHomeMenu"}, {0x00210000, nullptr, "OrderToCloseApplication"}, diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp index c9f9e9d95..8172edae8 100644 --- a/src/core/hle/service/cam/cam.cpp +++ b/src/core/hle/service/cam/cam.cpp @@ -177,7 +177,7 @@ void CompletionEventCallBack(u64 port_id, int) { LOG_ERROR(Service_CAM, "The destination size (%u) doesn't match the source (%zu)!", port.dest_size, buffer_size); } - Memory::WriteBlock(port.dest, buffer.data(), std::min<u32>(port.dest_size, buffer_size)); + Memory::WriteBlock(port.dest, buffer.data(), std::min<size_t>(port.dest_size, buffer_size)); } port.is_receiving = false; diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp index 6624f1711..f78c25fb2 100644 --- a/src/core/hle/service/cfg/cfg.cpp +++ b/src/core/hle/service/cfg/cfg.cpp @@ -141,7 +141,7 @@ void GetCountryCodeString(Service::Interface* self) { void GetCountryCodeID(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); - u16 country_code = cmd_buff[1]; + u16 country_code = static_cast<u16>(cmd_buff[1]); u16 country_code_id = 0; // The following algorithm will fail if the first country code isn't 0. @@ -168,7 +168,7 @@ void GetCountryCodeID(Service::Interface* self) { cmd_buff[2] = country_code_id; } -static u32 GetRegionValue() { +u32 GetRegionValue() { if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) return preferred_region_code; @@ -681,7 +681,7 @@ void GenerateConsoleUniqueId(u32& random_number, u64& console_id) { CryptoPP::AutoSeededRandomPool rng; random_number = rng.GenerateWord32(0, 0xFFFF); u64_le local_friend_code_seed; - rng.GenerateBlock(reinterpret_cast<byte*>(&local_friend_code_seed), + rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&local_friend_code_seed), sizeof(local_friend_code_seed)); console_id = (local_friend_code_seed & 0x3FFFFFFFF) | (static_cast<u64>(random_number) << 48); } diff --git a/src/core/hle/service/cfg/cfg.h b/src/core/hle/service/cfg/cfg.h index 1659ebf32..282b6936b 100644 --- a/src/core/hle/service/cfg/cfg.h +++ b/src/core/hle/service/cfg/cfg.h @@ -101,6 +101,8 @@ void GetCountryCodeString(Service::Interface* self); */ void GetCountryCodeID(Service::Interface* self); +u32 GetRegionValue(); + /** * CFG::SecureInfoGetRegion service function * Inputs: diff --git a/src/core/hle/service/csnd_snd.cpp b/src/core/hle/service/csnd_snd.cpp index 9471ec1ef..aac903ccb 100644 --- a/src/core/hle/service/csnd_snd.cpp +++ b/src/core/hle/service/csnd_snd.cpp @@ -47,7 +47,7 @@ static void Initialize(Interface* self) { MemoryPermission::ReadWrite, 0, Kernel::MemoryRegion::BASE, "CSND:SharedMemory"); - mutex = Kernel::Mutex::Create(false, "CSND:mutex"); + mutex = Kernel::Mutex::Create(false, 0, "CSND:mutex"); cmd_buff[1] = RESULT_SUCCESS.raw; cmd_buff[2] = IPC::CopyHandleDesc(2); diff --git a/src/core/hle/service/dlp/dlp_clnt.cpp b/src/core/hle/service/dlp/dlp_clnt.cpp index 56f934b3f..6f2bf2061 100644 --- a/src/core/hle/service/dlp/dlp_clnt.cpp +++ b/src/core/hle/service/dlp/dlp_clnt.cpp @@ -8,7 +8,26 @@ namespace Service { namespace DLP { const Interface::FunctionInfo FunctionTable[] = { - {0x000100C3, nullptr, "Initialize"}, {0x00110000, nullptr, "GetWirelessRebootPassphrase"}, + {0x000100C3, nullptr, "Initialize"}, + {0x00020000, nullptr, "Finalize"}, + {0x00030000, nullptr, "GetEventDesc"}, + {0x00040000, nullptr, "GetChannel"}, + {0x00050180, nullptr, "StartScan"}, + {0x00060000, nullptr, "StopScan"}, + {0x00070080, nullptr, "GetServerInfo"}, + {0x00080100, nullptr, "GetTitleInfo"}, + {0x00090040, nullptr, "GetTitleInfoInOrder"}, + {0x000A0080, nullptr, "DeleteScanInfo"}, + {0x000B0100, nullptr, "PrepareForSystemDownload"}, + {0x000C0000, nullptr, "StartSystemDownload"}, + {0x000D0100, nullptr, "StartTitleDownload"}, + {0x000E0000, nullptr, "GetMyStatus"}, + {0x000F0040, nullptr, "GetConnectingNodes"}, + {0x00100040, nullptr, "GetNodeInfo"}, + {0x00110000, nullptr, "GetWirelessRebootPassphrase"}, + {0x00120000, nullptr, "StopSession"}, + {0x00130100, nullptr, "GetCupVersion"}, + {0x00140100, nullptr, "GetDupAvailability"}, }; DLP_CLNT_Interface::DLP_CLNT_Interface() { diff --git a/src/core/hle/service/dlp/dlp_fkcl.cpp b/src/core/hle/service/dlp/dlp_fkcl.cpp index 29b9d52e0..fe6be7d32 100644 --- a/src/core/hle/service/dlp/dlp_fkcl.cpp +++ b/src/core/hle/service/dlp/dlp_fkcl.cpp @@ -8,7 +8,23 @@ namespace Service { namespace DLP { const Interface::FunctionInfo FunctionTable[] = { - {0x00010083, nullptr, "Initialize"}, {0x000F0000, nullptr, "GetWirelessRebootPassphrase"}, + {0x00010083, nullptr, "Initialize"}, + {0x00020000, nullptr, "Finalize"}, + {0x00030000, nullptr, "GetEventDesc"}, + {0x00040000, nullptr, "GetChannels"}, + {0x00050180, nullptr, "StartScan"}, + {0x00060000, nullptr, "StopScan"}, + {0x00070080, nullptr, "GetServerInfo"}, + {0x00080100, nullptr, "GetTitleInfo"}, + {0x00090040, nullptr, "GetTitleInfoInOrder"}, + {0x000A0080, nullptr, "DeleteScanInfo"}, + {0x000B0100, nullptr, "StartFakeSession"}, + {0x000C0000, nullptr, "GetMyStatus"}, + {0x000D0040, nullptr, "GetConnectingNodes"}, + {0x000E0040, nullptr, "GetNodeInfo"}, + {0x000F0000, nullptr, "GetWirelessRebootPassphrase"}, + {0x00100000, nullptr, "StopSession"}, + {0x00110203, nullptr, "Initialize2"}, }; DLP_FKCL_Interface::DLP_FKCL_Interface() { diff --git a/src/core/hle/service/dlp/dlp_srvr.cpp b/src/core/hle/service/dlp/dlp_srvr.cpp index 32cfa2c44..1bcea43d3 100644 --- a/src/core/hle/service/dlp/dlp_srvr.cpp +++ b/src/core/hle/service/dlp/dlp_srvr.cpp @@ -11,7 +11,7 @@ namespace Service { namespace DLP { -static void unk_0x000E0040(Interface* self) { +static void IsChild(Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); cmd_buff[1] = RESULT_SUCCESS.raw; @@ -24,14 +24,19 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00010183, nullptr, "Initialize"}, {0x00020000, nullptr, "Finalize"}, {0x00030000, nullptr, "GetServerState"}, + {0x00040000, nullptr, "GetEventDescription"}, {0x00050080, nullptr, "StartAccepting"}, + {0x00060000, nullptr, "EndAccepting"}, {0x00070000, nullptr, "StartDistribution"}, {0x000800C0, nullptr, "SendWirelessRebootPassphrase"}, {0x00090040, nullptr, "AcceptClient"}, + {0x000A0040, nullptr, "DisconnectClient"}, {0x000B0042, nullptr, "GetConnectingClients"}, {0x000C0040, nullptr, "GetClientInfo"}, {0x000D0040, nullptr, "GetClientState"}, - {0x000E0040, unk_0x000E0040, "unk_0x000E0040"}, + {0x000E0040, IsChild, "IsChild"}, + {0x000F0303, nullptr, "InitializeWithName"}, + {0x00100000, nullptr, "GetDupNoticeNeed"}, }; DLP_SRVR_Interface::DLP_SRVR_Interface() { diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp index 7d746054f..42f8950f9 100644 --- a/src/core/hle/service/dsp_dsp.cpp +++ b/src/core/hle/service/dsp_dsp.cpp @@ -147,9 +147,10 @@ static void LoadComponent(Service::Interface* self) { LOG_INFO(Service_DSP, "Firmware hash: %#" PRIx64, Common::ComputeHash64(component_data.data(), component_data.size())); // Some versions of the firmware have the location of DSP structures listed here. - ASSERT(size > 0x37C); - LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64, - Common::ComputeHash64(component_data.data() + 0x340, 60)); + if (size > 0x37C) { + LOG_INFO(Service_DSP, "Structures hash: %#" PRIx64, + Common::ComputeHash64(component_data.data() + 0x340, 60)); + } LOG_WARNING(Service_DSP, "(STUBBED) called size=0x%X, prog_mask=0x%08X, data_mask=0x%08X, buffer=0x%08X", diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp index 033fbc9aa..4ee7df73c 100644 --- a/src/core/hle/service/fs/archive.cpp +++ b/src/core/hle/service/fs/archive.cpp @@ -20,6 +20,7 @@ #include "core/file_sys/archive_savedata.h" #include "core/file_sys/archive_sdmc.h" #include "core/file_sys/archive_sdmcwriteonly.h" +#include "core/file_sys/archive_selfncch.h" #include "core/file_sys/archive_systemsavedata.h" #include "core/file_sys/directory_backend.h" #include "core/file_sys/errors.h" @@ -48,7 +49,7 @@ struct hash<Service::FS::ArchiveIdCode> { return std::hash<Type>()(static_cast<Type>(id_code)); } }; -} +} // namespace std static constexpr Kernel::Handle INVALID_HANDLE{}; @@ -216,7 +217,7 @@ void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serve LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count); // Number of entries actually read - u32 read = backend->Read(entries.size(), entries.data()); + u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data()); cmd_buff[2] = read; Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry)); break; @@ -564,6 +565,21 @@ void RegisterArchiveTypes() { auto systemsavedata_factory = std::make_unique<FileSys::ArchiveFactory_SystemSaveData>(nand_directory); RegisterArchiveType(std::move(systemsavedata_factory), ArchiveIdCode::SystemSaveData); + + auto selfncch_factory = std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(); + RegisterArchiveType(std::move(selfncch_factory), ArchiveIdCode::SelfNCCH); +} + +void RegisterSelfNCCH(Loader::AppLoader& app_loader) { + auto itr = id_code_map.find(ArchiveIdCode::SelfNCCH); + if (itr == id_code_map.end()) { + LOG_ERROR(Service_FS, + "Could not register a new NCCH because the SelfNCCH archive hasn't been created"); + return; + } + + auto* factory = static_cast<FileSys::ArchiveFactory_SelfNCCH*>(itr->second.get()); + factory->Register(app_loader); } void UnregisterArchiveTypes() { diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h index 3a3371c88..e3c8fc2ef 100644 --- a/src/core/hle/service/fs/archive.h +++ b/src/core/hle/service/fs/archive.h @@ -21,6 +21,10 @@ static constexpr char SYSTEM_ID[]{"00000000000000000000000000000000"}; /// The scrambled SD card CID, also known as ID1 static constexpr char SDCARD_ID[]{"00000000000000000000000000000000"}; +namespace Loader { +class AppLoader; +} + namespace Service { namespace FS { @@ -259,6 +263,9 @@ void ArchiveInit(); /// Shutdown archives void ArchiveShutdown(); +/// Registers a new NCCH file with the SelfNCCH archive factory +void RegisterSelfNCCH(Loader::AppLoader& app_loader); + /// Register all archive types void RegisterArchiveTypes(); diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 2014b8461..379fbd71c 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -7,8 +7,9 @@ #include <cmath> #include <memory> #include "common/logging/log.h" +#include "core/3ds.h" +#include "core/core.h" #include "core/core_timing.h" -#include "core/frontend/emu_window.h" #include "core/frontend/input.h" #include "core/hle/ipc.h" #include "core/hle/kernel/event.h" @@ -18,7 +19,6 @@ #include "core/hle/service/hid/hid_spvr.h" #include "core/hle/service/hid/hid_user.h" #include "core/hle/service/service.h" -#include "video_core/video_core.h" namespace Service { namespace HID { @@ -50,10 +50,15 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234; constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104; constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101; +constexpr float accelerometer_coef = 512.0f; // measured from hw test result +constexpr float gyroscope_coef = 14.375f; // got from hwtest GetGyroscopeLowRawToDpsCoefficient call + static std::atomic<bool> is_device_reload_pending; static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> buttons; static std::unique_ptr<Input::AnalogDevice> circle_pad; +static std::unique_ptr<Input::MotionDevice> motion_device; +static std::unique_ptr<Input::TouchDevice> touch_device; DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) { // 30 degree and 60 degree are angular thresholds for directions @@ -90,6 +95,8 @@ static void LoadInputDevices() { buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); circle_pad = Input::CreateDevice<Input::AnalogDevice>( Settings::values.analogs[Settings::NativeAnalog::CirclePad]); + motion_device = Input::CreateDevice<Input::MotionDevice>(Settings::values.motion_device); + touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.touch_device); } static void UnloadInputDevices() { @@ -97,6 +104,8 @@ static void UnloadInputDevices() { button.reset(); } circle_pad.reset(); + motion_device.reset(); + touch_device.reset(); } static void UpdatePadCallback(u64 userdata, int cycles_late) { @@ -165,8 +174,10 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) { // Get the current touch entry TouchDataEntry& touch_entry = mem->touch.entries[mem->touch.index]; bool pressed = false; - - std::tie(touch_entry.x, touch_entry.y, pressed) = VideoCore::g_emu_window->GetTouchState(); + float x, y; + std::tie(x, y, pressed) = touch_device->GetStatus(); + touch_entry.x = static_cast<u16>(x * Core::kScreenBottomWidth); + touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight); touch_entry.valid.Assign(pressed ? 1 : 0); // TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which @@ -193,10 +204,19 @@ static void UpdateAccelerometerCallback(u64 userdata, int cycles_late) { mem->accelerometer.index = next_accelerometer_index; next_accelerometer_index = (next_accelerometer_index + 1) % mem->accelerometer.entries.size(); + Math::Vec3<float> accel; + std::tie(accel, std::ignore) = motion_device->GetStatus(); + accel *= accelerometer_coef; + // TODO(wwylele): do a time stretch like the one in UpdateGyroscopeCallback + // The time stretch formula should be like + // stretched_vector = (raw_vector - gravity) * stretch_ratio + gravity + AccelerometerDataEntry& accelerometer_entry = mem->accelerometer.entries[mem->accelerometer.index]; - std::tie(accelerometer_entry.x, accelerometer_entry.y, accelerometer_entry.z) = - VideoCore::g_emu_window->GetAccelerometerState(); + + accelerometer_entry.x = static_cast<s16>(accel.x); + accelerometer_entry.y = static_cast<s16>(accel.y); + accelerometer_entry.z = static_cast<s16>(accel.z); // Make up "raw" entry // TODO(wwylele): @@ -227,8 +247,14 @@ static void UpdateGyroscopeCallback(u64 userdata, int cycles_late) { next_gyroscope_index = (next_gyroscope_index + 1) % mem->gyroscope.entries.size(); GyroscopeDataEntry& gyroscope_entry = mem->gyroscope.entries[mem->gyroscope.index]; - std::tie(gyroscope_entry.x, gyroscope_entry.y, gyroscope_entry.z) = - VideoCore::g_emu_window->GetGyroscopeState(); + + Math::Vec3<float> gyro; + std::tie(std::ignore, gyro) = motion_device->GetStatus(); + double stretch = Core::System::GetInstance().perf_stats.GetLastFrameTimeScale(); + gyro *= gyroscope_coef * static_cast<float>(stretch); + gyroscope_entry.x = static_cast<s16>(gyro.x); + gyroscope_entry.y = static_cast<s16>(gyro.y); + gyroscope_entry.z = static_cast<s16>(gyro.z); // Make up "raw" entry mem->gyroscope.raw_entry.x = gyroscope_entry.x; @@ -326,7 +352,7 @@ void GetGyroscopeLowRawToDpsCoefficient(Service::Interface* self) { cmd_buff[1] = RESULT_SUCCESS.raw; - f32 coef = VideoCore::g_emu_window->GetGyroscopeRawToDpsCoefficient(); + f32 coef = gyroscope_coef; memcpy(&cmd_buff[2], &coef, 4); } diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 1ef972e70..ef25926b5 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -24,7 +24,7 @@ namespace HID { */ struct PadState { union { - u32 hex; + u32 hex{}; BitField<0, 1, u32> a; BitField<1, 1, u32> b; diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp index 837413f93..0912d5756 100644 --- a/src/core/hle/service/ir/ir_rst.cpp +++ b/src/core/hle/service/ir/ir_rst.cpp @@ -18,7 +18,7 @@ namespace Service { namespace IR { union PadState { - u32_le hex; + u32_le hex{}; BitField<14, 1, u32_le> zl; BitField<15, 1, u32_le> zr; diff --git a/src/core/hle/service/ldr_ro/cro_helper.h b/src/core/hle/service/ldr_ro/cro_helper.h index 3bc10dbdc..57b4fb6df 100644 --- a/src/core/hle/service/ldr_ro/cro_helper.h +++ b/src/core/hle/service/ldr_ro/cro_helper.h @@ -413,7 +413,8 @@ private: */ template <typename T> void GetEntry(std::size_t index, T& data) const { - Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T)); + Memory::ReadBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)), + &data, sizeof(T)); } /** @@ -425,7 +426,8 @@ private: */ template <typename T> void SetEntry(std::size_t index, const T& data) { - Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + index * sizeof(T), &data, sizeof(T)); + Memory::WriteBlock(GetField(T::TABLE_OFFSET_FIELD) + static_cast<u32>(index * sizeof(T)), + &data, sizeof(T)); } /** diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index d5624fe54..b10d5852b 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp @@ -5,6 +5,8 @@ #include "common/common_types.h" #include "common/logging/log.h" #include "core/hle/ipc.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/event.h" #include "core/hle/service/nim/nim.h" #include "core/hle/service/nim/nim_aoc.h" #include "core/hle/service/nim/nim_s.h" @@ -14,6 +16,16 @@ namespace Service { namespace NIM { +static Kernel::SharedPtr<Kernel::Event> nim_system_update_event; + +void CheckForSysUpdateEvent(Service::Interface* self) { + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x5, 0, 0); // 0x50000 + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(RESULT_SUCCESS); + rb.PushCopyHandles(Kernel::g_handle_table.Create(nim_system_update_event).Unwrap()); + LOG_TRACE(Service_NIM, "called"); +} + void CheckSysUpdateAvailable(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); @@ -29,9 +41,13 @@ void Init() { AddService(new NIM_AOC_Interface); AddService(new NIM_S_Interface); AddService(new NIM_U_Interface); + + nim_system_update_event = Kernel::Event::Create(ResetType::OneShot, "NIM System Update Event"); } -void Shutdown() {} +void Shutdown() { + nim_system_update_event = nullptr; +} } // namespace NIM diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h index c3106f18b..dbf605e5a 100644 --- a/src/core/hle/service/nim/nim.h +++ b/src/core/hle/service/nim/nim.h @@ -11,6 +11,17 @@ class Interface; namespace NIM { /** + * NIM::CheckForSysUpdateEvent service function + * Inputs: + * 1 : None + * Outputs: + * 1 : Result of function, 0 on success, otherwise error code + * 2 : Copy handle descriptor + * 3 : System Update event handle + */ +void CheckForSysUpdateEvent(Service::Interface* self); + +/** * NIM::CheckSysUpdateAvailable service function * Inputs: * 1 : None diff --git a/src/core/hle/service/nim/nim_u.cpp b/src/core/hle/service/nim/nim_u.cpp index 7664bad60..569660278 100644 --- a/src/core/hle/service/nim/nim_u.cpp +++ b/src/core/hle/service/nim/nim_u.cpp @@ -12,7 +12,7 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00010000, nullptr, "StartSysUpdate"}, {0x00020000, nullptr, "GetUpdateDownloadProgress"}, {0x00040000, nullptr, "FinishTitlesInstall"}, - {0x00050000, nullptr, "CheckForSysUpdateEvent"}, + {0x00050000, CheckForSysUpdateEvent, "CheckForSysUpdateEvent"}, {0x00090000, CheckSysUpdateAvailable, "CheckSysUpdateAvailable"}, {0x000A0000, nullptr, "GetState"}, {0x000B0000, nullptr, "GetSystemTitleHash"}, diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp new file mode 100644 index 000000000..9e19c38bf --- /dev/null +++ b/src/core/hle/service/ns/ns.cpp @@ -0,0 +1,16 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/ns/ns.h" +#include "core/hle/service/ns/ns_s.h" + +namespace Service { +namespace NS { + +void InstallInterfaces(SM::ServiceManager& service_manager) { + std::make_shared<NS_S>()->InstallAsService(service_manager); +} + +} // namespace NS +} // namespace Service diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h new file mode 100644 index 000000000..c3d67d98c --- /dev/null +++ b/src/core/hle/service/ns/ns.h @@ -0,0 +1,16 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service { +namespace NS { + +/// Registers all NS services with the specified service manager. +void InstallInterfaces(SM::ServiceManager& service_manager); + +} // namespace NS +} // namespace Service diff --git a/src/core/hle/service/ns/ns_s.cpp b/src/core/hle/service/ns/ns_s.cpp new file mode 100644 index 000000000..d952888dc --- /dev/null +++ b/src/core/hle/service/ns/ns_s.cpp @@ -0,0 +1,34 @@ +// Copyright 2015 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/ns/ns_s.h" + +namespace Service { +namespace NS { + +NS_S::NS_S() : ServiceFramework("ns:s", 2) { + static const FunctionInfo functions[] = { + {0x000100C0, nullptr, "LaunchFIRM"}, + {0x000200C0, nullptr, "LaunchTitle"}, + {0x00030000, nullptr, "TerminateApplication"}, + {0x00040040, nullptr, "TerminateProcess"}, + {0x000500C0, nullptr, "LaunchApplicationFIRM"}, + {0x00060042, nullptr, "SetFIRMParams4A0"}, + {0x00070042, nullptr, "CardUpdateInitialize"}, + {0x00080000, nullptr, "CardUpdateShutdown"}, + {0x000D0140, nullptr, "SetTWLBannerHMAC"}, + {0x000E0000, nullptr, "ShutdownAsync"}, + {0x00100180, nullptr, "RebootSystem"}, + {0x00110100, nullptr, "TerminateTitle"}, + {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"}, + {0x00150140, nullptr, "LaunchApplication"}, + {0x00160000, nullptr, "RebootSystemClean"}, + }; + RegisterHandlers(functions); +} + +NS_S::~NS_S() = default; + +} // namespace NS +} // namespace Service diff --git a/src/core/hle/service/ns_s.h b/src/core/hle/service/ns/ns_s.h index 90288a521..660ae453f 100644 --- a/src/core/hle/service/ns_s.h +++ b/src/core/hle/service/ns/ns_s.h @@ -4,18 +4,17 @@ #pragma once +#include "core/hle/kernel/kernel.h" #include "core/hle/service/service.h" namespace Service { namespace NS { -class NS_S final : public Interface { +/// Interface to "ns:s" service +class NS_S final : public ServiceFramework<NS_S> { public: NS_S(); - - std::string GetPortName() const override { - return "ns:s"; - } + ~NS_S(); }; } // namespace NS diff --git a/src/core/hle/service/ns_s.cpp b/src/core/hle/service/ns_s.cpp deleted file mode 100644 index 215c9aacc..000000000 --- a/src/core/hle/service/ns_s.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include "core/hle/service/ns_s.h" - -namespace Service { -namespace NS { - -const Interface::FunctionInfo FunctionTable[] = { - {0x000100C0, nullptr, "LaunchFIRM"}, - {0x000200C0, nullptr, "LaunchTitle"}, - {0x00030000, nullptr, "TerminateApplication"}, - {0x00040040, nullptr, "TerminateProcess"}, - {0x000500C0, nullptr, "LaunchApplicationFIRM"}, - {0x00060042, nullptr, "SetFIRMParams4A0"}, - {0x00070042, nullptr, "CardUpdateInitialize"}, - {0x00080000, nullptr, "CardUpdateShutdown"}, - {0x000D0140, nullptr, "SetTWLBannerHMAC"}, - {0x000E0000, nullptr, "ShutdownAsync"}, - {0x00100180, nullptr, "RebootSystem"}, - {0x00110100, nullptr, "TerminateTitle"}, - {0x001200C0, nullptr, "SetApplicationCpuTimeLimit"}, - {0x00150140, nullptr, "LaunchApplication"}, - {0x00160000, nullptr, "RebootSystemClean"}, -}; - -NS_S::NS_S() { - Register(FunctionTable); -} - -} // namespace NS -} // namespace Service diff --git a/src/core/hle/service/nwm/nwm_uds.cpp b/src/core/hle/service/nwm/nwm_uds.cpp index 6dbdff044..87a6b0eca 100644 --- a/src/core/hle/service/nwm/nwm_uds.cpp +++ b/src/core/hle/service/nwm/nwm_uds.cpp @@ -2,8 +2,11 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <algorithm> #include <array> #include <cstring> +#include <list> +#include <mutex> #include <unordered_map> #include <vector> #include "common/common_types.h" @@ -12,11 +15,14 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/event.h" #include "core/hle/kernel/shared_memory.h" +#include "core/hle/lock.h" #include "core/hle/result.h" #include "core/hle/service/nwm/nwm_uds.h" #include "core/hle/service/nwm/uds_beacon.h" +#include "core/hle/service/nwm/uds_connection.h" #include "core/hle/service/nwm/uds_data.h" #include "core/memory.h" +#include "network/network.h" namespace Service { namespace NWM { @@ -34,9 +40,12 @@ static ConnectionStatus connection_status{}; /* Node information about the current network. * The amount of elements in this vector is always the maximum number * of nodes specified in the network configuration. - * The first node is always the host, so this always contains at least 1 entry. + * The first node is always the host. */ -static NodeList node_info(1); +static NodeList node_info; + +// Node information about our own system. +static NodeInfo current_node; // Mapping of bind node ids to their respective events. static std::unordered_map<u32, Kernel::SharedPtr<Kernel::Event>> bind_node_events; @@ -51,6 +60,298 @@ static NetworkInfo network_info; // Event that will generate and send the 802.11 beacon frames. static int beacon_broadcast_event; +// Mutex to synchronize access to the connection status between the emulation thread and the +// network thread. +static std::mutex connection_status_mutex; + +// Mutex to synchronize access to the list of received beacons between the emulation thread and the +// network thread. +static std::mutex beacon_mutex; + +// Number of beacons to store before we start dropping the old ones. +// TODO(Subv): Find a more accurate value for this limit. +constexpr size_t MaxBeaconFrames = 15; + +// List of the last <MaxBeaconFrames> beacons received from the network. +static std::list<Network::WifiPacket> received_beacons; + +/** + * Returns a list of received 802.11 beacon frames from the specified sender since the last call. + */ +std::list<Network::WifiPacket> GetReceivedBeacons(const MacAddress& sender) { + std::lock_guard<std::mutex> lock(beacon_mutex); + if (sender != Network::BroadcastMac) { + std::list<Network::WifiPacket> filtered_list; + const auto beacon = std::find_if(received_beacons.begin(), received_beacons.end(), + [&sender](const Network::WifiPacket& packet) { + return packet.transmitter_address == sender; + }); + if (beacon != received_beacons.end()) { + filtered_list.push_back(*beacon); + // TODO(B3N30): Check if the complete deque is cleared or just the fetched entries + received_beacons.erase(beacon); + } + return filtered_list; + } + return std::move(received_beacons); +} + +/// Sends a WifiPacket to the room we're currently connected to. +void SendPacket(Network::WifiPacket& packet) { + // TODO(Subv): Implement. +} + +/* + * Returns an available index in the nodes array for the + * currently-hosted UDS network. + */ +static u16 GetNextAvailableNodeId() { + for (u16 index = 0; index < connection_status.max_nodes; ++index) { + if ((connection_status.node_bitmask & (1 << index)) == 0) + return index; + } + + // Any connection attempts to an already full network should have been refused. + ASSERT_MSG(false, "No available connection slots in the network"); +} + +// Inserts the received beacon frame in the beacon queue and removes any older beacons if the size +// limit is exceeded. +void HandleBeaconFrame(const Network::WifiPacket& packet) { + std::lock_guard<std::mutex> lock(beacon_mutex); + const auto unique_beacon = + std::find_if(received_beacons.begin(), received_beacons.end(), + [&packet](const Network::WifiPacket& new_packet) { + return new_packet.transmitter_address == packet.transmitter_address; + }); + if (unique_beacon != received_beacons.end()) { + // We already have a beacon from the same mac in the deque, remove the old one; + received_beacons.erase(unique_beacon); + } + + received_beacons.emplace_back(packet); + + // Discard old beacons if the buffer is full. + if (received_beacons.size() > MaxBeaconFrames) + received_beacons.pop_front(); +} + +void HandleAssociationResponseFrame(const Network::WifiPacket& packet) { + auto assoc_result = GetAssociationResult(packet.data); + + ASSERT_MSG(std::get<AssocStatus>(assoc_result) == AssocStatus::Successful, + "Could not join network"); + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::Connecting)); + } + + // Send the EAPoL-Start packet to the server. + using Network::WifiPacket; + WifiPacket eapol_start; + eapol_start.channel = network_channel; + eapol_start.data = GenerateEAPoLStartFrame(std::get<u16>(assoc_result), current_node); + // TODO(B3N30): Encrypt the packet. + eapol_start.destination_address = packet.transmitter_address; + eapol_start.type = WifiPacket::PacketType::Data; + + SendPacket(eapol_start); +} + +static void HandleEAPoLPacket(const Network::WifiPacket& packet) { + std::lock_guard<std::mutex> lock(connection_status_mutex); + + if (GetEAPoLFrameType(packet.data) == EAPoLStartMagic) { + if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) { + LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u", + connection_status.status); + return; + } + + auto node = DeserializeNodeInfoFromFrame(packet.data); + + if (connection_status.max_nodes == connection_status.total_nodes) { + // Reject connection attempt + LOG_ERROR(Service_NWM, "Reached maximum nodes, but reject packet wasn't sent."); + // TODO(B3N30): Figure out what packet is sent here + return; + } + + // Get an unused network node id + u16 node_id = GetNextAvailableNodeId(); + node.network_node_id = node_id + 1; + + connection_status.node_bitmask |= 1 << node_id; + connection_status.changed_nodes |= 1 << node_id; + connection_status.nodes[node_id] = node.network_node_id; + connection_status.total_nodes++; + + u8 current_nodes = network_info.total_nodes; + node_info[current_nodes] = node; + + network_info.total_nodes++; + + // Send the EAPoL-Logoff packet. + using Network::WifiPacket; + WifiPacket eapol_logoff; + eapol_logoff.channel = network_channel; + eapol_logoff.data = + GenerateEAPoLLogoffFrame(packet.transmitter_address, node.network_node_id, node_info, + network_info.max_nodes, network_info.total_nodes); + // TODO(Subv): Encrypt the packet. + eapol_logoff.destination_address = packet.transmitter_address; + eapol_logoff.type = WifiPacket::PacketType::Data; + + SendPacket(eapol_logoff); + // TODO(B3N30): Broadcast updated node list + // The 3ds does this presumably to support spectators. + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + connection_status_event->Signal(); + } else { + if (connection_status.status != static_cast<u32>(NetworkStatus::NotConnected)) { + LOG_DEBUG(Service_NWM, "Connection sequence aborted, because connection status is %u", + connection_status.status); + return; + } + auto logoff = ParseEAPoLLogoffFrame(packet.data); + + network_info.total_nodes = logoff.connected_nodes; + network_info.max_nodes = logoff.max_nodes; + + connection_status.network_node_id = logoff.assigned_node_id; + connection_status.total_nodes = logoff.connected_nodes; + connection_status.max_nodes = logoff.max_nodes; + + node_info.clear(); + node_info.reserve(network_info.max_nodes); + for (size_t index = 0; index < logoff.connected_nodes; ++index) { + connection_status.node_bitmask |= 1 << index; + connection_status.changed_nodes |= 1 << index; + connection_status.nodes[index] = logoff.nodes[index].network_node_id; + + node_info.emplace_back(DeserializeNodeInfo(logoff.nodes[index])); + } + + // We're now connected, signal the application + connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsClient); + // Some games require ConnectToNetwork to block, for now it doesn't + // If blocking is implemented this lock needs to be changed, + // otherwise it might cause deadlocks + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + connection_status_event->Signal(); + } +} + +/* + * Start a connection sequence with an UDS server. The sequence starts by sending an 802.11 + * authentication frame with SEQ1. + */ +void StartConnectionSequence(const MacAddress& server) { + using Network::WifiPacket; + WifiPacket auth_request; + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + ASSERT(connection_status.status == static_cast<u32>(NetworkStatus::NotConnected)); + + // TODO(Subv): Handle timeout. + + // Send an authentication frame with SEQ1 + auth_request.channel = network_channel; + auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ1); + auth_request.destination_address = server; + auth_request.type = WifiPacket::PacketType::Authentication; + } + + SendPacket(auth_request); +} + +/// Sends an Association Response frame to the specified mac address +void SendAssociationResponseFrame(const MacAddress& address) { + using Network::WifiPacket; + WifiPacket assoc_response; + + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) { + LOG_ERROR(Service_NWM, "Connection sequence aborted, because connection status is %u", + connection_status.status); + return; + } + + assoc_response.channel = network_channel; + // TODO(Subv): This will cause multiple clients to end up with the same association id, but + // we're not using that for anything. + u16 association_id = 1; + assoc_response.data = GenerateAssocResponseFrame(AssocStatus::Successful, association_id, + network_info.network_id); + assoc_response.destination_address = address; + assoc_response.type = WifiPacket::PacketType::AssociationResponse; + } + + SendPacket(assoc_response); +} + +/* + * Handles the authentication request frame and sends the authentication response and association + * response frames. Once an Authentication frame with SEQ1 is received by the server, it responds + * with an Authentication frame containing SEQ2, and immediately sends an Association response frame + * containing the details of the access point and the assigned association id for the new client. + */ +void HandleAuthenticationFrame(const Network::WifiPacket& packet) { + // Only the SEQ1 auth frame is handled here, the SEQ2 frame doesn't need any special behavior + if (GetAuthenticationSeqNumber(packet.data) == AuthenticationSeq::SEQ1) { + using Network::WifiPacket; + WifiPacket auth_request; + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) { + LOG_ERROR(Service_NWM, + "Connection sequence aborted, because connection status is %u", + connection_status.status); + return; + } + + // Respond with an authentication response frame with SEQ2 + auth_request.channel = network_channel; + auth_request.data = GenerateAuthenticationFrame(AuthenticationSeq::SEQ2); + auth_request.destination_address = packet.transmitter_address; + auth_request.type = WifiPacket::PacketType::Authentication; + } + SendPacket(auth_request); + + SendAssociationResponseFrame(packet.transmitter_address); + } +} + +static void HandleDataFrame(const Network::WifiPacket& packet) { + switch (GetFrameEtherType(packet.data)) { + case EtherType::EAPoL: + HandleEAPoLPacket(packet); + break; + case EtherType::SecureData: + // TODO(B3N30): Handle SecureData packets + break; + } +} + +/// Callback to parse and handle a received wifi packet. +void OnWifiPacketReceived(const Network::WifiPacket& packet) { + switch (packet.type) { + case Network::WifiPacket::PacketType::Beacon: + HandleBeaconFrame(packet); + break; + case Network::WifiPacket::PacketType::Authentication: + HandleAuthenticationFrame(packet); + break; + case Network::WifiPacket::PacketType::AssociationResponse: + HandleAssociationResponseFrame(packet); + break; + case Network::WifiPacket::PacketType::Data: + HandleDataFrame(packet); + break; + } +} + /** * NWM_UDS::Shutdown service function * Inputs: @@ -111,11 +412,10 @@ static void RecvBeaconBroadcastData(Interface* self) { u32 total_size = sizeof(BeaconDataReplyHeader); // Retrieve all beacon frames that were received from the desired mac address. - std::deque<WifiPacket> beacons = - GetReceivedPackets(WifiPacket::PacketType::Beacon, mac_address); + auto beacons = GetReceivedBeacons(mac_address); BeaconDataReplyHeader data_reply_header{}; - data_reply_header.total_entries = beacons.size(); + data_reply_header.total_entries = static_cast<u32>(beacons.size()); data_reply_header.max_output_size = out_buffer_size; Memory::WriteBlock(current_buffer_pos, &data_reply_header, sizeof(BeaconDataReplyHeader)); @@ -125,8 +425,8 @@ static void RecvBeaconBroadcastData(Interface* self) { for (const auto& beacon : beacons) { BeaconEntryHeader entry{}; // TODO(Subv): Figure out what this size is used for. - entry.unk_size = sizeof(BeaconEntryHeader) + beacon.data.size(); - entry.total_size = sizeof(BeaconEntryHeader) + beacon.data.size(); + entry.unk_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size()); + entry.total_size = static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size()); entry.wifi_channel = beacon.channel; entry.header_size = sizeof(BeaconEntryHeader); entry.mac_address = beacon.transmitter_address; @@ -137,9 +437,9 @@ static void RecvBeaconBroadcastData(Interface* self) { current_buffer_pos += sizeof(BeaconEntryHeader); Memory::WriteBlock(current_buffer_pos, beacon.data.data(), beacon.data.size()); - current_buffer_pos += beacon.data.size(); + current_buffer_pos += static_cast<VAddr>(beacon.data.size()); - total_size += sizeof(BeaconEntryHeader) + beacon.data.size(); + total_size += static_cast<u32>(sizeof(BeaconEntryHeader) + beacon.data.size()); } // Update the total size in the structure and write it to the buffer again. @@ -174,7 +474,7 @@ static void InitializeWithVersion(Interface* self) { u32 sharedmem_size = rp.Pop<u32>(); // Update the node information with the data the game gave us. - rp.PopRaw(node_info[0]); + rp.PopRaw(current_node); u16 version = rp.Pop<u16>(); @@ -184,15 +484,22 @@ static void InitializeWithVersion(Interface* self) { ASSERT_MSG(recv_buffer_memory->size == sharedmem_size, "Invalid shared memory size."); - // Reset the connection status, it contains all zeros after initialization, - // except for the actual status value. - connection_status = {}; - connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + + // Reset the connection status, it contains all zeros after initialization, + // except for the actual status value. + connection_status = {}; + connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); + } IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); rb.Push(RESULT_SUCCESS); rb.PushCopyHandles(Kernel::g_handle_table.Create(connection_status_event).Unwrap()); + // TODO(Subv): Connect the OnWifiPacketReceived function to the wifi packet received callback of + // the room we're currently in. + LOG_DEBUG(Service_NWM, "called sharedmem_size=0x%08X, version=0x%08X, sharedmem_handle=0x%08X", sharedmem_size, version, sharedmem_handle); } @@ -214,12 +521,16 @@ static void GetConnectionStatus(Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(13, 0); rb.Push(RESULT_SUCCESS); - rb.PushRaw(connection_status); - - // Reset the bitmask of changed nodes after each call to this - // function to prevent falsely informing games of outstanding - // changes in subsequent calls. - connection_status.changed_nodes = 0; + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + rb.PushRaw(connection_status); + + // Reset the bitmask of changed nodes after each call to this + // function to prevent falsely informing games of outstanding + // changes in subsequent calls. + // TODO(Subv): Find exactly where the NWM module resets this value. + connection_status.changed_nodes = 0; + } LOG_DEBUG(Service_NWM, "called"); } @@ -300,31 +611,36 @@ static void BeginHostingNetwork(Interface* self) { // The real UDS module throws a fatal error if this assert fails. ASSERT_MSG(network_info.max_nodes > 1, "Trying to host a network of only one member."); - connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost); - - // Ensure the application data size is less than the maximum value. - ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize, "Data size is too big."); - - // Set up basic information for this network. - network_info.oui_value = NintendoOUI; - network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo); - - connection_status.max_nodes = network_info.max_nodes; - - // Resize the nodes list to hold max_nodes. - node_info.resize(network_info.max_nodes); - - // There's currently only one node in the network (the host). - connection_status.total_nodes = 1; - network_info.total_nodes = 1; - // The host is always the first node - connection_status.network_node_id = 1; - node_info[0].network_node_id = 1; - connection_status.nodes[0] = connection_status.network_node_id; - // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken. - connection_status.node_bitmask |= 1; - // Notify the application that the first node was set. - connection_status.changed_nodes |= 1; + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + connection_status.status = static_cast<u32>(NetworkStatus::ConnectedAsHost); + + // Ensure the application data size is less than the maximum value. + ASSERT_MSG(network_info.application_data_size <= ApplicationDataSize, + "Data size is too big."); + + // Set up basic information for this network. + network_info.oui_value = NintendoOUI; + network_info.oui_type = static_cast<u8>(NintendoTagId::NetworkInfo); + + connection_status.max_nodes = network_info.max_nodes; + + // Resize the nodes list to hold max_nodes. + node_info.resize(network_info.max_nodes); + + // There's currently only one node in the network (the host). + connection_status.total_nodes = 1; + network_info.total_nodes = 1; + // The host is always the first node + connection_status.network_node_id = 1; + current_node.network_node_id = 1; + connection_status.nodes[0] = connection_status.network_node_id; + // Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken. + connection_status.node_bitmask |= 1; + // Notify the application that the first node was set. + connection_status.changed_nodes |= 1; + node_info[0] = current_node; + } // If the game has a preferred channel, use that instead. if (network_info.channel != 0) @@ -361,9 +677,13 @@ static void DestroyNetwork(Interface* self) { // Unschedule the beacon broadcast event. CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0); - // TODO(Subv): Check if connection_status is indeed reset after this call. - connection_status = {}; - connection_status.status = static_cast<u8>(NetworkStatus::NotConnected); + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + + // TODO(Subv): Check if connection_status is indeed reset after this call. + connection_status = {}; + connection_status.status = static_cast<u8>(NetworkStatus::NotConnected); + } connection_status_event->Signal(); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); @@ -406,17 +726,24 @@ static void SendTo(Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) && - connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) { - rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS, - ErrorSummary::InvalidState, ErrorLevel::Status)); - return; - } + u16 network_node_id; - if (dest_node_id == connection_status.network_node_id) { - rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS, - ErrorSummary::WrongArgument, ErrorLevel::Status)); - return; + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsClient) && + connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) { + rb.Push(ResultCode(ErrorDescription::NotAuthorized, ErrorModule::UDS, + ErrorSummary::InvalidState, ErrorLevel::Status)); + return; + } + + if (dest_node_id == connection_status.network_node_id) { + rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::UDS, + ErrorSummary::WrongArgument, ErrorLevel::Status)); + return; + } + + network_node_id = connection_status.network_node_id; } // TODO(Subv): Do something with the flags. @@ -433,8 +760,8 @@ static void SendTo(Interface* self) { // TODO(Subv): Increment the sequence number after each sent packet. u16 sequence_number = 0; - std::vector<u8> data_payload = GenerateDataPayload( - data, data_channel, dest_node_id, connection_status.network_node_id, sequence_number); + std::vector<u8> data_payload = + GenerateDataPayload(data, data_channel, dest_node_id, network_node_id, sequence_number); // TODO(Subv): Retrieve the MAC address of the dest_node_id and our own to encrypt // and encapsulate the payload. @@ -461,6 +788,7 @@ static void GetChannel(Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1A, 0, 0); IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); + std::lock_guard<std::mutex> lock(connection_status_mutex); bool is_connected = connection_status.status != static_cast<u32>(NetworkStatus::NotConnected); u8 channel = is_connected ? network_channel : 0; @@ -610,37 +938,29 @@ static void BeaconBroadcastCallback(u64 userdata, int cycles_late) { if (connection_status.status != static_cast<u32>(NetworkStatus::ConnectedAsHost)) return; - // TODO(Subv): Actually send the beacon. std::vector<u8> frame = GenerateBeaconFrame(network_info, node_info); + using Network::WifiPacket; + WifiPacket packet; + packet.type = WifiPacket::PacketType::Beacon; + packet.data = std::move(frame); + packet.destination_address = Network::BroadcastMac; + packet.channel = network_channel; + + SendPacket(packet); + // Start broadcasting the network, send a beacon frame every 102.4ms. CoreTiming::ScheduleEvent(msToCycles(DefaultBeaconInterval * MillisecondsPerTU) - cycles_late, beacon_broadcast_event, 0); } /* - * Returns an available index in the nodes array for the - * currently-hosted UDS network. - */ -static u32 GetNextAvailableNodeId() { - ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost), - "Can not accept clients if we're not hosting a network"); - - for (unsigned index = 0; index < connection_status.max_nodes; ++index) { - if ((connection_status.node_bitmask & (1 << index)) == 0) - return index; - } - - // Any connection attempts to an already full network should have been refused. - ASSERT_MSG(false, "No available connection slots in the network"); -} - -/* * Called when a client connects to an UDS network we're hosting, * updates the connection status and signals the update event. * @param network_node_id Network Node Id of the connecting client. */ void OnClientConnected(u16 network_node_id) { + std::lock_guard<std::mutex> lock(connection_status_mutex); ASSERT_MSG(connection_status.status == static_cast<u32>(NetworkStatus::ConnectedAsHost), "Can not accept clients if we're not hosting a network"); ASSERT_MSG(connection_status.total_nodes < connection_status.max_nodes, @@ -655,7 +975,7 @@ void OnClientConnected(u16 network_node_id) { } const Interface::FunctionInfo FunctionTable[] = { - {0x00010442, nullptr, "Initialize (deprecated)"}, + {0x000102C2, nullptr, "Initialize (deprecated)"}, {0x00020000, nullptr, "Scrap"}, {0x00030000, Shutdown, "Shutdown"}, {0x00040402, nullptr, "CreateNetwork (deprecated)"}, @@ -702,8 +1022,11 @@ NWM_UDS::~NWM_UDS() { connection_status_event = nullptr; recv_buffer_memory = nullptr; - connection_status = {}; - connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); + { + std::lock_guard<std::mutex> lock(connection_status_mutex); + connection_status = {}; + connection_status.status = static_cast<u32>(NetworkStatus::NotConnected); + } CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0); } diff --git a/src/core/hle/service/nwm/nwm_uds.h b/src/core/hle/service/nwm/nwm_uds.h index 141f49f9c..f1caaf974 100644 --- a/src/core/hle/service/nwm/nwm_uds.h +++ b/src/core/hle/service/nwm/nwm_uds.h @@ -42,6 +42,7 @@ using NodeList = std::vector<NodeInfo>; enum class NetworkStatus { NotConnected = 3, ConnectedAsHost = 6, + Connecting = 7, ConnectedAsClient = 9, ConnectedAsSpectator = 10, }; @@ -85,6 +86,17 @@ static_assert(offsetof(NetworkInfo, oui_value) == 0xC, "oui_value is at the wron static_assert(offsetof(NetworkInfo, wlan_comm_id) == 0x10, "wlancommid is at the wrong offset."); static_assert(sizeof(NetworkInfo) == 0x108, "NetworkInfo has incorrect size."); +/// Additional block tag ids in the Beacon and Association Response frames +enum class TagId : u8 { + SSID = 0, + SupportedRates = 1, + DSParameterSet = 2, + TrafficIndicationMap = 5, + CountryInformation = 7, + ERPInformation = 42, + VendorSpecific = 221 +}; + class NWM_UDS final : public Interface { public: NWM_UDS(); diff --git a/src/core/hle/service/nwm/uds_beacon.cpp b/src/core/hle/service/nwm/uds_beacon.cpp index 6332b404c..73a80d940 100644 --- a/src/core/hle/service/nwm/uds_beacon.cpp +++ b/src/core/hle/service/nwm/uds_beacon.cpp @@ -243,7 +243,7 @@ std::vector<u8> GenerateNintendoFirstEncryptedDataTag(const NetworkInfo& network EncryptedDataTag tag{}; tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific); - tag.header.length = sizeof(tag) - sizeof(TagHeader) + payload_size; + tag.header.length = static_cast<u8>(sizeof(tag) - sizeof(TagHeader) + payload_size); tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData0); tag.oui = NintendoOUI; @@ -279,7 +279,7 @@ std::vector<u8> GenerateNintendoSecondEncryptedDataTag(const NetworkInfo& networ EncryptedDataTag tag{}; tag.header.tag_id = static_cast<u8>(TagId::VendorSpecific); - tag.header.length = tag_length; + tag.header.length = static_cast<u8>(tag_length); tag.oui_type = static_cast<u8>(NintendoTagId::EncryptedData1); tag.oui = NintendoOUI; @@ -325,8 +325,5 @@ std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeL return buffer; } -std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender) { - return {}; -} } // namespace NWM } // namespace Service diff --git a/src/core/hle/service/nwm/uds_beacon.h b/src/core/hle/service/nwm/uds_beacon.h index caacf4c6f..50cc76da2 100644 --- a/src/core/hle/service/nwm/uds_beacon.h +++ b/src/core/hle/service/nwm/uds_beacon.h @@ -17,17 +17,6 @@ namespace NWM { using MacAddress = std::array<u8, 6>; constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32}; -/// Additional block tag ids in the Beacon frames -enum class TagId : u8 { - SSID = 0, - SupportedRates = 1, - DSParameterSet = 2, - TrafficIndicationMap = 5, - CountryInformation = 7, - ERPInformation = 42, - VendorSpecific = 221 -}; - /** * Internal vendor-specific tag ids as stored inside * VendorSpecific blocks in the Beacon frames. @@ -135,20 +124,6 @@ struct BeaconData { static_assert(sizeof(BeaconData) == 0x12, "BeaconData has incorrect size."); -/// Information about a received WiFi packet. -/// Acts as our own 802.11 header. -struct WifiPacket { - enum class PacketType { Beacon, Data }; - - PacketType type; ///< The type of 802.11 frame, Beacon / Data. - - /// Raw 802.11 frame data, starting at the management frame header for management frames. - std::vector<u8> data; - MacAddress transmitter_address; ///< Mac address of the transmitter. - MacAddress destination_address; ///< Mac address of the receiver. - u8 channel; ///< WiFi channel where this frame was transmitted. -}; - /** * Decrypts the beacon data buffer for the network described by `network_info`. */ @@ -161,10 +136,5 @@ void DecryptBeaconData(const NetworkInfo& network_info, std::vector<u8>& buffer) */ std::vector<u8> GenerateBeaconFrame(const NetworkInfo& network_info, const NodeList& nodes); -/** - * Returns a list of received 802.11 frames from the specified sender - * matching the type since the last call. - */ -std::deque<WifiPacket> GetReceivedPackets(WifiPacket::PacketType type, const MacAddress& sender); } // namespace NWM } // namespace Service diff --git a/src/core/hle/service/nwm/uds_connection.cpp b/src/core/hle/service/nwm/uds_connection.cpp new file mode 100644 index 000000000..c74f51253 --- /dev/null +++ b/src/core/hle/service/nwm/uds_connection.cpp @@ -0,0 +1,88 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/nwm/nwm_uds.h" +#include "core/hle/service/nwm/uds_connection.h" +#include "fmt/format.h" + +namespace Service { +namespace NWM { + +// Note: These values were taken from a packet capture of an o3DS XL +// broadcasting a Super Smash Bros. 4 lobby. +constexpr u16 DefaultExtraCapabilities = 0x0431; + +std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq) { + AuthenticationFrame frame{}; + frame.auth_seq = static_cast<u16>(seq); + + std::vector<u8> data(sizeof(frame)); + std::memcpy(data.data(), &frame, sizeof(frame)); + + return data; +} + +AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body) { + AuthenticationFrame frame; + std::memcpy(&frame, body.data(), sizeof(frame)); + + return static_cast<AuthenticationSeq>(frame.auth_seq); +} + +/** + * Generates an SSID tag of an 802.11 Beacon frame with an 8-byte character representation of the + * specified network id as the SSID value. + * @param network_id The network id to use. + * @returns A buffer with the SSID tag. + */ +static std::vector<u8> GenerateSSIDTag(u32 network_id) { + constexpr u8 SSIDSize = 8; + + struct { + u8 id = static_cast<u8>(TagId::SSID); + u8 size = SSIDSize; + } tag_header; + + std::vector<u8> buffer(sizeof(tag_header) + SSIDSize); + + std::memcpy(buffer.data(), &tag_header, sizeof(tag_header)); + + std::string network_name = fmt::format("{0:08X}", network_id); + + std::memcpy(buffer.data() + sizeof(tag_header), network_name.c_str(), SSIDSize); + + return buffer; +} + +std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id) { + AssociationResponseFrame frame{}; + frame.capabilities = DefaultExtraCapabilities; + frame.status_code = static_cast<u16>(status); + // The association id is ORed with this magic value (0xC000) + constexpr u16 AssociationIdMagic = 0xC000; + frame.assoc_id = association_id | AssociationIdMagic; + + std::vector<u8> data(sizeof(frame)); + std::memcpy(data.data(), &frame, sizeof(frame)); + + auto ssid_tag = GenerateSSIDTag(network_id); + data.insert(data.end(), ssid_tag.begin(), ssid_tag.end()); + + // TODO(Subv): Add the SupportedRates tag. + // TODO(Subv): Add the DSParameterSet tag. + // TODO(Subv): Add the ERPInformation tag. + return data; +} + +std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body) { + AssociationResponseFrame frame; + memcpy(&frame, body.data(), sizeof(frame)); + + constexpr u16 AssociationIdMask = 0x3FFF; + return std::make_tuple(static_cast<AssocStatus>(frame.status_code), + frame.assoc_id & AssociationIdMask); +} + +} // namespace NWM +} // namespace Service diff --git a/src/core/hle/service/nwm/uds_connection.h b/src/core/hle/service/nwm/uds_connection.h new file mode 100644 index 000000000..a664f8471 --- /dev/null +++ b/src/core/hle/service/nwm/uds_connection.h @@ -0,0 +1,56 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <tuple> +#include <vector> +#include "common/common_types.h" +#include "common/swap.h" +#include "core/hle/service/service.h" + +namespace Service { +namespace NWM { + +/// Sequence number of the 802.11 authentication frames. +enum class AuthenticationSeq : u16 { SEQ1 = 1, SEQ2 = 2 }; + +enum class AuthAlgorithm : u16 { OpenSystem = 0 }; + +enum class AuthStatus : u16 { Successful = 0 }; + +enum class AssocStatus : u16 { Successful = 0 }; + +struct AuthenticationFrame { + u16_le auth_algorithm = static_cast<u16>(AuthAlgorithm::OpenSystem); + u16_le auth_seq; + u16_le status_code = static_cast<u16>(AuthStatus::Successful); +}; + +static_assert(sizeof(AuthenticationFrame) == 6, "AuthenticationFrame has wrong size"); + +struct AssociationResponseFrame { + u16_le capabilities; + u16_le status_code; + u16_le assoc_id; +}; + +static_assert(sizeof(AssociationResponseFrame) == 6, "AssociationResponseFrame has wrong size"); + +/// Generates an 802.11 authentication frame, starting at the frame body. +std::vector<u8> GenerateAuthenticationFrame(AuthenticationSeq seq); + +/// Returns the sequence number from the body of an Authentication frame. +AuthenticationSeq GetAuthenticationSeqNumber(const std::vector<u8>& body); + +/// Generates an 802.11 association response frame with the specified status, association id and +/// network id, starting at the frame body. +std::vector<u8> GenerateAssocResponseFrame(AssocStatus status, u16 association_id, u32 network_id); + +/// Returns a tuple of (association status, association id) from the body of an AssociationResponse +/// frame. +std::tuple<AssocStatus, u16> GetAssociationResult(const std::vector<u8>& body); + +} // namespace NWM +} // namespace Service diff --git a/src/core/hle/service/nwm/uds_data.cpp b/src/core/hle/service/nwm/uds_data.cpp index 8c6742dba..4b389710f 100644 --- a/src/core/hle/service/nwm/uds_data.cpp +++ b/src/core/hle/service/nwm/uds_data.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <algorithm> #include <cstring> #include <cryptopp/aes.h> #include <cryptopp/ccm.h> @@ -197,7 +198,7 @@ static std::vector<u8> DecryptDataFrame(const std::vector<u8>& encrypted_payload df.ChannelMessageEnd(CryptoPP::DEFAULT_CHANNEL); df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL); - int size = df.MaxRetrievable(); + size_t size = df.MaxRetrievable(); std::vector<u8> pdata(size); df.Get(pdata.data(), size); @@ -251,7 +252,7 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload, df.SetRetrievalChannel(CryptoPP::DEFAULT_CHANNEL); - int size = df.MaxRetrievable(); + size_t size = df.MaxRetrievable(); std::vector<u8> cipher(size); df.Get(cipher.data(), size); @@ -266,13 +267,107 @@ static std::vector<u8> EncryptDataFrame(const std::vector<u8>& payload, std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node, u16 src_node, u16 sequence_number) { std::vector<u8> buffer = GenerateLLCHeader(EtherType::SecureData); - std::vector<u8> securedata_header = - GenerateSecureDataHeader(data.size(), channel, dest_node, src_node, sequence_number); + std::vector<u8> securedata_header = GenerateSecureDataHeader( + static_cast<u16>(data.size()), channel, dest_node, src_node, sequence_number); buffer.insert(buffer.end(), securedata_header.begin(), securedata_header.end()); buffer.insert(buffer.end(), data.begin(), data.end()); return buffer; } +std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info) { + EAPoLStartPacket eapol_start{}; + eapol_start.association_id = association_id; + eapol_start.node.friend_code_seed = node_info.friend_code_seed; + + std::copy(node_info.username.begin(), node_info.username.end(), + eapol_start.node.username.begin()); + + // Note: The network_node_id and unknown bytes seem to be uninitialized in the NWM module. + // TODO(B3N30): The last 8 bytes seem to have a fixed value of 07 88 15 00 04 e9 13 00 in + // EAPoL-Start packets from different 3DSs to the same host during a Super Smash Bros. 4 game. + // Find out what that means. + + std::vector<u8> eapol_buffer(sizeof(EAPoLStartPacket)); + std::memcpy(eapol_buffer.data(), &eapol_start, sizeof(eapol_start)); + + std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL); + buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end()); + return buffer; +} + +EtherType GetFrameEtherType(const std::vector<u8>& frame) { + LLCHeader header; + std::memcpy(&header, frame.data(), sizeof(header)); + + u16 ethertype = header.protocol; + return static_cast<EtherType>(ethertype); +} + +u16 GetEAPoLFrameType(const std::vector<u8>& frame) { + // Ignore the LLC header + u16_be eapol_type; + std::memcpy(&eapol_type, frame.data() + sizeof(LLCHeader), sizeof(eapol_type)); + return eapol_type; +} + +NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame) { + EAPoLStartPacket eapol_start; + + // Skip the LLC header + std::memcpy(&eapol_start, frame.data() + sizeof(LLCHeader), sizeof(eapol_start)); + + NodeInfo node{}; + node.friend_code_seed = eapol_start.node.friend_code_seed; + + std::copy(eapol_start.node.username.begin(), eapol_start.node.username.end(), + node.username.begin()); + + return node; +} + +NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node) { + NodeInfo node_info{}; + node_info.friend_code_seed = node.friend_code_seed; + node_info.network_node_id = node.network_node_id; + + std::copy(node.username.begin(), node.username.end(), node_info.username.begin()); + + return node_info; +} + +std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id, + const NodeList& nodes, u8 max_nodes, u8 total_nodes) { + EAPoLLogoffPacket eapol_logoff{}; + eapol_logoff.assigned_node_id = network_node_id; + eapol_logoff.connected_nodes = total_nodes; + eapol_logoff.max_nodes = max_nodes; + + for (size_t index = 0; index < total_nodes; ++index) { + const auto& node_info = nodes[index]; + auto& node = eapol_logoff.nodes[index]; + + node.friend_code_seed = node_info.friend_code_seed; + node.network_node_id = node_info.network_node_id; + + std::copy(node_info.username.begin(), node_info.username.end(), node.username.begin()); + } + + std::vector<u8> eapol_buffer(sizeof(EAPoLLogoffPacket)); + std::memcpy(eapol_buffer.data(), &eapol_logoff, sizeof(eapol_logoff)); + + std::vector<u8> buffer = GenerateLLCHeader(EtherType::EAPoL); + buffer.insert(buffer.end(), eapol_buffer.begin(), eapol_buffer.end()); + return buffer; +} + +EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame) { + EAPoLLogoffPacket eapol_logoff; + + // Skip the LLC header + std::memcpy(&eapol_logoff, frame.data() + sizeof(LLCHeader), sizeof(eapol_logoff)); + return eapol_logoff; +} + } // namespace NWM } // namespace Service diff --git a/src/core/hle/service/nwm/uds_data.h b/src/core/hle/service/nwm/uds_data.h index a23520a41..76bccb1bf 100644 --- a/src/core/hle/service/nwm/uds_data.h +++ b/src/core/hle/service/nwm/uds_data.h @@ -8,6 +8,7 @@ #include <vector> #include "common/common_types.h" #include "common/swap.h" +#include "core/hle/service/nwm/uds_beacon.h" #include "core/hle/service/service.h" namespace Service { @@ -67,6 +68,49 @@ struct DataFrameCryptoCTR { static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wrong size"); +struct EAPoLNodeInfo { + u64_be friend_code_seed; + std::array<u16_be, 10> username; + INSERT_PADDING_BYTES(4); + u16_be network_node_id; + INSERT_PADDING_BYTES(6); +}; + +static_assert(sizeof(EAPoLNodeInfo) == 0x28, "EAPoLNodeInfo has the wrong size"); + +constexpr u16 EAPoLStartMagic = 0x201; + +/* + * Nintendo EAPoLStartPacket, is used to initaliaze a connection between client and host + */ +struct EAPoLStartPacket { + u16_be magic = EAPoLStartMagic; + u16_be association_id; + // This value is hardcoded to 1 in the NWM module. + u16_be unknown = 1; + INSERT_PADDING_BYTES(2); + EAPoLNodeInfo node; +}; + +static_assert(sizeof(EAPoLStartPacket) == 0x30, "EAPoLStartPacket has the wrong size"); + +constexpr u16 EAPoLLogoffMagic = 0x202; + +struct EAPoLLogoffPacket { + u16_be magic = EAPoLLogoffMagic; + INSERT_PADDING_BYTES(2); + u16_be assigned_node_id; + MacAddress client_mac_address; + INSERT_PADDING_BYTES(6); + u8 connected_nodes; + u8 max_nodes; + INSERT_PADDING_BYTES(4); + + std::array<EAPoLNodeInfo, UDSMaxNodes> nodes; +}; + +static_assert(sizeof(EAPoLLogoffPacket) == 0x298, "EAPoLLogoffPacket has the wrong size"); + /** * Generates an unencrypted 802.11 data payload. * @returns The generated frame payload. @@ -74,5 +118,47 @@ static_assert(sizeof(DataFrameCryptoCTR) == 16, "DataFrameCryptoCTR has the wron std::vector<u8> GenerateDataPayload(const std::vector<u8>& data, u8 channel, u16 dest_node, u16 src_node, u16 sequence_number); +/* + * Generates an unencrypted 802.11 data frame body with the EAPoL-Start format for UDS + * communication. + * @returns The generated frame body. + */ +std::vector<u8> GenerateEAPoLStartFrame(u16 association_id, const NodeInfo& node_info); + +/* + * Returns the EtherType of the specified 802.11 frame. + */ +EtherType GetFrameEtherType(const std::vector<u8>& frame); + +/* + * Returns the EAPoL type (Start / Logoff) of the specified 802.11 frame. + * Note: The frame *must* be an EAPoL frame. + */ +u16 GetEAPoLFrameType(const std::vector<u8>& frame); + +/* + * Returns a deserialized NodeInfo structure from the information inside an EAPoL-Start packet + * encapsulated in an 802.11 data frame. + */ +NodeInfo DeserializeNodeInfoFromFrame(const std::vector<u8>& frame); + +/* + * Returns a NodeInfo constructed from the data in the specified EAPoLNodeInfo. + */ +NodeInfo DeserializeNodeInfo(const EAPoLNodeInfo& node); + +/* + * Generates an unencrypted 802.11 data frame body with the EAPoL-Logoff format for UDS + * communication. + * @returns The generated frame body. + */ +std::vector<u8> GenerateEAPoLLogoffFrame(const MacAddress& mac_address, u16 network_node_id, + const NodeList& nodes, u8 max_nodes, u8 total_nodes); + +/* + * Returns a EAPoLLogoffPacket representing the specified 802.11-encapsulated data frame. + */ +EAPoLLogoffPacket ParseEAPoLLogoffFrame(const std::vector<u8>& frame); + } // namespace NWM } // namespace Service diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index aad950e50..f267aad74 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -38,7 +38,7 @@ #include "core/hle/service/news/news.h" #include "core/hle/service/nfc/nfc.h" #include "core/hle/service/nim/nim.h" -#include "core/hle/service/ns_s.h" +#include "core/hle/service/ns/ns.h" #include "core/hle/service/nwm/nwm.h" #include "core/hle/service/pm_app.h" #include "core/hle/service/ptm/ptm.h" @@ -215,6 +215,8 @@ void Init() { SM::g_service_manager = std::make_shared<SM::ServiceManager>(); SM::ServiceManager::InstallInterfaces(SM::g_service_manager); + NS::InstallInterfaces(*SM::g_service_manager); + AddNamedPort(new ERR::ERR_F); FS::ArchiveInit(); @@ -246,7 +248,6 @@ void Init() { AddService(new HTTP::HTTP_C); AddService(new LDR::LDR_RO); AddService(new MIC::MIC_U); - AddService(new NS::NS_S); AddService(new PM::PM_APP); AddService(new SOC::SOC_U); AddService(new SSL::SSL_C); diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 5e7fc68f9..854ab9a05 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -36,6 +36,10 @@ ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService std::string name, unsigned int max_sessions) { CASCADE_CODE(ValidateServiceName(name)); + + if (registered_services.find(name) != registered_services.end()) + return ERR_ALREADY_REGISTERED; + Kernel::SharedPtr<Kernel::ServerPort> server_port; Kernel::SharedPtr<Kernel::ClientPort> client_port; std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name); diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index 8f0dbf2db..9f60a7965 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -32,6 +32,9 @@ constexpr ResultCode ERR_ACCESS_DENIED(6, ErrorModule::SRV, ErrorSummary::Invali ErrorLevel::Permanent); // 0xD8E06406 constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument, ErrorLevel::Permanent); // 0xD9006407 +constexpr ResultCode ERR_ALREADY_REGISTERED(ErrorDescription::AlreadyExists, ErrorModule::OS, + ErrorSummary::WrongArgument, + ErrorLevel::Permanent); // 0xD9001BFC class ServiceManager { public: diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp index 352941e69..fb873981c 100644 --- a/src/core/hle/service/sm/srv.cpp +++ b/src/core/hle/service/sm/srv.cpp @@ -13,6 +13,7 @@ #include "core/hle/kernel/errors.h" #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/semaphore.h" +#include "core/hle/kernel/server_port.h" #include "core/hle/kernel/server_session.h" #include "core/hle/service/sm/sm.h" #include "core/hle/service/sm/srv.h" @@ -61,7 +62,7 @@ void SRV::EnableNotification(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x2, 0, 0); notification_semaphore = - Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap(); + Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, 0, "SRV:Notification").Unwrap(); IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); rb.Push(RESULT_SUCCESS); @@ -184,12 +185,35 @@ void SRV::PublishToSubscriber(Kernel::HLERequestContext& ctx) { flags); } +void SRV::RegisterService(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx, 0x3, 4, 0); + + auto name_buf = rp.PopRaw<std::array<char, 8>>(); + size_t name_len = rp.Pop<u32>(); + u32 max_sessions = rp.Pop<u32>(); + + std::string name(name_buf.data(), std::min(name_len, name_buf.size())); + + auto port = service_manager->RegisterService(name, max_sessions); + + if (port.Failed()) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(port.Code()); + LOG_ERROR(Service_SRV, "called service=%s -> error 0x%08X", name.c_str(), port.Code().raw); + return; + } + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(RESULT_SUCCESS); + rb.PushObjects(port.Unwrap()); +} + SRV::SRV(std::shared_ptr<ServiceManager> service_manager) : ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) { static const FunctionInfo functions[] = { {0x00010002, &SRV::RegisterClient, "RegisterClient"}, {0x00020000, &SRV::EnableNotification, "EnableNotification"}, - {0x00030100, nullptr, "RegisterService"}, + {0x00030100, &SRV::RegisterService, "RegisterService"}, {0x000400C0, nullptr, "UnregisterService"}, {0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"}, {0x000600C2, nullptr, "RegisterPort"}, diff --git a/src/core/hle/service/sm/srv.h b/src/core/hle/service/sm/srv.h index 75cca5184..aad839563 100644 --- a/src/core/hle/service/sm/srv.h +++ b/src/core/hle/service/sm/srv.h @@ -28,6 +28,7 @@ private: void Subscribe(Kernel::HLERequestContext& ctx); void Unsubscribe(Kernel::HLERequestContext& ctx); void PublishToSubscriber(Kernel::HLERequestContext& ctx); + void RegisterService(Kernel::HLERequestContext& ctx); std::shared_ptr<ServiceManager> service_manager; Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore; diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp index 6838e449c..d1bfe51e6 100644 --- a/src/core/hw/gpu.cpp +++ b/src/core/hw/gpu.cpp @@ -29,7 +29,7 @@ namespace GPU { Regs g_regs; /// 268MHz CPU clocks / 60Hz frames per second -const u64 frame_ticks = BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE; +const u64 frame_ticks = static_cast<u64>(BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE); /// Event id for CoreTiming static int vblank_event; @@ -515,15 +515,15 @@ template void Write<u8>(u32 addr, const u8 data); /// Update hardware static void VBlankCallback(u64 userdata, int cycles_late) { - VideoCore::g_renderer->SwapBuffers(); - - // Signal to GSP that GPU interrupt has occurred - // TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub - // screen, or if both use the same interrupts and these two instead determine the - // beginning and end of the VBlank period. If needed, split the interrupt firing into - // two different intervals. - Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0); - Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1); + //VideoCore::g_renderer->SwapBuffers(); + + //// Signal to GSP that GPU interrupt has occurred + //// TODO(yuriks): hwtest to determine if PDC0 is for the Top screen and PDC1 for the Sub + //// screen, or if both use the same interrupts and these two instead determine the + //// beginning and end of the VBlank period. If needed, split the interrupt firing into + //// two different intervals. + //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC0); + //Service::GSP::SignalInterrupt(Service::GSP::InterruptId::PDC1); // Reschedule recurrent event CoreTiming::ScheduleEvent(frame_ticks - cycles_late, vblank_event); diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h index 21b127fee..e3d0a0e08 100644 --- a/src/core/hw/gpu.h +++ b/src/core/hw/gpu.h @@ -74,9 +74,9 @@ struct Regs { case PixelFormat::RGB5A1: case PixelFormat::RGBA4: return 2; - default: - UNIMPLEMENTED(); } + + UNREACHABLE(); } INSERT_PADDING_WORDS(0x4); diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 209328347..7b0342cc9 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -91,8 +91,8 @@ static u32 TranslateAddr(u32 addr, const THREEloadinfo* loadinfo, u32* offsets) return loadinfo->seg_addrs[2] + addr - offsets[1]; } -using Kernel::SharedPtr; using Kernel::CodeSet; +using Kernel::SharedPtr; static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr, SharedPtr<CodeSet>* out_codeset) { @@ -255,7 +255,7 @@ FileType AppLoader_THREEDSX::IdentifyType(FileUtil::IOFile& file) { return FileType::Error; } -ResultStatus AppLoader_THREEDSX::Load() { +ResultStatus AppLoader_THREEDSX::Load(Kernel::SharedPtr<Kernel::Process>& process) { if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; @@ -267,19 +267,17 @@ ResultStatus AppLoader_THREEDSX::Load() { return ResultStatus::Error; codeset->name = filename; - Kernel::g_current_process = Kernel::Process::Create("main"); - Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); - Kernel::g_current_process->svc_access_mask.set(); - Kernel::g_current_process->address_mappings = default_address_mappings; + process = Kernel::Process::Create("main"); + process->LoadModule(codeset, codeset->entrypoint); + process->svc_access_mask.set(); + process->address_mappings = default_address_mappings; // Attach the default resource limit (APPLICATION) to the process - Kernel::g_current_process->resource_limit = + process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); + process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); - Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); - - Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this), - Service::FS::ArchiveIdCode::SelfNCCH); + Service::FS::RegisterSelfNCCH(*this); is_loaded = true; return ResultStatus::Success; diff --git a/src/core/loader/3dsx.h b/src/core/loader/3dsx.h index 3f376778a..1e59bbb9d 100644 --- a/src/core/loader/3dsx.h +++ b/src/core/loader/3dsx.h @@ -31,7 +31,7 @@ public: return IdentifyType(file); } - ResultStatus Load() override; + ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; ResultStatus ReadIcon(std::vector<u8>& buffer) override; diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 2efc67ff8..9969a8c39 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -13,8 +13,8 @@ #include "core/loader/elf.h" #include "core/memory.h" -using Kernel::SharedPtr; using Kernel::CodeSet; +using Kernel::SharedPtr; //////////////////////////////////////////////////////////////////////////////////////////////////// // ELF Header Constants @@ -382,7 +382,7 @@ FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file) { return FileType::Error; } -ResultStatus AppLoader_ELF::Load() { +ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; @@ -401,16 +401,16 @@ ResultStatus AppLoader_ELF::Load() { SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); codeset->name = filename; - Kernel::g_current_process = Kernel::Process::Create("main"); - Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); - Kernel::g_current_process->svc_access_mask.set(); - Kernel::g_current_process->address_mappings = default_address_mappings; + process = Kernel::Process::Create("main"); + process->LoadModule(codeset, codeset->entrypoint); + process->svc_access_mask.set(); + process->address_mappings = default_address_mappings; // Attach the default resource limit (APPLICATION) to the process - Kernel::g_current_process->resource_limit = + process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); - Kernel::g_current_process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); + process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); is_loaded = true; return ResultStatus::Success; diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h index 862aa90d8..113da5917 100644 --- a/src/core/loader/elf.h +++ b/src/core/loader/elf.h @@ -30,7 +30,7 @@ public: return IdentifyType(file); } - ResultStatus Load() override; + ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; private: std::string filename; diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index ac26f31fa..311785d05 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -13,10 +13,12 @@ #include <boost/optional.hpp> #include "common/common_types.h" #include "common/file_util.h" +#include "core/hle/kernel/kernel.h" namespace Kernel { struct AddressMapping; -} +class Process; +} // namespace Kernel //////////////////////////////////////////////////////////////////////////////////////////////////// // Loader namespace @@ -94,10 +96,11 @@ public: virtual FileType GetFileType() = 0; /** - * Load the application - * @return ResultStatus result of function + * Load the application and return the created Process instance + * @param process The newly created process. + * @return The status result of the operation. */ - virtual ResultStatus Load() = 0; + virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0; /** * Loads the system mode that this application needs. @@ -168,6 +171,28 @@ public: return ResultStatus::ErrorNotImplemented; } + /** + * Get the update RomFS of the application + * Since the RomFS can be huge, we return a file reference instead of copying to a buffer + * @param romfs_file The file containing the RomFS + * @param offset The offset the romfs begins on + * @param size The size of the romfs + * @return ResultStatus result of function + */ + virtual ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, + u64& size) { + return ResultStatus::ErrorNotImplemented; + } + + /** + * Get the title of the application + * @param title Reference to store the application title into + * @return ResultStatus result of function + */ + virtual ResultStatus ReadTitle(std::string& title) { + return ResultStatus::ErrorNotImplemented; + } + protected: FileUtil::IOFile file; bool is_loaded = false; @@ -186,4 +211,4 @@ extern const std::initializer_list<Kernel::AddressMapping> default_address_mappi */ std::unique_ptr<AppLoader> GetLoader(const std::string& filename); -} // namespace +} // namespace Loader diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 728886ea8..e33a37b2e 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -4,13 +4,17 @@ #include <algorithm> #include <cinttypes> +#include <codecvt> #include <cstring> +#include <locale> #include <memory> #include "common/logging/log.h" #include "common/string_util.h" #include "common/swap.h" #include "core/core.h" #include "core/file_sys/archive_selfncch.h" +#include "core/file_sys/ncch_container.h" +#include "core/file_sys/title_metadata.h" #include "core/hle/kernel/process.h" #include "core/hle/kernel/resource_limit.h" #include "core/hle/service/cfg/cfg.h" @@ -18,93 +22,14 @@ #include "core/loader/ncch.h" #include "core/loader/smdh.h" #include "core/memory.h" +#include "network/network.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // Loader namespace namespace Loader { -static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs -static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes) - -/** - * Get the decompressed size of an LZSS compressed ExeFS file - * @param buffer Buffer of compressed file - * @param size Size of compressed buffer - * @return Size of decompressed buffer - */ -static u32 LZSS_GetDecompressedSize(const u8* buffer, u32 size) { - u32 offset_size = *(u32*)(buffer + size - 4); - return offset_size + size; -} - -/** - * Decompress ExeFS file (compressed with LZSS) - * @param compressed Compressed buffer - * @param compressed_size Size of compressed buffer - * @param decompressed Decompressed buffer - * @param decompressed_size Size of decompressed buffer - * @return True on success, otherwise false - */ -static bool LZSS_Decompress(const u8* compressed, u32 compressed_size, u8* decompressed, - u32 decompressed_size) { - const u8* footer = compressed + compressed_size - 8; - u32 buffer_top_and_bottom = *reinterpret_cast<const u32*>(footer); - u32 out = decompressed_size; - u32 index = compressed_size - ((buffer_top_and_bottom >> 24) & 0xFF); - u32 stop_index = compressed_size - (buffer_top_and_bottom & 0xFFFFFF); - - memset(decompressed, 0, decompressed_size); - memcpy(decompressed, compressed, compressed_size); - - while (index > stop_index) { - u8 control = compressed[--index]; - - for (unsigned i = 0; i < 8; i++) { - if (index <= stop_index) - break; - if (index <= 0) - break; - if (out <= 0) - break; - - if (control & 0x80) { - // Check if compression is out of bounds - if (index < 2) - return false; - index -= 2; - - u32 segment_offset = compressed[index] | (compressed[index + 1] << 8); - u32 segment_size = ((segment_offset >> 12) & 15) + 3; - segment_offset &= 0x0FFF; - segment_offset += 2; - - // Check if compression is out of bounds - if (out < segment_size) - return false; - - for (unsigned j = 0; j < segment_size; j++) { - // Check if compression is out of bounds - if (out + segment_offset >= decompressed_size) - return false; - - u8 data = decompressed[out + segment_offset]; - decompressed[--out] = data; - } - } else { - // Check if compression is out of bounds - if (out < 1) - return false; - decompressed[--out] = compressed[--index]; - } - control <<= 1; - } - } - return true; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// AppLoader_NCCH class +static const u64 UPDATE_MASK = 0x0000000e00000000; FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) { u32 magic; @@ -121,203 +46,105 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) { return FileType::Error; } +static std::string GetUpdateNCCHPath(u64_le program_id) { + u32 high = static_cast<u32>((program_id | UPDATE_MASK) >> 32); + u32 low = static_cast<u32>((program_id | UPDATE_MASK) & 0xFFFFFFFF); + + // TODO(shinyquagsire23): Title database should be doing this path lookup + std::string content_path = Common::StringFromFormat( + "%sNintendo 3DS/%s/%s/title/%08x/%08x/content/", FileUtil::GetUserPath(D_SDMC_IDX).c_str(), + SYSTEM_ID, SDCARD_ID, high, low); + std::string tmd_path = content_path + "00000000.tmd"; + + u32 content_id = 0; + FileSys::TitleMetadata tmd(tmd_path); + if (tmd.Load() == ResultStatus::Success) { + content_id = tmd.GetBootContentID(); + } + + return Common::StringFromFormat("%s%08x.app", content_path.c_str(), content_id); +} + std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() { if (!is_loaded) { - ResultStatus res = LoadExeFS(); + ResultStatus res = base_ncch.Load(); if (res != ResultStatus::Success) { return std::make_pair(boost::none, res); } } + // Set the system mode as the one from the exheader. - return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(), + return std::make_pair(overlay_ncch->exheader_header.arm11_system_local_caps.system_mode.Value(), ResultStatus::Success); } -ResultStatus AppLoader_NCCH::LoadExec() { - using Kernel::SharedPtr; +ResultStatus AppLoader_NCCH::LoadExec(Kernel::SharedPtr<Kernel::Process>& process) { using Kernel::CodeSet; + using Kernel::SharedPtr; if (!is_loaded) return ResultStatus::ErrorNotLoaded; std::vector<u8> code; - if (ResultStatus::Success == ReadCode(code)) { + u64_le program_id; + if (ResultStatus::Success == ReadCode(code) && + ResultStatus::Success == ReadProgramId(program_id)) { std::string process_name = Common::StringFromFixedZeroTerminatedBuffer( - (const char*)exheader_header.codeset_info.name, 8); + (const char*)overlay_ncch->exheader_header.codeset_info.name, 8); - SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, ncch_header.program_id); + SharedPtr<CodeSet> codeset = CodeSet::Create(process_name, program_id); codeset->code.offset = 0; - codeset->code.addr = exheader_header.codeset_info.text.address; - codeset->code.size = exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE; + codeset->code.addr = overlay_ncch->exheader_header.codeset_info.text.address; + codeset->code.size = + overlay_ncch->exheader_header.codeset_info.text.num_max_pages * Memory::PAGE_SIZE; codeset->rodata.offset = codeset->code.offset + codeset->code.size; - codeset->rodata.addr = exheader_header.codeset_info.ro.address; - codeset->rodata.size = exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE; + codeset->rodata.addr = overlay_ncch->exheader_header.codeset_info.ro.address; + codeset->rodata.size = + overlay_ncch->exheader_header.codeset_info.ro.num_max_pages * Memory::PAGE_SIZE; // TODO(yuriks): Not sure if the bss size is added to the page-aligned .data size or just // to the regular size. Playing it safe for now. - u32 bss_page_size = (exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF; + u32 bss_page_size = (overlay_ncch->exheader_header.codeset_info.bss_size + 0xFFF) & ~0xFFF; code.resize(code.size() + bss_page_size, 0); codeset->data.offset = codeset->rodata.offset + codeset->rodata.size; - codeset->data.addr = exheader_header.codeset_info.data.address; + codeset->data.addr = overlay_ncch->exheader_header.codeset_info.data.address; codeset->data.size = - exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE + bss_page_size; + overlay_ncch->exheader_header.codeset_info.data.num_max_pages * Memory::PAGE_SIZE + + bss_page_size; codeset->entrypoint = codeset->code.addr; codeset->memory = std::make_shared<std::vector<u8>>(std::move(code)); - Kernel::g_current_process = Kernel::Process::Create("main"); - Kernel::g_current_process->LoadModule(codeset, codeset->entrypoint); + process = Kernel::Process::Create("main"); + process->LoadModule(codeset, codeset->entrypoint); // Attach a resource limit to the process based on the resource limit category - Kernel::g_current_process->resource_limit = + process->resource_limit = Kernel::ResourceLimit::GetForCategory(static_cast<Kernel::ResourceLimitCategory>( - exheader_header.arm11_system_local_caps.resource_limit_category)); + overlay_ncch->exheader_header.arm11_system_local_caps.resource_limit_category)); // Set the default CPU core for this process - Kernel::g_current_process->ideal_processor = - exheader_header.arm11_system_local_caps.ideal_processor; + process->ideal_processor = + overlay_ncch->exheader_header.arm11_system_local_caps.ideal_processor; // Copy data while converting endianness - std::array<u32, ARRAY_SIZE(exheader_header.arm11_kernel_caps.descriptors)> kernel_caps; - std::copy_n(exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(), + std::array<u32, ARRAY_SIZE(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors)> + kernel_caps; + std::copy_n(overlay_ncch->exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(), begin(kernel_caps)); - Kernel::g_current_process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size()); + process->ParseKernelCaps(kernel_caps.data(), kernel_caps.size()); - s32 priority = exheader_header.arm11_system_local_caps.priority; - u32 stack_size = exheader_header.codeset_info.stack_size; - Kernel::g_current_process->Run(codeset->entrypoint, priority, stack_size); + s32 priority = overlay_ncch->exheader_header.arm11_system_local_caps.priority; + u32 stack_size = overlay_ncch->exheader_header.codeset_info.stack_size; + process->Run(codeset->entrypoint, priority, stack_size); return ResultStatus::Success; } return ResultStatus::Error; } -ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>& buffer) { - if (!file.IsOpen()) - return ResultStatus::Error; - - ResultStatus result = LoadExeFS(); - if (result != ResultStatus::Success) - return result; - - LOG_DEBUG(Loader, "%d sections:", kMaxSections); - // Iterate through the ExeFs archive until we find a section with the specified name... - for (unsigned section_number = 0; section_number < kMaxSections; section_number++) { - const auto& section = exefs_header.section[section_number]; - - // Load the specified section... - if (strcmp(section.name, name) == 0) { - LOG_DEBUG(Loader, "%d - offset: 0x%08X, size: 0x%08X, name: %s", section_number, - section.offset, section.size, section.name); - - s64 section_offset = - (section.offset + exefs_offset + sizeof(ExeFs_Header) + ncch_offset); - file.Seek(section_offset, SEEK_SET); - - if (strcmp(section.name, ".code") == 0 && is_compressed) { - // Section is compressed, read compressed .code section... - std::unique_ptr<u8[]> temp_buffer; - try { - temp_buffer.reset(new u8[section.size]); - } catch (std::bad_alloc&) { - return ResultStatus::ErrorMemoryAllocationFailed; - } - - if (file.ReadBytes(&temp_buffer[0], section.size) != section.size) - return ResultStatus::Error; - - // Decompress .code section... - u32 decompressed_size = LZSS_GetDecompressedSize(&temp_buffer[0], section.size); - buffer.resize(decompressed_size); - if (!LZSS_Decompress(&temp_buffer[0], section.size, &buffer[0], decompressed_size)) - return ResultStatus::ErrorInvalidFormat; - } else { - // Section is uncompressed... - buffer.resize(section.size); - if (file.ReadBytes(&buffer[0], section.size) != section.size) - return ResultStatus::Error; - } - return ResultStatus::Success; - } - } - return ResultStatus::ErrorNotUsed; -} - -ResultStatus AppLoader_NCCH::LoadExeFS() { - if (is_exefs_loaded) - return ResultStatus::Success; - - if (!file.IsOpen()) - return ResultStatus::Error; - - // Reset read pointer in case this file has been read before. - file.Seek(0, SEEK_SET); - - if (file.ReadBytes(&ncch_header, sizeof(NCCH_Header)) != sizeof(NCCH_Header)) - return ResultStatus::Error; - - // Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)... - if (MakeMagic('N', 'C', 'S', 'D') == ncch_header.magic) { - LOG_DEBUG(Loader, "Only loading the first (bootable) NCCH within the NCSD file!"); - ncch_offset = 0x4000; - file.Seek(ncch_offset, SEEK_SET); - file.ReadBytes(&ncch_header, sizeof(NCCH_Header)); - } - - // Verify we are loading the correct file type... - if (MakeMagic('N', 'C', 'C', 'H') != ncch_header.magic) - return ResultStatus::ErrorInvalidFormat; - - // Read ExHeader... - - if (file.ReadBytes(&exheader_header, sizeof(ExHeader_Header)) != sizeof(ExHeader_Header)) - return ResultStatus::Error; - - is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1; - entry_point = exheader_header.codeset_info.text.address; - code_size = exheader_header.codeset_info.text.code_size; - stack_size = exheader_header.codeset_info.stack_size; - bss_size = exheader_header.codeset_info.bss_size; - core_version = exheader_header.arm11_system_local_caps.core_version; - priority = exheader_header.arm11_system_local_caps.priority; - resource_limit_category = exheader_header.arm11_system_local_caps.resource_limit_category; - - LOG_DEBUG(Loader, "Name: %s", exheader_header.codeset_info.name); - LOG_DEBUG(Loader, "Program ID: %016" PRIX64, ncch_header.program_id); - LOG_DEBUG(Loader, "Code compressed: %s", is_compressed ? "yes" : "no"); - LOG_DEBUG(Loader, "Entry point: 0x%08X", entry_point); - LOG_DEBUG(Loader, "Code size: 0x%08X", code_size); - LOG_DEBUG(Loader, "Stack size: 0x%08X", stack_size); - LOG_DEBUG(Loader, "Bss size: 0x%08X", bss_size); - LOG_DEBUG(Loader, "Core version: %d", core_version); - LOG_DEBUG(Loader, "Thread priority: 0x%X", priority); - LOG_DEBUG(Loader, "Resource limit category: %d", resource_limit_category); - LOG_DEBUG(Loader, "System Mode: %d", - static_cast<int>(exheader_header.arm11_system_local_caps.system_mode)); - - if (exheader_header.arm11_system_local_caps.program_id != ncch_header.program_id) { - LOG_ERROR(Loader, "ExHeader Program ID mismatch: the ROM is probably encrypted."); - return ResultStatus::ErrorEncrypted; - } - - // Read ExeFS... - - exefs_offset = ncch_header.exefs_offset * kBlockSize; - u32 exefs_size = ncch_header.exefs_size * kBlockSize; - - LOG_DEBUG(Loader, "ExeFS offset: 0x%08X", exefs_offset); - LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size); - - file.Seek(exefs_offset + ncch_offset, SEEK_SET); - if (file.ReadBytes(&exefs_header, sizeof(ExeFs_Header)) != sizeof(ExeFs_Header)) - return ResultStatus::Error; - - is_exefs_loaded = true; - return ResultStatus::Success; -} - void AppLoader_NCCH::ParseRegionLockoutInfo() { std::vector<u8> smdh_buffer; if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) { @@ -335,28 +162,43 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() { } } -ResultStatus AppLoader_NCCH::Load() { +ResultStatus AppLoader_NCCH::Load(Kernel::SharedPtr<Kernel::Process>& process) { + u64_le ncch_program_id; + if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; - ResultStatus result = LoadExeFS(); + ResultStatus result = base_ncch.Load(); if (result != ResultStatus::Success) return result; - std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_header.program_id)}; + ReadProgramId(ncch_program_id); + std::string program_id{Common::StringFromFormat("%016" PRIX64, ncch_program_id)}; LOG_INFO(Loader, "Program ID: %s", program_id.c_str()); + update_ncch.OpenFile(GetUpdateNCCHPath(ncch_program_id)); + result = update_ncch.Load(); + if (result == ResultStatus::Success) { + overlay_ncch = &update_ncch; + } + Core::Telemetry().AddField(Telemetry::FieldType::Session, "ProgramId", program_id); + if (auto room_member = Network::GetRoomMember().lock()) { + Network::GameInfo game_info; + ReadTitle(game_info.name); + game_info.id = ncch_program_id; + room_member->SendGameInfo(game_info); + } + is_loaded = true; // Set state to loaded - result = LoadExec(); // Load the executable into memory for booting + result = LoadExec(process); // Load the executable into memory for booting if (ResultStatus::Success != result) return result; - Service::FS::RegisterArchiveType(std::make_unique<FileSys::ArchiveFactory_SelfNCCH>(*this), - Service::FS::ArchiveIdCode::SelfNCCH); + Service::FS::RegisterSelfNCCH(*this); ParseRegionLockoutInfo(); @@ -364,61 +206,58 @@ ResultStatus AppLoader_NCCH::Load() { } ResultStatus AppLoader_NCCH::ReadCode(std::vector<u8>& buffer) { - return LoadSectionExeFS(".code", buffer); + return overlay_ncch->LoadSectionExeFS(".code", buffer); } ResultStatus AppLoader_NCCH::ReadIcon(std::vector<u8>& buffer) { - return LoadSectionExeFS("icon", buffer); + return overlay_ncch->LoadSectionExeFS("icon", buffer); } ResultStatus AppLoader_NCCH::ReadBanner(std::vector<u8>& buffer) { - return LoadSectionExeFS("banner", buffer); + return overlay_ncch->LoadSectionExeFS("banner", buffer); } ResultStatus AppLoader_NCCH::ReadLogo(std::vector<u8>& buffer) { - return LoadSectionExeFS("logo", buffer); + return overlay_ncch->LoadSectionExeFS("logo", buffer); } ResultStatus AppLoader_NCCH::ReadProgramId(u64& out_program_id) { - if (!file.IsOpen()) - return ResultStatus::Error; - - ResultStatus result = LoadExeFS(); + ResultStatus result = base_ncch.ReadProgramId(out_program_id); if (result != ResultStatus::Success) return result; - out_program_id = ncch_header.program_id; return ResultStatus::Success; } ResultStatus AppLoader_NCCH::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) { - if (!file.IsOpen()) - return ResultStatus::Error; + return base_ncch.ReadRomFS(romfs_file, offset, size); +} - // Check if the NCCH has a RomFS... - if (ncch_header.romfs_offset != 0 && ncch_header.romfs_size != 0) { - u32 romfs_offset = ncch_offset + (ncch_header.romfs_offset * kBlockSize) + 0x1000; - u32 romfs_size = (ncch_header.romfs_size * kBlockSize) - 0x1000; +ResultStatus AppLoader_NCCH::ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, + u64& offset, u64& size) { + ResultStatus result = update_ncch.ReadRomFS(romfs_file, offset, size); - LOG_DEBUG(Loader, "RomFS offset: 0x%08X", romfs_offset); - LOG_DEBUG(Loader, "RomFS size: 0x%08X", romfs_size); + if (result != ResultStatus::Success) + return base_ncch.ReadRomFS(romfs_file, offset, size); +} - if (file.GetSize() < romfs_offset + romfs_size) - return ResultStatus::Error; +ResultStatus AppLoader_NCCH::ReadTitle(std::string& title) { + std::vector<u8> data; + Loader::SMDH smdh; + ReadIcon(data); - // We reopen the file, to allow its position to be independent from file's - romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb"); - if (!romfs_file->IsOpen()) - return ResultStatus::Error; + if (!Loader::IsValidSMDH(data)) { + return ResultStatus::ErrorInvalidFormat; + } - offset = romfs_offset; - size = romfs_size; + memcpy(&smdh, data.data(), sizeof(Loader::SMDH)); - return ResultStatus::Success; - } - LOG_DEBUG(Loader, "NCCH has no RomFS"); - return ResultStatus::ErrorNotUsed; + const auto& short_title = smdh.GetShortTitle(SMDH::TitleLanguage::English); + auto title_end = std::find(short_title.begin(), short_title.end(), u'\0'); + title = Common::UTF16ToUTF8(std::u16string{short_title.begin(), title_end}); + + return ResultStatus::Success; } } // namespace Loader diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h index 0ebd47fd5..09230ae33 100644 --- a/src/core/loader/ncch.h +++ b/src/core/loader/ncch.h @@ -5,155 +5,12 @@ #pragma once #include <memory> -#include "common/bit_field.h" #include "common/common_types.h" #include "common/swap.h" +#include "core/file_sys/ncch_container.h" #include "core/loader/loader.h" //////////////////////////////////////////////////////////////////////////////////////////////////// -/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym) - -struct NCCH_Header { - u8 signature[0x100]; - u32_le magic; - u32_le content_size; - u8 partition_id[8]; - u16_le maker_code; - u16_le version; - u8 reserved_0[4]; - u64_le program_id; - u8 reserved_1[0x10]; - u8 logo_region_hash[0x20]; - u8 product_code[0x10]; - u8 extended_header_hash[0x20]; - u32_le extended_header_size; - u8 reserved_2[4]; - u8 flags[8]; - u32_le plain_region_offset; - u32_le plain_region_size; - u32_le logo_region_offset; - u32_le logo_region_size; - u32_le exefs_offset; - u32_le exefs_size; - u32_le exefs_hash_region_size; - u8 reserved_3[4]; - u32_le romfs_offset; - u32_le romfs_size; - u32_le romfs_hash_region_size; - u8 reserved_4[4]; - u8 exefs_super_block_hash[0x20]; - u8 romfs_super_block_hash[0x20]; -}; - -static_assert(sizeof(NCCH_Header) == 0x200, "NCCH header structure size is wrong"); - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// ExeFS (executable file system) headers - -struct ExeFs_SectionHeader { - char name[8]; - u32 offset; - u32 size; -}; - -struct ExeFs_Header { - ExeFs_SectionHeader section[8]; - u8 reserved[0x80]; - u8 hashes[8][0x20]; -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// ExHeader (executable file system header) headers - -struct ExHeader_SystemInfoFlags { - u8 reserved[5]; - u8 flag; - u8 remaster_version[2]; -}; - -struct ExHeader_CodeSegmentInfo { - u32 address; - u32 num_max_pages; - u32 code_size; -}; - -struct ExHeader_CodeSetInfo { - u8 name[8]; - ExHeader_SystemInfoFlags flags; - ExHeader_CodeSegmentInfo text; - u32 stack_size; - ExHeader_CodeSegmentInfo ro; - u8 reserved[4]; - ExHeader_CodeSegmentInfo data; - u32 bss_size; -}; - -struct ExHeader_DependencyList { - u8 program_id[0x30][8]; -}; - -struct ExHeader_SystemInfo { - u64 save_data_size; - u8 jump_id[8]; - u8 reserved_2[0x30]; -}; - -struct ExHeader_StorageInfo { - u8 ext_save_data_id[8]; - u8 system_save_data_id[8]; - u8 reserved[8]; - u8 access_info[7]; - u8 other_attributes; -}; - -struct ExHeader_ARM11_SystemLocalCaps { - u64_le program_id; - u32_le core_version; - u8 reserved_flags[2]; - union { - u8 flags0; - BitField<0, 2, u8> ideal_processor; - BitField<2, 2, u8> affinity_mask; - BitField<4, 4, u8> system_mode; - }; - u8 priority; - u8 resource_limit_descriptor[0x10][2]; - ExHeader_StorageInfo storage_info; - u8 service_access_control[0x20][8]; - u8 ex_service_access_control[0x2][8]; - u8 reserved[0xf]; - u8 resource_limit_category; -}; - -struct ExHeader_ARM11_KernelCaps { - u32_le descriptors[28]; - u8 reserved[0x10]; -}; - -struct ExHeader_ARM9_AccessControl { - u8 descriptors[15]; - u8 descversion; -}; - -struct ExHeader_Header { - ExHeader_CodeSetInfo codeset_info; - ExHeader_DependencyList dependency_list; - ExHeader_SystemInfo system_info; - ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps; - ExHeader_ARM11_KernelCaps arm11_kernel_caps; - ExHeader_ARM9_AccessControl arm9_access_control; - struct { - u8 signature[0x100]; - u8 ncch_public_key_modulus[0x100]; - ExHeader_ARM11_SystemLocalCaps arm11_system_local_caps; - ExHeader_ARM11_KernelCaps arm11_kernel_caps; - ExHeader_ARM9_AccessControl arm9_access_control; - } access_desc; -}; - -static_assert(sizeof(ExHeader_Header) == 0x800, "ExHeader structure size is wrong"); - -//////////////////////////////////////////////////////////////////////////////////////////////////// // Loader namespace namespace Loader { @@ -162,7 +19,8 @@ namespace Loader { class AppLoader_NCCH final : public AppLoader { public: AppLoader_NCCH(FileUtil::IOFile&& file, const std::string& filepath) - : AppLoader(std::move(file)), filepath(filepath) {} + : AppLoader(std::move(file)), filepath(filepath), base_ncch(filepath), + overlay_ncch(&base_ncch) {} /** * Returns the type of the file @@ -175,7 +33,7 @@ public: return IdentifyType(file); } - ResultStatus Load() override; + ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; /** * Loads the Exheader and returns the system mode for this application. @@ -191,63 +49,30 @@ public: ResultStatus ReadLogo(std::vector<u8>& buffer) override; - /** - * Get the program id of the application - * @param out_program_id Reference to store program id into - * @return ResultStatus result of function - */ ResultStatus ReadProgramId(u64& out_program_id) override; - /** - * Get the RomFS of the application - * @param romfs_file Reference to buffer to store data - * @param offset Offset in the file to the RomFS - * @param size Size of the RomFS in bytes - * @return ResultStatus result of function - */ ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) override; -private: - /** - * Reads an application ExeFS section of an NCCH file into AppLoader (e.g. .code, .logo, etc.) - * @param name Name of section to read out of NCCH file - * @param buffer Vector to read data into - * @return ResultStatus result of function - */ - ResultStatus LoadSectionExeFS(const char* name, std::vector<u8>& buffer); + ResultStatus ReadUpdateRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, + u64& size) override; - /** - * Loads .code section into memory for booting - * @return ResultStatus result of function - */ - ResultStatus LoadExec(); + ResultStatus ReadTitle(std::string& title) override; +private: /** - * Ensure ExeFS is loaded and ready for reading sections + * Loads .code section into memory for booting + * @param process The newly created process * @return ResultStatus result of function */ - ResultStatus LoadExeFS(); + ResultStatus LoadExec(Kernel::SharedPtr<Kernel::Process>& process); /// Reads the region lockout info in the SMDH and send it to CFG service void ParseRegionLockoutInfo(); - bool is_exefs_loaded = false; - bool is_compressed = false; - - u32 entry_point = 0; - u32 code_size = 0; - u32 stack_size = 0; - u32 bss_size = 0; - u32 core_version = 0; - u8 priority = 0; - u8 resource_limit_category = 0; - u32 ncch_offset = 0; // Offset to NCCH header, can be 0 or after NCSD header - u32 exefs_offset = 0; - - NCCH_Header ncch_header; - ExeFs_Header exefs_header; - ExHeader_Header exheader_header; + FileSys::NCCHContainer base_ncch; + FileSys::NCCHContainer update_ncch; + FileSys::NCCHContainer* overlay_ncch; std::string filepath; }; diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 753e7e08b..24c2c55a9 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -132,7 +132,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) { return true; } -ResultStatus AppLoader_NRO::Load() { +ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } @@ -142,16 +142,16 @@ ResultStatus AppLoader_NRO::Load() { // Load and relocate "main" and "sdk" NSO static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; - Kernel::g_current_process = Kernel::Process::Create("main"); + process = Kernel::Process::Create("main"); if (!LoadNro(filepath, base_addr)) { return ResultStatus::ErrorInvalidFormat; } - Kernel::g_current_process->svc_access_mask.set(); - Kernel::g_current_process->address_mappings = default_address_mappings; - Kernel::g_current_process->resource_limit = + process->svc_access_mask.set(); + process->address_mappings = default_address_mappings; + process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); - Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); + process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); ResolveImports(); diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h index c3c7622fd..c85768c5b 100644 --- a/src/core/loader/nro.h +++ b/src/core/loader/nro.h @@ -31,7 +31,7 @@ public: return IdentifyType(file); } - ResultStatus Load() override; + ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; private: bool LoadNro(const std::string& path, VAddr load_base); diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index ac8d12ecc..b1b57d0c0 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -144,7 +144,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo return load_base + image_size; } -ResultStatus AppLoader_NSO::Load() { +ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { if (is_loaded) { return ResultStatus::ErrorAlreadyLoaded; } @@ -154,7 +154,7 @@ ResultStatus AppLoader_NSO::Load() { // Load and relocate "rtld" NSO static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; - Kernel::g_current_process = Kernel::Process::Create("main"); + process = Kernel::Process::Create("main"); VAddr next_base_addr{LoadNso(filepath, base_addr)}; if (!next_base_addr) { return ResultStatus::ErrorInvalidFormat; @@ -170,11 +170,11 @@ ResultStatus AppLoader_NSO::Load() { } } - Kernel::g_current_process->svc_access_mask.set(); - Kernel::g_current_process->address_mappings = default_address_mappings; - Kernel::g_current_process->resource_limit = + process->svc_access_mask.set(); + process->address_mappings = default_address_mappings; + process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); - Kernel::g_current_process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); + process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); ResolveImports(); diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index c29803d81..b6b86c209 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h @@ -32,7 +32,7 @@ public: return IdentifyType(file); } - ResultStatus Load() override; + ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; private: VAddr LoadNso(const std::string& path, VAddr load_base, bool relocate = false); diff --git a/src/core/memory.cpp b/src/core/memory.cpp index ebe16b030..462d68386 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -4,95 +4,53 @@ #include <array> #include <cstring> +#include "audio_core/audio_core.h" #include "common/assert.h" #include "common/common_types.h" #include "common/logging/log.h" #include "common/swap.h" +#include "core/arm/arm_interface.h" +#include "core/core.h" +#include "core/hle/kernel/memory.h" #include "core/hle/kernel/process.h" +#include "core/hle/lock.h" #include "core/memory.h" #include "core/memory_setup.h" -#include "core/mmio.h" #include "video_core/renderer_base.h" #include "video_core/video_core.h" namespace Memory { -enum class PageType { - /// Page is unmapped and should cause an access error. - Unmapped, - /// Page is mapped to regular memory. This is the only type you can get pointers to. - Memory, - /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and - /// invalidation - RasterizerCachedMemory, - /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions. - Special, - /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and - /// invalidation - RasterizerCachedSpecial, -}; - -struct SpecialRegion { - VAddr base; - u64 size; - MMIORegionPointer handler; -}; +static std::array<u8, Memory::VRAM_SIZE> vram; +static std::array<u8, Memory::N3DS_EXTRA_RAM_SIZE> n3ds_extra_ram; -/** - * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely - * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and - * fetching requirements when accessing. In the usual case of an access to regular memory, it only - * requires an indexed fetch and a check for NULL. - */ -struct PageTable { - /** - * Array of memory pointers backing each page. An entry can only be non-null if the - * corresponding entry in the `attributes` array is of type `Memory`. - */ - std::map<u64, u8*> pointers; - - /** - * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of - * type `Special`. - */ - std::vector<SpecialRegion> special_regions; - - /** - * Array of fine grained page attributes. If it is set to any value other than `Memory`, then - * the corresponding entry in `pointers` MUST be set to null. - */ - std::map<u64, PageType> attributes; - - /** - * Indicates the number of externally cached resources touching a page that should be - * flushed before the memory is accessed - */ - std::map<u64, u8> cached_res_count; -}; - -/// Singular page table used for the singleton process -static PageTable main_page_table; -/// Currently active page table -static PageTable* current_page_table = &main_page_table; - -//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers() { -// return ¤t_page_table->pointers; -//} - -static void MapPages(u64 base, u64 size, u8* memory, PageType type) { +static PageTable* current_page_table = nullptr; + +void SetCurrentPageTable(PageTable* page_table) { + current_page_table = page_table; + if (Core::System::GetInstance().IsPoweredOn()) { + Core::CPU().PageTableChanged(); + } +} + +PageTable* GetCurrentPageTable() { + return current_page_table; +} + +static void MapPages(PageTable& page_table, VAddr base, u32 size, u8* memory, PageType type) { LOG_DEBUG(HW_Memory, "Mapping %p onto %08X-%08X", memory, base * PAGE_SIZE, (base + size) * PAGE_SIZE); RasterizerFlushVirtualRegion(base << PAGE_BITS, size * PAGE_SIZE, FlushMode::FlushAndInvalidate); - u64 end = base + size; + VAddr end = base + size; while (base != end) { ASSERT_MSG(base < PAGE_TABLE_NUM_ENTRIES, "out of range mapping at %08X", base); - current_page_table->attributes[base] = type; - current_page_table->pointers[base] = memory; - current_page_table->cached_res_count[base] = 0; + page_table.attributes[base] = type; + page_table.pointers[base] = memory; + page_table.cached_res_count[base] = 0; base += 1; if (memory != nullptr) @@ -100,40 +58,34 @@ static void MapPages(u64 base, u64 size, u8* memory, PageType type) { } } -void InitMemoryMap() { - //main_page_table.pointers.fill(nullptr); - //main_page_table.attributes.fill(PageType::Unmapped); - //main_page_table.cached_res_count.fill(0); -} - -void MapMemoryRegion(VAddr base, u64 size, u8* target) { +void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target) { ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); - MapPages(base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory); + MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, PageType::Memory); } -void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler) { +void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler) { ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); - MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special); + MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Special); - current_page_table->special_regions.emplace_back(SpecialRegion{base, size, mmio_handler}); + page_table.special_regions.emplace_back(SpecialRegion{base, size, mmio_handler}); } -void UnmapRegion(VAddr base, u64 size) { +void UnmapRegion(PageTable& page_table, VAddr base, u32 size) { ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: %08X", size); ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: %08X", base); - MapPages(base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped); + MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, nullptr, PageType::Unmapped); } /** * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned) * using a VMA from the current process */ -static u8* GetPointerFromVMA(VAddr vaddr) { +static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) { u8* direct_pointer = nullptr; - auto& vm_manager = Kernel::g_current_process->vm_manager; + auto& vm_manager = process.vm_manager; auto it = vm_manager.FindVMA(vaddr); ASSERT(it != vm_manager.vma_map.end()); @@ -156,10 +108,18 @@ static u8* GetPointerFromVMA(VAddr vaddr) { } /** + * Gets a pointer to the exact memory at the virtual address (i.e. not page aligned) + * using a VMA from the current process. + */ +static u8* GetPointerFromVMA(VAddr vaddr) { + return GetPointerFromVMA(*Kernel::g_current_process, vaddr); +} + +/** * This function should only be called for virtual addreses with attribute `PageType::Special`. */ -static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { - for (const auto& region : current_page_table->special_regions) { +static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) { + for (const auto& region : page_table.special_regions) { if (vaddr >= region.base && vaddr < (region.base + region.size)) { return region.handler; } @@ -168,6 +128,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { return nullptr; // Should never happen } +static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { + const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table; + return GetMMIOHandler(page_table, vaddr); +} + template <typename T> T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); @@ -181,10 +146,13 @@ T Read(const VAddr vaddr) { return value; } + // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (type) { case PageType::Unmapped: - LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%llx", sizeof(T) * 8, vaddr); + LOG_ERROR(HW_Memory, "unmapped Read%lu @ 0x%08X", sizeof(T) * 8, vaddr); return 0; case PageType::Memory: ASSERT_MSG(false, "Mapped memory page without a pointer @ %08X", vaddr); @@ -219,10 +187,13 @@ void Write(const VAddr vaddr, const T data) { return; } + // The memory access might do an MMIO or cached access, so we have to lock the HLE kernel state + std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock); + PageType type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (type) { case PageType::Unmapped: - LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%llx @ 0x%llx", sizeof(data) * 8, (u64)data, + LOG_ERROR(HW_Memory, "unmapped Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data, vaddr); return; case PageType::Memory: @@ -246,18 +217,20 @@ void Write(const VAddr vaddr, const T data) { } } -bool IsValidVirtualAddress(const VAddr vaddr) { - const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; +bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) { + auto& page_table = process.vm_manager.page_table; + + const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS]; if (page_pointer) return true; - if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) + if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) return true; - if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special) + if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special) return false; - MMIORegionPointer mmio_region = GetMMIOHandler(vaddr); + MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr); if (mmio_region) { return mmio_region->IsValidAddress(vaddr); } @@ -265,9 +238,12 @@ bool IsValidVirtualAddress(const VAddr vaddr) { return false; } +bool IsValidVirtualAddress(const VAddr vaddr) { + return IsValidVirtualAddress(*Kernel::g_current_process, vaddr); +} + bool IsValidPhysicalAddress(const PAddr paddr) { - boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(paddr); - return vaddr && IsValidVirtualAddress(*vaddr); + return GetPhysicalPointer(paddr) != nullptr; } u8* GetPointer(const VAddr vaddr) { @@ -280,7 +256,7 @@ u8* GetPointer(const VAddr vaddr) { return GetPointerFromVMA(vaddr); } - LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%llx", vaddr); + LOG_ERROR(HW_Memory, "unknown GetPointer @ 0x%08x", vaddr); return nullptr; } @@ -299,12 +275,66 @@ std::string ReadCString(VAddr vaddr, std::size_t max_length) { } u8* GetPhysicalPointer(PAddr address) { - // TODO(Subv): This call should not go through the application's memory mapping. - boost::optional<VAddr> vaddr = PhysicalToVirtualAddress(address); - return vaddr ? GetPointer(*vaddr) : nullptr; + struct MemoryArea { + PAddr paddr_base; + u32 size; + }; + + static constexpr MemoryArea memory_areas[] = { + {VRAM_PADDR, VRAM_SIZE}, + {IO_AREA_PADDR, IO_AREA_SIZE}, + {DSP_RAM_PADDR, DSP_RAM_SIZE}, + {FCRAM_PADDR, FCRAM_N3DS_SIZE}, + {N3DS_EXTRA_RAM_PADDR, N3DS_EXTRA_RAM_SIZE}, + }; + + const auto area = + std::find_if(std::begin(memory_areas), std::end(memory_areas), [&](const auto& area) { + return address >= area.paddr_base && address < area.paddr_base + area.size; + }); + + if (area == std::end(memory_areas)) { + LOG_ERROR(HW_Memory, "unknown GetPhysicalPointer @ 0x%08X", address); + return nullptr; + } + + if (area->paddr_base == IO_AREA_PADDR) { + LOG_ERROR(HW_Memory, "MMIO mappings are not supported yet. phys_addr=0x%08X", address); + return nullptr; + } + + u64 offset_into_region = address - area->paddr_base; + + u8* target_pointer = nullptr; + switch (area->paddr_base) { + case VRAM_PADDR: + target_pointer = vram.data() + offset_into_region; + break; + case DSP_RAM_PADDR: + target_pointer = AudioCore::GetDspMemory().data() + offset_into_region; + break; + case FCRAM_PADDR: + for (const auto& region : Kernel::memory_regions) { + if (offset_into_region >= region.base && + offset_into_region < region.base + region.size) { + target_pointer = + region.linear_heap_memory->data() + offset_into_region - region.base; + break; + } + } + ASSERT_MSG(target_pointer != nullptr, "Invalid FCRAM address"); + break; + case N3DS_EXTRA_RAM_PADDR: + target_pointer = n3ds_extra_ram.data() + offset_into_region; + break; + default: + UNREACHABLE(); + } + + return target_pointer; } -void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { +void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) { if (start == 0) { return; } @@ -314,8 +344,15 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { for (unsigned i = 0; i < num_pages; ++i, paddr += PAGE_SIZE) { boost::optional<VAddr> maybe_vaddr = PhysicalToVirtualAddress(paddr); - if (!maybe_vaddr) + // While the physical <-> virtual mapping is 1:1 for the regions supported by the cache, + // some games (like Pokemon Super Mystery Dungeon) will try to use textures that go beyond + // the end address of VRAM, causing the Virtual->Physical translation to fail when flushing + // parts of the texture. + if (!maybe_vaddr) { + LOG_ERROR(HW_Memory, + "Trying to flush a cached region to an invalid physical address %08X", paddr); continue; + } VAddr vaddr = *maybe_vaddr; u8& res_count = current_page_table->cached_res_count[vaddr >> PAGE_BITS]; @@ -327,6 +364,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { if (res_count == 0) { PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (page_type) { + case PageType::Unmapped: + // It is not necessary for a process to have this region mapped into its address + // space, for example, a system module need not have a VRAM mapping. + break; case PageType::Memory: page_type = PageType::RasterizerCachedMemory; current_page_table->pointers[vaddr >> PAGE_BITS] = nullptr; @@ -345,6 +386,10 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { if (res_count == 0) { PageType& page_type = current_page_table->attributes[vaddr >> PAGE_BITS]; switch (page_type) { + case PageType::Unmapped: + // It is not necessary for a process to have this region mapped into its address + // space, for example, a system module need not have a VRAM mapping. + break; case PageType::RasterizerCachedMemory: { u8* pointer = GetPointerFromVMA(vaddr & ~PAGE_MASK); if (pointer == nullptr) { @@ -368,13 +413,13 @@ void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta) { } } -void RasterizerFlushRegion(PAddr start, u64 size) { +void RasterizerFlushRegion(PAddr start, u32 size) { if (VideoCore::g_renderer != nullptr) { VideoCore::g_renderer->Rasterizer()->FlushRegion(start, size); } } -void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) { +void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size) { // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be // null here if (VideoCore::g_renderer != nullptr) { @@ -382,7 +427,7 @@ void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size) { } } -void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { +void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode) { // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be // null here if (VideoCore::g_renderer != nullptr) { @@ -398,7 +443,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { VAddr overlap_end = std::min(end, region_end); PAddr physical_start = TryVirtualToPhysicalAddress(overlap_start).value(); - u64 overlap_size = overlap_end - overlap_start; + u32 overlap_size = static_cast<u32>(overlap_end - overlap_start); auto* rasterizer = VideoCore::g_renderer->Rasterizer(); switch (mode) { @@ -433,44 +478,50 @@ u64 Read64(const VAddr addr) { return Read<u64_le>(addr); } -void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) { +void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer, + const size_t size) { + auto& page_table = process.vm_manager.page_table; + size_t remaining_size = size; size_t page_index = src_addr >> PAGE_BITS; size_t page_offset = src_addr & PAGE_MASK; while (remaining_size > 0) { const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); - const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; + const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset); - switch (current_page_table->attributes[page_index]) { + switch (page_table.attributes[page_index]) { case PageType::Unmapped: { - LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%llx (start address = 0x%llx, size = %zu)", + LOG_ERROR(HW_Memory, "unmapped ReadBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, src_addr, size); std::memset(dest_buffer, 0, copy_amount); break; } case PageType::Memory: { - DEBUG_ASSERT(current_page_table->pointers[page_index]); + DEBUG_ASSERT(page_table.pointers[page_index]); - const u8* src_ptr = current_page_table->pointers[page_index] + page_offset; + const u8* src_ptr = page_table.pointers[page_index] + page_offset; std::memcpy(dest_buffer, src_ptr, copy_amount); break; } case PageType::Special: { - DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - - GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); + MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr); + DEBUG_ASSERT(handler); + handler->ReadBlock(current_vaddr, dest_buffer, copy_amount); break; } case PageType::RasterizerCachedMemory: { - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); - std::memcpy(dest_buffer, GetPointerFromVMA(current_vaddr), copy_amount); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::Flush); + std::memcpy(dest_buffer, GetPointerFromVMA(process, current_vaddr), copy_amount); break; } case PageType::RasterizerCachedSpecial: { - DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); - GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, dest_buffer, copy_amount); + MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr); + DEBUG_ASSERT(handler); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::Flush); + handler->ReadBlock(current_vaddr, dest_buffer, copy_amount); break; } default: @@ -484,6 +535,10 @@ void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) { } } +void ReadBlock(const VAddr src_addr, void* dest_buffer, const size_t size) { + ReadBlock(*Kernel::g_current_process, src_addr, dest_buffer, size); +} + void Write8(const VAddr addr, const u8 data) { Write<u8>(addr, data); } @@ -500,44 +555,49 @@ void Write64(const VAddr addr, const u64 data) { Write<u64_le>(addr, data); } -void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) { +void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer, + const size_t size) { + auto& page_table = process.vm_manager.page_table; size_t remaining_size = size; size_t page_index = dest_addr >> PAGE_BITS; size_t page_offset = dest_addr & PAGE_MASK; while (remaining_size > 0) { const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); - const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; + const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset); - switch (current_page_table->attributes[page_index]) { + switch (page_table.attributes[page_index]) { case PageType::Unmapped: { LOG_ERROR(HW_Memory, - "unmapped WriteBlock @ 0x%llx (start address = 0x%llx, size = %zu)", + "unmapped WriteBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, dest_addr, size); break; } case PageType::Memory: { - DEBUG_ASSERT(current_page_table->pointers[page_index]); + DEBUG_ASSERT(page_table.pointers[page_index]); - u8* dest_ptr = current_page_table->pointers[page_index] + page_offset; + u8* dest_ptr = page_table.pointers[page_index] + page_offset; std::memcpy(dest_ptr, src_buffer, copy_amount); break; } case PageType::Special: { - DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - - GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); + MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr); + DEBUG_ASSERT(handler); + handler->WriteBlock(current_vaddr, src_buffer, copy_amount); break; } case PageType::RasterizerCachedMemory: { - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); - std::memcpy(GetPointerFromVMA(current_vaddr), src_buffer, copy_amount); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::FlushAndInvalidate); + std::memcpy(GetPointerFromVMA(process, current_vaddr), src_buffer, copy_amount); break; } case PageType::RasterizerCachedSpecial: { - DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); - GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, src_buffer, copy_amount); + MMIORegionPointer handler = GetMMIOHandler(page_table, current_vaddr); + DEBUG_ASSERT(handler); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::FlushAndInvalidate); + handler->WriteBlock(current_vaddr, src_buffer, copy_amount); break; } default: @@ -551,6 +611,10 @@ void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size } } +void WriteBlock(const VAddr dest_addr, const void* src_buffer, const size_t size) { + WriteBlock(*Kernel::g_current_process, dest_addr, src_buffer, size); +} + void ZeroBlock(const VAddr dest_addr, const size_t size) { size_t remaining_size = size; size_t page_index = dest_addr >> PAGE_BITS; @@ -560,11 +624,11 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) { while (remaining_size > 0) { const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); - const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; + const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset); switch (current_page_table->attributes[page_index]) { case PageType::Unmapped: { - LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%llx (start address = 0x%llx, size = %zu)", + LOG_ERROR(HW_Memory, "unmapped ZeroBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, dest_addr, size); break; } @@ -582,13 +646,15 @@ void ZeroBlock(const VAddr dest_addr, const size_t size) { break; } case PageType::RasterizerCachedMemory: { - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::FlushAndInvalidate); std::memset(GetPointerFromVMA(current_vaddr), 0, copy_amount); break; } case PageType::RasterizerCachedSpecial: { DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::FlushAndInvalidate); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::FlushAndInvalidate); GetMMIOHandler(current_vaddr)->WriteBlock(current_vaddr, zeros.data(), copy_amount); break; } @@ -609,11 +675,11 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) { while (remaining_size > 0) { const size_t copy_amount = std::min(PAGE_SIZE - page_offset, remaining_size); - const VAddr current_vaddr = (page_index << PAGE_BITS) + page_offset; + const VAddr current_vaddr = static_cast<VAddr>((page_index << PAGE_BITS) + page_offset); switch (current_page_table->attributes[page_index]) { case PageType::Unmapped: { - LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%llx (start address = 0x%llx, size = %zu)", + LOG_ERROR(HW_Memory, "unmapped CopyBlock @ 0x%08X (start address = 0x%08X, size = %zu)", current_vaddr, src_addr, size); ZeroBlock(dest_addr, copy_amount); break; @@ -633,13 +699,15 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) { break; } case PageType::RasterizerCachedMemory: { - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::Flush); WriteBlock(dest_addr, GetPointerFromVMA(current_vaddr), copy_amount); break; } case PageType::RasterizerCachedSpecial: { DEBUG_ASSERT(GetMMIOHandler(current_vaddr)); - RasterizerFlushVirtualRegion(current_vaddr, copy_amount, FlushMode::Flush); + RasterizerFlushVirtualRegion(current_vaddr, static_cast<u32>(copy_amount), + FlushMode::Flush); std::vector<u8> buffer(copy_amount); GetMMIOHandler(current_vaddr)->ReadBlock(current_vaddr, buffer.data(), buffer.size()); @@ -652,8 +720,8 @@ void CopyBlock(VAddr dest_addr, VAddr src_addr, const size_t size) { page_index++; page_offset = 0; - dest_addr += copy_amount; - src_addr += copy_amount; + dest_addr += static_cast<VAddr>(copy_amount); + src_addr += static_cast<VAddr>(copy_amount); remaining_size -= copy_amount; } } @@ -721,7 +789,7 @@ boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) { PAddr VirtualToPhysicalAddress(const VAddr addr) { auto paddr = TryVirtualToPhysicalAddress(addr); if (!paddr) { - LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%llx", addr); + LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr); // To help with debugging, set bit on address so that it's obviously invalid. return addr | 0x80000000; } @@ -746,4 +814,4 @@ boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) { return boost::none; } -} // namespace +} // namespace Memory diff --git a/src/core/memory.h b/src/core/memory.h index e14d68654..9a04b9a16 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -6,9 +6,16 @@ #include <array> #include <cstddef> +#include <map> #include <string> +#include <vector> #include <boost/optional.hpp> #include "common/common_types.h" +#include "core/mmio.h" + +namespace Kernel { +class Process; +} namespace Memory { @@ -19,7 +26,60 @@ namespace Memory { const int PAGE_BITS = 12; const u64 PAGE_SIZE = 1 << PAGE_BITS; const u64 PAGE_MASK = PAGE_SIZE - 1; -const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (64 - PAGE_BITS); +const size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (32 - PAGE_BITS); + +enum class PageType { + /// Page is unmapped and should cause an access error. + Unmapped, + /// Page is mapped to regular memory. This is the only type you can get pointers to. + Memory, + /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and + /// invalidation + RasterizerCachedMemory, + /// Page is mapped to a I/O region. Writing and reading to this page is handled by functions. + Special, + /// Page is mapped to a I/O region, but also needs to check for rasterizer cache flushing and + /// invalidation + RasterizerCachedSpecial, +}; + +struct SpecialRegion { + VAddr base; + u32 size; + MMIORegionPointer handler; +}; + +/** + * A (reasonably) fast way of allowing switchable and remappable process address spaces. It loosely + * mimics the way a real CPU page table works, but instead is optimized for minimal decoding and + * fetching requirements when accessing. In the usual case of an access to regular memory, it only + * requires an indexed fetch and a check for NULL. + */ +struct PageTable { + /** + * Array of memory pointers backing each page. An entry can only be non-null if the + * corresponding entry in the `attributes` array is of type `Memory`. + */ + std::array<u8*, PAGE_TABLE_NUM_ENTRIES> pointers; + + /** + * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of + * type `Special`. + */ + std::vector<SpecialRegion> special_regions; + + /** + * Array of fine grained page attributes. If it is set to any value other than `Memory`, then + * the corresponding entry in `pointers` MUST be set to null. + */ + std::array<PageType, PAGE_TABLE_NUM_ENTRIES> attributes; + + /** + * Indicates the number of externally cached resources touching a page that should be + * flushed before the memory is accessed + */ + std::array<u8, PAGE_TABLE_NUM_ENTRIES> cached_res_count; +}; /// Physical memory regions as seen from the ARM11 enum : PAddr { @@ -126,7 +186,14 @@ enum : VAddr { NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE, }; +/// Currently active page table +void SetCurrentPageTable(PageTable* page_table); +PageTable* GetCurrentPageTable(); + +/// Determines if the given VAddr is valid for the specified process. +bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr); bool IsValidVirtualAddress(const VAddr addr); + bool IsValidPhysicalAddress(const PAddr addr); u8 Read8(VAddr addr); @@ -139,7 +206,11 @@ void Write16(VAddr addr, u16 data); void Write32(VAddr addr, u32 data); void Write64(VAddr addr, u64 data); +void ReadBlock(const Kernel::Process& process, const VAddr src_addr, void* dest_buffer, + size_t size); void ReadBlock(const VAddr src_addr, void* dest_buffer, size_t size); +void WriteBlock(const Kernel::Process& process, const VAddr dest_addr, const void* src_buffer, + size_t size); void WriteBlock(const VAddr dest_addr, const void* src_buffer, size_t size); void ZeroBlock(const VAddr dest_addr, const size_t size); void CopyBlock(VAddr dest_addr, VAddr src_addr, size_t size); @@ -169,8 +240,6 @@ boost::optional<VAddr> PhysicalToVirtualAddress(PAddr addr); /** * Gets a pointer to the memory region beginning at the specified physical address. - * - * @note This is currently implemented using PhysicalToVirtualAddress(). */ u8* GetPhysicalPointer(PAddr address); @@ -178,17 +247,17 @@ u8* GetPhysicalPointer(PAddr address); * Adds the supplied value to the rasterizer resource cache counter of each * page touching the region. */ -void RasterizerMarkRegionCached(PAddr start, u64 size, int count_delta); +void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta); /** * Flushes any externally cached rasterizer resources touching the given region. */ -void RasterizerFlushRegion(PAddr start, u64 size); +void RasterizerFlushRegion(PAddr start, u32 size); /** * Flushes and invalidates any externally cached rasterizer resources touching the given region. */ -void RasterizerFlushAndInvalidateRegion(PAddr start, u64 size); +void RasterizerFlushAndInvalidateRegion(PAddr start, u32 size); enum class FlushMode { /// Write back modified surfaces to RAM @@ -201,12 +270,6 @@ enum class FlushMode { * Flushes and invalidates any externally cached rasterizer resources touching the given virtual * address region. */ -void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode); +void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode); -/** - * Dynarmic has an optimization to memory accesses when the pointer to the page exists that - * can be used by setting up the current page table as a callback. This function is used to - * retrieve the current page table for that purpose. - */ -//std::array<u8*, PAGE_TABLE_NUM_ENTRIES>* GetCurrentPageTablePointers(); -} +} // namespace Memory diff --git a/src/core/memory_setup.h b/src/core/memory_setup.h index fc3fda466..c58baa50b 100644 --- a/src/core/memory_setup.h +++ b/src/core/memory_setup.h @@ -9,24 +9,24 @@ namespace Memory { -void InitMemoryMap(); - /** * Maps an allocated buffer onto a region of the emulated process address space. * + * @param page_table The page table of the emulated process. * @param base The address to start mapping at. Must be page-aligned. * @param size The amount of bytes to map. Must be page-aligned. * @param target Buffer with the memory backing the mapping. Must be of length at least `size`. */ -void MapMemoryRegion(VAddr base, u64 size, u8* target); +void MapMemoryRegion(PageTable& page_table, VAddr base, u32 size, u8* target); /** * Maps a region of the emulated process address space as a IO region. + * @param page_table The page table of the emulated process. * @param base The address to start mapping at. Must be page-aligned. * @param size The amount of bytes to map. Must be page-aligned. * @param mmio_handler The handler that backs the mapping. */ -void MapIoRegion(VAddr base, u64 size, MMIORegionPointer mmio_handler); +void MapIoRegion(PageTable& page_table, VAddr base, u32 size, MMIORegionPointer mmio_handler); -void UnmapRegion(VAddr base, u64 size); +void UnmapRegion(PageTable& page_table, VAddr base, u32 size); } diff --git a/src/core/settings.cpp b/src/core/settings.cpp index d4f0429d1..efcf1267d 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -36,4 +36,4 @@ void Apply() { Service::IR::ReloadInputDevices(); } -} // namespace +} // namespace Settings diff --git a/src/core/settings.h b/src/core/settings.h index ee16bb90a..8d78cb424 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -15,6 +15,7 @@ enum class LayoutOption { Default, SingleScreen, LargeScreen, + SideScreen, }; namespace NativeButton { @@ -70,7 +71,7 @@ enum Values { static const std::array<const char*, NumAnalogs> mapping = {{ "circle_pad", "c_stick", }}; -} // namespace NumAnalog +} // namespace NativeAnalog struct Values { // CheckNew3DS @@ -79,6 +80,8 @@ struct Values { // Controls std::array<std::string, NativeButton::NumButtons> buttons; std::array<std::string, NativeAnalog::NumAnalogs> analogs; + std::string motion_device; + std::string touch_device; // Core bool use_cpu_jit; @@ -128,7 +131,11 @@ struct Values { u16 gdbstub_port; // WebService + bool enable_telemetry; std::string telemetry_endpoint_url; + std::string verify_endpoint_url; + std::string citra_username; + std::string citra_token; } extern values; // a special value for Values::region_value indicating that citra will automatically select a region @@ -136,4 +143,4 @@ struct Values { static constexpr int REGION_VALUE_AUTO_SELECT = -1; void Apply(); -} +} // namespace Settings diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index 841d6cfa1..ca517ff44 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp @@ -3,15 +3,19 @@ // Refer to the license.txt file included. #include <cstring> +#include <cryptopp/osrng.h> #include "common/assert.h" +#include "common/file_util.h" #include "common/scm_rev.h" #include "common/x64/cpu_detect.h" +#include "core/core.h" #include "core/settings.h" #include "core/telemetry_session.h" #ifdef ENABLE_WEB_SERVICE #include "web_service/telemetry_json.h" +#include "web_service/verify_login.h" #endif namespace Core { @@ -28,23 +32,94 @@ static const char* CpuVendorToStr(Common::CPUVendor vendor) { UNREACHABLE(); } +static u64 GenerateTelemetryId() { + u64 telemetry_id{}; + CryptoPP::AutoSeededRandomPool rng; + rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&telemetry_id), sizeof(u64)); + return telemetry_id; +} + +u64 GetTelemetryId() { + u64 telemetry_id{}; + static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"}; + + if (FileUtil::Exists(filename)) { + FileUtil::IOFile file(filename, "rb"); + if (!file.IsOpen()) { + LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str()); + return {}; + } + file.ReadBytes(&telemetry_id, sizeof(u64)); + } else { + FileUtil::IOFile file(filename, "wb"); + if (!file.IsOpen()) { + LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str()); + return {}; + } + telemetry_id = GenerateTelemetryId(); + file.WriteBytes(&telemetry_id, sizeof(u64)); + } + + return telemetry_id; +} + +u64 RegenerateTelemetryId() { + const u64 new_telemetry_id{GenerateTelemetryId()}; + static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"}; + + FileUtil::IOFile file(filename, "wb"); + if (!file.IsOpen()) { + LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str()); + return {}; + } + file.WriteBytes(&new_telemetry_id, sizeof(u64)); + return new_telemetry_id; +} + +std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func) { +#ifdef ENABLE_WEB_SERVICE + return WebService::VerifyLogin(username, token, Settings::values.verify_endpoint_url, func); +#else + return std::async(std::launch::async, [func{std::move(func)}]() { + func(); + return false; + }); +#endif +} + TelemetrySession::TelemetrySession() { #ifdef ENABLE_WEB_SERVICE - backend = std::make_unique<WebService::TelemetryJson>(); + if (Settings::values.enable_telemetry) { + backend = std::make_unique<WebService::TelemetryJson>( + Settings::values.telemetry_endpoint_url, Settings::values.citra_username, + Settings::values.citra_token); + } else { + backend = std::make_unique<Telemetry::NullVisitor>(); + } #else backend = std::make_unique<Telemetry::NullVisitor>(); #endif + // Log one-time top-level information + AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId()); + // Log one-time session start information const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::system_clock::now().time_since_epoch()) .count()}; AddField(Telemetry::FieldType::Session, "Init_Time", init_time); + std::string program_name; + const Loader::ResultStatus res{System::GetInstance().GetAppLoader().ReadTitle(program_name)}; + if (res == Loader::ResultStatus::Success) { + AddField(Telemetry::FieldType::Session, "ProgramName", program_name); + } // Log application information const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty); AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch); AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev); + AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date); + AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name); // Log user system information AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); @@ -68,6 +143,15 @@ TelemetrySession::TelemetrySession() { Common::GetCPUCaps().sse4_1); AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2); +#ifdef __APPLE__ + AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple"); +#elif defined(_WIN32) + AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows"); +#elif defined(__linux__) || defined(linux) || defined(__linux) + AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux"); +#else + AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown"); +#endif // Log user configuration information AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching", diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h index cf53835c3..550c6ea2d 100644 --- a/src/core/telemetry_session.h +++ b/src/core/telemetry_session.h @@ -4,6 +4,7 @@ #pragma once +#include <future> #include <memory> #include "common/telemetry.h" @@ -35,4 +36,25 @@ private: std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields }; +/** + * Gets TelemetryId, a unique identifier used for the user's telemetry sessions. + * @returns The current TelemetryId for the session. + */ +u64 GetTelemetryId(); + +/** + * Regenerates TelemetryId, a unique identifier used for the user's telemetry sessions. + * @returns The new TelemetryId that was generated. + */ +u64 RegenerateTelemetryId(); + +/** + * Verifies the username and token. + * @param username Citra username to use for authentication. + * @param token Citra token to use for authentication. + * @param func A function that gets exectued when the verification is finished + * @returns Future with bool indicating whether the verification succeeded + */ +std::future<bool> VerifyLogin(std::string username, std::string token, std::function<void()> func); + } // namespace Core diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index e3e36ada7..92792a702 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt @@ -2,12 +2,14 @@ set(SRCS analog_from_button.cpp keyboard.cpp main.cpp + motion_emu.cpp ) set(HEADERS analog_from_button.h keyboard.h main.h + motion_emu.h ) if(SDL2_FOUND) diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index 699f41e6b..557353740 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp @@ -7,6 +7,7 @@ #include "input_common/analog_from_button.h" #include "input_common/keyboard.h" #include "input_common/main.h" +#include "input_common/motion_emu.h" #ifdef HAVE_SDL2 #include "input_common/sdl/sdl.h" #endif @@ -14,12 +15,16 @@ namespace InputCommon { static std::shared_ptr<Keyboard> keyboard; +static std::shared_ptr<MotionEmu> motion_emu; void Init() { - keyboard = std::make_shared<InputCommon::Keyboard>(); + keyboard = std::make_shared<Keyboard>(); Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard); Input::RegisterFactory<Input::AnalogDevice>("analog_from_button", - std::make_shared<InputCommon::AnalogFromButton>()); + std::make_shared<AnalogFromButton>()); + motion_emu = std::make_shared<MotionEmu>(); + Input::RegisterFactory<Input::MotionDevice>("motion_emu", motion_emu); + #ifdef HAVE_SDL2 SDL::Init(); #endif @@ -29,6 +34,8 @@ void Shutdown() { Input::UnregisterFactory<Input::ButtonDevice>("keyboard"); keyboard.reset(); Input::UnregisterFactory<Input::AnalogDevice>("analog_from_button"); + Input::UnregisterFactory<Input::MotionDevice>("motion_emu"); + motion_emu.reset(); #ifdef HAVE_SDL2 SDL::Shutdown(); @@ -39,6 +46,10 @@ Keyboard* GetKeyboard() { return keyboard.get(); } +MotionEmu* GetMotionEmu() { + return motion_emu.get(); +} + std::string GenerateKeyboardParam(int key_code) { Common::ParamPackage param{ {"engine", "keyboard"}, {"code", std::to_string(key_code)}, diff --git a/src/input_common/main.h b/src/input_common/main.h index 140bbd014..5604f0fa8 100644 --- a/src/input_common/main.h +++ b/src/input_common/main.h @@ -11,7 +11,7 @@ namespace InputCommon { /// Initializes and registers all built-in input device factories. void Init(); -/// Unresisters all build-in input device factories and shut them down. +/// Deregisters all built-in input device factories and shuts them down. void Shutdown(); class Keyboard; @@ -19,6 +19,11 @@ class Keyboard; /// Gets the keyboard button device factory. Keyboard* GetKeyboard(); +class MotionEmu; + +/// Gets the motion emulation factory. +MotionEmu* GetMotionEmu(); + /// Generates a serialized param package for creating a keyboard button device std::string GenerateKeyboardParam(int key_code); diff --git a/src/input_common/motion_emu.cpp b/src/input_common/motion_emu.cpp new file mode 100644 index 000000000..59a035e70 --- /dev/null +++ b/src/input_common/motion_emu.cpp @@ -0,0 +1,168 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <chrono> +#include <mutex> +#include <thread> +#include <tuple> +#include "common/math_util.h" +#include "common/quaternion.h" +#include "common/thread.h" +#include "common/vector_math.h" +#include "input_common/motion_emu.h" + +namespace InputCommon { + +// Implementation class of the motion emulation device +class MotionEmuDevice { +public: + MotionEmuDevice(int update_millisecond, float sensitivity) + : update_millisecond(update_millisecond), + update_duration(std::chrono::duration_cast<std::chrono::steady_clock::duration>( + std::chrono::milliseconds(update_millisecond))), + sensitivity(sensitivity), motion_emu_thread(&MotionEmuDevice::MotionEmuThread, this) {} + + ~MotionEmuDevice() { + if (motion_emu_thread.joinable()) { + shutdown_event.Set(); + motion_emu_thread.join(); + } + } + + void BeginTilt(int x, int y) { + mouse_origin = Math::MakeVec(x, y); + is_tilting = true; + } + + void Tilt(int x, int y) { + auto mouse_move = Math::MakeVec(x, y) - mouse_origin; + if (is_tilting) { + std::lock_guard<std::mutex> guard(tilt_mutex); + if (mouse_move.x == 0 && mouse_move.y == 0) { + tilt_angle = 0; + } else { + tilt_direction = mouse_move.Cast<float>(); + tilt_angle = MathUtil::Clamp(tilt_direction.Normalize() * sensitivity, 0.0f, + MathUtil::PI * 0.5f); + } + } + } + + void EndTilt() { + std::lock_guard<std::mutex> guard(tilt_mutex); + tilt_angle = 0; + is_tilting = false; + } + + std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() { + std::lock_guard<std::mutex> guard(status_mutex); + return status; + } + +private: + const int update_millisecond; + const std::chrono::steady_clock::duration update_duration; + const float sensitivity; + + Math::Vec2<int> mouse_origin; + + std::mutex tilt_mutex; + Math::Vec2<float> tilt_direction; + float tilt_angle = 0; + + bool is_tilting = false; + + Common::Event shutdown_event; + + std::tuple<Math::Vec3<float>, Math::Vec3<float>> status; + std::mutex status_mutex; + + // Note: always keep the thread declaration at the end so that other objects are initialized + // before this! + std::thread motion_emu_thread; + + void MotionEmuThread() { + auto update_time = std::chrono::steady_clock::now(); + Math::Quaternion<float> q = MakeQuaternion(Math::Vec3<float>(), 0); + Math::Quaternion<float> old_q; + + while (!shutdown_event.WaitUntil(update_time)) { + update_time += update_duration; + old_q = q; + + { + std::lock_guard<std::mutex> guard(tilt_mutex); + + // Find the quaternion describing current 3DS tilting + q = MakeQuaternion(Math::MakeVec(-tilt_direction.y, 0.0f, tilt_direction.x), + tilt_angle); + } + + auto inv_q = q.Inverse(); + + // Set the gravity vector in world space + auto gravity = Math::MakeVec(0.0f, -1.0f, 0.0f); + + // Find the angular rate vector in world space + auto angular_rate = ((q - old_q) * inv_q).xyz * 2; + angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180; + + // Transform the two vectors from world space to 3DS space + gravity = QuaternionRotate(inv_q, gravity); + angular_rate = QuaternionRotate(inv_q, angular_rate); + + // Update the sensor state + { + std::lock_guard<std::mutex> guard(status_mutex); + status = std::make_tuple(gravity, angular_rate); + } + } + } +}; + +// Interface wrapper held by input receiver as a unique_ptr. It holds the implementation class as +// a shared_ptr, which is also observed by the factory class as a weak_ptr. In this way the factory +// can forward all the inputs to the implementation only when it is valid. +class MotionEmuDeviceWrapper : public Input::MotionDevice { +public: + MotionEmuDeviceWrapper(int update_millisecond, float sensitivity) { + device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity); + } + + std::tuple<Math::Vec3<float>, Math::Vec3<float>> GetStatus() const { + return device->GetStatus(); + } + + std::shared_ptr<MotionEmuDevice> device; +}; + +std::unique_ptr<Input::MotionDevice> MotionEmu::Create(const Common::ParamPackage& params) { + int update_period = params.Get("update_period", 100); + float sensitivity = params.Get("sensitivity", 0.01f); + auto device_wrapper = std::make_unique<MotionEmuDeviceWrapper>(update_period, sensitivity); + // Previously created device is disconnected here. Having two motion devices for 3DS is not + // expected. + current_device = device_wrapper->device; + return std::move(device_wrapper); +} + +void MotionEmu::BeginTilt(int x, int y) { + if (auto ptr = current_device.lock()) { + ptr->BeginTilt(x, y); + } +} + +void MotionEmu::Tilt(int x, int y) { + if (auto ptr = current_device.lock()) { + ptr->Tilt(x, y); + } +} + +void MotionEmu::EndTilt() { + if (auto ptr = current_device.lock()) { + ptr->EndTilt(); + } +} + +} // namespace InputCommon diff --git a/src/input_common/motion_emu.h b/src/input_common/motion_emu.h new file mode 100644 index 000000000..7a7e22467 --- /dev/null +++ b/src/input_common/motion_emu.h @@ -0,0 +1,46 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/frontend/input.h" + +namespace InputCommon { + +class MotionEmuDevice; + +class MotionEmu : public Input::Factory<Input::MotionDevice> { +public: + /** + * Creates a motion device emulated from mouse input + * @param params contains parameters for creating the device: + * - "update_period": update period in milliseconds + * - "sensitivity": the coefficient converting mouse movement to tilting angle + */ + std::unique_ptr<Input::MotionDevice> Create(const Common::ParamPackage& params) override; + + /** + * Signals that a motion sensor tilt has begun. + * @param x the x-coordinate of the cursor + * @param y the y-coordinate of the cursor + */ + void BeginTilt(int x, int y); + + /** + * Signals that a motion sensor tilt is occurring. + * @param x the x-coordinate of the cursor + * @param y the y-coordinate of the cursor + */ + void Tilt(int x, int y); + + /** + * Signals that a motion sensor tilt has ended. + */ + void EndTilt(); + +private: + std::weak_ptr<MotionEmuDevice> current_device; +}; + +} // namespace InputCommon diff --git a/src/input_common/sdl/sdl.cpp b/src/input_common/sdl/sdl.cpp index 756ee58b7..d404afa89 100644 --- a/src/input_common/sdl/sdl.cpp +++ b/src/input_common/sdl/sdl.cpp @@ -159,7 +159,7 @@ public: * - "axis"(optional): the index of the axis to bind * - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", * "down", "left" or "right" - * - "threshould"(only used for axis): a float value in (-1.0, 1.0) which the button is + * - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is * triggered if the axis value crosses * - "direction"(only used for axis): "+" means the button is triggered when the axis value * is greater than the threshold; "-" means the button is triggered when the axis value diff --git a/src/network/packet.cpp b/src/network/packet.cpp index 660e92c0d..7e1a812f3 100644 --- a/src/network/packet.cpp +++ b/src/network/packet.cpp @@ -13,6 +13,18 @@ namespace Network { +#ifndef htonll +u64 htonll(u64 x) { + return ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x)&0xFFFFFFFF) << 32) | htonl((x) >> 32)); +} +#endif + +#ifndef ntohll +u64 ntohll(u64 x) { + return ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x)&0xFFFFFFFF) << 32) | ntohl((x) >> 32)); +} +#endif + void Packet::Append(const void* in_data, std::size_t size_in_bytes) { if (in_data && (size_in_bytes > 0)) { std::size_t start = data.size(); @@ -100,6 +112,20 @@ Packet& Packet::operator>>(u32& out_data) { return *this; } +Packet& Packet::operator>>(s64& out_data) { + s64 value; + Read(&value, sizeof(value)); + out_data = ntohll(value); + return *this; +} + +Packet& Packet::operator>>(u64& out_data) { + u64 value; + Read(&value, sizeof(value)); + out_data = ntohll(value); + return *this; +} + Packet& Packet::operator>>(float& out_data) { Read(&out_data, sizeof(out_data)); return *this; @@ -183,6 +209,18 @@ Packet& Packet::operator<<(u32 in_data) { return *this; } +Packet& Packet::operator<<(s64 in_data) { + s64 toWrite = htonll(in_data); + Append(&toWrite, sizeof(toWrite)); + return *this; +} + +Packet& Packet::operator<<(u64 in_data) { + u64 toWrite = htonll(in_data); + Append(&toWrite, sizeof(toWrite)); + return *this; +} + Packet& Packet::operator<<(float in_data) { Append(&in_data, sizeof(in_data)); return *this; @@ -195,7 +233,7 @@ Packet& Packet::operator<<(double in_data) { Packet& Packet::operator<<(const char* in_data) { // First insert string length - u32 length = std::strlen(in_data); + u32 length = static_cast<u32>(std::strlen(in_data)); *this << length; // Then insert characters diff --git a/src/network/packet.h b/src/network/packet.h index 94b351ab1..5a2e58dc2 100644 --- a/src/network/packet.h +++ b/src/network/packet.h @@ -72,6 +72,8 @@ public: Packet& operator>>(u16& out_data); Packet& operator>>(s32& out_data); Packet& operator>>(u32& out_data); + Packet& operator>>(s64& out_data); + Packet& operator>>(u64& out_data); Packet& operator>>(float& out_data); Packet& operator>>(double& out_data); Packet& operator>>(char* out_data); @@ -89,6 +91,8 @@ public: Packet& operator<<(u16 in_data); Packet& operator<<(s32 in_data); Packet& operator<<(u32 in_data); + Packet& operator<<(s64 in_data); + Packet& operator<<(u64 in_data); Packet& operator<<(float in_data); Packet& operator<<(double in_data); Packet& operator<<(const char* in_data); diff --git a/src/network/room.cpp b/src/network/room.cpp index 8b7915bb7..261049ab0 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -4,9 +4,9 @@ #include <algorithm> #include <atomic> +#include <mutex> #include <random> #include <thread> -#include <vector> #include "enet/enet.h" #include "network/packet.h" #include "network/room.h" @@ -19,7 +19,7 @@ static constexpr u32 MaxConcurrentConnections = 10; class Room::RoomImpl { public: // This MAC address is used to generate a 'Nintendo' like Mac address. - const MacAddress NintendoOUI = {0x00, 0x1F, 0x32, 0x00, 0x00, 0x00}; + const MacAddress NintendoOUI; std::mt19937 random_gen; ///< Random number generator. Used for GenerateMacAddress ENetHost* server = nullptr; ///< Network interface. @@ -29,14 +29,17 @@ public: struct Member { std::string nickname; ///< The nickname of the member. - std::string game_name; ///< The current game of the member + GameInfo game_info; ///< The current game of the member MacAddress mac_address; ///< The assigned mac address of the member. ENetPeer* peer; ///< The remote peer. }; using MemberList = std::vector<Member>; - MemberList members; ///< Information about the members of this room. + MemberList members; ///< Information about the members of this room + mutable std::mutex member_mutex; ///< Mutex for locking the members list + /// This should be a std::shared_mutex as soon as C++17 is supported - RoomImpl() : random_gen(std::random_device()()) {} + RoomImpl() + : random_gen(std::random_device()()), NintendoOUI{0x00, 0x1F, 0x32, 0x00, 0x00, 0x00} {} /// Thread that receives and dispatches network packets std::unique_ptr<std::thread> room_thread; @@ -146,7 +149,7 @@ void Room::RoomImpl::ServerLoop() { case IdJoinRequest: HandleJoinRequest(&event); break; - case IdSetGameName: + case IdSetGameInfo: HandleGameNamePacket(&event); break; case IdWifiPacket: @@ -212,7 +215,10 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { member.nickname = nickname; member.peer = event->peer; - members.push_back(std::move(member)); + { + std::lock_guard<std::mutex> lock(member_mutex); + members.push_back(std::move(member)); + } // Notify everyone that the room information has changed. BroadcastRoomInformation(); @@ -222,12 +228,14 @@ void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { bool Room::RoomImpl::IsValidNickname(const std::string& nickname) const { // A nickname is valid if it is not already taken by anybody else in the room. // TODO(B3N30): Check for empty names, spaces, etc. + std::lock_guard<std::mutex> lock(member_mutex); return std::all_of(members.begin(), members.end(), [&nickname](const auto& member) { return member.nickname != nickname; }); } bool Room::RoomImpl::IsValidMacAddress(const MacAddress& address) const { // A MAC address is valid if it is not already taken by anybody else in the room. + std::lock_guard<std::mutex> lock(member_mutex); return std::all_of(members.begin(), members.end(), [&address](const auto& member) { return member.mac_address != address; }); } @@ -278,6 +286,7 @@ void Room::RoomImpl::SendCloseMessage() { packet << static_cast<u8>(IdCloseRoom); ENetPacket* enet_packet = enet_packet_create(packet.GetData(), packet.GetDataSize(), ENET_PACKET_FLAG_RELIABLE); + std::lock_guard<std::mutex> lock(member_mutex); for (auto& member : members) { enet_peer_send(member.peer, 0, enet_packet); } @@ -294,10 +303,14 @@ void Room::RoomImpl::BroadcastRoomInformation() { packet << room_information.member_slots; packet << static_cast<u32>(members.size()); - for (const auto& member : members) { - packet << member.nickname; - packet << member.mac_address; - packet << member.game_name; + { + std::lock_guard<std::mutex> lock(member_mutex); + for (const auto& member : members) { + packet << member.nickname; + packet << member.mac_address; + packet << member.game_info.name; + packet << member.game_info.id; + } } ENetPacket* enet_packet = @@ -334,11 +347,13 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) { ENET_PACKET_FLAG_RELIABLE); if (destination_address == BroadcastMac) { // Send the data to everyone except the sender + std::lock_guard<std::mutex> lock(member_mutex); for (const auto& member : members) { if (member.peer != event->peer) enet_peer_send(member.peer, 0, enet_packet); } } else { // Send the data only to the destination client + std::lock_guard<std::mutex> lock(member_mutex); auto member = std::find_if(members.begin(), members.end(), [destination_address](const Member& member) -> bool { return member.mac_address == destination_address; @@ -360,6 +375,8 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) { auto CompareNetworkAddress = [event](const Member member) -> bool { return member.peer == event->peer; }; + + std::lock_guard<std::mutex> lock(member_mutex); const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress); if (sending_member == members.end()) { return; // Received a chat message from a unknown sender @@ -384,22 +401,32 @@ void Room::RoomImpl::HandleGameNamePacket(const ENetEvent* event) { in_packet.Append(event->packet->data, event->packet->dataLength); in_packet.IgnoreBytes(sizeof(u8)); // Igonore the message type - std::string game_name; - in_packet >> game_name; - auto member = - std::find_if(members.begin(), members.end(), - [event](const Member& member) -> bool { return member.peer == event->peer; }); - if (member != members.end()) { - member->game_name = game_name; - BroadcastRoomInformation(); + GameInfo game_info; + in_packet >> game_info.name; + in_packet >> game_info.id; + + { + std::lock_guard<std::mutex> lock(member_mutex); + auto member = + std::find_if(members.begin(), members.end(), [event](const Member& member) -> bool { + return member.peer == event->peer; + }); + if (member != members.end()) { + member->game_info = game_info; + } } + BroadcastRoomInformation(); } void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) { // Remove the client from the members list. - members.erase(std::remove_if(members.begin(), members.end(), - [client](const Member& member) { return member.peer == client; }), - members.end()); + { + std::lock_guard<std::mutex> lock(member_mutex); + members.erase( + std::remove_if(members.begin(), members.end(), + [client](const Member& member) { return member.peer == client; }), + members.end()); + } // Announce the change to all clients. enet_peer_disconnect(client, 0); @@ -436,6 +463,19 @@ const RoomInformation& Room::GetRoomInformation() const { return room_impl->room_information; } +std::vector<Room::Member> Room::GetRoomMemberList() const { + std::vector<Room::Member> member_list; + std::lock_guard<std::mutex> lock(room_impl->member_mutex); + for (const auto& member_impl : room_impl->members) { + Member member; + member.nickname = member_impl.nickname; + member.mac_address = member_impl.mac_address; + member.game_info = member_impl.game_info; + member_list.push_back(member); + } + return member_list; +}; + void Room::Destroy() { room_impl->state = State::Closed; room_impl->room_thread->join(); @@ -446,7 +486,10 @@ void Room::Destroy() { } room_impl->room_information = {}; room_impl->server = nullptr; - room_impl->members.clear(); + { + std::lock_guard<std::mutex> lock(room_impl->member_mutex); + room_impl->members.clear(); + } room_impl->room_information.member_slots = 0; room_impl->room_information.name.clear(); } diff --git a/src/network/room.h b/src/network/room.h index 54cccf0ae..8285a4d0c 100644 --- a/src/network/room.h +++ b/src/network/room.h @@ -7,6 +7,7 @@ #include <array> #include <memory> #include <string> +#include <vector> #include "common/common_types.h" namespace Network { @@ -21,10 +22,15 @@ struct RoomInformation { u32 member_slots; ///< Maximum number of members in this room }; +struct GameInfo { + std::string name{""}; + u64 id{0}; +}; + using MacAddress = std::array<u8, 6>; /// A special MAC address that tells the room we're joining to assign us a MAC address /// automatically. -const MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +constexpr MacAddress NoPreferredMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 802.11 broadcast MAC address constexpr MacAddress BroadcastMac = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; @@ -34,7 +40,7 @@ enum RoomMessageTypes : u8 { IdJoinRequest = 1, IdJoinSuccess, IdRoomInformation, - IdSetGameName, + IdSetGameInfo, IdWifiPacket, IdChatMessage, IdNameCollision, @@ -51,6 +57,12 @@ public: Closed, ///< The room is not opened and can not accept connections. }; + struct Member { + std::string nickname; ///< The nickname of the member. + GameInfo game_info; ///< The current game of the member + MacAddress mac_address; ///< The assigned mac address of the member. + }; + Room(); ~Room(); @@ -65,6 +77,11 @@ public: const RoomInformation& GetRoomInformation() const; /** + * Gets a list of the mbmers connected to the room. + */ + std::vector<Member> GetRoomMemberList() const; + + /** * Creates the socket for this room. Will bind to default address if * server is empty string. */ diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp index dac9bacae..f229ec6fd 100644 --- a/src/network/room_member.cpp +++ b/src/network/room_member.cpp @@ -5,6 +5,7 @@ #include <atomic> #include <list> #include <mutex> +#include <set> #include <thread> #include "common/assert.h" #include "enet/enet.h" @@ -25,6 +26,9 @@ public: /// Information about the room we're connected to. RoomInformation room_information; + /// The current game name, id and version + GameInfo current_game_info; + std::atomic<State> state{State::Idle}; ///< Current state of the RoomMember. void SetState(const State new_state); bool IsConnected() const; @@ -37,6 +41,24 @@ public: std::unique_ptr<std::thread> loop_thread; std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable. std::list<Packet> send_list; ///< A list that stores all packets to send the async + + template <typename T> + using CallbackSet = std::set<CallbackHandle<T>>; + std::mutex callback_mutex; ///< The mutex used for handling callbacks + + class Callbacks { + public: + template <typename T> + CallbackSet<T>& Get(); + + private: + CallbackSet<WifiPacket> callback_set_wifi_packet; + CallbackSet<ChatEntry> callback_set_chat_messages; + CallbackSet<RoomInformation> callback_set_room_information; + CallbackSet<State> callback_set_state; + }; + Callbacks callbacks; ///< All CallbackSets to all events + void MemberLoop(); void StartLoop(); @@ -84,12 +106,20 @@ public: * Disconnects the RoomMember from the Room */ void Disconnect(); + + template <typename T> + void Invoke(const T& data); + + template <typename T> + CallbackHandle<T> Bind(std::function<void(const T&)> callback); }; // RoomMemberImpl void RoomMember::RoomMemberImpl::SetState(const State new_state) { - state = new_state; - // TODO(B3N30): Invoke the callback functions + if (state != new_state) { + state = new_state; + Invoke<State>(state); + } } bool RoomMember::RoomMemberImpl::IsConnected() const { @@ -195,9 +225,10 @@ void RoomMember::RoomMemberImpl::HandleRoomInformationPacket(const ENetEvent* ev for (auto& member : member_information) { packet >> member.nickname; packet >> member.mac_address; - packet >> member.game_name; + packet >> member.game_info.name; + packet >> member.game_info.id; } - // TODO(B3N30): Invoke callbacks + Invoke(room_information); } void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) { @@ -209,7 +240,7 @@ void RoomMember::RoomMemberImpl::HandleJoinPacket(const ENetEvent* event) { // Parse the MAC Address from the packet packet >> mac_address; - // TODO(B3N30): Invoke callbacks + SetState(State::Joined); } void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) { @@ -235,7 +266,7 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) { packet >> wifi_packet.data; - // TODO(B3N30): Invoke callbacks + Invoke<WifiPacket>(wifi_packet); } void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) { @@ -248,7 +279,7 @@ void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) { ChatEntry chat_entry{}; packet >> chat_entry.nickname; packet >> chat_entry.message; - // TODO(B3N30): Invoke callbacks + Invoke<ChatEntry>(chat_entry); } void RoomMember::RoomMemberImpl::Disconnect() { @@ -276,6 +307,46 @@ void RoomMember::RoomMemberImpl::Disconnect() { server = nullptr; } +template <> +RoomMember::RoomMemberImpl::CallbackSet<WifiPacket>& RoomMember::RoomMemberImpl::Callbacks::Get() { + return callback_set_wifi_packet; +} + +template <> +RoomMember::RoomMemberImpl::CallbackSet<RoomMember::State>& +RoomMember::RoomMemberImpl::Callbacks::Get() { + return callback_set_state; +} + +template <> +RoomMember::RoomMemberImpl::CallbackSet<RoomInformation>& +RoomMember::RoomMemberImpl::Callbacks::Get() { + return callback_set_room_information; +} + +template <> +RoomMember::RoomMemberImpl::CallbackSet<ChatEntry>& RoomMember::RoomMemberImpl::Callbacks::Get() { + return callback_set_chat_messages; +} + +template <typename T> +void RoomMember::RoomMemberImpl::Invoke(const T& data) { + std::lock_guard<std::mutex> lock(callback_mutex); + CallbackSet<T> callback_set = callbacks.Get<T>(); + for (auto const& callback : callback_set) + (*callback)(data); +} + +template <typename T> +RoomMember::CallbackHandle<T> RoomMember::RoomMemberImpl::Bind( + std::function<void(const T&)> callback) { + std::lock_guard<std::mutex> lock(callback_mutex); + CallbackHandle<T> handle; + handle = std::make_shared<std::function<void(const T&)>>(callback); + callbacks.Get<T>().insert(handle); + return handle; +} + // RoomMember RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} { room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0); @@ -339,6 +410,7 @@ void RoomMember::Join(const std::string& nick, const char* server_addr, u16 serv room_member_impl->SetState(State::Joining); room_member_impl->StartLoop(); room_member_impl->SendJoinRequest(nick, preferred_mac); + SendGameInfo(room_member_impl->current_game_info); } else { room_member_impl->SetState(State::CouldNotConnect); } @@ -366,17 +438,53 @@ void RoomMember::SendChatMessage(const std::string& message) { room_member_impl->Send(std::move(packet)); } -void RoomMember::SendGameName(const std::string& game_name) { +void RoomMember::SendGameInfo(const GameInfo& game_info) { + room_member_impl->current_game_info = game_info; + if (!IsConnected()) + return; + Packet packet; - packet << static_cast<u8>(IdSetGameName); - packet << game_name; + packet << static_cast<u8>(IdSetGameInfo); + packet << game_info.name; + packet << game_info.id; room_member_impl->Send(std::move(packet)); } +RoomMember::CallbackHandle<RoomMember::State> RoomMember::BindOnStateChanged( + std::function<void(const RoomMember::State&)> callback) { + return room_member_impl->Bind(callback); +} + +RoomMember::CallbackHandle<WifiPacket> RoomMember::BindOnWifiPacketReceived( + std::function<void(const WifiPacket&)> callback) { + return room_member_impl->Bind(callback); +} + +RoomMember::CallbackHandle<RoomInformation> RoomMember::BindOnRoomInformationChanged( + std::function<void(const RoomInformation&)> callback) { + return room_member_impl->Bind(callback); +} + +RoomMember::CallbackHandle<ChatEntry> RoomMember::BindOnChatMessageRecieved( + std::function<void(const ChatEntry&)> callback) { + return room_member_impl->Bind(callback); +} + +template <typename T> +void RoomMember::Unbind(CallbackHandle<T> handle) { + std::lock_guard<std::mutex> lock(room_member_impl->callback_mutex); + room_member_impl->callbacks.Get<T>().erase(handle); +} + void RoomMember::Leave() { room_member_impl->SetState(State::Idle); room_member_impl->loop_thread->join(); room_member_impl->loop_thread.reset(); } +template void RoomMember::Unbind(CallbackHandle<WifiPacket>); +template void RoomMember::Unbind(CallbackHandle<RoomMember::State>); +template void RoomMember::Unbind(CallbackHandle<RoomInformation>); +template void RoomMember::Unbind(CallbackHandle<ChatEntry>); + } // namespace Network diff --git a/src/network/room_member.h b/src/network/room_member.h index bc1af3a7e..98770a234 100644 --- a/src/network/room_member.h +++ b/src/network/room_member.h @@ -4,6 +4,7 @@ #pragma once +#include <functional> #include <memory> #include <string> #include <vector> @@ -53,12 +54,23 @@ public: struct MemberInformation { std::string nickname; ///< Nickname of the member. - std::string game_name; ///< Name of the game they're currently playing, or empty if they're + GameInfo game_info; ///< Name of the game they're currently playing, or empty if they're /// not playing anything. MacAddress mac_address; ///< MAC address associated with this member. }; using MemberList = std::vector<MemberInformation>; + // The handle for the callback functions + template <typename T> + using CallbackHandle = std::shared_ptr<std::function<void(const T&)>>; + + /** + * Unbinds a callback function from the events. + * @param handle The connection handle to disconnect + */ + template <typename T> + void Unbind(CallbackHandle<T> handle); + RoomMember(); ~RoomMember(); @@ -113,10 +125,49 @@ public: void SendChatMessage(const std::string& message); /** - * Sends the current game name to the room. - * @param game_name The game name. + * Sends the current game info to the room. + * @param game_info The game information. + */ + void SendGameInfo(const GameInfo& game_info); + + /** + * Binds a function to an event that will be triggered every time the State of the member + * changed. The function wil be called every time the event is triggered. The callback function + * must not bind or unbind a function. Doing so will cause a deadlock + * @param callback The function to call + * @return A handle used for removing the function from the registered list + */ + CallbackHandle<State> BindOnStateChanged(std::function<void(const State&)> callback); + + /** + * Binds a function to an event that will be triggered every time a WifiPacket is received. + * The function wil be called everytime the event is triggered. + * The callback function must not bind or unbind a function. Doing so will cause a deadlock + * @param callback The function to call + * @return A handle used for removing the function from the registered list + */ + CallbackHandle<WifiPacket> BindOnWifiPacketReceived( + std::function<void(const WifiPacket&)> callback); + + /** + * Binds a function to an event that will be triggered every time the RoomInformation changes. + * The function wil be called every time the event is triggered. + * The callback function must not bind or unbind a function. Doing so will cause a deadlock + * @param callback The function to call + * @return A handle used for removing the function from the registered list + */ + CallbackHandle<RoomInformation> BindOnRoomInformationChanged( + std::function<void(const RoomInformation&)> callback); + + /** + * Binds a function to an event that will be triggered every time a ChatMessage is received. + * The function wil be called every time the event is triggered. + * The callback function must not bind or unbind a function. Doing so will cause a deadlock + * @param callback The function to call + * @return A handle used for removing the function from the registered list */ - void SendGameName(const std::string& game_name); + CallbackHandle<ChatEntry> BindOnChatMessageRecieved( + std::function<void(const ChatEntry&)> callback); /** * Leaves the current room. diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index a14df325a..1aac0daa2 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,12 +1,16 @@ set(SRCS common/param_package.cpp + core/arm/arm_test_common.cpp + core/arm/dyncom/arm_dyncom_vfp_tests.cpp core/file_sys/path_parser.cpp core/hle/kernel/hle_ipc.cpp + core/memory/memory.cpp glad.cpp tests.cpp ) set(HEADERS + core/arm/arm_test_common.h ) create_directory_groups(${SRCS} ${HEADERS}) diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp new file mode 100644 index 000000000..2339bdfb8 --- /dev/null +++ b/src/tests/core/arm/arm_test_common.cpp @@ -0,0 +1,137 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/core.h" +#include "core/hle/kernel/process.h" +#include "core/memory.h" +#include "core/memory_setup.h" +#include "tests/core/arm/arm_test_common.h" + +namespace ArmTests { + +static Memory::PageTable* page_table = nullptr; + +TestEnvironment::TestEnvironment(bool mutable_memory_) + : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) { + + Kernel::g_current_process = Kernel::Process::Create(""); + page_table = &Kernel::g_current_process->vm_manager.page_table; + + page_table->pointers.fill(nullptr); + page_table->attributes.fill(Memory::PageType::Unmapped); + page_table->cached_res_count.fill(0); + + Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); + Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); + + Memory::SetCurrentPageTable(page_table); +} + +TestEnvironment::~TestEnvironment() { + Memory::UnmapRegion(*page_table, 0x80000000, 0x80000000); + Memory::UnmapRegion(*page_table, 0x00000000, 0x80000000); +} + +void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) { + SetMemory32(vaddr + 0, static_cast<u32>(value)); + SetMemory32(vaddr + 4, static_cast<u32>(value >> 32)); +} + +void TestEnvironment::SetMemory32(VAddr vaddr, u32 value) { + SetMemory16(vaddr + 0, static_cast<u16>(value)); + SetMemory16(vaddr + 2, static_cast<u16>(value >> 16)); +} + +void TestEnvironment::SetMemory16(VAddr vaddr, u16 value) { + SetMemory8(vaddr + 0, static_cast<u8>(value)); + SetMemory8(vaddr + 1, static_cast<u8>(value >> 8)); +} + +void TestEnvironment::SetMemory8(VAddr vaddr, u8 value) { + test_memory->data[vaddr] = value; +} + +std::vector<WriteRecord> TestEnvironment::GetWriteRecords() const { + return write_records; +} + +void TestEnvironment::ClearWriteRecords() { + write_records.clear(); +} + +TestEnvironment::TestMemory::~TestMemory() {} + +bool TestEnvironment::TestMemory::IsValidAddress(VAddr addr) { + return true; +} + +u8 TestEnvironment::TestMemory::Read8(VAddr addr) { + auto iter = data.find(addr); + if (iter == data.end()) { + return addr; // Some arbitrary data + } + return iter->second; +} + +u16 TestEnvironment::TestMemory::Read16(VAddr addr) { + return Read8(addr) | static_cast<u16>(Read8(addr + 1)) << 8; +} + +u32 TestEnvironment::TestMemory::Read32(VAddr addr) { + return Read16(addr) | static_cast<u32>(Read16(addr + 2)) << 16; +} + +u64 TestEnvironment::TestMemory::Read64(VAddr addr) { + return Read32(addr) | static_cast<u64>(Read32(addr + 4)) << 32; +} + +bool TestEnvironment::TestMemory::ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) { + VAddr addr = src_addr; + u8* data = static_cast<u8*>(dest_buffer); + + for (size_t i = 0; i < size; i++, addr++, data++) { + *data = Read8(addr); + } + + return true; +} + +void TestEnvironment::TestMemory::Write8(VAddr addr, u8 data) { + env->write_records.emplace_back(8, addr, data); + if (env->mutable_memory) + env->SetMemory8(addr, data); +} + +void TestEnvironment::TestMemory::Write16(VAddr addr, u16 data) { + env->write_records.emplace_back(16, addr, data); + if (env->mutable_memory) + env->SetMemory16(addr, data); +} + +void TestEnvironment::TestMemory::Write32(VAddr addr, u32 data) { + env->write_records.emplace_back(32, addr, data); + if (env->mutable_memory) + env->SetMemory32(addr, data); +} + +void TestEnvironment::TestMemory::Write64(VAddr addr, u64 data) { + env->write_records.emplace_back(64, addr, data); + if (env->mutable_memory) + env->SetMemory64(addr, data); +} + +bool TestEnvironment::TestMemory::WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) { + VAddr addr = dest_addr; + const u8* data = static_cast<const u8*>(src_buffer); + + for (size_t i = 0; i < size; i++, addr++, data++) { + env->write_records.emplace_back(8, addr, *data); + if (env->mutable_memory) + env->SetMemory8(addr, *data); + } + + return true; +} + +} // namespace ArmTests diff --git a/src/tests/core/arm/arm_test_common.h b/src/tests/core/arm/arm_test_common.h new file mode 100644 index 000000000..592c28594 --- /dev/null +++ b/src/tests/core/arm/arm_test_common.h @@ -0,0 +1,84 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <tuple> +#include <unordered_map> +#include <vector> + +#include "common/common_types.h" +#include "core/mmio.h" + +namespace ArmTests { + +struct WriteRecord { + WriteRecord(size_t size, VAddr addr, u64 data) : size(size), addr(addr), data(data) {} + size_t size; + VAddr addr; + u64 data; + bool operator==(const WriteRecord& o) const { + return std::tie(size, addr, data) == std::tie(o.size, o.addr, o.data); + } +}; + +class TestEnvironment final { +public: + /* + * Inititalise test environment + * @param mutable_memory If false, writes to memory can never be read back. + * (Memory is immutable.) + */ + explicit TestEnvironment(bool mutable_memory = false); + + /// Shutdown test environment + ~TestEnvironment(); + + /// Sets value at memory location vaddr. + void SetMemory8(VAddr vaddr, u8 value); + void SetMemory16(VAddr vaddr, u16 value); + void SetMemory32(VAddr vaddr, u32 value); + void SetMemory64(VAddr vaddr, u64 value); + + /** + * Whenever Memory::Write{8,16,32,64} is called within the test environment, + * a new write-record is made. + * @returns A vector of write records made since they were last cleared. + */ + std::vector<WriteRecord> GetWriteRecords() const; + + /// Empties the internal write-record store. + void ClearWriteRecords(); + +private: + friend struct TestMemory; + struct TestMemory final : Memory::MMIORegion { + explicit TestMemory(TestEnvironment* env_) : env(env_) {} + TestEnvironment* env; + + ~TestMemory() override; + + bool IsValidAddress(VAddr addr) override; + + u8 Read8(VAddr addr) override; + u16 Read16(VAddr addr) override; + u32 Read32(VAddr addr) override; + u64 Read64(VAddr addr) override; + + bool ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) override; + + void Write8(VAddr addr, u8 data) override; + void Write16(VAddr addr, u16 data) override; + void Write32(VAddr addr, u32 data) override; + void Write64(VAddr addr, u64 data) override; + + bool WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) override; + + std::unordered_map<VAddr, u8> data; + }; + + bool mutable_memory; + std::shared_ptr<TestMemory> test_memory; + std::vector<WriteRecord> write_records; +}; + +} // namespace ArmTests diff --git a/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp new file mode 100644 index 000000000..83719a58e --- /dev/null +++ b/src/tests/core/arm/dyncom/arm_dyncom_vfp_tests.cpp @@ -0,0 +1,50 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <catch.hpp> + +#include "core/arm/dyncom/arm_dyncom.h" +#include "core/core_timing.h" +#include "tests/core/arm/arm_test_common.h" + +namespace ArmTests { + +struct VfpTestCase { + u32 initial_fpscr; + u32 a; + u32 b; + u32 result; + u32 final_fpscr; +}; + +TEST_CASE("ARM_DynCom (vfp): vadd", "[arm_dyncom]") { + TestEnvironment test_env(false); + test_env.SetMemory32(0, 0xEE321A03); // vadd.f32 s2, s4, s6 + test_env.SetMemory32(4, 0xEAFFFFFE); // b +#0 + + ARM_DynCom dyncom(USER32MODE); + + std::vector<VfpTestCase> test_cases{{ +#include "vfp_vadd_f32.inc" + }}; + + for (const auto& test_case : test_cases) { + dyncom.SetPC(0); + dyncom.SetVFPSystemReg(VFP_FPSCR, test_case.initial_fpscr); + dyncom.SetVFPReg(4, test_case.a); + dyncom.SetVFPReg(6, test_case.b); + dyncom.ExecuteInstructions(1); + if (dyncom.GetVFPReg(2) != test_case.result || + dyncom.GetVFPSystemReg(VFP_FPSCR) != test_case.final_fpscr) { + printf("f: %x\n", test_case.initial_fpscr); + printf("a: %x\n", test_case.a); + printf("b: %x\n", test_case.b); + printf("c: %x (%x)\n", dyncom.GetVFPReg(2), test_case.result); + printf("f: %x (%x)\n", dyncom.GetVFPSystemReg(VFP_FPSCR), test_case.final_fpscr); + FAIL(); + } + } +} + +} // namespace ArmTests
\ No newline at end of file diff --git a/src/tests/core/arm/dyncom/vfp_vadd_f32.inc b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc new file mode 100644 index 000000000..d0032c2e6 --- /dev/null +++ b/src/tests/core/arm/dyncom/vfp_vadd_f32.inc @@ -0,0 +1,13456 @@ +{0x3c00000, 0x0, 0x0, 0x0, 0x3c00000}, +{0x3c00000, 0x0, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x800000, 0x800000, 0x3c00000}, +{0x3c00000, 0x0, 0x800002, 0x800002, 0x3c00000}, +{0x3c00000, 0x0, 0x1398437, 0x1398437, 0x3c00000}, +{0x3c00000, 0x0, 0xba98d27, 0xba98d27, 0x3c00000}, +{0x3c00000, 0x0, 0xba98d7a, 0xba98d7a, 0x3c00000}, +{0x3c00000, 0x0, 0x751f853a, 0x751f853a, 0x3c00000}, +{0x3c00000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000}, +{0x3c00000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3c00000}, +{0x3c00000, 0x0, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x0, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0x80000000, 0x0, 0x3c00000}, +{0x3c00000, 0x0, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x0, 0x80800000, 0x80800000, 0x3c00000}, +{0x3c00000, 0x0, 0x80800002, 0x80800002, 0x3c00000}, +{0x3c00000, 0x0, 0x81398437, 0x81398437, 0x3c00000}, +{0x3c00000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3c00000}, +{0x3c00000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000}, +{0x3c00000, 0x0, 0xf51f853a, 0xf51f853a, 0x3c00000}, +{0x3c00000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3c00000}, +{0x3c00000, 0x0, 0xff7fffff, 0xff7fffff, 0x3c00000}, +{0x3c00000, 0x0, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x0, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x0, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3c00000}, +{0x3c00000, 0x0, 0xe73a5134, 0xe73a5134, 0x3c00000}, +{0x3c00000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3c00000}, +{0x3c00000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3c00000}, +{0x3c00000, 0x0, 0x9503366, 0x9503366, 0x3c00000}, +{0x3c00000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000}, +{0x3c00000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000}, +{0x3c00000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3c00000}, +{0x3c00000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000}, +{0x3c00000, 0x0, 0x966320b, 0x966320b, 0x3c00000}, +{0x3c00000, 0x0, 0xb26bddee, 0xb26bddee, 0x3c00000}, +{0x3c00000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000}, +{0x3c00000, 0x0, 0x317285d3, 0x317285d3, 0x3c00000}, +{0x3c00000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3c00000}, +{0x3c00000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000}, +{0x3c00000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3c00000}, +{0x3c00000, 0x1, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x1, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x1, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x1, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x1, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x1, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x1, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x1, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x1, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x1, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x1, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x1, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x1, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x1, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x1, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x1, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x1, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x1, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x1, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x1, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x76, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x76, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x76, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x76, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x76, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x76, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x76, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x76, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x76, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x76, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x76, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x76, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x76, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x76, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x76, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x76, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x76, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x76, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x76, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x76, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x76, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x2b94, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x2b94, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x2b94, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x2b94, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x2b94, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x2b94, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x2b94, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x2b94, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x2b94, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x2b94, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x636d24, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x636d24, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x636d24, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x636d24, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x636d24, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x636d24, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x636d24, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x636d24, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x636d24, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x636d24, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x800000, 0x0, 0x800000, 0x3c00000}, +{0x3c00000, 0x800000, 0x1, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x76, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x2b94, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x636d24, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x7fffff, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x800000, 0x1000000, 0x3c00000}, +{0x3c00000, 0x800000, 0x800002, 0x1000001, 0x3c00000}, +{0x3c00000, 0x800000, 0x1398437, 0x1798437, 0x3c00000}, +{0x3c00000, 0x800000, 0xba98d27, 0xba98d29, 0x3c00000}, +{0x3c00000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3c00000}, +{0x3c00000, 0x800000, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x800000, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x800000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0x80000000, 0x800000, 0x3c00000}, +{0x3c00000, 0x800000, 0x80000001, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x80000076, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x80002b94, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x80636d24, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x807fffff, 0x800000, 0x3c00080}, +{0x3c00000, 0x800000, 0x80800000, 0x0, 0x3c00000}, +{0x3c00000, 0x800000, 0x80800002, 0x0, 0x3c00008}, +{0x3c00000, 0x800000, 0x81398437, 0x80f3086e, 0x3c00000}, +{0x3c00000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3c00000}, +{0x3c00000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3c00000}, +{0x3c00000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x800000, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x800000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x800000, 0x9503366, 0x95033a6, 0x3c00000}, +{0x3c00000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0x800000, 0x966320b, 0x966324b, 0x3c00000}, +{0x3c00000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0x800000, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x800002, 0x0, 0x800002, 0x3c00000}, +{0x3c00000, 0x800002, 0x1, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x76, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x2b94, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x636d24, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x7fffff, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x800000, 0x1000001, 0x3c00000}, +{0x3c00000, 0x800002, 0x800002, 0x1000002, 0x3c00000}, +{0x3c00000, 0x800002, 0x1398437, 0x1798438, 0x3c00000}, +{0x3c00000, 0x800002, 0xba98d27, 0xba98d29, 0x3c00010}, +{0x3c00000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3c00010}, +{0x3c00000, 0x800002, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x800002, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x800002, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0x80000000, 0x800002, 0x3c00000}, +{0x3c00000, 0x800002, 0x80000001, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x80000076, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x80002b94, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x80636d24, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x807fffff, 0x800002, 0x3c00080}, +{0x3c00000, 0x800002, 0x80800000, 0x0, 0x3c00008}, +{0x3c00000, 0x800002, 0x80800002, 0x0, 0x3c00000}, +{0x3c00000, 0x800002, 0x81398437, 0x80f3086c, 0x3c00000}, +{0x3c00000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3c00010}, +{0x3c00000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3c00010}, +{0x3c00000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x800002, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x800002, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x800002, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x800002, 0x9503366, 0x95033a6, 0x3c00010}, +{0x3c00000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0x800002, 0x966320b, 0x966324b, 0x3c00010}, +{0x3c00000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0x800002, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x1398437, 0x0, 0x1398437, 0x3c00000}, +{0x3c00000, 0x1398437, 0x1, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x76, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x2b94, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x636d24, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x7fffff, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x800000, 0x1798437, 0x3c00000}, +{0x3c00000, 0x1398437, 0x800002, 0x1798438, 0x3c00000}, +{0x3c00000, 0x1398437, 0x1398437, 0x1b98437, 0x3c00000}, +{0x3c00000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3c00010}, +{0x3c00000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3c00010}, +{0x3c00000, 0x1398437, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x1398437, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0x80000000, 0x1398437, 0x3c00000}, +{0x3c00000, 0x1398437, 0x80000001, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x80000076, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x80002b94, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x80636d24, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x807fffff, 0x1398437, 0x3c00080}, +{0x3c00000, 0x1398437, 0x80800000, 0xf3086e, 0x3c00000}, +{0x3c00000, 0x1398437, 0x80800002, 0xf3086c, 0x3c00000}, +{0x3c00000, 0x1398437, 0x81398437, 0x0, 0x3c00000}, +{0x3c00000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3c00010}, +{0x3c00000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3c00010}, +{0x3c00000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x1398437, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x1398437, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x1398437, 0x9503366, 0x950341f, 0x3c00010}, +{0x3c00000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0x1398437, 0x966320b, 0x96632c4, 0x3c00010}, +{0x3c00000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0x1398437, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x0, 0xba98d27, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x1, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x76, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x2b94, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x636d24, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x800000, 0xba98d29, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x800002, 0xba98d29, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3c00000}, +{0x3c00000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x80000000, 0xba98d27, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x80000001, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x80000076, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3c00080}, +{0x3c00000, 0xba98d27, 0x80800000, 0xba98d25, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x80800002, 0xba98d24, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x81398437, 0xba98d21, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x8ba98d27, 0x0, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x0, 0xba98d7a, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x1, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x76, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x0, 0x751f853a, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x1, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x76, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x2b94, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x636d24, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x800000, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x800002, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x1398437, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x80000000, 0x751f853a, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x80000001, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x80000076, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x751f853a, 0x80800000, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x80800002, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x81398437, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xf51f853a, 0x0, 0x3c00000}, +{0x3c00000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x9503366, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x966320b, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7f800000, 0x0, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x1, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x76, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x2b94, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x636d24, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x800002, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x1398437, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x80000000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x80000001, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x80000076, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x7f800000, 0x80800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x80800002, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x81398437, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x9503366, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x966320b, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7f800001, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x0, 0x0, 0x3c00000}, +{0x3c00000, 0x80000000, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x800000, 0x800000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x800002, 0x800002, 0x3c00000}, +{0x3c00000, 0x80000000, 0x1398437, 0x1398437, 0x3c00000}, +{0x3c00000, 0x80000000, 0xba98d27, 0xba98d27, 0x3c00000}, +{0x3c00000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3c00000}, +{0x3c00000, 0x80000000, 0x751f853a, 0x751f853a, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x80000000, 0x80000000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000000, 0x80800000, 0x80800000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x80800002, 0x80800002, 0x3c00000}, +{0x3c00000, 0x80000000, 0x81398437, 0x81398437, 0x3c00000}, +{0x3c00000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3c00000}, +{0x3c00000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3c00000}, +{0x3c00000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3c00000}, +{0x3c00000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3c00000}, +{0x3c00000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3c00000}, +{0x3c00000, 0x80000000, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x80000000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3c00000}, +{0x3c00000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3c00000}, +{0x3c00000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3c00000}, +{0x3c00000, 0x80000000, 0x9503366, 0x9503366, 0x3c00000}, +{0x3c00000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00000}, +{0x3c00000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00000}, +{0x3c00000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3c00000}, +{0x3c00000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00000}, +{0x3c00000, 0x80000000, 0x966320b, 0x966320b, 0x3c00000}, +{0x3c00000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3c00000}, +{0x3c00000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00000}, +{0x3c00000, 0x80000000, 0x317285d3, 0x317285d3, 0x3c00000}, +{0x3c00000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3c00000}, +{0x3c00000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3c00000}, +{0x3c00000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3c00000}, +{0x3c00000, 0x80000001, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x80000001, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x80000001, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x80000001, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80000001, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x80000001, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x80000001, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x80000001, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x80000001, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x80000001, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x80000076, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x80000076, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x80000076, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x80000076, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80000076, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x80000076, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x80000076, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x80000076, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x80000076, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x80000076, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x0, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x1, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x76, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x2b94, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x800000, 0x800000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x800002, 0x800002, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x1398437, 0x1398437, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80000000, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80000001, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80000076, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80002b94, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80636d24, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x807fffff, 0x0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80800000, 0x80800000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x80800002, 0x80800002, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x81398437, 0x81398437, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xff800000, 0xff800000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x9503366, 0x9503366, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x966320b, 0x966320b, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x80800000, 0x0, 0x80800000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x1, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x76, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x2b94, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x636d24, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x7fffff, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x800000, 0x0, 0x3c00000}, +{0x3c00000, 0x80800000, 0x800002, 0x0, 0x3c00008}, +{0x3c00000, 0x80800000, 0x1398437, 0xf3086e, 0x3c00000}, +{0x3c00000, 0x80800000, 0xba98d27, 0xba98d25, 0x3c00000}, +{0x3c00000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3c00000}, +{0x3c00000, 0x80800000, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x80800000, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x80000000, 0x80800000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x80000001, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x80000076, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x80002b94, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x80636d24, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x807fffff, 0x80800000, 0x3c00080}, +{0x3c00000, 0x80800000, 0x80800000, 0x81000000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x80800002, 0x81000001, 0x3c00000}, +{0x3c00000, 0x80800000, 0x81398437, 0x81798437, 0x3c00000}, +{0x3c00000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3c00000}, +{0x3c00000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3c00000}, +{0x3c00000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0x80800000, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x80800000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x80800000, 0x9503366, 0x9503326, 0x3c00000}, +{0x3c00000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0x80800000, 0x966320b, 0x96631cb, 0x3c00000}, +{0x3c00000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0x80800000, 0x317285d3, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x80800002, 0x0, 0x80800002, 0x3c00000}, +{0x3c00000, 0x80800002, 0x1, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x76, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x2b94, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x636d24, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x7fffff, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x800000, 0x0, 0x3c00008}, +{0x3c00000, 0x80800002, 0x800002, 0x0, 0x3c00000}, +{0x3c00000, 0x80800002, 0x1398437, 0xf3086c, 0x3c00000}, +{0x3c00000, 0x80800002, 0xba98d27, 0xba98d24, 0x3c00010}, +{0x3c00000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3c00010}, +{0x3c00000, 0x80800002, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x80800002, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0x80000000, 0x80800002, 0x3c00000}, +{0x3c00000, 0x80800002, 0x80000001, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x80000076, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x80002b94, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x80636d24, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x807fffff, 0x80800002, 0x3c00080}, +{0x3c00000, 0x80800002, 0x80800000, 0x81000001, 0x3c00000}, +{0x3c00000, 0x80800002, 0x80800002, 0x81000002, 0x3c00000}, +{0x3c00000, 0x80800002, 0x81398437, 0x81798438, 0x3c00000}, +{0x3c00000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3c00010}, +{0x3c00000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3c00010}, +{0x3c00000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0x80800002, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x80800002, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x80800002, 0x9503366, 0x9503325, 0x3c00010}, +{0x3c00000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0x80800002, 0x966320b, 0x96631ca, 0x3c00010}, +{0x3c00000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0x80800002, 0x317285d3, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x81398437, 0x0, 0x81398437, 0x3c00000}, +{0x3c00000, 0x81398437, 0x1, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x76, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x2b94, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x636d24, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x7fffff, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x800000, 0x80f3086e, 0x3c00000}, +{0x3c00000, 0x81398437, 0x800002, 0x80f3086c, 0x3c00000}, +{0x3c00000, 0x81398437, 0x1398437, 0x0, 0x3c00000}, +{0x3c00000, 0x81398437, 0xba98d27, 0xba98d21, 0x3c00010}, +{0x3c00000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3c00010}, +{0x3c00000, 0x81398437, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x81398437, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0x80000000, 0x81398437, 0x3c00000}, +{0x3c00000, 0x81398437, 0x80000001, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x80000076, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x80002b94, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x80636d24, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x807fffff, 0x81398437, 0x3c00080}, +{0x3c00000, 0x81398437, 0x80800000, 0x81798437, 0x3c00000}, +{0x3c00000, 0x81398437, 0x80800002, 0x81798438, 0x3c00000}, +{0x3c00000, 0x81398437, 0x81398437, 0x81b98437, 0x3c00000}, +{0x3c00000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3c00010}, +{0x3c00000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3c00010}, +{0x3c00000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0x81398437, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x81398437, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x81398437, 0x9503366, 0x95032ac, 0x3c00010}, +{0x3c00000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0x81398437, 0x966320b, 0x9663151, 0x3c00010}, +{0x3c00000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0x81398437, 0x317285d3, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xba98d27, 0x0, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3c00080}, +{0x3c00000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3c00080}, +{0x3c00000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x0, 0xf51f853a, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x1, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x76, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x751f853a, 0x0, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3c00080}, +{0x3c00000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xf51f853a, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3c00080}, +{0x3c00000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x0, 0xff7fffff, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x1, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x76, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3c00080}, +{0x3c00000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3c00014}, +{0x3c00000, 0xff7fffff, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3c00010}, +{0x3c00000, 0xff800000, 0x0, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x1, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x76, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x2b94, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x636d24, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x7fffff, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x800002, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x1398437, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xba98d27, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xba98d7a, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x751f853a, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x80000000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x80000001, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x80000076, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x80002b94, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x80636d24, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x807fffff, 0xff800000, 0x3c00080}, +{0x3c00000, 0xff800000, 0x80800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x80800002, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x81398437, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xf51f853a, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xff7fffff, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xe73a5134, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x9503366, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x966320b, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xb26bddee, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x317285d3, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3c00000}, +{0x3c00000, 0xff800001, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff800001, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x1, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x76, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3c00081}, +{0x3c00000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x1, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x76, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3c00080}, +{0x3c00000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3c00080}, +{0x3c00000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3c00000}, +{0x3c00000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3c00010}, +{0x3c00000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x0, 0xe73a5134, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x1, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x76, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3c00080}, +{0x3c00000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3c00000}, +{0x3c00000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3c00080}, +{0x3c00000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3c00000}, +{0x3c00000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3c00080}, +{0x3c00000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3c00000}, +{0x3c00000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x9503366, 0x0, 0x9503366, 0x3c00000}, +{0x3c00000, 0x9503366, 0x1, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x76, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x2b94, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x636d24, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x7fffff, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x800000, 0x95033a6, 0x3c00000}, +{0x3c00000, 0x9503366, 0x800002, 0x95033a6, 0x3c00010}, +{0x3c00000, 0x9503366, 0x1398437, 0x950341f, 0x3c00010}, +{0x3c00000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3c00010}, +{0x3c00000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3c00010}, +{0x3c00000, 0x9503366, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x9503366, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0x80000000, 0x9503366, 0x3c00000}, +{0x3c00000, 0x9503366, 0x80000001, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x80000076, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x80002b94, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x80636d24, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x807fffff, 0x9503366, 0x3c00080}, +{0x3c00000, 0x9503366, 0x80800000, 0x9503326, 0x3c00000}, +{0x3c00000, 0x9503366, 0x80800002, 0x9503325, 0x3c00010}, +{0x3c00000, 0x9503366, 0x81398437, 0x95032ac, 0x3c00010}, +{0x3c00000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3c00010}, +{0x3c00000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3c00010}, +{0x3c00000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x9503366, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x9503366, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x9503366, 0x9503366, 0x9d03366, 0x3c00000}, +{0x3c00000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0x9503366, 0x966320b, 0x9db32b8, 0x3c00010}, +{0x3c00000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0x9503366, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3c00080}, +{0x3c00000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3c00000}, +{0x3c00000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3c00080}, +{0x3c00000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3c00000}, +{0x3c00000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3c00080}, +{0x3c00000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3c00000}, +{0x3c00000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3c00080}, +{0x3c00000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3c00000}, +{0x3c00000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x966320b, 0x0, 0x966320b, 0x3c00000}, +{0x3c00000, 0x966320b, 0x1, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x76, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x2b94, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x636d24, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x7fffff, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x800000, 0x966324b, 0x3c00000}, +{0x3c00000, 0x966320b, 0x800002, 0x966324b, 0x3c00010}, +{0x3c00000, 0x966320b, 0x1398437, 0x96632c4, 0x3c00010}, +{0x3c00000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3c00010}, +{0x3c00000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3c00010}, +{0x3c00000, 0x966320b, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x966320b, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0x80000000, 0x966320b, 0x3c00000}, +{0x3c00000, 0x966320b, 0x80000001, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x80000076, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x80002b94, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x80636d24, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x807fffff, 0x966320b, 0x3c00080}, +{0x3c00000, 0x966320b, 0x80800000, 0x96631cb, 0x3c00000}, +{0x3c00000, 0x966320b, 0x80800002, 0x96631ca, 0x3c00010}, +{0x3c00000, 0x966320b, 0x81398437, 0x9663151, 0x3c00010}, +{0x3c00000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3c00010}, +{0x3c00000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3c00010}, +{0x3c00000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x966320b, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x966320b, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x966320b, 0x9503366, 0x9db32b8, 0x3c00010}, +{0x3c00000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3c00010}, +{0x3c00000, 0x966320b, 0x966320b, 0x9e6320b, 0x3c00000}, +{0x3c00000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0x966320b, 0x317285d3, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x0, 0xb26bddee, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x1, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x76, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3c00080}, +{0x3c00000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3c00000}, +{0x3c00000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3c00080}, +{0x3c00000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3c00000}, +{0x3c00000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x0, 0x317285d3, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x1, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x76, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x2b94, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x636d24, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x800000, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x800002, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x1398437, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x80000000, 0x317285d3, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x80000001, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x80000076, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3c00080}, +{0x3c00000, 0x317285d3, 0x80800000, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x80800002, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x81398437, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x9503366, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x966320b, 0x317285d3, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3c00010}, +{0x3c00000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3c00000}, +{0x3c00000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3c00080}, +{0x3c00000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3c00000}, +{0x3c00000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3c00080}, +{0x3c00000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3c00010}, +{0x3c00000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3c00000}, +{0x3c00000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3c00014}, +{0x3c00000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3c00080}, +{0x3c00000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3c00001}, +{0x3c00000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3c00000}, +{0x3c00000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3c00010}, +{0x3c00000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3c00000}, +{0x3800000, 0x0, 0x0, 0x0, 0x3800000}, +{0x3800000, 0x0, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x800000, 0x800000, 0x3800000}, +{0x3800000, 0x0, 0x800002, 0x800002, 0x3800000}, +{0x3800000, 0x0, 0x1398437, 0x1398437, 0x3800000}, +{0x3800000, 0x0, 0xba98d27, 0xba98d27, 0x3800000}, +{0x3800000, 0x0, 0xba98d7a, 0xba98d7a, 0x3800000}, +{0x3800000, 0x0, 0x751f853a, 0x751f853a, 0x3800000}, +{0x3800000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3800000}, +{0x3800000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3800000}, +{0x3800000, 0x0, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x0, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0x80000000, 0x80000000, 0x3800000}, +{0x3800000, 0x0, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x0, 0x80800000, 0x80800000, 0x3800000}, +{0x3800000, 0x0, 0x80800002, 0x80800002, 0x3800000}, +{0x3800000, 0x0, 0x81398437, 0x81398437, 0x3800000}, +{0x3800000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3800000}, +{0x3800000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3800000}, +{0x3800000, 0x0, 0xf51f853a, 0xf51f853a, 0x3800000}, +{0x3800000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3800000}, +{0x3800000, 0x0, 0xff7fffff, 0xff7fffff, 0x3800000}, +{0x3800000, 0x0, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x0, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x0, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3800000}, +{0x3800000, 0x0, 0xe73a5134, 0xe73a5134, 0x3800000}, +{0x3800000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3800000}, +{0x3800000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3800000}, +{0x3800000, 0x0, 0x9503366, 0x9503366, 0x3800000}, +{0x3800000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3800000}, +{0x3800000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3800000}, +{0x3800000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3800000}, +{0x3800000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3800000}, +{0x3800000, 0x0, 0x966320b, 0x966320b, 0x3800000}, +{0x3800000, 0x0, 0xb26bddee, 0xb26bddee, 0x3800000}, +{0x3800000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000}, +{0x3800000, 0x0, 0x317285d3, 0x317285d3, 0x3800000}, +{0x3800000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3800000}, +{0x3800000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3800000}, +{0x3800000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3800000}, +{0x3800000, 0x1, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x1, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x1, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x1, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x1, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x1, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x1, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x1, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x1, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x1, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x1, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x1, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x1, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x1, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x1, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x1, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x1, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x1, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x1, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x1, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x1, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x1, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x76, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x76, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x76, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x76, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x76, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x76, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x76, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x76, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x76, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x76, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x76, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x76, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x76, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x76, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x76, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x76, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x76, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x76, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x76, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x76, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x76, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x76, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x2b94, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x2b94, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x2b94, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x2b94, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x2b94, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x2b94, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x2b94, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x2b94, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x2b94, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x2b94, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x2b94, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x2b94, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x2b94, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x2b94, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x2b94, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x636d24, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x636d24, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x636d24, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x636d24, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x636d24, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x636d24, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x636d24, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x636d24, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x636d24, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x636d24, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x636d24, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x636d24, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x636d24, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x636d24, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x636d24, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7fffff, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x7fffff, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x7fffff, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x7fffff, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x7fffff, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x7fffff, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x7fffff, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x7fffff, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x7fffff, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x7fffff, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x800000, 0x0, 0x800000, 0x3800000}, +{0x3800000, 0x800000, 0x1, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x76, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x2b94, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x636d24, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x7fffff, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x800000, 0x1000000, 0x3800000}, +{0x3800000, 0x800000, 0x800002, 0x1000001, 0x3800000}, +{0x3800000, 0x800000, 0x1398437, 0x1798437, 0x3800000}, +{0x3800000, 0x800000, 0xba98d27, 0xba98d29, 0x3800000}, +{0x3800000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3800000}, +{0x3800000, 0x800000, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x800000, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x800000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0x80000000, 0x800000, 0x3800000}, +{0x3800000, 0x800000, 0x80000001, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x80000076, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x80002b94, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x80636d24, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x807fffff, 0x800000, 0x3800080}, +{0x3800000, 0x800000, 0x80800000, 0x80000000, 0x3800000}, +{0x3800000, 0x800000, 0x80800002, 0x0, 0x3800008}, +{0x3800000, 0x800000, 0x81398437, 0x80f3086e, 0x3800000}, +{0x3800000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3800000}, +{0x3800000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3800000}, +{0x3800000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x800000, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x800000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x800000, 0x9503366, 0x95033a6, 0x3800000}, +{0x3800000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0x800000, 0x966320b, 0x966324b, 0x3800000}, +{0x3800000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0x800000, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x800002, 0x0, 0x800002, 0x3800000}, +{0x3800000, 0x800002, 0x1, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x76, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x2b94, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x636d24, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x7fffff, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x800000, 0x1000001, 0x3800000}, +{0x3800000, 0x800002, 0x800002, 0x1000002, 0x3800000}, +{0x3800000, 0x800002, 0x1398437, 0x1798438, 0x3800000}, +{0x3800000, 0x800002, 0xba98d27, 0xba98d29, 0x3800010}, +{0x3800000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3800010}, +{0x3800000, 0x800002, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x800002, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x800002, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0x80000000, 0x800002, 0x3800000}, +{0x3800000, 0x800002, 0x80000001, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x80000076, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x80002b94, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x80636d24, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x807fffff, 0x800002, 0x3800080}, +{0x3800000, 0x800002, 0x80800000, 0x0, 0x3800008}, +{0x3800000, 0x800002, 0x80800002, 0x80000000, 0x3800000}, +{0x3800000, 0x800002, 0x81398437, 0x80f3086c, 0x3800000}, +{0x3800000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3800010}, +{0x3800000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3800010}, +{0x3800000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x800002, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x800002, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x800002, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x800002, 0x9503366, 0x95033a6, 0x3800010}, +{0x3800000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0x800002, 0x966320b, 0x966324b, 0x3800010}, +{0x3800000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0x800002, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x1398437, 0x0, 0x1398437, 0x3800000}, +{0x3800000, 0x1398437, 0x1, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x76, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x2b94, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x636d24, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x7fffff, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x800000, 0x1798437, 0x3800000}, +{0x3800000, 0x1398437, 0x800002, 0x1798438, 0x3800000}, +{0x3800000, 0x1398437, 0x1398437, 0x1b98437, 0x3800000}, +{0x3800000, 0x1398437, 0xba98d27, 0xba98d2c, 0x3800010}, +{0x3800000, 0x1398437, 0xba98d7a, 0xba98d7f, 0x3800010}, +{0x3800000, 0x1398437, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x1398437, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0x80000000, 0x1398437, 0x3800000}, +{0x3800000, 0x1398437, 0x80000001, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x80000076, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x80002b94, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x80636d24, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x807fffff, 0x1398437, 0x3800080}, +{0x3800000, 0x1398437, 0x80800000, 0xf3086e, 0x3800000}, +{0x3800000, 0x1398437, 0x80800002, 0xf3086c, 0x3800000}, +{0x3800000, 0x1398437, 0x81398437, 0x80000000, 0x3800000}, +{0x3800000, 0x1398437, 0x8ba98d27, 0x8ba98d22, 0x3800010}, +{0x3800000, 0x1398437, 0x8ba98d7a, 0x8ba98d75, 0x3800010}, +{0x3800000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x1398437, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x1398437, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x1398437, 0x9503366, 0x950341f, 0x3800010}, +{0x3800000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0x1398437, 0x966320b, 0x96632c4, 0x3800010}, +{0x3800000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0x1398437, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0xba98d27, 0x0, 0xba98d27, 0x3800000}, +{0x3800000, 0xba98d27, 0x1, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x76, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x2b94, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x636d24, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x800000, 0xba98d29, 0x3800000}, +{0x3800000, 0xba98d27, 0x800002, 0xba98d29, 0x3800010}, +{0x3800000, 0xba98d27, 0x1398437, 0xba98d2c, 0x3800010}, +{0x3800000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3800000}, +{0x3800000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3800010}, +{0x3800000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0x80000000, 0xba98d27, 0x3800000}, +{0x3800000, 0xba98d27, 0x80000001, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x80000076, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3800080}, +{0x3800000, 0xba98d27, 0x80800000, 0xba98d25, 0x3800000}, +{0x3800000, 0xba98d27, 0x80800002, 0xba98d24, 0x3800010}, +{0x3800000, 0xba98d27, 0x81398437, 0xba98d21, 0x3800010}, +{0x3800000, 0xba98d27, 0x8ba98d27, 0x80000000, 0x3800000}, +{0x3800000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3800000}, +{0x3800000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0xba98d27, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3800010}, +{0x3800000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3800010}, +{0x3800000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0xba98d7a, 0x0, 0xba98d7a, 0x3800000}, +{0x3800000, 0xba98d7a, 0x1, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x76, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3800000}, +{0x3800000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3800010}, +{0x3800000, 0xba98d7a, 0x1398437, 0xba98d7f, 0x3800010}, +{0x3800000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3800010}, +{0x3800000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3800000}, +{0x3800000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3800000}, +{0x3800000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3800080}, +{0x3800000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3800000}, +{0x3800000, 0xba98d7a, 0x80800002, 0xba98d77, 0x3800010}, +{0x3800000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3800010}, +{0x3800000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x8ba98d7a, 0x80000000, 0x3800000}, +{0x3800000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0xba98d7a, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3800010}, +{0x3800000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3800010}, +{0x3800000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x751f853a, 0x0, 0x751f853a, 0x3800000}, +{0x3800000, 0x751f853a, 0x1, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x76, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x2b94, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x636d24, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x800000, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x800002, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x1398437, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3800000}, +{0x3800000, 0x751f853a, 0x7f7ffff0, 0x7f7ffff9, 0x3800010}, +{0x3800000, 0x751f853a, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0x80000000, 0x751f853a, 0x3800000}, +{0x3800000, 0x751f853a, 0x80000001, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x80000076, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3800080}, +{0x3800000, 0x751f853a, 0x80800000, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x80800002, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x81398437, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x8ba98d27, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x8ba98d7a, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0xf51f853a, 0x80000000, 0x3800000}, +{0x3800000, 0x751f853a, 0xff7ffff0, 0xff7fffe7, 0x3800010}, +{0x3800000, 0x751f853a, 0xff7fffff, 0xff7ffff6, 0x3800010}, +{0x3800000, 0x751f853a, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0xe73a5134, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3800010}, +{0x3800000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x9503366, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0xbf5a97c9, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0xe6ff1a14, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x77f31e2f, 0x77f81a58, 0x3800010}, +{0x3800000, 0x751f853a, 0xaab4d7d8, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x966320b, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0xb26bddee, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0xb5c8e5d3, 0x751f8539, 0x3800010}, +{0x3800000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3800010}, +{0x3800000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x751f853a, 0x7f7ffff9, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x7f7ffff0, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7ffff0, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x7f7ffff0, 0x80800000, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x80800002, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x81398437, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x8ba98d27, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xff7ffff0, 0x80000000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xe73a5134, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x7c994e9e, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x77f31e2f, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xb26bddee, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x7f7ffff0, 0x7b906a6c, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x751f853a, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0x7f7ffff0, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x7f7fffff, 0x80800000, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x80800002, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x81398437, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x8ba98d27, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x8ba98d7a, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0xff7fffff, 0x80000000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xe73a5134, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x7c994e9e, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xbf5a97c9, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xe6ff1a14, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x77f31e2f, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f7fffff, 0xaab4d7d8, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xb26bddee, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x7f7fffff, 0x7b906a6c, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7f800000, 0x0, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x1, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x76, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x2b94, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x636d24, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x800002, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x1398437, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0x80000000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x80000001, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x80000076, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3800080}, +{0x3800000, 0x7f800000, 0x80800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x80800002, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x81398437, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x9503366, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x966320b, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3800000}, +{0x3800000, 0x7f800001, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0x0, 0x80000000, 0x3800000}, +{0x3800000, 0x80000000, 0x1, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x76, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x2b94, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x636d24, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x7fffff, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x800000, 0x800000, 0x3800000}, +{0x3800000, 0x80000000, 0x800002, 0x800002, 0x3800000}, +{0x3800000, 0x80000000, 0x1398437, 0x1398437, 0x3800000}, +{0x3800000, 0x80000000, 0xba98d27, 0xba98d27, 0x3800000}, +{0x3800000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3800000}, +{0x3800000, 0x80000000, 0x751f853a, 0x751f853a, 0x3800000}, +{0x3800000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3800000}, +{0x3800000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3800000}, +{0x3800000, 0x80000000, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0x80000000, 0x80000000, 0x3800000}, +{0x3800000, 0x80000000, 0x80000001, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x80000076, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x80002b94, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x80636d24, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x807fffff, 0x80000000, 0x3800080}, +{0x3800000, 0x80000000, 0x80800000, 0x80800000, 0x3800000}, +{0x3800000, 0x80000000, 0x80800002, 0x80800002, 0x3800000}, +{0x3800000, 0x80000000, 0x81398437, 0x81398437, 0x3800000}, +{0x3800000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3800000}, +{0x3800000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3800000}, +{0x3800000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3800000}, +{0x3800000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3800000}, +{0x3800000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3800000}, +{0x3800000, 0x80000000, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x80000000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3800000}, +{0x3800000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3800000}, +{0x3800000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3800000}, +{0x3800000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3800000}, +{0x3800000, 0x80000000, 0x9503366, 0x9503366, 0x3800000}, +{0x3800000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3800000}, +{0x3800000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3800000}, +{0x3800000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3800000}, +{0x3800000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3800000}, +{0x3800000, 0x80000000, 0x966320b, 0x966320b, 0x3800000}, +{0x3800000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3800000}, +{0x3800000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800000}, +{0x3800000, 0x80000000, 0x317285d3, 0x317285d3, 0x3800000}, +{0x3800000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3800000}, +{0x3800000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3800000}, +{0x3800000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3800000}, +{0x3800000, 0x80000001, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x80000001, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x80000001, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x80000001, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x80000001, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x80000001, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x80000001, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x80000001, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x80000001, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x80000001, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x80000001, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x80000001, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x80000001, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x80000001, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x80000001, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x80000076, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x80000076, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x80000076, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x80000076, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x80000076, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x80000076, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x80000076, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x80000076, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x80000076, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x80000076, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x80000076, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x80000076, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x80000076, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x80000076, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x80000076, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x80002b94, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x80002b94, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x80002b94, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x80002b94, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x80002b94, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x80002b94, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x80002b94, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x80002b94, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x80002b94, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x80002b94, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x80636d24, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x80636d24, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x80636d24, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x80636d24, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x80636d24, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x80636d24, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x80636d24, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x80636d24, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x80636d24, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x80636d24, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x807fffff, 0x0, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x1, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x76, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x2b94, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x636d24, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x7fffff, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x800000, 0x800000, 0x3800080}, +{0x3800000, 0x807fffff, 0x800002, 0x800002, 0x3800080}, +{0x3800000, 0x807fffff, 0x1398437, 0x1398437, 0x3800080}, +{0x3800000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3800080}, +{0x3800000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3800080}, +{0x3800000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3800080}, +{0x3800000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3800080}, +{0x3800000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3800080}, +{0x3800000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3800080}, +{0x3800000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0x80000000, 0x80000000, 0x3800080}, +{0x3800000, 0x807fffff, 0x80000001, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x80000076, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x80002b94, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x80636d24, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x807fffff, 0x0, 0x3800080}, +{0x3800000, 0x807fffff, 0x80800000, 0x80800000, 0x3800080}, +{0x3800000, 0x807fffff, 0x80800002, 0x80800002, 0x3800080}, +{0x3800000, 0x807fffff, 0x81398437, 0x81398437, 0x3800080}, +{0x3800000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3800080}, +{0x3800000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3800080}, +{0x3800000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0x807fffff, 0xff800000, 0xff800000, 0x3800080}, +{0x3800000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3800080}, +{0x3800000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x807fffff, 0x9503366, 0x9503366, 0x3800080}, +{0x3800000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0x807fffff, 0x966320b, 0x966320b, 0x3800080}, +{0x3800000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3800080}, +{0x3800000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3800080}, +{0x3800000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x80800000, 0x0, 0x80800000, 0x3800000}, +{0x3800000, 0x80800000, 0x1, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x76, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x2b94, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x636d24, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x7fffff, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x800000, 0x80000000, 0x3800000}, +{0x3800000, 0x80800000, 0x800002, 0x0, 0x3800008}, +{0x3800000, 0x80800000, 0x1398437, 0xf3086e, 0x3800000}, +{0x3800000, 0x80800000, 0xba98d27, 0xba98d25, 0x3800000}, +{0x3800000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3800000}, +{0x3800000, 0x80800000, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0x80800000, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x80800000, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x80800000, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0x80000000, 0x80800000, 0x3800000}, +{0x3800000, 0x80800000, 0x80000001, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x80000076, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x80002b94, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x80636d24, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x807fffff, 0x80800000, 0x3800080}, +{0x3800000, 0x80800000, 0x80800000, 0x81000000, 0x3800000}, +{0x3800000, 0x80800000, 0x80800002, 0x81000001, 0x3800000}, +{0x3800000, 0x80800000, 0x81398437, 0x81798437, 0x3800000}, +{0x3800000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3800000}, +{0x3800000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3800000}, +{0x3800000, 0x80800000, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0x80800000, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0x80800000, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0x80800000, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x80800000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800000, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x80800000, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0x80800000, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x80800000, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x80800000, 0x9503366, 0x9503326, 0x3800000}, +{0x3800000, 0x80800000, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0x80800000, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0x80800000, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x80800000, 0xaab4d7d8, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0x80800000, 0x966320b, 0x96631cb, 0x3800000}, +{0x3800000, 0x80800000, 0xb26bddee, 0xb26bddef, 0x3800010}, +{0x3800000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0x80800000, 0x317285d3, 0x317285d2, 0x3800010}, +{0x3800000, 0x80800000, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x80800000, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x80800000, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x80800002, 0x0, 0x80800002, 0x3800000}, +{0x3800000, 0x80800002, 0x1, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x76, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x2b94, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x636d24, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x7fffff, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x800000, 0x0, 0x3800008}, +{0x3800000, 0x80800002, 0x800002, 0x80000000, 0x3800000}, +{0x3800000, 0x80800002, 0x1398437, 0xf3086c, 0x3800000}, +{0x3800000, 0x80800002, 0xba98d27, 0xba98d24, 0x3800010}, +{0x3800000, 0x80800002, 0xba98d7a, 0xba98d77, 0x3800010}, +{0x3800000, 0x80800002, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0x80800002, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x80800002, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x80800002, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0x80000000, 0x80800002, 0x3800000}, +{0x3800000, 0x80800002, 0x80000001, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x80000076, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x80002b94, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x80636d24, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x807fffff, 0x80800002, 0x3800080}, +{0x3800000, 0x80800002, 0x80800000, 0x81000001, 0x3800000}, +{0x3800000, 0x80800002, 0x80800002, 0x81000002, 0x3800000}, +{0x3800000, 0x80800002, 0x81398437, 0x81798438, 0x3800000}, +{0x3800000, 0x80800002, 0x8ba98d27, 0x8ba98d2a, 0x3800010}, +{0x3800000, 0x80800002, 0x8ba98d7a, 0x8ba98d7d, 0x3800010}, +{0x3800000, 0x80800002, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0x80800002, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0x80800002, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0x80800002, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x80800002, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x80800002, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x80800002, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0x80800002, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x80800002, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x80800002, 0x9503366, 0x9503325, 0x3800010}, +{0x3800000, 0x80800002, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0x80800002, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0x80800002, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x80800002, 0xaab4d7d8, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0x80800002, 0x966320b, 0x96631ca, 0x3800010}, +{0x3800000, 0x80800002, 0xb26bddee, 0xb26bddef, 0x3800010}, +{0x3800000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0x80800002, 0x317285d3, 0x317285d2, 0x3800010}, +{0x3800000, 0x80800002, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x80800002, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x80800002, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x81398437, 0x0, 0x81398437, 0x3800000}, +{0x3800000, 0x81398437, 0x1, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x76, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x2b94, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x636d24, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x7fffff, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x800000, 0x80f3086e, 0x3800000}, +{0x3800000, 0x81398437, 0x800002, 0x80f3086c, 0x3800000}, +{0x3800000, 0x81398437, 0x1398437, 0x80000000, 0x3800000}, +{0x3800000, 0x81398437, 0xba98d27, 0xba98d21, 0x3800010}, +{0x3800000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3800010}, +{0x3800000, 0x81398437, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0x81398437, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x81398437, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x81398437, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0x80000000, 0x81398437, 0x3800000}, +{0x3800000, 0x81398437, 0x80000001, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x80000076, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x80002b94, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x80636d24, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x807fffff, 0x81398437, 0x3800080}, +{0x3800000, 0x81398437, 0x80800000, 0x81798437, 0x3800000}, +{0x3800000, 0x81398437, 0x80800002, 0x81798438, 0x3800000}, +{0x3800000, 0x81398437, 0x81398437, 0x81b98437, 0x3800000}, +{0x3800000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3800010}, +{0x3800000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3800010}, +{0x3800000, 0x81398437, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0x81398437, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0x81398437, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0x81398437, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x81398437, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x81398437, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x81398437, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0x81398437, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x81398437, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x81398437, 0x9503366, 0x95032ac, 0x3800010}, +{0x3800000, 0x81398437, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0x81398437, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0x81398437, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x81398437, 0xaab4d7d8, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0x81398437, 0x966320b, 0x9663151, 0x3800010}, +{0x3800000, 0x81398437, 0xb26bddee, 0xb26bddef, 0x3800010}, +{0x3800000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0x81398437, 0x317285d3, 0x317285d2, 0x3800010}, +{0x3800000, 0x81398437, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x81398437, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x81398437, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x1398437, 0x8ba98d22, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xba98d27, 0x80000000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3800080}, +{0x3800000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x80800002, 0x8ba98d2a, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d51, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d27, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xb26bddee, 0xb26bddef, 0x3800010}, +{0x3800000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x317285d3, 0x317285d2, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x1398437, 0x8ba98d75, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0xba98d7a, 0x80000000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3800080}, +{0x3800000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x80800002, 0x8ba98d7d, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d51, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xb26bddee, 0xb26bddef, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x317285d3, 0x317285d2, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x0, 0xf51f853a, 0x3800000}, +{0x3800000, 0xf51f853a, 0x1, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x76, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x751f853a, 0x80000000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3800010}, +{0x3800000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3800010}, +{0x3800000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3800000}, +{0x3800000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3800080}, +{0x3800000, 0xf51f853a, 0x80800000, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x80800002, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x81398437, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x8ba98d27, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x8ba98d7a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3800000}, +{0x3800000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3800010}, +{0x3800000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xf51f853a, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0xe73a5134, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x7c994e9e, 0x7c994d5e, 0x3800010}, +{0x3800000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0xbf5a97c9, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0xe6ff1a14, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3800010}, +{0x3800000, 0xf51f853a, 0xaab4d7d8, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0xb26bddee, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853b, 0x3800010}, +{0x3800000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3800010}, +{0x3800000, 0xf51f853a, 0x7b906a6c, 0x7b90656f, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x751f853a, 0xff7fffe7, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x7f7ffff0, 0x80000000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3800080}, +{0x3800000, 0xff7ffff0, 0x80800000, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x80800002, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x81398437, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3800014}, +{0x3800000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xe73a5134, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x7c994e9e, 0xff7b357c, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xb26bddee, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3800010}, +{0x3800000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1c, 0x3800010}, +{0x3800000, 0xff7fffff, 0x0, 0xff7fffff, 0x3800000}, +{0x3800000, 0xff7fffff, 0x1, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x76, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x751f853a, 0xff7ffff6, 0x3800010}, +{0x3800000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x7f7fffff, 0x80000000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3800000}, +{0x3800000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3800080}, +{0x3800000, 0xff7fffff, 0x80800000, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x80800002, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x81398437, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x8ba98d27, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x8ba98d7a, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0xe73a5134, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x7c994e9e, 0xff7b358b, 0x3800010}, +{0x3800000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0xbf5a97c9, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xe6ff1a14, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3800010}, +{0x3800000, 0xff7fffff, 0xaab4d7d8, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0xb26bddee, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0xb5c8e5d3, 0xff800000, 0x3800014}, +{0x3800000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3800010}, +{0x3800000, 0xff7fffff, 0x7b906a6c, 0xff7edf2b, 0x3800010}, +{0x3800000, 0xff800000, 0x0, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x1, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x76, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x2b94, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x636d24, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x7fffff, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x800000, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x800002, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x1398437, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xba98d27, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xba98d7a, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x751f853a, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0x80000000, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x80000001, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x80000076, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x80002b94, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x80636d24, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x807fffff, 0xff800000, 0x3800080}, +{0x3800000, 0xff800000, 0x80800000, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x80800002, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x81398437, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xf51f853a, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xff7fffff, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xe73a5134, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x9503366, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x966320b, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xb26bddee, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x317285d3, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3800000}, +{0x3800000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3800000}, +{0x3800000, 0xff800001, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff800001, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x1, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x76, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3800081}, +{0x3800000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x1, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x76, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3800080}, +{0x3800000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3800000}, +{0x3800000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3800080}, +{0x3800000, 0x4f3495cb, 0x80800000, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x80800002, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x81398437, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x8ba98d27, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3800000}, +{0x3800000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xb26bddee, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495ca, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3800010}, +{0x3800000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0xe73a5134, 0x0, 0xe73a5134, 0x3800000}, +{0x3800000, 0xe73a5134, 0x1, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x76, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xe73a5134, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xe73a5134, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3800000}, +{0x3800000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3800080}, +{0x3800000, 0xe73a5134, 0x80800000, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x80800002, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x81398437, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x8ba98d27, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x8ba98d7a, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xe73a5134, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xe73a5134, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xe73a5134, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3800000}, +{0x3800000, 0xe73a5134, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xe73a5134, 0x6164bd6c, 0xe73a42e9, 0x3800010}, +{0x3800000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0xbf5a97c9, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3800000}, +{0x3800000, 0xe73a5134, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xe73a5134, 0xaab4d7d8, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0xb26bddee, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5135, 0x3800010}, +{0x3800000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3800010}, +{0x3800000, 0xe73a5134, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x7f7ffff0, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7c994e9e, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3800080}, +{0x3800000, 0x7c994e9e, 0x80800000, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x80800002, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x81398437, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xf51f853a, 0x7c994d5e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xff7ffff0, 0xff7b357c, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xff7fffff, 0xff7b358b, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xe73a5134, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3800000}, +{0x3800000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x77f31e2f, 0x7c998b65, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xb26bddee, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9d, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3800080}, +{0x3800000, 0x6164bd6c, 0x80800000, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x80800002, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x81398437, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xe73a5134, 0xe73a42e9, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3800000}, +{0x3800000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7d, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xb26bddee, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6b, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x9503366, 0x0, 0x9503366, 0x3800000}, +{0x3800000, 0x9503366, 0x1, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x76, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x2b94, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x636d24, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x7fffff, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x800000, 0x95033a6, 0x3800000}, +{0x3800000, 0x9503366, 0x800002, 0x95033a6, 0x3800010}, +{0x3800000, 0x9503366, 0x1398437, 0x950341f, 0x3800010}, +{0x3800000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3800010}, +{0x3800000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3800010}, +{0x3800000, 0x9503366, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x9503366, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0x80000000, 0x9503366, 0x3800000}, +{0x3800000, 0x9503366, 0x80000001, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x80000076, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x80002b94, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x80636d24, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x807fffff, 0x9503366, 0x3800080}, +{0x3800000, 0x9503366, 0x80800000, 0x9503326, 0x3800000}, +{0x3800000, 0x9503366, 0x80800002, 0x9503325, 0x3800010}, +{0x3800000, 0x9503366, 0x81398437, 0x95032ac, 0x3800010}, +{0x3800000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3800010}, +{0x3800000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3800010}, +{0x3800000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x9503366, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x9503366, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x9503366, 0x9503366, 0x9d03366, 0x3800000}, +{0x3800000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0x9503366, 0x966320b, 0x9db32b8, 0x3800010}, +{0x3800000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0x9503366, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3800080}, +{0x3800000, 0xbf5a97c9, 0x80800000, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x80800002, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x81398437, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3800000}, +{0x3800000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e3, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ac, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3800080}, +{0x3800000, 0xe6ff1a14, 0x80800000, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x80800002, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x81398437, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7d, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3800000}, +{0x3800000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x751f853a, 0x77f81a58, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x7f7ffff0, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x77f31e2f, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3800080}, +{0x3800000, 0x77f31e2f, 0x80800000, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x80800002, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x81398437, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xe73a5134, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x7c994e9e, 0x7c998b65, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3800000}, +{0x3800000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xb26bddee, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2e, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3800080}, +{0x3800000, 0xaab4d7d8, 0x80800000, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x80800002, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x81398437, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d9, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3800000}, +{0x3800000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b0, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x966320b, 0x0, 0x966320b, 0x3800000}, +{0x3800000, 0x966320b, 0x1, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x76, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x2b94, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x636d24, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x7fffff, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x800000, 0x966324b, 0x3800000}, +{0x3800000, 0x966320b, 0x800002, 0x966324b, 0x3800010}, +{0x3800000, 0x966320b, 0x1398437, 0x96632c4, 0x3800010}, +{0x3800000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3800010}, +{0x3800000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3800010}, +{0x3800000, 0x966320b, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x966320b, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0x80000000, 0x966320b, 0x3800000}, +{0x3800000, 0x966320b, 0x80000001, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x80000076, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x80002b94, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x80636d24, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x807fffff, 0x966320b, 0x3800080}, +{0x3800000, 0x966320b, 0x80800000, 0x96631cb, 0x3800000}, +{0x3800000, 0x966320b, 0x80800002, 0x96631ca, 0x3800010}, +{0x3800000, 0x966320b, 0x81398437, 0x9663151, 0x3800010}, +{0x3800000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3800010}, +{0x3800000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3800010}, +{0x3800000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x966320b, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x966320b, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x966320b, 0x9503366, 0x9db32b8, 0x3800010}, +{0x3800000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3800010}, +{0x3800000, 0x966320b, 0x966320b, 0x9e6320b, 0x3800000}, +{0x3800000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3800010}, +{0x3800000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0x966320b, 0x317285d3, 0x317285d3, 0x3800010}, +{0x3800000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0xb26bddee, 0x0, 0xb26bddee, 0x3800000}, +{0x3800000, 0xb26bddee, 0x1, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x76, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xb26bddee, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xb26bddee, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3800000}, +{0x3800000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3800080}, +{0x3800000, 0xb26bddee, 0x80800000, 0xb26bddef, 0x3800010}, +{0x3800000, 0xb26bddee, 0x80800002, 0xb26bddef, 0x3800010}, +{0x3800000, 0xb26bddee, 0x81398437, 0xb26bddef, 0x3800010}, +{0x3800000, 0xb26bddee, 0x8ba98d27, 0xb26bddef, 0x3800010}, +{0x3800000, 0xb26bddee, 0x8ba98d7a, 0xb26bddef, 0x3800010}, +{0x3800000, 0xb26bddee, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xb26bddee, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xb26bddee, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xb26bddee, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb26bddee, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0xb26bddee, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0xb26bddee, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xb26bddee, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97ca, 0x3800010}, +{0x3800000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xb26bddee, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3800010}, +{0x3800000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3800010}, +{0x3800000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3800000}, +{0x3800000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3800010}, +{0x3800000, 0xb26bddee, 0x317285d3, 0xb22f3c7a, 0x3800010}, +{0x3800000, 0xb26bddee, 0x3c9623b1, 0x3c9623a9, 0x3800010}, +{0x3800000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0xb26bddee, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x751f853a, 0x751f8539, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7fffef, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7ffffe, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3800080}, +{0x3800000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d4, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853b, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff1, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xff7fffff, 0xff800000, 0x3800014}, +{0x3800000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495ca, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5135, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9d, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6b, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a15, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2e, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3800000}, +{0x3800000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c91, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x317285d3, 0x0, 0x317285d3, 0x3800000}, +{0x3800000, 0x317285d3, 0x1, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x76, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x2b94, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x636d24, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x800000, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0x800002, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0x1398437, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0x80000000, 0x317285d3, 0x3800000}, +{0x3800000, 0x317285d3, 0x80000001, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x80000076, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3800080}, +{0x3800000, 0x317285d3, 0x80800000, 0x317285d2, 0x3800010}, +{0x3800000, 0x317285d3, 0x80800002, 0x317285d2, 0x3800010}, +{0x3800000, 0x317285d3, 0x81398437, 0x317285d2, 0x3800010}, +{0x3800000, 0x317285d3, 0x8ba98d27, 0x317285d2, 0x3800010}, +{0x3800000, 0x317285d3, 0x8ba98d7a, 0x317285d2, 0x3800010}, +{0x3800000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x317285d3, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x317285d3, 0x9503366, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3800010}, +{0x3800000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3800010}, +{0x3800000, 0x317285d3, 0x966320b, 0x317285d3, 0x3800010}, +{0x3800000, 0x317285d3, 0xb26bddee, 0xb22f3c7a, 0x3800010}, +{0x3800000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c91, 0x3800010}, +{0x3800000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3800000}, +{0x3800000, 0x317285d3, 0x3c9623b1, 0x3c9623b2, 0x3800010}, +{0x3800000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3800080}, +{0x3800000, 0x3c9623b1, 0x80800000, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x80800002, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x81398437, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ac, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b0, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xb26bddee, 0x3c9623a9, 0x3800010}, +{0x3800000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x317285d3, 0x3c9623b2, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3800000}, +{0x3800000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3800080}, +{0x3800000, 0x51fd2c7c, 0x80800000, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x80800002, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x81398437, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7b, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3800010}, +{0x3800000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3800000}, +{0x3800000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x7f7ffff0, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7b906a6c, 0x7f7fffff, 0x7f7fffff, 0x3800014}, +{0x3800000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3800080}, +{0x3800000, 0x7b906a6c, 0x80800000, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x80800002, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x81398437, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xf51f853a, 0x7b90656f, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xff7fffff, 0xff7edf2b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3800001}, +{0x3800000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xe73a5134, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3800000}, +{0x3800000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xb26bddee, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6b, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3800010}, +{0x3800000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3800000}, +{0x3400000, 0x0, 0x0, 0x0, 0x3400000}, +{0x3400000, 0x0, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x800000, 0x800000, 0x3400000}, +{0x3400000, 0x0, 0x800002, 0x800002, 0x3400000}, +{0x3400000, 0x0, 0x1398437, 0x1398437, 0x3400000}, +{0x3400000, 0x0, 0xba98d27, 0xba98d27, 0x3400000}, +{0x3400000, 0x0, 0xba98d7a, 0xba98d7a, 0x3400000}, +{0x3400000, 0x0, 0x751f853a, 0x751f853a, 0x3400000}, +{0x3400000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3400000}, +{0x3400000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3400000}, +{0x3400000, 0x0, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x0, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0x80000000, 0x0, 0x3400000}, +{0x3400000, 0x0, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x0, 0x80800000, 0x80800000, 0x3400000}, +{0x3400000, 0x0, 0x80800002, 0x80800002, 0x3400000}, +{0x3400000, 0x0, 0x81398437, 0x81398437, 0x3400000}, +{0x3400000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3400000}, +{0x3400000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3400000}, +{0x3400000, 0x0, 0xf51f853a, 0xf51f853a, 0x3400000}, +{0x3400000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3400000}, +{0x3400000, 0x0, 0xff7fffff, 0xff7fffff, 0x3400000}, +{0x3400000, 0x0, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x0, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x0, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3400000}, +{0x3400000, 0x0, 0xe73a5134, 0xe73a5134, 0x3400000}, +{0x3400000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3400000}, +{0x3400000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3400000}, +{0x3400000, 0x0, 0x9503366, 0x9503366, 0x3400000}, +{0x3400000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3400000}, +{0x3400000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3400000}, +{0x3400000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3400000}, +{0x3400000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3400000}, +{0x3400000, 0x0, 0x966320b, 0x966320b, 0x3400000}, +{0x3400000, 0x0, 0xb26bddee, 0xb26bddee, 0x3400000}, +{0x3400000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000}, +{0x3400000, 0x0, 0x317285d3, 0x317285d3, 0x3400000}, +{0x3400000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3400000}, +{0x3400000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3400000}, +{0x3400000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3400000}, +{0x3400000, 0x1, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x1, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x1, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x1, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x1, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x1, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x1, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x1, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x1, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x1, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x1, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x1, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x1, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x1, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x1, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x1, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x1, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x1, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x1, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x1, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x1, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x76, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x76, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x76, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x76, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x76, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x76, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x76, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x76, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x76, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x76, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x76, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x76, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x76, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x76, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x76, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x76, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x76, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x76, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x76, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x76, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x76, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x2b94, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x2b94, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x2b94, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x2b94, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x2b94, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x2b94, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x2b94, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x2b94, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x2b94, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x2b94, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x2b94, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x2b94, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x2b94, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x2b94, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x636d24, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x636d24, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x636d24, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x636d24, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x636d24, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x636d24, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x636d24, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x636d24, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x636d24, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x636d24, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x636d24, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x636d24, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x636d24, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x636d24, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7fffff, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x7fffff, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x7fffff, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x7fffff, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x7fffff, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x7fffff, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x7fffff, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x7fffff, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x7fffff, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x800000, 0x0, 0x800000, 0x3400000}, +{0x3400000, 0x800000, 0x1, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x76, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x2b94, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x636d24, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x7fffff, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x800000, 0x1000000, 0x3400000}, +{0x3400000, 0x800000, 0x800002, 0x1000001, 0x3400000}, +{0x3400000, 0x800000, 0x1398437, 0x1798437, 0x3400000}, +{0x3400000, 0x800000, 0xba98d27, 0xba98d29, 0x3400000}, +{0x3400000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3400000}, +{0x3400000, 0x800000, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x800000, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x800000, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x800000, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x800000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0x80000000, 0x800000, 0x3400000}, +{0x3400000, 0x800000, 0x80000001, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x80000076, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x80002b94, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x80636d24, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x807fffff, 0x800000, 0x3400080}, +{0x3400000, 0x800000, 0x80800000, 0x0, 0x3400000}, +{0x3400000, 0x800000, 0x80800002, 0x0, 0x3400008}, +{0x3400000, 0x800000, 0x81398437, 0x80f3086e, 0x3400000}, +{0x3400000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3400000}, +{0x3400000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3400000}, +{0x3400000, 0x800000, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x800000, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x800000, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x800000, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x800000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800000, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x800000, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x800000, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x800000, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x800000, 0x9503366, 0x95033a6, 0x3400000}, +{0x3400000, 0x800000, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x800000, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x800000, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x800000, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0x800000, 0x966320b, 0x966324b, 0x3400000}, +{0x3400000, 0x800000, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0x800000, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0x800000, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x800000, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x800000, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x800002, 0x0, 0x800002, 0x3400000}, +{0x3400000, 0x800002, 0x1, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x76, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x2b94, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x636d24, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x7fffff, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x800000, 0x1000001, 0x3400000}, +{0x3400000, 0x800002, 0x800002, 0x1000002, 0x3400000}, +{0x3400000, 0x800002, 0x1398437, 0x1798438, 0x3400000}, +{0x3400000, 0x800002, 0xba98d27, 0xba98d2a, 0x3400010}, +{0x3400000, 0x800002, 0xba98d7a, 0xba98d7d, 0x3400010}, +{0x3400000, 0x800002, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x800002, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x800002, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x800002, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x800002, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0x80000000, 0x800002, 0x3400000}, +{0x3400000, 0x800002, 0x80000001, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x80000076, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x80002b94, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x80636d24, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x807fffff, 0x800002, 0x3400080}, +{0x3400000, 0x800002, 0x80800000, 0x0, 0x3400008}, +{0x3400000, 0x800002, 0x80800002, 0x0, 0x3400000}, +{0x3400000, 0x800002, 0x81398437, 0x80f3086c, 0x3400000}, +{0x3400000, 0x800002, 0x8ba98d27, 0x8ba98d24, 0x3400010}, +{0x3400000, 0x800002, 0x8ba98d7a, 0x8ba98d77, 0x3400010}, +{0x3400000, 0x800002, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x800002, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x800002, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x800002, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x800002, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x800002, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x800002, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x800002, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x800002, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x800002, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x800002, 0x9503366, 0x95033a7, 0x3400010}, +{0x3400000, 0x800002, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x800002, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x800002, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x800002, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0x800002, 0x966320b, 0x966324c, 0x3400010}, +{0x3400000, 0x800002, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0x800002, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0x800002, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x800002, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x800002, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x1398437, 0x0, 0x1398437, 0x3400000}, +{0x3400000, 0x1398437, 0x1, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x76, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x2b94, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x636d24, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x7fffff, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x800000, 0x1798437, 0x3400000}, +{0x3400000, 0x1398437, 0x800002, 0x1798438, 0x3400000}, +{0x3400000, 0x1398437, 0x1398437, 0x1b98437, 0x3400000}, +{0x3400000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3400010}, +{0x3400000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3400010}, +{0x3400000, 0x1398437, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x1398437, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x1398437, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x1398437, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0x80000000, 0x1398437, 0x3400000}, +{0x3400000, 0x1398437, 0x80000001, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x80000076, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x80002b94, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x80636d24, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x807fffff, 0x1398437, 0x3400080}, +{0x3400000, 0x1398437, 0x80800000, 0xf3086e, 0x3400000}, +{0x3400000, 0x1398437, 0x80800002, 0xf3086c, 0x3400000}, +{0x3400000, 0x1398437, 0x81398437, 0x0, 0x3400000}, +{0x3400000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3400010}, +{0x3400000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3400010}, +{0x3400000, 0x1398437, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x1398437, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x1398437, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x1398437, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x1398437, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x1398437, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x1398437, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x1398437, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x1398437, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x1398437, 0x9503366, 0x9503420, 0x3400010}, +{0x3400000, 0x1398437, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x1398437, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x1398437, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x1398437, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0x1398437, 0x966320b, 0x96632c5, 0x3400010}, +{0x3400000, 0x1398437, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0x1398437, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0x1398437, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x1398437, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x1398437, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0xba98d27, 0x0, 0xba98d27, 0x3400000}, +{0x3400000, 0xba98d27, 0x1, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x76, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x2b94, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x636d24, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x800000, 0xba98d29, 0x3400000}, +{0x3400000, 0xba98d27, 0x800002, 0xba98d2a, 0x3400010}, +{0x3400000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3400010}, +{0x3400000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3400000}, +{0x3400000, 0xba98d27, 0xba98d7a, 0xc298d51, 0x3400010}, +{0x3400000, 0xba98d27, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0xba98d27, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0x80000000, 0xba98d27, 0x3400000}, +{0x3400000, 0xba98d27, 0x80000001, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x80000076, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3400080}, +{0x3400000, 0xba98d27, 0x80800000, 0xba98d25, 0x3400000}, +{0x3400000, 0xba98d27, 0x80800002, 0xba98d25, 0x3400010}, +{0x3400000, 0xba98d27, 0x81398437, 0xba98d22, 0x3400010}, +{0x3400000, 0xba98d27, 0x8ba98d27, 0x0, 0x3400000}, +{0x3400000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3400000}, +{0x3400000, 0xba98d27, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0xba98d27, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0xba98d27, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xba98d27, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d27, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0xba98d27, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0xba98d27, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0xba98d27, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0xba98d27, 0x9503366, 0xbb00ec3, 0x3400010}, +{0x3400000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xba98d27, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xba98d27, 0x966320b, 0xbb0beb8, 0x3400010}, +{0x3400000, 0xba98d27, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xba98d27, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0xba98d27, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0xba98d27, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0xba98d7a, 0x0, 0xba98d7a, 0x3400000}, +{0x3400000, 0xba98d7a, 0x1, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x76, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3400000}, +{0x3400000, 0xba98d7a, 0x800002, 0xba98d7d, 0x3400010}, +{0x3400000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3400010}, +{0x3400000, 0xba98d7a, 0xba98d27, 0xc298d51, 0x3400010}, +{0x3400000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3400000}, +{0x3400000, 0xba98d7a, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0xba98d7a, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3400000}, +{0x3400000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3400080}, +{0x3400000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3400000}, +{0x3400000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3400010}, +{0x3400000, 0xba98d7a, 0x81398437, 0xba98d75, 0x3400010}, +{0x3400000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3400000}, +{0x3400000, 0xba98d7a, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0xba98d7a, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0xba98d7a, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xba98d7a, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xba98d7a, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0xba98d7a, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0xba98d7a, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0xba98d7a, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0xba98d7a, 0x9503366, 0xbb00f16, 0x3400010}, +{0x3400000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xba98d7a, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xba98d7a, 0x966320b, 0xbb0bf0b, 0x3400010}, +{0x3400000, 0xba98d7a, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xba98d7a, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0xba98d7a, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0xba98d7a, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x751f853a, 0x0, 0x751f853a, 0x3400000}, +{0x3400000, 0x751f853a, 0x1, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x76, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x2b94, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x636d24, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x800000, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x800002, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x1398437, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0xba98d27, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0xba98d7a, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3400000}, +{0x3400000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3400010}, +{0x3400000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0x80000000, 0x751f853a, 0x3400000}, +{0x3400000, 0x751f853a, 0x80000001, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x80000076, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3400080}, +{0x3400000, 0x751f853a, 0x80800000, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x80800002, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x81398437, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0xf51f853a, 0x0, 0x3400000}, +{0x3400000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3400010}, +{0x3400000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3400010}, +{0x3400000, 0x751f853a, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x751f853a, 0x4f3495cb, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x7c994e9e, 0x7c994fde, 0x3400010}, +{0x3400000, 0x751f853a, 0x6164bd6c, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x9503366, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3400010}, +{0x3400000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x966320b, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3400010}, +{0x3400000, 0x751f853a, 0x317285d3, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x3c9623b1, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x51fd2c7c, 0x751f853b, 0x3400010}, +{0x3400000, 0x751f853a, 0x7b906a6c, 0x7b906f69, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x800000, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x800002, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x1398437, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe7, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x9503366, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x966320b, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x800000, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x800002, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x1398437, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xba98d27, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xba98d7a, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff6, 0x3400010}, +{0x3400000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3400000}, +{0x3400000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f7fffff, 0x4f3495cb, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x6164bd6c, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x9503366, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x966320b, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x7f7fffff, 0x317285d3, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x3c9623b1, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x51fd2c7c, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3400014}, +{0x3400000, 0x7f800000, 0x0, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x1, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x76, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x2b94, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x636d24, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x800002, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x1398437, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0x80000000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x80000001, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x80000076, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3400080}, +{0x3400000, 0x7f800000, 0x80800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x80800002, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x81398437, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x9503366, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x966320b, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3400000}, +{0x3400000, 0x7f800001, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0x0, 0x0, 0x3400000}, +{0x3400000, 0x80000000, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x800000, 0x800000, 0x3400000}, +{0x3400000, 0x80000000, 0x800002, 0x800002, 0x3400000}, +{0x3400000, 0x80000000, 0x1398437, 0x1398437, 0x3400000}, +{0x3400000, 0x80000000, 0xba98d27, 0xba98d27, 0x3400000}, +{0x3400000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3400000}, +{0x3400000, 0x80000000, 0x751f853a, 0x751f853a, 0x3400000}, +{0x3400000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3400000}, +{0x3400000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3400000}, +{0x3400000, 0x80000000, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0x80000000, 0x80000000, 0x3400000}, +{0x3400000, 0x80000000, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000000, 0x80800000, 0x80800000, 0x3400000}, +{0x3400000, 0x80000000, 0x80800002, 0x80800002, 0x3400000}, +{0x3400000, 0x80000000, 0x81398437, 0x81398437, 0x3400000}, +{0x3400000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3400000}, +{0x3400000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3400000}, +{0x3400000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3400000}, +{0x3400000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3400000}, +{0x3400000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3400000}, +{0x3400000, 0x80000000, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x80000000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3400000}, +{0x3400000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3400000}, +{0x3400000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3400000}, +{0x3400000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3400000}, +{0x3400000, 0x80000000, 0x9503366, 0x9503366, 0x3400000}, +{0x3400000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3400000}, +{0x3400000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3400000}, +{0x3400000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3400000}, +{0x3400000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3400000}, +{0x3400000, 0x80000000, 0x966320b, 0x966320b, 0x3400000}, +{0x3400000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3400000}, +{0x3400000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400000}, +{0x3400000, 0x80000000, 0x317285d3, 0x317285d3, 0x3400000}, +{0x3400000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3400000}, +{0x3400000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3400000}, +{0x3400000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3400000}, +{0x3400000, 0x80000001, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x80000001, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x80000001, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x80000001, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x80000001, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x80000001, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000001, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x80000001, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x80000001, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x80000001, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x80000001, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x80000001, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x80000001, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x80000001, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x80000076, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x80000076, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x80000076, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x80000076, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x80000076, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x80000076, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x80000076, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x80000076, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x80000076, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x80000076, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x80000076, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x80000076, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x80000076, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x80000076, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x80002b94, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x80002b94, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x80002b94, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x80002b94, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x80002b94, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x80002b94, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x80002b94, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x80002b94, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x80002b94, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x80636d24, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x80636d24, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x80636d24, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x80636d24, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x80636d24, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x80636d24, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x80636d24, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x80636d24, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x80636d24, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x807fffff, 0x0, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x1, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x76, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x2b94, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x636d24, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x7fffff, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x800000, 0x800000, 0x3400080}, +{0x3400000, 0x807fffff, 0x800002, 0x800002, 0x3400080}, +{0x3400000, 0x807fffff, 0x1398437, 0x1398437, 0x3400080}, +{0x3400000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3400080}, +{0x3400000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3400080}, +{0x3400000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3400080}, +{0x3400000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3400080}, +{0x3400000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3400080}, +{0x3400000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3400080}, +{0x3400000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0x80000000, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x80000001, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x80000076, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x80002b94, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x80636d24, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x807fffff, 0x0, 0x3400080}, +{0x3400000, 0x807fffff, 0x80800000, 0x80800000, 0x3400080}, +{0x3400000, 0x807fffff, 0x80800002, 0x80800002, 0x3400080}, +{0x3400000, 0x807fffff, 0x81398437, 0x81398437, 0x3400080}, +{0x3400000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3400080}, +{0x3400000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3400080}, +{0x3400000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0x807fffff, 0xff800000, 0xff800000, 0x3400080}, +{0x3400000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3400080}, +{0x3400000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x807fffff, 0x9503366, 0x9503366, 0x3400080}, +{0x3400000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0x807fffff, 0x966320b, 0x966320b, 0x3400080}, +{0x3400000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3400080}, +{0x3400000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3400080}, +{0x3400000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x80800000, 0x0, 0x80800000, 0x3400000}, +{0x3400000, 0x80800000, 0x1, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x76, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x2b94, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x636d24, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x7fffff, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x800000, 0x0, 0x3400000}, +{0x3400000, 0x80800000, 0x800002, 0x0, 0x3400008}, +{0x3400000, 0x80800000, 0x1398437, 0xf3086e, 0x3400000}, +{0x3400000, 0x80800000, 0xba98d27, 0xba98d25, 0x3400000}, +{0x3400000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3400000}, +{0x3400000, 0x80800000, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x80800000, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0x80000000, 0x80800000, 0x3400000}, +{0x3400000, 0x80800000, 0x80000001, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x80000076, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x80002b94, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x80636d24, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x807fffff, 0x80800000, 0x3400080}, +{0x3400000, 0x80800000, 0x80800000, 0x81000000, 0x3400000}, +{0x3400000, 0x80800000, 0x80800002, 0x81000001, 0x3400000}, +{0x3400000, 0x80800000, 0x81398437, 0x81798437, 0x3400000}, +{0x3400000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3400000}, +{0x3400000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3400000}, +{0x3400000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0x80800000, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x80800000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x80800000, 0x9503366, 0x9503326, 0x3400000}, +{0x3400000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0x80800000, 0x966320b, 0x96631cb, 0x3400000}, +{0x3400000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3400010}, +{0x3400000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0x80800000, 0x317285d3, 0x317285d3, 0x3400010}, +{0x3400000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x80800002, 0x0, 0x80800002, 0x3400000}, +{0x3400000, 0x80800002, 0x1, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x76, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x2b94, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x636d24, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x7fffff, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x800000, 0x0, 0x3400008}, +{0x3400000, 0x80800002, 0x800002, 0x0, 0x3400000}, +{0x3400000, 0x80800002, 0x1398437, 0xf3086c, 0x3400000}, +{0x3400000, 0x80800002, 0xba98d27, 0xba98d25, 0x3400010}, +{0x3400000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3400010}, +{0x3400000, 0x80800002, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x80800002, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0x80000000, 0x80800002, 0x3400000}, +{0x3400000, 0x80800002, 0x80000001, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x80000076, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x80002b94, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x80636d24, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x807fffff, 0x80800002, 0x3400080}, +{0x3400000, 0x80800002, 0x80800000, 0x81000001, 0x3400000}, +{0x3400000, 0x80800002, 0x80800002, 0x81000002, 0x3400000}, +{0x3400000, 0x80800002, 0x81398437, 0x81798438, 0x3400000}, +{0x3400000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3400010}, +{0x3400000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3400010}, +{0x3400000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0x80800002, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x80800002, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x80800002, 0x9503366, 0x9503326, 0x3400010}, +{0x3400000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0x80800002, 0x966320b, 0x96631cb, 0x3400010}, +{0x3400000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3400010}, +{0x3400000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0x80800002, 0x317285d3, 0x317285d3, 0x3400010}, +{0x3400000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x81398437, 0x0, 0x81398437, 0x3400000}, +{0x3400000, 0x81398437, 0x1, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x76, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x2b94, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x636d24, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x7fffff, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x800000, 0x80f3086e, 0x3400000}, +{0x3400000, 0x81398437, 0x800002, 0x80f3086c, 0x3400000}, +{0x3400000, 0x81398437, 0x1398437, 0x0, 0x3400000}, +{0x3400000, 0x81398437, 0xba98d27, 0xba98d22, 0x3400010}, +{0x3400000, 0x81398437, 0xba98d7a, 0xba98d75, 0x3400010}, +{0x3400000, 0x81398437, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x81398437, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0x80000000, 0x81398437, 0x3400000}, +{0x3400000, 0x81398437, 0x80000001, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x80000076, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x80002b94, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x80636d24, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x807fffff, 0x81398437, 0x3400080}, +{0x3400000, 0x81398437, 0x80800000, 0x81798437, 0x3400000}, +{0x3400000, 0x81398437, 0x80800002, 0x81798438, 0x3400000}, +{0x3400000, 0x81398437, 0x81398437, 0x81b98437, 0x3400000}, +{0x3400000, 0x81398437, 0x8ba98d27, 0x8ba98d2c, 0x3400010}, +{0x3400000, 0x81398437, 0x8ba98d7a, 0x8ba98d7f, 0x3400010}, +{0x3400000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0x81398437, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x81398437, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x81398437, 0x9503366, 0x95032ad, 0x3400010}, +{0x3400000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0x81398437, 0x966320b, 0x9663152, 0x3400010}, +{0x3400000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3400010}, +{0x3400000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0x81398437, 0x317285d3, 0x317285d3, 0x3400010}, +{0x3400000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x800002, 0x8ba98d24, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xba98d27, 0x0, 0x3400000}, +{0x3400000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3400080}, +{0x3400000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x81398437, 0x8ba98d2c, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x9503366, 0x8ba30b8b, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x966320b, 0x8ba25b96, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3400010}, +{0x3400000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x800002, 0x8ba98d77, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3400080}, +{0x3400000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x81398437, 0x8ba98d7f, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x9503366, 0x8ba30bde, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x966320b, 0x8ba25be9, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0xf51f853a, 0x0, 0xf51f853a, 0x3400000}, +{0x3400000, 0xf51f853a, 0x1, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x76, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x800000, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x800002, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x1398437, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0xba98d27, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0xba98d7a, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x751f853a, 0x0, 0x3400000}, +{0x3400000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe7, 0x3400010}, +{0x3400000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff6, 0x3400010}, +{0x3400000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3400000}, +{0x3400000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3400080}, +{0x3400000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3400000}, +{0x3400000, 0xf51f853a, 0xff7ffff0, 0xff7ffff9, 0x3400010}, +{0x3400000, 0xf51f853a, 0xff7fffff, 0xff7fffff, 0x3400014}, +{0x3400000, 0xf51f853a, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xf51f853a, 0x4f3495cb, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3400010}, +{0x3400000, 0xf51f853a, 0x6164bd6c, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x9503366, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x77f31e2f, 0x77ee2206, 0x3400010}, +{0x3400000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x966320b, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3400010}, +{0x3400000, 0xf51f853a, 0x317285d3, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x3c9623b1, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x51fd2c7c, 0xf51f8539, 0x3400010}, +{0x3400000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x800000, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x800002, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x1398437, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xba98d27, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xba98d7a, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3400080}, +{0x3400000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xf51f853a, 0xff7ffff9, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xff7ffff0, 0xff7fffff, 0x3400014}, +{0x3400000, 0xff7ffff0, 0xff7fffff, 0xff7fffff, 0x3400014}, +{0x3400000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7ffff0, 0x4f3495cb, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x6164bd6c, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x9503366, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe09, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x966320b, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x317285d3, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x3c9623b1, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x51fd2c7c, 0xff7fffef, 0x3400010}, +{0x3400000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3400010}, +{0x3400000, 0xff7fffff, 0x0, 0xff7fffff, 0x3400000}, +{0x3400000, 0xff7fffff, 0x1, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x76, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x800000, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x800002, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x1398437, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0xba98d27, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0xba98d7a, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3400010}, +{0x3400000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3400000}, +{0x3400000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3400000}, +{0x3400000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3400080}, +{0x3400000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0xf51f853a, 0xff7fffff, 0x3400014}, +{0x3400000, 0xff7fffff, 0xff7ffff0, 0xff7fffff, 0x3400014}, +{0x3400000, 0xff7fffff, 0xff7fffff, 0xff7fffff, 0x3400014}, +{0x3400000, 0xff7fffff, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff7fffff, 0x4f3495cb, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3400010}, +{0x3400000, 0xff7fffff, 0x6164bd6c, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x9503366, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x77f31e2f, 0xff7ffe18, 0x3400010}, +{0x3400000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x966320b, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3400010}, +{0x3400000, 0xff7fffff, 0x317285d3, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x3c9623b1, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x51fd2c7c, 0xff7ffffe, 0x3400010}, +{0x3400000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3400010}, +{0x3400000, 0xff800000, 0x0, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x1, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x76, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x2b94, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x636d24, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x7fffff, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x800000, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x800002, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x1398437, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xba98d27, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xba98d7a, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x751f853a, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0x80000000, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x80000001, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x80000076, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x80002b94, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x80636d24, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x807fffff, 0xff800000, 0x3400080}, +{0x3400000, 0xff800000, 0x80800000, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x80800002, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x81398437, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xf51f853a, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xff7fffff, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xe73a5134, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x9503366, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x966320b, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xb26bddee, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x317285d3, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3400000}, +{0x3400000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3400000}, +{0x3400000, 0xff800001, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff800001, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x1, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x76, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3400081}, +{0x3400000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x1, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x76, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3400080}, +{0x3400000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3400000}, +{0x3400000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x800000, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x800002, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x1398437, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xba98d27, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xba98d7a, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3400080}, +{0x3400000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3400000}, +{0x3400000, 0x4f3495cb, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x9503366, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x966320b, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x317285d3, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x51fd2c7c, 0x52016896, 0x3400010}, +{0x3400000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0xe73a5134, 0x0, 0xe73a5134, 0x3400000}, +{0x3400000, 0xe73a5134, 0x1, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x76, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x800000, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x800002, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x1398437, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0xba98d27, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0xba98d7a, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3400000}, +{0x3400000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3400080}, +{0x3400000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xe73a5134, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe73a5134, 0x4f3495cb, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3400000}, +{0x3400000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3400010}, +{0x3400000, 0xe73a5134, 0x9503366, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3400000}, +{0x3400000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x966320b, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3400010}, +{0x3400000, 0xe73a5134, 0x317285d3, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x3c9623b1, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x51fd2c7c, 0xe73a5133, 0x3400010}, +{0x3400000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x800000, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x800002, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x1398437, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xba98d27, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xba98d7a, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x751f853a, 0x7c994fde, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3400014}, +{0x3400000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3400080}, +{0x3400000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3400000}, +{0x3400000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x9503366, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x966320b, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x317285d3, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x800000, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x800002, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x1398437, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xba98d27, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xba98d7a, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3400080}, +{0x3400000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3400000}, +{0x3400000, 0x6164bd6c, 0x9503366, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x966320b, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x317285d3, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x9503366, 0x0, 0x9503366, 0x3400000}, +{0x3400000, 0x9503366, 0x1, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x76, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x2b94, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x636d24, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x7fffff, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x800000, 0x95033a6, 0x3400000}, +{0x3400000, 0x9503366, 0x800002, 0x95033a7, 0x3400010}, +{0x3400000, 0x9503366, 0x1398437, 0x9503420, 0x3400010}, +{0x3400000, 0x9503366, 0xba98d27, 0xbb00ec3, 0x3400010}, +{0x3400000, 0x9503366, 0xba98d7a, 0xbb00f16, 0x3400010}, +{0x3400000, 0x9503366, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x9503366, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x9503366, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x9503366, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0x80000000, 0x9503366, 0x3400000}, +{0x3400000, 0x9503366, 0x80000001, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x80000076, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x80002b94, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x80636d24, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x807fffff, 0x9503366, 0x3400080}, +{0x3400000, 0x9503366, 0x80800000, 0x9503326, 0x3400000}, +{0x3400000, 0x9503366, 0x80800002, 0x9503326, 0x3400010}, +{0x3400000, 0x9503366, 0x81398437, 0x95032ad, 0x3400010}, +{0x3400000, 0x9503366, 0x8ba98d27, 0x8ba30b8b, 0x3400010}, +{0x3400000, 0x9503366, 0x8ba98d7a, 0x8ba30bde, 0x3400010}, +{0x3400000, 0x9503366, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x9503366, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x9503366, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x9503366, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x9503366, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x9503366, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x9503366, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x9503366, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x9503366, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x9503366, 0x9503366, 0x9d03366, 0x3400000}, +{0x3400000, 0x9503366, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x9503366, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x9503366, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x9503366, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0x9503366, 0x966320b, 0x9db32b9, 0x3400010}, +{0x3400000, 0x9503366, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0x9503366, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0x9503366, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x9503366, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x9503366, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x800000, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x800002, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x1398437, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3400080}, +{0x3400000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x9503366, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3400000}, +{0x3400000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x966320b, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x800000, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x800002, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x1398437, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3400080}, +{0x3400000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x9503366, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3400000}, +{0x3400000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x966320b, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x800000, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x800002, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x1398437, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xba98d27, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xba98d7a, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3400014}, +{0x3400000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3400080}, +{0x3400000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xf51f853a, 0x77ee2206, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe09, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xff7fffff, 0xff7ffe18, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x77f31e2f, 0x4f3495cb, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x6164bd6c, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x9503366, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3400000}, +{0x3400000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x966320b, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x317285d3, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x3c9623b1, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e30, 0x3400010}, +{0x3400000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8b, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x800000, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x800002, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x1398437, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3400080}, +{0x3400000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x9503366, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3400000}, +{0x3400000, 0xaab4d7d8, 0x966320b, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf57, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d5, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x317285d3, 0x3172802d, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x966320b, 0x0, 0x966320b, 0x3400000}, +{0x3400000, 0x966320b, 0x1, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x76, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x2b94, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x636d24, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x7fffff, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x800000, 0x966324b, 0x3400000}, +{0x3400000, 0x966320b, 0x800002, 0x966324c, 0x3400010}, +{0x3400000, 0x966320b, 0x1398437, 0x96632c5, 0x3400010}, +{0x3400000, 0x966320b, 0xba98d27, 0xbb0beb8, 0x3400010}, +{0x3400000, 0x966320b, 0xba98d7a, 0xbb0bf0b, 0x3400010}, +{0x3400000, 0x966320b, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x966320b, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x966320b, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x966320b, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0x80000000, 0x966320b, 0x3400000}, +{0x3400000, 0x966320b, 0x80000001, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x80000076, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x80002b94, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x80636d24, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x807fffff, 0x966320b, 0x3400080}, +{0x3400000, 0x966320b, 0x80800000, 0x96631cb, 0x3400000}, +{0x3400000, 0x966320b, 0x80800002, 0x96631cb, 0x3400010}, +{0x3400000, 0x966320b, 0x81398437, 0x9663152, 0x3400010}, +{0x3400000, 0x966320b, 0x8ba98d27, 0x8ba25b96, 0x3400010}, +{0x3400000, 0x966320b, 0x8ba98d7a, 0x8ba25be9, 0x3400010}, +{0x3400000, 0x966320b, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x966320b, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x966320b, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x966320b, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x966320b, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x966320b, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x966320b, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x966320b, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x966320b, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x966320b, 0x9503366, 0x9db32b9, 0x3400010}, +{0x3400000, 0x966320b, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x966320b, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x966320b, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x966320b, 0xaab4d7d8, 0xaab4d7d7, 0x3400010}, +{0x3400000, 0x966320b, 0x966320b, 0x9e6320b, 0x3400000}, +{0x3400000, 0x966320b, 0xb26bddee, 0xb26bdded, 0x3400010}, +{0x3400000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0x966320b, 0x317285d3, 0x317285d4, 0x3400010}, +{0x3400000, 0x966320b, 0x3c9623b1, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x966320b, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x966320b, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0xb26bddee, 0x0, 0xb26bddee, 0x3400000}, +{0x3400000, 0xb26bddee, 0x1, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x76, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x800000, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0x800002, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0x1398437, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0xba98d27, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0xba98d7a, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3400000}, +{0x3400000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3400080}, +{0x3400000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3400010}, +{0x3400000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3400010}, +{0x3400000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3400010}, +{0x3400000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3400010}, +{0x3400000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3400010}, +{0x3400000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xb26bddee, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0xb26bddee, 0x9503366, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3400010}, +{0x3400000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf57, 0x3400010}, +{0x3400000, 0xb26bddee, 0x966320b, 0xb26bdded, 0x3400010}, +{0x3400000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3400000}, +{0x3400000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8e, 0x3400010}, +{0x3400000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3400010}, +{0x3400000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3400010}, +{0x3400000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3400080}, +{0x3400000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d5, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d2, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8e, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3400000}, +{0x3400000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208e, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x317285d3, 0x0, 0x317285d3, 0x3400000}, +{0x3400000, 0x317285d3, 0x1, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x76, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x2b94, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x636d24, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x800000, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0x800002, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0x1398437, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0xba98d27, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0xba98d7a, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x317285d3, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0x80000000, 0x317285d3, 0x3400000}, +{0x3400000, 0x317285d3, 0x80000001, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x80000076, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3400080}, +{0x3400000, 0x317285d3, 0x80800000, 0x317285d3, 0x3400010}, +{0x3400000, 0x317285d3, 0x80800002, 0x317285d3, 0x3400010}, +{0x3400000, 0x317285d3, 0x81398437, 0x317285d3, 0x3400010}, +{0x3400000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3400010}, +{0x3400000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3400010}, +{0x3400000, 0x317285d3, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x317285d3, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x317285d3, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x317285d3, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x317285d3, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x317285d3, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x317285d3, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x317285d3, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x317285d3, 0x9503366, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c8, 0x3400010}, +{0x3400000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x317285d3, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x317285d3, 0xaab4d7d8, 0x3172802d, 0x3400010}, +{0x3400000, 0x317285d3, 0x966320b, 0x317285d4, 0x3400010}, +{0x3400000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3400010}, +{0x3400000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3400010}, +{0x3400000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3400000}, +{0x3400000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3400010}, +{0x3400000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x317285d3, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x800000, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x800002, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x1398437, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xba98d27, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xba98d7a, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3400080}, +{0x3400000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cc, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x9503366, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x966320b, 0x3c9623b2, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3400010}, +{0x3400000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208e, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3400000}, +{0x3400000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x800000, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x800002, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x1398437, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x751f853a, 0x751f853b, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff1, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3400080}, +{0x3400000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xf51f853a, 0xf51f8539, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xff7ffff0, 0xff7fffef, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xff7fffff, 0xff7ffffe, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x4f3495cb, 0x52016896, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xe73a5134, 0xe73a5133, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9f, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x9503366, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a13, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e30, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x966320b, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7d, 0x3400010}, +{0x3400000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3400000}, +{0x3400000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x800000, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x800002, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x1398437, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xba98d27, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xba98d7a, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x751f853a, 0x7b906f69, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3400014}, +{0x3400000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3400014}, +{0x3400000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3400080}, +{0x3400000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3400001}, +{0x3400000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3400000}, +{0x3400000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x9503366, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8b, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x966320b, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x317285d3, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6d, 0x3400010}, +{0x3400000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3400000}, +{0x3000000, 0x0, 0x0, 0x0, 0x3000000}, +{0x3000000, 0x0, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x800000, 0x800000, 0x3000000}, +{0x3000000, 0x0, 0x800002, 0x800002, 0x3000000}, +{0x3000000, 0x0, 0x1398437, 0x1398437, 0x3000000}, +{0x3000000, 0x0, 0xba98d27, 0xba98d27, 0x3000000}, +{0x3000000, 0x0, 0xba98d7a, 0xba98d7a, 0x3000000}, +{0x3000000, 0x0, 0x751f853a, 0x751f853a, 0x3000000}, +{0x3000000, 0x0, 0x7f7ffff0, 0x7f7ffff0, 0x3000000}, +{0x3000000, 0x0, 0x7f7fffff, 0x7f7fffff, 0x3000000}, +{0x3000000, 0x0, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x0, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0x80000000, 0x0, 0x3000000}, +{0x3000000, 0x0, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x0, 0x80800000, 0x80800000, 0x3000000}, +{0x3000000, 0x0, 0x80800002, 0x80800002, 0x3000000}, +{0x3000000, 0x0, 0x81398437, 0x81398437, 0x3000000}, +{0x3000000, 0x0, 0x8ba98d27, 0x8ba98d27, 0x3000000}, +{0x3000000, 0x0, 0x8ba98d7a, 0x8ba98d7a, 0x3000000}, +{0x3000000, 0x0, 0xf51f853a, 0xf51f853a, 0x3000000}, +{0x3000000, 0x0, 0xff7ffff0, 0xff7ffff0, 0x3000000}, +{0x3000000, 0x0, 0xff7fffff, 0xff7fffff, 0x3000000}, +{0x3000000, 0x0, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x0, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x0, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x0, 0x4f3495cb, 0x4f3495cb, 0x3000000}, +{0x3000000, 0x0, 0xe73a5134, 0xe73a5134, 0x3000000}, +{0x3000000, 0x0, 0x7c994e9e, 0x7c994e9e, 0x3000000}, +{0x3000000, 0x0, 0x6164bd6c, 0x6164bd6c, 0x3000000}, +{0x3000000, 0x0, 0x9503366, 0x9503366, 0x3000000}, +{0x3000000, 0x0, 0xbf5a97c9, 0xbf5a97c9, 0x3000000}, +{0x3000000, 0x0, 0xe6ff1a14, 0xe6ff1a14, 0x3000000}, +{0x3000000, 0x0, 0x77f31e2f, 0x77f31e2f, 0x3000000}, +{0x3000000, 0x0, 0xaab4d7d8, 0xaab4d7d8, 0x3000000}, +{0x3000000, 0x0, 0x966320b, 0x966320b, 0x3000000}, +{0x3000000, 0x0, 0xb26bddee, 0xb26bddee, 0x3000000}, +{0x3000000, 0x0, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000}, +{0x3000000, 0x0, 0x317285d3, 0x317285d3, 0x3000000}, +{0x3000000, 0x0, 0x3c9623b1, 0x3c9623b1, 0x3000000}, +{0x3000000, 0x0, 0x51fd2c7c, 0x51fd2c7c, 0x3000000}, +{0x3000000, 0x0, 0x7b906a6c, 0x7b906a6c, 0x3000000}, +{0x3000000, 0x1, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x1, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x1, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x1, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x1, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x1, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x1, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x1, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x1, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x1, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x1, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x1, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x1, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x1, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x1, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x1, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x1, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x1, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x1, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x1, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x1, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x1, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x1, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x1, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x1, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x1, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x1, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x1, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x1, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x1, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x1, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x1, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x1, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x1, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x1, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x1, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x1, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x76, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x76, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x76, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x76, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x76, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x76, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x76, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x76, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x76, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x76, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x76, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x76, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x76, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x76, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x76, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x76, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x76, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x76, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x76, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x76, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x76, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x76, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x76, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x76, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x76, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x76, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x76, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x76, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x76, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x76, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x76, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x76, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x76, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x76, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x76, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x76, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x76, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x2b94, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x2b94, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x2b94, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x2b94, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x2b94, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x2b94, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x2b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x2b94, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x2b94, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x2b94, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x2b94, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x2b94, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x2b94, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x2b94, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x2b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x2b94, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x2b94, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x2b94, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x2b94, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x2b94, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x2b94, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x2b94, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x2b94, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x2b94, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x2b94, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x2b94, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x2b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x2b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x2b94, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x2b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x2b94, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x2b94, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x2b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x2b94, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x2b94, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x2b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x2b94, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x636d24, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x636d24, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x636d24, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x636d24, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x636d24, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x636d24, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x636d24, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x636d24, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x636d24, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x636d24, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x636d24, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x636d24, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x636d24, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x636d24, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x636d24, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x636d24, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x636d24, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x636d24, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x636d24, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x636d24, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x636d24, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7fffff, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x7fffff, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x7fffff, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x7fffff, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x7fffff, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x7fffff, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x7fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7fffff, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x7fffff, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x7fffff, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x7fffff, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x7fffff, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x7fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x7fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x7fffff, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x7fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x7fffff, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x7fffff, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x7fffff, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fffff, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x7fffff, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x7fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x7fffff, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x7fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x7fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x7fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x7fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x7fffff, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x7fffff, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x7fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x7fffff, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x7fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x7fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x7fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x800000, 0x0, 0x800000, 0x3000000}, +{0x3000000, 0x800000, 0x1, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x76, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x2b94, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x636d24, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x7fffff, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x800000, 0x1000000, 0x3000000}, +{0x3000000, 0x800000, 0x800002, 0x1000001, 0x3000000}, +{0x3000000, 0x800000, 0x1398437, 0x1798437, 0x3000000}, +{0x3000000, 0x800000, 0xba98d27, 0xba98d29, 0x3000000}, +{0x3000000, 0x800000, 0xba98d7a, 0xba98d7c, 0x3000000}, +{0x3000000, 0x800000, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x800000, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x800000, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x800000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0x80000000, 0x800000, 0x3000000}, +{0x3000000, 0x800000, 0x80000001, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x80000076, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x80002b94, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x80636d24, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x807fffff, 0x800000, 0x3000080}, +{0x3000000, 0x800000, 0x80800000, 0x0, 0x3000000}, +{0x3000000, 0x800000, 0x80800002, 0x0, 0x3000008}, +{0x3000000, 0x800000, 0x81398437, 0x80f3086e, 0x3000000}, +{0x3000000, 0x800000, 0x8ba98d27, 0x8ba98d25, 0x3000000}, +{0x3000000, 0x800000, 0x8ba98d7a, 0x8ba98d78, 0x3000000}, +{0x3000000, 0x800000, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x800000, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x800000, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x800000, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x800000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800000, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x800000, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x800000, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x800000, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x800000, 0x9503366, 0x95033a6, 0x3000000}, +{0x3000000, 0x800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x800000, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x800000, 0x966320b, 0x966324b, 0x3000000}, +{0x3000000, 0x800000, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x800000, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x800000, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x800000, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x800002, 0x0, 0x800002, 0x3000000}, +{0x3000000, 0x800002, 0x1, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x76, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x2b94, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x636d24, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x7fffff, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x800000, 0x1000001, 0x3000000}, +{0x3000000, 0x800002, 0x800002, 0x1000002, 0x3000000}, +{0x3000000, 0x800002, 0x1398437, 0x1798438, 0x3000000}, +{0x3000000, 0x800002, 0xba98d27, 0xba98d29, 0x3000010}, +{0x3000000, 0x800002, 0xba98d7a, 0xba98d7c, 0x3000010}, +{0x3000000, 0x800002, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x800002, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x800002, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x800002, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0x80000000, 0x800002, 0x3000000}, +{0x3000000, 0x800002, 0x80000001, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x80000076, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x80002b94, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x80636d24, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x807fffff, 0x800002, 0x3000080}, +{0x3000000, 0x800002, 0x80800000, 0x0, 0x3000008}, +{0x3000000, 0x800002, 0x80800002, 0x0, 0x3000000}, +{0x3000000, 0x800002, 0x81398437, 0x80f3086c, 0x3000000}, +{0x3000000, 0x800002, 0x8ba98d27, 0x8ba98d25, 0x3000010}, +{0x3000000, 0x800002, 0x8ba98d7a, 0x8ba98d78, 0x3000010}, +{0x3000000, 0x800002, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x800002, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x800002, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x800002, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x800002, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x800002, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x800002, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x800002, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x800002, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x800002, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x800002, 0x9503366, 0x95033a6, 0x3000010}, +{0x3000000, 0x800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x800002, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x800002, 0x966320b, 0x966324b, 0x3000010}, +{0x3000000, 0x800002, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x800002, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x800002, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x800002, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x1398437, 0x0, 0x1398437, 0x3000000}, +{0x3000000, 0x1398437, 0x1, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x76, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x2b94, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x636d24, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x7fffff, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x800000, 0x1798437, 0x3000000}, +{0x3000000, 0x1398437, 0x800002, 0x1798438, 0x3000000}, +{0x3000000, 0x1398437, 0x1398437, 0x1b98437, 0x3000000}, +{0x3000000, 0x1398437, 0xba98d27, 0xba98d2d, 0x3000010}, +{0x3000000, 0x1398437, 0xba98d7a, 0xba98d80, 0x3000010}, +{0x3000000, 0x1398437, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x1398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x1398437, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x1398437, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x1398437, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0x80000000, 0x1398437, 0x3000000}, +{0x3000000, 0x1398437, 0x80000001, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x80000076, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x80002b94, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x80636d24, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x807fffff, 0x1398437, 0x3000080}, +{0x3000000, 0x1398437, 0x80800000, 0xf3086e, 0x3000000}, +{0x3000000, 0x1398437, 0x80800002, 0xf3086c, 0x3000000}, +{0x3000000, 0x1398437, 0x81398437, 0x0, 0x3000000}, +{0x3000000, 0x1398437, 0x8ba98d27, 0x8ba98d21, 0x3000010}, +{0x3000000, 0x1398437, 0x8ba98d7a, 0x8ba98d74, 0x3000010}, +{0x3000000, 0x1398437, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x1398437, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x1398437, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x1398437, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x1398437, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x1398437, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x1398437, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x1398437, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x1398437, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x1398437, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x1398437, 0x9503366, 0x9503420, 0x3000010}, +{0x3000000, 0x1398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x1398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x1398437, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x1398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x1398437, 0x966320b, 0x96632c5, 0x3000010}, +{0x3000000, 0x1398437, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x1398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x1398437, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x1398437, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x1398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x1398437, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xba98d27, 0x0, 0xba98d27, 0x3000000}, +{0x3000000, 0xba98d27, 0x1, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x76, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x2b94, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x636d24, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x7fffff, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x800000, 0xba98d29, 0x3000000}, +{0x3000000, 0xba98d27, 0x800002, 0xba98d29, 0x3000010}, +{0x3000000, 0xba98d27, 0x1398437, 0xba98d2d, 0x3000010}, +{0x3000000, 0xba98d27, 0xba98d27, 0xc298d27, 0x3000000}, +{0x3000000, 0xba98d27, 0xba98d7a, 0xc298d50, 0x3000010}, +{0x3000000, 0xba98d27, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xba98d27, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xba98d27, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0x80000000, 0xba98d27, 0x3000000}, +{0x3000000, 0xba98d27, 0x80000001, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x80000076, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x80002b94, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x80636d24, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x807fffff, 0xba98d27, 0x3000080}, +{0x3000000, 0xba98d27, 0x80800000, 0xba98d25, 0x3000000}, +{0x3000000, 0xba98d27, 0x80800002, 0xba98d25, 0x3000010}, +{0x3000000, 0xba98d27, 0x81398437, 0xba98d21, 0x3000010}, +{0x3000000, 0xba98d27, 0x8ba98d27, 0x0, 0x3000000}, +{0x3000000, 0xba98d27, 0x8ba98d7a, 0x83260000, 0x3000000}, +{0x3000000, 0xba98d27, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xba98d27, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xba98d27, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xba98d27, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d27, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xba98d27, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xba98d27, 0x9503366, 0xbb00ec2, 0x3000010}, +{0x3000000, 0xba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xba98d27, 0x966320b, 0xbb0beb7, 0x3000010}, +{0x3000000, 0xba98d27, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0xba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xba98d27, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0xba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0xba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xba98d7a, 0x0, 0xba98d7a, 0x3000000}, +{0x3000000, 0xba98d7a, 0x1, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x76, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x2b94, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x636d24, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x7fffff, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x800000, 0xba98d7c, 0x3000000}, +{0x3000000, 0xba98d7a, 0x800002, 0xba98d7c, 0x3000010}, +{0x3000000, 0xba98d7a, 0x1398437, 0xba98d80, 0x3000010}, +{0x3000000, 0xba98d7a, 0xba98d27, 0xc298d50, 0x3000010}, +{0x3000000, 0xba98d7a, 0xba98d7a, 0xc298d7a, 0x3000000}, +{0x3000000, 0xba98d7a, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xba98d7a, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x80000000, 0xba98d7a, 0x3000000}, +{0x3000000, 0xba98d7a, 0x80000001, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x80000076, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x80002b94, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x80636d24, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x807fffff, 0xba98d7a, 0x3000080}, +{0x3000000, 0xba98d7a, 0x80800000, 0xba98d78, 0x3000000}, +{0x3000000, 0xba98d7a, 0x80800002, 0xba98d78, 0x3000010}, +{0x3000000, 0xba98d7a, 0x81398437, 0xba98d74, 0x3000010}, +{0x3000000, 0xba98d7a, 0x8ba98d27, 0x3260000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x8ba98d7a, 0x0, 0x3000000}, +{0x3000000, 0xba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xba98d7a, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xba98d7a, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xba98d7a, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xba98d7a, 0x9503366, 0xbb00f15, 0x3000010}, +{0x3000000, 0xba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xba98d7a, 0x966320b, 0xbb0bf0a, 0x3000010}, +{0x3000000, 0xba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0xba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xba98d7a, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0xba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0xba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x751f853a, 0x0, 0x751f853a, 0x3000000}, +{0x3000000, 0x751f853a, 0x1, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x76, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x2b94, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x636d24, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x7fffff, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x800000, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x800002, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x1398437, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xba98d27, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xba98d7a, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x751f853a, 0x759f853a, 0x3000000}, +{0x3000000, 0x751f853a, 0x7f7ffff0, 0x7f7ffffa, 0x3000010}, +{0x3000000, 0x751f853a, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x751f853a, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x751f853a, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0x80000000, 0x751f853a, 0x3000000}, +{0x3000000, 0x751f853a, 0x80000001, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x80000076, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x80002b94, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x80636d24, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x807fffff, 0x751f853a, 0x3000080}, +{0x3000000, 0x751f853a, 0x80800000, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x80800002, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x81398437, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x8ba98d27, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x8ba98d7a, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xf51f853a, 0x0, 0x3000000}, +{0x3000000, 0x751f853a, 0xff7ffff0, 0xff7fffe6, 0x3000010}, +{0x3000000, 0x751f853a, 0xff7fffff, 0xff7ffff5, 0x3000010}, +{0x3000000, 0x751f853a, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x751f853a, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x751f853a, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x751f853a, 0x4f3495cb, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xe73a5134, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x7c994e9e, 0x7c994fdd, 0x3000010}, +{0x3000000, 0x751f853a, 0x6164bd6c, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x9503366, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xbf5a97c9, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xe6ff1a14, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x77f31e2f, 0x77f81a59, 0x3000010}, +{0x3000000, 0x751f853a, 0xaab4d7d8, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x966320b, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xb26bddee, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0xb5c8e5d3, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x317285d3, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x3c9623b1, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x51fd2c7c, 0x751f853a, 0x3000010}, +{0x3000000, 0x751f853a, 0x7b906a6c, 0x7b906f68, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x0, 0x7f7ffff0, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x1, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x76, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x2b94, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x636d24, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x7fffff, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x800000, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x800002, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x1398437, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xba98d27, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xba98d7a, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x751f853a, 0x7f7ffffa, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x7f7ffff0, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7ffff0, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7ffff0, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x80000000, 0x7f7ffff0, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x80000001, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x80000076, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x80002b94, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x80636d24, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x807fffff, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x7f7ffff0, 0x80800000, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x80800002, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x81398437, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x8ba98d27, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x8ba98d7a, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xf51f853a, 0x7f7fffe6, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xff7ffff0, 0x0, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0xff7fffff, 0xf5700000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7ffff0, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7ffff0, 0x4f3495cb, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xe73a5134, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x7c994e9e, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7ffff0, 0x6164bd6c, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x9503366, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xbf5a97c9, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xe6ff1a14, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x77f31e2f, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7ffff0, 0xaab4d7d8, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x966320b, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xb26bddee, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0xb5c8e5d3, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x317285d3, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x3c9623b1, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x51fd2c7c, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x7f7ffff0, 0x7b906a6c, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0x0, 0x7f7fffff, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x1, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x76, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x2b94, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x636d24, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x800000, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x800002, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x1398437, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xba98d27, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xba98d7a, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x751f853a, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0x7f7ffff0, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x80000000, 0x7f7fffff, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x80000001, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x80000076, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x80002b94, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x80636d24, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x807fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x7f7fffff, 0x80800000, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x80800002, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x81398437, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x8ba98d27, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x8ba98d7a, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xf51f853a, 0x7f7ffff5, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xff7ffff0, 0x75700000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0xff7fffff, 0x0, 0x3000000}, +{0x3000000, 0x7f7fffff, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f7fffff, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f7fffff, 0x4f3495cb, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xe73a5134, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x7c994e9e, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0x6164bd6c, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x9503366, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xbf5a97c9, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xe6ff1a14, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x77f31e2f, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f7fffff, 0xaab4d7d8, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x966320b, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xb26bddee, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0xb5c8e5d3, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x317285d3, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x3c9623b1, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x51fd2c7c, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x7f7fffff, 0x7b906a6c, 0x7f800000, 0x3000014}, +{0x3000000, 0x7f800000, 0x0, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x1, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x76, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x2b94, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x636d24, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x7fffff, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x800002, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x1398437, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xba98d27, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xba98d7a, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x751f853a, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7f7ffff0, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7f7fffff, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0x80000000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x80000001, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x80000076, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x80002b94, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x80636d24, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x807fffff, 0x7f800000, 0x3000080}, +{0x3000000, 0x7f800000, 0x80800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x80800002, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x81398437, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x8ba98d27, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x8ba98d7a, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xf51f853a, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xff7ffff0, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xff7fffff, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7f800000, 0x4f3495cb, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xe73a5134, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7c994e9e, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x6164bd6c, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x9503366, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xbf5a97c9, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xe6ff1a14, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x77f31e2f, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xaab4d7d8, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x966320b, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xb26bddee, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0xb5c8e5d3, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x317285d3, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x3c9623b1, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x51fd2c7c, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800000, 0x7b906a6c, 0x7f800000, 0x3000000}, +{0x3000000, 0x7f800001, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f800001, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f800001, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7f984a37, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7f984a37, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x7fbfffff, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fc00000, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fc00000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fc00000, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fd9ba98, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fd9ba98, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x7fffffff, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7fffffff, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7fffffff, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0x0, 0x0, 0x3000000}, +{0x3000000, 0x80000000, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x800000, 0x800000, 0x3000000}, +{0x3000000, 0x80000000, 0x800002, 0x800002, 0x3000000}, +{0x3000000, 0x80000000, 0x1398437, 0x1398437, 0x3000000}, +{0x3000000, 0x80000000, 0xba98d27, 0xba98d27, 0x3000000}, +{0x3000000, 0x80000000, 0xba98d7a, 0xba98d7a, 0x3000000}, +{0x3000000, 0x80000000, 0x751f853a, 0x751f853a, 0x3000000}, +{0x3000000, 0x80000000, 0x7f7ffff0, 0x7f7ffff0, 0x3000000}, +{0x3000000, 0x80000000, 0x7f7fffff, 0x7f7fffff, 0x3000000}, +{0x3000000, 0x80000000, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x80000000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0x80000000, 0x80000000, 0x3000000}, +{0x3000000, 0x80000000, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000000, 0x80800000, 0x80800000, 0x3000000}, +{0x3000000, 0x80000000, 0x80800002, 0x80800002, 0x3000000}, +{0x3000000, 0x80000000, 0x81398437, 0x81398437, 0x3000000}, +{0x3000000, 0x80000000, 0x8ba98d27, 0x8ba98d27, 0x3000000}, +{0x3000000, 0x80000000, 0x8ba98d7a, 0x8ba98d7a, 0x3000000}, +{0x3000000, 0x80000000, 0xf51f853a, 0xf51f853a, 0x3000000}, +{0x3000000, 0x80000000, 0xff7ffff0, 0xff7ffff0, 0x3000000}, +{0x3000000, 0x80000000, 0xff7fffff, 0xff7fffff, 0x3000000}, +{0x3000000, 0x80000000, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x80000000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80000000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80000000, 0x4f3495cb, 0x4f3495cb, 0x3000000}, +{0x3000000, 0x80000000, 0xe73a5134, 0xe73a5134, 0x3000000}, +{0x3000000, 0x80000000, 0x7c994e9e, 0x7c994e9e, 0x3000000}, +{0x3000000, 0x80000000, 0x6164bd6c, 0x6164bd6c, 0x3000000}, +{0x3000000, 0x80000000, 0x9503366, 0x9503366, 0x3000000}, +{0x3000000, 0x80000000, 0xbf5a97c9, 0xbf5a97c9, 0x3000000}, +{0x3000000, 0x80000000, 0xe6ff1a14, 0xe6ff1a14, 0x3000000}, +{0x3000000, 0x80000000, 0x77f31e2f, 0x77f31e2f, 0x3000000}, +{0x3000000, 0x80000000, 0xaab4d7d8, 0xaab4d7d8, 0x3000000}, +{0x3000000, 0x80000000, 0x966320b, 0x966320b, 0x3000000}, +{0x3000000, 0x80000000, 0xb26bddee, 0xb26bddee, 0x3000000}, +{0x3000000, 0x80000000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000000}, +{0x3000000, 0x80000000, 0x317285d3, 0x317285d3, 0x3000000}, +{0x3000000, 0x80000000, 0x3c9623b1, 0x3c9623b1, 0x3000000}, +{0x3000000, 0x80000000, 0x51fd2c7c, 0x51fd2c7c, 0x3000000}, +{0x3000000, 0x80000000, 0x7b906a6c, 0x7b906a6c, 0x3000000}, +{0x3000000, 0x80000001, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x80000001, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x80000001, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x80000001, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x80000001, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x80000001, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x80000001, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x80000001, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x80000001, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x80000001, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000001, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x80000001, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x80000001, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x80000001, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x80000001, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x80000001, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x80000001, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x80000001, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x80000001, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x80000001, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000001, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000001, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x80000001, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x80000001, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x80000001, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x80000001, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x80000001, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x80000001, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x80000001, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x80000001, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x80000001, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x80000001, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x80000001, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x80000001, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x80000001, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x80000001, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x80000001, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x80000076, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x80000076, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x80000076, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x80000076, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x80000076, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x80000076, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x80000076, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x80000076, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x80000076, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x80000076, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x80000076, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x80000076, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x80000076, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x80000076, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x80000076, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x80000076, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x80000076, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x80000076, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x80000076, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x80000076, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80000076, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80000076, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x80000076, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x80000076, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x80000076, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x80000076, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x80000076, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x80000076, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x80000076, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x80000076, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x80000076, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x80000076, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x80000076, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x80000076, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x80000076, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x80000076, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x80000076, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x80002b94, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x80002b94, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x80002b94, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x80002b94, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x80002b94, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x80002b94, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x80002b94, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x80002b94, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x80002b94, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x80002b94, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x80002b94, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x80002b94, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x80002b94, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x80002b94, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x80002b94, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x80002b94, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x80002b94, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x80002b94, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x80002b94, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x80002b94, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80002b94, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80002b94, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x80002b94, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x80002b94, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x80002b94, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x80002b94, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x80002b94, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x80002b94, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x80002b94, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x80002b94, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x80002b94, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x80002b94, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x80002b94, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x80002b94, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x80002b94, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x80002b94, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x80002b94, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x80636d24, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x80636d24, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x80636d24, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x80636d24, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x80636d24, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x80636d24, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x80636d24, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x80636d24, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x80636d24, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x80636d24, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x80636d24, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x80636d24, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x80636d24, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x80636d24, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x80636d24, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x80636d24, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x80636d24, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x80636d24, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x80636d24, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x80636d24, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x80636d24, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x80636d24, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x80636d24, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x80636d24, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x80636d24, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x80636d24, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x80636d24, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x80636d24, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x80636d24, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x80636d24, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x80636d24, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x80636d24, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x80636d24, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x80636d24, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x80636d24, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x80636d24, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x80636d24, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x807fffff, 0x0, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x1, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x76, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x2b94, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x636d24, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x7fffff, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x800000, 0x800000, 0x3000080}, +{0x3000000, 0x807fffff, 0x800002, 0x800002, 0x3000080}, +{0x3000000, 0x807fffff, 0x1398437, 0x1398437, 0x3000080}, +{0x3000000, 0x807fffff, 0xba98d27, 0xba98d27, 0x3000080}, +{0x3000000, 0x807fffff, 0xba98d7a, 0xba98d7a, 0x3000080}, +{0x3000000, 0x807fffff, 0x751f853a, 0x751f853a, 0x3000080}, +{0x3000000, 0x807fffff, 0x7f7ffff0, 0x7f7ffff0, 0x3000080}, +{0x3000000, 0x807fffff, 0x7f7fffff, 0x7f7fffff, 0x3000080}, +{0x3000000, 0x807fffff, 0x7f800000, 0x7f800000, 0x3000080}, +{0x3000000, 0x807fffff, 0x7f800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0x7f984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0x7fbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0x7fc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0x7fd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0x7fffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0x80000000, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x80000001, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x80000076, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x80002b94, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x80636d24, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x807fffff, 0x0, 0x3000080}, +{0x3000000, 0x807fffff, 0x80800000, 0x80800000, 0x3000080}, +{0x3000000, 0x807fffff, 0x80800002, 0x80800002, 0x3000080}, +{0x3000000, 0x807fffff, 0x81398437, 0x81398437, 0x3000080}, +{0x3000000, 0x807fffff, 0x8ba98d27, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x807fffff, 0x8ba98d7a, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x807fffff, 0xf51f853a, 0xf51f853a, 0x3000080}, +{0x3000000, 0x807fffff, 0xff7ffff0, 0xff7ffff0, 0x3000080}, +{0x3000000, 0x807fffff, 0xff7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0x807fffff, 0xff800000, 0xff800000, 0x3000080}, +{0x3000000, 0x807fffff, 0xff800001, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0xff984a37, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0xffbfffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0x807fffff, 0xffc00000, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0xffd9ba98, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0xffffffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0x807fffff, 0x4f3495cb, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x807fffff, 0xe73a5134, 0xe73a5134, 0x3000080}, +{0x3000000, 0x807fffff, 0x7c994e9e, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x807fffff, 0x6164bd6c, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x807fffff, 0x9503366, 0x9503366, 0x3000080}, +{0x3000000, 0x807fffff, 0xbf5a97c9, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0x807fffff, 0xe6ff1a14, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0x807fffff, 0x77f31e2f, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x807fffff, 0xaab4d7d8, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0x807fffff, 0x966320b, 0x966320b, 0x3000080}, +{0x3000000, 0x807fffff, 0xb26bddee, 0xb26bddee, 0x3000080}, +{0x3000000, 0x807fffff, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0x807fffff, 0x317285d3, 0x317285d3, 0x3000080}, +{0x3000000, 0x807fffff, 0x3c9623b1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x807fffff, 0x51fd2c7c, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x807fffff, 0x7b906a6c, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x80800000, 0x0, 0x80800000, 0x3000000}, +{0x3000000, 0x80800000, 0x1, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x76, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x2b94, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x636d24, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x7fffff, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x800000, 0x0, 0x3000000}, +{0x3000000, 0x80800000, 0x800002, 0x0, 0x3000008}, +{0x3000000, 0x80800000, 0x1398437, 0xf3086e, 0x3000000}, +{0x3000000, 0x80800000, 0xba98d27, 0xba98d25, 0x3000000}, +{0x3000000, 0x80800000, 0xba98d7a, 0xba98d78, 0x3000000}, +{0x3000000, 0x80800000, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x80800000, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x80800000, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x80800000, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x80800000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0x80000000, 0x80800000, 0x3000000}, +{0x3000000, 0x80800000, 0x80000001, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x80000076, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x80002b94, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x80636d24, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x807fffff, 0x80800000, 0x3000080}, +{0x3000000, 0x80800000, 0x80800000, 0x81000000, 0x3000000}, +{0x3000000, 0x80800000, 0x80800002, 0x81000001, 0x3000000}, +{0x3000000, 0x80800000, 0x81398437, 0x81798437, 0x3000000}, +{0x3000000, 0x80800000, 0x8ba98d27, 0x8ba98d29, 0x3000000}, +{0x3000000, 0x80800000, 0x8ba98d7a, 0x8ba98d7c, 0x3000000}, +{0x3000000, 0x80800000, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x80800000, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x80800000, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x80800000, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x80800000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800000, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x80800000, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x80800000, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x80800000, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x80800000, 0x9503366, 0x9503326, 0x3000000}, +{0x3000000, 0x80800000, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x80800000, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x80800000, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x80800000, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x80800000, 0x966320b, 0x96631cb, 0x3000000}, +{0x3000000, 0x80800000, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x80800000, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x80800000, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x80800000, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x80800000, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x80800000, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x80800002, 0x0, 0x80800002, 0x3000000}, +{0x3000000, 0x80800002, 0x1, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x76, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x2b94, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x636d24, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x7fffff, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x800000, 0x0, 0x3000008}, +{0x3000000, 0x80800002, 0x800002, 0x0, 0x3000000}, +{0x3000000, 0x80800002, 0x1398437, 0xf3086c, 0x3000000}, +{0x3000000, 0x80800002, 0xba98d27, 0xba98d25, 0x3000010}, +{0x3000000, 0x80800002, 0xba98d7a, 0xba98d78, 0x3000010}, +{0x3000000, 0x80800002, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x80800002, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x80800002, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x80800002, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x80800002, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0x80000000, 0x80800002, 0x3000000}, +{0x3000000, 0x80800002, 0x80000001, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x80000076, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x80002b94, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x80636d24, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x807fffff, 0x80800002, 0x3000080}, +{0x3000000, 0x80800002, 0x80800000, 0x81000001, 0x3000000}, +{0x3000000, 0x80800002, 0x80800002, 0x81000002, 0x3000000}, +{0x3000000, 0x80800002, 0x81398437, 0x81798438, 0x3000000}, +{0x3000000, 0x80800002, 0x8ba98d27, 0x8ba98d29, 0x3000010}, +{0x3000000, 0x80800002, 0x8ba98d7a, 0x8ba98d7c, 0x3000010}, +{0x3000000, 0x80800002, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x80800002, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x80800002, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x80800002, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x80800002, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x80800002, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x80800002, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x80800002, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x80800002, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x80800002, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x80800002, 0x9503366, 0x9503326, 0x3000010}, +{0x3000000, 0x80800002, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x80800002, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x80800002, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x80800002, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x80800002, 0x966320b, 0x96631cb, 0x3000010}, +{0x3000000, 0x80800002, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x80800002, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x80800002, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x80800002, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x80800002, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x80800002, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x81398437, 0x0, 0x81398437, 0x3000000}, +{0x3000000, 0x81398437, 0x1, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x76, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x2b94, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x636d24, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x7fffff, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x800000, 0x80f3086e, 0x3000000}, +{0x3000000, 0x81398437, 0x800002, 0x80f3086c, 0x3000000}, +{0x3000000, 0x81398437, 0x1398437, 0x0, 0x3000000}, +{0x3000000, 0x81398437, 0xba98d27, 0xba98d21, 0x3000010}, +{0x3000000, 0x81398437, 0xba98d7a, 0xba98d74, 0x3000010}, +{0x3000000, 0x81398437, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x81398437, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x81398437, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x81398437, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x81398437, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0x80000000, 0x81398437, 0x3000000}, +{0x3000000, 0x81398437, 0x80000001, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x80000076, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x80002b94, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x80636d24, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x807fffff, 0x81398437, 0x3000080}, +{0x3000000, 0x81398437, 0x80800000, 0x81798437, 0x3000000}, +{0x3000000, 0x81398437, 0x80800002, 0x81798438, 0x3000000}, +{0x3000000, 0x81398437, 0x81398437, 0x81b98437, 0x3000000}, +{0x3000000, 0x81398437, 0x8ba98d27, 0x8ba98d2d, 0x3000010}, +{0x3000000, 0x81398437, 0x8ba98d7a, 0x8ba98d80, 0x3000010}, +{0x3000000, 0x81398437, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x81398437, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x81398437, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x81398437, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x81398437, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x81398437, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x81398437, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x81398437, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x81398437, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x81398437, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x81398437, 0x9503366, 0x95032ac, 0x3000010}, +{0x3000000, 0x81398437, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x81398437, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x81398437, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x81398437, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x81398437, 0x966320b, 0x9663151, 0x3000010}, +{0x3000000, 0x81398437, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x81398437, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x81398437, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x81398437, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x81398437, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x81398437, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x0, 0x8ba98d27, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x1, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x76, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x2b94, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x636d24, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x7fffff, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x800000, 0x8ba98d25, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x800002, 0x8ba98d25, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x1398437, 0x8ba98d21, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xba98d27, 0x0, 0x3000000}, +{0x3000000, 0x8ba98d27, 0xba98d7a, 0x3260000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x80000000, 0x8ba98d27, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x80000001, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x80000076, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x80002b94, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x80636d24, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x807fffff, 0x8ba98d27, 0x3000080}, +{0x3000000, 0x8ba98d27, 0x80800000, 0x8ba98d29, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x80800002, 0x8ba98d29, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x81398437, 0x8ba98d2d, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x8ba98d27, 0x8c298d27, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x8ba98d7a, 0x8c298d50, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d27, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d27, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x9503366, 0x8ba30b8c, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x966320b, 0x8ba25b97, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x8ba98d27, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x8ba98d27, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x0, 0x8ba98d7a, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x1, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x76, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x2b94, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x636d24, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x7fffff, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x800000, 0x8ba98d78, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x800002, 0x8ba98d78, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x1398437, 0x8ba98d74, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xba98d27, 0x83260000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0xba98d7a, 0x0, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x80000000, 0x8ba98d7a, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x80000001, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x80000076, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x80002b94, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x80636d24, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x807fffff, 0x8ba98d7a, 0x3000080}, +{0x3000000, 0x8ba98d7a, 0x80800000, 0x8ba98d7c, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x80800002, 0x8ba98d7c, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x81398437, 0x8ba98d80, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x8ba98d27, 0x8c298d50, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x8ba98d7a, 0x8c298d7a, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x8ba98d7a, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x8ba98d7a, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x9503366, 0x8ba30bdf, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x966320b, 0x8ba25bea, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x8ba98d7a, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xf51f853a, 0x0, 0xf51f853a, 0x3000000}, +{0x3000000, 0xf51f853a, 0x1, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x76, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x2b94, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x636d24, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x7fffff, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x800000, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x800002, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x1398437, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xba98d27, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xba98d7a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x751f853a, 0x0, 0x3000000}, +{0x3000000, 0xf51f853a, 0x7f7ffff0, 0x7f7fffe6, 0x3000010}, +{0x3000000, 0xf51f853a, 0x7f7fffff, 0x7f7ffff5, 0x3000010}, +{0x3000000, 0xf51f853a, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xf51f853a, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0x80000000, 0xf51f853a, 0x3000000}, +{0x3000000, 0xf51f853a, 0x80000001, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x80000076, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x80002b94, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x80636d24, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x807fffff, 0xf51f853a, 0x3000080}, +{0x3000000, 0xf51f853a, 0x80800000, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x80800002, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x81398437, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x8ba98d27, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x8ba98d7a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xf51f853a, 0xf59f853a, 0x3000000}, +{0x3000000, 0xf51f853a, 0xff7ffff0, 0xff7ffffa, 0x3000010}, +{0x3000000, 0xf51f853a, 0xff7fffff, 0xff800000, 0x3000014}, +{0x3000000, 0xf51f853a, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xf51f853a, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xf51f853a, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xf51f853a, 0x4f3495cb, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xe73a5134, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x7c994e9e, 0x7c994d5f, 0x3000010}, +{0x3000000, 0xf51f853a, 0x6164bd6c, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x9503366, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xbf5a97c9, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xe6ff1a14, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x77f31e2f, 0x77ee2205, 0x3000010}, +{0x3000000, 0xf51f853a, 0xaab4d7d8, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x966320b, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xb26bddee, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0xb5c8e5d3, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x317285d3, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x3c9623b1, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x51fd2c7c, 0xf51f853a, 0x3000010}, +{0x3000000, 0xf51f853a, 0x7b906a6c, 0x7b906570, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x0, 0xff7ffff0, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x1, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x76, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x2b94, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x636d24, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x7fffff, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x800000, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x800002, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x1398437, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xba98d27, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xba98d7a, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x751f853a, 0xff7fffe6, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x7f7ffff0, 0x0, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x7f7fffff, 0x75700000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x80000000, 0xff7ffff0, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x80000001, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x80000076, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x80002b94, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x80636d24, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x807fffff, 0xff7ffff0, 0x3000080}, +{0x3000000, 0xff7ffff0, 0x80800000, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x80800002, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x81398437, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x8ba98d27, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x8ba98d7a, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xf51f853a, 0xff7ffffa, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xff7ffff0, 0xff800000, 0x3000014}, +{0x3000000, 0xff7ffff0, 0xff7fffff, 0xff800000, 0x3000014}, +{0x3000000, 0xff7ffff0, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7ffff0, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7ffff0, 0x4f3495cb, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xe73a5134, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x7c994e9e, 0xff7b357b, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x6164bd6c, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x9503366, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xbf5a97c9, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xe6ff1a14, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x77f31e2f, 0xff7ffe0a, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xaab4d7d8, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x966320b, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xb26bddee, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0xb5c8e5d3, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x317285d3, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x3c9623b1, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x51fd2c7c, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xff7ffff0, 0x7b906a6c, 0xff7edf1b, 0x3000010}, +{0x3000000, 0xff7fffff, 0x0, 0xff7fffff, 0x3000000}, +{0x3000000, 0xff7fffff, 0x1, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x76, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x2b94, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x636d24, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x7fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x800000, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x800002, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x1398437, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xba98d27, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xba98d7a, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x751f853a, 0xff7ffff5, 0x3000010}, +{0x3000000, 0xff7fffff, 0x7f7ffff0, 0xf5700000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x7f7fffff, 0x0, 0x3000000}, +{0x3000000, 0xff7fffff, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x80000000, 0xff7fffff, 0x3000000}, +{0x3000000, 0xff7fffff, 0x80000001, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x80000076, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x80002b94, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x80636d24, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x807fffff, 0xff7fffff, 0x3000080}, +{0x3000000, 0xff7fffff, 0x80800000, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x80800002, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x81398437, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x8ba98d27, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x8ba98d7a, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xf51f853a, 0xff800000, 0x3000014}, +{0x3000000, 0xff7fffff, 0xff7ffff0, 0xff800000, 0x3000014}, +{0x3000000, 0xff7fffff, 0xff7fffff, 0xff800000, 0x3000014}, +{0x3000000, 0xff7fffff, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xff7fffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff7fffff, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff7fffff, 0x4f3495cb, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xe73a5134, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x7c994e9e, 0xff7b358a, 0x3000010}, +{0x3000000, 0xff7fffff, 0x6164bd6c, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x9503366, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xbf5a97c9, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xe6ff1a14, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x77f31e2f, 0xff7ffe19, 0x3000010}, +{0x3000000, 0xff7fffff, 0xaab4d7d8, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x966320b, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xb26bddee, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0xb5c8e5d3, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x317285d3, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x3c9623b1, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x51fd2c7c, 0xff7fffff, 0x3000010}, +{0x3000000, 0xff7fffff, 0x7b906a6c, 0xff7edf2a, 0x3000010}, +{0x3000000, 0xff800000, 0x0, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x1, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x76, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x2b94, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x636d24, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x7fffff, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x800000, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x800002, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x1398437, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xba98d27, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xba98d7a, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x751f853a, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x7f7ffff0, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x7f7fffff, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0x80000000, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x80000001, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x80000076, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x80002b94, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x80636d24, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x807fffff, 0xff800000, 0x3000080}, +{0x3000000, 0xff800000, 0x80800000, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x80800002, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x81398437, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x8ba98d27, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x8ba98d7a, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xf51f853a, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xff7ffff0, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xff7fffff, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xff800000, 0x4f3495cb, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xe73a5134, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x7c994e9e, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x6164bd6c, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x9503366, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xbf5a97c9, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xe6ff1a14, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x77f31e2f, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xaab4d7d8, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x966320b, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xb26bddee, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0xb5c8e5d3, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x317285d3, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x3c9623b1, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x51fd2c7c, 0xff800000, 0x3000000}, +{0x3000000, 0xff800000, 0x7b906a6c, 0xff800000, 0x3000000}, +{0x3000000, 0xff800001, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff800001, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff800001, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xff984a37, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xff984a37, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x1, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x76, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x2b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x7fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x1398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x751f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7f7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7f7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7f800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7fc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7fd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7fffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x80000000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x80000001, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x80000076, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x80002b94, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x80636d24, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x807fffff, 0x7fc00000, 0x3000081}, +{0x3000000, 0xffbfffff, 0x80800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x80800002, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x81398437, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x8ba98d27, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x8ba98d7a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xf51f853a, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xff7ffff0, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xff7fffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xff800000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xffc00000, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xffd9ba98, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xffffffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x4f3495cb, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xe73a5134, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7c994e9e, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x6164bd6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x9503366, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xbf5a97c9, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xe6ff1a14, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x77f31e2f, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xaab4d7d8, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x966320b, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xb26bddee, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0xb5c8e5d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x317285d3, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x3c9623b1, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x51fd2c7c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffbfffff, 0x7b906a6c, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffc00000, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffc00000, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffc00000, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffd9ba98, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffd9ba98, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffd9ba98, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x1, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x76, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x2b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x7fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x1398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x751f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7f7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7f7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7f800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x80000000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x80000001, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x80000076, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x80002b94, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x80636d24, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x807fffff, 0x7fc00000, 0x3000080}, +{0x3000000, 0xffffffff, 0x80800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x80800002, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x81398437, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x8ba98d27, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x8ba98d7a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xf51f853a, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xff7ffff0, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xff7fffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xff800000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xffffffff, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x4f3495cb, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xe73a5134, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7c994e9e, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x6164bd6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x9503366, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xbf5a97c9, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xe6ff1a14, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x77f31e2f, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xaab4d7d8, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x966320b, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xb26bddee, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0xb5c8e5d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x317285d3, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x3c9623b1, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x51fd2c7c, 0x7fc00000, 0x3000000}, +{0x3000000, 0xffffffff, 0x7b906a6c, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x0, 0x4f3495cb, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x1, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x76, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x2b94, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x636d24, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x7fffff, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x800000, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x800002, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x1398437, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xba98d27, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xba98d7a, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x80000000, 0x4f3495cb, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x80000001, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x80000076, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x80002b94, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x80636d24, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x807fffff, 0x4f3495cb, 0x3000080}, +{0x3000000, 0x4f3495cb, 0x80800000, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x80800002, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x81398437, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x8ba98d27, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x8ba98d7a, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x4f3495cb, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x4f3495cb, 0x4f3495cb, 0x4fb495cb, 0x3000000}, +{0x3000000, 0x4f3495cb, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x9503366, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xbf5a97c9, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xaab4d7d8, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x966320b, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xb26bddee, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0xb5c8e5d3, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x317285d3, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x3c9623b1, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x51fd2c7c, 0x52016895, 0x3000010}, +{0x3000000, 0x4f3495cb, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xe73a5134, 0x0, 0xe73a5134, 0x3000000}, +{0x3000000, 0xe73a5134, 0x1, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x76, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x2b94, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x636d24, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x7fffff, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x800000, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x800002, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x1398437, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xba98d27, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xba98d7a, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xe73a5134, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xe73a5134, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xe73a5134, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xe73a5134, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0x80000000, 0xe73a5134, 0x3000000}, +{0x3000000, 0xe73a5134, 0x80000001, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x80000076, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x80002b94, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x80636d24, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x807fffff, 0xe73a5134, 0x3000080}, +{0x3000000, 0xe73a5134, 0x80800000, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x80800002, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x81398437, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x8ba98d27, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x8ba98d7a, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xe73a5134, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xe73a5134, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xe73a5134, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xe73a5134, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe73a5134, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe73a5134, 0x4f3495cb, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xe73a5134, 0xe7ba5134, 0x3000000}, +{0x3000000, 0xe73a5134, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xe73a5134, 0x6164bd6c, 0xe73a42e8, 0x3000010}, +{0x3000000, 0xe73a5134, 0x9503366, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xbf5a97c9, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xe6ff1a14, 0xe79cef1f, 0x3000000}, +{0x3000000, 0xe73a5134, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xe73a5134, 0xaab4d7d8, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x966320b, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xb26bddee, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0xb5c8e5d3, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x317285d3, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x3c9623b1, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x51fd2c7c, 0xe73a5134, 0x3000010}, +{0x3000000, 0xe73a5134, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x0, 0x7c994e9e, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x1, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x76, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x2b94, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x636d24, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x7fffff, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x800000, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x800002, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x1398437, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xba98d27, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xba98d7a, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x751f853a, 0x7c994fdd, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x7f7ffff0, 0x7f800000, 0x3000014}, +{0x3000000, 0x7c994e9e, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x7c994e9e, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x80000000, 0x7c994e9e, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x80000001, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x80000076, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x80002b94, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x80636d24, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x807fffff, 0x7c994e9e, 0x3000080}, +{0x3000000, 0x7c994e9e, 0x80800000, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x80800002, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x81398437, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x8ba98d27, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x8ba98d7a, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xf51f853a, 0x7c994d5f, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xff7ffff0, 0xff7b357b, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xff7fffff, 0xff7b358a, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7c994e9e, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x4f3495cb, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xe73a5134, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x7c994e9e, 0x7d194e9e, 0x3000000}, +{0x3000000, 0x7c994e9e, 0x6164bd6c, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x9503366, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xbf5a97c9, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xe6ff1a14, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x77f31e2f, 0x7c998b66, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xaab4d7d8, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x966320b, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xb26bddee, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0xb5c8e5d3, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x317285d3, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x3c9623b1, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x51fd2c7c, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x7c994e9e, 0x7b906a6c, 0x7cbd6939, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x0, 0x6164bd6c, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x1, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x76, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x2b94, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x636d24, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x7fffff, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x800000, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x800002, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x1398437, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xba98d27, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xba98d7a, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x80000000, 0x6164bd6c, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x80000001, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x80000076, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x80002b94, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x80636d24, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x807fffff, 0x6164bd6c, 0x3000080}, +{0x3000000, 0x6164bd6c, 0x80800000, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x80800002, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x81398437, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x8ba98d27, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x8ba98d7a, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x6164bd6c, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x4f3495cb, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xe73a5134, 0xe73a42e8, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x6164bd6c, 0x61e4bd6c, 0x3000000}, +{0x3000000, 0x6164bd6c, 0x9503366, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xbf5a97c9, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xe6ff1a14, 0xe6fefd7c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xaab4d7d8, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x966320b, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xb26bddee, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0xb5c8e5d3, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x317285d3, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x3c9623b1, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x51fd2c7c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x6164bd6c, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x9503366, 0x0, 0x9503366, 0x3000000}, +{0x3000000, 0x9503366, 0x1, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x76, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x2b94, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x636d24, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x7fffff, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x800000, 0x95033a6, 0x3000000}, +{0x3000000, 0x9503366, 0x800002, 0x95033a6, 0x3000010}, +{0x3000000, 0x9503366, 0x1398437, 0x9503420, 0x3000010}, +{0x3000000, 0x9503366, 0xba98d27, 0xbb00ec2, 0x3000010}, +{0x3000000, 0x9503366, 0xba98d7a, 0xbb00f15, 0x3000010}, +{0x3000000, 0x9503366, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x9503366, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x9503366, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x9503366, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x9503366, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0x80000000, 0x9503366, 0x3000000}, +{0x3000000, 0x9503366, 0x80000001, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x80000076, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x80002b94, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x80636d24, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x807fffff, 0x9503366, 0x3000080}, +{0x3000000, 0x9503366, 0x80800000, 0x9503326, 0x3000000}, +{0x3000000, 0x9503366, 0x80800002, 0x9503326, 0x3000010}, +{0x3000000, 0x9503366, 0x81398437, 0x95032ac, 0x3000010}, +{0x3000000, 0x9503366, 0x8ba98d27, 0x8ba30b8c, 0x3000010}, +{0x3000000, 0x9503366, 0x8ba98d7a, 0x8ba30bdf, 0x3000010}, +{0x3000000, 0x9503366, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x9503366, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x9503366, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x9503366, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x9503366, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x9503366, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x9503366, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x9503366, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x9503366, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x9503366, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x9503366, 0x9503366, 0x9d03366, 0x3000000}, +{0x3000000, 0x9503366, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x9503366, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x9503366, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x9503366, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x9503366, 0x966320b, 0x9db32b8, 0x3000010}, +{0x3000000, 0x9503366, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x9503366, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x9503366, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x9503366, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x9503366, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x9503366, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x0, 0xbf5a97c9, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x1, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x76, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x2b94, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x636d24, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x7fffff, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x800000, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x800002, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x1398437, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xba98d27, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xba98d7a, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x80000000, 0xbf5a97c9, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x80000001, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x80000076, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x80002b94, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x80636d24, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x807fffff, 0xbf5a97c9, 0x3000080}, +{0x3000000, 0xbf5a97c9, 0x80800000, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x80800002, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x81398437, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x8ba98d27, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x8ba98d7a, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xbf5a97c9, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x9503366, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xbf5a97c9, 0xbfda97c9, 0x3000000}, +{0x3000000, 0xbf5a97c9, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xaab4d7d8, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x966320b, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xb26bddee, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0xb5c8e5d3, 0xbf5a97e2, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x317285d3, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x3c9623b1, 0xbf55e6ab, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xbf5a97c9, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x0, 0xe6ff1a14, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x1, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x76, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x2b94, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x636d24, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x7fffff, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x800000, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x800002, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x1398437, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xba98d27, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xba98d7a, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x80000000, 0xe6ff1a14, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x80000001, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x80000076, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x80002b94, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x80636d24, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x807fffff, 0xe6ff1a14, 0x3000080}, +{0x3000000, 0xe6ff1a14, 0x80800000, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x80800002, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x81398437, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x8ba98d27, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x8ba98d7a, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xe6ff1a14, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x4f3495cb, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xe73a5134, 0xe79cef1f, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x6164bd6c, 0xe6fefd7c, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x9503366, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xbf5a97c9, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xe6ff1a14, 0xe77f1a14, 0x3000000}, +{0x3000000, 0xe6ff1a14, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xaab4d7d8, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x966320b, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xb26bddee, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0xb5c8e5d3, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x317285d3, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x3c9623b1, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x51fd2c7c, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xe6ff1a14, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x0, 0x77f31e2f, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x1, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x76, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x2b94, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x636d24, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x7fffff, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x800000, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x800002, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x1398437, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xba98d27, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xba98d7a, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x751f853a, 0x77f81a59, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x7f7ffff0, 0x7f800000, 0x3000014}, +{0x3000000, 0x77f31e2f, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x77f31e2f, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x80000000, 0x77f31e2f, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x80000001, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x80000076, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x80002b94, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x80636d24, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x807fffff, 0x77f31e2f, 0x3000080}, +{0x3000000, 0x77f31e2f, 0x80800000, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x80800002, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x81398437, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x8ba98d27, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x8ba98d7a, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xf51f853a, 0x77ee2205, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xff7ffff0, 0xff7ffe0a, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xff7fffff, 0xff7ffe19, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x77f31e2f, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x77f31e2f, 0x4f3495cb, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xe73a5134, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x7c994e9e, 0x7c998b66, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x6164bd6c, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x9503366, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xbf5a97c9, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xe6ff1a14, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x77f31e2f, 0x78731e2f, 0x3000000}, +{0x3000000, 0x77f31e2f, 0xaab4d7d8, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x966320b, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xb26bddee, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0xb5c8e5d3, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x317285d3, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x3c9623b1, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x51fd2c7c, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x77f31e2f, 0x7b906a6c, 0x7b915d8a, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x0, 0xaab4d7d8, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x1, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x76, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x2b94, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x636d24, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x7fffff, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x800000, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x800002, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x1398437, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xba98d27, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xba98d7a, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x80000000, 0xaab4d7d8, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x80000001, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x80000076, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x80002b94, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x80636d24, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x807fffff, 0xaab4d7d8, 0x3000080}, +{0x3000000, 0xaab4d7d8, 0x80800000, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x80800002, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x81398437, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x8ba98d27, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x8ba98d7a, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xaab4d7d8, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x9503366, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xaab4d7d8, 0xab34d7d8, 0x3000000}, +{0x3000000, 0xaab4d7d8, 0x966320b, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xb26bddee, 0xb26bdf58, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0xb5c8e5d3, 0xb5c8e5d6, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x317285d3, 0x3172802c, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xaab4d7d8, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x966320b, 0x0, 0x966320b, 0x3000000}, +{0x3000000, 0x966320b, 0x1, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x76, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x2b94, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x636d24, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x7fffff, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x800000, 0x966324b, 0x3000000}, +{0x3000000, 0x966320b, 0x800002, 0x966324b, 0x3000010}, +{0x3000000, 0x966320b, 0x1398437, 0x96632c5, 0x3000010}, +{0x3000000, 0x966320b, 0xba98d27, 0xbb0beb7, 0x3000010}, +{0x3000000, 0x966320b, 0xba98d7a, 0xbb0bf0a, 0x3000010}, +{0x3000000, 0x966320b, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x966320b, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x966320b, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x966320b, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x966320b, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0x80000000, 0x966320b, 0x3000000}, +{0x3000000, 0x966320b, 0x80000001, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x80000076, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x80002b94, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x80636d24, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x807fffff, 0x966320b, 0x3000080}, +{0x3000000, 0x966320b, 0x80800000, 0x96631cb, 0x3000000}, +{0x3000000, 0x966320b, 0x80800002, 0x96631cb, 0x3000010}, +{0x3000000, 0x966320b, 0x81398437, 0x9663151, 0x3000010}, +{0x3000000, 0x966320b, 0x8ba98d27, 0x8ba25b97, 0x3000010}, +{0x3000000, 0x966320b, 0x8ba98d7a, 0x8ba25bea, 0x3000010}, +{0x3000000, 0x966320b, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x966320b, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x966320b, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x966320b, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x966320b, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x966320b, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x966320b, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x966320b, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x966320b, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x966320b, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x966320b, 0x9503366, 0x9db32b8, 0x3000010}, +{0x3000000, 0x966320b, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x966320b, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x966320b, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x966320b, 0xaab4d7d8, 0xaab4d7d8, 0x3000010}, +{0x3000000, 0x966320b, 0x966320b, 0x9e6320b, 0x3000000}, +{0x3000000, 0x966320b, 0xb26bddee, 0xb26bddee, 0x3000010}, +{0x3000000, 0x966320b, 0xb5c8e5d3, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0x966320b, 0x317285d3, 0x317285d3, 0x3000010}, +{0x3000000, 0x966320b, 0x3c9623b1, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x966320b, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x966320b, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xb26bddee, 0x0, 0xb26bddee, 0x3000000}, +{0x3000000, 0xb26bddee, 0x1, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x76, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x2b94, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x636d24, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x7fffff, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x800000, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x800002, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x1398437, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0xba98d27, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0xba98d7a, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xb26bddee, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xb26bddee, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xb26bddee, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xb26bddee, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0x80000000, 0xb26bddee, 0x3000000}, +{0x3000000, 0xb26bddee, 0x80000001, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x80000076, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x80002b94, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x80636d24, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x807fffff, 0xb26bddee, 0x3000080}, +{0x3000000, 0xb26bddee, 0x80800000, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x80800002, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x81398437, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x8ba98d27, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0x8ba98d7a, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xb26bddee, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xb26bddee, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xb26bddee, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xb26bddee, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb26bddee, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb26bddee, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xb26bddee, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xb26bddee, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xb26bddee, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xb26bddee, 0x9503366, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0xb26bddee, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xb26bddee, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xb26bddee, 0xaab4d7d8, 0xb26bdf58, 0x3000010}, +{0x3000000, 0xb26bddee, 0x966320b, 0xb26bddee, 0x3000010}, +{0x3000000, 0xb26bddee, 0xb26bddee, 0xb2ebddee, 0x3000000}, +{0x3000000, 0xb26bddee, 0xb5c8e5d3, 0xb5cabd8f, 0x3000010}, +{0x3000000, 0xb26bddee, 0x317285d3, 0xb22f3c79, 0x3000010}, +{0x3000000, 0xb26bddee, 0x3c9623b1, 0x3c9623aa, 0x3000010}, +{0x3000000, 0xb26bddee, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xb26bddee, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x0, 0xb5c8e5d3, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x1, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x76, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x2b94, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x636d24, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x7fffff, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x800000, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x800002, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x1398437, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xba98d27, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xba98d7a, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x80000000, 0xb5c8e5d3, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x80000001, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x80000076, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x80002b94, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x80636d24, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x807fffff, 0xb5c8e5d3, 0x3000080}, +{0x3000000, 0xb5c8e5d3, 0x80800000, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x80800002, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x81398437, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x8ba98d27, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x8ba98d7a, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0xb5c8e5d3, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x9503366, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xbf5a97c9, 0xbf5a97e2, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xaab4d7d8, 0xb5c8e5d6, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x966320b, 0xb5c8e5d3, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xb26bddee, 0xb5cabd8f, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0xb5c8e5d3, 0xb648e5d3, 0x3000000}, +{0x3000000, 0xb5c8e5d3, 0x317285d3, 0xb5c86c90, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x3c9623b1, 0x3c96208d, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0xb5c8e5d3, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x317285d3, 0x0, 0x317285d3, 0x3000000}, +{0x3000000, 0x317285d3, 0x1, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x76, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x2b94, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x636d24, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x7fffff, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x800000, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x800002, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x1398437, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0xba98d27, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0xba98d7a, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x317285d3, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x317285d3, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x317285d3, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x317285d3, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0x80000000, 0x317285d3, 0x3000000}, +{0x3000000, 0x317285d3, 0x80000001, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x80000076, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x80002b94, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x80636d24, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x807fffff, 0x317285d3, 0x3000080}, +{0x3000000, 0x317285d3, 0x80800000, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x80800002, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x81398437, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x8ba98d27, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0x8ba98d7a, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x317285d3, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x317285d3, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x317285d3, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x317285d3, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x317285d3, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x317285d3, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x317285d3, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x317285d3, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x317285d3, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x317285d3, 0x9503366, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0xbf5a97c9, 0xbf5a97c9, 0x3000010}, +{0x3000000, 0x317285d3, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x317285d3, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x317285d3, 0xaab4d7d8, 0x3172802c, 0x3000010}, +{0x3000000, 0x317285d3, 0x966320b, 0x317285d3, 0x3000010}, +{0x3000000, 0x317285d3, 0xb26bddee, 0xb22f3c79, 0x3000010}, +{0x3000000, 0x317285d3, 0xb5c8e5d3, 0xb5c86c90, 0x3000010}, +{0x3000000, 0x317285d3, 0x317285d3, 0x31f285d3, 0x3000000}, +{0x3000000, 0x317285d3, 0x3c9623b1, 0x3c9623b3, 0x3000010}, +{0x3000000, 0x317285d3, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x317285d3, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x0, 0x3c9623b1, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x1, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x76, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x2b94, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x636d24, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x7fffff, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x800000, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x800002, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x1398437, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xba98d27, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xba98d7a, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x80000000, 0x3c9623b1, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x80000001, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x80000076, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x80002b94, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x80636d24, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x807fffff, 0x3c9623b1, 0x3000080}, +{0x3000000, 0x3c9623b1, 0x80800000, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x80800002, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x81398437, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x8ba98d27, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x8ba98d7a, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x3c9623b1, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x4f3495cb, 0x4f3495cb, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x9503366, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xbf5a97c9, 0xbf55e6ab, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xaab4d7d8, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x966320b, 0x3c9623b1, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xb26bddee, 0x3c9623aa, 0x3000010}, +{0x3000000, 0x3c9623b1, 0xb5c8e5d3, 0x3c96208d, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x317285d3, 0x3c9623b3, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x3c9623b1, 0x3d1623b1, 0x3000000}, +{0x3000000, 0x3c9623b1, 0x51fd2c7c, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x3c9623b1, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x0, 0x51fd2c7c, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x1, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x76, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x2b94, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x636d24, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x7fffff, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x800000, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x800002, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x1398437, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xba98d27, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xba98d7a, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x751f853a, 0x751f853a, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x7f7ffff0, 0x7f7ffff0, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x7f7fffff, 0x7f7fffff, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x80000000, 0x51fd2c7c, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x80000001, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x80000076, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x80002b94, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x80636d24, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x807fffff, 0x51fd2c7c, 0x3000080}, +{0x3000000, 0x51fd2c7c, 0x80800000, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x80800002, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x81398437, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x8ba98d27, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x8ba98d7a, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xf51f853a, 0xf51f853a, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xff7ffff0, 0xff7ffff0, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xff7fffff, 0xff7fffff, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x51fd2c7c, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x4f3495cb, 0x52016895, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xe73a5134, 0xe73a5134, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x7c994e9e, 0x7c994e9e, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x6164bd6c, 0x6164bd6c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x9503366, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xbf5a97c9, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xe6ff1a14, 0xe6ff1a14, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x77f31e2f, 0x77f31e2f, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xaab4d7d8, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x966320b, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xb26bddee, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0xb5c8e5d3, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x317285d3, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x3c9623b1, 0x51fd2c7c, 0x3000010}, +{0x3000000, 0x51fd2c7c, 0x51fd2c7c, 0x527d2c7c, 0x3000000}, +{0x3000000, 0x51fd2c7c, 0x7b906a6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x0, 0x7b906a6c, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x1, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x76, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x2b94, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x636d24, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x7fffff, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x800000, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x800002, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x1398437, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xba98d27, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xba98d7a, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x751f853a, 0x7b906f68, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x7f7ffff0, 0x7f800000, 0x3000014}, +{0x3000000, 0x7b906a6c, 0x7f7fffff, 0x7f800000, 0x3000014}, +{0x3000000, 0x7b906a6c, 0x7f800000, 0x7f800000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x7f800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0x7f984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0x7fbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0x7fc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x7fd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x7fffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x80000000, 0x7b906a6c, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x80000001, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x80000076, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x80002b94, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x80636d24, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x807fffff, 0x7b906a6c, 0x3000080}, +{0x3000000, 0x7b906a6c, 0x80800000, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x80800002, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x81398437, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x8ba98d27, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x8ba98d7a, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xf51f853a, 0x7b906570, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xff7ffff0, 0xff7edf1b, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xff7fffff, 0xff7edf2a, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xff800000, 0xff800000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0xff800001, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0xff984a37, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0xffbfffff, 0x7fc00000, 0x3000001}, +{0x3000000, 0x7b906a6c, 0xffc00000, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0xffd9ba98, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0xffffffff, 0x7fc00000, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x4f3495cb, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xe73a5134, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x7c994e9e, 0x7cbd6939, 0x3000000}, +{0x3000000, 0x7b906a6c, 0x6164bd6c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x9503366, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xbf5a97c9, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xe6ff1a14, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x77f31e2f, 0x7b915d8a, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xaab4d7d8, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x966320b, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xb26bddee, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0xb5c8e5d3, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x317285d3, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x3c9623b1, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x51fd2c7c, 0x7b906a6c, 0x3000010}, +{0x3000000, 0x7b906a6c, 0x7b906a6c, 0x7c106a6c, 0x3000000}, diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp new file mode 100644 index 000000000..671afb702 --- /dev/null +++ b/src/tests/core/memory/memory.cpp @@ -0,0 +1,56 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <catch.hpp> +#include "core/hle/kernel/memory.h" +#include "core/hle/kernel/process.h" +#include "core/memory.h" + +TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { + SECTION("these regions should not be mapped on an empty process") { + auto process = Kernel::Process::Create(""); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::HEAP_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::LINEAR_HEAP_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == false); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::TLS_AREA_VADDR) == false); + } + + SECTION("CONFIG_MEMORY_VADDR and SHARED_PAGE_VADDR should be valid after mapping them") { + auto process = Kernel::Process::Create(""); + Kernel::MapSharedPages(process->vm_manager); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == true); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == true); + } + + SECTION("special regions should be valid after mapping them") { + auto process = Kernel::Process::Create(""); + SECTION("VRAM") { + Kernel::HandleSpecialMapping(process->vm_manager, + {Memory::VRAM_VADDR, Memory::VRAM_SIZE, false, false}); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::VRAM_VADDR) == true); + } + + SECTION("IO (Not yet implemented)") { + Kernel::HandleSpecialMapping( + process->vm_manager, {Memory::IO_AREA_VADDR, Memory::IO_AREA_SIZE, false, false}); + CHECK_FALSE(Memory::IsValidVirtualAddress(*process, Memory::IO_AREA_VADDR) == true); + } + + SECTION("DSP") { + Kernel::HandleSpecialMapping( + process->vm_manager, {Memory::DSP_RAM_VADDR, Memory::DSP_RAM_SIZE, false, false}); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::DSP_RAM_VADDR) == true); + } + } + + SECTION("Unmapping a VAddr should make it invalid") { + auto process = Kernel::Process::Create(""); + Kernel::MapSharedPages(process->vm_manager); + process->vm_manager.UnmapRange(Memory::CONFIG_MEMORY_VADDR, Memory::CONFIG_MEMORY_SIZE); + CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false); + } +} diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 0961a3251..82f47d8a9 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -1,6 +1,7 @@ set(SRCS command_processor.cpp debug_utils/debug_utils.cpp + geometry_pipeline.cpp pica.cpp primitive_assembly.cpp regs.cpp @@ -15,6 +16,7 @@ set(SRCS shader/shader_interpreter.cpp swrasterizer/clipper.cpp swrasterizer/framebuffer.cpp + swrasterizer/lighting.cpp swrasterizer/proctex.cpp swrasterizer/rasterizer.cpp swrasterizer/swrasterizer.cpp @@ -28,6 +30,7 @@ set(SRCS set(HEADERS command_processor.h debug_utils/debug_utils.h + geometry_pipeline.h gpu_debugger.h pica.h pica_state.h @@ -55,6 +58,7 @@ set(HEADERS shader/shader_interpreter.h swrasterizer/clipper.h swrasterizer/framebuffer.h + swrasterizer/lighting.h swrasterizer/proctex.h swrasterizer/rasterizer.h swrasterizer/swrasterizer.h diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp index 4633a1df1..caf9f7a06 100644 --- a/src/video_core/command_processor.cpp +++ b/src/video_core/command_processor.cpp @@ -119,24 +119,221 @@ static void WriteUniformFloatReg(ShaderRegs& config, Shader::ShaderSetup& setup, } } -static void WriteProgramCode(ShaderRegs& config, Shader::ShaderSetup& setup, - unsigned max_program_code_length, u32 value) { - if (config.program.offset >= max_program_code_length) { - LOG_ERROR(HW_GPU, "Invalid %s program offset %d", GetShaderSetupTypeName(setup), - (int)config.program.offset); - } else { - setup.program_code[config.program.offset] = value; - config.program.offset++; +static void LoadDefaultVertexAttributes(u32 register_value) { + auto& regs = g_state.regs; + + // TODO: Does actual hardware indeed keep an intermediate buffer or does + // it directly write the values? + default_attr_write_buffer[default_attr_counter++] = register_value; + + // Default attributes are written in a packed format such that four float24 values are encoded + // in three 32-bit numbers. + // We write to internal memory once a full such vector is written. + if (default_attr_counter >= 3) { + default_attr_counter = 0; + + auto& setup = regs.pipeline.vs_default_attributes_setup; + + if (setup.index >= 16) { + LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index); + return; + } + + Math::Vec4<float24> attribute; + + // NOTE: The destination component order indeed is "backwards" + attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8); + attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) | + ((default_attr_write_buffer[1] >> 16) & 0xFFFF)); + attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) | + ((default_attr_write_buffer[2] >> 24) & 0xFF)); + attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF); + + LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index, + attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(), + attribute.w.ToFloat32()); + + // TODO: Verify that this actually modifies the register! + if (setup.index < 15) { + g_state.input_default_attributes.attr[setup.index] = attribute; + setup.index++; + } else { + // Put each attribute into an immediate input buffer. When all specified immediate + // attributes are present, the Vertex Shader is invoked and everything is sent to + // the primitive assembler. + + auto& immediate_input = g_state.immediate.input_vertex; + auto& immediate_attribute_id = g_state.immediate.current_attribute; + + immediate_input.attr[immediate_attribute_id] = attribute; + + if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) { + immediate_attribute_id += 1; + } else { + MICROPROFILE_SCOPE(GPU_Drawing); + immediate_attribute_id = 0; + + auto* shader_engine = Shader::GetEngine(); + shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset); + + // Send to vertex shader + if (g_debug_context) + g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation, + static_cast<void*>(&immediate_input)); + Shader::UnitState shader_unit; + Shader::AttributeBuffer output{}; + + shader_unit.LoadInput(regs.vs, immediate_input); + shader_engine->Run(g_state.vs, shader_unit); + shader_unit.WriteOutput(regs.vs, output); + + // Send to geometry pipeline + if (g_state.immediate.reset_geometry_pipeline) { + g_state.geometry_pipeline.Reconfigure(); + g_state.immediate.reset_geometry_pipeline = false; + } + ASSERT(!g_state.geometry_pipeline.NeedIndexInput()); + g_state.geometry_pipeline.Setup(shader_engine); + g_state.geometry_pipeline.SubmitVertex(output); + + // TODO: If drawing after every immediate mode triangle kills performance, + // change it to flush triangles whenever a drawing config register changes + // See: https://github.com/citra-emu/citra/pull/2866#issuecomment-327011550 + VideoCore::g_renderer->Rasterizer()->DrawTriangles(); + if (g_debug_context) { + g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr); + } + } + } } } -static void WriteSwizzlePatterns(ShaderRegs& config, Shader::ShaderSetup& setup, u32 value) { - if (config.swizzle_patterns.offset >= setup.swizzle_data.size()) { - LOG_ERROR(HW_GPU, "Invalid %s swizzle pattern offset %d", GetShaderSetupTypeName(setup), - (int)config.swizzle_patterns.offset); - } else { - setup.swizzle_data[config.swizzle_patterns.offset] = value; - config.swizzle_patterns.offset++; +static void Draw(u32 command_id) { + MICROPROFILE_SCOPE(GPU_Drawing); + auto& regs = g_state.regs; + +#if PICA_LOG_TEV + DebugUtils::DumpTevStageConfig(regs.GetTevStages()); +#endif + if (g_debug_context) + g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr); + + // Processes information about internal vertex attributes to figure out how a vertex is + // loaded. + // Later, these can be compiled and cached. + const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress(); + VertexLoader loader(regs.pipeline); + + // Load vertices + bool is_indexed = (command_id == PICA_REG_INDEX(pipeline.trigger_draw_indexed)); + + const auto& index_info = regs.pipeline.index_array; + const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset); + const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8); + bool index_u16 = index_info.format != 0; + + PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler; + + if (g_debug_context && g_debug_context->recorder) { + for (int i = 0; i < 3; ++i) { + const auto texture = regs.texturing.GetTextures()[i]; + if (!texture.enabled) + continue; + + u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress()); + g_debug_context->recorder->MemoryAccessed( + texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) * + texture.config.width / 2 * texture.config.height, + texture.config.GetPhysicalAddress()); + } + } + + DebugUtils::MemoryAccessTracker memory_accesses; + + // Simple circular-replacement vertex cache + // The size has been tuned for optimal balance between hit-rate and the cost of lookup + const size_t VERTEX_CACHE_SIZE = 32; + std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids; + std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache; + Shader::AttributeBuffer vs_output; + + unsigned int vertex_cache_pos = 0; + vertex_cache_ids.fill(-1); + + auto* shader_engine = Shader::GetEngine(); + Shader::UnitState shader_unit; + + shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset); + + g_state.geometry_pipeline.Reconfigure(); + g_state.geometry_pipeline.Setup(shader_engine); + if (g_state.geometry_pipeline.NeedIndexInput()) + ASSERT(is_indexed); + + for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) { + // Indexed rendering doesn't use the start offset + unsigned int vertex = is_indexed + ? (index_u16 ? index_address_16[index] : index_address_8[index]) + : (index + regs.pipeline.vertex_offset); + + // -1 is a common special value used for primitive restart. Since it's unknown if + // the PICA supports it, and it would mess up the caching, guard against it here. + ASSERT(vertex != -1); + + bool vertex_cache_hit = false; + + if (is_indexed) { + if (g_state.geometry_pipeline.NeedIndexInput()) { + g_state.geometry_pipeline.SubmitIndex(vertex); + continue; + } + + if (g_debug_context && Pica::g_debug_context->recorder) { + int size = index_u16 ? 2 : 1; + memory_accesses.AddAccess(base_address + index_info.offset + size * index, size); + } + + for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) { + if (vertex == vertex_cache_ids[i]) { + vs_output = vertex_cache[i]; + vertex_cache_hit = true; + break; + } + } + } + + if (!vertex_cache_hit) { + // Initialize data for the current vertex + Shader::AttributeBuffer input; + loader.LoadVertex(base_address, index, vertex, input, memory_accesses); + + // Send to vertex shader + if (g_debug_context) + g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation, + (void*)&input); + shader_unit.LoadInput(regs.vs, input); + shader_engine->Run(g_state.vs, shader_unit); + shader_unit.WriteOutput(regs.vs, vs_output); + + if (is_indexed) { + vertex_cache[vertex_cache_pos] = vs_output; + vertex_cache_ids[vertex_cache_pos] = vertex; + vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE; + } + } + + // Send to geometry pipeline + g_state.geometry_pipeline.SubmitVertex(vs_output); + } + + for (auto& range : memory_accesses.ranges) { + g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first), + range.second, range.first); + } + + VideoCore::g_renderer->Rasterizer()->DrawTriangles(); + if (g_debug_context) { + g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr); } } @@ -182,106 +379,19 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX(pipeline.vs_default_attributes_setup.index): g_state.immediate.current_attribute = 0; + g_state.immediate.reset_geometry_pipeline = true; default_attr_counter = 0; break; // Load default vertex input attributes case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[0], 0x233): case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[1], 0x234): - case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235): { - // TODO: Does actual hardware indeed keep an intermediate buffer or does - // it directly write the values? - default_attr_write_buffer[default_attr_counter++] = value; - - // Default attributes are written in a packed format such that four float24 values are - // encoded in - // three 32-bit numbers. We write to internal memory once a full such vector is - // written. - if (default_attr_counter >= 3) { - default_attr_counter = 0; - - auto& setup = regs.pipeline.vs_default_attributes_setup; - - if (setup.index >= 16) { - LOG_ERROR(HW_GPU, "Invalid VS default attribute index %d", (int)setup.index); - break; - } - - Math::Vec4<float24> attribute; - - // NOTE: The destination component order indeed is "backwards" - attribute.w = float24::FromRaw(default_attr_write_buffer[0] >> 8); - attribute.z = float24::FromRaw(((default_attr_write_buffer[0] & 0xFF) << 16) | - ((default_attr_write_buffer[1] >> 16) & 0xFFFF)); - attribute.y = float24::FromRaw(((default_attr_write_buffer[1] & 0xFFFF) << 8) | - ((default_attr_write_buffer[2] >> 24) & 0xFF)); - attribute.x = float24::FromRaw(default_attr_write_buffer[2] & 0xFFFFFF); - - LOG_TRACE(HW_GPU, "Set default VS attribute %x to (%f %f %f %f)", (int)setup.index, - attribute.x.ToFloat32(), attribute.y.ToFloat32(), attribute.z.ToFloat32(), - attribute.w.ToFloat32()); - - // TODO: Verify that this actually modifies the register! - if (setup.index < 15) { - g_state.input_default_attributes.attr[setup.index] = attribute; - setup.index++; - } else { - // Put each attribute into an immediate input buffer. When all specified immediate - // attributes are present, the Vertex Shader is invoked and everything is sent to - // the primitive assembler. - - auto& immediate_input = g_state.immediate.input_vertex; - auto& immediate_attribute_id = g_state.immediate.current_attribute; - - immediate_input.attr[immediate_attribute_id] = attribute; - - if (immediate_attribute_id < regs.pipeline.max_input_attrib_index) { - immediate_attribute_id += 1; - } else { - MICROPROFILE_SCOPE(GPU_Drawing); - immediate_attribute_id = 0; - - auto* shader_engine = Shader::GetEngine(); - shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset); - - // Send to vertex shader - if (g_debug_context) - g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation, - static_cast<void*>(&immediate_input)); - Shader::UnitState shader_unit; - Shader::AttributeBuffer output{}; - - shader_unit.LoadInput(regs.vs, immediate_input); - shader_engine->Run(g_state.vs, shader_unit); - shader_unit.WriteOutput(regs.vs, output); - - // Send to renderer - using Pica::Shader::OutputVertex; - auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1, - const OutputVertex& v2) { - VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2); - }; - - g_state.primitive_assembler.SubmitVertex( - Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output), - AddTriangle); - } - } - } + case PICA_REG_INDEX_WORKAROUND(pipeline.vs_default_attributes_setup.set_value[2], 0x235): + LoadDefaultVertexAttributes(value); break; - } case PICA_REG_INDEX(pipeline.gpu_mode): - if (regs.pipeline.gpu_mode == PipelineRegs::GPUMode::Configuring) { - MICROPROFILE_SCOPE(GPU_Drawing); - - // Draw immediate mode triangles when GPU Mode is set to GPUMode::Configuring - VideoCore::g_renderer->Rasterizer()->DrawTriangles(); - - if (g_debug_context) { - g_debug_context->OnEvent(DebugContext::Event::FinishedPrimitiveBatch, nullptr); - } - } + // This register likely just enables vertex processing and doesn't need any special handling break; case PICA_REG_INDEX_WORKAROUND(pipeline.command_buffer.trigger[0], 0x23c): @@ -297,130 +407,9 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { // It seems like these trigger vertex rendering case PICA_REG_INDEX(pipeline.trigger_draw): - case PICA_REG_INDEX(pipeline.trigger_draw_indexed): { - MICROPROFILE_SCOPE(GPU_Drawing); - -#if PICA_LOG_TEV - DebugUtils::DumpTevStageConfig(regs.GetTevStages()); -#endif - if (g_debug_context) - g_debug_context->OnEvent(DebugContext::Event::IncomingPrimitiveBatch, nullptr); - - // Processes information about internal vertex attributes to figure out how a vertex is - // loaded. - // Later, these can be compiled and cached. - const u32 base_address = regs.pipeline.vertex_attributes.GetPhysicalBaseAddress(); - VertexLoader loader(regs.pipeline); - - // Load vertices - bool is_indexed = (id == PICA_REG_INDEX(pipeline.trigger_draw_indexed)); - - const auto& index_info = regs.pipeline.index_array; - const u8* index_address_8 = Memory::GetPhysicalPointer(base_address + index_info.offset); - const u16* index_address_16 = reinterpret_cast<const u16*>(index_address_8); - bool index_u16 = index_info.format != 0; - - PrimitiveAssembler<Shader::OutputVertex>& primitive_assembler = g_state.primitive_assembler; - - if (g_debug_context && g_debug_context->recorder) { - for (int i = 0; i < 3; ++i) { - const auto texture = regs.texturing.GetTextures()[i]; - if (!texture.enabled) - continue; - - u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress()); - g_debug_context->recorder->MemoryAccessed( - texture_data, Pica::TexturingRegs::NibblesPerPixel(texture.format) * - texture.config.width / 2 * texture.config.height, - texture.config.GetPhysicalAddress()); - } - } - - DebugUtils::MemoryAccessTracker memory_accesses; - - // Simple circular-replacement vertex cache - // The size has been tuned for optimal balance between hit-rate and the cost of lookup - const size_t VERTEX_CACHE_SIZE = 32; - std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids; - std::array<Shader::OutputVertex, VERTEX_CACHE_SIZE> vertex_cache; - Shader::OutputVertex output_vertex; - - unsigned int vertex_cache_pos = 0; - vertex_cache_ids.fill(-1); - - auto* shader_engine = Shader::GetEngine(); - Shader::UnitState shader_unit; - - shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset); - - for (unsigned int index = 0; index < regs.pipeline.num_vertices; ++index) { - // Indexed rendering doesn't use the start offset - unsigned int vertex = - is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index]) - : (index + regs.pipeline.vertex_offset); - - // -1 is a common special value used for primitive restart. Since it's unknown if - // the PICA supports it, and it would mess up the caching, guard against it here. - ASSERT(vertex != -1); - - bool vertex_cache_hit = false; - - if (is_indexed) { - if (g_debug_context && Pica::g_debug_context->recorder) { - int size = index_u16 ? 2 : 1; - memory_accesses.AddAccess(base_address + index_info.offset + size * index, - size); - } - - for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) { - if (vertex == vertex_cache_ids[i]) { - output_vertex = vertex_cache[i]; - vertex_cache_hit = true; - break; - } - } - } - - if (!vertex_cache_hit) { - // Initialize data for the current vertex - Shader::AttributeBuffer input, output{}; - loader.LoadVertex(base_address, index, vertex, input, memory_accesses); - - // Send to vertex shader - if (g_debug_context) - g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation, - (void*)&input); - shader_unit.LoadInput(regs.vs, input); - shader_engine->Run(g_state.vs, shader_unit); - shader_unit.WriteOutput(regs.vs, output); - - // Retrieve vertex from register data - output_vertex = Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, output); - - if (is_indexed) { - vertex_cache[vertex_cache_pos] = output_vertex; - vertex_cache_ids[vertex_cache_pos] = vertex; - vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE; - } - } - - // Send to renderer - using Pica::Shader::OutputVertex; - auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1, - const OutputVertex& v2) { - VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2); - }; - - primitive_assembler.SubmitVertex(output_vertex, AddTriangle); - } - - for (auto& range : memory_accesses.ranges) { - g_debug_context->recorder->MemoryAccessed(Memory::GetPhysicalPointer(range.first), - range.second, range.first); - } - + case PICA_REG_INDEX(pipeline.trigger_draw_indexed): + Draw(id); break; - } case PICA_REG_INDEX(gs.bool_uniforms): WriteUniformBoolReg(g_state.gs, g_state.regs.gs.bool_uniforms.Value()); @@ -458,7 +447,13 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[5], 0x2a1): case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[6], 0x2a2): case PICA_REG_INDEX_WORKAROUND(gs.program.set_word[7], 0x2a3): { - WriteProgramCode(g_state.regs.gs, g_state.gs, 4096, value); + u32& offset = g_state.regs.gs.program.offset; + if (offset >= 4096) { + LOG_ERROR(HW_GPU, "Invalid GS program offset %u", offset); + } else { + g_state.gs.program_code[offset] = value; + offset++; + } break; } @@ -470,11 +465,18 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[5], 0x2ab): case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[6], 0x2ac): case PICA_REG_INDEX_WORKAROUND(gs.swizzle_patterns.set_word[7], 0x2ad): { - WriteSwizzlePatterns(g_state.regs.gs, g_state.gs, value); + u32& offset = g_state.regs.gs.swizzle_patterns.offset; + if (offset >= g_state.gs.swizzle_data.size()) { + LOG_ERROR(HW_GPU, "Invalid GS swizzle pattern offset %u", offset); + } else { + g_state.gs.swizzle_data[offset] = value; + offset++; + } break; } case PICA_REG_INDEX(vs.bool_uniforms): + // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this? WriteUniformBoolReg(g_state.vs, g_state.regs.vs.bool_uniforms.Value()); break; @@ -482,6 +484,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[1], 0x2b2): case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[2], 0x2b3): case PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[3], 0x2b4): { + // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this? unsigned index = (id - PICA_REG_INDEX_WORKAROUND(vs.int_uniforms[0], 0x2b1)); auto values = regs.vs.int_uniforms[index]; WriteUniformIntReg(g_state.vs, index, @@ -497,6 +500,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[5], 0x2c6): case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[6], 0x2c7): case PICA_REG_INDEX_WORKAROUND(vs.uniform_setup.set_value[7], 0x2c8): { + // TODO (wwylele): does regs.pipeline.gs_unit_exclusive_configuration affect this? WriteUniformFloatReg(g_state.regs.vs, g_state.vs, vs_float_regs_counter, vs_uniform_write_buffer, value); break; @@ -510,7 +514,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[5], 0x2d1): case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[6], 0x2d2): case PICA_REG_INDEX_WORKAROUND(vs.program.set_word[7], 0x2d3): { - WriteProgramCode(g_state.regs.vs, g_state.vs, 512, value); + u32& offset = g_state.regs.vs.program.offset; + if (offset >= 512) { + LOG_ERROR(HW_GPU, "Invalid VS program offset %u", offset); + } else { + g_state.vs.program_code[offset] = value; + if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) { + g_state.gs.program_code[offset] = value; + } + offset++; + } break; } @@ -522,7 +535,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[5], 0x2db): case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[6], 0x2dc): case PICA_REG_INDEX_WORKAROUND(vs.swizzle_patterns.set_word[7], 0x2dd): { - WriteSwizzlePatterns(g_state.regs.vs, g_state.vs, value); + u32& offset = g_state.regs.vs.swizzle_patterns.offset; + if (offset >= g_state.vs.swizzle_data.size()) { + LOG_ERROR(HW_GPU, "Invalid VS swizzle pattern offset %u", offset); + } else { + g_state.vs.swizzle_data[offset] = value; + if (!g_state.regs.pipeline.gs_unit_exclusive_configuration) { + g_state.gs.swizzle_data[offset] = value; + } + offset++; + } break; } @@ -620,6 +642,6 @@ void ProcessCommandList(const u32* list, u32 size) { } } -} // namespace +} // namespace CommandProcessor -} // namespace +} // namespace Pica diff --git a/src/video_core/geometry_pipeline.cpp b/src/video_core/geometry_pipeline.cpp new file mode 100644 index 000000000..98ff2ccd3 --- /dev/null +++ b/src/video_core/geometry_pipeline.cpp @@ -0,0 +1,274 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "video_core/geometry_pipeline.h" +#include "video_core/pica_state.h" +#include "video_core/regs.h" +#include "video_core/renderer_base.h" +#include "video_core/video_core.h" + +namespace Pica { + +/// An attribute buffering interface for different pipeline modes +class GeometryPipelineBackend { +public: + virtual ~GeometryPipelineBackend() = default; + + /// Checks if there is no incomplete data transfer + virtual bool IsEmpty() const = 0; + + /// Checks if the pipeline needs a direct input from index buffer + virtual bool NeedIndexInput() const = 0; + + /// Submits an index from index buffer + virtual void SubmitIndex(unsigned int val) = 0; + + /** + * Submits vertex attributes + * @param input attributes of a vertex output from vertex shader + * @return if the buffer is full and the geometry shader should be invoked + */ + virtual bool SubmitVertex(const Shader::AttributeBuffer& input) = 0; +}; + +// In the Point mode, vertex attributes are sent to the input registers in the geometry shader unit. +// The size of vertex shader outputs and geometry shader inputs are constants. Geometry shader is +// invoked upon inputs buffer filled up by vertex shader outputs. For example, if we have a geometry +// shader that takes 6 inputs, and the vertex shader outputs 2 attributes, it would take 3 vertices +// for one geometry shader invocation. +// TODO: what happens when the input size is not divisible by the output size? +class GeometryPipeline_Point : public GeometryPipelineBackend { +public: + GeometryPipeline_Point(const Regs& regs, Shader::GSUnitState& unit) : regs(regs), unit(unit) { + ASSERT(regs.pipeline.variable_primitive == 0); + ASSERT(regs.gs.input_to_uniform == 0); + vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; + size_t gs_input_num = regs.gs.max_input_attribute_index + 1; + ASSERT(gs_input_num % vs_output_num == 0); + buffer_cur = attribute_buffer.attr; + buffer_end = attribute_buffer.attr + gs_input_num; + } + + bool IsEmpty() const override { + return buffer_cur == attribute_buffer.attr; + } + + bool NeedIndexInput() const override { + return false; + } + + void SubmitIndex(unsigned int val) override { + UNREACHABLE(); + } + + bool SubmitVertex(const Shader::AttributeBuffer& input) override { + buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur); + if (buffer_cur == buffer_end) { + buffer_cur = attribute_buffer.attr; + unit.LoadInput(regs.gs, attribute_buffer); + return true; + } + return false; + } + +private: + const Regs& regs; + Shader::GSUnitState& unit; + Shader::AttributeBuffer attribute_buffer; + Math::Vec4<float24>* buffer_cur; + Math::Vec4<float24>* buffer_end; + unsigned int vs_output_num; +}; + +// In VariablePrimitive mode, vertex attributes are buffered into the uniform registers in the +// geometry shader unit. The number of vertex is variable, which is specified by the first index +// value in the batch. This mode is usually used for subdivision. +class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend { +public: + GeometryPipeline_VariablePrimitive(const Regs& regs, Shader::ShaderSetup& setup) + : regs(regs), setup(setup) { + ASSERT(regs.pipeline.variable_primitive == 1); + ASSERT(regs.gs.input_to_uniform == 1); + vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; + } + + bool IsEmpty() const override { + return need_index; + } + + bool NeedIndexInput() const override { + return need_index; + } + + void SubmitIndex(unsigned int val) override { + DEBUG_ASSERT(need_index); + + // The number of vertex input is put to the uniform register + float24 vertex_num = float24::FromFloat32(static_cast<float>(val)); + setup.uniforms.f[0] = Math::MakeVec(vertex_num, vertex_num, vertex_num, vertex_num); + + // The second uniform register and so on are used for receiving input vertices + buffer_cur = setup.uniforms.f + 1; + + main_vertex_num = regs.pipeline.variable_vertex_main_num_minus_1 + 1; + total_vertex_num = val; + need_index = false; + } + + bool SubmitVertex(const Shader::AttributeBuffer& input) override { + DEBUG_ASSERT(!need_index); + if (main_vertex_num != 0) { + // For main vertices, receive all attributes + buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur); + --main_vertex_num; + } else { + // For other vertices, only receive the first attribute (usually the position) + *(buffer_cur++) = input.attr[0]; + } + --total_vertex_num; + + if (total_vertex_num == 0) { + need_index = true; + return true; + } + + return false; + } + +private: + bool need_index = true; + const Regs& regs; + Shader::ShaderSetup& setup; + unsigned int main_vertex_num; + unsigned int total_vertex_num; + Math::Vec4<float24>* buffer_cur; + unsigned int vs_output_num; +}; + +// In FixedPrimitive mode, vertex attributes are buffered into the uniform registers in the geometry +// shader unit. The number of vertex per shader invocation is constant. This is usually used for +// particle system. +class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend { +public: + GeometryPipeline_FixedPrimitive(const Regs& regs, Shader::ShaderSetup& setup) + : regs(regs), setup(setup) { + ASSERT(regs.pipeline.variable_primitive == 0); + ASSERT(regs.gs.input_to_uniform == 1); + vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; + ASSERT(vs_output_num == regs.pipeline.gs_config.stride_minus_1 + 1); + size_t vertex_num = regs.pipeline.gs_config.fixed_vertex_num_minus_1 + 1; + buffer_cur = buffer_begin = setup.uniforms.f + regs.pipeline.gs_config.start_index; + buffer_end = buffer_begin + vs_output_num * vertex_num; + } + + bool IsEmpty() const override { + return buffer_cur == buffer_begin; + } + + bool NeedIndexInput() const override { + return false; + } + + void SubmitIndex(unsigned int val) override { + UNREACHABLE(); + } + + bool SubmitVertex(const Shader::AttributeBuffer& input) override { + buffer_cur = std::copy(input.attr, input.attr + vs_output_num, buffer_cur); + if (buffer_cur == buffer_end) { + buffer_cur = buffer_begin; + return true; + } + return false; + } + +private: + const Regs& regs; + Shader::ShaderSetup& setup; + Math::Vec4<float24>* buffer_begin; + Math::Vec4<float24>* buffer_cur; + Math::Vec4<float24>* buffer_end; + unsigned int vs_output_num; +}; + +GeometryPipeline::GeometryPipeline(State& state) : state(state) {} + +GeometryPipeline::~GeometryPipeline() = default; + +void GeometryPipeline::SetVertexHandler(Shader::VertexHandler vertex_handler) { + this->vertex_handler = vertex_handler; +} + +void GeometryPipeline::Setup(Shader::ShaderEngine* shader_engine) { + if (!backend) + return; + + this->shader_engine = shader_engine; + shader_engine->SetupBatch(state.gs, state.regs.gs.main_offset); +} + +void GeometryPipeline::Reconfigure() { + ASSERT(!backend || backend->IsEmpty()); + + if (state.regs.pipeline.use_gs == PipelineRegs::UseGS::No) { + backend = nullptr; + return; + } + + ASSERT(state.regs.pipeline.use_gs == PipelineRegs::UseGS::Yes); + + // The following assumes that when geometry shader is in use, the shader unit 3 is configured as + // a geometry shader unit. + // TODO: what happens if this is not true? + ASSERT(state.regs.pipeline.gs_unit_exclusive_configuration == 1); + ASSERT(state.regs.gs.shader_mode == ShaderRegs::ShaderMode::GS); + + state.gs_unit.ConfigOutput(state.regs.gs); + + ASSERT(state.regs.pipeline.vs_outmap_total_minus_1_a == + state.regs.pipeline.vs_outmap_total_minus_1_b); + + switch (state.regs.pipeline.gs_config.mode) { + case PipelineRegs::GSMode::Point: + backend = std::make_unique<GeometryPipeline_Point>(state.regs, state.gs_unit); + break; + case PipelineRegs::GSMode::VariablePrimitive: + backend = std::make_unique<GeometryPipeline_VariablePrimitive>(state.regs, state.gs); + break; + case PipelineRegs::GSMode::FixedPrimitive: + backend = std::make_unique<GeometryPipeline_FixedPrimitive>(state.regs, state.gs); + break; + default: + UNREACHABLE(); + } +} + +bool GeometryPipeline::NeedIndexInput() const { + if (!backend) + return false; + return backend->NeedIndexInput(); +} + +void GeometryPipeline::SubmitIndex(unsigned int val) { + backend->SubmitIndex(val); +} + +void GeometryPipeline::SubmitVertex(const Shader::AttributeBuffer& input) { + if (!backend) { + // No backend means the geometry shader is disabled, so we send the vertex shader output + // directly to the primitive assembler. + vertex_handler(input); + } else { + if (backend->SubmitVertex(input)) { + shader_engine->Run(state.gs, state.gs_unit); + + // The uniform b15 is set to true after every geometry shader invocation. This is useful + // for the shader to know if this is the first invocation in a batch, if the program set + // b15 to false first. + state.gs.uniforms.b[15] = true; + } + } +} + +} // namespace Pica diff --git a/src/video_core/geometry_pipeline.h b/src/video_core/geometry_pipeline.h new file mode 100644 index 000000000..91fdd3192 --- /dev/null +++ b/src/video_core/geometry_pipeline.h @@ -0,0 +1,49 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <memory> +#include "video_core/shader/shader.h" + +namespace Pica { + +struct State; + +class GeometryPipelineBackend; + +/// A pipeline receiving from vertex shader and sending to geometry shader and primitive assembler +class GeometryPipeline { +public: + explicit GeometryPipeline(State& state); + ~GeometryPipeline(); + + /// Sets the handler for receiving vertex outputs from vertex shader + void SetVertexHandler(Shader::VertexHandler vertex_handler); + + /** + * Setup the geometry shader unit if it is in use + * @param shader_engine the shader engine for the geometry shader to run + */ + void Setup(Shader::ShaderEngine* shader_engine); + + /// Reconfigures the pipeline according to current register settings + void Reconfigure(); + + /// Checks if the pipeline needs a direct input from index buffer + bool NeedIndexInput() const; + + /// Submits an index from index buffer. Call this only when NeedIndexInput returns true + void SubmitIndex(unsigned int val); + + /// Submits vertex attributes output from vertex shader + void SubmitVertex(const Shader::AttributeBuffer& input); + +private: + Shader::VertexHandler vertex_handler; + Shader::ShaderEngine* shader_engine; + std::unique_ptr<GeometryPipelineBackend> backend; + State& state; +}; +} // namespace Pica diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp index b95148a6a..218e06883 100644 --- a/src/video_core/pica.cpp +++ b/src/video_core/pica.cpp @@ -3,9 +3,11 @@ // Refer to the license.txt file included. #include <cstring> +#include "video_core/geometry_pipeline.h" #include "video_core/pica.h" #include "video_core/pica_state.h" -#include "video_core/regs_pipeline.h" +#include "video_core/renderer_base.h" +#include "video_core/video_core.h" namespace Pica { @@ -24,6 +26,23 @@ void Zero(T& o) { memset(&o, 0, sizeof(o)); } +State::State() : geometry_pipeline(*this) { + auto SubmitVertex = [this](const Shader::AttributeBuffer& vertex) { + using Pica::Shader::OutputVertex; + auto AddTriangle = [this](const OutputVertex& v0, const OutputVertex& v1, + const OutputVertex& v2) { + VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2); + }; + primitive_assembler.SubmitVertex( + Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, vertex), AddTriangle); + }; + + auto SetWinding = [this]() { primitive_assembler.SetWinding(); }; + + g_state.gs_unit.SetVertexHandler(SubmitVertex, SetWinding); + g_state.geometry_pipeline.SetVertexHandler(SubmitVertex); +} + void State::Reset() { Zero(regs); Zero(vs); diff --git a/src/video_core/pica_state.h b/src/video_core/pica_state.h index 2d23d34e6..c6634a0bc 100644 --- a/src/video_core/pica_state.h +++ b/src/video_core/pica_state.h @@ -8,6 +8,7 @@ #include "common/bit_field.h" #include "common/common_types.h" #include "common/vector_math.h" +#include "video_core/geometry_pipeline.h" #include "video_core/primitive_assembly.h" #include "video_core/regs.h" #include "video_core/shader/shader.h" @@ -16,6 +17,7 @@ namespace Pica { /// Struct used to describe current Pica state struct State { + State(); void Reset(); /// Pica registers @@ -79,7 +81,7 @@ struct State { std::array<ColorDifferenceEntry, 256> color_diff_table; } proctex; - struct { + struct Lighting { union LutEntry { // Used for raw access u32 raw; @@ -137,8 +139,17 @@ struct State { Shader::AttributeBuffer input_vertex; // Index of the next attribute to be loaded into `input_vertex`. u32 current_attribute = 0; + // Indicates the immediate mode just started and the geometry pipeline needs to reconfigure + bool reset_geometry_pipeline = true; } immediate; + // the geometry shader needs to be kept in the global state because some shaders relie on + // preserved register value across shader invocation. + // TODO: also bring the three vertex shader units here and implement the shader scheduler. + Shader::GSUnitState gs_unit; + + GeometryPipeline geometry_pipeline; + // This is constructed with a dummy triangle topology PrimitiveAssembler<Shader::OutputVertex> primitive_assembler; }; diff --git a/src/video_core/pica_types.h b/src/video_core/pica_types.h index 5d7e10066..2eafa7e9e 100644 --- a/src/video_core/pica_types.h +++ b/src/video_core/pica_types.h @@ -58,11 +58,12 @@ public: } Float<M, E> operator*(const Float<M, E>& flt) const { - if ((this->value == 0.f && !std::isnan(flt.value)) || - (flt.value == 0.f && !std::isnan(this->value))) - // PICA gives 0 instead of NaN when multiplying by inf - return Zero(); - return Float<M, E>::FromFloat32(ToFloat32() * flt.ToFloat32()); + float result = value * flt.ToFloat32(); + // PICA gives 0 instead of NaN when multiplying by inf + if (!std::isnan(value) && !std::isnan(flt.ToFloat32())) + if (std::isnan(result)) + result = 0.f; + return Float<M, E>::FromFloat32(result); } Float<M, E> operator/(const Float<M, E>& flt) const { @@ -78,12 +79,7 @@ public: } Float<M, E>& operator*=(const Float<M, E>& flt) { - if ((this->value == 0.f && !std::isnan(flt.value)) || - (flt.value == 0.f && !std::isnan(this->value))) - // PICA gives 0 instead of NaN when multiplying by inf - *this = Zero(); - else - value *= flt.ToFloat32(); + value = operator*(flt).value; return *this; } diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp index acd2ac5e2..9c3dd4cab 100644 --- a/src/video_core/primitive_assembly.cpp +++ b/src/video_core/primitive_assembly.cpp @@ -17,15 +17,18 @@ template <typename VertexType> void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler) { switch (topology) { - // TODO: Figure out what's different with TriangleTopology::Shader. case PipelineRegs::TriangleTopology::List: case PipelineRegs::TriangleTopology::Shader: if (buffer_index < 2) { buffer[buffer_index++] = vtx; } else { buffer_index = 0; - - triangle_handler(buffer[0], buffer[1], vtx); + if (topology == PipelineRegs::TriangleTopology::Shader && winding) { + triangle_handler(buffer[1], buffer[0], vtx); + winding = false; + } else { + triangle_handler(buffer[0], buffer[1], vtx); + } } break; @@ -51,9 +54,15 @@ void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx, } template <typename VertexType> +void PrimitiveAssembler<VertexType>::SetWinding() { + winding = true; +} + +template <typename VertexType> void PrimitiveAssembler<VertexType>::Reset() { buffer_index = 0; strip_ready = false; + winding = false; } template <typename VertexType> diff --git a/src/video_core/primitive_assembly.h b/src/video_core/primitive_assembly.h index e8eccdf27..12de8e3b9 100644 --- a/src/video_core/primitive_assembly.h +++ b/src/video_core/primitive_assembly.h @@ -30,6 +30,12 @@ struct PrimitiveAssembler { void SubmitVertex(const VertexType& vtx, TriangleHandler triangle_handler); /** + * Invert the vertex order of the next triangle. Called by geometry shader emitter. + * This only takes effect for TriangleTopology::Shader. + */ + void SetWinding(); + + /** * Resets the internal state of the PrimitiveAssembler. */ void Reset(); @@ -45,6 +51,7 @@ private: int buffer_index; VertexType buffer[2]; bool strip_ready = false; + bool winding = false; }; } // namespace diff --git a/src/video_core/regs_framebuffer.h b/src/video_core/regs_framebuffer.h index a50bd4111..7b565f911 100644 --- a/src/video_core/regs_framebuffer.h +++ b/src/video_core/regs_framebuffer.h @@ -256,10 +256,9 @@ struct FramebufferRegs { return 3; case DepthFormat::D24S8: return 4; - default: - LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format); - UNIMPLEMENTED(); } + + ASSERT_MSG(false, "Unknown depth format %u", format); } // Returns the number of bits per depth component of the specified depth format @@ -270,10 +269,9 @@ struct FramebufferRegs { case DepthFormat::D24: case DepthFormat::D24S8: return 24; - default: - LOG_CRITICAL(HW_GPU, "Unknown depth format %u", format); - UNIMPLEMENTED(); } + + ASSERT_MSG(false, "Unknown depth format %u", format); } INSERT_PADDING_WORDS(0x20); diff --git a/src/video_core/regs_pipeline.h b/src/video_core/regs_pipeline.h index 31c747d77..e78c3e331 100644 --- a/src/video_core/regs_pipeline.h +++ b/src/video_core/regs_pipeline.h @@ -147,7 +147,15 @@ struct PipelineRegs { // Number of vertices to render u32 num_vertices; - INSERT_PADDING_WORDS(0x1); + enum class UseGS : u32 { + No = 0, + Yes = 2, + }; + + union { + BitField<0, 2, UseGS> use_gs; + BitField<31, 1, u32> variable_primitive; + }; // The index of the first vertex to render u32 vertex_offset; @@ -202,7 +210,14 @@ struct PipelineRegs { /// Number of input attributes to the vertex shader minus 1 BitField<0, 4, u32> max_input_attrib_index; - INSERT_PADDING_WORDS(2); + INSERT_PADDING_WORDS(1); + + // The shader unit 3, which can be used for both vertex and geometry shader, gets its + // configuration depending on this register. If this is not set, unit 3 will share some + // configuration with other units. It is known that program code and swizzle pattern uploaded + // via regs.vs will be also uploaded to unit 3 if this is not set. Although very likely, it is + // still unclear whether uniforms and other configuration can be also shared. + BitField<0, 1, u32> gs_unit_exclusive_configuration; enum class GPUMode : u32 { Drawing = 0, @@ -211,7 +226,29 @@ struct PipelineRegs { GPUMode gpu_mode; - INSERT_PADDING_WORDS(0x18); + INSERT_PADDING_WORDS(0x4); + BitField<0, 4, u32> vs_outmap_total_minus_1_a; + INSERT_PADDING_WORDS(0x6); + BitField<0, 4, u32> vs_outmap_total_minus_1_b; + + enum class GSMode : u32 { + Point = 0, + VariablePrimitive = 1, + FixedPrimitive = 2, + }; + + union { + BitField<0, 8, GSMode> mode; + BitField<8, 4, u32> fixed_vertex_num_minus_1; + BitField<12, 4, u32> stride_minus_1; + BitField<16, 4, u32> start_index; + } gs_config; + + INSERT_PADDING_WORDS(0x1); + + u32 variable_vertex_main_num_minus_1; + + INSERT_PADDING_WORDS(0x9); enum class TriangleTopology : u32 { List = 0, diff --git a/src/video_core/regs_rasterizer.h b/src/video_core/regs_rasterizer.h index 2874fd127..4fef00d76 100644 --- a/src/video_core/regs_rasterizer.h +++ b/src/video_core/regs_rasterizer.h @@ -5,10 +5,10 @@ #pragma once #include <array> - #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" +#include "video_core/pica_types.h" namespace Pica { @@ -31,7 +31,17 @@ struct RasterizerRegs { BitField<0, 24, u32> viewport_size_y; - INSERT_PADDING_WORDS(0x9); + INSERT_PADDING_WORDS(0x3); + + BitField<0, 1, u32> clip_enable; + BitField<0, 24, u32> clip_coef[4]; // float24 + + Math::Vec4<float24> GetClipCoef() const { + return {float24::FromRaw(clip_coef[0]), float24::FromRaw(clip_coef[1]), + float24::FromRaw(clip_coef[2]), float24::FromRaw(clip_coef[3])}; + } + + INSERT_PADDING_WORDS(0x1); BitField<0, 24, u32> viewport_depth_range; // float24 BitField<0, 24, u32> viewport_depth_near_plane; // float24 diff --git a/src/video_core/regs_shader.h b/src/video_core/regs_shader.h index ddb1ee451..c15d4d162 100644 --- a/src/video_core/regs_shader.h +++ b/src/video_core/regs_shader.h @@ -24,9 +24,16 @@ struct ShaderRegs { INSERT_PADDING_WORDS(0x4); + enum ShaderMode { + GS = 0x08, + VS = 0xA0, + }; + union { // Number of input attributes to shader unit - 1 BitField<0, 4, u32> max_input_attribute_index; + BitField<8, 8, u32> input_to_uniform; + BitField<24, 8, ShaderMode> shader_mode; }; // Offset to shader program entry point (in words) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 1c6c15a58..7e09e4712 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -28,6 +28,9 @@ MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255)); MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100)); RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { + // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0 + state.clip_distance[0] = true; + // Create sampler objects for (size_t i = 0; i < texture_samplers.size(); ++i) { texture_samplers[i].Create(); @@ -166,6 +169,8 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, proctex_diff_lut_buffer.handle); // Sync fixed function OpenGL state + SyncClipEnabled(); + SyncClipCoef(); SyncCullMode(); SyncBlendEnabled(); SyncBlendFuncs(); @@ -232,13 +237,24 @@ void RasterizerOpenGL::DrawTriangles() { glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_surface != nullptr ? color_surface->texture.handle : 0, 0); - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, - depth_surface != nullptr ? depth_surface->texture.handle : 0, 0); - bool has_stencil = - regs.framebuffer.framebuffer.depth_format == Pica::FramebufferRegs::DepthFormat::D24S8; - glFramebufferTexture2D( - GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, - (has_stencil && depth_surface != nullptr) ? depth_surface->texture.handle : 0, 0); + if (depth_surface != nullptr) { + if (regs.framebuffer.framebuffer.depth_format == + Pica::FramebufferRegs::DepthFormat::D24S8) { + // attach both depth and stencil + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, + depth_surface->texture.handle, 0); + } else { + // attach depth + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, + depth_surface->texture.handle, 0); + // clear stencil attachment + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); + } + } else { + // clear both depth and stencil attachment + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, + 0); + } // Sync the viewport // These registers hold half-width and half-height, so must be multiplied by 2 @@ -398,6 +414,18 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) { SyncCullMode(); break; + // Clipping plane + case PICA_REG_INDEX(rasterizer.clip_enable): + SyncClipEnabled(); + break; + + case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[0], 0x48): + case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[1], 0x49): + case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[2], 0x4a): + case PICA_REG_INDEX_WORKAROUND(rasterizer.clip_coef[3], 0x4b): + SyncClipCoef(); + break; + // Depth modifiers case PICA_REG_INDEX(rasterizer.viewport_depth_range): SyncDepthScale(); @@ -1277,6 +1305,20 @@ void RasterizerOpenGL::SetShader() { } } +void RasterizerOpenGL::SyncClipEnabled() { + state.clip_distance[1] = Pica::g_state.regs.rasterizer.clip_enable != 0; +} + +void RasterizerOpenGL::SyncClipCoef() { + const auto raw_clip_coef = Pica::g_state.regs.rasterizer.GetClipCoef(); + const GLvec4 new_clip_coef = {raw_clip_coef.x.ToFloat32(), raw_clip_coef.y.ToFloat32(), + raw_clip_coef.z.ToFloat32(), raw_clip_coef.w.ToFloat32()}; + if (new_clip_coef != uniform_block_data.data.clip_coef) { + uniform_block_data.data.clip_coef = new_clip_coef; + uniform_block_data.dirty = true; + } +} + void RasterizerOpenGL::SyncCullMode() { const auto& regs = Pica::g_state.regs; diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 78e218efe..46c62961c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -151,14 +151,21 @@ private: LightSrc light_src[8]; alignas(16) GLvec4 const_color[6]; // A vec4 color for each of the six tev stages alignas(16) GLvec4 tev_combiner_buffer_color; + alignas(16) GLvec4 clip_coef; }; static_assert( - sizeof(UniformData) == 0x460, + sizeof(UniformData) == 0x470, "The size of the UniformData structure has changed, update the structure in the shader"); static_assert(sizeof(UniformData) < 16384, "UniformData structure must be less than 16kb as per the OpenGL spec"); + /// Syncs the clip enabled status to match the PICA register + void SyncClipEnabled(); + + /// Syncs the clip coefficients to match the PICA register + void SyncClipCoef(); + /// Sets the OpenGL shader in accordance with the current PICA register state void SetShader(); diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index bb192affd..9fe183944 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp @@ -8,6 +8,7 @@ #include "common/assert.h" #include "common/bit_field.h" #include "common/logging/log.h" +#include "core/core.h" #include "video_core/regs_framebuffer.h" #include "video_core/regs_lighting.h" #include "video_core/regs_rasterizer.h" @@ -24,6 +25,42 @@ using TevStageConfig = TexturingRegs::TevStageConfig; namespace GLShader { +static const std::string UniformBlockDef = R"( +#define NUM_TEV_STAGES 6 +#define NUM_LIGHTS 8 + +struct LightSrc { + vec3 specular_0; + vec3 specular_1; + vec3 diffuse; + vec3 ambient; + vec3 position; + vec3 spot_direction; + float dist_atten_bias; + float dist_atten_scale; +}; + +layout (std140) uniform shader_data { + vec2 framebuffer_scale; + int alphatest_ref; + float depth_scale; + float depth_offset; + int scissor_x1; + int scissor_y1; + int scissor_x2; + int scissor_y2; + vec3 fog_color; + vec2 proctex_noise_f; + vec2 proctex_noise_a; + vec2 proctex_noise_p; + vec3 lighting_global_ambient; + LightSrc light_src[NUM_LIGHTS]; + vec4 const_color[NUM_TEV_STAGES]; + vec4 tev_combiner_buffer_color; + vec4 clip_coef; +}; +)"; + PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) { PicaShaderConfig res; @@ -525,11 +562,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) { "float geo_factor = 1.0;\n"; // Compute fragment normals and tangents - const std::string pertubation = - "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0"; + auto Perturbation = [&]() { + return "2.0 * (" + SampleTexture(config, lighting.bump_selector) + ").rgb - 1.0"; + }; if (lighting.bump_mode == LightingRegs::LightingBumpMode::NormalMap) { // Bump mapping is enabled using a normal map - out += "vec3 surface_normal = " + pertubation + ";\n"; + out += "vec3 surface_normal = " + Perturbation() + ";\n"; // Recompute Z-component of perturbation if 'renorm' is enabled, this provides a higher // precision result @@ -543,7 +581,7 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) { out += "vec3 surface_tangent = vec3(1.0, 0.0, 0.0);\n"; } else if (lighting.bump_mode == LightingRegs::LightingBumpMode::TangentMap) { // Bump mapping is enabled using a tangent map - out += "vec3 surface_tangent = " + pertubation + ";\n"; + out += "vec3 surface_tangent = " + Perturbation() + ";\n"; // Mathematically, recomputing Z-component of the tangent vector won't affect the relevant // computation below, which is also confirmed on 3DS. So we don't bother recomputing here // even if 'renorm' is enabled. @@ -593,8 +631,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) { // Note: even if the normal vector is modified by normal map, which is not the // normal of the tangent plane anymore, the half angle vector is still projected // using the modified normal vector. - std::string half_angle_proj = "normalize(half_vector) - normal / dot(normal, " - "normal) * dot(normal, normalize(half_vector))"; + std::string half_angle_proj = + "normalize(half_vector) - normal * dot(normal, normalize(half_vector))"; // Note: the half angle vector projection is confirmed not normalized before the dot // product. The result is in fact not cos(phi) as the name suggested. index = "dot(" + half_angle_proj + ", tangent)"; @@ -749,7 +787,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) { } // Fresnel - if (lighting.lut_fr.enable && + // Note: only the last entry in the light slots applies the Fresnel factor + if (light_index == lighting.src_num - 1 && lighting.lut_fr.enable && LightingRegs::IsLightingSamplerSupported(lighting.config, LightingRegs::LightingSampler::Fresnel)) { // Lookup fresnel LUT value @@ -758,17 +797,17 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) { lighting.lut_fr.type, lighting.lut_fr.abs_input); value = "(" + std::to_string(lighting.lut_fr.scale) + " * " + value + ")"; - // Enabled for difffuse lighting alpha component + // Enabled for diffuse lighting alpha component if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha || lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { - out += "diffuse_sum.a *= " + value + ";\n"; + out += "diffuse_sum.a = " + value + ";\n"; } // Enabled for the specular lighting alpha component if (lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::SecondaryAlpha || lighting.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { - out += "specular_sum.a *= " + value + ";\n"; + out += "specular_sum.a = " + value + ";\n"; } } @@ -1007,8 +1046,6 @@ std::string GenerateFragmentShader(const PicaShaderConfig& config) { std::string out = R"( #version 330 core -#define NUM_TEV_STAGES 6 -#define NUM_LIGHTS 8 in vec4 primary_color; in vec2 texcoord[3]; @@ -1020,36 +1057,6 @@ in vec4 gl_FragCoord; out vec4 color; -struct LightSrc { - vec3 specular_0; - vec3 specular_1; - vec3 diffuse; - vec3 ambient; - vec3 position; - vec3 spot_direction; - float dist_atten_bias; - float dist_atten_scale; -}; - -layout (std140) uniform shader_data { - vec2 framebuffer_scale; - int alphatest_ref; - float depth_scale; - float depth_offset; - int scissor_x1; - int scissor_y1; - int scissor_x2; - int scissor_y2; - vec3 fog_color; - vec2 proctex_noise_f; - vec2 proctex_noise_a; - vec2 proctex_noise_p; - vec3 lighting_global_ambient; - LightSrc light_src[NUM_LIGHTS]; - vec4 const_color[NUM_TEV_STAGES]; - vec4 tev_combiner_buffer_color; -}; - uniform sampler2D tex[3]; uniform samplerBuffer lighting_lut; uniform samplerBuffer fog_lut; @@ -1058,7 +1065,11 @@ uniform samplerBuffer proctex_color_map; uniform samplerBuffer proctex_alpha_map; uniform samplerBuffer proctex_lut; uniform samplerBuffer proctex_diff_lut; +)"; + + out += UniformBlockDef; + out += R"( // Rotate the vector v by the quaternion q vec3 quaternion_rotate(vec4 q, vec3 v) { return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v); @@ -1111,7 +1122,10 @@ vec4 secondary_fragment_color = vec4(0.0); "gl_FragCoord.y < scissor_y2)) discard;\n"; } - out += "float z_over_w = 1.0 - gl_FragCoord.z * 2.0;\n"; + // After perspective divide, OpenGL transform z_over_w from [-1, 1] to [near, far]. Here we use + // default near = 0 and far = 1, and undo the transformation to get the original z_over_w, then + // do our own transformation according to PICA specification. + out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n"; out += "float depth = z_over_w * depth_scale + depth_offset;\n"; if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) { out += "depth /= gl_FragCoord.w;\n"; @@ -1151,6 +1165,11 @@ vec4 secondary_fragment_color = vec4(0.0); // Blend the fog out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n"; + } else if (state.fog_mode == TexturingRegs::FogMode::Gas) { + Core::Telemetry().AddField(Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode", + true); + LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode"); + UNIMPLEMENTED(); } out += "gl_FragDepth = depth;\n"; @@ -1186,6 +1205,12 @@ out float texcoord0_w; out vec4 normquat; out vec3 view; +)"; + + out += UniformBlockDef; + + out += R"( + void main() { primary_color = vert_color; texcoord[0] = vert_texcoord0; @@ -1194,7 +1219,9 @@ void main() { texcoord0_w = vert_texcoord0_w; normquat = vert_normquat; view = vert_view; - gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w); + gl_Position = vert_position; + gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0 + gl_ClipDistance[1] = dot(clip_coef, vert_position); } )"; diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp index bc9d34b84..5770ae08f 100644 --- a/src/video_core/renderer_opengl/gl_state.cpp +++ b/src/video_core/renderer_opengl/gl_state.cpp @@ -68,6 +68,8 @@ OpenGLState::OpenGLState() { draw.vertex_buffer = 0; draw.uniform_buffer = 0; draw.shader_program = 0; + + clip_distance = {}; } void OpenGLState::Apply() const { @@ -261,6 +263,17 @@ void OpenGLState::Apply() const { glUseProgram(draw.shader_program); } + // Clip distance + for (size_t i = 0; i < clip_distance.size(); ++i) { + if (clip_distance[i] != cur_state.clip_distance[i]) { + if (clip_distance[i]) { + glEnable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i)); + } else { + glDisable(GL_CLIP_DISTANCE0 + static_cast<GLenum>(i)); + } + } + } + cur_state = *this; } diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index 745a74479..437fe34c4 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h @@ -4,6 +4,7 @@ #pragma once +#include <array> #include <glad/glad.h> namespace TextureUnits { @@ -123,6 +124,8 @@ public: GLuint shader_program; // GL_CURRENT_PROGRAM } draw; + std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE + OpenGLState(); /// Get the currently active OpenGL state diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp index 67ed19ba8..2857d2829 100644 --- a/src/video_core/shader/shader.cpp +++ b/src/video_core/shader/shader.cpp @@ -21,7 +21,8 @@ namespace Pica { namespace Shader { -OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& input) { +OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, + const AttributeBuffer& input) { // Setup output data union { OutputVertex ret{}; @@ -51,7 +52,8 @@ OutputVertex OutputVertex::FromAttributeBuffer(const RasterizerRegs& regs, Attri // The hardware takes the absolute and saturates vertex colors like this, *before* doing // interpolation for (unsigned i = 0; i < 4; ++i) { - ret.color[i] = float24::FromFloat32(std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f)); + float c = std::fabs(ret.color[i].ToFloat32()); + ret.color[i] = float24::FromFloat32(c < 1.0f ? c : 1.0f); } LOG_TRACE(HW_GPU, "Output vertex: pos(%.2f, %.2f, %.2f, %.2f), quat(%.2f, %.2f, %.2f, %.2f), " @@ -82,6 +84,44 @@ void UnitState::WriteOutput(const ShaderRegs& config, AttributeBuffer& output) { } } +UnitState::UnitState(GSEmitter* emitter) : emitter_ptr(emitter) {} + +GSEmitter::GSEmitter() { + handlers = new Handlers; +} + +GSEmitter::~GSEmitter() { + delete handlers; +} + +void GSEmitter::Emit(Math::Vec4<float24> (&vertex)[16]) { + ASSERT(vertex_id < 3); + std::copy(std::begin(vertex), std::end(vertex), buffer[vertex_id].begin()); + if (prim_emit) { + if (winding) + handlers->winding_setter(); + for (size_t i = 0; i < buffer.size(); ++i) { + AttributeBuffer output; + unsigned int output_i = 0; + for (unsigned int reg : Common::BitSet<u32>(output_mask)) { + output.attr[output_i++] = buffer[i][reg]; + } + handlers->vertex_handler(output); + } + } +} + +GSUnitState::GSUnitState() : UnitState(&emitter) {} + +void GSUnitState::SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter) { + emitter.handlers->vertex_handler = std::move(vertex_handler); + emitter.handlers->winding_setter = std::move(winding_setter); +} + +void GSUnitState::ConfigOutput(const ShaderRegs& config) { + emitter.output_mask = config.output_mask; +} + MICROPROFILE_DEFINE(GPU_Shader, "GPU", "Shader", MP_RGB(50, 50, 240)); #ifdef ARCHITECTURE_x86_64 diff --git a/src/video_core/shader/shader.h b/src/video_core/shader/shader.h index e156f6aef..a3789da01 100644 --- a/src/video_core/shader/shader.h +++ b/src/video_core/shader/shader.h @@ -6,6 +6,7 @@ #include <array> #include <cstddef> +#include <functional> #include <type_traits> #include <nihstro/shader_bytecode.h> #include "common/assert.h" @@ -31,6 +32,12 @@ struct AttributeBuffer { alignas(16) Math::Vec4<float24> attr[16]; }; +/// Handler type for receiving vertex outputs from vertex shader or geometry shader +using VertexHandler = std::function<void(const AttributeBuffer&)>; + +/// Handler type for signaling to invert the vertex order of the next triangle +using WindingSetter = std::function<void()>; + struct OutputVertex { Math::Vec4<float24> pos; Math::Vec4<float24> quat; @@ -43,7 +50,8 @@ struct OutputVertex { INSERT_PADDING_WORDS(1); Math::Vec2<float24> tc2; - static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs, AttributeBuffer& output); + static OutputVertex FromAttributeBuffer(const RasterizerRegs& regs, + const AttributeBuffer& output); }; #define ASSERT_POS(var, pos) \ static_assert(offsetof(OutputVertex, var) == pos * sizeof(float24), "Semantic at wrong " \ @@ -61,12 +69,36 @@ static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD"); static_assert(sizeof(OutputVertex) == 24 * sizeof(float), "OutputVertex has invalid size"); /** + * This structure contains state information for primitive emitting in geometry shader. + */ +struct GSEmitter { + std::array<std::array<Math::Vec4<float24>, 16>, 3> buffer; + u8 vertex_id; + bool prim_emit; + bool winding; + u32 output_mask; + + // Function objects are hidden behind a raw pointer to make the structure standard layout type, + // for JIT to use offsetof to access other members. + struct Handlers { + VertexHandler vertex_handler; + WindingSetter winding_setter; + } * handlers; + + GSEmitter(); + ~GSEmitter(); + void Emit(Math::Vec4<float24> (&vertex)[16]); +}; +static_assert(std::is_standard_layout<GSEmitter>::value, "GSEmitter is not standard layout type"); + +/** * This structure contains the state information that needs to be unique for a shader unit. The 3DS * has four shader units that process shaders in parallel. At the present, Citra only implements a * single shader unit that processes all shaders serially. Putting the state information in a struct * here will make it easier for us to parallelize the shader processing later. */ struct UnitState { + explicit UnitState(GSEmitter* emitter = nullptr); struct Registers { // The registers are accessed by the shader JIT using SSE instructions, and are therefore // required to be 16-byte aligned. @@ -82,6 +114,8 @@ struct UnitState { // TODO: How many bits do these actually have? s32 address_registers[3]; + GSEmitter* emitter_ptr; + static size_t InputOffset(const SourceRegister& reg) { switch (reg.GetRegisterType()) { case RegisterType::Input: @@ -125,6 +159,19 @@ struct UnitState { void WriteOutput(const ShaderRegs& config, AttributeBuffer& output); }; +/** + * This is an extended shader unit state that represents the special unit that can run both vertex + * shader and geometry shader. It contains an additional primitive emitter and utilities for + * geometry shader. + */ +struct GSUnitState : public UnitState { + GSUnitState(); + void SetVertexHandler(VertexHandler vertex_handler, WindingSetter winding_setter); + void ConfigOutput(const ShaderRegs& config); + + GSEmitter emitter; +}; + struct ShaderSetup { struct { // The float uniforms are accessed by the shader JIT using SSE instructions, and are diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp index aa1cec81f..9d4da4904 100644 --- a/src/video_core/shader/shader_interpreter.cpp +++ b/src/video_core/shader/shader_interpreter.cpp @@ -631,11 +631,27 @@ static void RunInterpreter(const ShaderSetup& setup, UnitState& state, DebugData state.address_registers[2] = loop_param.y; Record<DebugDataRecord::LOOP_INT_IN>(debug_data, iteration, loop_param); - call(program_counter + 1, instr.flow_control.dest_offset - program_counter + 1, + call(program_counter + 1, instr.flow_control.dest_offset - program_counter, instr.flow_control.dest_offset + 1, loop_param.x, loop_param.z); break; } + case OpCode::Id::EMIT: { + GSEmitter* emitter = state.emitter_ptr; + ASSERT_MSG(emitter, "Execute EMIT on VS"); + emitter->Emit(state.registers.output); + break; + } + + case OpCode::Id::SETEMIT: { + GSEmitter* emitter = state.emitter_ptr; + ASSERT_MSG(emitter, "Execute SETEMIT on VS"); + emitter->vertex_id = instr.setemit.vertex_id; + emitter->prim_emit = instr.setemit.prim_emit != 0; + emitter->winding = instr.setemit.winding != 0; + break; + } + default: LOG_ERROR(HW_GPU, "Unhandled instruction: 0x%02x (%s): 0x%08x", (int)instr.opcode.Value().EffectiveOpCode(), diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp index 42a57aab1..1b31623bd 100644 --- a/src/video_core/shader/shader_jit_x64_compiler.cpp +++ b/src/video_core/shader/shader_jit_x64_compiler.cpp @@ -75,8 +75,8 @@ const JitFunction instr_table[64] = { &JitShader::Compile_IF, // ifu &JitShader::Compile_IF, // ifc &JitShader::Compile_LOOP, // loop - nullptr, // emit - nullptr, // sete + &JitShader::Compile_EMIT, // emit + &JitShader::Compile_SETE, // sete &JitShader::Compile_JMP, // jmpc &JitShader::Compile_JMP, // jmpu &JitShader::Compile_CMP, // cmp @@ -772,6 +772,51 @@ void JitShader::Compile_JMP(Instruction instr) { } } +static void Emit(GSEmitter* emitter, Math::Vec4<float24> (*output)[16]) { + emitter->Emit(*output); +} + +void JitShader::Compile_EMIT(Instruction instr) { + Label have_emitter, end; + mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]); + test(rax, rax); + jnz(have_emitter); + + ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute EMIT on VS")); + CallFarFunction(*this, LogCritical); + ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + jmp(end); + + L(have_emitter); + ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + mov(ABI_PARAM1, rax); + mov(ABI_PARAM2, STATE); + add(ABI_PARAM2, static_cast<Xbyak::uint32>(offsetof(UnitState, registers.output))); + CallFarFunction(*this, Emit); + ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + L(end); +} + +void JitShader::Compile_SETE(Instruction instr) { + Label have_emitter, end; + mov(rax, qword[STATE + offsetof(UnitState, emitter_ptr)]); + test(rax, rax); + jnz(have_emitter); + + ABI_PushRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + mov(ABI_PARAM1, reinterpret_cast<size_t>("Execute SETEMIT on VS")); + CallFarFunction(*this, LogCritical); + ABI_PopRegistersAndAdjustStack(*this, PersistentCallerSavedRegs(), 0); + jmp(end); + + L(have_emitter); + mov(byte[rax + offsetof(GSEmitter, vertex_id)], instr.setemit.vertex_id); + mov(byte[rax + offsetof(GSEmitter, prim_emit)], instr.setemit.prim_emit); + mov(byte[rax + offsetof(GSEmitter, winding)], instr.setemit.winding); + L(end); +} + void JitShader::Compile_Block(unsigned end) { while (program_counter < end) { Compile_NextInstr(); diff --git a/src/video_core/shader/shader_jit_x64_compiler.h b/src/video_core/shader/shader_jit_x64_compiler.h index 31af0ca48..4aee56b1d 100644 --- a/src/video_core/shader/shader_jit_x64_compiler.h +++ b/src/video_core/shader/shader_jit_x64_compiler.h @@ -66,6 +66,8 @@ public: void Compile_JMP(Instruction instr); void Compile_CMP(Instruction instr); void Compile_MAD(Instruction instr); + void Compile_EMIT(Instruction instr); + void Compile_SETE(Instruction instr); private: void Compile_Block(unsigned end); diff --git a/src/video_core/swrasterizer/clipper.cpp b/src/video_core/swrasterizer/clipper.cpp index 6fb923756..c1ed48398 100644 --- a/src/video_core/swrasterizer/clipper.cpp +++ b/src/video_core/swrasterizer/clipper.cpp @@ -31,7 +31,7 @@ public: : coeffs(coeffs), bias(bias) {} bool IsInside(const Vertex& vertex) const { - return Math::Dot(vertex.pos + bias, coeffs) <= float24::FromFloat32(0); + return Math::Dot(vertex.pos + bias, coeffs) >= float24::FromFloat32(0); } bool IsOutSide(const Vertex& vertex) const { @@ -95,6 +95,17 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu static const size_t MAX_VERTICES = 9; static_vector<Vertex, MAX_VERTICES> buffer_a = {v0, v1, v2}; static_vector<Vertex, MAX_VERTICES> buffer_b; + + auto FlipQuaternionIfOpposite = [](auto& a, const auto& b) { + if (Math::Dot(a, b) < float24::Zero()) + a = a * float24::FromFloat32(-1.0f); + }; + + // Flip the quaternions if they are opposite to prevent interpolating them over the wrong + // direction. + FlipQuaternionIfOpposite(buffer_a[1].quat, buffer_a[0].quat); + FlipQuaternionIfOpposite(buffer_a[2].quat, buffer_a[0].quat); + auto* output_list = &buffer_a; auto* input_list = &buffer_b; @@ -105,23 +116,18 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu static const float24 f0 = float24::FromFloat32(0.0); static const float24 f1 = float24::FromFloat32(1.0); static const std::array<ClippingEdge, 7> clipping_edges = {{ - {Math::MakeVec(f1, f0, f0, -f1)}, // x = +w - {Math::MakeVec(-f1, f0, f0, -f1)}, // x = -w - {Math::MakeVec(f0, f1, f0, -f1)}, // y = +w - {Math::MakeVec(f0, -f1, f0, -f1)}, // y = -w - {Math::MakeVec(f0, f0, f1, f0)}, // z = 0 - {Math::MakeVec(f0, f0, -f1, -f1)}, // z = -w - {Math::MakeVec(f0, f0, f0, -f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON + {Math::MakeVec(-f1, f0, f0, f1)}, // x = +w + {Math::MakeVec(f1, f0, f0, f1)}, // x = -w + {Math::MakeVec(f0, -f1, f0, f1)}, // y = +w + {Math::MakeVec(f0, f1, f0, f1)}, // y = -w + {Math::MakeVec(f0, f0, -f1, f0)}, // z = 0 + {Math::MakeVec(f0, f0, f1, f1)}, // z = -w + {Math::MakeVec(f0, f0, f0, f1), Math::Vec4<float24>(f0, f0, f0, EPSILON)}, // w = EPSILON }}; - // TODO: If one vertex lies outside one of the depth clipping planes, some platforms (e.g. Wii) - // drop the whole primitive instead of clipping the primitive properly. We should test if - // this happens on the 3DS, too. - // Simple implementation of the Sutherland-Hodgman clipping algorithm. // TODO: Make this less inefficient (currently lots of useless buffering overhead happens here) - for (auto edge : clipping_edges) { - + auto Clip = [&](const ClippingEdge& edge) { std::swap(input_list, output_list); output_list->clear(); @@ -140,12 +146,24 @@ void ProcessTriangle(const OutputVertex& v0, const OutputVertex& v1, const Outpu } reference_vertex = &vertex; } + }; + + for (auto edge : clipping_edges) { + Clip(edge); // Need to have at least a full triangle to continue... if (output_list->size() < 3) return; } + if (g_state.regs.rasterizer.clip_enable) { + ClippingEdge custom_edge{g_state.regs.rasterizer.GetClipCoef()}; + Clip(custom_edge); + + if (output_list->size() < 3) + return; + } + InitScreenCoordinates((*output_list)[0]); InitScreenCoordinates((*output_list)[1]); diff --git a/src/video_core/swrasterizer/framebuffer.cpp b/src/video_core/swrasterizer/framebuffer.cpp index 7de3aac75..f34eab6cf 100644 --- a/src/video_core/swrasterizer/framebuffer.cpp +++ b/src/video_core/swrasterizer/framebuffer.cpp @@ -352,6 +352,8 @@ u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) { case FramebufferRegs::LogicOp::OrInverted: return ~src | dest; } + + UNREACHABLE(); }; } // namespace Rasterizer diff --git a/src/video_core/swrasterizer/lighting.cpp b/src/video_core/swrasterizer/lighting.cpp new file mode 100644 index 000000000..5fa748611 --- /dev/null +++ b/src/video_core/swrasterizer/lighting.cpp @@ -0,0 +1,308 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/math_util.h" +#include "video_core/swrasterizer/lighting.h" + +namespace Pica { + +static float LookupLightingLut(const Pica::State::Lighting& lighting, size_t lut_index, u8 index, + float delta) { + ASSERT_MSG(lut_index < lighting.luts.size(), "Out of range lut"); + ASSERT_MSG(index < lighting.luts[lut_index].size(), "Out of range index"); + + const auto& lut = lighting.luts[lut_index][index]; + + float lut_value = lut.ToFloat(); + float lut_diff = lut.DiffToFloat(); + + return lut_value + lut_diff * delta; +} + +std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( + const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state, + const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view, + const Math::Vec4<u8> (&texture_color)[4]) { + + Math::Vec3<float> surface_normal; + Math::Vec3<float> surface_tangent; + + if (lighting.config0.bump_mode != LightingRegs::LightingBumpMode::None) { + Math::Vec3<float> perturbation = + texture_color[lighting.config0.bump_selector].xyz().Cast<float>() / 127.5f - + Math::MakeVec(1.0f, 1.0f, 1.0f); + if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::NormalMap) { + if (!lighting.config0.disable_bump_renorm) { + const float z_square = 1 - perturbation.xy().Length2(); + perturbation.z = std::sqrt(std::max(z_square, 0.0f)); + } + surface_normal = perturbation; + surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f); + } else if (lighting.config0.bump_mode == LightingRegs::LightingBumpMode::TangentMap) { + surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f); + surface_tangent = perturbation; + } else { + LOG_ERROR(HW_GPU, "Unknown bump mode %u", lighting.config0.bump_mode.Value()); + } + } else { + surface_normal = Math::MakeVec(0.0f, 0.0f, 1.0f); + surface_tangent = Math::MakeVec(1.0f, 0.0f, 0.0f); + } + + // Use the normalized the quaternion when performing the rotation + auto normal = Math::QuaternionRotate(normquat, surface_normal); + auto tangent = Math::QuaternionRotate(normquat, surface_tangent); + + Math::Vec4<float> diffuse_sum = {0.0f, 0.0f, 0.0f, 1.0f}; + Math::Vec4<float> specular_sum = {0.0f, 0.0f, 0.0f, 1.0f}; + + for (unsigned light_index = 0; light_index <= lighting.max_light_index; ++light_index) { + unsigned num = lighting.light_enable.GetNum(light_index); + const auto& light_config = lighting.light[num]; + + Math::Vec3<float> refl_value = {}; + Math::Vec3<float> position = {float16::FromRaw(light_config.x).ToFloat32(), + float16::FromRaw(light_config.y).ToFloat32(), + float16::FromRaw(light_config.z).ToFloat32()}; + Math::Vec3<float> light_vector; + + if (light_config.config.directional) + light_vector = position; + else + light_vector = position + view; + + light_vector.Normalize(); + + Math::Vec3<float> norm_view = view.Normalized(); + Math::Vec3<float> half_vector = norm_view + light_vector; + + float dist_atten = 1.0f; + if (!lighting.IsDistAttenDisabled(num)) { + auto distance = (-view - position).Length(); + float scale = Pica::float20::FromRaw(light_config.dist_atten_scale).ToFloat32(); + float bias = Pica::float20::FromRaw(light_config.dist_atten_bias).ToFloat32(); + size_t lut = + static_cast<size_t>(LightingRegs::LightingSampler::DistanceAttenuation) + num; + + float sample_loc = MathUtil::Clamp(scale * distance + bias, 0.0f, 1.0f); + + u8 lutindex = + static_cast<u8>(MathUtil::Clamp(std::floor(sample_loc * 256.0f), 0.0f, 255.0f)); + float delta = sample_loc * 256 - lutindex; + dist_atten = LookupLightingLut(lighting_state, lut, lutindex, delta); + } + + auto GetLutValue = [&](LightingRegs::LightingLutInput input, bool abs, + LightingRegs::LightingScale scale_enum, + LightingRegs::LightingSampler sampler) { + float result = 0.0f; + + switch (input) { + case LightingRegs::LightingLutInput::NH: + result = Math::Dot(normal, half_vector.Normalized()); + break; + + case LightingRegs::LightingLutInput::VH: + result = Math::Dot(norm_view, half_vector.Normalized()); + break; + + case LightingRegs::LightingLutInput::NV: + result = Math::Dot(normal, norm_view); + break; + + case LightingRegs::LightingLutInput::LN: + result = Math::Dot(light_vector, normal); + break; + + case LightingRegs::LightingLutInput::SP: { + Math::Vec3<s32> spot_dir{light_config.spot_x.Value(), light_config.spot_y.Value(), + light_config.spot_z.Value()}; + result = Math::Dot(light_vector, spot_dir.Cast<float>() / 2047.0f); + break; + } + case LightingRegs::LightingLutInput::CP: + if (lighting.config0.config == LightingRegs::LightingConfig::Config7) { + const Math::Vec3<float> norm_half_vector = half_vector.Normalized(); + const Math::Vec3<float> half_vector_proj = + norm_half_vector - normal * Math::Dot(normal, norm_half_vector); + result = Math::Dot(half_vector_proj, tangent); + } else { + result = 0.0f; + } + break; + default: + LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input)); + UNIMPLEMENTED(); + result = 0.0f; + } + + u8 index; + float delta; + + if (abs) { + if (light_config.config.two_sided_diffuse) + result = std::abs(result); + else + result = std::max(result, 0.0f); + + float flr = std::floor(result * 256.0f); + index = static_cast<u8>(MathUtil::Clamp(flr, 0.0f, 255.0f)); + delta = result * 256 - index; + } else { + float flr = std::floor(result * 128.0f); + s8 signed_index = static_cast<s8>(MathUtil::Clamp(flr, -128.0f, 127.0f)); + delta = result * 128.0f - signed_index; + index = static_cast<u8>(signed_index); + } + + float scale = lighting.lut_scale.GetScale(scale_enum); + return scale * + LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta); + }; + + // If enabled, compute spot light attenuation value + float spot_atten = 1.0f; + if (!lighting.IsSpotAttenDisabled(num) && + LightingRegs::IsLightingSamplerSupported( + lighting.config0.config, LightingRegs::LightingSampler::SpotlightAttenuation)) { + auto lut = LightingRegs::SpotlightAttenuationSampler(num); + spot_atten = GetLutValue(lighting.lut_input.sp, lighting.abs_lut_input.disable_sp == 0, + lighting.lut_scale.sp, lut); + } + + // Specular 0 component + float d0_lut_value = 1.0f; + if (lighting.config1.disable_lut_d0 == 0 && + LightingRegs::IsLightingSamplerSupported( + lighting.config0.config, LightingRegs::LightingSampler::Distribution0)) { + d0_lut_value = + GetLutValue(lighting.lut_input.d0, lighting.abs_lut_input.disable_d0 == 0, + lighting.lut_scale.d0, LightingRegs::LightingSampler::Distribution0); + } + + Math::Vec3<float> specular_0 = d0_lut_value * light_config.specular_0.ToVec3f(); + + // If enabled, lookup ReflectRed value, otherwise, 1.0 is used + if (lighting.config1.disable_lut_rr == 0 && + LightingRegs::IsLightingSamplerSupported(lighting.config0.config, + LightingRegs::LightingSampler::ReflectRed)) { + refl_value.x = + GetLutValue(lighting.lut_input.rr, lighting.abs_lut_input.disable_rr == 0, + lighting.lut_scale.rr, LightingRegs::LightingSampler::ReflectRed); + } else { + refl_value.x = 1.0f; + } + + // If enabled, lookup ReflectGreen value, otherwise, ReflectRed value is used + if (lighting.config1.disable_lut_rg == 0 && + LightingRegs::IsLightingSamplerSupported(lighting.config0.config, + LightingRegs::LightingSampler::ReflectGreen)) { + refl_value.y = + GetLutValue(lighting.lut_input.rg, lighting.abs_lut_input.disable_rg == 0, + lighting.lut_scale.rg, LightingRegs::LightingSampler::ReflectGreen); + } else { + refl_value.y = refl_value.x; + } + + // If enabled, lookup ReflectBlue value, otherwise, ReflectRed value is used + if (lighting.config1.disable_lut_rb == 0 && + LightingRegs::IsLightingSamplerSupported(lighting.config0.config, + LightingRegs::LightingSampler::ReflectBlue)) { + refl_value.z = + GetLutValue(lighting.lut_input.rb, lighting.abs_lut_input.disable_rb == 0, + lighting.lut_scale.rb, LightingRegs::LightingSampler::ReflectBlue); + } else { + refl_value.z = refl_value.x; + } + + // Specular 1 component + float d1_lut_value = 1.0f; + if (lighting.config1.disable_lut_d1 == 0 && + LightingRegs::IsLightingSamplerSupported( + lighting.config0.config, LightingRegs::LightingSampler::Distribution1)) { + d1_lut_value = + GetLutValue(lighting.lut_input.d1, lighting.abs_lut_input.disable_d1 == 0, + lighting.lut_scale.d1, LightingRegs::LightingSampler::Distribution1); + } + + Math::Vec3<float> specular_1 = + d1_lut_value * refl_value * light_config.specular_1.ToVec3f(); + + // Fresnel + // Note: only the last entry in the light slots applies the Fresnel factor + if (light_index == lighting.max_light_index && lighting.config1.disable_lut_fr == 0 && + LightingRegs::IsLightingSamplerSupported(lighting.config0.config, + LightingRegs::LightingSampler::Fresnel)) { + + float lut_value = + GetLutValue(lighting.lut_input.fr, lighting.abs_lut_input.disable_fr == 0, + lighting.lut_scale.fr, LightingRegs::LightingSampler::Fresnel); + + // Enabled for diffuse lighting alpha component + if (lighting.config0.fresnel_selector == + LightingRegs::LightingFresnelSelector::PrimaryAlpha || + lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { + diffuse_sum.a() = lut_value; + } + + // Enabled for the specular lighting alpha component + if (lighting.config0.fresnel_selector == + LightingRegs::LightingFresnelSelector::SecondaryAlpha || + lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) { + specular_sum.a() = lut_value; + } + } + + auto dot_product = Math::Dot(light_vector, normal); + + // Calculate clamp highlights before applying the two-sided diffuse configuration to the dot + // product. + float clamp_highlights = 1.0f; + if (lighting.config0.clamp_highlights) { + if (dot_product <= 0.0f) + clamp_highlights = 0.0f; + else + clamp_highlights = 1.0f; + } + + if (light_config.config.two_sided_diffuse) + dot_product = std::abs(dot_product); + else + dot_product = std::max(dot_product, 0.0f); + + if (light_config.config.geometric_factor_0 || light_config.config.geometric_factor_1) { + float geo_factor = half_vector.Length2(); + geo_factor = geo_factor == 0.0f ? 0.0f : std::min(dot_product / geo_factor, 1.0f); + if (light_config.config.geometric_factor_0) { + specular_0 *= geo_factor; + } + if (light_config.config.geometric_factor_1) { + specular_1 *= geo_factor; + } + } + + auto diffuse = + light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f(); + diffuse_sum += Math::MakeVec(diffuse * dist_atten * spot_atten, 0.0f); + + specular_sum += Math::MakeVec( + (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f); + } + + diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f); + + auto diffuse = Math::MakeVec<float>(MathUtil::Clamp(diffuse_sum.x, 0.0f, 1.0f) * 255, + MathUtil::Clamp(diffuse_sum.y, 0.0f, 1.0f) * 255, + MathUtil::Clamp(diffuse_sum.z, 0.0f, 1.0f) * 255, + MathUtil::Clamp(diffuse_sum.w, 0.0f, 1.0f) * 255) + .Cast<u8>(); + auto specular = Math::MakeVec<float>(MathUtil::Clamp(specular_sum.x, 0.0f, 1.0f) * 255, + MathUtil::Clamp(specular_sum.y, 0.0f, 1.0f) * 255, + MathUtil::Clamp(specular_sum.z, 0.0f, 1.0f) * 255, + MathUtil::Clamp(specular_sum.w, 0.0f, 1.0f) * 255) + .Cast<u8>(); + return std::make_tuple(diffuse, specular); +} + +} // namespace Pica diff --git a/src/video_core/swrasterizer/lighting.h b/src/video_core/swrasterizer/lighting.h new file mode 100644 index 000000000..d807a3d94 --- /dev/null +++ b/src/video_core/swrasterizer/lighting.h @@ -0,0 +1,19 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <tuple> +#include "common/quaternion.h" +#include "common/vector_math.h" +#include "video_core/pica_state.h" + +namespace Pica { + +std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( + const Pica::LightingRegs& lighting, const Pica::State::Lighting& lighting_state, + const Math::Quaternion<float>& normquat, const Math::Vec3<float>& view, + const Math::Vec4<u8> (&texture_color)[4]); + +} // namespace Pica diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp index 512e81c08..862135614 100644 --- a/src/video_core/swrasterizer/rasterizer.cpp +++ b/src/video_core/swrasterizer/rasterizer.cpp @@ -13,6 +13,7 @@ #include "common/logging/log.h" #include "common/math_util.h" #include "common/microprofile.h" +#include "common/quaternion.h" #include "common/vector_math.h" #include "core/hw/gpu.h" #include "core/memory.h" @@ -24,6 +25,7 @@ #include "video_core/regs_texturing.h" #include "video_core/shader/shader.h" #include "video_core/swrasterizer/framebuffer.h" +#include "video_core/swrasterizer/lighting.h" #include "video_core/swrasterizer/proctex.h" #include "video_core/swrasterizer/rasterizer.h" #include "video_core/swrasterizer/texturing.h" @@ -419,6 +421,26 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve regs.texturing.tev_combiner_buffer_color.a, }; + Math::Vec4<u8> primary_fragment_color = {0, 0, 0, 0}; + Math::Vec4<u8> secondary_fragment_color = {0, 0, 0, 0}; + + if (!g_state.regs.lighting.disable) { + Math::Quaternion<float> normquat = Math::Quaternion<float>{ + {GetInterpolatedAttribute(v0.quat.x, v1.quat.x, v2.quat.x).ToFloat32(), + GetInterpolatedAttribute(v0.quat.y, v1.quat.y, v2.quat.y).ToFloat32(), + GetInterpolatedAttribute(v0.quat.z, v1.quat.z, v2.quat.z).ToFloat32()}, + GetInterpolatedAttribute(v0.quat.w, v1.quat.w, v2.quat.w).ToFloat32(), + }.Normalized(); + + Math::Vec3<float> view{ + GetInterpolatedAttribute(v0.view.x, v1.view.x, v2.view.x).ToFloat32(), + GetInterpolatedAttribute(v0.view.y, v1.view.y, v2.view.y).ToFloat32(), + GetInterpolatedAttribute(v0.view.z, v1.view.z, v2.view.z).ToFloat32(), + }; + std::tie(primary_fragment_color, secondary_fragment_color) = ComputeFragmentsColors( + g_state.regs.lighting, g_state.lighting, normquat, view, texture_color); + } + for (unsigned tev_stage_index = 0; tev_stage_index < tev_stages.size(); ++tev_stage_index) { const auto& tev_stage = tev_stages[tev_stage_index]; @@ -427,14 +449,13 @@ static void ProcessTriangleInternal(const Vertex& v0, const Vertex& v1, const Ve auto GetSource = [&](Source source) -> Math::Vec4<u8> { switch (source) { case Source::PrimaryColor: + return primary_color; - // HACK: Until we implement fragment lighting, use primary_color case Source::PrimaryFragmentColor: - return primary_color; + return primary_fragment_color; - // HACK: Until we implement fragment lighting, use zero case Source::SecondaryFragmentColor: - return {0, 0, 0, 0}; + return secondary_fragment_color; case Source::Texture0: return texture_color[0]; diff --git a/src/video_core/swrasterizer/rasterizer.h b/src/video_core/swrasterizer/rasterizer.h index 2f0877581..66cd6cfd4 100644 --- a/src/video_core/swrasterizer/rasterizer.h +++ b/src/video_core/swrasterizer/rasterizer.h @@ -19,10 +19,9 @@ struct Vertex : Shader::OutputVertex { // Linear interpolation // factor: 0=this, 1=vtx + // Note: This function cannot be called after perspective divide void Lerp(float24 factor, const Vertex& vtx) { pos = pos * factor + vtx.pos * (float24::FromFloat32(1) - factor); - - // TODO: Should perform perspective correct interpolation here... quat = quat * factor + vtx.quat * (float24::FromFloat32(1) - factor); color = color * factor + vtx.color * (float24::FromFloat32(1) - factor); tc0 = tc0 * factor + vtx.tc0 * (float24::FromFloat32(1) - factor); @@ -30,12 +29,11 @@ struct Vertex : Shader::OutputVertex { tc0_w = tc0_w * factor + vtx.tc0_w * (float24::FromFloat32(1) - factor); view = view * factor + vtx.view * (float24::FromFloat32(1) - factor); tc2 = tc2 * factor + vtx.tc2 * (float24::FromFloat32(1) - factor); - - screenpos = screenpos * factor + vtx.screenpos * (float24::FromFloat32(1) - factor); } // Linear interpolation // factor: 0=v0, 1=v1 + // Note: This function cannot be called after perspective divide static Vertex Lerp(float24 factor, const Vertex& v0, const Vertex& v1) { Vertex ret = v0; ret.Lerp(factor, v1); diff --git a/src/video_core/swrasterizer/texturing.cpp b/src/video_core/swrasterizer/texturing.cpp index 4f02b93f2..79b1ce841 100644 --- a/src/video_core/swrasterizer/texturing.cpp +++ b/src/video_core/swrasterizer/texturing.cpp @@ -89,6 +89,8 @@ Math::Vec3<u8> GetColorModifier(TevStageConfig::ColorModifier factor, case ColorModifier::OneMinusSourceBlue: return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>(); } + + UNREACHABLE(); }; u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& values) { @@ -119,6 +121,8 @@ u8 GetAlphaModifier(TevStageConfig::AlphaModifier factor, const Math::Vec4<u8>& case AlphaModifier::OneMinusSourceBlue: return 255 - values.b(); } + + UNREACHABLE(); }; Math::Vec3<u8> ColorCombine(TevStageConfig::Operation op, const Math::Vec3<u8> input[3]) { diff --git a/src/video_core/utils.h b/src/video_core/utils.h index 7ce83a055..d8567f314 100644 --- a/src/video_core/utils.h +++ b/src/video_core/utils.h @@ -8,17 +8,11 @@ namespace VideoCore { -/** - * Interleave the lower 3 bits of each coordinate to get the intra-block offsets, which are - * arranged in a Z-order curve. More details on the bit manipulation at: - * https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/ - */ +// 8x8 Z-Order coordinate from 2D coordinates static inline u32 MortonInterleave(u32 x, u32 y) { - u32 i = (x & 7) | ((y & 7) << 8); // ---- -210 - i = (i ^ (i << 2)) & 0x1313; // ---2 --10 - i = (i ^ (i << 1)) & 0x1515; // ---2 -1-0 - i = (i | (i >> 7)) & 0x3F; - return i; + static const u32 xlut[] = {0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15}; + static const u32 ylut[] = {0x00, 0x02, 0x08, 0x0a, 0x20, 0x22, 0x28, 0x2a}; + return xlut[x % 8] + ylut[y % 8]; } /** diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt index 334d82a8a..c93811892 100644 --- a/src/web_service/CMakeLists.txt +++ b/src/web_service/CMakeLists.txt @@ -1,10 +1,12 @@ set(SRCS telemetry_json.cpp + verify_login.cpp web_backend.cpp ) set(HEADERS telemetry_json.h + verify_login.h web_backend.h ) diff --git a/src/web_service/telemetry_json.cpp b/src/web_service/telemetry_json.cpp index a2d007e77..6ad2ffcd4 100644 --- a/src/web_service/telemetry_json.cpp +++ b/src/web_service/telemetry_json.cpp @@ -3,7 +3,6 @@ // Refer to the license.txt file included. #include "common/assert.h" -#include "core/settings.h" #include "web_service/telemetry_json.h" #include "web_service/web_backend.h" @@ -81,7 +80,7 @@ void TelemetryJson::Complete() { SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback"); SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig"); SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem"); - PostJson(Settings::values.telemetry_endpoint_url, TopSection().dump()); + PostJson(endpoint_url, TopSection().dump(), true, username, token); } } // namespace WebService diff --git a/src/web_service/telemetry_json.h b/src/web_service/telemetry_json.h index 39038b4f9..9e78c6803 100644 --- a/src/web_service/telemetry_json.h +++ b/src/web_service/telemetry_json.h @@ -17,7 +17,9 @@ namespace WebService { */ class TelemetryJson : public Telemetry::VisitorInterface { public: - TelemetryJson() = default; + TelemetryJson(const std::string& endpoint_url, const std::string& username, + const std::string& token) + : endpoint_url(endpoint_url), username(username), token(token) {} ~TelemetryJson() = default; void Visit(const Telemetry::Field<bool>& field) override; @@ -49,6 +51,9 @@ private: nlohmann::json output; std::array<nlohmann::json, 7> sections; + std::string endpoint_url; + std::string username; + std::string token; }; } // namespace WebService diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp new file mode 100644 index 000000000..1bc3b5afe --- /dev/null +++ b/src/web_service/verify_login.cpp @@ -0,0 +1,28 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <json.hpp> +#include "web_service/verify_login.h" +#include "web_service/web_backend.h" + +namespace WebService { + +std::future<bool> VerifyLogin(std::string& username, std::string& token, + const std::string& endpoint_url, std::function<void()> func) { + auto get_func = [func, username](const std::string& reply) -> bool { + func(); + if (reply.empty()) + return false; + nlohmann::json json = nlohmann::json::parse(reply); + std::string result; + try { + result = json["username"]; + } catch (const nlohmann::detail::out_of_range&) { + } + return result == username; + }; + return GetJson<bool>(get_func, endpoint_url, false, username, token); +} + +} // namespace WebService diff --git a/src/web_service/verify_login.h b/src/web_service/verify_login.h new file mode 100644 index 000000000..303f5dbbc --- /dev/null +++ b/src/web_service/verify_login.h @@ -0,0 +1,24 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <functional> +#include <future> +#include <string> + +namespace WebService { + +/** + * Checks if username and token is valid + * @param username Citra username to use for authentication. + * @param token Citra token to use for authentication. + * @param endpoint_url URL of the services.citra-emu.org endpoint. + * @param func A function that gets exectued when the verification is finished + * @returns Future with bool indicating whether the verification succeeded + */ +std::future<bool> VerifyLogin(std::string& username, std::string& token, + const std::string& endpoint_url, std::function<void()> func); + +} // namespace WebService diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp index 13e4555ac..b17d82f9c 100644 --- a/src/web_service/web_backend.cpp +++ b/src/web_service/web_backend.cpp @@ -2,51 +2,139 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#ifdef _WIN32 +#include <winsock.h> +#endif + +#include <cstdlib> +#include <thread> #include <cpr/cpr.h> -#include <stdlib.h> #include "common/logging/log.h" #include "web_service/web_backend.h" namespace WebService { static constexpr char API_VERSION[]{"1"}; -static constexpr char ENV_VAR_USERNAME[]{"CITRA_WEB_SERVICES_USERNAME"}; -static constexpr char ENV_VAR_TOKEN[]{"CITRA_WEB_SERVICES_TOKEN"}; -static std::string GetEnvironmentVariable(const char* name) { - const char* value{getenv(name)}; - if (value) { - return value; +static std::unique_ptr<cpr::Session> g_session; + +void Win32WSAStartup() { +#ifdef _WIN32 + // On Windows, CPR/libcurl does not properly initialize Winsock. The below code is used to + // initialize Winsock globally, which fixes this problem. Without this, only the first CPR + // session will properly be created, and subsequent ones will fail. + WSADATA wsa_data; + const int wsa_result{WSAStartup(MAKEWORD(2, 2), &wsa_data)}; + if (wsa_result) { + LOG_CRITICAL(WebService, "WSAStartup failed: %d", wsa_result); } - return {}; +#endif } -const std::string& GetUsername() { - static const std::string username{GetEnvironmentVariable(ENV_VAR_USERNAME)}; - return username; -} +void PostJson(const std::string& url, const std::string& data, bool allow_anonymous, + const std::string& username, const std::string& token) { + if (url.empty()) { + LOG_ERROR(WebService, "URL is invalid"); + return; + } + + const bool are_credentials_provided{!token.empty() && !username.empty()}; + if (!allow_anonymous && !are_credentials_provided) { + LOG_ERROR(WebService, "Credentials must be provided for authenticated requests"); + return; + } -const std::string& GetToken() { - static const std::string token{GetEnvironmentVariable(ENV_VAR_TOKEN)}; - return token; + Win32WSAStartup(); + + // Built request header + cpr::Header header; + if (are_credentials_provided) { + // Authenticated request if credentials are provided + header = {{"Content-Type", "application/json"}, + {"x-username", username.c_str()}, + {"x-token", token.c_str()}, + {"api-version", API_VERSION}}; + } else { + // Otherwise, anonymous request + header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}}; + } + + // Post JSON asynchronously + static std::future<void> future; + future = cpr::PostCallback( + [](cpr::Response r) { + if (r.error) { + LOG_ERROR(WebService, "POST returned cpr error: %u:%s", + static_cast<u32>(r.error.code), r.error.message.c_str()); + return; + } + if (r.status_code >= 400) { + LOG_ERROR(WebService, "POST returned error status code: %u", r.status_code); + return; + } + if (r.header["content-type"].find("application/json") == std::string::npos) { + LOG_ERROR(WebService, "POST returned wrong content: %s", + r.header["content-type"].c_str()); + return; + } + }, + cpr::Url{url}, cpr::Body{data}, header); } -void PostJson(const std::string& url, const std::string& data) { +template <typename T> +std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url, + bool allow_anonymous, const std::string& username, + const std::string& token) { if (url.empty()) { LOG_ERROR(WebService, "URL is invalid"); - return; + return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); }); } - if (GetUsername().empty() || GetToken().empty()) { - LOG_ERROR(WebService, "Environment variables %s and %s must be set to POST JSON", - ENV_VAR_USERNAME, ENV_VAR_TOKEN); - return; + const bool are_credentials_provided{!token.empty() && !username.empty()}; + if (!allow_anonymous && !are_credentials_provided) { + LOG_ERROR(WebService, "Credentials must be provided for authenticated requests"); + return std::async(std::launch::async, [func{std::move(func)}]() { return func(""); }); } - cpr::PostAsync(cpr::Url{url}, cpr::Body{data}, cpr::Header{{"Content-Type", "application/json"}, - {"x-username", GetUsername()}, - {"x-token", GetToken()}, - {"api-version", API_VERSION}}); + Win32WSAStartup(); + + // Built request header + cpr::Header header; + if (are_credentials_provided) { + // Authenticated request if credentials are provided + header = {{"Content-Type", "application/json"}, + {"x-username", username.c_str()}, + {"x-token", token.c_str()}, + {"api-version", API_VERSION}}; + } else { + // Otherwise, anonymous request + header = cpr::Header{{"Content-Type", "application/json"}, {"api-version", API_VERSION}}; + } + + // Get JSON asynchronously + return cpr::GetCallback( + [func{std::move(func)}](cpr::Response r) { + if (r.error) { + LOG_ERROR(WebService, "GET returned cpr error: %u:%s", + static_cast<u32>(r.error.code), r.error.message.c_str()); + return func(""); + } + if (r.status_code >= 400) { + LOG_ERROR(WebService, "GET returned error code: %u", r.status_code); + return func(""); + } + if (r.header["content-type"].find("application/json") == std::string::npos) { + LOG_ERROR(WebService, "GET returned wrong content: %s", + r.header["content-type"].c_str()); + return func(""); + } + return func(r.text); + }, + cpr::Url{url}, header); } +template std::future<bool> GetJson(std::function<bool(const std::string&)> func, + const std::string& url, bool allow_anonymous, + const std::string& username, const std::string& token); + } // namespace WebService diff --git a/src/web_service/web_backend.h b/src/web_service/web_backend.h index 2753d3b68..a63c75d13 100644 --- a/src/web_service/web_backend.h +++ b/src/web_service/web_backend.h @@ -4,28 +4,36 @@ #pragma once +#include <functional> +#include <future> #include <string> #include "common/common_types.h" namespace WebService { /** - * Gets the current username for accessing services.citra-emu.org. - * @returns Username as a string, empty if not set. - */ -const std::string& GetUsername(); - -/** - * Gets the current token for accessing services.citra-emu.org. - * @returns Token as a string, empty if not set. + * Posts JSON to services.citra-emu.org. + * @param url URL of the services.citra-emu.org endpoint to post data to. + * @param data String of JSON data to use for the body of the POST request. + * @param allow_anonymous If true, allow anonymous unauthenticated requests. + * @param username Citra username to use for authentication. + * @param token Citra token to use for authentication. */ -const std::string& GetToken(); +void PostJson(const std::string& url, const std::string& data, bool allow_anonymous, + const std::string& username = {}, const std::string& token = {}); /** - * Posts JSON to services.citra-emu.org. + * Gets JSON from services.citra-emu.org. + * @param func A function that gets exectued when the json as a string is received * @param url URL of the services.citra-emu.org endpoint to post data to. - * @param data String of JSON data to use for the body of the POST request. + * @param allow_anonymous If true, allow anonymous unauthenticated requests. + * @param username Citra username to use for authentication. + * @param token Citra token to use for authentication. + * @return future that holds the return value T of the func */ -void PostJson(const std::string& url, const std::string& data); +template <typename T> +std::future<T> GetJson(std::function<T(const std::string&)> func, const std::string& url, + bool allow_anonymous, const std::string& username = {}, + const std::string& token = {}); } // namespace WebService |