diff --git a/.clang_complete b/.clang_complete index 3be508a9a..39c0a4185 100644 --- a/.clang_complete +++ b/.clang_complete @@ -13,6 +13,5 @@ -fPIC -I./ExtLibs/SFML/include -I./Core --I./GDCpp/. -I./GDJS/. -F./ExtLibs/SFML/extlibs/libs-osx/Frameworks diff --git a/.gitattributes b/.gitattributes index 825093809..2b89e2b5d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,5 @@ Core/GDCore/Serialization/rapidjson/rapidjson.h/* linguist-vendored Core/GDCore/TinyXml/* linguist-vendored -GDCpp/GDCpp/Runtime/TinyXml/* linguist-vendored Extensions/ParticleSystem/SPARK/* linguist-vendored Extensions/PhysicsBehavior/Box2D/* linguist-vendored Extensions/PhysicsBehavior/box2djs/* linguist-vendored diff --git a/.gitignore b/.gitignore index f627f3e84..625200faf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -/Core/GDCore/Tools/VersionPriv.h /docs /docs-wiki /ExtLibs/SFML @@ -16,7 +15,6 @@ *.bc /Binaries/Output *.autosave -!/GDCpp/scripts/bcp.exe !/scripts/libgettextlib-0-17.dll !/scripts/libgettextsrc-0-17.dll !/xgettext.exe diff --git a/.travis.yml b/.travis.yml index 1a19d9cb2..690f021f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ # Travis CI configuration to build and run all tests -# (and typing/formatting) for the Core, newIDE, GDJS (and even GDCpp). +# (and typing/formatting) for the Core, newIDE, GDJS. # # This builds GDevelop.js and store it on a S3 so it can be used to run # GDevelop without building it. @@ -62,7 +62,7 @@ before_install: install: #Get the correct version of gcc/g++ - if [ "$CXX" = "g++" ]; then export CXX="g++-${GCC_VERSION}" CC="gcc-${GCC_VERSION}"; fi -#Compile the tests only for GDCore and GDCpp +#Compile the tests only for GDCore - mkdir .build-tests - cd .build-tests - cmake -DBUILD_GDJS=FALSE -DBUILD_TESTS=TRUE -DCMAKE_CXX_COMPILER=$(which $CXX) -DCMAKE_C_COMPILER=$(which $CC) .. @@ -89,12 +89,9 @@ install: - cd ../.. script: -# GDCore and GDCpp game engine tests: +# GDCore tests: - cd .build-tests - Core/GDCore_tests - - GDCpp/GDCpp_tests - - Extensions/PathfindingBehavior/PathfindingBehavior_Runtime_tests - - Extensions/LinkedObjects/LinkedObjects_Runtime_tests - cd .. # GDevelop.js tests - cd GDevelop.js diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 310f58aa1..8bff7bbc8 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,7 +4,6 @@ "name": "Mac", "includePath": [ "${workspaceRoot}", - "${workspaceRoot}/GDCpp", "${workspaceRoot}/GDJS", "${workspaceRoot}/Extensions", "${workspaceRoot}/Core", @@ -43,7 +42,6 @@ "name": "Linux", "includePath": [ "${workspaceRoot}", - "${workspaceRoot}/GDCpp", "${workspaceRoot}/GDJS", "${workspaceRoot}/Extensions", "${workspaceRoot}/Core", @@ -70,7 +68,6 @@ "name": "Win32", "includePath": [ "${workspaceRoot}", - "${workspaceRoot}/GDCpp", "${workspaceRoot}/GDJS", "${workspaceRoot}/Extensions", "${workspaceRoot}/Core", diff --git a/Binaries/README.md b/Binaries/README.md index 93bf080f5..436e498f7 100644 --- a/Binaries/README.md +++ b/Binaries/README.md @@ -1,3 +1,3 @@ -This is the directory where native or WebAssembly binaries of the C++ code of GDCore, GDCpp and GDJS are produced. +This is the directory where native or WebAssembly binaries of the C++ code of GDCore and GDJS are produced. See GDevelop.js README for the instructions to compile after a change in the C++ source code. \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index a4f83c61d..d4461a6a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,12 +14,10 @@ macro(gd_set_option var default type docstring) endif() set(${var} ${${var}} CACHE ${type} ${docstring} FORCE) endmacro() -gd_set_option(BUILD_CORE TRUE BOOL "TRUE to build GDevelop Core library, FALSE to use the already compiled binaries") -gd_set_option(BUILD_GDCPP TRUE BOOL "TRUE to build GDevelop C++ Platform") +gd_set_option(BUILD_CORE TRUE BOOL "TRUE to build GDevelop Core library") gd_set_option(BUILD_GDJS TRUE BOOL "TRUE to build GDevelop JS Platform") gd_set_option(BUILD_EXTENSIONS TRUE BOOL "TRUE to build the extensions") gd_set_option(BUILD_TESTS FALSE BOOL "TRUE to build the tests") -gd_set_option(FULL_VERSION_NUMBER TRUE BOOL "TRUE to build GDevelop with its full version number (lastest tag + commit hash), FALSE to only use the lastest tag (avoid rebulding many source file when developping)") # Disable deprecated code set(NO_GUI TRUE CACHE BOOL "" FORCE) #Force disable old GUI related code. @@ -55,9 +53,6 @@ IF ("${CMAKE_BUILD_TYPE}" STREQUAL "") message( "CMAKE_BUILD_TYPE is empty, assuming build type is Release" ) set(CMAKE_BUILD_TYPE Release) ENDIF() -IF (EMSCRIPTEN) - set(BUILD_GDCPP FALSE CACHE BOOL "" FORCE) #Force disable GDC++ when compiling with emscripten. -ENDIF() IF("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT WIN32 AND CMAKE_COMPILER_IS_GNUCXX) SET(CMAKE_SHARED_LINKER_FLAGS "-s") #Force stripping to avoid errors when packaging for linux. @@ -84,7 +79,6 @@ endif() set(GD_base_dir ${CMAKE_CURRENT_SOURCE_DIR}) #Add all the CMakeLists: -ADD_SUBDIRECTORY(Version) ADD_SUBDIRECTORY(ExtLibs) IF(BUILD_CORE) ADD_SUBDIRECTORY(Core) @@ -92,10 +86,7 @@ ENDIF() IF(BUILD_GDJS) ADD_SUBDIRECTORY(GDJS) ENDIF() -IF(BUILD_GDCPP) - ADD_SUBDIRECTORY(GDCpp) -ENDIF() -IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/GDevelop.js/CMakeLists.txt" AND EMSCRIPTEN) +IF(EMSCRIPTEN) ADD_SUBDIRECTORY(GDevelop.js) ENDIF() IF(BUILD_EXTENSIONS) diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt index 40a73413b..adbff2cf2 100644 --- a/Core/CMakeLists.txt +++ b/Core/CMakeLists.txt @@ -57,7 +57,6 @@ IF(EMSCRIPTEN) ELSE() add_library(GDCore SHARED ${source_files}) ENDIF() -add_dependencies(GDCore GDVersion) IF(EMSCRIPTEN) set_target_properties(GDCore PROPERTIES SUFFIX ".bc") ELSEIF(WIN32) diff --git a/Core/GDCore/DocMainPage.h b/Core/GDCore/DocMainPage.h index 2f8ad2dd6..8ba296e8e 100644 --- a/Core/GDCore/DocMainPage.h +++ b/Core/GDCore/DocMainPage.h @@ -14,9 +14,8 @@ * * \section other Other documentations * - * GDevelop is architectured around a `Core` (this library), platforms (`GDJS`, `GDCpp`) and extensions (`Extensions` folder). The editor (`newIDE` folder) is using all of these libraries. + * GDevelop is architectured around a `Core` (this library), a game engine (`GDJS`) and extensions (`Extensions` folder). The editor (`newIDE` folder) is using all of these libraries. * - * - [Open GDevelop C++ Platform documentation](../GDCpp Documentation/index.html) * - [Open GDevelop JS Platform documentation](../GDJS Documentation/index.html) * - Getting started with the editor * - Getting started with the extensions diff --git a/Core/GDCore/Events/CodeGeneration/EventsCodeGenerator.h b/Core/GDCore/Events/CodeGeneration/EventsCodeGenerator.h index 9f4f177b6..8a52344c2 100644 --- a/Core/GDCore/Events/CodeGeneration/EventsCodeGenerator.h +++ b/Core/GDCore/Events/CodeGeneration/EventsCodeGenerator.h @@ -462,24 +462,21 @@ class GD_CORE_API EventsCodeGenerator { * Other standard parameters type that should be implemented by platforms: * - currentScene: Reference to the current runtime scene. * - objectList : a map containing lists of objects which are specified by the - object name in another parameter. (C++: std::map *>). Example: + object name in another parameter. Example: * \code AddExpression("Count", _("Object count"), _("Count the number of picked objects"), _("Objects"), "res/conditions/nbObjet.png") .AddParameter("objectList", _("Object")) - .SetFunctionName("PickedObjectsCount").SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); + .SetFunctionName("getPickedObjectsCount"); * \endcode * - objectListWithoutPicking : Same as objectList but do not pick object if they are not already picked. - * - objectPtr : Return a pointer to object specified by the object name in - another parameter ( C++: RuntimeObject* ). Example: + * - objectPtr : Return a reference to the object specified by the object name in + another parameter. Example: * \code .AddParameter("object", _("Object")) .AddParameter("objectPtr", _("Target object")) - //The called function will be called with this signature on the C++ platform: - Function(gd::String, RuntimeObject*) * \endcode */ virtual gd::String GenerateParameterCodes( diff --git a/Core/GDCore/Events/Event.h b/Core/GDCore/Events/Event.h index 69e0d05a5..563cfd7ff 100644 --- a/Core/GDCore/Events/Event.h +++ b/Core/GDCore/Events/Event.h @@ -16,7 +16,6 @@ #include "GDCore/String.h" namespace gd { class EventsList; -class MainFrameWrapper; class Project; class Layout; class EventsCodeGenerator; diff --git a/Core/GDCore/Extensions/Builtin/AllBuiltinExtensions.h b/Core/GDCore/Extensions/Builtin/AllBuiltinExtensions.h index edf7681aa..dcf905391 100644 --- a/Core/GDCore/Extensions/Builtin/AllBuiltinExtensions.h +++ b/Core/GDCore/Extensions/Builtin/AllBuiltinExtensions.h @@ -32,7 +32,6 @@ class GD_CORE_API BuiltinExtensionsImplementer { static void ImplementsExternalLayoutsExtension( gd::PlatformExtension& extension); static void ImplementsFileExtension(gd::PlatformExtension& extension); - static void ImplementsJoystickExtension(gd::PlatformExtension& extension); static void ImplementsKeyboardExtension(gd::PlatformExtension& extension); static void ImplementsMathematicalToolsExtension( gd::PlatformExtension& extension); diff --git a/Core/GDCore/Extensions/Builtin/JoystickExtension.cpp b/Core/GDCore/Extensions/Builtin/JoystickExtension.cpp deleted file mode 100644 index 23a3659f0..000000000 --- a/Core/GDCore/Extensions/Builtin/JoystickExtension.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "AllBuiltinExtensions.h" -#include "GDCore/Tools/Localization.h" - -using namespace std; -namespace gd { - -void GD_CORE_API BuiltinExtensionsImplementer::ImplementsJoystickExtension( - gd::PlatformExtension& extension) { - extension - .SetExtensionInformation( - "BuiltinJoystick", - _("Joysticks features"), - "Built-in extension that enables the use of joysticks.", - "Florian Rival", - "Open source (MIT License)") - .SetExtensionHelpPath("" /*TODO: Add a documentation page for this */); - -#if defined(GD_IDE_ONLY) - extension - .AddCondition("JoystickButtonDown", - _("A button on a joystick is pressed"), - _("Test if a button on a joystick is pressed."), - _("The button _PARAM2_ of joystick _PARAM1_ is pressed"), - _("Joystick"), - "res/conditions/joystick24.png", - "res/conditions/joystick.png") - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("expression", _("Joystick number (first joystick: 0)")) - .AddParameter("expression", _("Button")); - - extension - .AddCondition("JoystickAxis", - _("Value of an axis of a joystick"), - _("Test the value of an axis of a joystick."), - _("the value of the axis _PARAM2_ of joystick _PARAM1_"), - _("Joystick"), - "res/conditions/joystick24.png", - "res/conditions/joystick.png") - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("expression", _("Joystick number (first joystick: 0)")) - .AddParameter("joyaxis", _("Axis")) - .UseStandardRelationalOperatorParameters("number"); - - extension - .AddAction( - "GetJoystickAxis", - _("Get the value of the axis of a joystick"), - _("Save the value of the axis of the joystick (from -100 to 100)."), - _("Save in _PARAM3_ the value of axis _PARAM2_ of joystick _PARAM1_"), - _("Joystick"), - "res/actions/joystick24.png", - "res/actions/joystick.png") - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("expression", _("Joystick number (first joystick: 0)")) - .AddParameter("joyaxis", _("Axis")) - .AddParameter("scenevar", _("Save the result to the scene variable")) - .SetManipulatedType("number"); - - extension - .AddExpression("GetJoystickAxis", - _("Joystick axis"), - _("Value of an axis of a joystick"), - _("Joystick"), - "res/conditions/joystick.png") - - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("expression", _("Joystick number (first joystick: 0)")) - .AddParameter("joyaxis", _("Axis")); -#endif -} - -} // namespace gd diff --git a/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.cpp b/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.cpp index 74e74041a..5e247b2a1 100644 --- a/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.cpp +++ b/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.cpp @@ -7,7 +7,6 @@ #include #include #include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.h" -#include "GDCore/Project/ImageManager.h" using namespace std; @@ -16,11 +15,7 @@ namespace gd { Point Sprite::badPoint(""); Sprite::Sprite() - : -#if !defined(EMSCRIPTEN) - hasItsOwnImage(false), -#endif - automaticCollisionMask(true), + : automaticCollisionMask(true), origine("origine"), centre("centre"), automaticCentre(true) { @@ -73,36 +68,10 @@ Point& Sprite::GetPoint(const gd::String& name) { bool Sprite::SetDefaultCenterPoint(bool enabled) { automaticCentre = enabled; - -#if !defined(EMSCRIPTEN) - if (automaticCentre) - centre.SetXY(sfmlSprite.getLocalBounds().width / 2, - sfmlSprite.getLocalBounds().height / 2); -#endif - return true; } std::vector Sprite::GetCollisionMask() const { - // TODO(perf): Cache to avoid re-creating a mask at every call -#if !defined(EMSCRIPTEN) - if (automaticCollisionMask) { - std::vector mask; - - Polygon2d rectangle; - rectangle.vertices.push_back(sf::Vector2f(0, 0)); - rectangle.vertices.push_back( - sf::Vector2f(sfmlSprite.getLocalBounds().width, 0)); - rectangle.vertices.push_back(sf::Vector2f( - sfmlSprite.getLocalBounds().width, sfmlSprite.getLocalBounds().height)); - rectangle.vertices.push_back( - sf::Vector2f(0, sfmlSprite.getLocalBounds().height)); - - mask.push_back(rectangle); - return mask; - } -#endif - return customCollisionMask; } @@ -111,25 +80,4 @@ void Sprite::SetCustomCollisionMask( customCollisionMask = collisionMask; } -#if !defined(EMSCRIPTEN) -void Sprite::LoadImage(std::shared_ptr image_) { - sfmlImage = image_; - sfmlSprite.setTexture(sfmlImage->texture, true); - hasItsOwnImage = false; - - if (automaticCentre) - centre.SetXY(sfmlSprite.getLocalBounds().width / 2, - sfmlSprite.getLocalBounds().height / 2); -} - -void Sprite::MakeSpriteOwnsItsImage() { - if (!hasItsOwnImage || sfmlImage == std::shared_ptr()) { - sfmlImage = std::make_shared( - sfmlImage->texture); // Copy the texture. - sfmlSprite.setTexture(sfmlImage->texture); - hasItsOwnImage = true; - } -} -#endif - } // namespace gd diff --git a/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.h b/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.h index 47aa84fb3..93d637688 100644 --- a/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.h +++ b/Core/GDCore/Extensions/Builtin/SpriteExtension/Sprite.h @@ -11,7 +11,6 @@ #include "GDCore/Extensions/Builtin/SpriteExtension/Point.h" #include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.h" #include "GDCore/String.h" -class SFMLTextureWrapper; #undef LoadImage // prevent windows.h to be polluting everything namespace gd { @@ -19,9 +18,6 @@ namespace gd { /** * \brief Represents a sprite to be displayed on the screen. * - * A sprite contains a SFML sprite to be displayed, some points, - * and can also have its own texture (rather than a texture from ImageManager). - * * \see Direction * \see SpriteObject * \ingroup SpriteObjectExtension @@ -163,53 +159,7 @@ class GD_CORE_API Sprite { */ bool SetDefaultCenterPoint(bool enabled); -#if !defined(EMSCRIPTEN) - /** \name Sprite runtime management - * Functions used by the C++ game engine. - */ - ///@{ - /** - * \brief Get the SFML sprite associated with the sprite - */ - inline const sf::Sprite& GetSFMLSprite() const { return sfmlSprite; } - - /** - * \brief Get the SFML sprite associated with the sprite - */ - inline sf::Sprite& GetSFMLSprite() { return sfmlSprite; } - - /** - * \brief Set the SFML texture of the sprite - */ - void LoadImage(std::shared_ptr image); - - /** - * \brief Get SFML texture used by the sprite - */ - std::shared_ptr GetSFMLTexture() { return sfmlImage; }; - - /** - * \brief Get SFML texture used by the sprite - */ - const std::shared_ptr GetSFMLTexture() const { - return sfmlImage; - }; - - /** - * \brief Make the sprite, if it uses a texture from ImageManager, - * copy this texture and take ownership of it. - */ - void MakeSpriteOwnsItsImage(); -///@} -#endif - private: -#if !defined(EMSCRIPTEN) - sf::Sprite sfmlSprite; ///< Displayed SFML sprite - std::shared_ptr - sfmlImage; ///< Pointer to the image displayed by the sprite. - bool hasItsOwnImage; ///< True if sfmlImage is only owned by this Sprite. -#endif gd::String image; ///< Name of the image to be loaded in Image Manager. bool automaticCollisionMask; ///< True to use the custom collision mask. diff --git a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp index 2617ed6dd..d0fcea8f6 100644 --- a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp +++ b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp @@ -334,39 +334,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension( .UseStandardRelationalOperatorParameters("number") .MarkAsAdvanced(); - obj.AddAction("CopyImageOnImageOfSprite", - _("Copy an image on the current one of an object"), - _("Copy an image on the current image of an object.\nNote that " - "the source image must be preferably kept loaded in memory."), - _("Copy image _PARAM2_ on the current of _PARAM0_ at " - "_PARAM3_;_PARAM4_"), - _("Effects"), - "res/copy24.png", - "res/copyicon.png") - - .AddParameter("object", _("Object"), "Sprite") - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("string", _("Name of the source image")) - .AddParameter("expression", _("X position")) - .AddParameter("expression", _("Y position")) - .AddParameter( - "yesorno", - _("Should the copy take in account the source transparency\?")); - - obj.AddAction( - "CreateMaskFromColorOnActualImage", // Actual is indeed a mistake : - // Current should have been - // chosen. - _("Make a color of the image of an object transparent"), - _("Make a color of the image of an object transparent."), - _("Make color _PARAM1_ of the current image of _PARAM0_ transparent"), - _("Effects"), - "res/actions/opacity24.png", - "res/actions/opacity.png") - - .AddParameter("object", _("Object"), "Sprite") - .AddParameter("color", _("Color to make transparent")); - obj.AddAction("ChangeColor", _("Tint color"), _("Change the tint of an object. The default color is white."), diff --git a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.cpp b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.cpp index baf64d405..3890e6dc2 100644 --- a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.cpp +++ b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.cpp @@ -10,7 +10,6 @@ #include "GDCore/Extensions/Builtin/SpriteExtension/Direction.h" #include "GDCore/Extensions/Builtin/SpriteExtension/Sprite.h" #include "GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h" -#include "GDCore/Project/ImageManager.h" #include "GDCore/Project/InitialInstance.h" #include "GDCore/Project/Layout.h" #include "GDCore/Project/Object.h" diff --git a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h index 6b27631a3..f27cb60f6 100644 --- a/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h +++ b/Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h @@ -16,7 +16,6 @@ class Object; class Layout; class Sprite; class Animation; -class MainFrameWrapper; class SerializerElement; class PropertyDescriptor; } // namespace gd diff --git a/Core/GDCore/IDE/PlatformLoader.cpp b/Core/GDCore/IDE/PlatformLoader.cpp index 30e094abe..442f22207 100644 --- a/Core/GDCore/IDE/PlatformLoader.cpp +++ b/Core/GDCore/IDE/PlatformLoader.cpp @@ -27,50 +27,6 @@ namespace gd { PlatformLoader::PlatformLoader() {} -void PlatformLoader::LoadAllPlatformsInManager(gd::String dir) { - { -#if defined(WINDOWS) - std::shared_ptr platform = LoadPlatformInManager("GDCpp.dll"); -#elif defined(LINUX) - std::shared_ptr platform = - LoadPlatformInManager("libGDCpp.so"); -#elif defined(MACOS) - std::shared_ptr platform = - LoadPlatformInManager("libGDCpp.dylib"); -#else -#warning Add the appropriate filename here for the C++ Platform! - std::shared_ptr platform; -#endif - if (platform) - gd::ExtensionsLoader::LoadAllExtensions("./CppPlatform/Extensions/", - *platform); - } - - { -#if defined(WINDOWS) - std::shared_ptr platform = - LoadPlatformInManager("./JsPlatform/GDJS.dll"); -#elif defined(LINUX) - std::shared_ptr platform = - LoadPlatformInManager("./JsPlatform/libGDJS.so"); -#elif defined(MACOS) - std::shared_ptr platform = - LoadPlatformInManager("./JsPlatform/libGDJS.dylib"); -#else -#warning Add the appropriate filename here for the Js Platform! - std::shared_ptr platform; -#endif - if (platform) - gd::ExtensionsLoader::LoadAllExtensions("./JsPlatform/Extensions/", - *platform); - if (platform) - gd::ExtensionsLoader::LoadAllExtensions( - "./CppPlatform/Extensions/", *platform, true); - } - - gd::ExtensionsLoader::ExtensionsLoadingDone("./CppPlatform/Extensions/"); -} - std::shared_ptr PlatformLoader::LoadPlatformInManager( gd::String fullpath) { std::cout << "Loading platform " << fullpath << "..." << std::endl; diff --git a/Core/GDCore/IDE/PlatformLoader.h b/Core/GDCore/IDE/PlatformLoader.h index 2977c6203..ed9c494ed 100644 --- a/Core/GDCore/IDE/PlatformLoader.h +++ b/Core/GDCore/IDE/PlatformLoader.h @@ -30,15 +30,6 @@ passing */ class GD_CORE_API PlatformLoader { public: - /** - * Load all the platforms available in a directory. - * - * \param dir The directory where platforms must be searched for. - * - * \todo For now, only GDCpp.dll and GDJS.dll are loaded. - */ - static void LoadAllPlatformsInManager(gd::String dir); - /** * Load a specific platform. * diff --git a/Core/GDCore/Project/ImageManager.cpp b/Core/GDCore/Project/ImageManager.cpp deleted file mode 100644 index c97446ce1..000000000 --- a/Core/GDCore/Project/ImageManager.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCore/Project/ImageManager.h" -#include -#include "GDCore/Project/ResourcesLoader.h" -#include "GDCore/Project/ResourcesManager.h" -#include "GDCore/Tools/InvalidImage.h" -#if !defined(ANDROID) && !defined(MACOS) -#include -#endif -#undef LoadImage // thx windows.h - -namespace gd { - -ImageManager::ImageManager() : resourcesManager(NULL) { -#if !defined(EMSCRIPTEN) - badTexture = std::make_shared(); - badTexture->texture.loadFromMemory(gd::InvalidImageData, - sizeof(gd::InvalidImageData)); - badTexture->texture.setSmooth(false); - badTexture->image = badTexture->texture.copyToImage(); -#endif -} - -std::shared_ptr ImageManager::GetSFMLTexture( - const gd::String& name) const { - if (!resourcesManager) { - std::cout << "ImageManager has no ResourcesManager associated with."; - return badTexture; - } - - if (alreadyLoadedImages.find(name) != alreadyLoadedImages.end() && - !alreadyLoadedImages.find(name)->second.expired()) - return alreadyLoadedImages.find(name)->second.lock(); - - std::cout << "ImageManager: Loading " << name << "."; - - // Load only an image when necessary - try { - ImageResource& image = - dynamic_cast(resourcesManager->GetResource(name)); - - auto texture = std::make_shared(); - ResourcesLoader::Get()->LoadSFMLImage(image.GetFile(), texture->image); - texture->texture.loadFromImage(texture->image); - texture->texture.setSmooth(image.smooth); - - alreadyLoadedImages[name] = texture; -#if defined(GD_IDE_ONLY) - if (preventUnloading) - unloadingPreventer.push_back( - texture); // If unload prevention is activated, add the image to the - // list dedicated to prevent images from being unloaded. -#endif - - return texture; - } catch (...) { - } - - std::cout << " Resource not found." << std::endl; - - return badTexture; -} - -bool ImageManager::HasLoadedSFMLTexture(const gd::String& name) const { - if (alreadyLoadedImages.find(name) != alreadyLoadedImages.end() && - !alreadyLoadedImages.find(name)->second.expired()) - return true; - - return false; -} - -void ImageManager::SetSFMLTextureAsPermanentlyLoaded( - const gd::String& name, - std::shared_ptr& texture) const { - if (alreadyLoadedImages.find(name) == alreadyLoadedImages.end() || - alreadyLoadedImages.find(name)->second.expired()) - alreadyLoadedImages[name] = texture; - - if (permanentlyLoadedImages.find(name) == permanentlyLoadedImages.end()) - permanentlyLoadedImages[name] = texture; -} - -void ImageManager::ReloadImage(const gd::String& name) const { - if (!resourcesManager) { - std::cout << "ImageManager has no ResourcesManager associated with."; - return; - } - - // Verify if image is in memory. If not, it will be automatically reloaded - // when necessary. - if (alreadyLoadedImages.find(name) == alreadyLoadedImages.end() || - alreadyLoadedImages.find(name)->second.expired()) - return; - - // Image still in memory, get it and update it. - std::shared_ptr oldTexture = - alreadyLoadedImages.find(name)->second.lock(); - - try { - ImageResource& image = - dynamic_cast(resourcesManager->GetResource(name)); - - std::cout << "ImageManager: Reload " << name << std::endl; - - ResourcesLoader::Get()->LoadSFMLImage(image.GetFile(), oldTexture->image); - oldTexture->texture.loadFromImage(oldTexture->image); - oldTexture->texture.setSmooth(image.smooth); - - return; - } catch (...) { /*The ressource is not an image*/ - } - - // Image not present anymore in image list. - std::cout << "ImageManager: " << name << " is not available anymore." - << std::endl; - *oldTexture = *badTexture; -} - -std::shared_ptr ImageManager::GetOpenGLTexture( - const gd::String& name) const { - if (alreadyLoadedOpenGLTextures.find(name) != - alreadyLoadedOpenGLTextures.end() && - !alreadyLoadedOpenGLTextures.find(name)->second.expired()) - return alreadyLoadedOpenGLTextures.find(name)->second.lock(); - - std::cout << "Load OpenGL Texture" << name << std::endl; - - std::shared_ptr texture = - std::make_shared(GetSFMLTexture(name)); - alreadyLoadedOpenGLTextures[name] = texture; - return texture; -} - -void ImageManager::LoadPermanentImages() { - if (!resourcesManager) { - std::cout << "ImageManager has no ResourcesManager associated with."; - return; - } - - // Create a new list of permanently loaded images but do not delete now the - // old list so as not to unload images that could be still present. - std::map > - newPermanentlyLoadedImages; - - std::vector resources = resourcesManager->GetAllResourceNames(); - for (std::size_t i = 0; i < resources.size(); i++) { - try { - ImageResource& image = dynamic_cast( - resourcesManager->GetResource(resources[i])); - - if (image.alwaysLoaded) - newPermanentlyLoadedImages[image.GetName()] = - GetSFMLTexture(image.GetName()); - } catch (...) { /*The resource is not an image, we don't care about it.*/ - } - } - - permanentlyLoadedImages = newPermanentlyLoadedImages; -} - -#if defined(GD_IDE_ONLY) -void ImageManager::PreventImagesUnloading() { - preventUnloading = true; - for (auto it = alreadyLoadedImages.begin(); it != alreadyLoadedImages.end(); - ++it) { - std::shared_ptr image = (it->second).lock(); - if (image != std::shared_ptr()) - unloadingPreventer.push_back(image); - } -} - -void ImageManager::EnableImagesUnloading() { - preventUnloading = false; - unloadingPreventer - .clear(); // Images which are not used anymore will thus be destroyed (As - // no shared pointer will be pointing to them). -} -#endif - -} // namespace gd - -SFMLTextureWrapper::SFMLTextureWrapper(const sf::Texture& texture_) - : texture(texture_), image(texture.copyToImage()) {} - -SFMLTextureWrapper::SFMLTextureWrapper() {} - -SFMLTextureWrapper::~SFMLTextureWrapper() {} - -OpenGLTextureWrapper::OpenGLTextureWrapper( - std::shared_ptr sfmlTexture_) { - sfmlTexture = sfmlTexture_; - -#if !defined(ANDROID) // TODO: OpenGL - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfmlTexture->image.getSize().x, - // sfmlTexture->image.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, - // sfmlTexture->image.getPixelsPtr()); glGenerateMipmap(GL_TEXTURE_2D); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); -#endif -} - -OpenGLTextureWrapper::~OpenGLTextureWrapper() { -#if !defined(ANDROID) // TODO: OpenGL - glDeleteTextures(1, &texture); -#endif -}; diff --git a/Core/GDCore/Project/ImageManager.h b/Core/GDCore/Project/ImageManager.h deleted file mode 100644 index 0d1eb5b0f..000000000 --- a/Core/GDCore/Project/ImageManager.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef ImageManager_H -#define ImageManager_H - -#include -#include -#include -#include -#include -#include -#include "GDCore/String.h" -namespace gd { -class ResourcesManager; -} -class OpenGLTextureWrapper; -class SFMLTextureWrapper; -#undef LoadImage // thx windows.h - -namespace gd { - -/** - * \brief Manage images for the IDE as well as at runtime for GD C++ Platform, - * providing an easy way to get SFML images or OpenGL textures. - * - * Image manager is used by objects to obtain their images from the image name. - * - * Images are loaded dynamically when necessary, and are unloaded if there is no - * more shared_ptr pointing on an image. - * - * You should in particular be interested by gd::ImageManager::GetOpenGLTexture - * and gd::ImageManager::GetSFMLTexture. - * - * \see SFMLTextureWrapper - * \see OpenGLTextureWrapper - * - * \ingroup ResourcesManagement - */ -class GD_CORE_API ImageManager { - public: - ImageManager(); - virtual ~ImageManager(){}; - - /** - * \brief Get a shared pointer to an OpenGL texture. The shared pointer must - * be kept alive as long as the texture is used. - */ - std::shared_ptr GetOpenGLTexture( - const gd::String& name) const; - - /** - * \brief Get a shared pointer to a SFML texture. The shared pointer must be - * kept alive as long as the texture is used. - * - * For example, if the texture is used in an object, you should store the - * shared pointer in a member to make sure the texture is available as long as - * the object is alive. - */ - std::shared_ptr GetSFMLTexture( - const gd::String& name) const; - - /** - * \brief Set the gd::ResourcesManager used by the ImageManager. - */ - void SetResourcesManager(gd::ResourcesManager* resourcesManager_) { - resourcesManager = resourcesManager_; - } - - /** - * \brief Load all images of the project which are flagged as alwaysLoaded. - * \see ImageResource - */ - void LoadPermanentImages(); - - /** - * \brief Check if a SFML texture with the specified name is available and - * loaded in memory. \return true if the texture called \a name if available - * and loaded in memory. - */ - bool HasLoadedSFMLTexture(const gd::String& name) const; - - /** - * \brief Add the SFMLTextureWrapper to loaded images ( so that it can be - * accessed thanks to ImageManager::GetSFMLTexture ) with the specified name - * and mark it as permanently loaded ( so that is is unloaded only when the - * layout is unloaded ). - */ - void SetSFMLTextureAsPermanentlyLoaded( - const gd::String& name, - std::shared_ptr& texture) const; - - /** - * \brief Reload a single image from the game resources - */ - void ReloadImage(const gd::String& name) const; - -#if defined(GD_IDE_ONLY) - /** - * \brief When called, images won't be unloaded from memory until - * EnableImagesUnloading is called. Can be used when reloading a layout so as - * to prevent images from being unloaded and then immediately reloaded. - */ - void PreventImagesUnloading(); - - /** - * \brief Enable again unused images to be unloaded from memory. - */ - void EnableImagesUnloading(); -#endif - - private: - mutable std::map > - alreadyLoadedImages; ///< Reference all images loaded in memory. - mutable std::map > - permanentlyLoadedImages; ///< Contains (smart) pointers to images which - ///< should stay loaded even if they are not - ///< (currently) used. - -#if defined(GD_IDE_ONLY) - - /** This list is filled, when PreventImagesUnloading is called, with images - * already loaded in memory ( and any image loaded after the call to - * PreventImagesUnloading ). It will thus prevent these images from being - * unloaded. This list is destroyed when EnableImagesUnloading is called. - * - * \see PreventImagesUnloading - * \see EnableImagesUnloading - */ - mutable std::vector > unloadingPreventer; - bool preventUnloading; ///< True if no images must be currently unloaded. -#endif - - mutable std::map > - alreadyLoadedOpenGLTextures; ///< Reference all OpenGL textures loaded in - ///< memory. - - mutable std::shared_ptr badTexture; - mutable std::shared_ptr badOpenGLTexture; - - gd::ResourcesManager* resourcesManager; -}; - -} // namespace gd - -/** - * \brief Class wrapping an SFML texture. - * - * \see gd::ImageManager - * \ingroup ResourcesManagement - */ -class GD_CORE_API SFMLTextureWrapper { - public: - SFMLTextureWrapper(const sf::Texture& texture); - SFMLTextureWrapper(); - ~SFMLTextureWrapper(); - - sf::Texture texture; - sf::Image image; ///< Associated sfml image, used for pixel perfect collision - ///< for example. If you update the image, call - ///< LoadFromImage on texture to update it also. -}; - -/** - * \brief Class wrapping an OpenGL texture. - * - * \see gd::ImageManager - * \ingroup ResourcesManagement - */ -class GD_CORE_API OpenGLTextureWrapper { - public: - OpenGLTextureWrapper(std::shared_ptr sfmlTexture_); - OpenGLTextureWrapper() : texture(0){}; - ~OpenGLTextureWrapper(); - inline GLuint GetOpenGLTexture() const { return texture; } - - private: - std::shared_ptr sfmlTexture; - GLuint texture; -}; - -#endif // ImageManager_H diff --git a/Core/GDCore/Project/Project.cpp b/Core/GDCore/Project/Project.cpp index 440c2a6a3..4e0b48279 100644 --- a/Core/GDCore/Project/Project.cpp +++ b/Core/GDCore/Project/Project.cpp @@ -26,7 +26,6 @@ #include "GDCore/Project/EventsFunctionsExtension.h" #include "GDCore/Project/ExternalEvents.h" #include "GDCore/Project/ExternalLayout.h" -#include "GDCore/Project/ImageManager.h" #include "GDCore/Project/Layout.h" #include "GDCore/Project/Object.h" #include "GDCore/Project/ObjectGroupsContainer.h" @@ -67,23 +66,16 @@ Project::Project() adaptGameResolutionAtRuntime(true), sizeOnStartupMode("adaptWidth"), projectUuid(""), - useDeprecatedZeroAsDefaultZOrder(false), - imageManager(std::make_shared()) + useDeprecatedZeroAsDefaultZOrder(false) #if defined(GD_IDE_ONLY) , useExternalSourceFiles(false), currentPlatform(NULL), gdMajorVersion(gd::VersionWrapper::Major()), gdMinorVersion(gd::VersionWrapper::Minor()), - gdBuildVersion(gd::VersionWrapper::Build()), - dirty(false) + gdBuildVersion(gd::VersionWrapper::Build()) #endif { - imageManager->SetResourcesManager(&resourcesManager); - -#if !defined(GD_IDE_ONLY) - platforms.push_back(&CppPlatform::Get()); -#endif } Project::~Project() {} @@ -823,10 +815,6 @@ void Project::SerializeTo(SerializerElement& element) const { for (std::size_t i = 0; i < externalSourceFiles.size(); ++i) externalSourceFiles[i]->SerializeTo( externalSourceFilesElement.AddChild("sourceFile")); - -#if defined(GD_IDE_ONLY) - dirty = false; -#endif } bool Project::ValidateName(const gd::String& name) { @@ -969,9 +957,7 @@ void Project::Init(const gd::Project& game) { platforms = game.platforms; resourcesManager = game.resourcesManager; - imageManager = std::make_shared(*game.imageManager); - imageManager->SetResourcesManager(&resourcesManager); - + initialObjects = gd::Clone(game.initialObjects); scenes = gd::Clone(game.scenes); @@ -993,7 +979,6 @@ void Project::Init(const gd::Project& game) { #if defined(GD_IDE_ONLY) projectFile = game.GetProjectFile(); - imagesChanged = game.imagesChanged; #endif } diff --git a/Core/GDCore/Project/Project.h b/Core/GDCore/Project/Project.h index 4cc85a6ae..e3e0310b7 100644 --- a/Core/GDCore/Project/Project.h +++ b/Core/GDCore/Project/Project.h @@ -28,7 +28,6 @@ class Object; class VariablesContainer; class ArbitraryResourceWorker; class SourceFile; -class ImageManager; class Behavior; class BehaviorsSharedData; class BaseEvent; @@ -498,19 +497,6 @@ class GD_CORE_API Project : public ObjectsContainer { */ void SerializeTo(SerializerElement& element) const; - /** - * \brief Return true if the project is marked as being modified (The IDE or - * application using the project should ask to save the project if the project - * is closed). - */ - bool IsDirty() { return dirty; } - - /** - * \brief Mark the project as being modified (The IDE or application - * using the project should ask to save the project if the project is closed). - */ - void SetDirty(bool enable = true) { dirty = enable; } - /** * Get the major version of GDevelop used to save the project. */ @@ -792,28 +778,6 @@ class GD_CORE_API Project : public ObjectsContainer { */ ResourcesManager& GetResourcesManager() { return resourcesManager; } - /** - * \brief Provide access to the ImageManager allowing to load SFML or OpenGL - * textures for the IDE ( or at runtime for the GD C++ Platform ). - */ - const std::shared_ptr& GetImageManager() const { - return imageManager; - } - - /** - * \brief Provide access to the ImageManager allowing to load SFML or OpenGL - * textures for the IDE ( or at runtime for the GD C++ Platform ). - */ - std::shared_ptr& GetImageManager() { return imageManager; } - - /** - * \brief Provide access to the ImageManager allowing to load SFML or OpenGL - * textures for the IDE ( or at runtime for the GD C++ Platform ). - */ - void SetImageManager(std::shared_ptr imageManager_) { - imageManager = imageManager_; - } - /** * \brief Called ( e.g. during compilation ) so as to inventory internal * resources, sometimes update their filename or any other work or resources. @@ -910,12 +874,6 @@ class GD_CORE_API Project : public ObjectsContainer { #endif ///@} -// TODO: Put this in private part -#if defined(GD_IDE_ONLY) - std::vector imagesChanged; ///< Images that have been changed and - ///< which have to be reloaded -#endif - private: /** * Initialize from another game. Used by copy-ctor and assign-op. @@ -954,9 +912,6 @@ class GD_CORE_API Project : public ObjectsContainer { #endif gd::ResourcesManager resourcesManager; ///< Contains all resources used by the project - std::shared_ptr - imageManager; ///< Image manager is accessed thanks to a (smart) ptr as - ///< it can be shared with GD C++ Platform projects. std::vector platforms; ///< Pointers to the platforms this project supports. gd::String firstLayout; @@ -987,7 +942,6 @@ class GD_CORE_API Project : public ObjectsContainer { ///< time the project was saved. mutable unsigned int gdBuildVersion; ///< The GD build version used the last ///< time the project was saved. - mutable bool dirty; ///< True to flag the project as being modified. #endif }; diff --git a/Core/GDCore/Project/ResourcesLoader.cpp b/Core/GDCore/Project/ResourcesLoader.cpp deleted file mode 100644 index 26ac72fe6..000000000 --- a/Core/GDCore/Project/ResourcesLoader.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "GDCore/Project/ResourcesLoader.h" -#include -#include -#include -#include -#include -#include -#include "GDCore/String.h" -#include "GDCore/Tools/FileStream.h" -#undef LoadImage // Undef a macro from windows.h - -using namespace std; - -namespace gd { - -ResourcesLoader *ResourcesLoader::_singleton = NULL; - -void ResourcesLoader::LoadSFMLImage(const gd::String &filename, - sf::Image &image) { - gd::SFMLFileStream stream; - if (!stream.open(filename) || !image.loadFromStream(stream)) - cout << "Failed to load a SFML image: " << filename << endl; -} - -sf::Texture ResourcesLoader::LoadSFMLTexture(const gd::String &filename) { - sf::Texture texture; - LoadSFMLTexture(filename, texture); - - return texture; -} - -void ResourcesLoader::LoadSFMLTexture(const gd::String &filename, - sf::Texture &texture) { - gd::SFMLFileStream stream; - if (!stream.open(filename) || !texture.loadFromStream(stream)) - cout << "Failed to load a SFML texture: " << filename << endl; -} - -std::pair ResourcesLoader::LoadFont( - const gd::String &filename) { - sf::Font *font = new sf::Font(); - StreamHolder *streamHolder = new StreamHolder(); - - if (!streamHolder->stream.open(filename) || - !font->loadFromStream(streamHolder->stream)) { - cout << "Failed to load a font from a file: " << filename << endl; - delete font; - delete streamHolder; - return std::make_pair((sf::Font *)nullptr, (StreamHolder *)nullptr); - } - - return std::make_pair(font, streamHolder); -} - -sf::SoundBuffer ResourcesLoader::LoadSoundBuffer(const gd::String &filename) { - sf::SoundBuffer sbuffer; - gd::SFMLFileStream stream; - if (!stream.open(filename) || !sbuffer.loadFromStream(stream)) - cout << "Failed to load a sound buffer: " << filename << endl; - - return sbuffer; -} - -gd::String ResourcesLoader::LoadPlainText(const gd::String &filename) { - gd::String text; - gd::FileStream file(filename, ios::in); - - if (!file.fail()) { - std::string ligne; - while (getline(file, ligne)) text += gd::String::FromUTF8(ligne) + "\n"; - - file.close(); - } else - cout << "Failed to read a file: " << filename << endl; - - return text; -} - -/** - * Load a binary text file - */ -char *ResourcesLoader::LoadBinaryFile(const gd::String &filename) { - gd::FileStream file(filename, ios::in | ios::binary | ios::ate); - if (file.is_open()) { - iostream::pos_type size = file.tellg(); - char *memblock = new char[size]; - file.seekg(0, ios::beg); - file.read(memblock, size); - file.close(); - - return memblock; - } - - cout << "Binary file " << filename << " can't be loaded into memory " << endl; - return NULL; -} - -long int ResourcesLoader::GetBinaryFileSize(const gd::String &filename) { - gd::FileStream file(filename, ios::in | ios::binary | ios::ate); - if (file.is_open()) { - return file.tellg(); - } - - std::cout << "Binary file " << filename << " cannot be read. " << std::endl; - return 0; -} - -} // namespace gd diff --git a/Core/GDCore/Project/ResourcesLoader.h b/Core/GDCore/Project/ResourcesLoader.h deleted file mode 100644 index 7a46ea34a..000000000 --- a/Core/GDCore/Project/ResourcesLoader.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RESSOURCESLOADER_H -#define RESSOURCESLOADER_H -#include -#include -#include "GDCore/String.h" -#include "GDCore/Tools/FileStream.h" -#undef LoadImage // Undef macro from windows.h - -namespace gd { - -/** - * \brief A class holding a buffer and/or a file stream (useful for SFML classes - * that needs their buffer/stream continuously opened) - */ -struct StreamHolder { - StreamHolder() : buffer(nullptr), stream() {} - ~StreamHolder() { - if (buffer) delete buffer; - } - - char *buffer; - gd::SFMLFileStream stream; -}; - -/** - * \brief Class used by games to load resources from files: this is purely an - * abstraction to most SFML loadFrom* functions. - * - * This class is replaced in GDCpp by an equivalent that can load also from - * memory. - * - * \ingroup ResourcesManagement - */ -class GD_CORE_API ResourcesLoader { - public: - void LoadSFMLImage(const gd::String &filename, sf::Image &image); - - /** - * Load a SFML texture. - */ - sf::Texture LoadSFMLTexture(const gd::String &filename); - void LoadSFMLTexture(const gd::String &filename, sf::Texture &texture); - - /** - * Load a SFML Font. - * \warning The function calling LoadFont is the owner of the returned font - * and buffer (if any): Don't forget to delete them after use. - * - * \return A pair containing the loaded font, or NULL if loading failed, and - * the buffer that need to be kept alive while the font is used (can be NULL - * if the font was loaded from a file). - */ - std::pair LoadFont(const gd::String &filename); - - /** - * Load a SFML Sound Buffer - */ - sf::SoundBuffer LoadSoundBuffer(const gd::String &filename); - - /** - * Load a plain text file - */ - gd::String LoadPlainText(const gd::String &filename); - - /** - * Get a buffer for file. - * Be careful, the buffer will be invalided by any subsequent call to - * Load[Something]. Make a copy of the buffer if you want it to stay alive - * longer. - */ - char *LoadBinaryFile(const gd::String &filename); - - /** - * Get the size of a file - */ - long int GetBinaryFileSize(const gd::String &filename); - - static ResourcesLoader *Get() { - if (NULL == _singleton) { - _singleton = new ResourcesLoader; - } - - return (static_cast(_singleton)); - } - - static void DestroySingleton() { - if (NULL != _singleton) { - delete _singleton; - _singleton = NULL; - } - } - - private: - ResourcesLoader(){}; - virtual ~ResourcesLoader(){}; - - static ResourcesLoader *_singleton; -}; - -} // namespace gd -#endif // RESSOURCESLOADER_H diff --git a/Core/GDCore/Tools/Localization.h b/Core/GDCore/Tools/Localization.h index 1ac82d600..7997f2e03 100644 --- a/Core/GDCore/Tools/Localization.h +++ b/Core/GDCore/Tools/Localization.h @@ -9,12 +9,11 @@ /** @file * Provide a way to mark strings to be translated. * - * Strings to be translated in GDevelop Core codebase (and GDCpp), + * Strings to be translated in GDevelop Core codebase * are marked with the underscore macro, for example: _("Hello World"). * * The macro is then defined to be using the translation function - * of the underlying platform (Emscripten for GDevelop 5, - * no translation for GDCpp Runtime). + * of the underlying platform (Emscripten for GDevelop 5). */ #if defined(EMSCRIPTEN) @@ -33,7 +32,7 @@ gd::String GetTranslation(const char* str); #define _(s) gd::GetTranslation(u8##s) #else -// When compiling without Emscripten (typically for GDC++ Runtime), +// When compiling without Emscripten, // just return an untranslated gd::String. // Create a new macro to return UTF8 gd::String from a translation diff --git a/Core/GDCore/Tools/VersionPriv.h b/Core/GDCore/Tools/VersionPriv.h new file mode 100644 index 000000000..35e33b6d7 --- /dev/null +++ b/Core/GDCore/Tools/VersionPriv.h @@ -0,0 +1,8 @@ +// Deprecated version number that was used for GDevelop 4, but still +// used to version the project files. +// Might be a good idea to refactor this at some point to make it +// clearer this is used for the versioning of the project files. +#define GD_VERSION_STRING "4.0.99-0-release" +#define GD_VERSION_RC 4,0,99,0-0-release +#define GD_VERSION_RC_STRING "4, 0, 99, 0-0-release\0" +#define GD_DATE_STRING __DATE__ diff --git a/Core/GDCore/Tools/VersionWrapper.cpp b/Core/GDCore/Tools/VersionWrapper.cpp index f08ea8ab8..4a4f6e459 100644 --- a/Core/GDCore/Tools/VersionWrapper.cpp +++ b/Core/GDCore/Tools/VersionWrapper.cpp @@ -5,6 +5,7 @@ */ #include "GDCore/Tools/VersionWrapper.h" +#include "GDCore/Tools/VersionPriv.h" namespace gd { @@ -35,13 +36,6 @@ gd::String VersionWrapper::Year() { gd::String VersionWrapper::Status() { return Revision() == 0 ? "Release" : "Dev"; } -bool VersionWrapper::CompiledForEdittime() { -#if defined(GD_IDE_ONLY) - return true; -#else - return false; -#endif -} bool VersionWrapper::IsOlder(int major, int minor, diff --git a/Core/GDCore/Tools/VersionWrapper.h b/Core/GDCore/Tools/VersionWrapper.h index 572db243b..f6b9127dd 100644 --- a/Core/GDCore/Tools/VersionWrapper.h +++ b/Core/GDCore/Tools/VersionWrapper.h @@ -7,8 +7,6 @@ #define GDCORE_VERSIONWRAPPER_H #include "GDCore/String.h" -#include "GDCore/Tools/VersionPriv.h" - namespace gd { /** @@ -48,11 +46,6 @@ class GD_CORE_API VersionWrapper { */ static gd::String Status(); - /** - * \brief Return true if GDCpp is compiled with edittime support. - */ - static bool CompiledForEdittime(); - /** * \brief Get Year of the release */ diff --git a/Core/GDevelop-Architecture-Overview.md b/Core/GDevelop-Architecture-Overview.md index 58ca30854..5281138f8 100644 --- a/Core/GDevelop-Architecture-Overview.md +++ b/Core/GDevelop-Architecture-Overview.md @@ -1,13 +1,12 @@ # GDevelop Architecture Overview -GDevelop is architectured around a `Core` library, platforms (`GDJS`, `GDCpp`) and extensions (`Extensions` folder). The editor (`newIDE` folder) is using all of these libraries. This is a recap table of the main folders: +GDevelop is architectured around a `Core` library, the game engine (`GDJS`) and extensions (`Extensions` folder). The editor (`newIDE` folder) is using all of these libraries. This is a recap table of the main folders: | Directory | ℹ� Description | | ------------- | ----------------------------------------------------------------------------------------------------- | | `Core` | GDevelop core library, containing common tools to implement the IDE and work with GDevelop games. | -| `GDCpp` | The C++ game engine, used to build native games (_not used in GDevelop 5_). | | `GDJS` | The game engine, written in TypeScript, using PixiJS (WebGL), powering all GDevelop games. | -| `GDevelop.js` | Bindings of `Core`/`GDCpp`/`GDJS` and `Extensions` to JavaScript (with WebAssembly), used by the IDE. | +| `GDevelop.js` | Bindings of `Core`, `GDJS` and `Extensions` to JavaScript (with WebAssembly), used by the IDE. | | `newIDE` | The game editor, written in JavaScript with React, Electron and PixiJS. | | `Extensions` | Extensions for the game engine, providing objects, behaviors, events and new features. | @@ -17,11 +16,11 @@ The rest of this page is an introduction to the main concepts of GDevelop archit **IDE** stands for "Integrated Development Environment". A synonym for it is also simply "editor". In GDevelop, the software itself, that is used to create games and running as an app or a web-app, is called the "GDevelop Editor" or the "GDevelop IDE" -> The term "IDE" is also used in some folders. When you browse `Core`, `GDCpp` or `GDJS` subfolders, some folders are called `IDE`. They contain classes and tools that are **only useful for the editor** (they are not per se mandatory to describe the structure of a game). +> The term "IDE" is also used in some folders. When you browse `Core` or `GDJS` subfolders, some folders are called `IDE`. They contain classes and tools that are **only useful for the editor** (they are not per se mandatory to describe the structure of a game). **Runtime** is a word used to describe classes, tools and source files being used during a game. This could also be called "in-game" or a "game engine". -> When you browse `GDCpp` or `GDJS` subfolders, you can find folders called `Runtime`. They contain the **game engine** of GDevelop. +> When you browse `GDJS` subfolder, you can find a folder called `Runtime`. It's the **game engine** of GDevelop. Extensions do have the same distinction between the "**IDE**" part and the "**Runtime**" part. For example, most extensions have: @@ -79,7 +78,7 @@ You're welcome to do so! Please get in touch :) The idea of the GDevelop editor and game engine is to have a lean game engine, supporting almost nothing. Then, one can add "mods", "plugins", "modules" for GDevelop. We chose to call them "**Extensions**" in GDevelop. - `GDevelop/Core/GDCore/Extensions` is the **declaration** of default (we say "builtin") extensions, that are available for any game and are "mandatory". They are called Extensions but they could be named "Extensions that will always be in your game". In programming languages, this is called a "[Standard Library](https://en.wikipedia.org/wiki/Standard_library)" (but don't get too distracted by this naming). -- `GDevelop/GDJS/GDJS/Extensions/` and `GDevelop/GDCpp/GDCpp/Extensions/` are reusing these **declarations** and **adding** their own declarations. Mainly, they are setting the name of the functions to be called (either in TypeScript or in C++) for each action, condition or expression. +- `GDevelop/GDJS/GDJS/Extensions/` is reusing these **declarations** and **adding** their own declarations. Mainly, they are setting the name of the functions to be called (either in TypeScript or in C++) for each action, condition or expression. - `GDevelop/Extensions/` is the folder for the "mods"/"plugins" for GDevelop - the ones that are not mandatory. They are not part of GDCore - they work on their own. > In theory, all extensions could be moved to `GDevelop/Extensions/`. In practice, it's more pragmatic to have a set of "built-in" extensions with basic features. diff --git a/Extensions/AnchorBehavior/AnchorBehavior.h b/Extensions/AnchorBehavior/AnchorBehavior.h index 637550ce2..b0216259b 100644 --- a/Extensions/AnchorBehavior/AnchorBehavior.h +++ b/Extensions/AnchorBehavior/AnchorBehavior.h @@ -6,8 +6,8 @@ This project is released under the MIT License. #ifndef ANCHORBEHAVIOR_H #define ANCHORBEHAVIOR_H #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" namespace gd { class SerializerElement; class Project; @@ -16,7 +16,7 @@ class Project; /** * \brief Allow to anchor objects to the window's bounds. */ -class GD_EXTENSION_API AnchorBehavior : public Behavior { +class GD_EXTENSION_API AnchorBehavior : public gd::Behavior { public: enum HorizontalAnchor { ANCHOR_HORIZONTAL_NONE = 0, diff --git a/Extensions/AnchorBehavior/AnchorRuntimeBehavior.cpp b/Extensions/AnchorBehavior/AnchorRuntimeBehavior.cpp deleted file mode 100644 index 4005d6a3d..000000000 --- a/Extensions/AnchorBehavior/AnchorRuntimeBehavior.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/** - -GDevelop - Anchor Behavior Extension -Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com) -This project is released under the MIT License. -*/ - -#include "AnchorRuntimeBehavior.h" -#include -#include -#include -#include -#include -#include -#include "GDCore/CommonTools.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#if defined(GD_IDE_ONLY) -#include -#include "GDCore/Project/PropertyDescriptor.h" -#endif - -AnchorRuntimeBehavior::AnchorRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - m_relativeToOriginalWindowSize(true), - m_leftEdgeAnchor(ANCHOR_HORIZONTAL_NONE), - m_rightEdgeAnchor(ANCHOR_HORIZONTAL_NONE), - m_topEdgeAnchor(ANCHOR_VERTICAL_NONE), - m_bottomEdgeAnchor(ANCHOR_VERTICAL_NONE), - m_invalidDistances(true), - m_leftEdgeDistance(0.f), - m_rightEdgeDistance(0.f), - m_topEdgeDistance(0.f), - m_bottomEdgeDistance(0.f) { - m_relativeToOriginalWindowSize = - behaviorContent.GetBoolAttribute("relativeToOriginalWindowSize"); - m_leftEdgeAnchor = static_cast( - behaviorContent.GetIntAttribute("leftEdgeAnchor")); - m_rightEdgeAnchor = static_cast( - behaviorContent.GetIntAttribute("rightEdgeAnchor")); - m_topEdgeAnchor = static_cast( - behaviorContent.GetIntAttribute("topEdgeAnchor")); - m_bottomEdgeAnchor = static_cast( - behaviorContent.GetIntAttribute("bottomEdgeAnchor")); -} - -void AnchorRuntimeBehavior::OnActivate() { m_invalidDistances = true; } - -namespace { -sf::Vector2f mapFloatPixelToCoords(const sf::Vector2f& point, - const sf::RenderTarget& target, - const sf::View& view) { - // First, convert from viewport coordinates to homogeneous coordinates - sf::Vector2f normalized; - sf::IntRect viewport = target.getViewport(view); - normalized.x = -1.f + 2.f * (point.x - static_cast(viewport.left)) / - static_cast(viewport.width); - normalized.y = 1.f - 2.f * (point.y - static_cast(viewport.top)) / - static_cast(viewport.height); - - // Then transform by the inverse of the view matrix - return view.getInverseTransform().transformPoint(normalized); -} - -sf::Vector2f mapCoordsToFloatPixel(const sf::Vector2f& point, - const sf::RenderTarget& target, - const sf::View& view) { - // Note: almost the same as RenderTarget::mapCoordsToPixel except that the - // result is sf::Vector2f - - // First, transform the point by the view matrix - sf::Vector2f normalized = view.getTransform().transformPoint(point); - - // Then convert to viewport coordinates - sf::Vector2f pixel; - sf::IntRect viewport = target.getViewport(view); - pixel.x = (normalized.x + 1.f) / 2.f * static_cast(viewport.width) + - static_cast(viewport.left); - pixel.y = (-normalized.y + 1.f) / 2.f * static_cast(viewport.height) + - static_cast(viewport.top); - - return pixel; -} -} // namespace - -void AnchorRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) {} - -void AnchorRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { - const RuntimeLayer& layer = scene.GetRuntimeLayer(object->GetLayer()); - const RuntimeCamera& firstCamera = layer.GetCamera(0); - - if (m_invalidDistances) { - sf::Vector2u windowSize = - m_relativeToOriginalWindowSize - ? sf::Vector2u(scene.game->getWindowOriginalWidth(), - scene.game->getWindowOriginalHeight()) - : scene.renderWindow->getSize(); - - // Calculate the distances from the window's bounds. - sf::Vector2f topLeftPixel = mapCoordsToFloatPixel( - sf::Vector2f(object->GetDrawableX(), object->GetDrawableY()), - *(scene.renderWindow), - firstCamera.GetSFMLView()); - - sf::Vector2f bottomRightPixel = mapCoordsToFloatPixel( - sf::Vector2f(object->GetDrawableX() + object->GetWidth(), - object->GetDrawableY() + object->GetHeight()), - *(scene.renderWindow), - firstCamera.GetSFMLView()); - - // Left edge - if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT) - m_leftEdgeDistance = topLeftPixel.x; - else if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT) - m_leftEdgeDistance = static_cast(windowSize.x) - topLeftPixel.x; - else if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL) - m_leftEdgeDistance = topLeftPixel.x / windowSize.x; - - // Right edge - if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT) - m_rightEdgeDistance = bottomRightPixel.x; - else if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT) - m_rightEdgeDistance = - static_cast(windowSize.x) - bottomRightPixel.x; - else if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL) - m_rightEdgeDistance = bottomRightPixel.x / windowSize.x; - - // Top edge - if (m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP) - m_topEdgeDistance = topLeftPixel.y; - else if (m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM) - m_topEdgeDistance = static_cast(windowSize.y) - topLeftPixel.y; - else if (m_topEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL) - m_topEdgeDistance = topLeftPixel.y / static_cast(windowSize.y); - - // Bottom edge - if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP) - m_bottomEdgeDistance = bottomRightPixel.y; - else if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM) - m_bottomEdgeDistance = - static_cast(windowSize.y) - bottomRightPixel.y; - else if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL) - m_bottomEdgeDistance = - bottomRightPixel.y / static_cast(windowSize.y); - - m_invalidDistances = false; - } else { - sf::Vector2u windowSize = scene.renderWindow->getSize(); - - // Move and resize the object if needed - sf::Vector2f topLeftPixel; - sf::Vector2f bottomRightPixel; - - // Left edge - if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT) - topLeftPixel.x = m_leftEdgeDistance; - else if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT) - topLeftPixel.x = static_cast(windowSize.x) - m_leftEdgeDistance; - else if (m_leftEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL) - topLeftPixel.x = m_leftEdgeDistance * static_cast(windowSize.x); - - // Top edge - if (m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP) - topLeftPixel.y = m_topEdgeDistance; - else if (m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM) - topLeftPixel.y = static_cast(windowSize.y) - m_topEdgeDistance; - else if (m_topEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL) - topLeftPixel.y = m_topEdgeDistance * static_cast(windowSize.y); - - // Right edge - if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT) - bottomRightPixel.x = m_rightEdgeDistance; - else if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT) - bottomRightPixel.x = - static_cast(windowSize.x) - m_rightEdgeDistance; - else if (m_rightEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL) - bottomRightPixel.x = - m_rightEdgeDistance * static_cast(windowSize.x); - - // Bottom edge - if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP) - bottomRightPixel.y = m_bottomEdgeDistance; - else if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM) - bottomRightPixel.y = - static_cast(windowSize.y) - m_bottomEdgeDistance; - else if (m_bottomEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL) - bottomRightPixel.y = - m_bottomEdgeDistance * static_cast(windowSize.y); - - sf::Vector2f topLeftCoord = mapFloatPixelToCoords( - topLeftPixel, (*scene.renderWindow), firstCamera.GetSFMLView()); - sf::Vector2f bottomRightCoord = mapFloatPixelToCoords( - bottomRightPixel, (*scene.renderWindow), firstCamera.GetSFMLView()); - - // Move and resize the object according to the anchors - if (m_rightEdgeAnchor != ANCHOR_HORIZONTAL_NONE) - object->SetWidth(bottomRightCoord.x - topLeftCoord.x); - if (m_bottomEdgeAnchor != ANCHOR_VERTICAL_NONE) - object->SetHeight(bottomRightCoord.y - topLeftCoord.y); - if (m_leftEdgeAnchor != ANCHOR_HORIZONTAL_NONE) - object->SetX(topLeftCoord.x + object->GetX() - object->GetDrawableX()); - if (m_topEdgeAnchor != ANCHOR_VERTICAL_NONE) - object->SetY(topLeftCoord.y + object->GetY() - object->GetDrawableY()); - } -} diff --git a/Extensions/AnchorBehavior/AnchorRuntimeBehavior.h b/Extensions/AnchorBehavior/AnchorRuntimeBehavior.h deleted file mode 100644 index 2b5d420bd..000000000 --- a/Extensions/AnchorBehavior/AnchorRuntimeBehavior.h +++ /dev/null @@ -1,72 +0,0 @@ -/** -GDevelop - Anchor Behavior Extension -Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef ANCHORRuntimeBEHAVIOR_H -#define ANCHORRuntimeBEHAVIOR_H - -#include -#include -#include -#include -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/Project/Object.h" -namespace gd { -class Layout; -} -class RuntimeScene; -namespace gd { -class SerializerElement; -} -class RuntimeScenePlatformData; - -/** - * \brief Allow to anchor objects to the window's bounds. - */ -class GD_EXTENSION_API AnchorRuntimeBehavior : public RuntimeBehavior { - public: - enum HorizontalAnchor { - ANCHOR_HORIZONTAL_NONE = 0, - ANCHOR_HORIZONTAL_WINDOW_LEFT = 1, - ANCHOR_HORIZONTAL_WINDOW_RIGHT = 2, - ANCHOR_HORIZONTAL_PROPORTIONAL = 3 - }; - - enum VerticalAnchor { - ANCHOR_VERTICAL_NONE = 0, - ANCHOR_VERTICAL_WINDOW_TOP = 1, - ANCHOR_VERTICAL_WINDOW_BOTTOM = 2, - ANCHOR_VERTICAL_PROPORTIONAL = 3 - }; - - AnchorRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~AnchorRuntimeBehavior(){}; - virtual AnchorRuntimeBehavior* Clone() const override { return new AnchorRuntimeBehavior(*this); } - - virtual void OnActivate() override; - - private: - virtual void DoStepPreEvents(RuntimeScene& scene) override; - virtual void DoStepPostEvents(RuntimeScene& scene) override; - - bool m_relativeToOriginalWindowSize; ///< True if the original size of the - ///< game window must be used. - HorizontalAnchor m_leftEdgeAnchor; - HorizontalAnchor m_rightEdgeAnchor; - VerticalAnchor m_topEdgeAnchor; - VerticalAnchor m_bottomEdgeAnchor; - - bool m_invalidDistances; - // Distances (in window's units) from the XXX edge of the object to side of - // the window the edge is anchored on. Note: If the edge anchor is set to - // PROPORTIONAL, then it contains the ratio of the distance to the window - // size. - float m_leftEdgeDistance; - float m_rightEdgeDistance; - float m_topEdgeDistance; - float m_bottomEdgeDistance; -}; - -#endif // ANCHORRuntimeBEHAVIOR_H diff --git a/Extensions/AnchorBehavior/CMakeLists.txt b/Extensions/AnchorBehavior/CMakeLists.txt index 40a76e478..10d8094ad 100644 --- a/Extensions/AnchorBehavior/CMakeLists.txt +++ b/Extensions/AnchorBehavior/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(AnchorBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(AnchorBehavior "${source_files}") - gd_add_extension_target(AnchorBehavior "${source_files}") -gdcpp_add_runtime_extension_target(AnchorBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(AnchorBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(AnchorBehavior_Runtime) diff --git a/Extensions/AnchorBehavior/Extension.cpp b/Extensions/AnchorBehavior/Extension.cpp index 232178cf6..cb3de6a0e 100644 --- a/Extensions/AnchorBehavior/Extension.cpp +++ b/Extensions/AnchorBehavior/Extension.cpp @@ -6,9 +6,9 @@ This project is released under the MIT License. */ #include "AnchorBehavior.h" -#include "AnchorRuntimeBehavior.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Project/BehaviorsSharedData.h" +#include "GDCore/Tools/Localization.h" void DeclareAnchorBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -30,38 +30,3 @@ void DeclareAnchorBehaviorExtension(gd::PlatformExtension& extension) { std::make_shared(), std::make_shared()); } - -/** - * \brief This class declares information about the extension. - */ -class AnchorBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - AnchorBehaviorCppExtension() { - DeclareAnchorBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("AnchorBehavior::AnchorBehavior"), - "AnchorRuntimeBehavior"); - GetBehaviorMetadata("AnchorBehavior::AnchorBehavior") - .SetIncludeFile("AnchorBehavior/AnchorRuntimeBehavior.h"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppAnchorBehaviorExtension() { - return new AnchorBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new AnchorBehaviorCppExtension; -} -#endif diff --git a/Extensions/CMakeUtils.txt b/Extensions/CMakeUtils.txt index bb10b5055..d92458b5d 100644 --- a/Extensions/CMakeUtils.txt +++ b/Extensions/CMakeUtils.txt @@ -6,7 +6,6 @@ macro(gd_add_extension_includes) include_directories(${sfml_include_dir}) include_directories(${GDCORE_include_dir}) - include_directories(${GDCpp_include_dir}) endmacro() #Add common defines for a target that will be a GD extension @@ -76,69 +75,13 @@ function(gd_add_extension_target target_name source_files) ENDIF() endfunction() -#Add a GDC++ runtime extension target, that will produce the final library file for runtime. -function(gdcpp_add_runtime_extension_target gdcpp_runtime_target_name source_files) - IF(NOT gdcpp_runtime_target_name MATCHES "_Runtime$") - MESSAGE(ERROR "You called gdcpp_add_runtime_extension_target with a target name not finishing with '_Runtime'") - ENDIF() - string(REGEX REPLACE "_Runtime" "" target_name ${gdcpp_runtime_target_name}) - - IF(NOT EMSCRIPTEN) #Also add a GDC++ extension target - add_library(${gdcpp_runtime_target_name} SHARED ${source_files}) - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES COMPILE_DEFINITIONS "${${gdcpp_runtime_target_name}_extra_definitions}") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Extensions/Runtime") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Extensions/Runtime") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Extensions/Runtime") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES RUNTIME_OUTPUT_NAME "${target_name}") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES LIBRARY_OUTPUT_NAME "${target_name}") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES ARCHIVE_OUTPUT_NAME "${target_name}") - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES PREFIX "") - IF(WIN32) #GD extensions have special suffix in their filenames. - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES SUFFIX ".xgdw") - ELSE() - set_target_properties(${gdcpp_runtime_target_name} PROPERTIES SUFFIX ".xgd") - ENDIF() - ENDIF() -endfunction() - #Link default libraries with a target that is a GD extension function(gd_extension_link_libraries target_name) IF(EMSCRIPTEN) #Nothing. ELSE() target_link_libraries(${target_name} GDCore) - target_link_libraries(${target_name} GDCpp) target_link_libraries(${target_name} ${sfml_LIBRARIES}) ENDIF() endfunction() -#Link default libraries with a target that is a GDC++ Runtime extension -function(gdcpp_runtime_extension_link_libraries target_name) - IF(EMSCRIPTEN) - #Nothing. - ELSE() - target_link_libraries(${target_name} GDCpp_Runtime) - target_link_libraries(${target_name} ${sfml_LIBRARIES}) - IF(WIN32) - target_link_libraries(${target_name} ws2_32 user32 opengl32 glu32) - ENDIF(WIN32) - ENDIF() -endfunction() - - -#Create a target for a test executable of a GDC++ Runtime extension -function(gdcpp_add_tests_extension_target gdcpp_tests_target_name test_source_files) - IF(NOT gdcpp_tests_target_name MATCHES "_tests$") - MESSAGE(ERROR "You called gdcpp_add_tests_extension_target with a target name not finishing with '_tests'") - ENDIF() - string(REGEX REPLACE "_tests" "" target_name ${gdcpp_tests_target_name}) - - if(BUILD_TESTS) - add_executable(${gdcpp_tests_target_name} ${test_source_files}) - target_link_libraries(${gdcpp_tests_target_name} GDCpp_Runtime) - target_link_libraries(${gdcpp_tests_target_name} ${target_name}) - target_link_libraries(${gdcpp_tests_target_name} ${sfml_LIBRARIES}) - - set_target_properties(${gdcpp_tests_target_name} PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE) #Allow finding dependencies directly from build path on Mac OS X. - endif() -endfunction() diff --git a/Extensions/DestroyOutsideBehavior/CMakeLists.txt b/Extensions/DestroyOutsideBehavior/CMakeLists.txt index f1c7d7f4c..5e58118f3 100644 --- a/Extensions/DestroyOutsideBehavior/CMakeLists.txt +++ b/Extensions/DestroyOutsideBehavior/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(DestroyOutsideBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(DestroyOutsideBehavior "${source_files}") - gd_add_extension_target(DestroyOutsideBehavior "${source_files}") -gdcpp_add_runtime_extension_target(DestroyOutsideBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(DestroyOutsideBehavior GDCore) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(DestroyOutsideBehavior_Runtime) diff --git a/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.cpp b/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.cpp deleted file mode 100644 index b62a15b85..000000000 --- a/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - -GDevelop - DestroyOutside Behavior Extension -Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "DestroyOutsideRuntimeBehavior.h" -#include -#include -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" - -DestroyOutsideRuntimeBehavior::DestroyOutsideRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), extraBorder(0) { - extraBorder = behaviorContent.GetDoubleAttribute("extraBorder", 0); -} - -void DestroyOutsideRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { - bool erase = true; - const RuntimeLayer& theLayer = scene.GetRuntimeLayer(object->GetLayer()); - float objCenterX = object->GetDrawableX() + object->GetCenterX(); - float objCenterY = object->GetDrawableY() + object->GetCenterY(); - for (std::size_t cameraIndex = 0; cameraIndex < theLayer.GetCameraCount(); - ++cameraIndex) { - const RuntimeCamera& theCamera = theLayer.GetCamera(cameraIndex); - - float boundingCircleRadius = - sqrt(object->GetWidth() * object->GetWidth() + - object->GetHeight() * object->GetHeight()) / - 2.0; - if (objCenterX + boundingCircleRadius + extraBorder < - theCamera.GetViewCenter().x - theCamera.GetWidth() / 2.0 || - objCenterX - boundingCircleRadius - extraBorder > - theCamera.GetViewCenter().x + theCamera.GetWidth() / 2.0 || - objCenterY + boundingCircleRadius + extraBorder < - theCamera.GetViewCenter().y - theCamera.GetHeight() / 2.0 || - objCenterY - boundingCircleRadius - extraBorder > - theCamera.GetViewCenter().y + theCamera.GetHeight() / 2.0) { - // Ok we are outside the camera area. - } else { - // The object can be viewed by the camera. - erase = false; - break; - } - } - - if (erase) object->DeleteFromScene(scene); -} diff --git a/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h b/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h deleted file mode 100644 index 521c8e412..000000000 --- a/Extensions/DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - -GDevelop - DestroyOutside Behavior Extension -Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef DESTROYOUTSIDERUNTIMEBEHAVIOR_H -#define DESTROYOUTSIDERUNTIMEBEHAVIOR_H -#include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeBehavior.h" -class RuntimeScene; -namespace gd { -class SerializerElement; -} - -/** - * \brief Behavior that allows objects to be dragged with the mouse - */ -class GD_EXTENSION_API DestroyOutsideRuntimeBehavior : public RuntimeBehavior { - public: - DestroyOutsideRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~DestroyOutsideRuntimeBehavior(){}; - virtual DestroyOutsideRuntimeBehavior* Clone() const { - return new DestroyOutsideRuntimeBehavior(*this); - } - - /** - * \brief Return the value of the extra border. - */ - bool GetExtraBorder() const { return extraBorder; }; - - /** - * \brief Set the value of the extra border, i.e the supplementary margin that - * the object must cross before being deleted. - */ - void SetExtraBorder(float extraBorder_) { extraBorder = extraBorder_; }; - - private: - virtual void DoStepPostEvents(RuntimeScene& scene); - - float extraBorder; ///< The supplementary margin outside the screen that the - ///< object must cross before being deleted. -}; - -#endif // DESTROYOUTSIDERUNTIMEBEHAVIOR_H diff --git a/Extensions/DestroyOutsideBehavior/Extension.cpp b/Extensions/DestroyOutsideBehavior/Extension.cpp index ebb787a3f..4f5a9b121 100644 --- a/Extensions/DestroyOutsideBehavior/Extension.cpp +++ b/Extensions/DestroyOutsideBehavior/Extension.cpp @@ -6,8 +6,9 @@ This project is released under the MIT License. */ #include "DestroyOutsideBehavior.h" -#include "DestroyOutsideRuntimeBehavior.h" -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Project/BehaviorsSharedData.h" +#include "GDCore/Tools/Localization.h" void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -66,39 +67,3 @@ void DeclareDestroyOutsideBehaviorExtension(gd::PlatformExtension& extension) { .SetIncludeFile("DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class DestroyOutsideBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - DestroyOutsideBehaviorCppExtension() { - DeclareDestroyOutsideBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("DestroyOutsideBehavior::DestroyOutside"), - "DestroyOutsideRuntimeBehavior"); - GetBehaviorMetadata("DestroyOutsideBehavior::DestroyOutside") - .SetIncludeFile( - "DestroyOutsideBehavior/DestroyOutsideRuntimeBehavior.h"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppDestroyOutsideBehaviorExtension() { - return new DestroyOutsideBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new DestroyOutsideBehaviorCppExtension; -} -#endif diff --git a/Extensions/DraggableBehavior/CMakeLists.txt b/Extensions/DraggableBehavior/CMakeLists.txt index 31e41f6e0..0faf31c7a 100644 --- a/Extensions/DraggableBehavior/CMakeLists.txt +++ b/Extensions/DraggableBehavior/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(DraggableBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(DraggableBehavior "${source_files}") - gd_add_extension_target(DraggableBehavior "${source_files}") -gdcpp_add_runtime_extension_target(DraggableBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(DraggableBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(DraggableBehavior_Runtime) diff --git a/Extensions/DraggableBehavior/DraggableBehavior.cpp b/Extensions/DraggableBehavior/DraggableBehavior.cpp index 04b2a4bf5..0d62e09f5 100644 --- a/Extensions/DraggableBehavior/DraggableBehavior.cpp +++ b/Extensions/DraggableBehavior/DraggableBehavior.cpp @@ -6,6 +6,6 @@ This project is released under the MIT License. */ #include "DraggableBehavior.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/Serialization/SerializerElement.h" DraggableBehavior::DraggableBehavior() {} diff --git a/Extensions/DraggableBehavior/DraggableBehavior.h b/Extensions/DraggableBehavior/DraggableBehavior.h index 33eeec3a3..6e7f53620 100644 --- a/Extensions/DraggableBehavior/DraggableBehavior.h +++ b/Extensions/DraggableBehavior/DraggableBehavior.h @@ -9,8 +9,8 @@ This project is released under the MIT License. #define DRAGGABLEBEHAVIOR_H #include #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" class RuntimeScene; namespace gd { class SerializerElement; @@ -20,7 +20,7 @@ class Layout; /** * \brief Behavior that allows objects to be dragged with the mouse */ -class GD_EXTENSION_API DraggableBehavior : public Behavior { +class GD_EXTENSION_API DraggableBehavior : public gd::Behavior { public: DraggableBehavior(); virtual ~DraggableBehavior(){}; diff --git a/Extensions/DraggableBehavior/DraggableRuntimeBehavior.cpp b/Extensions/DraggableBehavior/DraggableRuntimeBehavior.cpp deleted file mode 100644 index 55d4a8508..000000000 --- a/Extensions/DraggableBehavior/DraggableRuntimeBehavior.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/** - -GDevelop - Draggable Behavior Extension -Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "DraggableRuntimeBehavior.h" -#include -#include -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" - -bool DraggableRuntimeBehavior::somethingDragged = false; -bool DraggableRuntimeBehavior::leftPressedLastFrame = false; - -DraggableRuntimeBehavior::DraggableRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), dragged(false) {} - -void DraggableRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - // Begin drag ? - if (!dragged && scene.GetInputManager().IsMouseButtonPressed("Left") && - !leftPressedLastFrame && !somethingDragged) { - RuntimeLayer& theLayer = scene.GetRuntimeLayer(object->GetLayer()); - for (std::size_t cameraIndex = 0; cameraIndex < theLayer.GetCameraCount(); - ++cameraIndex) { - sf::Vector2f mousePos = scene.renderWindow->mapPixelToCoords( - scene.GetInputManager().GetMousePosition(), - theLayer.GetCamera(cameraIndex).GetSFMLView()); - - if (object->GetDrawableX() <= mousePos.x && - object->GetDrawableX() + object->GetWidth() >= mousePos.x && - object->GetDrawableY() <= mousePos.y && - object->GetDrawableY() + object->GetHeight() >= mousePos.y) { - dragged = true; - somethingDragged = true; - xOffset = mousePos.x - object->GetX(); - yOffset = mousePos.y - object->GetY(); - dragCameraIndex = cameraIndex; - break; - } - } - } - // End dragging ? - else if (!scene.GetInputManager().IsMouseButtonPressed("Left")) { - dragged = false; - somethingDragged = false; - } - - // Being dragging ? - if (dragged) { - RuntimeLayer& theLayer = scene.GetRuntimeLayer(object->GetLayer()); - sf::Vector2f mousePos = scene.renderWindow->mapPixelToCoords( - scene.GetInputManager().GetMousePosition(), - theLayer.GetCamera(dragCameraIndex).GetSFMLView()); - - object->SetX(mousePos.x - xOffset); - object->SetY(mousePos.y - yOffset); - } -} - -void DraggableRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { - leftPressedLastFrame = scene.GetInputManager().IsMouseButtonPressed("Left"); -} - -void DraggableRuntimeBehavior::OnDeActivate() { - if (dragged) somethingDragged = false; - dragged = false; -} diff --git a/Extensions/DraggableBehavior/DraggableRuntimeBehavior.h b/Extensions/DraggableBehavior/DraggableRuntimeBehavior.h deleted file mode 100644 index 8e8ec48b8..000000000 --- a/Extensions/DraggableBehavior/DraggableRuntimeBehavior.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - -GDevelop - Draggable Behavior Extension -Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef DRAGGABLERUNTIMEBEHAVIOR_H -#define DRAGGABLERUNTIMEBEHAVIOR_H -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeBehavior.h" -class RuntimeScene; -namespace gd { -class SerializerElement; -} - -/** - * \brief Behavior that allows objects to be dragged with the mouse - */ -class GD_EXTENSION_API DraggableRuntimeBehavior : public RuntimeBehavior { - public: - DraggableRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~DraggableRuntimeBehavior(){}; - virtual DraggableRuntimeBehavior* Clone() const { - return new DraggableRuntimeBehavior(*this); - } - - /** - * \brief Return true if the object is being dragged. - */ - bool IsDragged() const { return dragged; }; - - virtual void OnDeActivate(); - - private: - virtual void DoStepPreEvents(RuntimeScene& scene); - virtual void DoStepPostEvents(RuntimeScene& scene); - - float xOffset; - float yOffset; - std::size_t dragCameraIndex; ///< The camera being used to move the object. ( - ///< The layer is the object's layer ). - bool dragged; ///< True if the object is being dragged. - static bool somethingDragged; ///< Used to avoid start dragging an object - ///< while another is being dragged. - static bool - leftPressedLastFrame; ///< Used to only start dragging when clicking. -}; - -#endif // DRAGGABLERUNTIMEBEHAVIOR_H diff --git a/Extensions/DraggableBehavior/Extension.cpp b/Extensions/DraggableBehavior/Extension.cpp index 96b8a9871..d245ad2df 100644 --- a/Extensions/DraggableBehavior/Extension.cpp +++ b/Extensions/DraggableBehavior/Extension.cpp @@ -6,8 +6,9 @@ This project is released under the MIT License. */ #include "DraggableBehavior.h" -#include "DraggableRuntimeBehavior.h" -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Project/BehaviorsSharedData.h" +#include "GDCore/Tools/Localization.h" void DeclareDraggableBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -46,33 +47,3 @@ void DeclareDraggableBehaviorExtension(gd::PlatformExtension& extension) { .SetFunctionName("IsDragged"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class Extension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - Extension() { - DeclareDraggableBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("DraggableBehavior::Draggable"), - "DraggableRuntimeBehavior"); - GetBehaviorMetadata("DraggableBehavior::Draggable") - .SetIncludeFile("DraggableBehavior/DraggableRuntimeBehavior.h"); - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new Extension; -} -#endif diff --git a/Extensions/Inventory/CMakeLists.txt b/Extensions/Inventory/CMakeLists.txt index bccf83d14..49791bc46 100644 --- a/Extensions/Inventory/CMakeLists.txt +++ b/Extensions/Inventory/CMakeLists.txt @@ -15,18 +15,7 @@ file(GLOB source_files *.cpp *.h) gd_add_clang_utils(Inventory "${source_files}") gd_add_extension_target(Inventory "${source_files}") -gdcpp_add_runtime_extension_target(Inventory_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(Inventory) - - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(Inventory_Runtime) - -#Tests for the GD C++ Runtime extension -### -file(GLOB_RECURSE test_source_files tests/*) -gdcpp_add_tests_extension_target(Inventory_Runtime_tests "${test_source_files}") diff --git a/Extensions/Inventory/Extension.cpp b/Extensions/Inventory/Extension.cpp index d4ae3c3e8..e1378d996 100644 --- a/Extensions/Inventory/Extension.cpp +++ b/Extensions/Inventory/Extension.cpp @@ -5,8 +5,8 @@ Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" -#include "InventoryTools.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include @@ -212,38 +212,3 @@ void DeclareInventoryExtension(gd::PlatformExtension& extension) { .SetIncludeFile("Inventory/InventoryTools.h"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class InventoryCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - InventoryCppExtension() { - DeclareInventoryExtension(*this); - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; - - virtual void SceneLoaded(RuntimeScene& scene) override { -#if defined(GD_IDE_ONLY) - InventoryTools::ClearAll(scene); -#endif - } -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppInventoryExtension() { - return new InventoryCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new InventoryCppExtension; -} -#endif diff --git a/Extensions/Inventory/Inventory.cpp b/Extensions/Inventory/Inventory.cpp deleted file mode 100644 index 08dbc8189..000000000 --- a/Extensions/Inventory/Inventory.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "Inventory.h" -#include "GDCore/String.h" - -bool Inventory::Has(const gd::String& itemName) { - return items.find(itemName) != items.end() && items[itemName].count > 0; -} - -size_t Inventory::Count(const gd::String& itemName) { - if (items.find(itemName) == items.end()) return 0; - - return items[itemName].count; -} - -bool Inventory::Add(const gd::String& itemName) { - if (items.find(itemName) == items.end()) { - MakeItemEntry(itemName); - } - - auto& item = items[itemName]; - if (item.unlimited || item.count < item.maxCount) { - item.count++; - - return true; - } - - return false; -} - -bool Inventory::SetCount(const gd::String& itemName, size_t count) { - if (items.find(itemName) == items.end()) { - MakeItemEntry(itemName); - } - - auto& item = items[itemName]; - size_t newCount = item.unlimited ? count : std::min(count, item.maxCount); - item.count = newCount; - - return item.unlimited || count <= item.maxCount; -} - -bool Inventory::IsFull(const gd::String& itemName) { - if (items.find(itemName) == items.end()) return false; - - auto& item = items[itemName]; - return !item.unlimited && item.count >= item.maxCount; -} - -bool Inventory::Remove(const gd::String& itemName) { - if (items.find(itemName) == items.end()) return false; - - auto& item = items[itemName]; - if (item.count > 0) { - item.count--; - - if (item.count == 0) { - item.equipped = false; - } - return true; - } - - return false; -} - -void Inventory::SetMaximum(const gd::String& itemName, size_t maxCount) { - if (items.find(itemName) == items.end()) { - MakeItemEntry(itemName); - } - - items[itemName].maxCount = maxCount; - items[itemName].unlimited = false; -} - -void Inventory::SetUnlimited(const gd::String& itemName, bool enable) { - if (items.find(itemName) == items.end()) { - MakeItemEntry(itemName); - } - - items[itemName].unlimited = enable; -} - -void Inventory::MakeItemEntry(const gd::String& itemName) { - Item item; - items[itemName] = item; -} - -bool Inventory::Equip(const gd::String& itemName, bool equip) { - if (items.find(itemName) == items.end()) { - return false; - } - - auto& item = items[itemName]; - if (!equip) { - item.equipped = false; - return true; - } else if (item.count > 0) { - item.equipped = true; - return true; - } - - return false; -} - -bool Inventory::IsEquipped(const gd::String& itemName) { - if (items.find(itemName) == items.end()) { - return false; - } - - return items[itemName].equipped; -} - -void Inventory::Clear() { items.clear(); } diff --git a/Extensions/Inventory/Inventory.h b/Extensions/Inventory/Inventory.h deleted file mode 100644 index 011c0d93b..000000000 --- a/Extensions/Inventory/Inventory.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include -#include "GDCore/String.h" - -class GD_EXTENSION_API Inventory { - public: - Inventory(){}; - virtual ~Inventory(){}; - - class Item { - public: - bool unlimited = true; - size_t count = 0; - size_t maxCount = 0; - bool equipped = false; - }; - - bool Has(const gd::String& itemName); - size_t Count(const gd::String& itemName); - bool Add(const gd::String& itemName); - bool SetCount(const gd::String& itemName, size_t count); - bool IsFull(const gd::String& itemName); - bool Remove(const gd::String& itemName); - void SetMaximum(const gd::String& itemName, size_t maxCount); - void SetUnlimited(const gd::String& itemName, bool enable = true); - bool Equip(const gd::String& itemName, bool equip = true); - bool IsEquipped(const gd::String& itemName); - void Clear(); - - const std::map& GetAllItems() { return items; }; - - private: - void MakeItemEntry(const gd::String& itemName); - - std::map items; -}; diff --git a/Extensions/Inventory/InventoryTools.cpp b/Extensions/Inventory/InventoryTools.cpp deleted file mode 100644 index 5efa4f11e..000000000 --- a/Extensions/Inventory/InventoryTools.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "InventoryTools.h" - -std::map> - InventoryTools::inventories; diff --git a/Extensions/Inventory/InventoryTools.h b/Extensions/Inventory/InventoryTools.h deleted file mode 100644 index fd22d204f..000000000 --- a/Extensions/Inventory/InventoryTools.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once -#include "GDCpp/Runtime/RuntimeScene.h" -#include "Inventory.h" - -class GD_EXTENSION_API InventoryTools { - public: - static bool Add(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName) { - return Get(scene, inventoryName).Add(itemName); - } - - static size_t Count(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName) { - return Get(scene, inventoryName).Count(itemName); - } - - static bool Remove(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName) { - return Get(scene, inventoryName).Remove(itemName); - } - - static bool Has(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName) { - return Get(scene, inventoryName).Has(itemName); - } - - static void SetMaximum(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName, - size_t maxCount) { - return Get(scene, inventoryName).SetMaximum(itemName, maxCount); - } - - static void SetUnlimited(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName, - bool enable) { - return Get(scene, inventoryName).SetUnlimited(itemName, enable); - } - - static bool Equip(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName, - bool equip) { - return Get(scene, inventoryName).Equip(itemName, equip); - } - - static bool IsEquipped(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::String &itemName) { - return Get(scene, inventoryName).IsEquipped(itemName); - } - - static void SerializeToVariable(RuntimeScene &scene, - const gd::String &inventoryName, - gd::Variable &variable) { - auto &allItems = Get(scene, inventoryName).GetAllItems(); - for (auto &it : allItems) { - Inventory::Item item = it.second; - gd::Variable &serializedItem = variable.GetChild(it.first); - serializedItem.GetChild("count").SetValue(item.count); - serializedItem.GetChild("maxCount").SetValue(item.maxCount); - serializedItem.GetChild("unlimited") - .SetString(item.unlimited ? "true" : "false"); - serializedItem.GetChild("equipped") - .SetString(item.equipped ? "true" : "false"); - } - } - - static void UnserializeFromVariable(RuntimeScene &scene, - const gd::String &inventoryName, - const gd::Variable &variable) { - Inventory &inventory = Get(scene, inventoryName); - inventory.Clear(); - - for (auto &child : variable.GetAllChildren()) { - const gd::String &name = child.first; - const auto &serializedItem = child.second; - inventory.SetMaximum(name, - serializedItem->GetChild("maxCount").GetValue()); - inventory.SetUnlimited( - name, serializedItem->GetChild("unlimited").GetString() == "true"); - inventory.SetCount(name, serializedItem->GetChild("count").GetValue()); - inventory.Equip( - name, serializedItem->GetChild("equipped").GetString() == "true"); - } - } - - static void ClearAll(RuntimeScene &scene) { - std::map clearedInventories; - inventories[scene.game] = clearedInventories; - } - - private: - static Inventory &Get(RuntimeScene &scene, const gd::String &name) { - return inventories[scene.game][name]; - } - - static std::map> inventories; - - InventoryTools(){}; -}; diff --git a/Extensions/Inventory/JsExtension.cpp b/Extensions/Inventory/JsExtension.cpp index bbbdc8522..9fa19fb54 100644 --- a/Extensions/Inventory/JsExtension.cpp +++ b/Extensions/Inventory/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include #include "GDCore/Tools/Localization.h" diff --git a/Extensions/Inventory/tests/Inventory.cpp b/Extensions/Inventory/tests/Inventory.cpp deleted file mode 100644 index a0562f011..000000000 --- a/Extensions/Inventory/tests/Inventory.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - -GDevelop - Inventory Extension -Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -/** - * @file Tests for the Inventory extension. - */ -#define CATCH_CONFIG_MAIN -#include "catch.hpp" -#include "../Inventory.h" - -TEST_CASE( "Inventory", "[game-engine][inventory]" ) { - SECTION("Inventory") { - Inventory inventory; - - // Is empty when constructed") { - REQUIRE(inventory.Has("sword") == false); - REQUIRE(inventory.Has("soul reaver") == false); - - // Can receive one or more items") { - REQUIRE(inventory.Add("sword") == true); - REQUIRE(inventory.Has("sword") == true); - REQUIRE(inventory.Has("soul reaver") == false); - - REQUIRE(inventory.Add("soul reaver") == true); - REQUIRE(inventory.Add("sword") == true); - REQUIRE(inventory.Has("sword") == true); - REQUIRE(inventory.Has("soul reaver") == true); - - // Can return the number of items") { - REQUIRE(inventory.Count("sword") == 2); - REQUIRE(inventory.Count("soul reaver") == 1); - - // Can equip items") { - REQUIRE(inventory.Equip("soul reaver", true) == true); - REQUIRE(inventory.IsEquipped("soul reaver") == true); - - REQUIRE(inventory.Equip("sword", true) == true); - REQUIRE(inventory.IsEquipped("sword") == true); - REQUIRE(inventory.Equip("sword", false) == true); - REQUIRE(inventory.IsEquipped("sword") == false); - REQUIRE(inventory.Equip("sword", true) == true); - - REQUIRE(inventory.Equip("nothing", true) == false); - REQUIRE(inventory.IsEquipped("nothing") == false); - - // Support removing an item") { - REQUIRE(inventory.Remove("sword") == true); - REQUIRE(inventory.Count("sword") == 1); - REQUIRE(inventory.IsEquipped("sword") == true); - - REQUIRE(inventory.Remove("sword") == true); - REQUIRE(inventory.Count("sword") == 0); - REQUIRE(inventory.IsEquipped("sword") == false); - - REQUIRE(inventory.Remove("sword") == false); - REQUIRE(inventory.Count("sword") == 0); - - REQUIRE(inventory.Count("soul reaver") == 1); - REQUIRE(inventory.IsEquipped("soul reaver") == true); - - // Can support having a limited number of objects") { - REQUIRE(inventory.Count("heavy sword") == 0); - inventory.SetMaximum("heavy sword", 2); - REQUIRE(inventory.Add("heavy sword") == true); - REQUIRE(inventory.Count("heavy sword") == 1); - REQUIRE(inventory.Has("heavy sword") == true); - - REQUIRE(inventory.Add("heavy sword") == true); - REQUIRE(inventory.Count("heavy sword") == 2); - REQUIRE(inventory.Add("heavy sword") == false); - REQUIRE(inventory.Count("heavy sword") == 2); - inventory.SetUnlimited("heavy sword", true); - REQUIRE(inventory.Count("heavy sword") == 2); - REQUIRE(inventory.Add("heavy sword") == true); - REQUIRE(inventory.Add("heavy sword") == true); - REQUIRE(inventory.Count("heavy sword") == 4); - - inventory.SetMaximum("never sword", 0); - REQUIRE(inventory.Add("never sword") == false); - REQUIRE(inventory.Has("never sword") == false); - REQUIRE(inventory.Count("never sword") == 0); - } -} diff --git a/Extensions/Inventory/tests/InventoryTools.cpp b/Extensions/Inventory/tests/InventoryTools.cpp deleted file mode 100644 index d506ee41d..000000000 --- a/Extensions/Inventory/tests/InventoryTools.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/** - -GDevelop - Inventory Extension -Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "catch.hpp" -#include "../InventoryTools.h" -#include "GDCpp/Runtime/Project/Variable.h" -#include "GDCpp/Runtime/Serialization/Serializer.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/RuntimeGame.h" - -TEST_CASE( "InventoryTools", "[game-engine][inventory-tools]" ) { - SECTION("InventoryTools") { - RuntimeGame game; - RuntimeScene scene(NULL, &game); - - InventoryTools::Add(scene, "MyInventory", "sword"); - InventoryTools::Add(scene, "MyInventory", "sword"); - InventoryTools::Equip(scene, "MyInventory", "sword", true); - InventoryTools::Add(scene, "MyInventory", "armor"); - InventoryTools::SetMaximum(scene, "MyInventory", "armor", 1); - - gd::Variable variable; - InventoryTools::SerializeToVariable(scene, "MyInventory", variable); - InventoryTools::UnserializeFromVariable(scene, "MyInventory2", variable); - - REQUIRE(InventoryTools::Count(scene, "MyInventory2", "sword") == 2); - REQUIRE(InventoryTools::IsEquipped(scene, "MyInventory2", "sword") == true); - REQUIRE(InventoryTools::Count(scene, "MyInventory2", "armor") == 1); - REQUIRE(InventoryTools::Add(scene, "MyInventory2", "armor") == false); - } -} diff --git a/Extensions/Inventory/tests/catch.hpp b/Extensions/Inventory/tests/catch.hpp deleted file mode 100644 index 1fba6a34e..000000000 --- a/Extensions/Inventory/tests/catch.hpp +++ /dev/null @@ -1,8974 +0,0 @@ -/* - * CATCH v1.0 build 52 (master branch) - * Generated: 2014-07-10 09:17:43.994453 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -// #included from: internal/catch_suppress_warnings.h - -#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wvariadic-macros" -#pragma clang diagnostic ignored "-Wc99-extensions" -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#pragma clang diagnostic ignored "-Wc++98-compat" -#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif - -#ifdef CATCH_CONFIG_MAIN -# define CATCH_CONFIG_RUNNER -#endif - -#ifdef CATCH_CONFIG_RUNNER -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include -#include - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Much of the following code is based on Boost (1.53) - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_CONFIG_CPP11_NOEXCEPT -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#if (__BORLANDC__ > 0x582 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#if (__EDG_VERSION__ > 238 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#if (__DMC__ > 0x840 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ < 3 - -#if (__GNUC_MINOR__ >= 96 ) -//#define CATCH_CONFIG_SFINAE -#endif - -#elif __GNUC__ >= 3 - -// #define CATCH_CONFIG_SFINAE // Taking this out completely for now - -#endif // __GNUC__ < 3 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) ) - -#define CATCH_CONFIG_CPP11_NULLPTR -#endif - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1310 ) // (VC++ 7.0+) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // _MSC_VER - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS -#define CATCH_CONFIG_VARIADIC_MACROS -#endif - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// detect language version: -#if (__cplusplus == 201103L) -# define CATCH_CPP11 -# define CATCH_CPP11_OR_GREATER -#elif (__cplusplus >= 201103L) -# define CATCH_CPP11_OR_GREATER -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -namespace Catch { - - class NonCopyable { - NonCopyable( NonCopyable const& ); - void operator = ( NonCopyable const& ); - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CPP11_OR_GREATER - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - - std::string file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -#include - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() { return m_p; } - const T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const = 0; - - }; -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -struct AutoReg { - - AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - registerTestCase( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - void registerTestCase( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2 - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x00, - - ContinueOnFailure = 0x01, // Failures fail test, but execution continues - FalseTest = 0x02, // Prefix expression with ! - SuppressFail = 0x04 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); - - std::string macroName; - SourceLineInfo lineInfo; - std::string capturedExpression; - ResultDisposition::Flags resultDisposition; - }; - - struct AssertionResultData - { - AssertionResultData() : resultType( ResultWas::Unknown ) {} - - std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CPP11_OR_GREATER - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ); - - template - ExpressionLhs operator->* ( T const& operand ); - ExpressionLhs operator->* ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; - return *this; - } - - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - - void endExpression(); - - std::string reconstructExpression() const; - AssertionResult build() const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; - - bool m_shouldDebugBreak; - bool m_shouldThrow; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( NULL, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, NULL ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -// #included from: catch_sfinae.hpp -#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED - -// Try to detect if the current compiler supports SFINAE - -namespace Catch { - - struct TrueType { - static const bool value = true; - typedef void Enable; - char sizer[1]; - }; - struct FalseType { - static const bool value = false; - typedef void Disable; - char sizer[2]; - }; - -#ifdef CATCH_CONFIG_SFINAE - - template struct NotABooleanExpression; - - template struct If : NotABooleanExpression {}; - template<> struct If : TrueType {}; - template<> struct If : FalseType {}; - - template struct SizedIf; - template<> struct SizedIf : TrueType {}; - template<> struct SizedIf : FalseType {}; - -#endif // CATCH_CONFIG_SFINAE - -} // end namespace Catch - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -namespace Catch { -namespace Detail { - -// SFINAE is currently disabled by default for all compilers. -// If the non SFINAE version of IsStreamInsertable is ambiguous for you -// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE -#ifdef CATCH_CONFIG_SFINAE - - template - class IsStreamInsertableHelper { - template struct TrueIfSizeable : TrueType {}; - - template - static TrueIfSizeable dummy(T2*); - static FalseType dummy(...); - - public: - typedef SizedIf type; - }; - - template - struct IsStreamInsertable : IsStreamInsertableHelper::type {}; - -#else - - struct BorgType { - template BorgType( T const& ); - }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; - -#endif - - template - struct StringMakerBase { - template - static std::string convert( T const& ) { return "{?}"; } - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -std::string toString( T const& value ); - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -template -struct StringMaker > { - static std::string convert( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); - } -}; - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << toString( *first ); - for( ++first ; first != last ; ++first ) { - oss << ", " << toString( *first ); - } - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif - -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif - - template - ResultBuilder& operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - bool value = m_lhs ? true : false; - m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); - } - - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - -private: - template - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits::getName() ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator->* ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator->* ( bool value ) { - return ExpressionLhs( *this, value ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif - #endif - -#elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } -#endif - -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - ( __catchResult->*expr ).endExpression(); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \ - try { \ - std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == "{?}" ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \ - __catchResult.captureExpression(); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - -} // end namespace Catch - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include -#endif - -namespace Catch { - - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedNanoseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - uint64_t m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: -#ifdef CATCH_CPP11_OR_GREATER - Section( Section const& ) = delete; - Section( Section && ) = delete; - Section& operator = ( Section const& ) = delete; - Section& operator = ( Section && ) = delete; -#else - Section( Section const& info ); - Section& operator = ( Section const& ); -#endif - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate() const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate() const { - try { - throw; - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - template - struct Matcher : SharedImpl - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - }; - - template - struct MatcherImpl : Matcher { - - virtual Ptr > clone() const { - return Ptr >( new DerivedT( static_cast( *this ) ) ); - } - }; - - namespace Generic { - - template - class AllOf : public MatcherImpl, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - template - class AnyOf : public MatcherImpl, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - } - - namespace StdString { - - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct Equals : MatcherImpl { - Equals( std::string const& str ) : m_str( str ){} - Equals( Equals const& other ) : m_str( other.m_str ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_str == expr; - } - virtual std::string toString() const { - return "equals: \"" + m_str + "\""; - } - - std::string m_str; - }; - - struct Contains : MatcherImpl { - Contains( std::string const& substr ) : m_substr( substr ){} - Contains( Contains const& other ) : m_substr( other.m_substr ){} - - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct StartsWith : MatcherImpl { - StartsWith( std::string const& substr ) : m_substr( substr ){} - StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == 0; - } - virtual std::string toString() const { - return "starts with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct EndsWith : MatcherImpl { - EndsWith( std::string const& substr ) : m_substr( substr ){} - EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == expr.size() - m_substr.size(); - } - virtual std::string toString() const { - return "ends with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - } // namespace StdString - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); - } - - inline Impl::StdString::Equals Equals( std::string const& str ) { - return Impl::StdString::Equals( str ); - } - inline Impl::StdString::Equals Equals( const char* str ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); - } - inline Impl::StdString::Contains Contains( std::string const& substr ) { - return Impl::StdString::Contains( substr ); - } - inline Impl::StdString::Contains Contains( const char* substr ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); - } - -} // namespace Matchers - -using namespace Matchers; - -} // namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != NULL; } - bool none() const { return nullableValue == NULL; } - - bool operator !() const { return nullableValue == NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T* nullableValue; - char storage[sizeof(T)]; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - template - struct StringHolder : MatcherImpl{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string toString() const { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string toString() const { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string toString() const { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string toString() const { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_CONFIG_RUNNER -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: catch_runner.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) { - if( startsWith( m_name, "*" ) ) { - m_name = m_name.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_name, "*" ) ) { - m_name = m_name.substr( 0, m_name.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_name == toLower( testCase.name ); - case WildcardAtStart: - return endsWith( toLower( testCase.name ), m_name ); - case WildcardAtEnd: - return startsWith( toLower( testCase.name ), m_name ); - case WildcardAtBothEnds: - return contains( toLower( testCase.name ), m_name ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string m_name; - WildcardPosition m_wildcard; - }; - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) - if( !(*it)->matches( testCase ) ) - return false; - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - } - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -#include - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - class Stream { - public: - Stream(); - Stream( std::streambuf* _streamBuf, bool _isOwned ); - void release(); - - std::streambuf* streamBuf; - - private: - bool isOwned; - }; -} - -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - abortAfter( -1 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - - int abortAfter; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - - std::string reporterName; - std::string outputFilename; - std::string name; - std::string processName; - - std::vector testsOrTags; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - : m_os( std::cout.rdbuf() ) - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_os( std::cout.rdbuf() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() { - m_os.rdbuf( std::cout.rdbuf() ); - m_stream.release(); - } - - void setFilename( std::string const& filename ) { - m_data.outputFilename = filename; - } - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - - std::string getProcessName() const { return m_data.processName; } - - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } - - void setStreamBuf( std::streambuf* buf ) { - m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); - } - - void useStream( std::string const& streamName ) { - Stream stream = createStream( streamName ); - setStreamBuf( stream.streamBuf ); - m_stream.release(); - m_stream = stream; - } - - std::string getReporterName() const { return m_data.reporterName; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } - - // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_os; } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } - - private: - ConfigData m_data; - - Stream m_stream; - mutable std::ostream m_os; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - throw std::runtime_error( "Invalid conversion" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -# ifdef CATCH_CPP11_OR_GREATER - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -# endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual void setFlag( C& p ) const { - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual void setFlag( C& p ) const { - function( p ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - struct Parser { - Parser() : separators( " \t=:" ) {} - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - void parseIntoTokens( int argc, char const * const * argv, std::vector& tokens ) const { - const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); - } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); - } - } - std::string separators; - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - // NOTE: std::auto_ptr is deprecated in c++11/c++0x -#if defined(__cplusplus) && __cplusplus > 199711L - typedef std::unique_ptr ArgAutoPtr; -#else - typedef std::auto_ptr ArgAutoPtr; -#endif - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg = ArgAutoPtr( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( int argc, char const * const * argv ) const { - ConfigT config; - parseInto( argc, argv, config ); - return config; - } - - std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { - std::string processName = argv[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.setFlag( config ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) - addTestOrTags( config, "\"" + line + "\"," ); - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &ConfigData::reporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - namespace Detail { - struct IColourImpl; - } - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - static Detail::IColourImpl* impl(); - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CPP11_OR_GREATER - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CPP11_OR_GREATER - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CPP11_OR_GREATER - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - }; - - struct IReporterFactory { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map FactoryMap; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - }; - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Matching test cases:\n"; - else { - std::cout << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( !testCaseInfo.tags.empty() ) - std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; - else - std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - std::cout << testCaseInfo.name << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Tags for matching test cases:\n"; - else { - std::cout << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - std::cout << oss.str() << wrapper << "\n"; - } - std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - std::cout << "Available reports:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - std::cout << " " - << it->first - << ":" - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; - } - std::cout << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_runner_impl.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { -namespace SectionTracking { - - class TrackedSection { - - typedef std::map TrackedSections; - - public: - enum RunState { - NotStarted, - Executing, - ExecutingChildren, - Completed - }; - - TrackedSection( std::string const& name, TrackedSection* parent ) - : m_name( name ), m_runState( NotStarted ), m_parent( parent ) - {} - - RunState runState() const { return m_runState; } - - TrackedSection* findChild( std::string const& childName ) { - TrackedSections::iterator it = m_children.find( childName ); - return it != m_children.end() - ? &it->second - : NULL; - } - TrackedSection* acquireChild( std::string const& childName ) { - if( TrackedSection* child = findChild( childName ) ) - return child; - m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); - return findChild( childName ); - } - void enter() { - if( m_runState == NotStarted ) - m_runState = Executing; - } - void leave() { - for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); - it != itEnd; - ++it ) - if( it->second.runState() != Completed ) { - m_runState = ExecutingChildren; - return; - } - m_runState = Completed; - } - TrackedSection* getParent() { - return m_parent; - } - bool hasChildren() const { - return !m_children.empty(); - } - - private: - std::string m_name; - RunState m_runState; - TrackedSections m_children; - TrackedSection* m_parent; - - }; - - class TestCaseTracker { - public: - TestCaseTracker( std::string const& testCaseName ) - : m_testCase( testCaseName, NULL ), - m_currentSection( &m_testCase ), - m_completedASectionThisRun( false ) - {} - - bool enterSection( std::string const& name ) { - TrackedSection* child = m_currentSection->acquireChild( name ); - if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed ) - return false; - - m_currentSection = child; - m_currentSection->enter(); - return true; - } - void leaveSection() { - m_currentSection->leave(); - m_currentSection = m_currentSection->getParent(); - assert( m_currentSection != NULL ); - m_completedASectionThisRun = true; - } - - bool currentSectionHasChildren() const { - return m_currentSection->hasChildren(); - } - bool isCompleted() const { - return m_testCase.runState() == TrackedSection::Completed; - } - - class Guard { - public: - Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { - m_tracker.enterTestCase(); - } - ~Guard() { - m_tracker.leaveTestCase(); - } - private: - Guard( Guard const& ); - void operator = ( Guard const& ); - TestCaseTracker& m_tracker; - }; - - private: - void enterTestCase() { - m_currentSection = &m_testCase; - m_completedASectionThisRun = false; - m_testCase.enter(); - } - void leaveTestCase() { - m_testCase.leave(); - } - - TrackedSection m_testCase; - TrackedSection* m_currentSection; - bool m_completedASectionThisRun; - }; - -} // namespace SectionTracking - -using SectionTracking::TestCaseTracker; - -} // namespace Catch - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& config, Ptr const& reporter ) - : m_runInfo( config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( NULL ), - m_config( config ), - m_reporter( reporter ), - m_prevRunner( m_context.getRunner() ), - m_prevResultCapture( m_context.getResultCapture() ), - m_prevConfig( m_context.getConfig() ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - m_context.setRunner( m_prevRunner ); - m_context.setConfig( NULL ); - m_context.setResultCapture( m_prevResultCapture ); - m_context.setConfig( m_prevConfig ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - m_testCaseTracker = TestCaseTracker( testInfo.name ); - - do { - do { - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isCompleted() && !aborting() ); - } - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = NULL; - m_testCaseTracker.reset(); - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - if( !m_testCaseTracker->enterSection( oss.str() ) ) - return false; - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 || - !m_config->warnAboutMissingAssertions() || - m_testCaseTracker->currentSectionHasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { - if( std::uncaught_exception() ) { - m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); - return; - } - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - m_testCaseTracker->leaveSection(); - - m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : ""; - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - TestCaseTracker::Guard guard( *m_testCaseTracker ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( std::cout, redirectedCout ); - StreamRedirect cerrRedir( std::cerr, redirectedCerr ); - m_activeTestCase->invoke(); - } - else { - m_activeTestCase->invoke(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - exResult.useActiveException(); - } - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); - m_unfinishedSections.clear(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - private: - struct UnfinishedSections { - UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) - : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo info; - Counts prevAssertions; - double durationInSeconds; - }; - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - Option m_testCaseTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - IRunner* m_prevRunner; - IResultCapture* m_prevResultCapture; - Ptr m_prevConfig; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _buildNumber, - char const* const _branchName ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - buildNumber( _buildNumber ), - branchName( _branchName ) - {} - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const buildNumber; - char const* const branchName; - - private: - void operator=( Version const& ); - }; - - extern Version libraryVersion; -} - -#include -#include -#include - -namespace Catch { - - class Runner { - - public: - Runner( Ptr const& config ) - : m_config( config ) - { - openStream(); - makeReporter(); - } - - Totals runTests() { - - RunContext context( m_config.get(), m_reporter ); - - Totals totals; - - context.testGroupStarting( "", 1, 1 ); // deprecated? - - TestSpec testSpec = m_config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector testCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); - - int testsRunForGroup = 0; - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) { - testsRunForGroup++; - if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { - - if( context.aborting() ) - break; - - totals += context.runTest( *it ); - m_testsAlreadyRun.insert( *it ); - } - } - context.testGroupEnded( "", totals, 1, 1 ); - return totals; - } - - private: - void openStream() { - // Open output file, if specified - if( !m_config->getFilename().empty() ) { - m_ofs.open( m_config->getFilename().c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << m_config->getFilename() << "'"; - throw std::domain_error( oss.str() ); - } - m_config->setStreamBuf( m_ofs.rdbuf() ); - } - } - void makeReporter() { - std::string reporterName = m_config->getReporterName().empty() - ? "console" - : m_config->getReporterName(); - - m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); - if( !m_reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - } - - private: - Ptr m_config; - std::ofstream m_ofs; - Ptr m_reporter; - std::set m_testsAlreadyRun; - }; - - class Session { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - std::cerr << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - std::cout << "\nCatch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " build " - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - std::cout << " (" << libraryVersion.branchName << " branch)"; - std::cout << "\n"; - - m_cli.usage( std::cout, processName ); - std::cout << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - std::cerr << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( std::cout, m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char* const argv[] ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - Runner runner( m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runner.runTests().assertions.failed ); - } - catch( std::exception& ex ) { - std::cerr << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() : m_unnamedCount( 0 ) {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - - if( m_functions.find( testCase ) == m_functions.end() ) { - m_functions.insert( testCase ); - m_functionsInOrder.push_back( testCase ); - if( !testCase.isHidden() ) - m_nonHiddenFunctions.push_back( testCase ); - } - else { - TestCase const& prev = *m_functions.find( testCase ); - { - Colour colourGuard( Colour::Red ); - std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl; - } - exit(1); - } - } - - virtual std::vector const& getAllTests() const { - return m_functionsInOrder; - } - - virtual std::vector const& getAllNonHiddenTests() const { - return m_nonHiddenFunctions; - } - - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const { - for( std::vector::const_iterator it = m_functionsInOrder.begin(), - itEnd = m_functionsInOrder.end(); - it != itEnd; - ++it ) { - if( testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() ) ) - matchingTestCases.push_back( *it ); - } - } - - private: - - std::set m_functions; - std::vector m_functionsInOrder; - std::vector m_nonHiddenFunctions; - size_t m_unnamedCount; - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - AutoReg::~AutoReg() {} - - void AutoReg::registerTestCase( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() { - deleteAllValues( m_factories ); - } - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - - FactoryMap const& getFactories() const { - return m_factories; - } - - private: - FactoryMap m_factories; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - throw; - } - @catch (NSException *exception) { - return toString( [exception description] ); - } -#else - throw; -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return tryTranslators( m_translators.begin() ); - } - } - - std::string tryTranslators( std::vector::const_iterator it ) const { - if( it == m_translators.end() ) - return "Unknown exception"; - - try { - return (*it)->translate(); - } - catch(...) { - return tryTranslators( it+1 ); - } - } - - private: - std::vector m_translators; - }; -} - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { - return m_exceptionTranslatorRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerTest( TestCase const& testInfo ) { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - Stream::Stream() - : streamBuf( NULL ), isOwned( false ) - {} - - Stream::Stream( std::streambuf* _streamBuf, bool _isOwned ) - : streamBuf( _streamBuf ), isOwned( _isOwned ) - {} - - void Stream::release() { - if( isOwned ) { - delete streamBuf; - streamBuf = NULL; - isOwned = false; - } - } -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - Stream createStream( std::string const& streamName ) { - if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); - if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); - if( streamName == "debug" ) return Stream( new StreamBufImpl, true ); - - throw std::domain_error( "Unknown stream: " + streamName ); - } - - void cleanUpContext() { - delete currentContext; - currentContext = NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -namespace Catch { namespace Detail { - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; -}} - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -namespace Catch { -namespace { - - class Win32ColourImpl : public Detail::IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalAttributes = csbiInfo.wAttributes; - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute ); - } - HANDLE stdoutHandle; - WORD originalAttributes; - }; - - inline bool shouldUseColourForPlatform() { - return true; - } - - static Detail::IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public Detail::IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - private: - void setColour( const char* _escapeCode ) { - std::cout << '\033' << _escapeCode; - } - }; - - inline bool shouldUseColourForPlatform() { - return isatty(STDOUT_FILENO); - } - - static Detail::IColourImpl* platformColourInstance() { - static PosixColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#endif // not Windows - -namespace Catch { - - namespace { - struct NoColourImpl : Detail::IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - static bool shouldUseColour() { - return shouldUseColourForPlatform() && !isDebuggerActive(); - } - } - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - void Colour::use( Code _colourCode ) { - impl()->use( _colourCode ); - } - - Detail::IColourImpl* Colour::impl() { - return shouldUseColour() - ? platformColourInstance() - : NoColourImpl::instance(); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; - else - return m_info.capturedExpression; - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; - else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( tag == "." || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - std::cerr - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - std::cerr << _lineInfo << std::endl; - } - exit(1); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - enforceNotReservedTag( tag, _lineInfo ); - - inTag = false; - if( tag == "hide" || tag == "." ) - isHidden = true; - else - tags.insert( tag ); - tag.clear(); - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - tags( _tags ), - lineInfo( _lineInfo ), - properties( None ) - { - std::ostringstream oss; - for( std::set::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - properties = static_cast( properties | parseSpecialTag( lcaseTag ) ); - lcaseTags.insert( lcaseTag ); - } - tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - // These numbers are maintained by a script - Version libraryVersion( 1, 0, 52, "master" ); -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS -#include -#else -#include -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency((LARGE_INTEGER*)&hz); - QueryPerformanceCounter((LARGE_INTEGER*)&hzo); - } - uint64_t t; - QueryPerformanceCounter((LARGE_INTEGER*)&t); - return ((t-hzo)*1000000)/hz; - } -#else - uint64_t getCurrentTicks() { - timeval t; - gettimeofday(&t,NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedNanoseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast((getCurrentTicks() - m_ticks)/1000); - } - double Timer::getElapsedSeconds() const { - return (getCurrentTicks() - m_ticks)/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << "s"; - return os; - } - - SourceLineInfo::SourceLineInfo() : line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} - bool SourceLineInfo::empty() const { - return file.empty(); - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; -#else - os << info.file << ":" << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - - Section::~Section() { - if( m_sectionIncluded ) - getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); - } - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#include - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { - std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - std::cout << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - namespace { - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return "\"" + s + "\""; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - if( value > 8192 ) - oss << "0x" << std::hex << value; - else - oss << value; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - return value < ' ' - ? toString( static_cast( value ) ) - : Detail::makeString( value ); -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ) - {} - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal ) - m_shouldThrow = true; - } - } - void ResultBuilder::react() { - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - assert( m_data.resultType != ResultWas::Unknown ); - - AssertionResultData data = m_data; - - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } - return AssertionResult( m_assertionInfo, data ); - } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -#include -#include - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - } - - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - std::cerr << ex.what() << std::endl; - exit(1); - } - } - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -namespace Catch { - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - - virtual ~StreamingReporterBase(); - - virtual void noMatchingTestCases( std::string const& ) {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { - currentTestCaseInfo.reset(); - assert( m_sectionStack.empty() ); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - ~CumulativeReporterBase(); - - virtual void testRunStarting( TestRunInfo const& ) {} - virtual void testGroupStarting( GroupInfo const& ) {} - - virtual void testCaseStarting( TestCaseInfo const& ) {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &std::cout ) - {} - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &os ) - {} - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - -//# ifndef CATCH_CPP11_OR_GREATER -// XmlWriter& operator = ( XmlWriter const& other ) { -// XmlWriter temp( other ); -// swap( temp ); -// return *this; -// } -//# else -// XmlWriter( XmlWriter const& ) = default; -// XmlWriter( XmlWriter && ) = default; -// XmlWriter& operator = ( XmlWriter const& ) = default; -// XmlWriter& operator = ( XmlWriter && ) = default; -//# endif -// -// void swap( XmlWriter& other ) { -// std::swap( m_tagIsOpen, other.m_tagIsOpen ); -// std::swap( m_needsNewline, other.m_needsNewline ); -// std::swap( m_tags, other.m_tags ); -// std::swap( m_indent, other.m_indent ); -// std::swap( m_os, other.m_os ); -// } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - stream() << m_indent << "<" << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - stream() << "/>\n"; - m_tagIsOpen = false; - } - else { - stream() << m_indent << "\n"; - } - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) { - stream() << " " << name << "=\""; - writeEncodedText( attribute ); - stream() << "\""; - } - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - if( !name.empty() ) - stream() << " " << name << "=\"" << attribute << "\""; - return *this; - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - stream() << m_indent; - writeEncodedText( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - stream() << m_indent << ""; - m_needsNewline = true; - return *this; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - stream() << "\n"; - return *this; - } - - void setStream( std::ostream& os ) { - m_os = &os; - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - stream() << "\n"; - m_needsNewline = false; - } - } - - void writeEncodedText( std::string const& text ) { - static const char* charsToEncode = "<&\""; - std::string mtext = text; - std::string::size_type pos = mtext.find_first_of( charsToEncode ); - while( pos != std::string::npos ) { - stream() << mtext.substr( 0, pos ); - - switch( mtext[pos] ) { - case '<': - stream() << "<"; - break; - case '&': - stream() << "&"; - break; - case '\"': - stream() << """; - break; - } - mtext = mtext.substr( pos+1 ); - pos = mtext.find_first_of( charsToEncode ); - } - stream() << mtext; - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream* m_os; - }; - -} -namespace Catch { - class XmlReporter : public SharedImpl { - public: - XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - virtual ~XmlReporter(); - - private: // IReporter - - virtual bool shouldRedirectStdout() const { - return true; - } - - virtual void StartTesting() { - m_xml.setStream( m_config.stream() ); - m_xml.startElement( "Catch" ); - if( !m_config.fullConfig()->name().empty() ) - m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); - } - - virtual void EndTesting( const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartGroup( const std::string& groupName ) { - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupName ); - } - - virtual void EndGroup( const std::string&, const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartSection( const std::string& sectionName, const std::string& description ) { - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionName ) ) - .writeAttribute( "description", description ); - } - } - virtual void NoAssertionsInSection( const std::string& ) {} - virtual void NoAssertionsInTestCase( const std::string& ) {} - - virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { - if( --m_sectionDepth > 0 ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", assertions.passed ) - .writeAttribute( "failures", assertions.failed ) - .writeAttribute( "expectedFailures", assertions.failedButOk ); - m_xml.endElement(); - } - } - - virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { - m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); - m_currentTestSuccess = true; - } - - virtual void Result( const Catch::AssertionResult& assertionResult ) { - if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) - return; - - if( assertionResult.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); - - m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - m_currentTestSuccess &= assertionResult.succeeded(); - } - - switch( assertionResult.getResultType() ) { - case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Warning: - m_xml.scopedElement( "Warning" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Unknown: - case ResultWas::Ok: - case ResultWas::FailureBit: - case ResultWas::ExpressionFailed: - case ResultWas::Exception: - case ResultWas::DidntThrowException: - break; - } - if( assertionResult.hasExpression() ) - m_xml.endElement(); - } - - virtual void Aborted() { - // !TBD - } - - virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { - m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); - m_xml.endElement(); - } - - private: - ReporterConfig m_config; - bool m_currentTestSuccess; - XmlWriter m_xml; - int m_sectionDepth; - }; - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - {} - - ~JunitReporter(); - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = true; - return prefs; - } - - virtual void testRunStarting( TestRunInfo const& runInfo ) { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + "/" + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << "\n"; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -#include - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter(); - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; - } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << "\n"; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << "\n"; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << "\n"; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " b" - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - stream << " (" << libraryVersion.branchName << ")"; - stream << " host application.\n" - << "Run with -? for options\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; - } - stream << getLineOfChars<'.'>() << "\n" << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = " " + *it; - while( it->size() > row.size() ) - row = " " + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << " " << it->label; - } - } - stream << "\n"; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << "\n"; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - template - static char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; - } - - void printResultType( Colour::Code colour, std::string passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << " " << passOrFail; - } - stream << ":"; - } - } - - void printIssue( std::string issue ) const { - stream << " " << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ";"; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << " " << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} - - void Config::dummy() {} - - INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -// Standard C/C++ main entry point -int main (int argc, char * const argv[]) { - return Catch::Session().run( argc, argv ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return result; -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) - -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) -#else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( " Given: " desc, "" ) -#define WHEN( desc ) SECTION( " When: " desc, "" ) -#define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) -#define THEN( desc ) SECTION( " Then: " desc, "" ) -#define AND_THEN( desc ) SECTION( " And: " desc, "" ) - -using Catch::Detail::Approx; - -// #included from: internal/catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/Extensions/LinkedObjects/CMakeLists.txt b/Extensions/LinkedObjects/CMakeLists.txt index 77e9f1652..26ce5c6f6 100644 --- a/Extensions/LinkedObjects/CMakeLists.txt +++ b/Extensions/LinkedObjects/CMakeLists.txt @@ -13,20 +13,8 @@ gd_add_extension_definitions(LinkedObjects) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(LinkedObjects "${source_files}") - gd_add_extension_target(LinkedObjects "${source_files}") -gdcpp_add_runtime_extension_target(LinkedObjects_Runtime "${source_files}") #Linker files for the IDE extension ### -gd_extension_link_libraries(LinkedObjects) - - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(LinkedObjects_Runtime) - -#Tests for the GD C++ Runtime extension -### -file(GLOB_RECURSE test_source_files tests/*) -gdcpp_add_tests_extension_target(LinkedObjects_Runtime_tests "${test_source_files}") +gd_extension_link_libraries(LinkedObjects) \ No newline at end of file diff --git a/Extensions/LinkedObjects/Extension.cpp b/Extensions/LinkedObjects/Extension.cpp index 9f1cdff7d..d7370fcbd 100644 --- a/Extensions/LinkedObjects/Extension.cpp +++ b/Extensions/LinkedObjects/Extension.cpp @@ -7,8 +7,8 @@ This project is released under the MIT License. #include -#include "GDCpp/Extensions/ExtensionBase.h" -#include "ObjectsLinksManager.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) { extension @@ -112,60 +112,3 @@ void DeclareLinkedObjectsExtension(gd::PlatformExtension& extension) { #endif } - -/** - * \brief This class declares information about the extension. - */ -class LinkedObjectsCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - LinkedObjectsCppExtension() { - DeclareLinkedObjectsExtension(*this); - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; - - /** - * The extension must be aware of objects deletion - */ - virtual bool ToBeNotifiedOnObjectDeletion() { return true; } - - /** - * Be sure to remove all links when an object is deleted - */ - virtual void ObjectDeletedFromScene(RuntimeScene& scene, - RuntimeObject* object) { - GDpriv::LinkedObjects::ObjectsLinksManager::managers[&scene] - .RemoveAllLinksOf(object); - } - - /** - * Initialize manager of linked objects of scene - */ - virtual void SceneLoaded(RuntimeScene& scene) { - GDpriv::LinkedObjects::ObjectsLinksManager::managers[&scene].ClearAll(); - } - - /** - * Destroy manager of linked objects of scene - */ - virtual void SceneUnloaded(RuntimeScene& scene) { - GDpriv::LinkedObjects::ObjectsLinksManager::managers.erase(&scene); - } -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppLinkedObjectsExtension() { - return new LinkedObjectsCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new LinkedObjectsCppExtension; -} -#endif diff --git a/Extensions/LinkedObjects/JsExtension.cpp b/Extensions/LinkedObjects/JsExtension.cpp index 8255f3b68..757398fb3 100644 --- a/Extensions/LinkedObjects/JsExtension.cpp +++ b/Extensions/LinkedObjects/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include #include "GDCore/Tools/Localization.h" diff --git a/Extensions/LinkedObjects/LinkedObjectsTools.cpp b/Extensions/LinkedObjects/LinkedObjectsTools.cpp deleted file mode 100644 index 95323f50f..000000000 --- a/Extensions/LinkedObjects/LinkedObjectsTools.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - -GDevelop - LinkedObjects Extension -Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "LinkedObjectsTools.h" -#include -#include - -#include -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeObjectsListsTools.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "ObjectsLinksManager.h" - -using namespace std; - -namespace GDpriv { -namespace LinkedObjects { - -std::map ObjectsLinksManager::managers; - -bool GD_EXTENSION_API PickObjectsLinkedTo( - RuntimeScene& scene, - std::map*> pickedObjectsLists, - RuntimeObject* object) { - if (!object) return false; - - std::vector linkedObjects = - ObjectsLinksManager::managers[&scene].GetObjectsLinkedWith(object); - return PickObjectsIf( - pickedObjectsLists, false, [&linkedObjects](RuntimeObject* obj) { - return std::find(linkedObjects.begin(), linkedObjects.end(), obj) != - linkedObjects.end(); - }); -} - -void GD_EXTENSION_API LinkObjects(RuntimeScene& scene, - RuntimeObject* a, - RuntimeObject* b) { - if (!a || !b) return; - ObjectsLinksManager::managers[&scene].LinkObjects(a, b); -} - -void GD_EXTENSION_API RemoveLinkBetween(RuntimeScene& scene, - RuntimeObject* a, - RuntimeObject* b) { - if (!a || !b) return; - ObjectsLinksManager::managers[&scene].RemoveLinkBetween(a, b); -} - -void GD_EXTENSION_API RemoveAllLinksOf(RuntimeScene& scene, - RuntimeObject* object) { - if (!object) return; - ObjectsLinksManager::managers[&scene].RemoveAllLinksOf(object); -} - -} // namespace LinkedObjects -} // namespace GDpriv diff --git a/Extensions/LinkedObjects/LinkedObjectsTools.h b/Extensions/LinkedObjects/LinkedObjectsTools.h deleted file mode 100644 index f3434889c..000000000 --- a/Extensions/LinkedObjects/LinkedObjectsTools.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - -GDevelop - LinkedObjects Extension -Copyright (c) 2011-2013 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef LINKEDOBJECTSTOOLS_H_INCLUDED -#define LINKEDOBJECTSTOOLS_H_INCLUDED -#include -#include -#include -#include "GDCpp/Runtime/String.h" -class RuntimeObject; -class RuntimeScene; - -namespace GDpriv { - -namespace LinkedObjects { - -void GD_EXTENSION_API LinkObjects(RuntimeScene &scene, - RuntimeObject *a, - RuntimeObject *b); -void GD_EXTENSION_API RemoveLinkBetween(RuntimeScene &scene, - RuntimeObject *a, - RuntimeObject *b); -void GD_EXTENSION_API RemoveAllLinksOf(RuntimeScene &scene, - RuntimeObject *object); -bool GD_EXTENSION_API PickObjectsLinkedTo( - RuntimeScene &scene, - std::map *> pickedObjectsLists, - RuntimeObject *object); - -} // namespace LinkedObjects - -} // namespace GDpriv - -#endif // LINKEDOBJECTSTOOLS_H_INCLUDED diff --git a/Extensions/LinkedObjects/ObjectsLinksManager.cpp b/Extensions/LinkedObjects/ObjectsLinksManager.cpp deleted file mode 100644 index fd30b57c1..000000000 --- a/Extensions/LinkedObjects/ObjectsLinksManager.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** - -GDevelop - LinkedObjects Extension -Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "ObjectsLinksManager.h" - -#include -#include -#include "LinkedObjectsTools.h" - -#include -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -using namespace std; - -namespace GDpriv { -namespace LinkedObjects { - -void ObjectsLinksManager::LinkObjects(RuntimeObject* a, RuntimeObject* b) { - { - std::set& objectLinks = links[a]; - objectLinks.insert(b); - } - { - std::set& objectLinks = links[b]; - objectLinks.insert(a); - } -} - -void ObjectsLinksManager::RemoveLinkBetween(RuntimeObject* a, - RuntimeObject* b) { - { - std::set& objectLinks = links[a]; - objectLinks.erase(b); - } - { - std::set& objectLinks = links[b]; - objectLinks.erase(a); - } -} - -void ObjectsLinksManager::RemoveAllLinksOf(RuntimeObject* object) { - std::set& objectLinks = links[object]; - for (std::set::iterator linkedObj = objectLinks.begin(); - linkedObj != objectLinks.end(); - ++linkedObj) { - std::set& linkedObjectLinks = links[*linkedObj]; - linkedObjectLinks.erase(object); - } - - links.erase(object); // Remove all links of object -} - -std::vector ObjectsLinksManager::GetObjectsLinkedWith( - RuntimeObject* object) { - // Get links of object - const std::set& objectLinks = links[object]; - std::vector list; - list.reserve(objectLinks.size()); - - // Create the list, avoiding dead links or links to just deleted objects - for (std::set::iterator linkedObj = objectLinks.begin(); - linkedObj != objectLinks.end(); - ++linkedObj) { - if (!(*linkedObj)->GetName().empty()) list.push_back((*linkedObj)); - } - - return list; -} - -void ObjectsLinksManager::ClearAll() { links.clear(); } - -} // namespace LinkedObjects -} // namespace GDpriv diff --git a/Extensions/LinkedObjects/ObjectsLinksManager.h b/Extensions/LinkedObjects/ObjectsLinksManager.h deleted file mode 100644 index 6fa2d6cf4..000000000 --- a/Extensions/LinkedObjects/ObjectsLinksManager.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - -GDevelop - LinkedObjects Extension -Copyright (c) 2011-2013 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef OBJECTSLINKSMANAGER_H -#define OBJECTSLINKSMANAGER_H -#include -#include -#include -#include - -class RuntimeObject; -class RuntimeScene; - -namespace GDpriv { - -namespace LinkedObjects { - -/** - * \brief Manage links between objects of a scene - */ -class GD_EXTENSION_API ObjectsLinksManager { - public: - /** - * \brief Link two object - */ - void LinkObjects(RuntimeObject* a, RuntimeObject* b); - - /** - * \brief Remove link between a and b - */ - void RemoveLinkBetween(RuntimeObject* a, RuntimeObject* b); - - /** - * \brief Remove all links concerning the object - */ - void RemoveAllLinksOf(RuntimeObject* object); - - /** - * \brief Get a list of (raw pointers to) all objects linked with the - * specified object - */ - std::vector GetObjectsLinkedWith(RuntimeObject* object); - - /** - * \brief Delete all links - */ - void ClearAll(); - - static std::map - managers; // List of managers associated with scenes. - - private: - std::map > links; -}; - -} // namespace LinkedObjects -} // namespace GDpriv - -#endif // OBJECTSLINKSMANAGER_H diff --git a/Extensions/LinkedObjects/tests/LinkedObjects.cpp b/Extensions/LinkedObjects/tests/LinkedObjects.cpp deleted file mode 100644 index 920715ca2..000000000 --- a/Extensions/LinkedObjects/tests/LinkedObjects.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/** - -GDevelop - LinkedObjects Extension -Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -/** - * @file Tests for the Linked Objects extension. - */ -#define CATCH_CONFIG_MAIN -#include "catch.hpp" -#include "GDCore/CommonTools.h" -#include "GDCore/Project/ObjectsContainer.h" -#include "GDCore/Project/Layout.h" -#include "GDCore/Project/Object.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Extensions/Builtin/ObjectTools.h" -#include "GDCpp/Extensions/Builtin/ObjectTools.h" -#include "../LinkedObjectsTools.h" -#include "../ObjectsLinksManager.h" - -TEST_CASE( "LinkedObjects", "[game-engine][linked-objects]" ) { - SECTION("LinkedObjectsTools") { - //Prepare some objects and the context - gd::Object obj1("1"); - gd::Object obj2("2"); - - RuntimeGame game; - RuntimeScene scene(NULL, &game); - - RuntimeObject obj1A(scene, obj1); - RuntimeObject obj1B(scene, obj1); - RuntimeObject obj1C(scene, obj1); - - RuntimeObject obj2A(scene, obj2); - RuntimeObject obj2B(scene, obj2); - RuntimeObject obj2C(scene, obj2); - - //Link two objects - GDpriv::LinkedObjects::ObjectsLinksManager & manager = GDpriv::LinkedObjects::ObjectsLinksManager::managers[&scene]; - manager.LinkObjects(&obj1A, &obj2A); - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj1A); - REQUIRE(linkedObjects.size() == 1); - REQUIRE(linkedObjects[0] == &obj2A); - } - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj2A); - REQUIRE(linkedObjects.size() == 1); - REQUIRE(linkedObjects[0] == &obj1A); - } - - //Link more objects - manager.LinkObjects(&obj1A, &obj2A); //Including the same objects as before - manager.LinkObjects(&obj1A, &obj2B); - manager.LinkObjects(&obj1A, &obj2C); - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj1A); - REQUIRE(linkedObjects.size() == 3); - } - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj2C); - REQUIRE(linkedObjects.size() == 1); - REQUIRE(linkedObjects[0] == &obj1A); - } - - //Remove all links - manager.LinkObjects(&obj2B, &obj2C); - manager.RemoveAllLinksOf(&obj1A); - manager.RemoveAllLinksOf(&obj1A); - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj1A); - REQUIRE(linkedObjects.size() == 0); - } - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj2A); - REQUIRE(linkedObjects.size() == 0); - } - { - std::vector linkedObjects = manager.GetObjectsLinkedWith(&obj2C); - REQUIRE(linkedObjects.size() == 1); - REQUIRE(linkedObjects[0] == &obj2B); - } - - } -} diff --git a/Extensions/LinkedObjects/tests/catch.hpp b/Extensions/LinkedObjects/tests/catch.hpp deleted file mode 100644 index 1fba6a34e..000000000 --- a/Extensions/LinkedObjects/tests/catch.hpp +++ /dev/null @@ -1,8974 +0,0 @@ -/* - * CATCH v1.0 build 52 (master branch) - * Generated: 2014-07-10 09:17:43.994453 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -// #included from: internal/catch_suppress_warnings.h - -#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wvariadic-macros" -#pragma clang diagnostic ignored "-Wc99-extensions" -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#pragma clang diagnostic ignored "-Wc++98-compat" -#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif - -#ifdef CATCH_CONFIG_MAIN -# define CATCH_CONFIG_RUNNER -#endif - -#ifdef CATCH_CONFIG_RUNNER -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include -#include - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Much of the following code is based on Boost (1.53) - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_CONFIG_CPP11_NOEXCEPT -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#if (__BORLANDC__ > 0x582 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#if (__EDG_VERSION__ > 238 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#if (__DMC__ > 0x840 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ < 3 - -#if (__GNUC_MINOR__ >= 96 ) -//#define CATCH_CONFIG_SFINAE -#endif - -#elif __GNUC__ >= 3 - -// #define CATCH_CONFIG_SFINAE // Taking this out completely for now - -#endif // __GNUC__ < 3 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) ) - -#define CATCH_CONFIG_CPP11_NULLPTR -#endif - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1310 ) // (VC++ 7.0+) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // _MSC_VER - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS -#define CATCH_CONFIG_VARIADIC_MACROS -#endif - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// detect language version: -#if (__cplusplus == 201103L) -# define CATCH_CPP11 -# define CATCH_CPP11_OR_GREATER -#elif (__cplusplus >= 201103L) -# define CATCH_CPP11_OR_GREATER -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -namespace Catch { - - class NonCopyable { - NonCopyable( NonCopyable const& ); - void operator = ( NonCopyable const& ); - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CPP11_OR_GREATER - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - - std::string file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -#include - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() { return m_p; } - const T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const = 0; - - }; -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -struct AutoReg { - - AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - registerTestCase( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - void registerTestCase( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2 - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x00, - - ContinueOnFailure = 0x01, // Failures fail test, but execution continues - FalseTest = 0x02, // Prefix expression with ! - SuppressFail = 0x04 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); - - std::string macroName; - SourceLineInfo lineInfo; - std::string capturedExpression; - ResultDisposition::Flags resultDisposition; - }; - - struct AssertionResultData - { - AssertionResultData() : resultType( ResultWas::Unknown ) {} - - std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CPP11_OR_GREATER - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ); - - template - ExpressionLhs operator->* ( T const& operand ); - ExpressionLhs operator->* ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; - return *this; - } - - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - - void endExpression(); - - std::string reconstructExpression() const; - AssertionResult build() const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; - - bool m_shouldDebugBreak; - bool m_shouldThrow; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( NULL, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, NULL ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -// #included from: catch_sfinae.hpp -#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED - -// Try to detect if the current compiler supports SFINAE - -namespace Catch { - - struct TrueType { - static const bool value = true; - typedef void Enable; - char sizer[1]; - }; - struct FalseType { - static const bool value = false; - typedef void Disable; - char sizer[2]; - }; - -#ifdef CATCH_CONFIG_SFINAE - - template struct NotABooleanExpression; - - template struct If : NotABooleanExpression {}; - template<> struct If : TrueType {}; - template<> struct If : FalseType {}; - - template struct SizedIf; - template<> struct SizedIf : TrueType {}; - template<> struct SizedIf : FalseType {}; - -#endif // CATCH_CONFIG_SFINAE - -} // end namespace Catch - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -namespace Catch { -namespace Detail { - -// SFINAE is currently disabled by default for all compilers. -// If the non SFINAE version of IsStreamInsertable is ambiguous for you -// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE -#ifdef CATCH_CONFIG_SFINAE - - template - class IsStreamInsertableHelper { - template struct TrueIfSizeable : TrueType {}; - - template - static TrueIfSizeable dummy(T2*); - static FalseType dummy(...); - - public: - typedef SizedIf type; - }; - - template - struct IsStreamInsertable : IsStreamInsertableHelper::type {}; - -#else - - struct BorgType { - template BorgType( T const& ); - }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; - -#endif - - template - struct StringMakerBase { - template - static std::string convert( T const& ) { return "{?}"; } - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -std::string toString( T const& value ); - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -template -struct StringMaker > { - static std::string convert( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); - } -}; - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << toString( *first ); - for( ++first ; first != last ; ++first ) { - oss << ", " << toString( *first ); - } - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif - -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif - - template - ResultBuilder& operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - bool value = m_lhs ? true : false; - m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); - } - - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - -private: - template - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits::getName() ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator->* ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator->* ( bool value ) { - return ExpressionLhs( *this, value ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif - #endif - -#elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } -#endif - -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - ( __catchResult->*expr ).endExpression(); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \ - try { \ - std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == "{?}" ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \ - __catchResult.captureExpression(); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - -} // end namespace Catch - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include -#endif - -namespace Catch { - - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedNanoseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - uint64_t m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: -#ifdef CATCH_CPP11_OR_GREATER - Section( Section const& ) = delete; - Section( Section && ) = delete; - Section& operator = ( Section const& ) = delete; - Section& operator = ( Section && ) = delete; -#else - Section( Section const& info ); - Section& operator = ( Section const& ); -#endif - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate() const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate() const { - try { - throw; - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - template - struct Matcher : SharedImpl - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - }; - - template - struct MatcherImpl : Matcher { - - virtual Ptr > clone() const { - return Ptr >( new DerivedT( static_cast( *this ) ) ); - } - }; - - namespace Generic { - - template - class AllOf : public MatcherImpl, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - template - class AnyOf : public MatcherImpl, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - } - - namespace StdString { - - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct Equals : MatcherImpl { - Equals( std::string const& str ) : m_str( str ){} - Equals( Equals const& other ) : m_str( other.m_str ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_str == expr; - } - virtual std::string toString() const { - return "equals: \"" + m_str + "\""; - } - - std::string m_str; - }; - - struct Contains : MatcherImpl { - Contains( std::string const& substr ) : m_substr( substr ){} - Contains( Contains const& other ) : m_substr( other.m_substr ){} - - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct StartsWith : MatcherImpl { - StartsWith( std::string const& substr ) : m_substr( substr ){} - StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == 0; - } - virtual std::string toString() const { - return "starts with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct EndsWith : MatcherImpl { - EndsWith( std::string const& substr ) : m_substr( substr ){} - EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == expr.size() - m_substr.size(); - } - virtual std::string toString() const { - return "ends with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - } // namespace StdString - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); - } - - inline Impl::StdString::Equals Equals( std::string const& str ) { - return Impl::StdString::Equals( str ); - } - inline Impl::StdString::Equals Equals( const char* str ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); - } - inline Impl::StdString::Contains Contains( std::string const& substr ) { - return Impl::StdString::Contains( substr ); - } - inline Impl::StdString::Contains Contains( const char* substr ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); - } - -} // namespace Matchers - -using namespace Matchers; - -} // namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != NULL; } - bool none() const { return nullableValue == NULL; } - - bool operator !() const { return nullableValue == NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T* nullableValue; - char storage[sizeof(T)]; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - template - struct StringHolder : MatcherImpl{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string toString() const { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string toString() const { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string toString() const { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string toString() const { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_CONFIG_RUNNER -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: catch_runner.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) { - if( startsWith( m_name, "*" ) ) { - m_name = m_name.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_name, "*" ) ) { - m_name = m_name.substr( 0, m_name.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_name == toLower( testCase.name ); - case WildcardAtStart: - return endsWith( toLower( testCase.name ), m_name ); - case WildcardAtEnd: - return startsWith( toLower( testCase.name ), m_name ); - case WildcardAtBothEnds: - return contains( toLower( testCase.name ), m_name ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string m_name; - WildcardPosition m_wildcard; - }; - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) - if( !(*it)->matches( testCase ) ) - return false; - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - } - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -#include - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - class Stream { - public: - Stream(); - Stream( std::streambuf* _streamBuf, bool _isOwned ); - void release(); - - std::streambuf* streamBuf; - - private: - bool isOwned; - }; -} - -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - abortAfter( -1 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - - int abortAfter; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - - std::string reporterName; - std::string outputFilename; - std::string name; - std::string processName; - - std::vector testsOrTags; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - : m_os( std::cout.rdbuf() ) - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_os( std::cout.rdbuf() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() { - m_os.rdbuf( std::cout.rdbuf() ); - m_stream.release(); - } - - void setFilename( std::string const& filename ) { - m_data.outputFilename = filename; - } - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - - std::string getProcessName() const { return m_data.processName; } - - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } - - void setStreamBuf( std::streambuf* buf ) { - m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); - } - - void useStream( std::string const& streamName ) { - Stream stream = createStream( streamName ); - setStreamBuf( stream.streamBuf ); - m_stream.release(); - m_stream = stream; - } - - std::string getReporterName() const { return m_data.reporterName; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } - - // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_os; } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } - - private: - ConfigData m_data; - - Stream m_stream; - mutable std::ostream m_os; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - throw std::runtime_error( "Invalid conversion" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -# ifdef CATCH_CPP11_OR_GREATER - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -# endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual void setFlag( C& p ) const { - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual void setFlag( C& p ) const { - function( p ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - struct Parser { - Parser() : separators( " \t=:" ) {} - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - void parseIntoTokens( int argc, char const * const * argv, std::vector& tokens ) const { - const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); - } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); - } - } - std::string separators; - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - // NOTE: std::auto_ptr is deprecated in c++11/c++0x -#if defined(__cplusplus) && __cplusplus > 199711L - typedef std::unique_ptr ArgAutoPtr; -#else - typedef std::auto_ptr ArgAutoPtr; -#endif - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg = ArgAutoPtr( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( int argc, char const * const * argv ) const { - ConfigT config; - parseInto( argc, argv, config ); - return config; - } - - std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { - std::string processName = argv[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.setFlag( config ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) - addTestOrTags( config, "\"" + line + "\"," ); - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &ConfigData::reporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - namespace Detail { - struct IColourImpl; - } - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - static Detail::IColourImpl* impl(); - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CPP11_OR_GREATER - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CPP11_OR_GREATER - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CPP11_OR_GREATER - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - }; - - struct IReporterFactory { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map FactoryMap; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - }; - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Matching test cases:\n"; - else { - std::cout << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( !testCaseInfo.tags.empty() ) - std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; - else - std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - std::cout << testCaseInfo.name << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Tags for matching test cases:\n"; - else { - std::cout << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - std::cout << oss.str() << wrapper << "\n"; - } - std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - std::cout << "Available reports:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - std::cout << " " - << it->first - << ":" - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; - } - std::cout << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_runner_impl.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { -namespace SectionTracking { - - class TrackedSection { - - typedef std::map TrackedSections; - - public: - enum RunState { - NotStarted, - Executing, - ExecutingChildren, - Completed - }; - - TrackedSection( std::string const& name, TrackedSection* parent ) - : m_name( name ), m_runState( NotStarted ), m_parent( parent ) - {} - - RunState runState() const { return m_runState; } - - TrackedSection* findChild( std::string const& childName ) { - TrackedSections::iterator it = m_children.find( childName ); - return it != m_children.end() - ? &it->second - : NULL; - } - TrackedSection* acquireChild( std::string const& childName ) { - if( TrackedSection* child = findChild( childName ) ) - return child; - m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); - return findChild( childName ); - } - void enter() { - if( m_runState == NotStarted ) - m_runState = Executing; - } - void leave() { - for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); - it != itEnd; - ++it ) - if( it->second.runState() != Completed ) { - m_runState = ExecutingChildren; - return; - } - m_runState = Completed; - } - TrackedSection* getParent() { - return m_parent; - } - bool hasChildren() const { - return !m_children.empty(); - } - - private: - std::string m_name; - RunState m_runState; - TrackedSections m_children; - TrackedSection* m_parent; - - }; - - class TestCaseTracker { - public: - TestCaseTracker( std::string const& testCaseName ) - : m_testCase( testCaseName, NULL ), - m_currentSection( &m_testCase ), - m_completedASectionThisRun( false ) - {} - - bool enterSection( std::string const& name ) { - TrackedSection* child = m_currentSection->acquireChild( name ); - if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed ) - return false; - - m_currentSection = child; - m_currentSection->enter(); - return true; - } - void leaveSection() { - m_currentSection->leave(); - m_currentSection = m_currentSection->getParent(); - assert( m_currentSection != NULL ); - m_completedASectionThisRun = true; - } - - bool currentSectionHasChildren() const { - return m_currentSection->hasChildren(); - } - bool isCompleted() const { - return m_testCase.runState() == TrackedSection::Completed; - } - - class Guard { - public: - Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { - m_tracker.enterTestCase(); - } - ~Guard() { - m_tracker.leaveTestCase(); - } - private: - Guard( Guard const& ); - void operator = ( Guard const& ); - TestCaseTracker& m_tracker; - }; - - private: - void enterTestCase() { - m_currentSection = &m_testCase; - m_completedASectionThisRun = false; - m_testCase.enter(); - } - void leaveTestCase() { - m_testCase.leave(); - } - - TrackedSection m_testCase; - TrackedSection* m_currentSection; - bool m_completedASectionThisRun; - }; - -} // namespace SectionTracking - -using SectionTracking::TestCaseTracker; - -} // namespace Catch - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& config, Ptr const& reporter ) - : m_runInfo( config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( NULL ), - m_config( config ), - m_reporter( reporter ), - m_prevRunner( m_context.getRunner() ), - m_prevResultCapture( m_context.getResultCapture() ), - m_prevConfig( m_context.getConfig() ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - m_context.setRunner( m_prevRunner ); - m_context.setConfig( NULL ); - m_context.setResultCapture( m_prevResultCapture ); - m_context.setConfig( m_prevConfig ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - m_testCaseTracker = TestCaseTracker( testInfo.name ); - - do { - do { - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isCompleted() && !aborting() ); - } - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = NULL; - m_testCaseTracker.reset(); - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - if( !m_testCaseTracker->enterSection( oss.str() ) ) - return false; - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 || - !m_config->warnAboutMissingAssertions() || - m_testCaseTracker->currentSectionHasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { - if( std::uncaught_exception() ) { - m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); - return; - } - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - m_testCaseTracker->leaveSection(); - - m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : ""; - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - TestCaseTracker::Guard guard( *m_testCaseTracker ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( std::cout, redirectedCout ); - StreamRedirect cerrRedir( std::cerr, redirectedCerr ); - m_activeTestCase->invoke(); - } - else { - m_activeTestCase->invoke(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - exResult.useActiveException(); - } - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); - m_unfinishedSections.clear(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - private: - struct UnfinishedSections { - UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) - : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo info; - Counts prevAssertions; - double durationInSeconds; - }; - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - Option m_testCaseTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - IRunner* m_prevRunner; - IResultCapture* m_prevResultCapture; - Ptr m_prevConfig; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _buildNumber, - char const* const _branchName ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - buildNumber( _buildNumber ), - branchName( _branchName ) - {} - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const buildNumber; - char const* const branchName; - - private: - void operator=( Version const& ); - }; - - extern Version libraryVersion; -} - -#include -#include -#include - -namespace Catch { - - class Runner { - - public: - Runner( Ptr const& config ) - : m_config( config ) - { - openStream(); - makeReporter(); - } - - Totals runTests() { - - RunContext context( m_config.get(), m_reporter ); - - Totals totals; - - context.testGroupStarting( "", 1, 1 ); // deprecated? - - TestSpec testSpec = m_config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector testCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); - - int testsRunForGroup = 0; - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) { - testsRunForGroup++; - if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { - - if( context.aborting() ) - break; - - totals += context.runTest( *it ); - m_testsAlreadyRun.insert( *it ); - } - } - context.testGroupEnded( "", totals, 1, 1 ); - return totals; - } - - private: - void openStream() { - // Open output file, if specified - if( !m_config->getFilename().empty() ) { - m_ofs.open( m_config->getFilename().c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << m_config->getFilename() << "'"; - throw std::domain_error( oss.str() ); - } - m_config->setStreamBuf( m_ofs.rdbuf() ); - } - } - void makeReporter() { - std::string reporterName = m_config->getReporterName().empty() - ? "console" - : m_config->getReporterName(); - - m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); - if( !m_reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - } - - private: - Ptr m_config; - std::ofstream m_ofs; - Ptr m_reporter; - std::set m_testsAlreadyRun; - }; - - class Session { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - std::cerr << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - std::cout << "\nCatch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " build " - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - std::cout << " (" << libraryVersion.branchName << " branch)"; - std::cout << "\n"; - - m_cli.usage( std::cout, processName ); - std::cout << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - std::cerr << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( std::cout, m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char* const argv[] ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - Runner runner( m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runner.runTests().assertions.failed ); - } - catch( std::exception& ex ) { - std::cerr << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() : m_unnamedCount( 0 ) {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - - if( m_functions.find( testCase ) == m_functions.end() ) { - m_functions.insert( testCase ); - m_functionsInOrder.push_back( testCase ); - if( !testCase.isHidden() ) - m_nonHiddenFunctions.push_back( testCase ); - } - else { - TestCase const& prev = *m_functions.find( testCase ); - { - Colour colourGuard( Colour::Red ); - std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl; - } - exit(1); - } - } - - virtual std::vector const& getAllTests() const { - return m_functionsInOrder; - } - - virtual std::vector const& getAllNonHiddenTests() const { - return m_nonHiddenFunctions; - } - - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const { - for( std::vector::const_iterator it = m_functionsInOrder.begin(), - itEnd = m_functionsInOrder.end(); - it != itEnd; - ++it ) { - if( testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() ) ) - matchingTestCases.push_back( *it ); - } - } - - private: - - std::set m_functions; - std::vector m_functionsInOrder; - std::vector m_nonHiddenFunctions; - size_t m_unnamedCount; - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - AutoReg::~AutoReg() {} - - void AutoReg::registerTestCase( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() { - deleteAllValues( m_factories ); - } - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - - FactoryMap const& getFactories() const { - return m_factories; - } - - private: - FactoryMap m_factories; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - throw; - } - @catch (NSException *exception) { - return toString( [exception description] ); - } -#else - throw; -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return tryTranslators( m_translators.begin() ); - } - } - - std::string tryTranslators( std::vector::const_iterator it ) const { - if( it == m_translators.end() ) - return "Unknown exception"; - - try { - return (*it)->translate(); - } - catch(...) { - return tryTranslators( it+1 ); - } - } - - private: - std::vector m_translators; - }; -} - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { - return m_exceptionTranslatorRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerTest( TestCase const& testInfo ) { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - Stream::Stream() - : streamBuf( NULL ), isOwned( false ) - {} - - Stream::Stream( std::streambuf* _streamBuf, bool _isOwned ) - : streamBuf( _streamBuf ), isOwned( _isOwned ) - {} - - void Stream::release() { - if( isOwned ) { - delete streamBuf; - streamBuf = NULL; - isOwned = false; - } - } -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - Stream createStream( std::string const& streamName ) { - if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); - if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); - if( streamName == "debug" ) return Stream( new StreamBufImpl, true ); - - throw std::domain_error( "Unknown stream: " + streamName ); - } - - void cleanUpContext() { - delete currentContext; - currentContext = NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -namespace Catch { namespace Detail { - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; -}} - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -namespace Catch { -namespace { - - class Win32ColourImpl : public Detail::IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalAttributes = csbiInfo.wAttributes; - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute ); - } - HANDLE stdoutHandle; - WORD originalAttributes; - }; - - inline bool shouldUseColourForPlatform() { - return true; - } - - static Detail::IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public Detail::IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - private: - void setColour( const char* _escapeCode ) { - std::cout << '\033' << _escapeCode; - } - }; - - inline bool shouldUseColourForPlatform() { - return isatty(STDOUT_FILENO); - } - - static Detail::IColourImpl* platformColourInstance() { - static PosixColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#endif // not Windows - -namespace Catch { - - namespace { - struct NoColourImpl : Detail::IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - static bool shouldUseColour() { - return shouldUseColourForPlatform() && !isDebuggerActive(); - } - } - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - void Colour::use( Code _colourCode ) { - impl()->use( _colourCode ); - } - - Detail::IColourImpl* Colour::impl() { - return shouldUseColour() - ? platformColourInstance() - : NoColourImpl::instance(); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; - else - return m_info.capturedExpression; - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; - else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( tag == "." || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - std::cerr - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - std::cerr << _lineInfo << std::endl; - } - exit(1); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - enforceNotReservedTag( tag, _lineInfo ); - - inTag = false; - if( tag == "hide" || tag == "." ) - isHidden = true; - else - tags.insert( tag ); - tag.clear(); - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - tags( _tags ), - lineInfo( _lineInfo ), - properties( None ) - { - std::ostringstream oss; - for( std::set::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - properties = static_cast( properties | parseSpecialTag( lcaseTag ) ); - lcaseTags.insert( lcaseTag ); - } - tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - // These numbers are maintained by a script - Version libraryVersion( 1, 0, 52, "master" ); -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS -#include -#else -#include -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency((LARGE_INTEGER*)&hz); - QueryPerformanceCounter((LARGE_INTEGER*)&hzo); - } - uint64_t t; - QueryPerformanceCounter((LARGE_INTEGER*)&t); - return ((t-hzo)*1000000)/hz; - } -#else - uint64_t getCurrentTicks() { - timeval t; - gettimeofday(&t,NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedNanoseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast((getCurrentTicks() - m_ticks)/1000); - } - double Timer::getElapsedSeconds() const { - return (getCurrentTicks() - m_ticks)/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << "s"; - return os; - } - - SourceLineInfo::SourceLineInfo() : line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} - bool SourceLineInfo::empty() const { - return file.empty(); - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; -#else - os << info.file << ":" << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - - Section::~Section() { - if( m_sectionIncluded ) - getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); - } - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#include - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { - std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - std::cout << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - namespace { - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return "\"" + s + "\""; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - if( value > 8192 ) - oss << "0x" << std::hex << value; - else - oss << value; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - return value < ' ' - ? toString( static_cast( value ) ) - : Detail::makeString( value ); -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ) - {} - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal ) - m_shouldThrow = true; - } - } - void ResultBuilder::react() { - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - assert( m_data.resultType != ResultWas::Unknown ); - - AssertionResultData data = m_data; - - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } - return AssertionResult( m_assertionInfo, data ); - } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -#include -#include - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - } - - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - std::cerr << ex.what() << std::endl; - exit(1); - } - } - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -namespace Catch { - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - - virtual ~StreamingReporterBase(); - - virtual void noMatchingTestCases( std::string const& ) {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { - currentTestCaseInfo.reset(); - assert( m_sectionStack.empty() ); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - ~CumulativeReporterBase(); - - virtual void testRunStarting( TestRunInfo const& ) {} - virtual void testGroupStarting( GroupInfo const& ) {} - - virtual void testCaseStarting( TestCaseInfo const& ) {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &std::cout ) - {} - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &os ) - {} - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - -//# ifndef CATCH_CPP11_OR_GREATER -// XmlWriter& operator = ( XmlWriter const& other ) { -// XmlWriter temp( other ); -// swap( temp ); -// return *this; -// } -//# else -// XmlWriter( XmlWriter const& ) = default; -// XmlWriter( XmlWriter && ) = default; -// XmlWriter& operator = ( XmlWriter const& ) = default; -// XmlWriter& operator = ( XmlWriter && ) = default; -//# endif -// -// void swap( XmlWriter& other ) { -// std::swap( m_tagIsOpen, other.m_tagIsOpen ); -// std::swap( m_needsNewline, other.m_needsNewline ); -// std::swap( m_tags, other.m_tags ); -// std::swap( m_indent, other.m_indent ); -// std::swap( m_os, other.m_os ); -// } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - stream() << m_indent << "<" << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - stream() << "/>\n"; - m_tagIsOpen = false; - } - else { - stream() << m_indent << "\n"; - } - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) { - stream() << " " << name << "=\""; - writeEncodedText( attribute ); - stream() << "\""; - } - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - if( !name.empty() ) - stream() << " " << name << "=\"" << attribute << "\""; - return *this; - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - stream() << m_indent; - writeEncodedText( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - stream() << m_indent << ""; - m_needsNewline = true; - return *this; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - stream() << "\n"; - return *this; - } - - void setStream( std::ostream& os ) { - m_os = &os; - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - stream() << "\n"; - m_needsNewline = false; - } - } - - void writeEncodedText( std::string const& text ) { - static const char* charsToEncode = "<&\""; - std::string mtext = text; - std::string::size_type pos = mtext.find_first_of( charsToEncode ); - while( pos != std::string::npos ) { - stream() << mtext.substr( 0, pos ); - - switch( mtext[pos] ) { - case '<': - stream() << "<"; - break; - case '&': - stream() << "&"; - break; - case '\"': - stream() << """; - break; - } - mtext = mtext.substr( pos+1 ); - pos = mtext.find_first_of( charsToEncode ); - } - stream() << mtext; - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream* m_os; - }; - -} -namespace Catch { - class XmlReporter : public SharedImpl { - public: - XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - virtual ~XmlReporter(); - - private: // IReporter - - virtual bool shouldRedirectStdout() const { - return true; - } - - virtual void StartTesting() { - m_xml.setStream( m_config.stream() ); - m_xml.startElement( "Catch" ); - if( !m_config.fullConfig()->name().empty() ) - m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); - } - - virtual void EndTesting( const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartGroup( const std::string& groupName ) { - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupName ); - } - - virtual void EndGroup( const std::string&, const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartSection( const std::string& sectionName, const std::string& description ) { - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionName ) ) - .writeAttribute( "description", description ); - } - } - virtual void NoAssertionsInSection( const std::string& ) {} - virtual void NoAssertionsInTestCase( const std::string& ) {} - - virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { - if( --m_sectionDepth > 0 ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", assertions.passed ) - .writeAttribute( "failures", assertions.failed ) - .writeAttribute( "expectedFailures", assertions.failedButOk ); - m_xml.endElement(); - } - } - - virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { - m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); - m_currentTestSuccess = true; - } - - virtual void Result( const Catch::AssertionResult& assertionResult ) { - if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) - return; - - if( assertionResult.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); - - m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - m_currentTestSuccess &= assertionResult.succeeded(); - } - - switch( assertionResult.getResultType() ) { - case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Warning: - m_xml.scopedElement( "Warning" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Unknown: - case ResultWas::Ok: - case ResultWas::FailureBit: - case ResultWas::ExpressionFailed: - case ResultWas::Exception: - case ResultWas::DidntThrowException: - break; - } - if( assertionResult.hasExpression() ) - m_xml.endElement(); - } - - virtual void Aborted() { - // !TBD - } - - virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { - m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); - m_xml.endElement(); - } - - private: - ReporterConfig m_config; - bool m_currentTestSuccess; - XmlWriter m_xml; - int m_sectionDepth; - }; - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - {} - - ~JunitReporter(); - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = true; - return prefs; - } - - virtual void testRunStarting( TestRunInfo const& runInfo ) { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + "/" + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << "\n"; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -#include - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter(); - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; - } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << "\n"; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << "\n"; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << "\n"; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " b" - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - stream << " (" << libraryVersion.branchName << ")"; - stream << " host application.\n" - << "Run with -? for options\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; - } - stream << getLineOfChars<'.'>() << "\n" << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = " " + *it; - while( it->size() > row.size() ) - row = " " + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << " " << it->label; - } - } - stream << "\n"; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << "\n"; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - template - static char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; - } - - void printResultType( Colour::Code colour, std::string passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << " " << passOrFail; - } - stream << ":"; - } - } - - void printIssue( std::string issue ) const { - stream << " " << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ";"; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << " " << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} - - void Config::dummy() {} - - INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -// Standard C/C++ main entry point -int main (int argc, char * const argv[]) { - return Catch::Session().run( argc, argv ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return result; -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) - -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) -#else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( " Given: " desc, "" ) -#define WHEN( desc ) SECTION( " When: " desc, "" ) -#define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) -#define THEN( desc ) SECTION( " Then: " desc, "" ) -#define AND_THEN( desc ) SECTION( " And: " desc, "" ) - -using Catch::Detail::Approx; - -// #included from: internal/catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/Extensions/PanelSpriteObject/CMakeLists.txt b/Extensions/PanelSpriteObject/CMakeLists.txt index f66404abc..62fc2e262 100644 --- a/Extensions/PanelSpriteObject/CMakeLists.txt +++ b/Extensions/PanelSpriteObject/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(PanelSpriteObject) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(PanelSpriteObject "${source_files}") - gd_add_extension_target(PanelSpriteObject "${source_files}") -gdcpp_add_runtime_extension_target(PanelSpriteObject_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(PanelSpriteObject) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(PanelSpriteObject_Runtime) diff --git a/Extensions/PanelSpriteObject/Extension.cpp b/Extensions/PanelSpriteObject/Extension.cpp index 99cbd9e93..29495fd7a 100644 --- a/Extensions/PanelSpriteObject/Extension.cpp +++ b/Extensions/PanelSpriteObject/Extension.cpp @@ -9,7 +9,8 @@ This project is released under the MIT License. * Florian Rival ( Minor changes and adaptations ) */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "PanelSpriteObject.h" void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) { @@ -177,36 +178,3 @@ void DeclarePanelSpriteObjectExtension(gd::PlatformExtension& extension) { .SetIncludeFile("PanelSpriteObject/PanelSpriteObject.h"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class PanelSpriteObjectCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - PanelSpriteObjectCppExtension() { - DeclarePanelSpriteObjectExtension(*this); - AddRuntimeObject( - GetObjectMetadata("PanelSpriteObject::PanelSprite"), - "RuntimePanelSpriteObject"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppPanelSpriteObjectExtension() { - return new PanelSpriteObjectCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new PanelSpriteObjectCppExtension; -} -#endif diff --git a/Extensions/PanelSpriteObject/PanelSpriteObject.cpp b/Extensions/PanelSpriteObject/PanelSpriteObject.cpp index 034ce16cb..2c69090b6 100644 --- a/Extensions/PanelSpriteObject/PanelSpriteObject.cpp +++ b/Extensions/PanelSpriteObject/PanelSpriteObject.cpp @@ -7,16 +7,11 @@ This project is released under the MIT License. #include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/InitialInstance.h" +#include "GDCore/Project/Object.h" +#include "GDCore/Project/Project.h" +#include "GDCore/Serialization/SerializerElement.h" #include "PanelSpriteObject.h" #if defined(GD_IDE_ONLY) @@ -60,194 +55,8 @@ void PanelSpriteObject::DoSerializeTo(gd::SerializerElement& element) const { element.SetAttribute("bottomMargin", bottomMargin); element.SetAttribute("tiled", tiled); } -#endif -RuntimePanelSpriteObject::RuntimePanelSpriteObject( - RuntimeScene& scene, const PanelSpriteObject& panelSpriteObject) - : RuntimeObject(scene, panelSpriteObject), width(32), height(32), angle(0) { - SetRightMargin(panelSpriteObject.GetRightMargin()); - SetLeftMargin(panelSpriteObject.GetLeftMargin()); - SetBottomMargin(panelSpriteObject.GetBottomMargin()); - SetTopMargin(panelSpriteObject.GetTopMargin()); - SetWidth(panelSpriteObject.GetWidth()); - SetHeight(panelSpriteObject.GetHeight()); - - textureName = panelSpriteObject.textureName; - ChangeAndReloadImage(textureName, scene); -} - -/** - * Render object at runtime - */ -bool RuntimePanelSpriteObject::Draw(sf::RenderTarget& window) { - // Don't draw anything if hidden - if (hidden) return true; - if (!texture) return true; - - sf::Vector2f centerPosition = - sf::Vector2f(GetX() + GetCenterX(), GetY() + GetCenterY()); - - float imageWidth = texture->texture.getSize().x; - float imageHeight = texture->texture.getSize().y; - - sf::Vertex centerVertices[] = { - sf::Vertex(sf::Vector2f(-width / 2 + leftMargin, -height / 2 + topMargin), - sf::Vector2f(leftMargin, topMargin)), - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, -height / 2 + topMargin), - sf::Vector2f(imageWidth - rightMargin, topMargin)), - sf::Vertex( - sf::Vector2f(-width / 2 + leftMargin, +height / 2 - bottomMargin), - sf::Vector2f(leftMargin, imageHeight - bottomMargin)), - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, +height / 2 - bottomMargin), - sf::Vector2f(imageWidth - rightMargin, imageHeight - bottomMargin)), - }; - - sf::Vertex topVertices[] = { - // Top-left - sf::Vertex(sf::Vector2f(-width / 2, -height / 2), sf::Vector2f(0, 0)), - sf::Vertex(sf::Vector2f(-width / 2, -height / 2 + topMargin), - sf::Vector2f(0, topMargin)), - sf::Vertex(sf::Vector2f(-width / 2 + leftMargin, -height / 2), - sf::Vector2f(leftMargin, 0)), - sf::Vertex(sf::Vector2f(-width / 2 + leftMargin, -height / 2 + topMargin), - sf::Vector2f(leftMargin, topMargin)), - - // Top - sf::Vertex(sf::Vector2f(+width / 2 - rightMargin, -height / 2), - sf::Vector2f(imageWidth - rightMargin, 0)), - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, -height / 2 + topMargin), - sf::Vector2f(imageWidth - rightMargin, topMargin)), - - // Top-right - sf::Vertex(sf::Vector2f(+width / 2, -height / 2), - sf::Vector2f(imageWidth, 0)), - sf::Vertex(sf::Vector2f(+width / 2, -height / 2 + topMargin), - sf::Vector2f(imageWidth, topMargin)), - }; - - sf::Vertex rightVertices[] = { - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, -height / 2 + topMargin), - sf::Vector2f(imageWidth - rightMargin, topMargin)), - sf::Vertex(sf::Vector2f(+width / 2, -height / 2 + topMargin), - sf::Vector2f(imageWidth, topMargin)), - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, +height / 2 - bottomMargin), - sf::Vector2f(imageWidth - rightMargin, imageHeight - bottomMargin)), - sf::Vertex(sf::Vector2f(+width / 2, +height / 2 - bottomMargin), - sf::Vector2f(imageWidth, imageHeight - bottomMargin))}; - - sf::Vertex bottomVertices[] = { - // Bottom-left - sf::Vertex(sf::Vector2f(-width / 2, +height / 2 - bottomMargin), - sf::Vector2f(0, imageHeight - bottomMargin)), - sf::Vertex(sf::Vector2f(-width / 2, +height / 2), - sf::Vector2f(0, imageHeight)), - sf::Vertex( - sf::Vector2f(-width / 2 + leftMargin, +height / 2 - bottomMargin), - sf::Vector2f(leftMargin, imageHeight - bottomMargin)), - sf::Vertex(sf::Vector2f(-width / 2 + leftMargin, +height / 2), - sf::Vector2f(leftMargin, imageHeight)), - - // Bottom - sf::Vertex( - sf::Vector2f(+width / 2 - rightMargin, +height / 2 - bottomMargin), - sf::Vector2f(imageWidth - rightMargin, imageHeight - bottomMargin)), - sf::Vertex(sf::Vector2f(+width / 2 - rightMargin, +height / 2), - sf::Vector2f(imageWidth - rightMargin, imageHeight)), - - // Bottom-right - sf::Vertex(sf::Vector2f(+width / 2, +height / 2 - bottomMargin), - sf::Vector2f(imageWidth, imageHeight - bottomMargin)), - sf::Vertex(sf::Vector2f(+width / 2, +height / 2), - sf::Vector2f(imageWidth, imageHeight))}; - - sf::Vertex leftVertices[] = { - sf::Vertex(sf::Vector2f(-width / 2, -height / 2 + topMargin), - sf::Vector2f(0, topMargin)), - sf::Vertex(sf::Vector2f(-width / 2 + leftMargin, -height / 2 + topMargin), - sf::Vector2f(leftMargin, topMargin)), - sf::Vertex(sf::Vector2f(-width / 2, +height / 2 - bottomMargin), - sf::Vector2f(0, imageHeight - bottomMargin)), - sf::Vertex( - sf::Vector2f(-width / 2 + leftMargin, +height / 2 - bottomMargin), - sf::Vector2f(leftMargin, imageHeight - bottomMargin))}; - - sf::Transform matrix; - matrix.translate(centerPosition); - matrix.rotate(angle); - - sf::RenderStates states; - states.transform = matrix; - states.texture = &texture->texture; - - window.draw(centerVertices, 4, sf::TrianglesStrip, states); - window.draw(leftVertices, 4, sf::TrianglesStrip, states); - window.draw(rightVertices, 4, sf::TrianglesStrip, states); - window.draw(topVertices, 8, sf::TrianglesStrip, states); - window.draw(bottomVertices, 8, sf::TrianglesStrip, states); - - return true; -} - -#if defined(GD_IDE_ONLY) void PanelSpriteObject::ExposeResources(gd::ArbitraryResourceWorker& worker) { worker.ExposeImage(textureName); } - -void RuntimePanelSpriteObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - if (propertyNb == 0) { - name = _("Width"); - value = gd::String::From(width); - } else if (propertyNb == 1) { - name = _("Height"); - value = gd::String::From(height); - } else if (propertyNb == 2) { - name = _("Left Margin"); - value = gd::String::From(leftMargin); - } else if (propertyNb == 3) { - name = _("Top Margin"); - value = gd::String::From(topMargin); - } else if (propertyNb == 4) { - name = _("Right Margin"); - value = gd::String::From(rightMargin); - } else if (propertyNb == 5) { - name = _("Bottom Margin"); - value = gd::String::From(bottomMargin); - } -} - -bool RuntimePanelSpriteObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - width = newValue.To(); - } else if (propertyNb == 1) { - height = newValue.To(); - } else if (propertyNb == 2) { - leftMargin = newValue.To(); - } else if (propertyNb == 3) { - topMargin = newValue.To(); - } else if (propertyNb == 4) { - rightMargin = newValue.To(); - } else if (propertyNb == 5) { - bottomMargin = newValue.To(); - } - - return true; -} - -std::size_t RuntimePanelSpriteObject::GetNumberOfProperties() const { - return 6; -} #endif - -void RuntimePanelSpriteObject::ChangeAndReloadImage(const gd::String& txtName, - const RuntimeScene& scene) { - textureName = txtName; - texture = scene.GetImageManager()->GetSFMLTexture(textureName); -} diff --git a/Extensions/PanelSpriteObject/PanelSpriteObject.h b/Extensions/PanelSpriteObject/PanelSpriteObject.h index 8b0c9e29d..7b1fd44ca 100644 --- a/Extensions/PanelSpriteObject/PanelSpriteObject.h +++ b/Extensions/PanelSpriteObject/PanelSpriteObject.h @@ -8,10 +8,7 @@ This project is released under the MIT License. #ifndef PANELSPRITEOBJECT_H #define PANELSPRITEOBJECT_H #include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class SFMLTextureWrapper; -class RuntimeScene; +#include "GDCore/Project/Object.h" namespace gd { class Object; class InitialInstance; @@ -84,77 +81,6 @@ class GD_EXTENSION_API PanelSpriteObject : public gd::Object { float bottomMargin; bool tiled; - - std::shared_ptr texture; -}; - -class GD_EXTENSION_API RuntimePanelSpriteObject : public RuntimeObject { - public: - RuntimePanelSpriteObject(RuntimeScene &scene, - const PanelSpriteObject &panelSpriteObject); - virtual ~RuntimePanelSpriteObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool Draw(sf::RenderTarget &renderTarget); - - virtual float GetWidth() const { return width; }; - virtual float GetHeight() const { return height; }; - - virtual inline void SetWidth(float newWidth) { - width = newWidth >= (leftMargin + rightMargin) ? newWidth - : (leftMargin + rightMargin); - }; - virtual inline void SetHeight(float newHeight) { - height = newHeight >= (topMargin + bottomMargin) - ? newHeight - : (topMargin + bottomMargin); - }; - - virtual bool SetAngle(float newAngle) { - angle = newAngle; - return true; - }; - virtual float GetAngle() const { return angle; }; - - float GetLeftMargin() const { return leftMargin; }; - void SetLeftMargin(float newMargin) { leftMargin = newMargin; }; - - float GetTopMargin() const { return topMargin; }; - void SetTopMargin(float newMargin) { topMargin = newMargin; }; - - float GetRightMargin() const { return rightMargin; }; - void SetRightMargin(float newMargin) { rightMargin = newMargin; }; - - float GetBottomMargin() const { return bottomMargin; }; - void SetBottomMargin(float newMargin) { bottomMargin = newMargin; }; - - void ChangeAndReloadImage(const gd::String &texture, - const RuntimeScene &scene); - - gd::String textureName; - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String &name, - gd::String &value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - private: - float width; - float height; - - float leftMargin; - float topMargin; - float rightMargin; - float bottomMargin; - - float angle; - - std::shared_ptr texture; }; #endif // PANELSPRITEOBJECT_H diff --git a/Extensions/ParticleSystem/CMakeLists.txt b/Extensions/ParticleSystem/CMakeLists.txt index 057bd1cd1..e3569eb9a 100644 --- a/Extensions/ParticleSystem/CMakeLists.txt +++ b/Extensions/ParticleSystem/CMakeLists.txt @@ -2,7 +2,6 @@ cmake_minimum_required(VERSION 2.6) cmake_policy(SET CMP0015 NEW) project(ParticleSystem) - gd_add_extension_includes() #Defines @@ -11,19 +10,12 @@ gd_add_extension_definitions(ParticleSystem) #The targets ### -include_directories(./SPARK/include) include_directories(.) -file(GLOB source_files *.cpp *.h "SPARK/src/SPK_All.cpp" "SPARK/src/SPK_GL_All.cpp") #Also compiles the SPARK particle engine files. -file(GLOB formatted_source_files *.cpp *.h) -gd_add_clang_utils(ParticleSystem "${formatted_source_files}") - +file(GLOB source_files *.cpp *.h) +gd_add_clang_utils(ParticleSystem "${source_files}") gd_add_extension_target(ParticleSystem "${source_files}") -gdcpp_add_runtime_extension_target(ParticleSystem_Runtime "${source_files}") + #Linker files for the IDE extension ### gd_extension_link_libraries(ParticleSystem) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(ParticleSystem_Runtime) diff --git a/Extensions/ParticleSystem/Extension.cpp b/Extensions/ParticleSystem/Extension.cpp index 27d008cb8..55fee2f9f 100644 --- a/Extensions/ParticleSystem/Extension.cpp +++ b/Extensions/ParticleSystem/Extension.cpp @@ -10,8 +10,9 @@ This project is released under the MIT License. #include "ExtensionSubDeclaration1.h" #include "ExtensionSubDeclaration2.h" #include "ExtensionSubDeclaration3.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" +#include "GDCore/Project/BehaviorsSharedData.h" #include "ParticleEmitterObject.h" void DeclareParticleSystemExtension(gd::PlatformExtension& extension) { @@ -45,393 +46,4 @@ void DeclareParticleSystemExtension(gd::PlatformExtension& extension) { ExtensionSubDeclaration3(obj); #endif } -} - -/** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ -ParticleSystemCppExtension::ParticleSystemCppExtension() { - DeclareParticleSystemExtension(*this); - AddRuntimeObject( - GetObjectMetadata("ParticleSystem::ParticleEmitter"), - "RuntimeParticleEmitterObject"); - -#if defined(GD_IDE_ONLY) - auto& actions = GetAllActionsForObject("ParticleSystem::ParticleEmitter"); - auto& conditions = - GetAllConditionsForObject("ParticleSystem::ParticleEmitter"); - auto& expressions = - GetAllExpressionsForObject("ParticleSystem::ParticleEmitter"); - auto& strExpressions = - GetAllStrExpressionsForObject("ParticleSystem::ParticleEmitter"); - - actions["ParticleSystem::EmitterForceMin"] - .SetFunctionName("SetEmitterForceMin") - .SetGetter("GetEmitterForceMin") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterForceMax"] - .SetFunctionName("SetEmitterForceMax") - .SetGetter("GetEmitterForceMax") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterXDirection"] - .SetFunctionName("SetEmitterXDirection") - .SetGetter("GetEmitterXDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterXDirection"] - .SetFunctionName("GetEmitterXDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterYDirection"] - .SetFunctionName("SetEmitterYDirection") - .SetGetter("GetEmitterYDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterYDirection"] - .SetFunctionName("GetEmitterYDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterZDirection"] - .SetFunctionName("SetEmitterZDirection") - .SetGetter("GetEmitterZDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterZDirection"] - .SetFunctionName("GetEmitterZDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterAngle"] - .SetFunctionName("SetAngle") - .SetGetter("GetAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterAngle"] - .SetFunctionName("GetAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterAngleA"] - .SetFunctionName("SetEmitterAngleA") - .SetGetter("GetEmitterAngleA") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterAngleA"] - .SetFunctionName("GetEmitterAngleA") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::EmitterAngleB"] - .SetFunctionName("SetEmitterAngleB") - .SetGetter("GetEmitterAngleB") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::EmitterAngleB"] - .SetFunctionName("GetEmitterAngleB") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ConeSprayAngle"] - .SetFunctionName("SetConeSprayAngle") - .SetGetter("GetConeSprayAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ConeSprayAngle"] - .SetFunctionName("GetConeSprayAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::Friction"] - .SetFunctionName("SetFriction") - .SetGetter("GetFriction") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::Friction"] - .SetFunctionName("GetFriction") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ZoneRadius"] - .SetFunctionName("SetZoneRadius") - .SetGetter("GetZoneRadius") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ZoneRadius"] - .SetFunctionName("GetZoneRadius") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleLifeTimeMin"] - .SetFunctionName("SetParticleLifeTimeMin") - .SetGetter("GetParticleLifeTimeMin") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleLifeTimeMin"] - .SetFunctionName("GetParticleLifeTimeMin") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleLifeTimeMax"] - .SetFunctionName("SetParticleLifeTimeMax") - .SetGetter("GetParticleLifeTimeMax") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleLifeTimeMax"] - .SetFunctionName("GetParticleLifeTimeMax") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGravityX"] - .SetFunctionName("SetParticleGravityX") - .SetGetter("GetParticleGravityX") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGravityX"] - .SetFunctionName("GetParticleGravityX") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGravityY"] - .SetFunctionName("SetParticleGravityY") - .SetGetter("GetParticleGravityY") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGravityY"] - .SetFunctionName("GetParticleGravityY") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGravityZ"] - .SetFunctionName("SetParticleGravityZ") - .SetGetter("GetParticleGravityZ") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGravityZ"] - .SetFunctionName("GetParticleGravityZ") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGravityAngle"] - .SetFunctionName("SetParticleGravityAngle") - .SetGetter("GetParticleGravityAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGravityAngle"] - .SetFunctionName("GetParticleGravityAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGravityLength"] - .SetFunctionName("SetParticleGravityLength") - .SetGetter("GetParticleGravityLength") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGravityLength"] - .SetFunctionName("GetParticleGravityLength") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - - actions["ParticleSystem::ParticleColor1"] - .SetFunctionName("SetParticleColor1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleColor2"] - .SetFunctionName("SetParticleColor2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleRed1"] - .SetFunctionName("SetParticleRed1") - .SetGetter("GetParticleRed1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleRed1"] - .SetFunctionName("GetParticleRed1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleRed2"] - .SetFunctionName("SetParticleRed2") - .SetGetter("GetParticleRed2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleRed2"] - .SetFunctionName("GetParticleRed2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleBlue1"] - .SetFunctionName("SetParticleBlue1") - .SetGetter("GetParticleBlue1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleBlue1"] - .SetFunctionName("GetParticleBlue1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleBlue2"] - .SetFunctionName("SetParticleBlue2") - .SetGetter("GetParticleBlue2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleBlue2"] - .SetFunctionName("GetParticleBlue2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGreen1"] - .SetFunctionName("SetParticleGreen1") - .SetGetter("GetParticleGreen1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGreen1"] - .SetFunctionName("GetParticleGreen1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleGreen2"] - .SetFunctionName("SetParticleGreen2") - .SetGetter("GetParticleGreen2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleGreen2"] - .SetFunctionName("GetParticleGreen2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleSize1"] - .SetFunctionName("SetParticleSize1") - .SetGetter("GetParticleSize1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleSize1"] - .SetFunctionName("GetParticleSize1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleSize2"] - .SetFunctionName("SetParticleSize2") - .SetGetter("GetParticleSize2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleSize2"] - .SetFunctionName("GetParticleSize2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleAngle1"] - .SetFunctionName("SetParticleAngle1") - .SetGetter("GetParticleAngle1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleAngle1"] - .SetFunctionName("GetParticleAngle1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleAngle2"] - .SetFunctionName("SetParticleAngle2") - .SetGetter("GetParticleAngle2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleAngle2"] - .SetFunctionName("GetParticleAngle2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleAlpha1"] - .SetFunctionName("SetParticleAlpha1") - .SetGetter("GetParticleAlpha1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleAlpha1"] - .SetFunctionName("GetParticleAlpha1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::ParticleAlpha2"] - .SetFunctionName("SetParticleAlpha2") - .SetGetter("GetParticleAlpha2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::ParticleAlpha2"] - .SetFunctionName("GetParticleAlpha2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::NoMoreParticles"] - .SetFunctionName("NoMoreParticles") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - - actions["ParticleSystem::RecreateParticleSystem"] - .SetFunctionName("RecreateParticleSystem") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::RendererParam1"] - .SetFunctionName("SetRendererParam1") - .SetGetter("GetRendererParam1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::RendererParam1"] - .SetFunctionName("GetRendererParam1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::RendererParam2"] - .SetFunctionName("SetRendererParam2") - .SetGetter("GetRendererParam2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::RendererParam2"] - .SetFunctionName("GetRendererParam2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::Tank"] - .SetFunctionName("SetTank") - .SetGetter("GetTank") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::Tank"].SetFunctionName("GetTank").SetIncludeFile( - "ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::Flow"] - .SetFunctionName("SetFlow") - .SetGetter("GetFlow") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::Flow"].SetFunctionName("GetFlow").SetIncludeFile( - "ParticleSystem/ParticleEmitterObject.h"); - actions["ParticleSystem::Texture"] - .SetFunctionName("SetTexture") - .SetGetter("GetTexture") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - conditions["ParticleSystem::Texture"] - .SetFunctionName("GetTexture") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - - strExpressions["Texture"] - .SetFunctionName("GetTexture") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["NbParticles"] - .SetFunctionName("GetNbParticles") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["RendererParam1"] - .SetFunctionName("GetRendererParam1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["RendererParam2"] - .SetFunctionName("GetRendererParam2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["Tank"].SetFunctionName("GetTank").SetIncludeFile( - "ParticleSystem/ParticleEmitterObject.h"); - expressions["Flow"].SetFunctionName("GetFlow").SetIncludeFile( - "ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterForceMin"] - .SetFunctionName("GetEmitterForceMin") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterForceMax"] - .SetFunctionName("GetEmitterForceMax") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterXDirection"] - .SetFunctionName("GetEmitterXDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterYDirection"] - .SetFunctionName("GetEmitterYDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterZDirection"] - .SetFunctionName("GetEmitterZDirection") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterAngle"] - .SetFunctionName("GetAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterAngleA"] - .SetFunctionName("GetEmitterAngleA") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["EmitterAngleB"] - .SetFunctionName("GetEmitterAngleB") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ZoneRadius"] - .SetFunctionName("GetZoneRadius") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGravityX"] - .SetFunctionName("GetParticleGravityX") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGravityY"] - .SetFunctionName("GetParticleGravityY") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGravityZ"] - .SetFunctionName("GetParticleGravityZ") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGravityAngle"] - .SetFunctionName("GetParticleGravityAngle") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGravityLength"] - .SetFunctionName("GetParticleGravityLength") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["Friction"] - .SetFunctionName("GetFriction") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleLifeTimeMin"] - .SetFunctionName("GetParticleLifeTimeMin") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleLifeTimeMax"] - .SetFunctionName("GetParticleLifeTimeMax") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleRed1"] - .SetFunctionName("GetParticleRed1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleRed2"] - .SetFunctionName("GetParticleRed2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleBlue1"] - .SetFunctionName("GetParticleBlue1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleBlue2"] - .SetFunctionName("GetParticleBlue2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGreen1"] - .SetFunctionName("GetParticleGreen1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleGreen2"] - .SetFunctionName("GetParticleGreen2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleAlpha1"] - .SetFunctionName("GetParticleAlpha1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleAlpha2"] - .SetFunctionName("GetParticleAlpha2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleSize1"] - .SetFunctionName("GetParticleSize1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleSize2"] - .SetFunctionName("GetParticleSize2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleAngle1"] - .SetFunctionName("GetParticleAngle1") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - expressions["ParticleAngle2"] - .SetFunctionName("GetParticleAngle2") - .SetIncludeFile("ParticleSystem/ParticleEmitterObject.h"); - - StripUnimplementedInstructionsAndExpressions(); -#endif - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); -}; - -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new ParticleSystemCppExtension; -} +} \ No newline at end of file diff --git a/Extensions/ParticleSystem/Extension.h b/Extensions/ParticleSystem/Extension.h index 430da7f60..7f5588803 100644 --- a/Extensions/ParticleSystem/Extension.h +++ b/Extensions/ParticleSystem/Extension.h @@ -7,23 +7,13 @@ This project is released under the MIT License. #ifndef EXTENSION_H_INCLUDED #define EXTENSION_H_INCLUDED -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" namespace gd { class ObjectMetadata; -} -namespace gd { class PlatformExtension; } void DeclareParticleSystemExtension(gd::PlatformExtension& extension); -/** - * \brief This class declares information about the extension. - */ -class ParticleSystemCppExtension : public ExtensionBase { - public: - ParticleSystemCppExtension(); - virtual ~ParticleSystemCppExtension(){}; -}; #endif // EXTENSION_H_INCLUDED diff --git a/Extensions/ParticleSystem/ExtensionSubDeclaration1.cpp b/Extensions/ParticleSystem/ExtensionSubDeclaration1.cpp index a97a8d9af..f6fe7db00 100644 --- a/Extensions/ParticleSystem/ExtensionSubDeclaration1.cpp +++ b/Extensions/ParticleSystem/ExtensionSubDeclaration1.cpp @@ -5,7 +5,8 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "Extension.h" #include "ParticleEmitterObject.h" diff --git a/Extensions/ParticleSystem/ExtensionSubDeclaration2.cpp b/Extensions/ParticleSystem/ExtensionSubDeclaration2.cpp index 5af5022b0..873c9546e 100644 --- a/Extensions/ParticleSystem/ExtensionSubDeclaration2.cpp +++ b/Extensions/ParticleSystem/ExtensionSubDeclaration2.cpp @@ -5,7 +5,8 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "Extension.h" #include "ParticleEmitterObject.h" diff --git a/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp b/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp index 727586598..3b0e5713b 100644 --- a/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp +++ b/Extensions/ParticleSystem/ExtensionSubDeclaration3.cpp @@ -5,7 +5,8 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "Extension.h" #include "ParticleEmitterObject.h" diff --git a/Extensions/ParticleSystem/JsExtension.cpp b/Extensions/ParticleSystem/JsExtension.cpp index a57ae61d2..e79583713 100644 --- a/Extensions/ParticleSystem/JsExtension.cpp +++ b/Extensions/ParticleSystem/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "ParticleEmitterObject.h" void DeclareParticleSystemExtension(gd::PlatformExtension& extension); diff --git a/Extensions/ParticleSystem/ParticleEmitterObject.cpp b/Extensions/ParticleSystem/ParticleEmitterObject.cpp index 35cf2d507..dbb8142d7 100644 --- a/Extensions/ParticleSystem/ParticleEmitterObject.cpp +++ b/Extensions/ParticleSystem/ParticleEmitterObject.cpp @@ -5,32 +5,19 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include -#include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/InitialInstance.h" +#include "GDCore/Project/Object.h" +#include "GDCore/Project/Project.h" +#include "GDCore/Serialization/SerializerElement.h" #include "ParticleEmitterObject.h" -#include "ParticleSystemWrapper.h" #if defined(GD_IDE_ONLY) #include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -#include "GDCpp/Runtime/CommonTools.h" +#include "GDCore/CommonTools.h" #endif -// clang-format off -#include -#include -// clang-format on - using namespace std; ParticleEmitterBase::ParticleEmitterBase() @@ -79,8 +66,7 @@ ParticleEmitterBase::ParticleEmitterBase() particleAngleRandomness1(0), particleAngleRandomness2(0), maxParticleNb(300), - destroyWhenNoParticles(true), - particleSystem(NULL) {} + destroyWhenNoParticles(true) {} ParticleEmitterObject::ParticleEmitterObject(gd::String name_) : Object(name_) @@ -326,294 +312,7 @@ void ParticleEmitterBase::SerializeParticleEmitterBaseTo( } #endif -void ParticleEmitterBase::CreateParticleSystem() { - if (particleSystem) delete particleSystem; - particleSystem = new ParticleSystemWrapper; - - int enabledFlag = 0; - int mutableFlag = 0; - int randomFlag = 0; - - if (redParam == Enabled) - enabledFlag |= SPK::FLAG_RED; - else if (redParam == Mutable) { - enabledFlag |= SPK::FLAG_RED; - mutableFlag |= SPK::FLAG_RED; - } else if (redParam == Random) { - enabledFlag |= SPK::FLAG_RED; - randomFlag |= SPK::FLAG_RED; - } - - if (greenParam == Enabled) - enabledFlag |= SPK::FLAG_RED; - else if (greenParam == Mutable) { - enabledFlag |= SPK::FLAG_GREEN; - mutableFlag |= SPK::FLAG_GREEN; - } else if (greenParam == Random) { - enabledFlag |= SPK::FLAG_GREEN; - randomFlag |= SPK::FLAG_GREEN; - } - - if (blueParam == Enabled) - enabledFlag |= SPK::FLAG_BLUE; - else if (blueParam == Mutable) { - enabledFlag |= SPK::FLAG_BLUE; - mutableFlag |= SPK::FLAG_BLUE; - } else if (blueParam == Random) { - enabledFlag |= SPK::FLAG_BLUE; - randomFlag |= SPK::FLAG_BLUE; - } - - if (alphaParam == Enabled) - enabledFlag |= SPK::FLAG_ALPHA; - else if (alphaParam == Mutable) { - enabledFlag |= SPK::FLAG_ALPHA; - randomFlag |= SPK::FLAG_ALPHA; - mutableFlag |= SPK::FLAG_ALPHA; - } else if (alphaParam == Random) { - enabledFlag |= SPK::FLAG_ALPHA; - randomFlag |= SPK::FLAG_ALPHA; - } - - if (sizeParam == Mutable) { - enabledFlag |= SPK::FLAG_SIZE; - randomFlag |= SPK::FLAG_SIZE; - mutableFlag |= SPK::FLAG_SIZE; - } else if (sizeParam == Random) { - enabledFlag |= SPK::FLAG_SIZE; - randomFlag |= SPK::FLAG_SIZE; - } - - if (angleParam == Mutable) { - enabledFlag |= SPK::FLAG_ANGLE; - randomFlag |= SPK::FLAG_ANGLE; - mutableFlag |= SPK::FLAG_ANGLE; - } else if (angleParam == Random) { - enabledFlag |= SPK::FLAG_ANGLE; - randomFlag |= SPK::FLAG_ANGLE; - } - - if (rendererType == Quad) enabledFlag |= SPK::PARAM_TEXTURE_INDEX; - - // Create the model - particleSystem->particleModel = - SPK::Model::create(enabledFlag, mutableFlag, randomFlag); - UpdateRedParameters(); - UpdateGreenParameters(); - UpdateBlueParameters(); - UpdateAlphaParameters(); - UpdateSizeParameters(); - UpdateAngleParameters(); - UpdateLifeTime(); - - // Create the renderer - if (rendererType == Line) - particleSystem->renderer = - SPK::GL::GLLineRenderer::create(rendererParam1, rendererParam2); - else if (rendererType == Quad) { - SPK::GL::GLQuadRenderer* quadRenderer = - new SPK::GL::GLQuadRenderer(rendererParam1, rendererParam2); - - if (particleSystem->textureParticle) { - quadRenderer->setTexturingMode(SPK::TEXTURE_2D); - quadRenderer->setTexture( - particleSystem->textureParticle->texture.getNativeHandle()); - } - - particleSystem->renderer = quadRenderer; - } else { - SPK::GL::GLPointRenderer* pointRenderer = - SPK::GL::GLPointRenderer::create(); - pointRenderer->setType(SPK::POINT_CIRCLE); - pointRenderer->setSize(rendererParam1); - - particleSystem->renderer = pointRenderer; - } - - particleSystem->renderer->enableBlending(true); - if (additive) - particleSystem->renderer->setBlendingFunctions(GL_SRC_ALPHA, GL_ONE); - else - particleSystem->renderer->setBlendingFunctions(GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA); - particleSystem->renderer->setTextureBlending( - GL_MODULATE); // Texture color modulated with particle color - particleSystem->renderer->enableRenderingHint( - SPK::DEPTH_TEST, false); // No depth test for performance - - // Create the zone - particleSystem->zone = SPK::Sphere::create(SPK::Vector3D(0, 0), zoneRadius); - - // Create the emitter - particleSystem->emitter = SPK::SphericEmitter::create( - SPK::Vector3D(emitterXDirection, -emitterYDirection, emitterZDirection), - emitterAngleA / 180.0f * 3.14159f, - emitterAngleB / 180.0f * 3.14159f); - particleSystem->emitter->setForce(emitterForceMin, emitterForceMax); - particleSystem->emitter->setZone(particleSystem->zone); - particleSystem->emitter->setTank(tank); - particleSystem->emitter->setFlow(flow); - - // Create the Group - particleSystem->group = - SPK::Group::create(particleSystem->particleModel, maxParticleNb); - particleSystem->group->addEmitter(particleSystem->emitter); - particleSystem->group->setGravity( - SPK::Vector3D(particleGravityX, -particleGravityY, particleGravityZ)); - particleSystem->group->setFriction(friction); - particleSystem->group->setRenderer(particleSystem->renderer); - - // Create the System - particleSystem->particleSystem = SPK::System::create(); - particleSystem->particleSystem->addGroup(particleSystem->group); -} - -void ParticleEmitterBase::UpdateRedParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (redParam == Mutable || redParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_RED, particleRed1 / 255.0f, particleRed2 / 255.0f); - else - particleSystem->particleModel->setParam(SPK::PARAM_RED, - particleRed1 / 255.0f); -} - -void ParticleEmitterBase::UpdateGreenParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (greenParam == Mutable || greenParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_GREEN, particleGreen1 / 255.0f, particleGreen2 / 255.0f); - else - particleSystem->particleModel->setParam(SPK::PARAM_GREEN, - particleGreen1 / 255.0f); -} - -void ParticleEmitterBase::UpdateBlueParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (blueParam == Mutable || blueParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_BLUE, particleBlue1 / 255.0f, particleBlue2 / 255.0f); - else - particleSystem->particleModel->setParam(SPK::PARAM_BLUE, - particleBlue1 / 255.0f); -} - -void ParticleEmitterBase::UpdateAlphaParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (alphaParam == Mutable) - particleSystem->particleModel->setParam( - SPK::PARAM_ALPHA, - (particleAlpha1 - particleAlphaRandomness1 / 2.0f) / 255.0f, - (particleAlpha1 + particleAlphaRandomness1 / 2.0f) / 255.0f, - (particleAlpha2 - particleAlphaRandomness2 / 2.0f) / 255.0f, - (particleAlpha2 + particleAlphaRandomness2 / 2.0f) / 255.0f); - else if (alphaParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_ALPHA, (particleAlpha1) / 255.0f, (particleAlpha2) / 255.0f); - else - particleSystem->particleModel->setParam(SPK::PARAM_ALPHA, - particleAlpha1 / 255.0f); -} - -void ParticleEmitterBase::UpdateSizeParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (sizeParam == Mutable) - particleSystem->particleModel->setParam( - SPK::PARAM_SIZE, - (particleSize1 - particleSizeRandomness1 / 2.0f) / 100.0f, - (particleSize1 + particleSizeRandomness1 / 2.0f) / 100.0f, - (particleSize2 - particleSizeRandomness2 / 2.0f) / 100.0f, - (particleSize2 + particleSizeRandomness2 / 2.0f) / 100.0f); - else if (sizeParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_SIZE, (particleSize1) / 100.0f, (particleSize2) / 100.0f); - else - particleSystem->particleModel->setParam(SPK::PARAM_SIZE, - particleSize1 / 100.0f); -} - -void ParticleEmitterBase::UpdateAngleParameters() { - if (!particleSystem || !particleSystem->particleModel) return; - - if (angleParam == Mutable) - particleSystem->particleModel->setParam( - SPK::PARAM_ANGLE, - -(particleAngle1 - particleAngleRandomness1 / 2.0f) / 180.0f * 3.14159f, - -(particleAngle1 + particleAngleRandomness1 / 2.0f) / 180.0f * 3.14159f, - -(particleAngle2 - particleAngleRandomness2 / 2.0f) / 180.0f * 3.14159f, - -(particleAngle2 + particleAngleRandomness2 / 2.0f) / 180.0f * - 3.14159f); - else if (angleParam == Random) - particleSystem->particleModel->setParam( - SPK::PARAM_ANGLE, - -(particleAngle1) / 180.0f * 3.14159f, - -(particleAngle2) / 180.0f * 3.14159f); - else - particleSystem->particleModel->setParam( - SPK::PARAM_ANGLE, -particleAngle1 / 180.0f * 3.14159f); -} - -void ParticleEmitterBase::UpdateLifeTime() { - if (!particleSystem || !particleSystem->particleModel) return; - - particleSystem->particleModel->setLifeTime(particleLifeTimeMin, - particleLifeTimeMax); -} - -RuntimeParticleEmitterObject::RuntimeParticleEmitterObject( - RuntimeScene& scene, const ParticleEmitterObject& particleEmitterObject) - : RuntimeObject(scene, particleEmitterObject), hasSomeParticles(true) { - ParticleEmitterBase::operator=(particleEmitterObject); - - CreateParticleSystem(); - SetTexture(scene, GetParticleTexture()); - - OnPositionChanged(); -} - -ParticleEmitterBase::~ParticleEmitterBase() { - if (particleSystem) delete particleSystem; -} - -/** - * Render object at runtime - */ -bool RuntimeParticleEmitterObject::Draw(sf::RenderTarget& renderTarget) { - // Don't draw anything if hidden - if (hidden) return true; - - renderTarget.popGLStates(); - - float xView = renderTarget.getView().getCenter().x * 0.25f; - float yView = -renderTarget.getView().getCenter().y * 0.25f; - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glRotatef(renderTarget.getView().getRotation(), 0, 0, 1); - glTranslatef( - -xView, -yView, -75.0f * (renderTarget.getView().getSize().y / 600.0f)); - - SPK::GL::GLRenderer::saveGLStates(); - - GetParticleSystem()->particleSystem->render(); - SPK::GL::GLRenderer::restoreGLStates(); - - renderTarget.pushGLStates(); - - return true; -} - -void RuntimeParticleEmitterObject::OnPositionChanged() { - if (GetParticleSystem() && GetParticleSystem()->zone) - GetParticleSystem()->zone->setPosition( - SPK::Vector3D(GetX() * 0.25f, -GetY() * 0.25f, 0)); -} +ParticleEmitterBase::~ParticleEmitterBase() {} #if defined(GD_IDE_ONLY) void ParticleEmitterObject::ExposeResources( @@ -622,120 +321,49 @@ void ParticleEmitterObject::ExposeResources( worker.ExposeImage(texture); SetParticleTexture(texture); } - -void RuntimeParticleEmitterObject::GetPropertyForDebugger( - std::size_t propertyNb, gd::String& name, gd::String& value) const { - if (!GetParticleSystem() || !GetParticleSystem()->particleSystem) return; - - if (propertyNb == 0) { - name = _("Particles number"); - value = - gd::String::From(GetParticleSystem()->particleSystem->getNbParticles()); - } -} - -bool RuntimeParticleEmitterObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - return false; - } - - return true; -} - -std::size_t RuntimeParticleEmitterObject::GetNumberOfProperties() const { - return 1; -} #endif void ParticleEmitterBase::SetTank(float newValue) { tank = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setFlow(tank); } void ParticleEmitterBase::SetFlow(float newValue) { flow = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setFlow(flow); } void ParticleEmitterBase::SetEmitterForceMin(float newValue) { emitterForceMin = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setForce(emitterForceMin, emitterForceMax); } void ParticleEmitterBase::SetEmitterForceMax(float newValue) { emitterForceMax = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setForce(emitterForceMin, emitterForceMax); } void ParticleEmitterBase::SetParticleGravityX(float newValue) { particleGravityX = newValue; - if (particleSystem && particleSystem->group) - particleSystem->group->setGravity( - SPK::Vector3D(particleGravityX, -particleGravityY, particleGravityZ)); } void ParticleEmitterBase::SetParticleGravityY(float newValue) { particleGravityY = newValue; - if (particleSystem && particleSystem->group) - particleSystem->group->setGravity( - SPK::Vector3D(particleGravityX, -particleGravityY, particleGravityZ)); } void ParticleEmitterBase::SetParticleGravityZ(float newValue) { particleGravityZ = newValue; - if (particleSystem && particleSystem->group) - particleSystem->group->setGravity( - SPK::Vector3D(particleGravityX, -particleGravityY, particleGravityZ)); } void ParticleEmitterBase::SetFriction(float newValue) { friction = newValue; - if (particleSystem && particleSystem->group) - particleSystem->group->setFriction(friction); } void ParticleEmitterBase::SetEmitterXDirection(float newValue) { emitterXDirection = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setDirection(SPK::Vector3D( - emitterXDirection, -emitterYDirection, emitterZDirection)); } void ParticleEmitterBase::SetEmitterYDirection(float newValue) { emitterYDirection = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setDirection(SPK::Vector3D( - emitterXDirection, -emitterYDirection, emitterZDirection)); } void ParticleEmitterBase::SetEmitterZDirection(float newValue) { emitterZDirection = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setDirection(SPK::Vector3D( - emitterXDirection, -emitterYDirection, emitterZDirection)); } void ParticleEmitterBase::SetEmitterAngleA(float newValue) { emitterAngleA = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setAngles(emitterAngleA / 180.0f * 3.14159f, - emitterAngleB / 180.0f * 3.14159f); } void ParticleEmitterBase::SetEmitterAngleB(float newValue) { emitterAngleB = newValue; - if (particleSystem && particleSystem->emitter) - particleSystem->emitter->setAngles(emitterAngleA / 180.0f * 3.14159f, - emitterAngleB / 180.0f * 3.14159f); } void ParticleEmitterBase::SetZoneRadius(float newValue) { zoneRadius = newValue; - if (particleSystem && particleSystem->zone) - particleSystem->zone->setRadius(zoneRadius); -} - -void RuntimeParticleEmitterObject::Update(const RuntimeScene& scene) { - double elapsedTimeInSeconds = - static_cast(GetElapsedTime(scene)) / 1000000.0; - if (GetParticleSystem()) - hasSomeParticles = - GetParticleSystem()->particleSystem->update(elapsedTimeInSeconds); - - if (GetDestroyWhenNoParticles() && !hasSomeParticles) - DeleteFromScene(const_cast(scene)); // Ugly const cast } void ParticleEmitterBase::SetParticleGravityAngle(float newAngleInDegree) { @@ -761,18 +389,6 @@ float ParticleEmitterBase::GetParticleGravityLength() const { GetParticleGravityX() * GetParticleGravityX()); } -bool RuntimeParticleEmitterObject::SetAngle(float newAngleInDegrees) { - SetEmitterXDirection(cos(newAngleInDegrees / 180.0f * 3.14159f)); - SetEmitterYDirection(sin(newAngleInDegrees / 180.0f * 3.14159f)); - - return true; -} - -float RuntimeParticleEmitterObject::GetAngle() const { - return atan2f(GetEmitterYDirection(), GetEmitterXDirection()) * 180.0f / - 3.14159f; -} - void ParticleEmitterBase::SetParticleColor1(const gd::String& color) { std::vector colors = color.Split(U';'); @@ -782,6 +398,7 @@ void ParticleEmitterBase::SetParticleColor1(const gd::String& color) { SetParticleGreen1(colors[1].To()); SetParticleBlue1(colors[2].To()); } + void ParticleEmitterBase::SetParticleColor2(const gd::String& color) { std::vector colors = color.Split(U';'); @@ -792,40 +409,12 @@ void ParticleEmitterBase::SetParticleColor2(const gd::String& color) { SetParticleBlue2(colors[2].To()); } -/** - * Change the texture - */ -void ParticleEmitterBase::SetTexture(RuntimeScene& scene, - const gd::String& textureParticleName_) { - textureParticleName = textureParticleName_; - if (particleSystem && rendererType == Quad) { - // Load new texture - particleSystem->textureParticle = - scene.GetImageManager()->GetSFMLTexture(textureParticleName); - - // Notify the renderer of the change - SPK::GL::GLQuadRenderer* quadRenderer = - dynamic_cast(particleSystem->renderer); - - if (quadRenderer) { - quadRenderer->setTexturingMode(SPK::TEXTURE_2D); - quadRenderer->setTexture( - particleSystem->textureParticle->texture.getNativeHandle()); - } - } -} - /** * Used by copy constructor and assignment operator. * \warning Do not forget to update me if members were changed! */ void ParticleEmitterBase::Init(const ParticleEmitterBase& other) { - if (particleSystem) delete particleSystem; - if (other.particleSystem) - particleSystem = new ParticleSystemWrapper(*other.particleSystem); - else - particleSystem = NULL; - + // TODO: might be useless to redefine the copy ctor/assignment operator. textureParticleName = other.textureParticleName; rendererType = other.rendererType; rendererParam1 = other.rendererParam1; diff --git a/Extensions/ParticleSystem/ParticleEmitterObject.h b/Extensions/ParticleSystem/ParticleEmitterObject.h index 20ef73640..8eb893c11 100644 --- a/Extensions/ParticleSystem/ParticleEmitterObject.h +++ b/Extensions/ParticleSystem/ParticleEmitterObject.h @@ -8,19 +8,11 @@ This project is released under the MIT License. #ifndef PARTICLEEMITTEROBJECT_H #define PARTICLEEMITTEROBJECT_H -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class ParticleSystemWrapper; -class RuntimeScene; +#include "GDCore/Project/Object.h" namespace gd { -class ImageManager; class InitialInstance; -} -#if defined(GD_IDE_ONLY) -namespace gd { class Project; } -#endif /** * \brief Base class containing the parameters of an emitter as well as the @@ -30,7 +22,7 @@ class GD_EXTENSION_API ParticleEmitterBase { public: ParticleEmitterBase(); virtual ~ParticleEmitterBase(); - ParticleEmitterBase(const ParticleEmitterBase& other) : particleSystem(NULL) { + ParticleEmitterBase(const ParticleEmitterBase& other) { Init(other); }; ParticleEmitterBase& operator=(const ParticleEmitterBase& other) { @@ -38,36 +30,11 @@ class GD_EXTENSION_API ParticleEmitterBase { return *this; } - /** Change texture at runtime - */ - void SetTexture(RuntimeScene& scene, const gd::String& textureParticleName); - - /** Change texture name without changing it effectively at runtime - */ void SetParticleTexture(const gd::String & imageName) { textureParticleName = imageName; }; const gd::String & GetParticleTexture() const { return textureParticleName; }; - /** - * \brief Initialize the particle system with the current objects settings. - */ - void CreateParticleSystem(); - - void UpdateRedParameters(); - void UpdateGreenParameters(); - void UpdateBlueParameters(); - void UpdateAlphaParameters(); - void UpdateSizeParameters(); - void UpdateAngleParameters(); - void UpdateLifeTime(); - void RecreateParticleSystem(); - const ParticleSystemWrapper* GetParticleSystem() const { - return particleSystem; - } - ParticleSystemWrapper* GetParticleSystem() { return particleSystem; } - - // Getters/Setters void SetRendererParam1(float newValue) { rendererParam1 = newValue; }; void SetRendererParam2(float newValue) { rendererParam2 = newValue; }; void SetTank(float newValue); @@ -101,83 +68,63 @@ class GD_EXTENSION_API ParticleEmitterBase { void SetParticleRed1(float newValue) { particleRed1 = newValue; - UpdateRedParameters(); }; void SetParticleRed2(float newValue) { particleRed2 = newValue; - UpdateRedParameters(); }; void SetParticleGreen1(float newValue) { particleGreen1 = newValue; - UpdateGreenParameters(); }; void SetParticleGreen2(float newValue) { particleGreen2 = newValue; - UpdateGreenParameters(); }; void SetParticleBlue1(float newValue) { particleBlue1 = newValue; - UpdateBlueParameters(); }; void SetParticleBlue2(float newValue) { particleBlue2 = newValue; - UpdateBlueParameters(); }; void SetParticleAlpha1(float newValue) { particleAlpha1 = newValue; - UpdateAlphaParameters(); }; void SetParticleAlpha2(float newValue) { particleAlpha2 = newValue; - UpdateAlphaParameters(); }; void SetParticleSize1(float newValue) { particleSize1 = newValue; - UpdateSizeParameters(); }; void SetParticleSize2(float newValue) { particleSize2 = newValue; - UpdateSizeParameters(); }; void SetParticleAngle1(float newValue) { particleAngle1 = newValue; - UpdateAngleParameters(); }; void SetParticleAngle2(float newValue) { particleAngle2 = newValue; - UpdateAngleParameters(); }; void SetParticleAlphaRandomness1(float newValue) { particleAlphaRandomness1 = newValue; - UpdateAlphaParameters(); }; void SetParticleAlphaRandomness2(float newValue) { particleAlphaRandomness2 = newValue; - UpdateAlphaParameters(); }; void SetParticleSizeRandomness1(float newValue) { particleSizeRandomness1 = newValue; - UpdateSizeParameters(); }; void SetParticleSizeRandomness2(float newValue) { particleSizeRandomness2 = newValue; - UpdateSizeParameters(); }; void SetParticleAngleRandomness1(float newValue) { particleAngleRandomness1 = newValue; - UpdateAngleParameters(); }; void SetParticleAngleRandomness2(float newValue) { particleAngleRandomness2 = newValue; - UpdateAngleParameters(); }; void SetParticleLifeTimeMin(float newValue) { particleLifeTimeMin = newValue; - UpdateLifeTime(); }; void SetParticleLifeTimeMax(float newValue) { particleLifeTimeMax = newValue; - UpdateLifeTime(); }; void SetMaxParticleNb(std::size_t newValue) { maxParticleNb = newValue; }; void SetDestroyWhenNoParticles(bool enable = true) { @@ -291,11 +238,6 @@ class GD_EXTENSION_API ParticleEmitterBase { bool destroyWhenNoParticles; ///< If set to true, the object will removed ///< itself from the scene when it has no more ///< particles. - - ParticleSystemWrapper* - particleSystem; ///< Pointer to the class wrapping all the real particle - ///< engine related stuff. This pointer is managed by the - ///< object. }; /** @@ -328,54 +270,4 @@ class GD_EXTENSION_API ParticleEmitterObject : public gd::Object, #endif }; -/** - * \brief Particle Emitter object used by the game engine. - */ -class GD_EXTENSION_API RuntimeParticleEmitterObject - : public RuntimeObject, - public ParticleEmitterBase { - public: - RuntimeParticleEmitterObject( - RuntimeScene& scene, const ParticleEmitterObject& particleEmitterObject); - virtual ~RuntimeParticleEmitterObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool Draw(sf::RenderTarget& renderTarget); - - virtual void OnPositionChanged(); - - virtual float GetWidth() const { return 32; }; - virtual float GetHeight() const { return 32; }; - - virtual void Update(const RuntimeScene& scene); - - bool NoMoreParticles() const { return !hasSomeParticles; }; - - /** - * Changing object angle is equivalent to changing emission X/Y direction - */ - virtual bool SetAngle(float newAngleInDegrees); - virtual float GetAngle() const; - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - const ParticleSystemWrapper& GetAssociatedParticleSystemWrapper() const { - return *GetParticleSystem(); - }; - ParticleSystemWrapper& GetAssociatedParticleSystemWrapper() { - return *GetParticleSystem(); - }; - - private: - bool hasSomeParticles; -}; - #endif // PARTICLEEMITTEROBJECT_H diff --git a/Extensions/ParticleSystem/ParticleSystemWrapper.cpp b/Extensions/ParticleSystem/ParticleSystemWrapper.cpp deleted file mode 100644 index 5f847de4a..000000000 --- a/Extensions/ParticleSystem/ParticleSystemWrapper.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/** - -GDevelop - Particle System Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "ParticleSystemWrapper.h" -#include -#include -#include - -bool ParticleSystemWrapper::SPKinitialized = false; - -ParticleSystemWrapper::ParticleSystemWrapper() - : particleSystem(NULL), - particleModel(NULL), - emitter(NULL), - zone(NULL), - group(NULL), - renderer(NULL) { - if (!SPKinitialized) { - SPK::randomSeed = static_cast(time(NULL)); - SPK::System::setClampStep(true, 0.1f); // clamp the step to 100 ms - SPK::System::useAdaptiveStep( - 0.001f, - 0.01f); // use an adaptive step from 1ms to 10ms (1000fps to 100fps) - - SPKinitialized = true; - } -} - -ParticleSystemWrapper::~ParticleSystemWrapper() { - if (particleSystem) delete particleSystem; - if (particleModel) delete particleModel; - if (emitter) delete emitter; - if (zone) delete zone; - if (group) delete group; - if (renderer) delete renderer; -} - -void ParticleSystemWrapper::Init(const ParticleSystemWrapper& other) { - textureParticle = other.textureParticle; - if (particleSystem) delete particleSystem; - if (particleModel) delete particleModel; - if (emitter) delete emitter; - if (zone) delete zone; - if (group) delete group; - if (renderer) delete renderer; - - // Don't initialize members if the other object's member are NULL. - if (other.particleModel == NULL) return; - - particleModel = new SPK::Model(*other.particleModel); - - zone = new SPK::Sphere(*other.zone); - emitter = new SPK::SphericEmitter(*other.emitter); - emitter->setZone(zone); - - group = new SPK::Group(*other.group); - group->setModel(particleModel); - group->removeEmitter(other.emitter); - group->addEmitter(emitter); - - particleSystem = new SPK::System(*other.particleSystem); - particleSystem->removeGroup(other.group); - particleSystem->addGroup(group); -} diff --git a/Extensions/ParticleSystem/ParticleSystemWrapper.h b/Extensions/ParticleSystem/ParticleSystemWrapper.h deleted file mode 100644 index 12dbc954a..000000000 --- a/Extensions/ParticleSystem/ParticleSystemWrapper.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - -GDevelop - Particle System Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PARTICLESYSTEMWRAPPER_H -#define PARTICLESYSTEMWRAPPER_H - -#include -class SFMLTextureWrapper; - -namespace SPK { -class System; -class Model; -class SphericEmitter; -class Sphere; -class Group; -namespace GL { -class GLRenderer; -} -} // namespace SPK - -/** - * Wrapper around SPARK related stuff. - * This class gives direct access to these stuff, - * it only manages the destruction and automatize the copy behaviour. - */ -class GD_EXTENSION_API ParticleSystemWrapper { - public: - ParticleSystemWrapper(); - virtual ~ParticleSystemWrapper(); - ParticleSystemWrapper( - const ParticleSystemWrapper& other) // What a bad design - { - particleSystem = NULL; - particleModel = NULL; - emitter = NULL; - zone = NULL; - group = NULL; - renderer = NULL; - Init(other); - }; - ParticleSystemWrapper& operator=(const ParticleSystemWrapper& other) { - if (&other != this) Init(other); - - return *this; - } - - SPK::System* particleSystem; - SPK::Model* particleModel; - SPK::SphericEmitter* emitter; - SPK::Sphere* zone; - SPK::Group* group; - SPK::GL::GLRenderer* renderer; - std::shared_ptr textureParticle; - - private: - void Init(const ParticleSystemWrapper& other); - - static bool SPKinitialized; -}; - -#endif // PARTICLESYSTEMWRAPPER_H diff --git a/Extensions/ParticleSystem/SPARK/Version.txt b/Extensions/ParticleSystem/SPARK/Version.txt deleted file mode 100644 index 0bed78be6..000000000 --- a/Extensions/ParticleSystem/SPARK/Version.txt +++ /dev/null @@ -1 +0,0 @@ -SPARK-1.5.5 \ No newline at end of file diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_ArrayBuffer.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_ArrayBuffer.h deleted file mode 100644 index e09ad1655..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_ArrayBuffer.h +++ /dev/null @@ -1,171 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_ARRAYBUFFER -#define H_SPK_ARRAYBUFFER - -#include "Core/SPK_Buffer.h" - -namespace SPK -{ - class Group; - template class ArrayBufferCreator; - - /** - * @brief A template buffer that holds an array of elements of type T - * @since 1.03.02 - */ - template - class ArrayBuffer : public Buffer - { - friend class ArrayBufferCreator; - - public : - - /** - * @brief Gets the starting address of the inner array - * @return the starting address of the first element of the inner array - */ - T* getData() const; - - /** - * @brief Gets the number of elements for a single particle - * @return the number of elements for a single particle - */ - const size_t getParticleSize() const; - - /** - * @brief Gets the total number of T in the inner array - * The value is equal to particleSize * nbParticles. - * @return the total number of T in the inner array - */ - size_t getDataSize() const; - - private : - - T* data; - - size_t particleSize; - size_t dataSize; - - ArrayBuffer(size_t nbParticles,size_t particleSize); - ArrayBuffer(const ArrayBuffer& buffer); - virtual ~ArrayBuffer(); - - virtual void swap(size_t index0,size_t index1); - }; - - /** - * @brief Template class to create an ArrayBuffer - * @since 1.03.02 - */ - template - class ArrayBufferCreator : public BufferCreator - { - public : - - /** - * @brief Constructor of ArrayBuffer - * @param particleSize : the number of elements per particle in the buffer to be created - */ - ArrayBufferCreator(size_t particleSize); - - private : - - size_t particleSize; - - virtual ArrayBuffer* createBuffer(size_t nbParticles,const Group& group) const; - }; - - // Typedefs - /** @brief A buffer storing an array of floats */ - typedef ArrayBuffer FloatBuffer; - /** @brief the buffer creator of the float buffer */ - typedef ArrayBufferCreator FloatBufferCreator; - - - template - ArrayBuffer::ArrayBuffer(size_t nbParticles,size_t particleSize) : - Buffer(), - dataSize(nbParticles * particleSize), - particleSize(particleSize) - { - data = new T[dataSize]; - } - - template - ArrayBuffer::ArrayBuffer(const ArrayBuffer& buffer) : - Buffer(buffer), - dataSize(buffer.dataSize), - particleSize(buffer.particleSize) - { - data = new T[dataSize]; - std::memcpy(data,buffer.data,dataSize * sizeof(T)); - } - - template - ArrayBuffer::~ArrayBuffer() - { - delete[] data; - } - - template - inline T* ArrayBuffer::getData() const - { - return data; - } - - template - inline const size_t ArrayBuffer::getParticleSize() const - { - return particleSize; - } - - template - inline size_t ArrayBuffer::getDataSize() const - { - return dataSize; - } - - template - void ArrayBuffer::swap(size_t index0,size_t index1) - { - T* address0 = data + index0 * particleSize; - T* address1 = data + index1 * particleSize; - for (size_t i = 0; i < particleSize; ++i) - std::swap(address0[i],address1[i]); - } - - template - ArrayBufferCreator::ArrayBufferCreator(size_t particleSize) : - BufferCreator(), - particleSize(particleSize) - {} - - template - ArrayBuffer* ArrayBufferCreator::createBuffer(size_t nbParticles,const Group& group) const - { - return new ArrayBuffer(nbParticles,particleSize); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Buffer.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Buffer.h deleted file mode 100644 index edf0041cf..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Buffer.h +++ /dev/null @@ -1,131 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_BUFFER -#define H_SPK_BUFFER - -namespace SPK -{ - class Particle; - class Group; - - /** - * @brief An abstract class that defines the interface for the additional buffers of Group - * - * A buffer allows a Group to hold additional data.
- * Typically, they are used for rendering as the GPU or the rendering engine needs data to be organized in a specific way.
- *
- * Their use can be extended to anything to store data within a group.
- * Buffers can also be swapped as particles are swap within a group. This allows to have the ordering of data consistent with the ordering of particles.
- * However, if the buffers are only used for temporary storage on a single frame (most of the renderers), it is not necessary to swap the data.
- *
- * A buffer also contains a flag which is an unsigned integer that can be used to check the validity of the buffer from frame to frame.
- *
- * Note that only a group can create and delete a buffer. The user can ask a group to create a new buffer by passing a BufferCreator object to it.
- * Check out the group interface about buffers for more info. - * - * @since 1.03.02 - */ - class Buffer - { - friend class BufferCreator; - friend class Group; - friend void swapParticles(Particle& a,Particle& b); - - public : - - /** - * @brief Gets the current flag of this buffer - * @return the current flag of this buffer - */ - unsigned int getFlag() const; - - /** - * @brief Tells whether data is swapped as particles in the group are swapped - * @return true if data must be swapped with particles, false if not - */ - bool isSwapEnabled() const; - - protected : - - Buffer() {}; - virtual ~Buffer() {}; - - private : - - unsigned int flag; - bool swapEnabled; - - /** - * @brief Swaps 2 particles data in this buffer - * - * This is a pure virtual method that must be implemented by inherited classes of buffer. - * - * @param index0 : the index of the first particle to swap - * @param index1 : the index of the second particle to swap - */ - virtual void swap(size_t index0,size_t index1) = 0; - }; - - /** - * @brief A class used by a Group to create an additional Buffer - * - * This class defines a temporary object to pass to a Group so that it can create and store a new buffer. - * Check out the method Group::createBuffer(const std::string&,const BufferCreator&,unsigned int,bool) for more information. - * - * @since 1.03.02 - */ - class BufferCreator - { - friend class Group; - - protected : - - virtual ~BufferCreator() {} - - private : - - /** - * @brief Creates a new buffer - * - * This method is called internally by a group to create and store an new buffer.
- * This is a pure virtual method that must be implemented by inherited classes of buffer. - * - * @param nbParticles : the number of particles the buffer must be able to store - * @param group : the group which contains the buffer - */ - virtual Buffer* createBuffer(size_t nbParticles,const Group& group) const = 0; - }; - - - inline unsigned int Buffer::getFlag() const - { - return flag; - } - - inline bool Buffer::isSwapEnabled() const - { - return swapEnabled; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_BufferHandler.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_BufferHandler.h deleted file mode 100644 index 198240acc..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_BufferHandler.h +++ /dev/null @@ -1,146 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_BUFFERHANDLER -#define H_SPK_BUFFERHANDLER - -#include "Core/SPK_DEF.h" - - -namespace SPK -{ - class Group; - - /** - * @class BufferHandler - * @brief A base interface that allows manipulation on Buffer - * @since 1.04.00 - */ - class SPK_PREFIX BufferHandler - { - public : - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of BufferHandler */ - virtual ~BufferHandler() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Enables or disables the automatic buffers creation in a static way - * - * By default, the buffers creation is enabled. - * - * @param creation : true to enable the buffers creation, false to disable it - */ - static void enableBuffersCreation(bool creation); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether the automatic buffers creation is enabled or not - * @return true if the buffers creation is enabled, false if it is disabled - */ - static bool isBuffersCreationEnabled(); - - /////////////// - // Interface // - /////////////// - - /** - * @brief Creates the buffers for this buffer handler in the given group - * - * If the buffers for this type of buffer handler already exists within the Group, they are priorly destroyed.
- * The type of buffers created depends on the state of the buffer handler at the time this method is called.
- *
- * This method has to be overridden in derived classes that use buffers - * - * @param group : the Group in which to create the buffers for this buffer handler - */ - virtual void createBuffers(const Group& group) {}; - - /** - * @brief Destroys the buffers for this buffer handler in the given group - * - * if the buffers dont exist, nothing happens.
- *
- * This method has to be overridden in derived classes that use buffers - * - * @param group : the Group in which to destroy the buffers for this buffer handler - */ - virtual void destroyBuffers(const Group& group) {}; - - - protected : - - // The constructor is private so that the class is not instanciable - BufferHandler() {} - - /** - * @brief prepares the buffers of the given Group for processing - * - * Internally, this methods perfoms the following operations :

-		* if check buffers is false
-		*	if buffers creation is enabled
-		*		destroy buffers
-		*		create buffers
-		*		return true
-		*	else return false
-		* else return true
-		* 
- * - * @param group : the group whose buffers must be prepared - * @return true if the buffers are ready, false if not - */ - bool prepareBuffers(const Group& group); - - /** - * @brief checks the buffers and prepare them - * - * This method has to be implemented in derived class that uses buffers.
- * true must be returned if the buffers are found and initialized, false otherwise. - * - * @param group : the group in which to check the buffers - * @return true if buffers are ready, false otherwise - */ - virtual bool checkBuffers(const Group& group); - - private : - - static bool bufferCreation; - }; - - - inline bool BufferHandler::checkBuffers(const Group& group) - { - return true; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_DEF.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_DEF.h deleted file mode 100644 index 9d0a832b8..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_DEF.h +++ /dev/null @@ -1,158 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_DEF -#define H_SPK_DEF - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// 1.02.02 Compatibility with older versions -#ifdef SPK_DLL -#define SPK_CORE_IMPORT -#endif - -#ifdef SPK_CORE_EXPORT -#define SPK_PREFIX __declspec(dllexport) -#elif defined(SPK_IMPORT) || defined(SPK_CORE_IMPORT) -#define SPK_PREFIX __declspec(dllimport) -#else -#define SPK_PREFIX -#endif - -#ifdef _MSC_VER -#pragma warning(disable : 4251) // disables the warning about exporting STL classes in DLLs -#endif - -// Trace for debugging -//#define SPK_DEBUG - -#ifdef SPK_DEBUG -#define SPK_TRACE(text) std::cout << text << std::endl; -#else -#define SPK_TRACE(text) -#endif - -/** -* @mainpage SPARK Particle Engine -* -* SPARK is an open source library allowing to easily implement full particle systems in C++ applications.
-*
-* SPARK has been designed to be : -*
    -*
  • user friendly and easy to implement
  • -*
  • very configurable and as complete as possible
  • -*
  • evolving and upgradable by users
  • -*
  • portable and library free (it only uses the standard library)
  • -*
-*
-* @section intro_sec Global Description -* in SPARK, a SPK::System is a collection of Groups of Particles. -* A SPK::Group contains a SPK::Pool of Particles and defines an complete universe for Particle evolution. -* This universe holds 3 types of physical objects : -*
    -*
  • the Emitters : an SPK::Emitter is an object that generates Particles
  • -*
  • the Modifiers : a SPK::Modifier is an object that will modify Particles behavior
  • -*
  • the Particles themselves : a SPK::Particle is a point that will follow physical laws and will be given some parameters that will evolve from their birth to their death.
  • -*
-* Those parameters are defined by a SPK::Model of Particles.
-* The Emitters and Modifiers are physical entities whose body is represented by a SPK::Zone.
-* A SPK::Vector3D is the primitive object used in SPARK to represents triplets of coordinates in a universe 3D.
-*
-* Finally a system/groups can be renderered using a SPK::Renderer. -*/ - -/** -* @namespace SPK -* @brief the namespace for the whole SPARK library -*/ -namespace SPK -{ - /** @brief the random seed for the pseudo random numbers generation (1 by default) */ - extern SPK_PREFIX unsigned int randomSeed; - - /** - * @brief Returns a random number in the range [min,max[ - * - * Note that the sequence of pseudo random number generated depends on the initial seed which can be set by setting randomSeed.
- * - * @param min : the minimum value - * @param max : the maximum value - * - * @return a random number within [min,max[ - */ - template - T random(T min,T max) - { - // optimized standard minimal - long tmp0 = 16807L * (randomSeed & 0xFFFFL); - long tmp1 = 16807L * (randomSeed >> 16); - long tmp2 = (tmp0 >> 16) + tmp1; - tmp0 = ((tmp0 & 0xFFFF)|((tmp2 & 0x7FFF) << 16)) + (tmp2 >> 15); - - // correction of the error - if ((tmp0 & 0x80000000L) != 0) - tmp0 = (tmp0 + 1) & 0x7FFFFFFFL; - - randomSeed = tmp0; - - // find a random number in the interval - return static_cast(min + ((randomSeed - 1) / 2147483646.0) * (max - min)); - } - - ///////////////////////// - // global enumerations // - ///////////////////////// - - /** - * @enum ModelParam - * @brief Constants for the Model parameters - */ - enum ModelParam - { - PARAM_RED = 0, /**< The red component of the Particle */ - PARAM_GREEN = 1, /**< The green component of the Particle */ - PARAM_BLUE = 2, /**< The blue component of the Particle */ - PARAM_ALPHA = 3, /**< The alpha component of the Particle */ - PARAM_SIZE = 4, /**< The size of the Particle */ - PARAM_MASS = 5, /**< The mass of the Particle */ - PARAM_ANGLE = 6, /**< The angle of the texture of the Particle */ - PARAM_TEXTURE_INDEX = 7, /**< the index of texture of the Particle */ - PARAM_ROTATION_SPEED = 8, /**< the rotation speed of the particle (must be used with a rotator modifier) */ - PARAM_CUSTOM_0 = 9, /**< Reserved for a user custom parameter. This is not used by SPARK */ - PARAM_CUSTOM_1 = 10, /**< Reserved for a user custom parameter. This is not used by SPARK */ - PARAM_CUSTOM_2 = 11, /**< Reserved for a user custom parameter. This is not used by SPARK */ - }; -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Emitter.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Emitter.h deleted file mode 100644 index 810dbeca5..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Emitter.h +++ /dev/null @@ -1,364 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_EMITTER -#define H_SPK_EMITTER - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Transformable.h" -#include "Core/SPK_Zone.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - class Group; - class Particle; - - - /** - * @class Emitter - * @brief An abstract class that defines an emitter of particles - * - * - * An Emitter is an object that will launch particles by giving them a velocity and a position.
- * the position is derived from the Zone of the Emitter.
- * the velocity is derived from the Emitter itself.
- *
- * An Emitter has a flow and a tank of particles. - * The flow defines the rate at which particles are launched and the tank defines the total number of Particles the Emitter can launched.
- * Note that the flow and the tank of an Emitter are only used when the Emitter emits automatically from a Group - * but the user can also emit manually outside a Group. - */ - class SPK_PREFIX Emitter : public Registerable, public Transformable - { - friend class Group; - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of Emitter */ - Emitter(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Emitter */ - virtual ~Emitter() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets this Emitter active or not. - * - * An inactive Emitter will not emit in its parent Group during update.
- * However it can still be used manually by the user. - * - * @param active : true to activate this Emitter, false to deactivate it - * @since 1.05.00 - */ - void setActive(bool active); - - /** - * @brief Sets the number of particles in this Emitter's tank - * - * Each time the Emitter is updated, the number of particles emitted is deduced from the Emitter tank. - * When the tank reaches 0, the Emitter will not emit any longer until it is refilled.
- *
- * A number of -1 (or any negative number) means the Emitter has an infinite tank which will never be empty. - * - * @param tank : the number of particles in this Emitters's tank - */ - void setTank(int tank); - - /** - * @brief Changes the number of particles in this Emitters's tank - * - * The new number of particles in the tank is equal to : number of particles in the tank + n.
- * This method has no effect for Emitters with infinite tank (a negative number of particles) and an Emitter cannot become infinite with this method (the new number is clamped to 0). - * - * @param deltaTank : the number to add to the current tank - */ - void changeTank(int deltaTank); - - /** - * @brief Sets the flow of this Emitter - * - * The flow is in the unit : nb of particle per step. - * A flow of -1 (or any negative number) indicates an infinite flow which means all particles in the Emitters(s tank are generated instantly.
- * Note that if both the flow and the tank are infinite, nothing will happen. - * - * @param flow : the flow of this Emitter - */ - void setFlow(float flow); - - /** - * @brief Changes the flow of particles of this Emitter - * - * The new flow is equal to : flow of the Emitter + deltaFlow.
- * This method has no effect for Emitters with infinite flow (a negative flow of particles) and an Emitter's flow cannot become infinite with this method (the new flow is clamped to 0). - * - * @param deltaFlow : the number to add to the current flow - */ - void changeFlow(float deltaFlow); - - /** - * @brief Sets the force of this Emitter - * - * The force of the Emitter vary for each launch of a Particle between a minimum and a maximum. - * To have a fixed force for the Emitter, just have min = max.
- *
- * the speed at which a Particle will be launched is equal to : force / weight of the Particle. - * - * @param min : the minimum force of the Emitter - * @param max : the maximum force of the Emitter - */ - void setForce(float min,float max); - - /** - * @brief Sets the Zone of this Emitter - * - * If the Zone is NULL, the default Zone will be used (A Point centered at the origin) - * - * @param zone : the Zone of this Emitter - * @param full : true to generate particles in the whole Zone, false to generate particles only at the Zone borders. - */ - void setZone(Zone* zone,bool full = true); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether this Emitter is active or not - * @return true if this Emitter is active, false if is is inactive - * @since 1.05.00 - */ - bool isActive() const; - - /** - * @brief Gets the number of particles in this Emitter's tank - * @return the number of particles in this Emitters's tanl - */ - int getTank() const; - - /** - * @brief Gets the flow of this Emitter - * @return the flow of this Emitter - */ - float getFlow() const; - - /** - * @brief Gets the minimum force of this Emitter - * @return the minimum force of this Emitter - */ - float getForceMin() const; - - /** - * @brief Gets the maximum force of this Emitter - * @return the maximum force of this Emitter - */ - float getForceMax() const; - - /** - * @brief Gets the Zone of this Emitter - * @return the Zone of this Emitter - */ - Zone* getZone() const; - - /** - * @brief Tells whether this Emitter emits in the whole Zone or only at its borders - * @return true if this EMitter emits in the whole Zone, false if it is only at its borders - */ - bool isFullZone() const; - - /** - * @brief Tells whether this Emitter is sleeping or not - * - * An Emitter is considered as sleeping if his flow or his tank is equal to 0. - * - * @return true if this Emitter is sleeping, false if it is active - * @since 1.03.00 - */ - bool isSleeping() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Emits a Particle from this Emitter - * - * The Particle's velocity is updated with a call to generateVelocity(Particle&).
- * The Particle's position is updated with a call to Zone::generatePosition(Particle&) of the Emitter's Zone.
- * - * Note that this will not decrease the number of particles in the Emitter's tank. - * To do it, the user has to manually make a call to changeNumber(-1) after this call. - * - * @param particle : the Particle to emit from this Emitter - */ - void emit(Particle& particle) const; - - /** - * @brief Generates the velocity of the Particle - * - * The velocity of the Particle is updated in function of the Emitter's nature and parameters.
- * Unlike emit() the position of the Particle remains unchanged. - * - * @param particle : the Particle whose velocity has to be updated - */ - void generateVelocity(Particle& particle) const; - - virtual Registerable* findByName(const std::string& name); - - protected : - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool createBase); - virtual void destroyChildren(bool keepChildren); - - virtual void propagateUpdateTransform(); - - private : - - Zone* zone; - bool full; - - bool active; - - int tank; - float flow; - - float forceMin; - float forceMax; - - mutable float fraction; - - static Zone& getDefaultZone(); - - unsigned int updateNumber(float deltaTime); - - ///////////////////////// - // pure virtual method // - ///////////////////////// - - /** - * @brief A pure virtual method that generates the velocity of the Particle in function of a speed - * - * This is a pure virtual method to be implemented by children.
- *
- * the Particle velocity has to be set by this method.
- * the generated velocity of the Particle must have a norm equal to speed. - * - * @param particle : the Particle whose velocity has to be generated - * @param speed : the speed that the velocity must have - */ - virtual void generateVelocity(Particle& particle,float speed) const = 0; - }; - - - inline void Emitter::setActive(bool active) - { - this->active = active; - } - - inline void Emitter::setTank(int tank) - { - this->tank = tank; - } - - inline void Emitter::setFlow(float flow) - { - this->flow = flow; - } - - inline void Emitter::setForce(float min,float max) - { - forceMin = min; - forceMax = max; - } - - inline bool Emitter::isActive() const - { - return active; - } - - inline int Emitter::getTank() const - { - return tank; - } - - inline float Emitter::getFlow() const - { - return flow; - } - - inline float Emitter::getForceMin() const - { - return forceMin; - } - - inline float Emitter::getForceMax() const - { - return forceMax; - } - - inline Zone* Emitter::getZone() const - { - return zone; - } - - inline bool Emitter::isFullZone() const - { - return full; - } - - inline bool Emitter::isSleeping() const - { - return ((tank == 0)||(flow == 0.0f)); - } - - inline void Emitter::emit(Particle& particle) const - { - zone->generatePosition(particle,full); - generateVelocity(particle); - } - - inline void Emitter::generateVelocity(Particle& particle) const - { - generateVelocity(particle,random(forceMin,forceMax) / particle.getParamCurrentValue(PARAM_MASS)); - } - - inline void Emitter::propagateUpdateTransform() - { - zone->updateTransform(this); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Factory.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Factory.h deleted file mode 100644 index fac1c1c44..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Factory.h +++ /dev/null @@ -1,291 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_FACTORY -#define H_SPK_FACTORY - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" - - -/** -* @def SPK_Copy(ClassName,arg) -* @brief Creates a new registered object from an existing one -* -* This macro is simply a shortcut call to :
-* dynamic_cast(SPK::SPKFactory::getInstance().create(arg)
-* with arg being either an SPK_ID or a pointer to an object and ClassName being the class of the object.
-*
-* If the ID does not exist or the object is not registered, NULL is returned.
-*
-* Note that a bad_cast exception can be throw as there is a dynamic_cast call. -* -* @since 1.03.00 -*/ -#define SPK_Copy(ClassName,arg) \ -dynamic_cast(SPK::SPKFactory::getInstance().copy(arg)) - -/** -* @def SPK_Get(ClassName,ID) -* @brief Gets a registered object -* -* This macro is simply a shortcut call to :
-* dynamic_cast(SPK::SPKFactory::getInstance().get(ID)
-*
-* If the ID does not exist, NULL is returned.
-*
-* Note that a bad_cast exception can be throw as there is a dynamic_cast call. -* -* @since 1.03.00 -*/ -#define SPK_Get(ClassName,ID) \ -dynamic_cast(SPK::SPKFactory::getInstance().get(ID)) - -/** -* @def SPK_Copy(arg) -* @brief Destroys a registered object -* @since 1.03.00 -*/ -#define SPK_Destroy(arg) \ -SPK::SPKFactory::getInstance().destroy(arg) - -/** -* @def SPK_Create(object) -* @brief Creates a registered object -* @since 1.03.00 -*/ -#define SPK_Create(object) \ -SPK::SPKFactory::getInstance().create(object) - -namespace SPK -{ - /** - * @class SPKFactory - * @brief A singleton class that allows to easily define, create, destroy and organize SPARK objects (Registerable) - * - * A Registerable can either be registered or not. A Registerable created with the SPKFactory becomes registered : - * it is given a unique ID and is stored within a map in the SPKFactory.
- *
- * the SPKFactory allows the correct copy of a Registerable with all its children Registerable. Children registerable are only copied - * within the given Registerable if they are not shared (see Registerable) else only the reference to the shared Registerable is copied
- *
- * Moreover, destruction of Registerable and all children is very easy with the factory. Destroying a Registerable will destroy and all its - * children which are destroyable and only referenced within the Registerable being destroyed.
- * Note that the process is recursive through the tree, so destroyable children of destroyable children will be destroyed as well and so on.
- *
- * 4 main actions are performed by the SPKFactory : - *
    - *
  • Create a registered Registerable : This is performed with create(const Registerable&). the passed Registerable is used to create a registered Registerable - * which is an exact copy. Every elements will be copied even the shared ones. The base Registerable can be registered or not.
  • - *
  • Copy a registered Registerable : This is performed with copy(SPK_ID) or copy(const Registerable*). A registered copy of the registered Registerable is created. - * The shared children are only referenced while the not shared ones are copied as well. The same happens for children of children and so on.
  • - *
  • Destroy a registered Registerable : This is performed with destroy(SPK_ID,bool) or destroy(Registerable*,bool). The Registerable and all its destroyable - * registered children will be destroyed. The tree is parsed to destroy children of children and so on. the boolean tells whether to check the number of - * references of children or not.
  • - *
  • Gets a registered Registerable from its ID. This is performed with get(SPK_ID). Every registered Registerable is stored in a map. The user can retrieve - * the address of the Registerable with its ID (if the ID exists in the map).
  • - *
- * Note that macros are implemented to ease the syntax : - *
    - *
  • SPK_Create(object)
  • - *
  • SPK_Copy(ClassName,arg)
  • - *
  • SPK_Get(ClassName,arg)
  • - *
  • SPK_Destroy(arg)
  • - *
- * - * @since 1.03.00 - */ - class SPK_PREFIX SPKFactory - { - friend class Registerable; - - public : - - /** - * @brief Returns the unique instance of the SPKFactory - * @return the unique instance of the SPKFactory - */ - static SPKFactory& getInstance(); - - static void destroyInstance(); - - /** - * @brief Returns the number of Regiterable objects registered in the SPKFactory - * @return the number of Regiterable objects registered in the SPKFactoty - */ - size_t getNbObjects() const; - - /** - * @brief Creates a registered Registerable from the passed Registerable - * @param base : The Registerable to create the new registered Registerable from - * @return the ID of the new registered object - */ - SPK_ID create(const Registerable& base); - - /** - * @brief Creates a new Registerable object which is a copy of the object at the given ID - * - * If no Registerable with this ID is registered, NULL is returned. - * - * @param ID : the ID of the Registerable to copy - * @return a registered copy of the Registerable or NULL if the passed ID is not registered - */ - Registerable* copy(SPK_ID ID); - - /** - * @brief Creates a new Registerable object which is a copy of the object - * - * If the passed Registerable is NULL or not registered, NULL is returned.
- * Note that this function call internally copy(registerable->getSPKID()). - * - * @param registerable : the registered Registerable to copy - * @return a registered copy of the Registerable or NULL if the passed object is not registered - */ - Registerable* copy(const Registerable* registerable); - - /** - * @brief Gets the Registerable of the given ID - * - * If the ID is not registered, NULL is returned - * - * @param ID : the ID of the Registerable to get - * @return the Registerable with the passed ID or NULL if the ID is not registered - */ - Registerable* get(SPK_ID ID); - - /** - * @brief Destroys the Registerable with the given ID and all its destroyable children - * - * If the ID is not registered, nothing is destroyed and false is returned.
- *
- * The checkNbReferences boolean tells the factory if the number of references of the Registerable to be destroyed - * has to be checked.
- * If set to true, the Registerable will be destroyed only if the number or references within the SPKFactory - * (ie in all registered object in the SPKFactory) is 0.
- * If set to false, the Registerable will be destroyed in any case. Meaning that any reference within the SPKFactory - * becomes invalid. - * - * @param ID : the ID of the Registerable to destroy - * @param checkNbReferences : true to destroy only a Registerable with no references in the SPKFactory (safer), false not to perform the check - * @return true if the Registerable has been deleted, false if not - */ - bool destroy(SPK_ID ID,bool checkNbReferences = true); - - /** - * @brief Destroys the Registerable and all its destroyable children - * - * If the Registerable is NULL or is not registered, nothing is destroyed and false is returned.
- * Note that this function call internally destroy(registerable->getSPKID()).
- *
- * see destroy(SPK_ID,bool) for more information. - * - * @param registerable the Registerable to destroy - * @param checkNbReferences : true to destroy only a Registerable with no references in the SPKFactory (safer), false not to perform the check - * @return true if the Registerable has been deleted, false if not - */ - bool destroy(Registerable* registerable,bool checkNbReferences = true); - - /** @brief Destroys all the registered Registerable in the SPKFactory */ - void destroyAll(); - - /** - * @brief Trace information on the Registerable with the given ID - * @param ID : the ID of the Registerable to trace - */ - void trace(SPK_ID ID); - - /** - * @brief Trace information on the Registerable - * - * Note that this function call internally trace(registerable->getSPKID()). - * - * @param registerable : the Registerable to trace - */ - void trace(const Registerable* registerable); - - /** @brief Trace information on all the registered Registerable within the SPKFactory */ - void traceAll(); - - /** - * @brief Finds a registerable by name in the factory - * - * Note that this method only checks registerables in the SPKFactory.
- * This method does not call the Registerable::findByName(const string&) of the registerables to check recursively. - * - * @param name : the name of the registerable to find in the factory - * @return the first registerable with that name or NULL of none is found - * @since 1.05.00 - */ - Registerable* findByName(const std::string& name); - - private : - - static SPKFactory* instance; - static SPK_ID currentID; - - std::map SPKRegister; - std::map SPKAdresses; - - void traceObject(const std::map::iterator& it,bool nextLine); - - bool isAlreadyProcessed(const Registerable* source); - Registerable* getProcessedObject(const Registerable* source); - void markAsProcessed(const Registerable* source,Registerable* object); - - Registerable* registerObject(Registerable* object); - void unregisterObject(std::map::iterator& it,bool keepChildren = false); - bool unregisterObject(SPK_ID ID,bool keepChildren = false); - - // private constructors - SPKFactory(){}; - SPKFactory(const SPKFactory&){}; - ~SPKFactory(){this->destroyAll();} - -#ifdef SPK_DEBUG - size_t nbAlloc; - size_t nbDesalloc; -#endif - }; - - - inline size_t SPKFactory::getNbObjects() const - { - return SPKRegister.size(); - } - - inline bool SPKFactory::isAlreadyProcessed(const Registerable* source) - { - return SPKAdresses.find(source) != SPKAdresses.end(); - } - - inline Registerable* SPKFactory::getProcessedObject(const Registerable* source) - { - return SPKAdresses.find(source)->second; - } - - inline void SPKFactory::markAsProcessed(const Registerable* source,Registerable* object) - { - SPKAdresses.insert(std::pair(source,object)); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Group.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Group.h deleted file mode 100644 index 5be552b8c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Group.h +++ /dev/null @@ -1,1061 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GROUP -#define H_SPK_GROUP - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Transformable.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Pool.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - class Renderer; - class Emitter; - class Modifier; - class Zone; - class Model; - class Buffer; - class BufferCreator; - - /** - * @class Group - * @brief A group of many particles - * - * A Group is the structure the user will interact with the most to build up a full Particle System.
- * More than only storing many particles, a Group also defines and entire environment for Particle generation and Evolution.
- *
- * This class is the spine of the SPARK engine. - */ - class SPK_PREFIX Group : public Registerable, public Transformable - { - friend class Renderer; - friend class Particle; - friend void swapParticles(Particle& a,Particle& b); - - SPK_IMPLEMENT_REGISTERABLE(Group) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor for a Group - * - * A Group is constructed with a Model (if NULL, the default Model will be used to generate particles). - * This Model will be used to handle Particle's generation and evolution within the Group.
- *
- * A Group also needs a maximum capacity which is the maximum number of particles the Group can handle. This is necessary to reserve some memory space. - * Note that the capacity can be changed by calling reallocate(unsigned int). - * By default, the capacity is set to Pool::DEFAULT_CAPACITY. - * - * @param model : the Model of this Group - * @param capacity : The maximum number of particles of this Group - */ - Group(Model* model = NULL,size_t capacity = Pool::DEFAULT_CAPACITY); - - /** - * @brief Copy Constructor of Group - * @param group : the Group to construct the new Group from - */ - Group(const Group& group); - - /** - * @brief Creates and registers a new Group - * @param model : the Model of this Group - * @param capacity : The maximum number of particles of this Group - * @return A new registered Group - * @since 1.04.00 - */ - static Group* create(Model* model = NULL,size_t capacity = Pool::DEFAULT_CAPACITY); - - //////////////// - // Destructor // - //////////////// - - /** @brief The destructor of Group */ - ~Group(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief change the Model of this Group - * - * If the model parameter is set to NULL, the default model will be used. No changes are done if the model parameter is equal - * to the Model of this Group. Changing the Model of this Group will empty it. - * - * @param model : the Model of this Group - */ - void setModel(Model* model); - - /** - * @brief Sets the Renderer of this Group - * - * If the Renderer is set to NULL, the particles of the Group will not be renderered with a call to render().
- *
- * Note that if the bufferManagement is on (see enableBuffersManagement(bool)), setting the Renderer will first - * destroys the buffers needed for the previous Renderer held by this Group and create buffers needed for the new Renderer. - * - * @param renderer : the Renderer of this Group - */ - void setRenderer(Renderer* renderer); - - /** - * @brief Sets the friction of this Group - * - * The friction defines the way particles are accelerated or decelerated in their environment.
- *
    - *
  • If the friction is 0.0f, particles in the Group are neither accelerated nor decelerated (it is the default setting).
  • - *
  • If the friction is positive, particles will be decelerated function of their speed.
  • - *
  • If the friction is negative, particles will be accelerated function of their speed.
  • - *
- * The friction is applied on each Particle as followed :
- * velocity *= 1 - min(1,friction * deltaTime / weight)
- *
- * Note that the lighter the Particle, the more effect has the friction on it. - * - * @param friction the friction of the Group - */ - void setFriction(float friction); - - /** - * @brief Sets the gravity of this Group - * - * The gravity is a vector which defines an attractive force that will be applied to each Particle in the Group during the update.
- * By default the gravity is the null vector (i.e. a Vector3D equal to (0,0,0)) which means no gravity is applied.
- *
- * The gravity is applied on each Particle as followed :
- * velocity += gravity * deltaTime
- * - * @param gravity : the Vector3D that will be used as the gravity for this Group - */ - void setGravity(const Vector3D& gravity); - - /** - * @brief Assigns a callback for the custom update - * - * The user has the possibility to assign a callback function for update that will be called for each Particle right after the standard update.
- * The signature of the function must be of the form :
- * bool customUpdate(Particle&,unsigned int)
- * with : - *
    - *
  • Particle& being the Particle which is currently updated
  • - *
  • float being the time step
  • - *
  • the return bool being true if the Particle has to die at the end of the update, false otherwise
  • - *
- * - * @param fupdate : A pointer to the callback function that will perform custom update for this Group - */ - void setCustomUpdate(bool (*fupdate)(Particle&,float)); - - /** - * @brief Assigns a callback for custom birth - * - * This method allows to assign a callback function that will be called each time a Particle borns.
- * The signature of the function must be of the form :
- * void customUpdate(Particle&)
- * with Particle& being the Particle which is just born. - * - * @param fbirth : A pointer to the callback function that will perform custom birth for this Group - */ - void setCustomBirth(void (*fbirth)(Particle&)); - - /** - * @brief Assigns a callback for custom death - * - * This method allows to assign a callback function that will be called each time a Particle dies.
- * The signature of the function must be of the form :
- * void customUpdate(Particle&)
- * with Particle& being the Particle which has just died. - * - * @param fdeath : A pointer to the callback function that will perform custom death for this Group - */ - void setCustomDeath(void (*fdeath)(Particle&)); - - /** - * @brief Enables or disables the sorting of particles - * - * The sorting is performed from particles further to the camera to particles closer to the camera.
- * Sorting particles allows to well draw particles with alpha.
- *
- * If the sorting is enabled/disabled, the distance computation is enabled/disabled as well.
- *
- * Note that sorting a Group is a computationnaly expensive operation that should be avoided when possible. - * - * @param sort : true to enable the sorting of particles, false otherwise - */ - void enableSorting(bool sort); - - /** - * @brief Enables or disables the computation of the distance of a Particle from the camera - * - * The distance computation happens at each call to update(unsigned int).
- * The distance of a Particle from the camera can be gotten with a call to Particle::getDistanceFromCamera() or Particle::getSqrDistanceFromCamera()
- *
- * Note that the distance is defined by the difference vector between the Particle and the the camera set with System::setCameraPosition(Vector3D&).
- *
- * If the distance computation is disabled, then the sorting of particles is disabled as well. - * - * @param distanceComputation : true to enable the computation of the camera distance, false not to - * @since 1.01.00 - */ - void enableDistanceComputation(bool distanceComputation); - - /** - * @brief Enables or disables the computation of the axis aligned bouding box of the Group - * - * if the computing of the AABB is enabled, after each call to update(unsigned int), 2 Vector3D are updated with the coordinates information of the AABB. - * Those Vector3D can be gotten with getAABBMin() and getAABBMax() which give respectively the minimum and maximum coordinates of the bounding box in each axis.
- *
- * Knowing the AABB of a Group of particles can be useful in some case like frustum culling for instance.
- *
- * Note that the bounding box does not use the size information of the particles which means when computing the bounding box, particles are considered to be points in the space. - * - * @param AABB : true to enable the computing of the AABB of the Group, false to disable it - */ - void enableAABBComputing(bool AABB); - - /** - * @brief Enables or not Renderer buffers management in a statix way - * - * If the buffer management is enabled, then a call to setRenderer(Renderer*) will destroy the existing buffers of the previous Renderer - * held by this Group, and create the needed buffer for the new Renderer.
- *
- * By default, the renderer buffers management is enabled. - * - * @param manage : true to enable buffers management, false to disable it - * @since 1.03.00 - */ - static void enableBuffersManagement(bool manage); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the Pool of particles of the Group - * - * Note that the Pool returned is constant as the user is not allowed to modify the internal structure of particles. - * - * @return the Pool of the Group - */ - const Pool& getParticles() const; - - /** - * @brief Gets a single Particle in the Group by its index - * - * Note that a given Particle in a Group is not ensured to keep the same index all over its life. - * Particle index can be changed when inactivating particles. - * - * @param index : the position in the Group's Pool of the Particle to get - * @return : the Particle at index - */ - Particle& getParticle(size_t index); - - /** - * @brief Gets a single Particle in the Group by its index - * - * This is the constant version of getParticle(size_t). - * - * @param index : the index of the Particle to get - * @return the Particle at index - * @since 1.02.00 - */ - const Particle& getParticle(size_t index) const; - - /** - * @brief Gets the number of particles in the Group - * @return the number of particles in the Group - */ - size_t getNbParticles() const; - - /** - * @brief Gets the emitters of the Group - * @return the vector of emitters of the Group - */ - const std::vector& getEmitters() const; - - /** - * @brief Gets an Emitter of the Group by its index - * @param index : the position in the vector of emitters of the Emitter to get - * @return : the Emitter at index - */ - Emitter* getEmitter(size_t index) const; - - /** - * @brief Gets the number of emitters in this Group - * @return the number of emitters in this Group - */ - size_t getNbEmitters() const; - - /** - * @brief Gets the modifiers of the Group - * @return the vector of modifiers of the Group - */ - const std::vector& getModifiers() const; - - /** - * @brief Gets an Modifier of the Group by its index - * @param index : the position in the vector of modifiers of the Modifier to get - * @return : the Modifier at index - */ - Modifier* getModifier(size_t index) const; - - /** - * @brief Gets the number of modifiers in this Group - * @return the number of modifiers in this Group - */ - size_t getNbModifiers() const; - - /** - * @brief Gets the Model of this Group - * @return the Model of this Group - */ - Model* getModel() const; - - /** - * @brief Gets the Renderer of this Group - * @return the Renderer of this Group - */ - Renderer* getRenderer() const; - - /** - * @brief Gets the friction coefficient of this Group - * - * For a description of the friction see setFriction(float). - * - * @return the friction coefficient of this Group - */ - float getFriction() const; - - /** - * @brief Gets the gravity Vector3D of this Group - * - * For a description of the gravity see setGravity(Vector3D&). - * - * @return the gravity Vector3D of this Group - */ - const Vector3D& getGravity() const; - - /** - * @brief Tells whether the sorting of particles from back to front is enabled - * - * For a description of the sorting of particles, see enableSorting(bool). - * - * @return true if the sorting is enabled, false otherwise - */ - bool isSortingEnabled() const; - - /** - * @brief Tells whether the distance computation between particles and camera is enabled - * @return true is the distance computation is enabled, false if not - * @since 1.01.00 - */ - bool isDistanceComputationEnabled() const; - - /** - * @brief Tells whether the computation of the axis aligned bouding box is enabled - * - * For a description of the computation of the AABB, see enableAABBComputing(bool). - * - * @return true if the computation of the AABB is enabled, false if it is disabled - */ - bool isAABBComputingEnabled() const; - - /** - * @brief Gets a Vector3D holding the minimum coordinates of the AABB of the Group. - * - * Note that this method is only useful when the AABB computation is enabled (see enableAABBComputing(bool)). - * - * @return a Vector3D holding the minimum coordinates of the AABB of the Group - */ - const Vector3D& getAABBMin() const; - - /** - * @brief Gets a Vector3D holding the maximum coordinates of the AABB of the Group. - * - * Note that this method is only useful when the AABB computation is enabled (see enableAABBComputing(bool)). - * - * @return a Vector3D holding the maximum coordinates of the AABB of the Group - */ - const Vector3D& getAABBMax() const; - - /** - * @brief Gets the start address of the given param - * - * This method is used by a Renderer to define the start position of an array to pass to the GPU.
- * You will not generally need it unless you re designing your own Renderer.
- *
- * Note that if the parameter is not enabled, the return value will point to an enabled parameter starting address. - * - * @param param : the parameter whose start address is gotten - * @since 1.03.00 - */ - const void* getParamAddress(ModelParam param) const; - - /** - * @brief Gets the start address of the position - * - * This method is used by a Renderer to define the start position of an array to pass to the GPU.
- * You will not generally need it unless you re designing your own Renderer. - * - * @since 1.03.00 - */ - const void* getPositionAddress() const; - - /** - * @brief Gets the stride for parameters - * - * This method is used by a Renderer to know the stride of an array to pass to the GPU.
- * You will not generally need it unless you re designing your own Renderer. - * - * @since 1.03.00 - */ - size_t getParamStride() const; - - /** - * @brief Gets the stride for positions - * - * This method is used by a Renderer to know the stride of an array to pass to the GPU.
- * You will not generally need it unless you re designing your own Renderer. - * - * @since 1.03.00 - */ - size_t getPositionStride() const; - - /** - * @brief Tells whether renderers buffer management is enabled or not - * - * see enableBuffersManagement(bool) for more information. - * - * @return true if renderers buffer management is enabled, false if it is disable - * @since 1.03.00 - */ - static bool isBuffersManagementEnabled(); - - /////////////// - // Interface // - /////////////// - - /** - * @brief Adds some Particles to this Group - * - * This method and all the methods of type addParticles will add a given number of Particles at the given position with the given velocity.
- * Note that even if a Zone and an Emitter is passed, the position and the velocity will be the same for all Particles.
- *
- * In case a Zone is passed, Zone::generatePosition(Particle,bool) is used to generate the position.
- * In case an Emitter is passed, Emitter::generateVelocity(Particle) with a mass of 1 is used to generate the velocity. - * The velocity will then be updated with the Particle's mass when the Particle will be generated.
- * In case a delta time is passed instead of a fixed number, the number will be computed thanks to the flow of the Emitter passed.
- *
- * Particles will be added to the Group at the next call to update(unsigned int) or flushAddedParticles().
- * This is why any Emitter and Zone used to generate particles must be valid at the next call of either update(unsigned int) or flushAddedParticles().
- *
- * On some methods addParticles, the full variable is present. This variable defines where to generate positions in a Zone : - *
    - *
  • true to generate position somewhere within the whole Zone.
  • - *
  • false to generate position somewhere on the Zone border.
  • - *
- * - * @param nb : the number of Particles to add - * @param position : the position where the Particles will be added - * @param velocity : the velocity of the Particles - */ - void addParticles(unsigned int nb,const Vector3D& position,const Vector3D& velocity); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param nb : the number of Particles to add - * @param zone : the Zone that will be used to generate the position - * @param emitter : the Emitter that will be used to generate the velocity - * @param full : true to generate a position within the whole Zonz, false only at its borders - */ - void addParticles(unsigned int nb,const Zone* zone,Emitter* emitter,bool full = true); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param nb : the number of Particles to add - * @param zone : the Zone that will be used to generate the position - * @param velocity : the velocity of the Particles - * @param full : true to generate a position within the whole Zonz, false only at its borders - */ - void addParticles(unsigned int nb,const Zone* zone,const Vector3D& velocity,bool full = true); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param nb : the number of Particles to add - * @param position : the position where the Particles will be added - * @param emitter : the Emitter that will be used to generate the velocity - */ - void addParticles(unsigned int nb,const Vector3D& position,Emitter* emitter); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param nb : the number of Particles to add - * @param emitter : the Emitter that will be used to generate the velocity and whose Zone will be used to generate the position - */ - void addParticles(unsigned int nb,Emitter* emitter); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param zone : the Zone that will be used to generate the position - * @param emitter : the Emitter that will be used to generate the velocity - * @param deltaTime : the step time that will be used to determine how many particles to generate - * @param full : true to generate a position within the whole Zonz, false only at its borders - */ - void addParticles(const Zone* zone,Emitter* emitter,float deltaTime,bool full = true); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param position : the position where the Particles will be added - * @param emitter : the Emitter that will be used to generate the velocity - * @param deltaTime : the step time that will be used to determine how many particles to generate - */ - void addParticles(const Vector3D& position,Emitter* emitter,float deltaTime); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for a complete description. - * - * @param emitter : the Emitter that will be used to generate the velocity and whose Zone will be used to generate the position - * @param deltaTime : the step time that will be used to determine how many particles to generate - */ - void addParticles(Emitter* emitter,float deltaTime); - - /** - * @brief Adds some Particles to this Group - * - * This method is slightly different to other addParticles methods as Particles are generated not at a point but on a line defined by start and end.
- * The step is the distance between each Particle on the line and the offset is the starting distance to compute the first Particle's position.
- * The offset is useful to generate equidistant particles on several lines. the returned offset has to be used as the passed offset for the next line.
- *
- * This method is useful to generate equidistant particles on lines no matter the framerate.
- *
- * See addParticles(unsigned int,const Vector3D&,const Vector3D&) for some complementary information. - * - * @param start : the position of the start of the line - * @param end : the position of the end of the line - * @param emitter : the Emitter that will be used to generate the velocity - * @param step : the distance between each generated Particle - * @param offset : the starting distance of the beginning of the line - * @return the new offset at the end of the line - */ - float addParticles(const Vector3D& start,const Vector3D& end,Emitter* emitter,float step,float offset = 0.0f); - - /** - * @brief Adds some Particles to this Group - * - * See addParticles(const Vector3D&,const Vector3D&,const Emitter*,float,float) for a complete description. - * - * @param start : the position of the start of the line - * @param end : the position of the end of the line - * @param velocity : the velocity of the Particles - * @param step : the distance between each generated Particle - * @param offset : the starting distance of the beginning of the line - * @return the new offset at the end of the line - */ - float addParticles(const Vector3D& start,const Vector3D& end,const Vector3D& velocity,float step,float offset = 0.0f); - - /** - * @brief Removes a Particle from this Group - * - * Note that the Particle object is not destroyed but only inactivated in the Pool. - * - * @param index : the position of the Particle in this Group - */ - void removeParticle(size_t index); - - /** - * @brief Adds an Emitter in this Group - * - * Note that if the emitter is already in the group, it will not be inserted again. - * - * @param emitter : the Emitter to add - */ - void addEmitter(Emitter* emitter); - - /** - * @brief Removes an Emitter from this Group - * @param emitter : the Emitter to remove - */ - void removeEmitter(Emitter* emitter); - - /** - * @brief Adds an Modifier in this Group - * @param modifier : the Modifier to add - */ - void addModifier(Modifier* modifier); - - /** - * @brief Removes an Modifier from this Group - * @param modifier : the Modifier to remove - */ - void removeModifier(Modifier* modifier); - - /** - * @brief Updates this Group by a step time - * - * The update process performs those operations : - *
    - *
  • Updates the mutable parameters of each Particle.
  • - *
  • Updates the velocity of each Particle function of the friction and the gravity of the Group.
  • - *
  • Applies each Modifier of the Group to each Particle.
  • - *
  • Removes all dead particles
  • - *
  • Adds particles generated by the emitters of the Group.
  • - *
  • Adds particles added manually by the user (with calls to addParticles).
  • - *
- * Those operations are optimized to limit the swaps and shifts of particles in the Pool to its minimum.
- * This method tells whether the Group still has some Particles, or if some Particles will still be generated by the Emitters at the next updates by returning a boolean. - * - * @param deltaTime : the time step used to update the Group - * @return true if the Group has still some current or future Particles to update, false otherwise - */ - bool update(float deltaTime); - - /** - * @brief Renders this Group - * - * Note that if no Renderer is attached to the Group, nothing will happen. - */ - void render(); - - /** - * @brief Empties this Group - * - * Not that this method does not release resource of this Group. - * Particles are only inactivated, not destroyed. - */ - void empty(); - - /** - * @brief Adds all manually added particles to the Group - * - * This method adds all particles added with the addParticles methods immediatly to the Group without waiting the next call to update(unsigned int). - * The Particles are added in FIFO order until there is no more or the capacity limit of the Group is reached. - */ - void flushAddedParticles(); - - /** - * @brief Sorts the particles within this Group - * - * The particles are sorted only if the sorting of this Group is enabled. See enableSorting(bool).
- * Note that update(unsigned int) also sorts the particles.
- * This method is therefore only useful when the camera position changes several times between 2 updates.
- *
- * This method also makes a call to computeDistances(). - * - * @since 1.01.00 - */ - void sortParticles(); - - /** - * @brief Computes the distance between each Particle within this Group and the camera - * - * The distances are computed only if the computation of distances of this Group is enabled. See enableDistanceComputation(bool).
- * Note that update(unsigned int) also computes the distances between particles and camera.
- * This method is therefore only useful when the camera position changes several times between 2 updates. - * - * @since 1.01.00 - */ - void computeDistances(); - - /** - * @brief Computes the bounding box of this Group - * - * The bounding box is computed only if the computation of the bounding box of this Group is enabled. See enableAABBComputing(bool).
- * Note that update(unsigned int) also computes the bounding box.
- * This method is therefore only useful when the bounding boxe has to be recomputed between 2 updates. - * - * @since 1.01.00 - */ - void computeAABB(); - - /** - * @brief Increases the maximum number of particles this Group can hold - * - * Note that decreasing the capacity will have no effect.
- * A reallocation of the group capacity will destroy all its current buffers. - * - * @param capacity The maximum number of particles of this Group - * @since 1.02.00 - */ - void reallocate(size_t capacity); - - /** - * @brief Creates a new additional buffer attached to the Group. - * - * Additional buffers are used to attach data to a particles. They are mainly used by renderers to store data to transfer to the GPU - * but can be used by the user in any other way.
- *
- * A buffer is defined by a ID which is a std::string.
- * A buffer also has a flag, which can give information about the way it is configured.
- *
- * Note that ID starting with SPK_ are reserved by the engine. - * Note also that creating a buffer with an already existing ID will destroy the previous buffer. - *
- * A buffer needs a BufferCreator to allow the group to create it. - * - * @param ID : the ID of the additinal buffer - * @param creator : the buffer creator object - * @param flag : the flag of the buffer - * @param swapData : true to swap data when particle are swapped, false not to (faster but dont keep right order) - * @since 1.03.00 - */ - Buffer* createBuffer(const std::string& ID,const BufferCreator& creator,unsigned int flag = 0,bool swapData = true) const; - - /** - * @brief Destroys the buffer with the given ID - * - * If no buffer with this ID exists, nothing happens.
- * Note that destroying a buffer must never freeze the engine. Checks must be performed. - * - * @param ID : the ID of the buffer to destroyed - * @since 1.03.00 - */ - void destroyBuffer(const std::string& ID) const; - - /** - * @brief Destroys all the buffers held by this Group - * @since 1.03.00 - */ - void destroyAllBuffers() const; - - /** - * @brief Gets the buffer with the given ID and checks its flag - * - * The flag is used as a check. the passed flag must be the same as the stored flag.
- * If not or if no buffer with the given ID exists, NULL is returned.
- *
- * The method returns a pointer on the buffer. - * - * @param ID : the ID of the buffer to get - * @param flag : the flag used for the flag check - * @return a pointer to the buffer, or NULL if not found or with an incorrect flag - * @since 1.03.00 - */ - Buffer* getBuffer(const std::string& ID,unsigned int flag) const; - - /** - * @brief Gets the buffer with the given ID - * - * NULL is returned if the buffer does not exist - * - * @param ID : the ID of the buffer - * @return a pointer to the buffer, or NULL if not found - * @since 1.03.02 - */ - Buffer* getBuffer(const std::string& ID) const; - - virtual Registerable* findByName(const std::string& name); - - protected : - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool createBase); - virtual void destroyChildren(bool keepChildren); - - virtual void propagateUpdateTransform(); - - private : - - struct CreationData - { - unsigned int nb; - Vector3D position; - Vector3D velocity; - const Zone* zone; - Emitter* emitter; - bool full; - }; - - struct EmitterData - { - Emitter* emitter; - unsigned int nbParticles; - }; - - // statics - static bool bufferManagement; - static Model& getDefaultModel(); - - // registerables - Model* model; - Renderer* renderer; - std::vector emitters; - std::vector modifiers; - - mutable std::vector activeEmitters; - mutable std::vector activeModifiers; // Vector of active modifiers to optimise the parsing when updating - - // physics parameters - float friction; - Vector3D gravity; - - // particles data - Pool pool; - Particle::ParticleData* particleData; - float* particleCurrentParams; // Stores the current parameters values of the particles - float* particleExtendedParams; // Stores the extended parameters values of the particles (final values and interpolated data) - - // sorting - bool sortingEnabled; - bool distanceComputationEnabled; - - // creation data - std::deque creationBuffer; - unsigned int nbBufferedParticles; - - // callbacks - bool (*fupdate)(Particle&,float); - void (*fbirth)(Particle&); - void (*fdeath)(Particle&); - - // bounding box - bool boundingBoxEnabled; - Vector3D AABBMin; - Vector3D AABBMax; - - // additional buffers - mutable std::map additionalBuffers; - mutable std::set swappableBuffers; - - void pushParticle(std::vector::iterator& emitterIt,unsigned int& nbManualBorn); - void launchParticle(Particle& p,std::vector::iterator& emitterIt,unsigned int& nbManualBorn); - - void addParticles(unsigned int nb,const Vector3D& position,const Vector3D& velocity,const Zone* zone,Emitter* emitter,bool full = false); - - void popNextManualAdding(unsigned int& nbManualBorn); - - void updateAABB(const Particle& particle); - - void sortParticles(int start,int end); - }; - - - inline Group* Group::create(Model* model,size_t capacity) - { - Group* obj = new Group(model,capacity); - registerObject(obj); - return obj; - } - - inline void Group::setFriction(float friction) - { - this->friction = friction; - } - - inline void Group::setGravity(const Vector3D& gravity) - { - this->gravity = gravity; - } - - inline void Group::setCustomUpdate(bool (*fupdate)(Particle&,float)) - { - this->fupdate = fupdate; - } - - inline void Group::setCustomBirth(void (*fbirth)(Particle&)) - { - this->fbirth = fbirth; - } - - inline void Group::setCustomDeath(void (*fdeath)(Particle&)) - { - this->fdeath = fdeath; - } - - inline void Group::enableSorting(bool sort) - { - sortingEnabled = sort; - distanceComputationEnabled = sort; - } - - inline void Group::enableDistanceComputation(bool distanceComputation) - { - distanceComputationEnabled = distanceComputation; - if (!distanceComputation) enableSorting(false); - } - - inline void Group::enableAABBComputing(bool AABB) - { - boundingBoxEnabled = AABB; - } - - inline const Pool& Group::getParticles() const - { - return pool; - } - - inline Particle& Group::getParticle(size_t index) - { - return pool[index]; - } - - inline const Particle& Group::getParticle(size_t index) const - { - return pool[index]; - } - - inline size_t Group::getNbParticles() const - { - return pool.getNbActive(); - } - - inline const std::vector& Group::getEmitters() const - { - return emitters; - } - - inline Emitter* Group::getEmitter(size_t index) const - { - return emitters[index]; - } - - inline size_t Group::getNbEmitters() const - { - return emitters.size(); - } - - inline const std::vector& Group::getModifiers() const - { - return modifiers; - } - - inline Modifier* Group::getModifier(size_t index) const - { - return modifiers[index]; - } - - inline size_t Group::getNbModifiers() const - { - return modifiers.size(); - } - - inline Model* Group::getModel() const - { - return model; - } - - inline Renderer* Group::getRenderer() const - { - return renderer; - } - - inline float Group::getFriction() const - { - return friction; - } - - inline const Vector3D& Group::getGravity() const - { - return gravity; - } - - inline bool Group::isSortingEnabled() const - { - return sortingEnabled; - } - - inline bool Group::isDistanceComputationEnabled() const - { - return distanceComputationEnabled; - } - - inline bool Group::isAABBComputingEnabled() const - { - return boundingBoxEnabled; - } - - inline const Vector3D& Group::getAABBMin() const - { - return AABBMin; - } - - inline const Vector3D& Group::getAABBMax() const - { - return AABBMax; - } - - inline void Group::addParticles(unsigned int nb,const Vector3D& position,const Vector3D& velocity) - { - addParticles(nb,position,velocity,NULL,NULL); - } - - inline void Group::addParticles(unsigned int nb,const Zone* zone,Emitter* emitter,bool full) - { - addParticles(nb,Vector3D(),Vector3D(),zone,emitter,full); - } - - inline void Group::addParticles(unsigned int nb,const Zone* zone,const Vector3D& velocity,bool full) - { - addParticles(nb,Vector3D(),velocity,zone,NULL,full); - } - - inline void Group::addParticles(unsigned int nb,const Vector3D& position,Emitter* emitter) - { - addParticles(nb,position,Vector3D(),NULL,emitter); - } - - inline void Group::removeParticle(size_t index) - { - pool.makeInactive(index); - } - - inline const void* Group::getPositionAddress() const - { - return &(particleData[0].position); - } - - inline size_t Group::getPositionStride() const - { - return sizeof(Particle::ParticleData); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Interpolator.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Interpolator.h deleted file mode 100644 index bfff66c03..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Interpolator.h +++ /dev/null @@ -1,403 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_INTERPOLATOR -#define H_SPK_INTERPOLATOR - -#include "Core/SPK_DEF.h" - -namespace SPK -{ - class Particle; - - /** - * @enum InterpolationType - * @brief Constants defining which type of value is used for interpolation - * @since 1.05.00 - */ - enum InterpolationType - { - INTERPOLATOR_LIFETIME, /**< Constant defining the life time as the value used to interpolate */ - INTERPOLATOR_AGE, /**< Constant defining the age as the value used to interpolate */ - INTERPOLATOR_PARAM, /**< Constant defining a parameter as the value used to interpolate */ - INTERPOLATOR_VELOCITY, /**< Constant defining the square norm of the velocity as the value used to interpolate */ - }; - - /** - * @brief An entry in the interpolator graph - * - * See the Interpolator description for more information - * - * @since 1.05.00 - */ - struct InterpolatorEntry - { - float x; /**< x value of this entry */ - float y0; /**< y first value of this entry */ - float y1; /**< y second value of this entry */ - - /** @brief Default constructor of interpolator entry. All values are set to 0 */ - InterpolatorEntry() : x(0.0f),y0(0.0f),y1(0.0f) {} - - /** - * @brief Constructs an interpolator entry with y0 and y1 having the same value - * @param x : the x value - * @param y : the y value (value of y0 and y1) - */ - InterpolatorEntry(float x,float y) : x(x),y0(y),y1(y) {} - - /** - * @brief Constructs and interpolator entry - * @param x : the x value - * @param y0 : the y0 value - * @param y1 : the y1 value - */ - InterpolatorEntry(float x,float y0,float y1) : x(x),y0(y0),y1(y1) {} - - // used internally - InterpolatorEntry(float x) : x(x) {} - }; - - // forward declaration to allow the set of entries in interpolator to be constructed - bool operator<(const InterpolatorEntry& entry0,const InterpolatorEntry& entry1); - - /** - * @class Interpolator - * @brief An interpolator that offers flexible control over particle parameters - * - * An interpolator is created for each parameter of a model which is set as interpolated.
- * The user can get the interpolator of a parameter for a given model by calling Model::getInterpolator(ModelParam).
- *
- * An interpolator can use several types of value to interpolate a given parameter : - *
    - *
  • the lifetime of a particle : it is defined in a range between 0 and 1, 0 being the birth of the particle and 1 being its death
  • - *
  • the age of a particle
  • - *
  • the value of another parameter of a particle (which can be any of the parameters)
  • - *
  • the square norm of the velocity of a particle
  • - *
- * Here is a description of how an interpolator works :
- *
- * Internally an interpolator holds a list of entries which defines a 2D graph. The entries are sorted internally along the x axis.
- * Each entry have a unique x value and 2 y values (although both y can have the same value).
- *
- * The x defines the value that will be used to interpolate the parameter value. This value depends on the type set of the interpolator.
- * For instance, if the type is INTERPOLATOR_AGE, the current x value will be the age of the particle.
- *
- * Knowing the current x value, the interpolator interpolates the y value in function of the entries y values.
- * An interpolator holds 2 curves : the y0 one and the y1 one.
- * Each particle is given a random value between 0 and 1 which defines where between the y0 and the y1 curve the interpolated y value will be.
- * The final interpolated y value will be the value of the interpolated particle parameter for this frame.
- *
- * Moreover the graph can loop or not : - *
    - *
  • If the graph does not loop, the current x value is clamped between the minimum x and the maximum x of the graph.
  • - *
  • If the graph loops, the current x is recomputed to fit in the range between the minimum x and the maximum x of the graph.
  • - *
- * Finally, it is possible to set a variation in the offset and the scale of the current x computed :
- * Each particle is given an offset and a scale to compute its current x depending on the variations set. The formula to compute the final current x is the following :
- * final current x = (current x + offset) * scale
- * offset being randomly generated per particle in [-offsetXVariation,+offsetXVariation]
- * scale being randomly generated per particle in 1.0 + [-scaleXVariation,+scaleXVariation]
- *
- * The default values of the interpolator are the following : - *
    - *
  • type : INTERPOLATOR_LIFETIME
  • - *
  • offset x variation : 0.0
  • - *
  • scale x variation : 0.0
  • - *
- * - * @since 1.05.00 - */ - class SPK_PREFIX Interpolator - { - friend class Particle; - friend class Model; - - public : - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the value used to interpolate - * - * See the class description for more information.
- * Note that the argument param is only used when the type is INTERPOLATOR_PARAM. - * - * @param type : the type of value used to interpolate - * @param param : the parameter used to interpolate when the type is INTERPOLATOR_PARAM. - */ - void setType(InterpolationType type,ModelParam param = PARAM_SIZE); - - /** - * @brief Enables or disables the looping of the graph - * - * The range of the graph is defined between the entry with the minimum x and the entry with the maximum y.
- * If the looping is disabled, the x are clamped to the range.
- * If the looping is enabled, the value of x is reported in the range. It is better that the xmin and xmax have - * the same y values so that the graph tiles perfectly. - * - * @param loop : true to enabled the looping, false to disable it - */ - void enableLooping(bool loop); - - /** - * @brief Sets the scale variation in x - * - * See the class description for more information - * - * @param scaleXVariation : the scale variation in x - */ - void setScaleXVariation(float scaleXVariation); - - /** - * @brief Sets the offset variation in x - * - * See the class description for more information - * - * @param offsetXVariation : the offset variation in x - */ - void setOffsetXVariation(float offsetXVariation); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the type of value used to interpolate - * @return the type of value used to interpolate - */ - InterpolationType getType() const; - - /** - * @brief Gets the parameter used to interpolate - * - * Note that the parameter is only used if the type is INTERPOLATOR_PARAM - * - * @return the parameter used to interpolate - */ - ModelParam getInterpolatorParam() const; - - /** - * @brief Tells whether the looping is enabled or not - * @return true if the looping is enabled, false if not - */ - bool isLoopingEnabled() const; - - /** - * @brief Gets the scale variation along x - * @return the scale variation along x - */ - float getScaleXVariation() const; - - /** - * @brief Gets the offset variation along x - * @return the offset variation along x - */ - float getOffsetXVariation() const; - - /** - * @brief Gets the graph of the interpolator - * @return the graph of the interpolator - */ - std::set& getGraph(); - - /** - * @brief Gets the graph of the interpolator (constant version) - * @return the graph of the interpolator - */ - const std::set& getGraph() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Adds an entry to the graph - * @param entry : the entry to add to the graph - * @return true if the entry has been added to the graph, false if not (the graph already contains an entry with the same x) - */ - bool addEntry(const InterpolatorEntry& entry); - - /** - * @brief Adds an entry to the graph - * @param x : the x of the entry to add - * @param y : the y of the entry to add (y0 and y1 are set to y) - * @return true if the entry has been added to the graph, false if not (the graph already contains an entry with the same x) - */ - bool addEntry(float x,float y); - - /** - * @brief Adds an entry to the graph - * @param x : the x of the entry to add - * @param y0 : the y0 of the entry to add - * @param y1 : the y1 of the entry to add - * @return true if the entry has been added to the graph, false if not (the graph already contains an entry with the same x) - */ - bool addEntry(float x,float y0,float y1); - - /** @brief Clears the graph (removes all the entries) */ - void clearGraph(); - - /** - * @brief Generates a sinusoidal curve - * - * Note that the graph is previously cleared from all its entries - */ - void generateSinCurve(float period,float amplitudeMin,float amplitudeMax,float offsetX,float offsetY,float startX,unsigned int length,unsigned int nbSamples); - - /** - * @brief Generates a polynomial curve - * - * Note that the graph is previously cleared from all its entries - */ - void generatePolyCurve(float constant,float linear,float quadratic,float cubic,float startX,float endX,unsigned int nbSamples); - - private : - - std::set graph; - - InterpolationType type; - ModelParam param; - bool loopingEnabled; - - float scaleXVariation; - float offsetXVariation; - - float interpolate(const Particle& particle,ModelParam interpolatedParam,float ratioY,float offsetX,float scaleX); - float interpolateY(const InterpolatorEntry& entry,float ratio); - - // methods to compute X - typedef float (Interpolator::*computeXFn)(const Particle&) const; - static computeXFn COMPUTE_X_FN[4]; - - float computeXLifeTime(const Particle& particle) const; - float computeXAge(const Particle& particle) const; - float computeXParam(const Particle& particle) const; - float computeXVelocity(const Particle& particle) const; - - // Only a model can create and destroy an interpolator - Interpolator(); - ~Interpolator() {}; - }; - - - inline void Interpolator::setType(InterpolationType type,ModelParam param) - { - this->type = type; - this->param = param; - } - - inline void Interpolator::enableLooping(bool loop) - { - loopingEnabled = loop; - } - - inline void Interpolator::setScaleXVariation(float scaleXVariation) - { - this->scaleXVariation = scaleXVariation; - } - - inline void Interpolator::setOffsetXVariation(float offsetXVariation) - { - this->offsetXVariation = offsetXVariation; - } - - inline InterpolationType Interpolator::getType() const - { - return type; - } - - inline ModelParam Interpolator::getInterpolatorParam() const - { - return param; - } - - inline bool Interpolator::isLoopingEnabled() const - { - return loopingEnabled; - } - - inline float Interpolator::getScaleXVariation() const - { - return scaleXVariation; - } - - inline float Interpolator::getOffsetXVariation() const - { - return offsetXVariation; - } - - inline std::set& Interpolator::getGraph() - { - return graph; - } - - inline const std::set& Interpolator::getGraph() const - { - return graph; - } - - inline bool Interpolator::addEntry(const InterpolatorEntry& entry) - { - return graph.insert(entry).second; - } - - inline bool Interpolator::addEntry(float x,float y) - { - return addEntry(InterpolatorEntry(x,y)); - } - - inline bool Interpolator::addEntry(float x,float y0,float y1) - { - return addEntry(InterpolatorEntry(x,y0,y1)); - } - - inline void Interpolator::clearGraph() - { - graph.clear(); - } - - inline float Interpolator::interpolateY(const InterpolatorEntry& entry,float ratio) - { - return entry.y0 + (entry.y1 - entry.y0) * ratio; - } - - ///////////////////////////////////////////////////////////// - // Functions to sort the entries on the interpolator graph // - ///////////////////////////////////////////////////////////// - - inline bool operator<(const InterpolatorEntry& entry0,const InterpolatorEntry& entry1) - { - return entry0.x < entry1.x; - } - - inline bool operator==(const InterpolatorEntry& entry0,const InterpolatorEntry& entry1) - { - return entry0.x == entry1.x; - } - -} - -#endif - diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Model.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Model.h deleted file mode 100644 index 514a426d2..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Model.h +++ /dev/null @@ -1,570 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_MODEL -#define H_SPK_MODEL - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Interpolator.h" - - -namespace SPK -{ - /** - * @enum ModelParamFlag - * @brief Constants used to set bits in Model flags - * - * These constant values are simply 1 << ModelParam constants - */ - enum ModelParamFlag - { - FLAG_NONE = 0, /**< the flag bit for no parameter */ - FLAG_RED = 1 << PARAM_RED, /**< the flag bit for PARAM_RED */ - FLAG_GREEN = 1 << PARAM_GREEN, /**< the flag bit for PARAM_GREEN */ - FLAG_BLUE = 1 << PARAM_BLUE, /**< the flag bit for PARAM_BLUE */ - FLAG_ALPHA = 1 << PARAM_ALPHA, /**< the flag bit for PARAM_ALPHA */ - FLAG_SIZE = 1 << PARAM_SIZE, /**< the flag bit for PARAM_SIZE */ - FLAG_MASS = 1 << PARAM_MASS, /**< the flag bit for PARAM_MASS */ - FLAG_ANGLE = 1 << PARAM_ANGLE, /**< the flag bit for PARAM_ANGLE */ - FLAG_TEXTURE_INDEX = 1 << PARAM_TEXTURE_INDEX, /**< the flag bit for PARAM_TEXTURE_INDEX */ - FLAG_ROTATION_SPEED = 1 << PARAM_ROTATION_SPEED, /**< the flag bit for PARAM_ROTATION_SPEED */ - FLAG_CUSTOM_0 = 1 << PARAM_CUSTOM_0, /**< the flag bit for PARAM_CUSTOM_0 */ - FLAG_CUSTOM_1 = 1 << PARAM_CUSTOM_1, /**< the flag bit for PARAM_CUSTOM_1 */ - FLAG_CUSTOM_2 = 1 << PARAM_CUSTOM_2, /**< the flag bit for PARAM_CUSTOM_2 */ - }; - - /** - * @class Model - * @brief A model of particles for particles' generation and evolution - * - * This class defines a behavior for particles generation and evolution over time.
- * A Particle is generated under a Model that cannot be changed during its life time. - * A Particle Model can however be changed but it will reinitialize the Particle parameters and life.
- *
- * A Model defines which parameters to use/update for a Particle. To do that an Model holds 4 flags that are : - *
    - *
  • Enabled : The parameter is enabled and can be set. Otherwise its default value is used.
  • - *
  • Mutable : The parameter will vary linearly over the life time of the Particle.
  • - *
  • Random : The parameter will be randomly generated for the Particle.
  • - *
  • Interpolated : The parameter will be interpolated by an object Interpolator to allow flexible variations.
  • - *
- * The flags are processed when building up a model so that they are consistent : - *
    - *
  • All flags are masked so that they have not bit set at a higher position than the number of parameters.
  • - *
  • The mutable,random and interpolated flags are masked with the enabled flag : a parameter must be enabled to be either random, mutable or interpolated.
  • - *
  • An interpolated parameter cannot be mutable or/and random as well. The interpolated flag has the priority.
  • - *
- * The life time of a particle and immortality is also defined by the Model.
- *
- * The default values for the parameters are the following : - *
    - *
  • PARAM_RED : 1.0
  • - *
  • PARAM_GREEN : 1.0
  • - *
  • PARAM_BLUE : 1.0
  • - *
  • PARAM_ALPHA : 1.0
  • - *
  • PARAM_SIZE : 1.0
  • - *
  • PARAM_MASS : 1.0
  • - *
  • PARAM_ANGLE : 0.0
  • - *
  • PARAM_TEXTURE_INDEX : 0.0
  • - *
  • PARAM_ROTATION_SPEED : 0.0
  • - *
  • PARAM_CUSTOM_0 : 0.0
  • - *
  • PARAM_CUSTOM_1 : 0.0
  • - *
  • PARAM_CUSTOM_2 : 0.0
  • - *
- */ - class SPK_PREFIX Model : public Registerable - { - friend class Particle; - - SPK_IMPLEMENT_REGISTERABLE(Model) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief The constructor for Model - * - * The user have to pass the Model flags that cannot be changed afterwards.
- * To set up flags enumerators from ModelParamFlag can be used in a OR way.
- * For instance, Model(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA,FLAG_NONE,FLAG_NONE,FLAG_NONE) - * constructs a Model that will generate Particles with a defined color that will not change over time.
- *
- * Since 1.03.00, PARAM_RED, PARAM_GREEN and PARAM_BLUE are enabled by default. - * This is needed to pass the values to the GPU in an optimized way.
- * Note that even the enable flag passed by the user does not containt those params, they will be enabled anyway. - * - * @param enableFlag : the enable flag - * @param mutableFlag : the mutable flag - * @param randomFlag : the random flag - * @param interpolatedFlag : the interpolated flag - */ - Model(int enableFlag = FLAG_RED | FLAG_GREEN | FLAG_BLUE,int mutableFlag = FLAG_NONE,int randomFlag = FLAG_NONE,int interpolatedFlag = FLAG_NONE); - - /** - * @brief The copy constructor for Model - * @param model : The Model to construct the new Model from - */ - Model(const Model& model); - - /** - * @brief Creates and registers a new Model - * @param enableFlag : the enable flag - * @param mutableFlag : the mutable flag - * @param randomFlag : the random flag - * @param interpolatedFlag : the interpolated flag - * @return A new registered Model - * @since 1.04.00 - */ - static Model* create(int enableFlag = FLAG_RED | FLAG_GREEN | FLAG_BLUE,int mutableFlag = FLAG_NONE,int randomFlag = FLAG_NONE,int interpolatedFlag = FLAG_NONE); - - //////////////// - // Destructor // - //////////////// - - /** @brief The destructor for Model */ - ~Model(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the life time - * - * All particles generated under this Model will be given a life time randomly generated within [lifeTimeMin,lifeTimeMax[.
- * To generate particles with a non random life time, simply use setLifeTime(a,a). - * - * @param lifeTimeMin : the minimum life time - * @param lifeTimeMax : the maximum life time - */ - void setLifeTime(float lifeTimeMin,float lifeTimeMax); - - /** - * @brief Defines whether to generate immortal particles or not - * - * Immortal particles will still be given a life time. However the age of immortal particles will not increase so that they cannot die. - * An immortal Particle whose Model immortality is unset will grow older again.
- * The immortality is therefore dynamic and can be granted or removed by impacting all particles generated under this Model. - * - * @param immortal : whether the Model will generate immortal particles or not - */ - void setImmortal(bool immortal); - - /** - * @brief Sets a given parameter with 4 values - * - * This method will only set parameters that are enabled, mutable and random.
- * If not nothing will happen and the method will return false. - * - * @param type : the parameter to set - * @param startMin : the minimum value at the Particle birth - * @param startMax : the maximum value at the Particle birth - * @param endMin : the minimum value at the Particle death - * @param endMax : the maximum value at the Particle death - * @return true if the parameter can be set (right flags), false otherwise - */ - bool setParam(ModelParam type,float startMin,float startMax,float endMin,float endMax); - - /** - * @brief Sets a given parameter with 2 values - * - * This method will only set parameters that are enabled and either mutable or random.
- * If not nothing will happen and the method will return false.
- *
- * In case of a mutable parameter : value0 defines the birth value and value0 defines the death value.
- * In case of a random parameter : value0 defines the minimum value and value1 defines the maximum value.
- * - * @param type : the parameter to set - * @param value0 : the first value (the meaning depends on the flag) - * @param value1 : the second value (the meaning depends on the flag) - * @return true if the parameter can be set (right flags), false otherwise - */ - bool setParam(ModelParam type,float value0,float value1); - - /** - * @brief Sets a given parameter with 1 value - * - * This method will only set parameters that are enabled and neither mutable or random.
- * If not nothing will happen and the method will return false.
- *
- * Note that to set the value of an interpolated parameter cannot be set with this function, - * you must used the interpolator object associated to the parameter to control its value. - * - * @param type : the parameter to set - * @param value : the value of the parameter - * @return true if the parameter can be set (right flags), false otherwise - */ - bool setParam(ModelParam type,float value); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the minimum life time - * @return the minimum life time - */ - float getLifeTimeMin() const; - - /** - * @brief Gets the maximum life time - * @return the minimum life time - */ - float getLifeTimeMax() const; - - /** - * @brief Returns whether immortility is set or not - * @return whether immortility is set or not - */ - bool isImmortal() const; - - /** - * @brief Checks whether a parameter is enabled or not - * @param type : the parameter - * @return 0 is the parameter is not enabled, a flag with the parameter bit set otherwise - */ - int isEnabled(ModelParam type) const; - - /** - * @brief Checks whether a parameter is mutable or not - * @param type : the parameter - * @return 0 is the parameter is not mutable, a flag with the parameter bit set otherwise - */ - int isMutable(ModelParam type) const; - - /** - * @brief Checks whether a parameter is random or not - * @param type : the parameter - * @return 0 is the parameter is not random, a flag with the parameter bit set otherwise - */ - int isRandom(ModelParam type) const; - - /** - * @brief Checks whether a parameter is interpolated or not - * @param type : the parameter - * @return 0 is the parameter is not interpolated, a flag with the parameter bit set otherwise - * @since 1.05.00 - */ - int isInterpolated(ModelParam type) const; - - /** - * @brief Gets a parameter value - * - * If index is superior or equal to the number of values for the parameter, the default value of the parameter is returned.
- * Otherwise the value returned depending on the index is : - *
    - *
  • Enabled parameters : - *
      - *
    • 0 : the value of the parameter
    • - *
    - *
  • - *
  • Mutable parameters : - *
      - *
    • 0 : the birth value of the parameter
    • - *
    • 1 : the death value of the parameter
    • - *
    - *
  • - *
  • Random parameters : - *
      - *
    • 0 : the minimum value of the parameter
    • - *
    • 1 : the maximum value of the parameter
    • - *
    - *
  • - *
  • Mutable and random parameters : - *
      - *
    • 0 : the minimum birth value of the parameter
    • - *
    • 1 : the maximum birth value of the parameter
    • - *
    • 2 : the minimum death value of the parameter
    • - *
    • 3 : the maximum death value of the parameter
    • - *
    - *
  • - *
- * - * Note that in case of an interpolated parameter, the default value is always returned.
- * The user has to use the interpolator object associated to the parameter to get its values. - * - * @param type : the parameter - * @param index : the index of the value to get - * @return the value - */ - float getParamValue(ModelParam type,size_t index) const; - - /** - * @brief Gets the number of values for a parameter - * - * The number of values depends on the Model flags : - *
    - *
  • Enabled parameter : 1
  • - *
  • Mutable or random parameter : 2
  • - *
  • Mutable and random parameter : 4
  • - *
  • Interpolated parameter : 0
  • - *
  • Not Enabled : 0
  • - *
- * @param type : the parameter - * @return the number of values stored in the Model for the parameter - */ - unsigned int getNbValues(ModelParam type) const; - - /** - * @brief Gets the number of enabled parameters - * @return the number of enabled parameters in the model - * @since 1.05.00 - */ - size_t getNbEnabled() const; - - /** - * @brief Gets the number of mutable parameters - * @return the number of mutable parameters in the model - * @since 1.05.00 - */ - size_t getNbMutable() const; - - - /** - * @brief Gets the number of random parameters - * @return the number of random parameters in the model - * @since 1.05.00 - */ - size_t getNRandom() const; - - /** - * @brief Gets the interpolator for the given parameter - * @param param : the parameter whose intepolator must be retrieved - * @return a pointer to the interpolator of the given parameter or NULL if the parameter is not interpolated - * @since 1.05.00 - */ - Interpolator* getInterpolator(ModelParam param); - - /** - * @brief Gets the number of interpolated parameters - * @return the number of interpolated parameters in the model - * @since 1.05.00 - */ - size_t getNbInterpolated() const; - - /** - * @brief Gets the number of float values in the particle current array - * - * The particle current array holds the current values of enabled parameters for a particle.
- * This is used internally and should not be needed by the user. - * - * @return the number of float values in the particle current array - * @since 1.02.00 - */ - size_t getSizeOfParticleCurrentArray() const; - - /** - * @brief Gets the number of float values in the particle extended array - * - * The particle extended array holds the extended values needed for parameters interpolation for a particle.
- * This is used internally and should not be needed by the user. - * - * @return the number of float values in the particle extended array - * @since 1.03.00 - */ - size_t getSizeOfParticleExtendedArray() const; - - /** - * @brief Gets the number of float values in the model array - * - * This is used internally and should not be needed by the user. - * - * @return the number of float values in the model array - * @since 1.02.00 - */ - size_t getSizeOfModelArray() const; - - /** - * @brief Gets the offset of the given parameter in the current array - * - * This methods is used internally by the engine - * - * @param param : the parameter - * @return the offset of the given parameter in the current array - * @since 1.03.00 - */ - size_t getParameterOffset(ModelParam param) const; - - /** - * @brief Gets the default value of the parameter - * @param param : the parameter to get the default value from - * @return the default value of the parameter - * @since 1.05.00 - */ - static float getDefaultValue(ModelParam param); - - private : - - // total number of parameters - static const size_t NB_PARAMS = 12; - // default values for the parameters - static const float DEFAULT_VALUES[NB_PARAMS]; - - // arrays storing the values of parameters for the model following that form : - // enable : 1 value -> value - // mutable : 2 values -> start value | end value - // random : 2 values -> min value | max value - // mutable and random : 4 values -> start min value | start max value | end min value | end max value - // interpolated : 0 value - float* params; - size_t paramsSize; - - // array storing the parameters that are enabled - size_t nbEnableParams; - int* enableParams; - - // array storing the parameters that are mutable - size_t nbMutableParams; - int* mutableParams; - - // array storing the parameters that are interpolated - size_t nbInterpolatedParams; - int* interpolatedParams; - - // nb of random parameters - size_t nbRandomParams; - - // array of interpolators - Interpolator* interpolators[NB_PARAMS]; - - // the flags of the model - int enableFlag; - int mutableFlag; - int randomFlag; - int interpolatedFlag; - - int particleEnableIndices[NB_PARAMS]; // array storing the index of a parameter in the enableParams array - int particleMutableIndices[NB_PARAMS]; // array storing the index of a parameter in the mutableParams array - int indices[NB_PARAMS]; // array storing the index of a parameter in the model param array - - float lifeTimeMin; - float lifeTimeMax; - bool immortal; - - void initParamArrays(const Model& model); - }; - - - inline Model* Model::create(int enableFlag,int mutableFlag,int randomFlag,int interpolatedFlag) - { - Model* obj = new Model(enableFlag,mutableFlag,randomFlag,interpolatedFlag); - registerObject(obj); - return obj; - } - - inline void Model::setLifeTime(float lifeTimeMin,float lifeTimeMax) - { - this->lifeTimeMin = lifeTimeMin; - this->lifeTimeMax = lifeTimeMax; - } - - inline void Model::setImmortal(bool immortal) - { - this->immortal = immortal; - } - - inline float Model::getLifeTimeMin() const - { - return lifeTimeMin; - } - - inline float Model::getLifeTimeMax() const - { - return lifeTimeMax; - } - - inline bool Model::isImmortal() const - { - return immortal; - } - - inline int Model::isEnabled(ModelParam type) const - { - return enableFlag & (1 << type); - } - - inline int Model::isMutable(ModelParam type) const - { - return mutableFlag & (1 << type); - } - - inline int Model::isRandom(ModelParam type) const - { - return randomFlag & (1 << type); - } - - inline int Model::isInterpolated(ModelParam type) const - { - return interpolatedFlag & (1 << type); - } - - inline size_t Model::getNbEnabled() const - { - return nbEnableParams; - } - - inline size_t Model::getNbMutable() const - { - return nbMutableParams; - } - - inline size_t Model::getNRandom() const - { - return nbRandomParams; - } - - inline Interpolator* Model::getInterpolator(ModelParam param) - { - return interpolators[param]; - } - - inline size_t Model::getNbInterpolated() const - { - return nbInterpolatedParams; - } - - inline size_t Model::getSizeOfParticleCurrentArray() const - { - return nbEnableParams; - } - - inline size_t Model::getSizeOfParticleExtendedArray() const - { - return nbMutableParams + (nbInterpolatedParams << 1) + nbInterpolatedParams; // nbMutable + nbInterpolated * 3 - } - - inline size_t Model::getSizeOfModelArray() const - { - return paramsSize; - } - - inline size_t Model::getParameterOffset(ModelParam param) const - { - return static_cast(particleEnableIndices[param]); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Modifier.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Modifier.h deleted file mode 100644 index ce5478bc5..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Modifier.h +++ /dev/null @@ -1,375 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_MODIFIER -#define H_SPK_MODIFIER - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_BufferHandler.h" -#include "Core/SPK_Zone.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - class ModifierGroup; - - /** - * @enum ModifierTrigger - * @brief Constants defining the triggers for Modifier - */ - enum ModifierTrigger - { - ALWAYS = 1 << 0, /**< No trigger, a Particle is always modified */ - INSIDE_ZONE = 1 << 1, /**< Trigger defining a Particle inside the Zone */ - OUTSIDE_ZONE = 1 << 2, /**< Trigger defining a Particle outside the Zone */ - INTERSECT_ZONE = 1 << 3, /**< Trigger defining a Particle intersecting the Zone (in any direction) */ - ENTER_ZONE = 1 << 4, /**< Trigger defining a Particle entering the Zone */ - EXIT_ZONE = 1 << 5, /**< Trigger defining a Particle exiting the Zone */ - }; - - /** - * @class Modifier - * @brief A abstract class that defines a physical object acting on particles - * - * A Modifier is first defined by a Zone and a trigger to that Zone.
- * If the Particle triggers the Modifier, the Modifier's action is applied to the Particle.
- * An action can be anything that has effect on the Particle's parameters, position, velocity, life...
- *
- * If no Zone is attached to a Modifier the Zone is considered to be the entire universe.
- *
- * Like an Emitter, a Modifier can either be used automatically within a Group or manually directly by the user. - */ - class SPK_PREFIX Modifier : public Registerable, - public Transformable, - public BufferHandler - { - friend class ModifierGroup; - friend class Group; - friend class Particle; - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Modifier - * @param availableTriggers : the available triggers for this Modifier (OR-ed) - * @param trigger : the default trigger of the Modifier - * @param needsIntersection : true if the computation of the intersection is needed, false otherwise - * @param needsNormal : true if the computation of the normal is needed, false otherwise - * @param zone : the Zone of the Modifier - */ - Modifier(int availableTriggers = ALWAYS,ModifierTrigger trigger = ALWAYS,bool needsIntersection = false,bool needsNormal = false,Zone* zone = NULL); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Modifier */ - virtual ~Modifier() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets this Modifier active or not. - * - * An inactive Modifier will not affect its parent Group during update.
- * However it can still be used manually by the user. - * - * @param active : true to activate this Modifier, false to deactivate it - * @since 1.03.00 - */ - void setActive(bool active); - - /** - * @brief Sets the Zone of this Modifier - * - * If the Zone is NULL, the Zone is considered to be the entire universe. - * - * @param zone : the Zone of this Modifier - * @param full : true to consider the Zone as a full object so that particles are not allowed to be within - */ - void setZone(Zone* zone,bool full = false); - - /** - * @brief Sets the trigger of this Modifier - * - * if the trigger is not one of the available triggers (see getAvailableTriggers()) for this Modifier, - * nothing happens ad false is returned else the trigger is set and true is returned. - * - * @param trigger : the trigger of this Modifier - * @return true if the trigger can be set, false otherwise - */ - bool setTrigger(ModifierTrigger trigger); - - /** - * @brief Sets whether to consider this modifier local to a system or not - * - * A local modifier is transformed when its system is transformed, a non local one will not. - * - * @param local : true to consider the modifier local, false not to - * @since 1.03.02 - */ - void setLocalToSystem(bool local); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether this Modifier is active or not - * @return true if this Modifier is active, false if is is inactive - * @since 1.03.00 - */ - bool isActive() const; - - /** - * @brief Gets the Zone of this Modifier - * @return the Zone of this Modifier - */ - Zone* getZone() const; - - /** - * @brief Gets the trigger of this Modifier - * @return the trigger of this Modifier - */ - ModifierTrigger getTrigger() const; - - /** - * @brief Gets a flag containing all the available triggers for this Modifier - * @return a flag containing all the available triggers for this Modifier - */ - int getAvailableTriggers() const; - - /** - * @brief Tells whether the Zone of this Modifier is considerered to be full or not - * @return true if the Zone of this Modifier is considerered to be full, false if not - */ - bool isFullZone() const; - - /** - * @brief Tells whether this modifier is considered as being local to a system or not - * - * A local modifier is transformed when its system is transformed, a non local one will not. - * - * @return true if it is local, false if not - * @since 1.03.02 - */ - bool isLocalToSystem() const; - - /////////////// - // Interface // - /////////////// - - virtual Registerable* findByName(const std::string& name); - - protected : - - /** @brief the Vector3D that holds the intersection coordinates */ - static Vector3D intersection; - - /** @brief the Vector3D that holds the intersection coordinates */ - static Vector3D normal; - - /** @brief true if the Modifier needs the intersection computation, false if not */ - bool needsIntersection; - - /** @brief true if the Modifier needs the normal computation, false if not */ - bool needsNormal; - - /** @brief the current trigger of this Modifier */ - ModifierTrigger trigger; - - /** @brief a flag containing all the available triggers */ - const int availableTriggers; - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool createBase); - virtual void destroyChildren(bool keepChildren); - - virtual void propagateUpdateTransform(); - - private : - - Zone* zone; - bool full; - - bool active; - mutable bool savedActive; - - bool local; - - void beginProcess(Group& group); - void endProcess(Group& group); - void process(Particle& particle,float deltaTime) const; - - ////////////////////////// - // Pure virtual methods // - ////////////////////////// - - /** - * @brief A pure virtual method that modifies the Particle - * - * This is a pure virtual method to be implemented by children.
- * The Modifier on this Particle has already been triggered and the Particle must be modified by this method. - * - * @param particle : the Particle that has to be modified - * @param deltaTime : the time step - */ - virtual void modify(Particle& particle,float deltaTime) const = 0; - - /** - * @brief A pure virtual method that handles particles on the wrong side of this Modifier Zone. - * - * This is a pure virtual method to be implemented by children.
- * This method can be called internally with all triggers except SPK::TRIGGER_INTERSECTS.
- *
- * The method isFullZone() can be called to vary the behavior whether the Zone is full or not.
- * The boolean inside indicates whether the wrong side is inside (true) or outside (false) the Zone. - * - * @param particle : the Particle which is on the wrong side - * @param inside : true if the wrong side is inside, false if it is oustside - */ - virtual void modifyWrongSide(Particle& particle,bool inside) const {} - }; - - - inline void Modifier::setActive(bool active) - { - this->active = active; - } - - inline void Modifier::setLocalToSystem(bool local) - { - this->local = local; - } - - inline bool Modifier::isActive() const - { - return active; - } - - inline Zone* Modifier::getZone() const - { - return zone; - } - - inline ModifierTrigger Modifier::getTrigger() const - { - return trigger; - } - - inline int Modifier::getAvailableTriggers() const - { - return availableTriggers; - } - - inline bool Modifier::isFullZone() const - { - return full; - } - - inline bool Modifier::isLocalToSystem() const - { - return local; - } - - inline void Modifier::propagateUpdateTransform() - { - if (zone != NULL) - zone->updateTransform(this); - } - - inline void Modifier::endProcess(Group& group) - { - active = savedActive; // Restores the active state of the modifier - } - - inline void Modifier::process(Particle& particle,float deltaTime) const - { - switch(trigger) - { - case ALWAYS : - modify(particle,deltaTime); - break; - - case INSIDE_ZONE : - if ((zone == NULL)||(zone->contains(particle.position()))) - modify(particle,deltaTime); - else - modifyWrongSide(particle,true); - break; - - case OUTSIDE_ZONE : - if (zone == NULL) - return; - if (!zone->contains(particle.position())) - modify(particle,deltaTime); - else - modifyWrongSide(particle,false); - break; - - case INTERSECT_ZONE : - if (zone == NULL) - return; - if (zone->intersects(particle.oldPosition(), - particle.position(), - needsIntersection ? &intersection : NULL, - needsNormal ? &normal : NULL)) - modify(particle,deltaTime); - break; - - case ENTER_ZONE : - if (zone == NULL) - return; - if (zone->contains(particle.oldPosition())) - modifyWrongSide(particle,true); - else if (zone->intersects(particle.oldPosition(), - particle.position(), - needsIntersection ? &intersection : NULL, - needsNormal ? &normal : NULL)) - modify(particle,deltaTime); - break; - - case EXIT_ZONE : - if (zone == NULL) - return; - if (!zone->contains(particle.oldPosition())) - modifyWrongSide(particle,false); - else if (zone->intersects(particle.oldPosition(), - particle.position(), - needsIntersection ? &intersection : NULL, - needsNormal ? &normal : NULL)) - modify(particle,deltaTime); - break; - } - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Particle.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Particle.h deleted file mode 100644 index a0c82d8d0..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Particle.h +++ /dev/null @@ -1,430 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_PARTICLE -#define H_SPK_PARTICLE - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Pool.h" -#include "Core/SPK_Model.h" - - -namespace SPK -{ - class Group; - - /** - * @class Particle - * @brief A single particle (a point in space with a velocity and different parameters) - * - * A Particle is the primitive on which all the SPARK engine relies.
- * Particles are designed to be handled in large amounts (called Group). - * This is why the user cannot update or render directly a single Particle.
- *
- * Note that the Particle class is only a class that presents an interface to the user (since 1.02.00), particles data are stored in the groups. - * This is why copying a Particle will not copy its data.
- */ - class SPK_PREFIX Particle - { - friend bool isFurtherToCamera(const Particle&,const Particle&); - friend void swapParticles(Particle& a,Particle& b); - friend class Group; - friend class Pool; - - - public : - - /** - * @brief Sets the current value for the given parameter - * - * Note that the method will have no effect if the parameter is not enabled in the Particle's Model. - * In this case, the method returns false. - * - * @param type : the parameter to set - * @param value : the value of the parameter - * @return true if the parameter can be set, false otherwise (if the parameter is not enabled) - */ - bool setParamCurrentValue(ModelParam type,float value); - - /** - * @brief Sets the final value for the given parameter - * - * The final value is the value the parameter will have at the end of the Particle's life.
- * Note that the method will have no effect if the parameter is not mutable in the Particle's Model. - * In this case, the method returns false and setParamCurrentValue(ModelParam,float) should be used. - * - * @param type : the parameter to set - * @param value : the value of the parameter - * @return true if the parameter can be set, false otherwise (if the parameter is not mutable) - */ - bool setParamFinalValue(ModelParam type,float value); - - /** - * @brief Changes the current value for the given parameter - * - * The delta is added to the current value of the parameter.
- * For more information see setParamCurrentValue(ModelParam,float). - * - * @param type : the parameter to set - * @param delta : the delta - * @return true if the parameter can be changed, false otherwise (if the parameter is not enabled) - * @since 1.02.00 - */ - bool changeParamCurrentValue(ModelParam type,float delta); - - /** - * @brief Changes the final value for the given parameter - * - * The delta is added to the final value of the parameter.
- * For more information see setParamFinalValue(ModelParam,float). - * - * @param type : the parameter to set - * @param delta : the delta - * @return true if the parameter can be changed, false otherwise (if the parameter is not mutable) - * @since 1.02.00 - */ - bool changeParamFinalValue(ModelParam type,float delta); - - /** - * @brief Sets the life left of the Particle. - * - * When the Particle's life reaches 0, the Particle is inactivated. - * - * @param life : the amount of life left of the Particle - */ - void setLifeLeft(float life); - - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the position of the Particle - * @return the position of this Particle - * @since 1.02.00 - */ - Vector3D& position(); - - /** - * @brief Gets the velocity of the Particle - * @return the velocity of this Particle - * @since 1.02.00 - */ - Vector3D& velocity(); - - /** - * @brief Gets the old position of the Particle - * @return the old position of this Particle - * @since 1.02.00 - */ - Vector3D& oldPosition(); - - /** - * @brief Gets the position of the Particle - * - * This is the constant version of position() - * - * @return the position of this Particle - * @since 1.02.00 - */ - const Vector3D& position() const; - - /** - * @brief Gets the velocity of the Particle - * - * This is the constant version of velocity() - * - * @return the velocity of this Particle - * @since 1.02.00 - */ - const Vector3D& velocity() const; - - /** - * @brief Gets the old position of the Particle - * - * This is the constant version of oldPosition() - * - * @return the old position of this Particle - * @since 1.02.00 - */ - const Vector3D& oldPosition() const; - - /** - * @brief Gets the current value for the given parameter - * - * Note that if the the parameter is not enabled in the Particle's Model, the default value for the parameter is returned. - * - * @param type : the parameter to get the value - * @return the current value of the parameter - */ - float getParamCurrentValue(ModelParam type) const; - - /** - * @brief Gets the final value for the given parameter - * - * Note that if the the parameter is not enabled in the Particle's Model, the default value for the parameter is returned.
- * If the parameter is enabled but not mutable, the current value is returned. - * - * @param type : the parameter to get the value - * @return the current value of the parameter - */ - float getParamFinalValue(ModelParam type) const; - - /** - * @brief Gets the Model of this Particle - * @return A pointer on the Model of this Particle - */ - Model* getModel() const; - - /** - * @brief Gets the group of this Particle - * @return A pointer on the Group of this Particle - * @since 1.02.00 - */ - Group* getGroup() const; - - /** - * @brief Gets the index of this Particle in its Group - * @return the index of thi Particle in its Group - * @since 1.03.00 - */ - size_t getIndex() const; - - /** - * @brief Gets the amount of life left of the Particle - * - * The life left of the Particle is the time left before the Particle dies.
- * Note that in case of immortal particles, this value does not evolve. - * - * @return the amount of life left - */ - float getLifeLeft() const; - - /** - * @brief Gets the age of the Particle - * - * The age of a Particle starts at zero when it is initialized and evolve at each update.
- * Note that even immortal particles gets older. - * - * @return the age of the particle - * @since 1.03.00 - */ - float getAge() const; - - /** - * @brief Gets the distance of this Particle from the camera. - * - * Note that the correct distance is only returned if the Group of this Particles has its distance computation enabled. - * - * @return the distance of this Particle from the camera - * @since 1.01.00 - */ - float getDistanceFromCamera() const; - - /** - * @brief Gets the square distance of this Particle from the camera. - * - * Note that the correct distance is only returned if the Group of this Particles has its distance computation enabled.
- * This method is faster than getDistanceFromCamera() and should be used instead when possible. - * - * @return the square distance of this Particle from the camera - * @since 1.01.00 - */ - float getSqrDistanceFromCamera() const; - - /** - * @brief Tells whether this Particle was initialized at its latest update or not - * - * A call to this method is equivalent to getAge() == 0.0f - * - * @return true if this Particle was initialized at its latest update, false if not - * @since 1.03.00 - */ - bool isNewBorn() const; - - /** - * @brief Tells whether this Particle is alive or not - * - * A call to this method is equivalent to getLifeLeft > 0.0f - * - * @return true if this Particle is alive, false if it is dead - * @since 1.04.00 - */ - bool isAlive() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Initializes the Particle - * - * When a Particle is initialized, all its parameters are reinitialized as well as its life. - */ - void init(); - - /** - * @brief Kills this Particle - * - * This method is equivalent to a call to setLifeLeft(float) with life being 0.
- * - * @since 1.01.00 - */ - void kill(); - - // As we know the color component are always enabled, we optimizes it a bit for access - float getR() const { return currentParams[PARAM_RED]; } - float getG() const { return currentParams[PARAM_GREEN]; } - float getB() const { return currentParams[PARAM_BLUE]; } - - private : - - struct ParticleData - { - Vector3D oldPosition; - Vector3D position; - Vector3D velocity; - float age; - float life; - float sqrDist; - }; - - Group* group; - size_t index; - - ParticleData* data; - float* currentParams; - float* extendedParams; - - Particle(Group* group,size_t index); - - bool update(float timeDelta); - void computeSqrDist(); - - void interpolateParameters(); - }; - - - inline Group* Particle::getGroup() const - { - return group; - } - - inline size_t Particle::getIndex() const - { - return index; - } - - inline void Particle::setLifeLeft(float life) - { - data->life = life; - } - - inline Vector3D& Particle::position() - { - return data->position; - } - - inline Vector3D& Particle::velocity() - { - return data->velocity; - } - - inline Vector3D& Particle::oldPosition() - { - return data->oldPosition; - } - - inline const Vector3D& Particle::position() const - { - return data->position; - } - - inline const Vector3D& Particle::velocity() const - { - return data->velocity; - } - - inline const Vector3D& Particle::oldPosition() const - { - return data->oldPosition; - } - - inline float Particle::getLifeLeft() const - { - return data->life; - } - - inline float Particle::getAge() const - { - return data->age; - } - - inline float Particle::getDistanceFromCamera() const - { - return std::sqrt(data->sqrDist); - } - - inline float Particle::getSqrDistanceFromCamera() const - { - return data->sqrDist; - } - - inline bool Particle::isNewBorn() const - { - return data->age == 0.0f; - } - - inline bool Particle::isAlive() const - { - return data->life > 0.0f; - } - - inline void Particle::kill() - { - data->life = 0.0f; - } - - // specialization of the swap for particle - template<> - inline void Pool::swapElements(Particle& a,Particle& b) - { - swapParticles(a,b); - } - - - ////////////////////////////////// - // Global functions definitions // - ////////////////////////////////// - - inline bool isFurtherToCamera(const Particle& a, const Particle& b) - { - return a.getSqrDistanceFromCamera() > b.getSqrDistanceFromCamera(); - } - - // Swaps particle data. Used internally. Do not use with particles that are not from the same group ! - extern void swapParticles(Particle& a,Particle& b); -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Pool.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Pool.h deleted file mode 100644 index 5208a947e..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Pool.h +++ /dev/null @@ -1,1027 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_POOL -#define H_SPK_POOL - -#include "Core/SPK_DEF.h" - - -namespace SPK -{ - /** - * @class Pool - * @brief A generic container to handle a pool of objects - * - * A Pool is a container built upon a std vector. - * It allows to store continuous objects by handling active and inactive ones.
- *
- * A Pool is designed to be faster than a vector to handle. However, the order of elements is not fixed.
- * A Pool holds 2 continuous list of elements : the actives and the inactives : - *
    - *
  • When created, elements can either be activate or inactive.
  • - *
  • When activating an element, the first inactive element is swapped with the element to activate and the number of active elements is increased by 1.
  • - *
  • When inactivating an element, the last active element is swapped with the element to inactivate and the number of active elements is decreased by 1.
  • - *
- * So when activating or disactivating an element, a single swap is used which is faster than the displacement of all following elements when inserting or removing an element from a vector.
- * Elements are not removed in a Pool but only inactivated. Typically, elements will be removed when the Pool has to be destroyed or reinitialize.
- *
- * Another difference with a vector is that the reallocation is not automatic but only manual with a call to reallocate(unsigned int). - * Therefore adding elements to a full Pool will have no effect until its capacity is increased. - */ - template - class Pool - { - public : - - /** @brief the iterator of a Pool */ - typedef typename std::vector::iterator iterator; - - /** @brief the constant iterator of a Pool */ - typedef typename std::vector::const_iterator const_iterator; - - /** @brief the reverse iterator of a Pool */ - typedef typename std::vector::reverse_iterator reverse_iterator; - - /** @brief the constant reverse iterator of a Pool */ - typedef typename std::vector::const_reverse_iterator const_reverse_iterator; - - /** @brief the default capacity of a Pool */ - static const unsigned int DEFAULT_CAPACITY = 1000; - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of Pool - * - * The capacity is the maximum number of elements a Pool can hold.
- * Unlike a std vector, the capacity is not automatically increased when reaching it. - * The user has to manually make a call to reallocate(unsigned int) to increase the capacity. - * If an elements is added to a full Pool, nothing will happen. - * - * @param capacity : the maximum number of elements the Pool can hold - */ - Pool(size_t capacity = DEFAULT_CAPACITY); - - Pool(const Pool& pool); - - /////////////// - // Operators // - /////////////// - - Pool& operator=(const Pool& pool); - - /** - * @brief Gets the element of the Pool at index - * - * Note that the index is not tested and can therefore be out of bounds. - * - * @param index : the index of the element to access - * @return the accessed element - */ - T& operator[](size_t index); - - /** - * @brief Gets the element of the Pool at index - * - * This is the constant version of operator[](size_t). - * - * @param index : the index of the element to access - * @return the accessed element - */ - const T& operator[](size_t index) const; - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the number of active elements in this Pool - * - * This method is the standard equivalent to getNbActive() - * - * @return the number of active elements in this Pool - * @since 1.01.01 - */ - size_t size() const; - - /** - * @brief Gets the number of active elements in this Pool - * - * This method is equivalent to the standard size() - * - * @return the number of active elements in this Pool - */ - size_t getNbActive() const; - - /** - * @brief Gets the number of inactive elements in this Pool - * @return the number of inactive elements in this Pool - */ - size_t getNbInactive() const; - - /** - * @brief Gets the number of elements in this Pool - * - * the number of elements is defined by : number of active elements + number of inactive elements. - * - * @return the number of elements in this Pool - */ - size_t getNbTotal() const; - - /** - * @brief Gets the capacity of this Pool - * - * The capacity is the maximum number of elements a Pool can hold. - * - * @return the capacity of this Pool - */ - size_t getNbReserved() const; - - /** - * @brief Gets the room left for new elements in this Pool - * - * This is defined by : capacity - number of elements. - * - * @return the room left in this Pool - */ - size_t getNbEmpty() const; - - /** - * @brief Gets the maximum number of elements this Pool had - * - * This is useful to check if the capacity is well set or not. - * - * @return the maximum number of elements this Pool had - */ - size_t getMaxTotal() const; - - /////////////// - // Iterators // - /////////////// - - /** - * @brief Gets an iterator referring to the first active element in this Pool - * - * This method is the standard equivalent to beginActive(). - * - * @return an iterator referring to the first active element in this Pool - */ - iterator begin(); - - /** - * @brief Gets an iterator referring to the past-the-end active element in this Pool - * - * This method is the standard equivalent to endActive().
- * It also returns the same iterator as beginInactive() but, to respect the syntax, should not be used for the same purpose. - * - * @return an iterator referring to the past-the-end active element in this Pool - */ - iterator end(); - - /** - * @brief Gets an iterator referring to the first active element in this Pool - * - * This method is equivalent to the standard begin(). - * - * @return an iterator referring to the first active element in this Pool - */ - iterator beginActive(); - - /** - * @brief Gets an iterator referring to the past-the-end active element in this Pool - * - * This method is equivalent to the standard end().
- * It also returns the same iterator as beginInactive() but, to respect the syntax, should not be used for the same purpose. - * - * @return an iterator referring to the past-the-end active element in this Pool - */ - iterator endActive(); - - /** - * @brief Gets an iterator referring to the first inactive element in this Pool - * - * Note that this method retuns the same iterator as end() and endActive(), but due to syntax, should not be use for the same purpose. - * - * @return an iterator referring to the first inactive element in this Pool - */ - iterator beginInactive(); - - /** - * @brief Gets an iterator referring to the past-the-end inactive element in this Pool - * @return an iterator referring to the past-the-end inactive element in this Pool - */ - iterator endInactive(); - - /** - * @brief Gets an iterator referring to the first active element in this Pool - * - * This is the constant version of begin(). - * - * @return an iterator referring to the first active element in this Pool - */ - const_iterator begin() const; - - /** - * @brief Gets an iterator referring to the past-the-end active element in this Pool - * - * This is the constant version of end(). - * - * @return an iterator referring to the past-the-end active element in this Pool - */ - const_iterator end() const; - - /** - * @brief Gets an iterator referring to the first active element in this Pool - * - * This is the constant version of beginActive(). - * - * @return an iterator referring to the first active element in this Pool - */ - const_iterator beginActive() const; - - /** - * @brief Gets an iterator referring to the past-the-end active element in this Pool - * - * This is the constant version of endActive(). - * - * @return an iterator referring to the past-the-end active element in this Pool - */ - const_iterator endActive() const; - - /** - * @brief Gets an iterator referring to the first inactive element in this Pool - * - * This is the constant version of beginInactive(). - * - * @return an iterator referring to the first inactive element in this Pool - */ - const_iterator beginInactive() const; - - /** - * @brief Gets an iterator referring to the past-the-end inactive element in this Pool - * - * This is the constant version of endInactive(). - * - * @return an iterator referring to the past-the-end inactive element in this Pool - */ - const_iterator endInactive() const; - - /** - * @brief Gets a reverse iterator referring to the first active element in this Pool - * - * This method is the standard equivalent to rbeginActive(). - * - * @return a reverse iterator referring to the first active element in this Pool - */ - reverse_iterator rbegin(); - - /** - * @brief Gets a reverse iterator referring to the past-the-end active element in this Pool - * - * This method is the standard equivalent to rendActive().
- * It also returns the same reverse iterator as rbeginInactive() but, to respect the syntax, should not be used for the same purpose. - * - * @return a reverse iterator referring to the past-the-end active element in this Pool - */ - reverse_iterator rend(); - - /** - * @brief Gets a reverse iterator referring to the first active element in this Pool - * - * This method is equivalent to the standard rbegin(). - * - * @return a reverse iterator referring to the first active element in this Pool - */ - reverse_iterator rbeginActive(); - - /** - * @brief Gets a reverse iterator referring to the past-the-end active element in this Pool - * - * This method is equivalent to the standard rend().
- * It also returns the same reverse iterator as rbeginInactive() but, to respect the syntax, should not be used for the same purpose. - * - * @return a reverse iterator referring to the past-the-end active element in this Pool - */ - reverse_iterator rendActive(); - - /** - * @brief Gets a reverse iterator referring to the first inactive element in this Pool - * - * Note that this method retuns the same iterator as rend() and rendActive(), but due to syntax, should not be use for the same purpose. - * - * @return a reverse iterator referring to the first inactive element in this Pool - */ - reverse_iterator rbeginInactive(); - - /** - * @brief Gets a reverse iterator referring to the past-the-end inactive element in this Pool - * @return a reverse iterator referring to the past-the-end inactive element in this Pool - */ - reverse_iterator rendInactive(); - - /** - * @brief Gets a reverse iterator referring to the first active element in this Pool - * - * This is the constant version of rbegin(). - * - * @return a reverse iterator referring to the first active element in this Pool - */ - const_reverse_iterator rbegin() const; - - /** - * @brief Gets a reverse iterator referring to the past-the-end active element in this Pool - * - * This is the constant version of rend(). - * - * @return a reverse iterator referring to the past-the-end active element in this Pool - */ - const_reverse_iterator rend() const; - - /** - * @brief Gets a reverse iterator referring to the first active element in this Pool - * - * This is the constant version of rbeginActive(). - * - * @return a reverse iterator referring to the first active element in this Pool - */ - const_reverse_iterator rbeginActive() const; - - /** - * @brief Gets a reverse iterator referring to the past-the-end active element in this Pool - * - * This is the constant version of rendActive(). - * - * @return a reverse iterator referring to the past-the-end active element in this Pool - */ - const_reverse_iterator rendActive() const; - - /** - * @brief Gets a reverse iterator referring to the first inactive element in this Pool - * - * This is the constant version of rbeginInactive(). - * - * @return a reverse iterator referring to the first inactive element in this Pool - */ - const_reverse_iterator rbeginInactive() const; - - /** - * @brief Gets a reverse iterator referring to the past-the-end inactive element in this Pool - * - * This is the constant version of rendInactive(). - * - * @return a reverse iterator referring to the past-the-end inactive element in this Pool - */ - const_reverse_iterator rendInactive() const; - - ///////////////////// - // Elements access // - ///////////////////// - - /** - * @brief Gets the first active element - * - * This method is the standard equivalent to frontActive(). - * - * @return the first active element - * @since 1.01.01 - */ - T& front(); - - /** - * @brief Gets the last active element - * - * This method is the standard equivalent to backActive(). - * - * @return the last active element - * @since 1.01.01 - */ - T& back(); - - /** - * @brief Gets the first active element - * - * This method is equivalent to the standard front(). - * - * @return the first active element - * @since 1.01.01 - */ - T& frontActive(); - - /** - * @brief Gets the last active element - * - * This method is the equivalent to the standard back(). - * - * @return the last active element - * @since 1.01.01 - */ - T& backActive(); - - /** - * @brief Gets the first inactive element - * @return the first inactive element - * @since 1.01.01 - */ - T& frontInactive(); - - /** - * @brief Gets the last inactive element - * @return the last inactive element - * @since 1.01.01 - */ - T& backInactive(); - - /** - * @brief Gets the first active element - * - * This is the constant version of front(). - * - * @return the first active element - * @since 1.01.01 - */ - const T& front() const; - - /** - * @brief Gets the last active element - * - * This is the constant version of back(). - * - * @return the last active element - * @since 1.01.01 - */ - const T& back() const; - - /** - * @brief Gets the first active element - * - * This is the constant version of frontActive(). - * - * @return the first active element - * @since 1.01.01 - */ - const T& frontActive() const; - - /** - * @brief Gets the last active element - * - * This is the constant version of backActive(). - * - * @return the last active element - * @since 1.01.01 - */ - const T& backActive() const; - - /** - * @brief Gets the first inactive element - * - * This is the constant version of frontInactive(). - * - * @return the first inactive element - * @since 1.01.01 - */ - const T& frontInactive() const; - - /** - * @brief Gets the last inactive element - * - * This is the constant version of backInactive(). - * - * @return the last inactive element - * @since 1.01.01 - */ - const T& backInactive() const; - - - /////////////// - // Interface // - /////////////// - - /** - * @brief Fills the Pool with a copy of the passed element - * - * The Pool is filled entirely which means its number of elements will be equal to its capacity.
- * Note that all added elements are inactive. - * - * @param value : the element which will be copied into the Pool - */ - void assign(T& value); - - /** - * @brief Adds an active element to this Pool - * @param element : the element to add to this Pool - * @return true if the element can be added, false otherwise (if the Pool has no more room left) - */ - bool pushActive(T& element); - - /** - * @brief Adds an inactive element to this Pool - * @param element : the element to add to this Pool - * @return true if the element can be added, false otherwise (if the Pool has no more room left) - */ - bool pushInactive(T& element); - - /** - * @brief Inactivates an active element - * - * The index is tested and if it does not point to an active element, nothing will happen. - * - * @param index : the index of the active element to inactivate - */ - void makeInactive(size_t index); - - /** @brief Inactivates all the elements */ - void makeAllInactive(); - - /** - * @brief Activates the first inactive element - * - * A pointer to the activated element is returned. - * If there is no inactive element to activate, NULL is returned. - * - * @return a pointer to the activated element or NULL if there is no element to activate - */ - T* makeActive(); - - /** - * @brief Activates the index inactive element - * - * The index starts at the first inactive element.
- * This method is a bit slower than makeActive() but makeActive() has the same effect as makeActive(0).
- *
- * If the element at index is out of bounds, NULL is returned - * - * @param index : the inactive element to activate - * @return a pointer to the activated element or NULL if the index is out of bounds - */ - T* makeActive(size_t index); - - /** - * @brief Removes an element from this Pool - * - * The index is checked for bounds. If it is out of bounds nothing happens.
- *
- * Note that either an active or inactive element can be removed. - * - * @param index : the index of the element to remove - */ - void erase(size_t index); - - /** @brief Removes all elements in this Pool */ - void clear(); - - /** - * @brief reallocates the Pool - * - * This will invalidates all iterators on the Pool.
- * If the new capacity is smaller than the number of elements, nothing happens. - * - * @param capacity : the new desired capacity for this Pool - */ - void reallocate(size_t capacity); - - private : - - std::vector container; - - size_t nbActive; - size_t maxTotal; - - void swapElements(T& a,T& b); - }; - - - template - Pool::Pool(size_t capacity) : - nbActive(0), - maxTotal(0) - { - container.reserve(capacity); - } - - template - Pool::Pool(const Pool& pool) : - nbActive(pool.nbActive), - maxTotal(0), - container() - { - // the copy constructor of vector does not copy the capacity ! - container.reserve(pool.container.capacity()); - container = pool.container; - } - - template - Pool& Pool::operator=(const Pool& pool) - { - if (this != &pool) - { - nbActive = pool.nbActive(); - maxTotal = 0; - container.reserve(pool.container.capacity()); - container = pool.container; - } - return *this; - } - - template - T& Pool::operator[](size_t index) - { - return container[index]; - } - - template - const T& Pool::operator[](size_t index) const - { - return container[index]; - } - - template - inline size_t Pool::size() const - { - return nbActive; - } - - template - inline size_t Pool::getNbActive() const - { - return nbActive; - } - - template - inline size_t Pool::getNbInactive() const - { - return container.size() - nbActive; - } - - template - inline size_t Pool::getNbTotal() const - { - return container.size(); - } - - template - inline size_t Pool::getNbReserved() const - { - return container.capacity(); - } - - template - inline size_t Pool::getNbEmpty() const - { - return container.capacity() - container.size(); - } - - template - inline size_t Pool::getMaxTotal() const - { - return maxTotal; - } - - template - inline typename Pool::iterator Pool::begin() - { - return container.begin(); - } - - template - inline typename Pool::iterator Pool::end() - { - return container.begin() + nbActive; - } - - template - inline typename Pool::iterator Pool::beginActive() - { - return begin(); - } - - template - inline typename Pool::iterator Pool::endActive() - { - return end(); - } - - template - inline typename Pool::iterator Pool::beginInactive() - { - return end(); - } - - template - inline typename Pool::iterator Pool::endInactive() - { - return container.end(); - } - - template - inline typename Pool::const_iterator Pool::begin() const - { - return container.begin(); - } - - template - inline typename Pool::const_iterator Pool::end() const - { - return container.begin() + nbActive; - } - - template - inline typename Pool::const_iterator Pool::beginActive() const - { - return begin(); - } - - template - inline typename Pool::const_iterator Pool::endActive() const - { - return end(); - } - - template - inline typename Pool::const_iterator Pool::beginInactive() const - { - return end(); - } - - template - inline typename Pool::const_iterator Pool::endInactive() const - { - return container.end(); - } - - template - inline typename Pool::reverse_iterator Pool::rbegin() - { - return container.rbegin(); - } - - template - inline typename Pool::reverse_iterator Pool::rend() - { - return container.rbegin() + nbActive; - } - - template - inline typename Pool::reverse_iterator Pool::rbeginActive() - { - return rbegin(); - } - - template - inline typename Pool::reverse_iterator Pool::rendActive() - { - return rend(); - } - - template - inline typename Pool::reverse_iterator Pool::rbeginInactive() - { - return rend(); - } - - template - inline typename Pool::reverse_iterator Pool::rendInactive() - { - return container.rend(); - } - - template - inline typename Pool::const_reverse_iterator Pool::rbegin() const - { - return container.rbegin(); - } - - template - inline typename Pool::const_reverse_iterator Pool::rend() const - { - return container.rbegin() + nbActive; - } - - template - inline typename Pool::const_reverse_iterator Pool::rbeginActive() const - { - return rbegin(); - } - - template - inline typename Pool::const_reverse_iterator Pool::rendActive() const - { - return rend(); - } - - template - inline typename Pool::const_reverse_iterator Pool::rbeginInactive() const - { - return rend(); - } - - template - inline typename Pool::const_reverse_iterator Pool::rendInactive() const - { - return container.rend(); - } - - template - inline T& Pool::front() - { - return container.front(); - } - - template - inline T& Pool::back() - { - return container[nbActive - 1]; - } - - template - inline T& Pool::frontActive() - { - return front(); - } - - template - inline T& Pool::backActive() - { - return back(); - } - - template - inline T& Pool::frontInactive() - { - return container[nbActive]; - } - - template - inline T& Pool::backInactive() - { - return container.back(); - } - - template - inline const T& Pool::front() const - { - return container.front(); - } - - template - inline const T& Pool::back() const - { - return container[nbActive - 1]; - } - - template - inline const T& Pool::frontActive() const - { - return front(); - } - - template - inline const T& Pool::backActive() const - { - return back(); - } - - template - inline const T& Pool::frontInactive() const - { - return container[nbActive]; - } - - template - inline const T& Pool::backInactive() const - { - return container.back(); - } - - template - inline void Pool::assign(T& value) - { - container.insert(container.end(),getNbEmpty(),value); - } - - template - inline void Pool::swapElements(T& a,T& b) - { - std::swap(a,b); - } - - template - bool Pool::pushActive(T& element) - { - if (container.size() == container.capacity()) - return false; - - container.push_back(element); - swapElements(container[nbActive],container.back()); - ++nbActive; - - if (container.size() > maxTotal) - maxTotal = container.size(); - - return true; - } - - template - bool Pool::pushInactive(T& element) - { - if (container.size() == container.capacity()) - return false; - - container.push_back(element); - - if (container.size() > maxTotal) - maxTotal = container.size(); - - return true; - } - - template - void Pool::makeInactive(size_t index) - { - if (index >= nbActive) - return; - - swapElements(container[index],container[nbActive - 1]); - --nbActive; - } - - template - inline void Pool::makeAllInactive() - { - nbActive = 0; - } - - template - T* Pool::makeActive() - { - if (getNbInactive() == 0) - return NULL; - - ++nbActive; - return &container[0] + nbActive - 1; - } - - template - T* Pool::makeActive(size_t index) - { - if (getNbInactive() < index) - return NULL; - - swapElements(container[nbActive],container[nbActive + index]); - ++nbActive; - return &container[0] + nbActive - 1; - } - - template - void Pool::erase(size_t index) - { - if (index >= container.size()) - return; - - if (index < nbActive) - { - swapElements(container[index],container[nbActive - 1]); - --nbActive; - index = nbActive; - } - - swapElements(container[index],container.back()); - container.pop_back(); - } - - template - void Pool::clear() - { - container.clear(); - nbActive = 0; - } - - template - inline void Pool::reallocate(size_t capacity) - { - container.reserve(capacity); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_RegWrapper.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_RegWrapper.h deleted file mode 100644 index 17ae39b1f..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_RegWrapper.h +++ /dev/null @@ -1,114 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_REGWRAPPER -#define H_SPK_REGWRAPPER - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" - - -namespace SPK -{ - /** - * @class RegWrapper - * @brief A Wrapper class that allows to use any type of object as a Registerable - * - * It simply encapsulates an object of type defined at compilation time.
- * It allows to define the behavior of these Group attributes when a copy of the Group occurs.
- *
- * The user can use it to define an attribute of a custom Registerable child class that needs to act as a Registerable.
- *
- * WARNING : T must obviously not be itself a Registerable. - * - * @since 1.03.00 - */ - template - class RegWrapper : public Registerable - { - SPK_IMPLEMENT_REGISTERABLE(RegWrapper) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Default constructor of RegWrapper - * @param object : the inner object - */ - RegWrapper(const T& object = T()); - - /** - * @brief Creates and registers a new RegWrapper - * @param object : the inner object - * @return A new registered RegWrapper - * @since 1.04.00 - */ - static RegWrapper* create(const T& object = T()); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets a reference on the inner object - * @return a reference on the inner object - */ - T& get(); - - /** - * @brief Gets a constant reference on the inner object - * @return a constant reference on the inner object - */ - const T& get() const; - - private : - - T object; - }; - - - template - inline RegWrapper* RegWrapper::create(const T& object) - { - RegWrapper* obj = new RegWrapper(object); - registerObject(obj); - return obj; - - } - - template - inline T& RegWrapper::get() - { - return object; - } - - template - inline const T& RegWrapper::get() const - { - return object; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Registerable.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Registerable.h deleted file mode 100644 index c3eea28e2..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Registerable.h +++ /dev/null @@ -1,468 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_REGISTERABLE -#define H_SPK_REGISTERABLE - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Vector3D.h" - - -// A macro implementing the clone method for Registerable children -// Note that copyChildren and destroyChildren have to be implemented manually if needed -#define SPK_IMPLEMENT_REGISTERABLE(ClassName) \ -\ -virtual ClassName* clone(bool createBase) const \ -{ \ - ClassName* cloneObject = new ClassName(*this); \ - cloneObject->copyChildren(*this,createBase); \ - return cloneObject; \ -} \ -\ -public : \ -virtual std::string getClassName() const {return #ClassName;} - - -namespace SPK -{ - /** @brief the ID type of a Registerable */ - typedef unsigned long SPK_ID; - - /** @brief the ID constant value for unregistered Registerable */ - extern SPK_PREFIX const SPK_ID NO_ID; - - /** @brief an empty string defining the name of an object with no name */ - extern SPK_PREFIX const std::string NO_NAME; - - /** - * @class Registerable - * @brief the abstract base class for SPARK objects - * - * A Registerable defines a SPARK object that can be managed by the SPKFactory.
- *
- * In SPARK, a particle System is defined as a tree of objects. For instance, a System - * will contain some Renderer, Emitter and Modifier. Every Emitter and Modifier will - * contain a Zone...
- * All those Registerable are linked by association. A Registerable can be shared to several - * Registerable or belong to a single Registerable and die with it (composition).
- *
- * The SPKFactory offers a flexible system to define, create and destroy complex association - * of Registerable.
- *
- * Basically a Registerable has 3 parameters that will define its behavior : - *
    - *
  • Registered : a registered Registerable is managed by the SPKFactory to deal with copy and destruction.
  • - *
  • Shared : a shared Registerable will not be copied when copying its parent. Only its reference will. This allows - * for instance to change a parameter for many system with only a call. Note that this is valid only for registered - * Registerable copied with the SPKFactory.
  • - *
  • Destroyable : a destroyable Registerable is a Registerable that is allowed to be destroyed by the SPKFactory when destroying - * its parent (if it has no more references on it see below). If not destroyable, the destruction of the Registerable is the user's responsability. - * Note that a non destroyable Registerable can still be destroyed by the SPKFactory by a direct call.
  • - *
- * Moreover, every registered Registerable holds a counter of references that indicates how many registered Registerable hold a reference to it. - * A registered Registerable will only be destroyed by the SPKFactory if its number of references is 0 (except for a direct call to its destruction). - * - * @since 1.03.00 - */ - class SPK_PREFIX Registerable - { - friend class SPKFactory; - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** @brief Default constructor of Registerable */ - Registerable(); - - /** - * @brief Copy constructor of Registerable - * @param registerable : the Registerable to construct the new Registerable from - */ - Registerable(const Registerable& registerable); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Registerable */ - virtual ~Registerable(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Makes this Registerable shared or not - * - * By default, a Registerable is not shared - * - * @param shared : true to make this Registerable shared, false to make it unshared - */ - void setShared(bool shared); - - /** - * @brief Makes this Registerable destroyable or not - * - * A non destroyable Registerable cannot be destroyed internally. - * - * @param destroyable : true to make this Registerable destroyable, false to make it undestroyable - */ - void setDestroyable(bool destroyable); - - /** - * @brief Sets the name of this Registerable - * - * The name is an easy to find registerable in a tree.
- * See getName() and findByName(const std::string&) - * - * A constant NO_NAME exists to give no name to the registerable (an empty string) - * - * @param name : the name of this registerable - * @since 1.05.00 - */ - void setName(const std::string& name); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the ID of this Registerable - * - * If this Registerable is unregistered, NO_ID is returned.
- * Else an SPK_ID is returned. This ID uniquely identifies the Registerable. - * - * @return the ID of this Registerable or NO_ID if it is not registered - * @since 1.05.04 - */ - SPK_ID getSPKID() const; - - /** - * @brief Gets the ID of this Registerable - * @return the ID of this Registerable or NO_ID if it is not registered - * @deprecated 1.05.04 Use getSPKID instead - */ - SPK_ID getID() const; - - /** - * @brief Gets the number of references of this Registerable - * - * The number of references defines the number of times a registered Registerable - * is references within all the registered Registerable.
- *
- * 0 is always returned for an unregistered Registerable. - * - * @return the number of references of this Registerable - */ - unsigned int getNbReferences() const; - - /** - * @brief Tells whether this Registerable is registered or not - * @return true if this Registerable is registered, false if not - */ - bool isRegistered() const; - - /** - * @brief Tells whether this Registerable is shared or not - * @return true if this Registerable is shared, false if not - */ - bool isShared() const; - - /** - * @brief Tells whether this Registerable is destroyable or not - * @return true if this Registerable is destroyable, false if not - */ - bool isDestroyable() const; - - /** - * @brief Gets the name of this registerable - * - * The name is an easy to find registerable in a tree.
- * See setName(const std::string&) and findByName(const std::string&) - * - * @return the name of this registerable - * @since 1.05.00 - */ - const std::string& getName() const; - - /** - * @brief Gets the name of the class of the object - * - * This method is implemented in non abstract derived class of Registerable with the macro SPK_IMPLEMENT_REGISTERABLE(ClassName). - * - * @return the name of the class of the object as a std::string - */ - virtual std::string getClassName() const = 0; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Finds a registerable with its name recursively from this registerable - * - * If the name is not found, NULL is returned.
- * If the several objects with the same name exists, only the first one is returned.
- *
- * Note that the name of the registerable itself is already tested. - * - * @param name : the name of the registerable to find - * @return : the first registerable with that name within this registerable or NULL if none is found - * @since 1.05.00 - */ - virtual Registerable* findByName(const std::string& name); - - protected : - - /** - * @brief Registers a child of this Registerable - * - * This method has to be called in the registerChildren(bool) implementation of a derived class of Registerable.
- * It is called to allow correct registering and correct reference counting of the children Registerable when registering the Registerable. - * - * @param child : the child of this Registerable to register - * @param registerAll : true to register an unregistered child, false to only increment ref counts of an already registered child - * @since 1.04.00 - */ - void registerChild(Registerable* child,bool registerAll); - - /** - * @brief Copies a child of this Registerable - * - * This method has to be called in the copyChildren(const Registerable&,bool) implementation of a derived class of Registerable.
- * It is called to allow correct copy (of the object or of the reference only) of the children Registerable when copying the Registerable. - * - * @param child : the child of this Registerable to copy - * @param createBase : true if a base is created, false otherwise - * @return the children of the copy of this Registerable - */ - Registerable* copyChild(Registerable* child,bool createBase); - - /** - * @brief Destroys a child of this Registerable - * - * This method has to be called in the destroyChildren(bool) implementation of a derived class of Registerable.
- * It is called to allows the correct destruction (if not destroyable or references exist) of the children Registerable when destroying the Registerable. - * - * @param child : the child of this Registerable to destroy - * @param keepChildren : true to keep the children (used when destroying all registered Registerable) - * @return true if the child was destroyed, false if not - */ - bool destroyChild(Registerable* child,bool keepChildren); - - /** - * @brief Increments the number of references of the child by one - * - * This method has to be called when adding a child in the implementation of a derived class of Registerable.
- * It allows to keep the number of references of the child correct. - * - * @param child : the child of this Registerable to increment references of - */ - void incrementChildReference(Registerable* child); - - /** - * @brief Decrements the number of references of the child by one - * - * This method has to be called when removing a child in the implementation of a derived class of Registerable.
- * It allows to keep the number of references of the child correct. - * - * @param child : the child of this Registerable to decrement references of - */ - void decrementChildReference(Registerable* child); - - /** - * @brief Registers a Registerable in the factory - * - * This method allows to register an unregistered given object.
- * If the registerable is already registered nothing happen.
- *
- * If registerAll is set to true, all the unregistered children of this Registerable will be registered as well.
- * Apart from that, all registered children see their reference count increments by one, no matter the value of registerAll.
- *
- * Use this method with care as it is very important to never register a object that is allocated on the stack, as the factory - * may delete its registered object with a call to delete. - * - * @param obj : the registerable object to register - * @param registerAll : true to register all its unregistered children and chidren of children and so on, false not to - * @since 1.04.00 - */ - static void registerObject(Registerable* obj,bool registerAll = false); - - ///////////////////// - // Virtual methods // - ///////////////////// - - /** - * @brief Registers the children of this Registerable - * - * This method has to be implemented in derived classes of Registerable which hold pointers or references of Registerable children.
- * The registerChild(Registerable*,bool) has to be called within it for each child to copy from object.
- * The registerAll parameter of registerChild is simply the registerAll parameter of registerChildren. - * - * @param registerAll : true to register unregistered children, false to only increment ref counts of already registered children - * @since 1.04.00 - */ - virtual void registerChildren(bool registerAll){}; - - /** - * @brief Copies the children of object in this Registerable - * - * This method has to be implemented in derived classes of Registerable which hold pointers or references of Registerable children.
- * The copyChild(Registerable*,bool) has to be called within it for each child to copy from object.
- * The createBase parameter of copyChild is simply the createBase parameter of copyChildren. - * - * @param object : the object to copy the children from - * @param createBase : true if a base is created, false otherwise - */ - virtual void copyChildren(const Registerable& object,bool createBase){}; - - /** - * @brief Destroys the children of this Registerable - * - * This method has to be implemented in derived classes of Registerable which hold pointers or references of Registerable children.
- * The destroyChild(Registerable*,bool) has to be called within it for each child to destroy.
- * The keepChildren parameter of destroyChild is simply the keepChildren parameter of destroyChildren. - * - * @param keepChildren : true to keep the children (used when destroying all registered Registerable) - */ - virtual void destroyChildren(bool keepChildren){}; - - private : - - SPK_ID ID; - unsigned int nbReferences; - - std::string name; - - bool shared; - bool destroyable; - - // Those methods allow specific behavior when registering and unregistering in the SPKFactory - virtual void onRegister() {} // Called when a registerable is registered in the SPKFactory - virtual void onUnregister() {} // Called when a registerable is unregistered from the SPKFactory - - void incrementReference(); - void decrementReference(); - - // the assignment operator is private - Registerable& operator=(const Registerable& registerable); - - ///////////////////////// - // Pure virtual method // - ///////////////////////// - - /** - * @brief Clones this Registerable - * - * This method is implemented in non abstract derived class of Registerable with the macro SPK_IMPLEMENT_REGISTERABLE(ClassName). - * - * @param createBase : true if a base is created, false otherwise - * @return the clone of this Registerable - */ - virtual Registerable* clone(bool createBase) const = 0; - }; - - - inline void Registerable::setShared(bool shared) - { - this->shared = shared; - } - - inline void Registerable::setDestroyable(bool destroyable) - { - this->destroyable = destroyable; - } - - inline void Registerable::setName(const std::string& name) - { - this->name = name; - } - - inline SPK_ID Registerable::getSPKID() const - { - return ID; - } - - inline SPK_ID Registerable::getID() const - { - return getSPKID(); - } - - inline unsigned int Registerable::getNbReferences() const - { - return nbReferences; - } - - inline bool Registerable::isRegistered() const - { - return ID != NO_ID; - } - - inline bool Registerable::isShared() const - { - return shared; - } - - inline bool Registerable::isDestroyable() const - { - return destroyable; - } - - inline const std::string& Registerable::getName() const - { - return name; - } - - inline Registerable* Registerable::findByName(const std::string& name) - { - return getName().compare(name) == 0 ? this : NULL; - } - - inline void Registerable::incrementReference() - { - if (isRegistered()) - ++nbReferences; - } - - inline void Registerable::decrementReference() - { - if ((isRegistered())&&(nbReferences > 0)) - --nbReferences; - } - - inline void Registerable::incrementChildReference(Registerable* child) - { - if ((isRegistered())&&(child != NULL)) - child->incrementReference(); - } - - inline void Registerable::decrementChildReference(Registerable* child) - { - if ((isRegistered())&&(child != NULL)) - child->decrementReference(); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Renderer.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Renderer.h deleted file mode 100644 index 5b78cbcca..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Renderer.h +++ /dev/null @@ -1,220 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_RENDERER -#define H_SPK_RENDERER - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_BufferHandler.h" - - -namespace SPK -{ - class Group; - class Particle; - - /** - * @enum BlendingMode - * @brief Constants defining the available blending modes - * @since 1.04.00 - */ - enum BlendingMode - { - BLENDING_NONE, /**< No blending is applied. The particles will appeared as opaque */ - BLENDING_ADD, /**< The additive blending is useful to render particles that supposed to emit light (fire, magic spells...) */ - BLENDING_ALPHA, /**< The alpha blending is useful to render transparent particles */ - }; - - /** - * @enum RenderingHint - * @brief Constants defining the available rendering hints - * @since 1.04.00 - */ - enum RenderingHint - { - ALPHA_TEST = 1 << 0, /**< The alpha test. Enabling it is useful when rendering fully opaque particles with fully transparent zones (a texture of ball for instance) */ - DEPTH_TEST = 1 << 1, /**< The depth test. Disabling it is useful when rendering particles with additive blending without having to sort them. Note that disabling the depth test will disable the depth write as well. */ - DEPTH_WRITE = 1 << 2, /**< The depth write. Disabling it is useful when rendering particles with additive blending without having to sort them. Particles are still culled with the Zbuffer (when behind a wall for instance) */ - }; - - /** - * @class Renderer - * @brief An abstract class that renders particles - * - * A renderer is used to represent particle systems.
- * the representation of a particle system is totally independant to its computation.
- *
- * Some renderers (or renderers modes) may need some buffers be attached to the Group of particles they render.
- * rendering buffers are attached to groups but used by renderers. Their creation can also be given to renderer when needed.
- * By enabling the buffer creation with the static method enableBuffersCreation(bool), the renderer will create the buffers he needs, - * if not already created in the group, before rendering. If buffer creation is disabled, a group that dont have the correct buffers for the renderer, cannot - * be renderered, the render method of the renderer will simply exit.
- *
- * Note that buffers are linked to a class of renderer, not to a given renderer object.
- * Moreover buffers have an inner flag that can vary function of the states of the renderer used. - */ - class SPK_PREFIX Renderer : public Registerable, - public BufferHandler - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of Renderer */ - Renderer(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Renderer */ - virtual ~Renderer(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets this Renderer active or not. - * - * An inactive Renderer will render its parent Group when a call to Group::render() is made.
- * However it can still be used manually by the user with render(Group&). - * - * @param active : true to activate this Renderer, false to deactivate it - * @since 1.03.00 - */ - void setActive(bool active); - - /** - * @brief Sets the blending mode of this renderer - * - * This is a generic method that allows to set most common blending modes in a generic way. - * However renderers can implement method to give more control over the blending mode used. - * - * @param blendMode : the blending mode to use - * @since 1.04.00 - */ - virtual void setBlending(BlendingMode blendMode) = 0; - - /** - * @brief Enables or disables a rendering hint - * - * Note that as stated, these are only hints that may not be taken into account in all rendering APIs - * - * @param renderingHint : the renderingHint to enable or disable - * @param enable : true to enable it, false to disable it - * @since 1.04.00 - */ - virtual void enableRenderingHint(RenderingHint renderingHint,bool enable); - - /** - * @brief Tells the alpha threshold to use when the ALPHA_TEST is enabled - * - * The operation performs by the alpha test is greater or equal to threshold - * - * @param alphaThreshold : the alpha threshold to use for the alpha test - * @since 1.04.00 - */ - virtual void setAlphaTestThreshold(float alphaThreshold); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether this Renderer is active or not - * @return true if this Renderer is active, false if is is inactive - * @since 1.03.00 - */ - bool isActive() const; - - /** - * @brief Tells whether a rendering hint is enabled or not - * @param renderingHint : the rendering hint - * @since 1.04.00 - */ - virtual bool isRenderingHintEnabled(RenderingHint renderingHint) const; - - /** - * @brief Gets the alpha threhold used by the alpha test - * @return the alpha threhold used by the alpha test - * @since 1.04.00 - */ - float getAlphaTestThreshold() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Renders a Group of particles - * @param group : the Group to render - */ - virtual void render(const Group& group) = 0; - - private : - - bool active; - - int renderingHintsMask; - float alphaThreshold; - }; - - - inline void Renderer::setActive(bool active) - { - this->active = active; - } - - inline void Renderer::enableRenderingHint(RenderingHint renderingHint,bool enable) - { - if (enable) - renderingHintsMask |= renderingHint; - else - renderingHintsMask &= ~renderingHint; - } - - inline void Renderer::setAlphaTestThreshold(float alphaThreshold) - { - this->alphaThreshold = alphaThreshold; - } - - inline bool Renderer::isActive() const - { - return active; - } - - inline bool Renderer::isRenderingHintEnabled(RenderingHint renderingHint) const - { - return (renderingHintsMask & renderingHint) != 0; - } - - inline float Renderer::getAlphaTestThreshold() const - { - return alphaThreshold; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_System.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_System.h deleted file mode 100644 index 45999d991..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_System.h +++ /dev/null @@ -1,457 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SYSTEM -#define H_SPK_SYSTEM - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Transformable.h" -#include "Core/SPK_Vector3D.h" - - -namespace SPK -{ - class Group; - class Vector3D; - - - /** - * @enum StepMode - * @brief Enumeration defining how to handle the step time of particle systems - * @since 1.05.00 - */ - enum StepMode - { - STEP_REAL, /**< The step time is the deltatime passed by the user */ - STEP_CONSTANT, /**< The step time is a constant time therefore 0 to many updates may occur in a call */ - STEP_ADAPTIVE, /**< The step time is a range between 2 values therefore 0 to many updates may occur in a call */ - }; - - /** - * @class System - * @brief A whole system of particles - * - * This class defines a whole system of particles. It contains particle groups.
- * It offers a way to handle a system very easily.
- * Basically a particle system is updated by calling update(unsigned int) and renderered with render() at each frame.
- *
- * Note that a System is only a helper class to manage many Groups. However it can be omitted and groups can be updated and rendered alone.
- *
- * A System is transformable. If the system is transformed, all its sub emitters will be transformed as well. However, its modifiers will not - * (modifiers can be described in the world coordinates already). If you wish to transform some of its modifiers as well, you will have to do it aside. - */ - class SPK_PREFIX System : public Registerable, public Transformable - { - SPK_IMPLEMENT_REGISTERABLE(System) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of System */ - System(); - - /** - * @brief Creates and registers a new System - * @return A new registered System - * @since 1.04.00 - */ - static System* create(); - - //////////////// - // Destructor // - //////////////// - - virtual ~System() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the camera position - * - * Note that the camera position is only useful if a group has to be sorted.
- * In that case this vector will be used as the camera position to derive the distance between the particle and the camera position.
- * The camera position has to be updated before an update of the sorted group. - * - * @param cameraPosition the camera position - */ - static void setCameraPosition(const Vector3D& cameraPosition); - - /** - * @brief Enables or not the clamping on the deltaTime when updating systems - * - * This allows to limit too big deltaTime which may spoil your particle systems.
- * Basically if the deltaTime is higher than the clamp value, the clamp calue is used as the deltaTime.
- *
- * It allows in real step mode to avoid having too big deltaTimes and in the other 2 modes to avoid having too - * many updates that may slow down the application.
- *
- * Note that setting the clamp value too low may slow down your systems - * - * @param useClampStep : true to use a clamp value on the step, false not to - * @param clamp : the clamp value - * @since 1.05.00 - */ - static void setClampStep(bool useClampStep,float clamp = 1.0f); - - /** - * @brief Uses a constant step to update the systems - * - * This tells the system to be updated with a constant time.
- * Depending on the deltaTime passed for the update, 0 to many updates can occur.
- * For example if the delta time is 1.0 and the constant step is 0.1 then 10 updates of time 0.1 will occur.
- *
- * This mode is useful when the update must be constant (accurate collisions...) but be aware it can be very computationnaly intensive. - * - * @param constantStep : the value of the step - * @since 1.05.00 - */ - static void useConstantStep(float constantStep); - - /** - * @brief Uses an adaptive step to update the systems - * - * This tells the system to be updated with a time between min and max.
- * If the deltaTime passed is higher than maxStep or lower than minStep then this mode operates like the constant step mode with - * either constant time being maxStep or minStep (respectivally).
- * If the deltaTime lies between minStep and maxStep then this mode performs like the real step mode.
- *
- * This mode is a good alternative between the other two.
- * Combined with the clamp step, it allows to correctly handle the step time without being to much frame rate dependant. - * - * @param minStep : the minimal time step - * @param maxStep : the maximal time step - * @since 1.05.00 - */ - static void useAdaptiveStep(float minStep,float maxStep); - - /** - * @brief Uses the real step to update the systems - * - * This is the basic mode (and the mode per default) to update the systems.
- * One call to update means one update of time deltaTime.
- *
- * This mode is the simpler and the one that allows best performance on low end systems.
- * However the update may be inaccurate (due to too big deltaTime) and it performs badly with frame rate variation. - * - * @since 1.05.00 - */ - static void useRealStep(); - - /** - * @brief Enables or disables the computation of the axis aligned Vector for this System - * - * Enabling the computation of the AABB for the System only takes the AABB of all AABB of the Groups within the System where AABB computation is enabled.
- * see Group::enableAABBComputing(bool) for more details. - * - * @param AABB : true to enable the computing of the AABB of this System, false to disable it - */ - void enableAABBComputing(bool AABB); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the camera position - * - * Note that the camera position vector is only read by SPARK. Only the user modifies it. - * - * @return the camera position - */ - static const Vector3D& getCameraPosition(); - - /** - * @brief Gets the current step mode - * @return the current step mode - */ - static StepMode getStepMode(); - - /** - * @brief Gets the number of active particles in this system - * - * The number of active particles in the system is the addition of the number of active particles in each group of the system.
- * Note that the number of active particle of the system is updated after each update of the system.
- * This means if the user changes manually the number of particles in a group and call this method before an update, the number returned will not be up to date.
- * To compute and get the real number of active particles in the System, see computeNbParticles(). - * - * @return the number of active particle in the system - */ - size_t getNbParticles() const; - - /** - * @brief Computes the number of active particles in this System and returns it - * - * Unlike getNbParticles() which returns the last number of particles computed (after a call to update(float) or empty()), - * this method recomputes the current number of active particles by parsing all the groups of this System.
- * In that way, this method must not be used as an accessor but call once when necesseray between 2 updates.
- *
- * Note that this method updates the inner number of particles of this System, which means a call to getNbParticles() will - * then return the computed number. - * - * @return the number of active particle in the system - * @since 1.02.01 - */ - size_t computeNbParticles(); - - /** - * @brief Gets the number of groups in the System - * @return the number of groups in the System - */ - size_t getNbGroups() const; - - /** - * @brief Gets the vector of the groups (pointers) in this System - * - * This method allows to modify Group parameters within the System.
- * Note that for addition and removal, methods addGroup(Group*) and removeGroup(Group*) must exist.
- * - * @return a STL vector containing the groups in the System - */ - const std::vector& getGroups() const; - - /** - * @brief Gets the Group at index - * - * Note that no bound check is performed. - * - * @param index : the index of the Group to get - * @return the Group at index - * @since 1.03.00 - */ - Group* getGroup(size_t index); - - /** - * @brief Tells whether the computation of the axis aligned bouding box is enabled - * - * For a description of the computation of the AABB, see enableAABBComputing(bool). - * - * @return true if the computation of the AABB is enabled, false if it is disabled - */ - bool isAABBComputingEnabled() const; - - /** - * @brief Gets a Vector3D holding the minimum coordinates of the AABB of this System. - * - * Note that this method is only useful when the AABB computation is enabled (see enableAABBComputing(bool)). - * - * @return a Vector3D holding the minimum coordinates of the AABB of this System - * @since 1.01.00 - */ - const Vector3D& getAABBMin() const; - - /** - * @brief Gets a Vector3D holding the maximum coordinates of the AABB of this System. - * - * Note that this method is only useful when the AABB computation is enabled (see enableAABBComputing(bool)). - * - * @return a Vector3D holding the maximum coordinates of the AABB of this System - * @since 1.01.00 - */ - const Vector3D& getAABBMax() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Adds a Group to the System - * @param group : a pointer on the Group to add to the System - */ - void addGroup(Group* group); - - /** - * @brief Removes a Group from the System - * - * If the Group cannot be found, nothing happens. - * - * @param group : a pointer on the Group to remove from the System - */ - void removeGroup(Group* group); - - /** - * @brief Updates the System of the current time step - * - * Note that this method updates all groups in the System from first to last. - * - * @param deltaTime : the time step - * @return true if the System is still active (has active groups) - */ - virtual bool update(float deltaTime); - - /** - * @brief Renders particles in the System - * - * Note that this method renders all groups in the System from first to last. - */ - virtual void render() const; - - /** - * @brief Makes this System grow to the given time - * - * This method is useful to get a newwly created System to a mature state.
- * This method only calls update(float) with the step until the total update time reaches the time. - * - * @param time : the total time of which to update this System - * @param step : the time the System is updated at each call to update(float) - * - * @since 1.01.00 - */ - void grow(float time,float step); - - /** - * @brief Empties the System - * - * This method will make all particles in the System inactive.
- * However all connections are kept which means groups are still in theSystem. - */ - void empty(); - - /** - * @brief Sorts the particles in all the group of this System where the sorting is enabled - * - * Note that the sorting is also performed during the update.
- * This method is therefore only useful when the camera position changes several times between 2 updates.
- *
- * This methods calls the Group::sortParticles() of each Group in this System. - * - * @since 1.01.00 - */ - void sortParticles(); - - /** - * @brief Computes the distances between each Particle in each Group of this System - * - * Note that the distances computation is also performed during the update.
- * This method is therefore only useful when the camera position changes several times between 2 updates.
- *
- * This methods calls the Group::computeDistances() of each Group in this System. - * - * @since 1.01.00 - */ - void computeDistances(); - - /** - * @brief Computes the bounding box of this System and of all groups in the System - * - * The bounding box of the System is only computed if the System has its bounding box computing enabled.
- * In the same way, the bounding box of a Group within the System is only computed if the Group has its bounding box computing enabled.
- *
- * Note that the computation of bounding boxes is also performed during the update.
- * This method is therefore only useful when the bounding boxes have to be recomputed between 2 updates.
- *
- * This methods calls the Group::computeAABB() of each Group in this System. - * - * @since 1.01.00 - */ - void computeAABB(); - - virtual Registerable* findByName(const std::string& name); - - protected : - - std::vector groups; - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool keepChildren); - virtual void destroyChildren(bool createBase); - - virtual void propagateUpdateTransform(); - - private : - - static Vector3D cameraPosition; - - static StepMode stepMode; - static float constantStep; - static float minStep; - static float maxStep; - - static bool clampStepEnabled; - static float clampStep; - - float deltaStep; - - size_t nbParticles; - - bool boundingBoxEnabled; - Vector3D AABBMin; - Vector3D AABBMax; - - bool innerUpdate(float deltaTime); - }; - - - inline System* System::create() - { - System* obj = new System; - registerObject(obj); - return obj; - } - - inline void System::enableAABBComputing(bool AABB) - { - boundingBoxEnabled = AABB; - } - - inline size_t System::getNbParticles() const - { - return nbParticles; - } - - inline size_t System::getNbGroups() const - { - return groups.size(); - } - - inline const std::vector& System::getGroups() const - { - return groups; - } - - inline Group* System::getGroup(size_t index) - { - return groups[index]; - } - - inline bool System::isAABBComputingEnabled() const - { - return boundingBoxEnabled; - } - - inline const Vector3D& System::getAABBMin() const - { - return AABBMin; - } - - inline const Vector3D& System::getAABBMax() const - { - return AABBMax; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Transformable.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Transformable.h deleted file mode 100644 index bc1181d51..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Transformable.h +++ /dev/null @@ -1,590 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_TRANSFORMABLE -#define H_SPK_TRANSFORMABLE - -#include "Core/SPK_Vector3D.h" - - -namespace SPK -{ - class Zone; - - - /** - * @class Transformable - * @brief an abstract class that allows matrix transformations - * - * Every SPARK object that can be transformated thanks to a matrix should derive from this class.
- * A Transformable stores a matrix and performs operation on object parameters function of its matrix.
- *
- * It allows for instance to transform all emitters and zones in a system with a transform matrix.
- * Particles are still living in the world coordinates (unlike transforming the rendering process).
- *
- * Note that SPARK is not a linear algebra library, so this class does not offers lots of matri operations.
- * It is rather designed to be plugged within an existing engine with its own matrix system.
- *
- * SPARK was not designed to offer a complete scene graph. Even if the library can handle matrices stack, it does not - * offer lots of possibilities. Once again it was designed to be used with an existing outer scene graph. - *
- * The transforms used are continuous-in-memory homogeneous matrices with vectors being stored with their coordinates contiguous :
- * [side.x side.y side.z side.w up.x up.y up.z up.w look.x look.y look.z look.w pos.x pos.y pos.z pos.w]
- * (look being -look in right-handed coordinate systems)
- * - * @since 1.03.00 - */ - class SPK_PREFIX Transformable - { - public : - - /////////////// - // Constants // - /////////////// - - /** @brief The number of floats held by a transform */ - static const size_t TRANSFORM_LENGTH = 16; - - /** @brief The identity matrix */ - static const float IDENTITY[TRANSFORM_LENGTH]; - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of Transformable */ - Transformable(); - - Transformable(const Transformable& transformable); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Transformable */ - virtual ~Transformable() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the local transform of this Transformable - * - * Note that the matrix must contain the following value in that order :
- * [side.x side.y side.z side.w up.x up.y up.z up.w look.x look.y look.z look.w pos.x pos.y pos.z pos.w]
- * (look being -look in right-handed coordinate systems)
- *
- * The matrix being row or column major is just a convention which is not important.
- * The only thing that matters is that vectors coordinates are contiguous in memory.
- * If not, see setTransformNC(const float*) - * - * @param transform : the transform to copy its content from - */ - void setTransform(const float* transform); - - /** - * @brief Sets the local transfom of this Transformable from a "non contiguous vector coordinates" matrix - * - * Note that the matrix must contain the following value in that order :
- * [side.x up.x look.x pos.x side.x up.x look.x pos.x side.x up.x look.x pos.x side.w up.w look.w pos.w]
- * (look being -look in right-handed coordinate systems)
- *
- * Note the inner transform is stored with vector coordinates being contiguous in memory.
- * See setTransform(const float*) - * - * @param transform : the transform to copy its content from - */ - void setTransformNC(const float* transform); - - /** - * @brief Sets the position of the local transform - * - * The orientation is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param pos : the position of the local transform - * @since 1.05.00 - */ - void setTransformPosition(const Vector3D& pos); - - /** - * @brief Sets the orientation of the local transform in a right-handed system - * - * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param look : the look vector of the transformable - * @param up : the up vector of the transformable - * @since 1.05.00 - */ - void setTransformOrientationRH(Vector3D look,Vector3D up); - - /** - * @brief Sets the orientation of the local transform in a left-handed system - * - * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param look : the look vector of the transformable - * @param up : the up vector of the transformable - * @since 1.05.00 - */ - void setTransformOrientationLH(Vector3D look,Vector3D up); - - /** - * @brief Sets the orientation of the local transform - * - * This method allows to set the orientation around an arbitrary axis.
- * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param axis : the axis of rotation - * @param angle : the angle of rotation around the axis - * @since 1.05.00 - */ - void setTransformOrientation(Vector3D axis,float angle); - - /** - * @brief Sets the orientation of the local transform - * - * This method allows to set the orientation around an the x axis.
- * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param angle : the angle of rotation around the x axis - * @since 1.05.00 - */ - void setTransformOrientationX(float angle); - - /** - * @brief Sets the orientation of the local transform - * - * This method allows to set the orientation around an the y axis.
- * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param angle : the angle of rotation around the y axis - * @since 1.05.00 - */ - void setTransformOrientationY(float angle); - - /** - * @brief Sets the orientation of the local transform - * - * This method allows to set the orientation around an the z axis.
- * The position is left untouched.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param angle : the angle of rotation around the z axis - * @since 1.05.00 - */ - void setTransformOrientationZ(float angle); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the local transform of this Transformable - * @return a pointer to the local transform of this Transformable - */ - const float* getLocalTransform() const; - - /** - * @brief Gets the world transform of this Transformable - * @return a pointer to the world transform of this Transformable - */ - const float* getWorldTransform() const; - - /** - * @brief Tells whether the local transform is the identity or not - * @return true if the local transform is identity, false if not - */ - bool isLocalIdentity() const; - - /** - * @brief Gets the position of the local transform - * @return the position of the local transform - * @since 1.05.00 - */ - Vector3D getLocalTransformPos() const; - - /** - * @brief Gets the side vector of the local transform - * @return the side vector of the local transform - * @since 1.05.00 - */ - Vector3D getLocalTransformSide() const; - - /** - * @brief Gets the up vector of the local transform - * @return the up vector of the local transform - * @since 1.05.00 - */ - Vector3D getLocalTransformUp() const; - - /** - * @brief Gets the look vector of the local transform in a right-handed system - * @return the look vector of the local transform - * @since 1.05.00 - */ - Vector3D getLocalTransformLookRH() const; - - /** - * @brief Gets the look vector of the local transform in a left-handed system - * @return the look vector of the local transform - * @since 1.05.00 - */ - Vector3D getLocalTransformLookLH() const; - - /** - * @brief Gets the position of the world transform - * @return the position of the world transform - * @since 1.05.00 - */ - Vector3D getWorldTransformPos() const; - - /** - * @brief Gets the side vector of the world transform - * @return the side vector of the world transform - * @since 1.05.00 - */ - Vector3D getWorldTransformSide() const; - - /** - * @brief Gets the up vector of the world transform - * @return the up vector of the world transform - * @since 1.05.00 - */ - Vector3D getWorldTransformUp() const; - - /** - * @brief Gets the look vector of the world transform in a right-handed system - * @return the look vector of the world transform - * @since 1.05.00 - */ - Vector3D getWorldTransformLookRH() const; - - /** - * @brief Gets the look vector of the world transform in a left-handed system - * @return the look vector of the world transform - * @since 1.05.00 - */ - Vector3D getWorldTransformLookLH() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief lookAt method for a right-handed system - * - * The vectors are normalized internally.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param target : the point the transformable is looking at - * @param up : the up vector of the transformable - * @param pos : the position of the transformable - * @since 1.05.00 - */ - void lookAtRH(const Vector3D& target,Vector3D up,const Vector3D& pos); - - /** - * @brief lookAt method for a left-handed system - * - * The vectors are normalized internally.
- *
- * Note that this methods sets the local transform. - * To compute the world transform and propagate it, updateTransform(const Transformable*) must be called afterwards. - * - * @param target : the point the transformable is looking at - * @param up : the up vector of the transformable - * @param pos : the position of the transformable - * @since 1.05.00 - */ - void lookAtLH(const Vector3D& target,Vector3D up,const Vector3D& pos); - - /** - * @brief Updates the world transform of this Transformable - * - * The parent transform and the local transform is used to derive the world transform.
- * If parent is NULL, the local transform is simply copied to the world transform.
- *
- * Note that this method only updates the transform if needed - * - * @param parent : the parent node of this Transformable or NULL - */ - void updateTransform(const Transformable* parent = NULL); - - /** @brief Resets the transform to identity */ - void resetTransform(); - - protected : - - /** - * @brief A helper method to transform a position from local to world coordinates - * @param tPos : the resulting transformed position - * @param pos : the position in local coordinates - */ - void transformPos(Vector3D& tPos,const Vector3D& pos); - - /** - * @brief A helper method to transform a direction from local to world coordinates - * @param tDir : the resulting transformed direction - * @param dir : the direction in local coordinates - */ - void transformDir(Vector3D& tDir,const Vector3D& dir); - - /** - * @brief Tells whether this Transformable needs update or not - * @return true if it needs update, false if not - */ - bool isUpdateNotified() const; - - /** - * @brief Notifies the Transformable for a update need - * - * This method has to be called when modifying a parameter that impose the transform's recomputation. - */ - void notifyForUpdate(); - - /** - * @brief Gets the latest parent of this Transformable - * @return the latest parent of this Transformable or NULL - */ - const Transformable* getParentTransform() const; - - /** - * @brief Updates all the parameters in the world coordinates - * - * This method can be overriden in derived classes of Transformable (By default it does nothing).
- * It is this method task to compute all parameters of the class that are dependent of the world transform. - */ - virtual void innerUpdateTransform() {} - - /** - * @brief Propagates the update of the transform to transformable children of this transformable - * - * This method can be overriden in derived classes of Transformable (By default it does nothing).
- * It is this method task to call the updateTransform method of transformable children of this transformable. - * - * @since 1.05.00 - */ - virtual void propagateUpdateTransform() {} - - private : - - float local[TRANSFORM_LENGTH]; - float world[TRANSFORM_LENGTH]; - - unsigned long int currentUpdate; - unsigned long int lastUpdate; - unsigned long int lastParentUpdate; - bool localIdentity; - - const Transformable* parent; - - static void multiply( - float* dest, - const float* src0, - const float* src1); - - static void multiply( - Vector3D& dest, - const Vector3D& v, - const float* m); - - static void rotate( - Vector3D& dest, - const Vector3D& v, - const float* m); - }; - - - inline void Transformable::setTransform(const float* transform) - { - std::memcpy(local,transform,sizeof(float) * TRANSFORM_LENGTH); - localIdentity = false; - notifyForUpdate(); - } - - inline const float* Transformable::getLocalTransform() const - { - return local; - } - - inline const float* Transformable::getWorldTransform() const - { - return world; - } - - inline bool Transformable::isLocalIdentity() const - { - return localIdentity; - } - - inline Vector3D Transformable::getLocalTransformPos() const - { - return Vector3D(local[12],local[13],local[14]); - } - - inline Vector3D Transformable::getLocalTransformSide() const - { - return Vector3D(local[0],local[1],local[2]); - } - - inline Vector3D Transformable::getLocalTransformUp() const - { - return Vector3D(local[4],local[5],local[6]); - } - - inline Vector3D Transformable::getLocalTransformLookRH() const - { - return Vector3D(-local[8],-local[9],-local[10]); - } - - inline Vector3D Transformable::getLocalTransformLookLH() const - { - return Vector3D(local[8],local[9],local[10]); - } - - inline Vector3D Transformable::getWorldTransformPos() const - { - return Vector3D(world[12],world[13],world[14]); - } - - inline Vector3D Transformable::getWorldTransformSide() const - { - return Vector3D(world[0],world[1],world[2]); - } - - inline Vector3D Transformable::getWorldTransformUp() const - { - return Vector3D(world[4],world[5],world[6]); - } - - inline Vector3D Transformable::getWorldTransformLookRH() const - { - return Vector3D(-world[8],-world[9],-world[10]); - } - - inline Vector3D Transformable::getWorldTransformLookLH() const - { - return Vector3D(world[8],world[9],world[10]); - } - - inline void Transformable::lookAtRH(const Vector3D& target,Vector3D up,const Vector3D& pos) - { - setTransformOrientationRH(target - pos,up); - setTransformPosition(pos); - } - - inline void Transformable::lookAtLH(const Vector3D& target,Vector3D up,const Vector3D& pos) - { - setTransformOrientationLH(target - pos,up); - setTransformPosition(pos); - } - - inline void Transformable::resetTransform() - { - setTransform(IDENTITY); - localIdentity = true; - } - - inline bool Transformable::isUpdateNotified() const - { - return lastUpdate != currentUpdate; - } - - inline void Transformable::notifyForUpdate() - { - ++currentUpdate; - } - - inline const Transformable* Transformable::getParentTransform() const - { - return parent; - } - - inline void Transformable::multiply( - float* dest, - const float* src0, - const float* src1) - { - // naive matrix multiplication approach - // warning : no self assignment ! - for (size_t i = 0; i < 4; ++i) - { - for (size_t j = 0; j < 4; ++j) - { - dest[(i << 2) + j] = 0.0f; - for (size_t k = 0; k < 4; ++k) - dest[(i << 2) + j] += src0[(k << 2) + j] * src1[(i << 2) + k]; - //++dest; - } - //++dest; - } - } - - inline void Transformable::multiply( - Vector3D& dest, - const Vector3D& v, - const float* m) - { - // warning : no self assignment ! - // w coord of vectors is implicitely 1 - dest.x = v.x * m[0] + v.y * m[4] + v.z * m[8] + m[12]; - dest.y = v.x * m[1] + v.y * m[5] + v.z * m[9] + m[13]; - dest.z = v.x * m[2] + v.y * m[6] + v.z * m[10] + m[14]; - } - - inline void Transformable::rotate( - Vector3D& dest, - const Vector3D& v, - const float* m) - { - // warning : no self assignment ! - // w coord of vectors is implicitely 1 - dest.x = v.x * m[0] + v.y * m[4] + v.z * m[8]; - dest.y = v.x * m[1] + v.y * m[5] + v.z * m[9]; - dest.z = v.x * m[2] + v.y * m[6] + v.z * m[10]; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Vector3D.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Vector3D.h deleted file mode 100644 index e12025623..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Vector3D.h +++ /dev/null @@ -1,570 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_VECTOR3D -#define H_SPK_VECTOR3D - -#include "Core/SPK_DEF.h" - - -namespace SPK -{ - /** - * @class Vector3D - * @brief A triplet of coordinates in 3D - * - * This class offers a set of methods to manipulate 3D points/vectors.
- * To make the use of 3D points/vectors easier and more intuitive, some operators are overloaded.
- * Vector3D are the basic primitive used in SPARK to define 3D points/vectors.
- *
- * Note that Vector3D coordinates are accessible directly without any setters or getters. - */ - class SPK_PREFIX Vector3D - { - public : - - //////////////// - // Parameters // - //////////////// - - float x; /**< @brief x coordinate of the vector */ - float y; /**< @brief y coordinate of the vector */ - float z; /**< @brief z coordinate of the vector */ - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor for the Vector3D - * @param x : x coordinate - * @param y : y coordinate - * @param z : z coordinate - */ - Vector3D(float x = 0.0f,float y = 0.0f,float z = 0.0f); - - /////////////// - // Operators // - /////////////// - - /** - * @brief Adds a Vector3D - * - * This method performs these operations :
- * x += v.x
- * y += v.y
- * z += v.z
- * - * @param v : the Vector3D to add - * @return the result Vector3D - */ - Vector3D& operator+=(const Vector3D& v); - - /** - * @brief Substracts a Vector3D - * - * This method performs these operations :
- * x -= v.x
- * y -= v.y
- * z -= v.z
- * - * @param v : the Vector3D to substract - * @return the result Vector3D - */ - Vector3D& operator-=(const Vector3D& v); - - /** - * @brief Adds a floating number - * - * This method performs these operations :
- * x += f
- * y += f
- * z += f
- * - * @param f : the number to add - * @return the result Vector3D - */ - Vector3D& operator+=(float f); - - /** - * @brief Substracts a floating number - * - * This method performs these operations :
- * x -= f
- * y -= f
- * z -= f
- * - * @param f : the number to substract - * @return the result Vector3D - */ - Vector3D& operator-=(float f); - - /** - * @brief Multiplies by a floating number - * - * This method performs these operations :
- * x *= f
- * y *= f
- * z *= f
- * - * @param f : the number to multiply the Vector3D by - * @return the result Vector3D - */ - Vector3D& operator*=(float f); - - /** - * @brief Divides by a floating number - * - * This method performs these operations :
- * x /= f
- * y /= f
- * z /= f
- * - * @param f : the number to divide the Vector3D by - * @return the result Vector3D - */ - Vector3D& operator/=(float f); - - /** - * @brief Unary - operator of Vector3D - * - * This method performs that operation :
- * return Vector3D(-x,-y,-z) - * - * return a Vector3D which is the reverse of this Vector3D - */ - Vector3D operator-() const; - - /** - * @brief Accesses the Vector3D coordinates in an container like fashion - * - *
    - *
  • index 0 is X
  • - *
  • index 1 is Y
  • - *
  • index 2 is Z
  • - *
- * Note that no check for out of bounds index is performed - * - * @param index : the index of the coordinate to get (from 0 to 2) - * @return : the coordinate value at index - * @since 1.03.00 - */ - float& operator[](size_t index); - - /** - * @brief Accesses the Vector3D coordinates in an container like fashion - * - * This is the constant version of operator[](size_t) - * - * @param index : the index of the coordinate to get (from 0 to 2) - * @return : the coordinate value at index - * @since 1.03.00 - */ - const float& operator[](size_t index) const; - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the values of the Vector3D - * @param x : x coordinate - * @param y : y coordinate - * @param z : z coordinate - */ - void set(float x,float y,float z = 0.0f); - - /////////////// - // Interface // - /////////////// - - /** - * @brief Gets the square norm of the Vector3D - * - * the square norm is defined as x * x + y * y + z * z. - * This method is faster than getNorm() and should be used when possible. - * - * @return the square norm of the Vector3D - */ - float getSqrNorm() const; - - /** - * @brief Gets the norm of the Vector3D - * - * the norm is defined as sqrt(x * x + y * y + z * z). - * - * @return the norm of the Vector3D - */ - float getNorm() const; - - /** - * @brief Normalizes the Vector3D - * - * This method performs these operations :
- * x /= |v|
- * y /= |v|
- * z /= |v|
- * Note that if the norm is equal to 0, nothing happens and false is returned. - * - * @return true if this Vector3D can be normalized, false otherwise - */ - bool normalize(); - - /** - * @brief Reverts the Vector3D - * - * This method performs these operations :
- * x = -x
- * y = -y
- * z = -z
- */ - void revert(); - - /** - * @brief Sets this Vector3D to its absolute values - * - * This method performs these operations :
- * x = abs(x)
- * y = abs(y)
- * z = abs(z)
- * - * @since 1.02.00 - */ - void abs(); - - /** - * @brief Computes the cross product between v and the vector3D and store the result in the vector3D - * @param v : the vector3D used to compute the cross product (*this x v) - */ - void crossProduct(const Vector3D& v); - }; - - //////////////////////// - // External operators // - //////////////////////// - - /** - * @brief Adds two Vector3D - * - * This function performs these operations :
- * result.x = v0.x + v1.x
- * result.y = v0.y + v1.y
- * result.z = v0.z + v1.z
- * - * @param v0 : the first vector3D - * @param v1 : the second vector3D - * @return the result vector3D - */ - Vector3D operator+(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Substracts two Vector3D - * - * This function performs these operations :
- * result.x = v0.x - v1.x
- * result.y = v0.y - v1.y
- * result.z = v0.z - v1.z
- * - * @param v0 : the first vector3D - * @param v1 : the second vector3D - * @return the result vector3D - */ - Vector3D operator-(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Adds a Vector3D and a float - * - * This function performs these operations :
- * result.x = v.x + f
- * result.y = v.y + f
- * result.z = v.z + f
- * - * @param v : the vector3D - * @param f : the floating number - * @return the result vector3D - */ - Vector3D operator+(const Vector3D& v,float f); - - /** - * @brief Adds a float and a Vector3D - * - * This function performs these operations :
- * result.x = f + v.x
- * result.y = f + v.y
- * result.z = f + v.z
- * - * @param f : the floating number - * @param v : the vector3D - * @return the result vector3D - */ - Vector3D operator+(float f,const Vector3D& v); - - /** - * @brief Substracts a float to a Vector3D - * - * This function performs these operations :
- * result.x = v.x - f
- * result.y = v.y - f
- * result.z = v.z - f
- * - * @param v : the vector3D - * @param f : the floating number - * @return the result vector3D - */ - Vector3D operator-(const Vector3D& v,float f); - - /** - * @brief Substracts a Vector3D to a float - * - * This function performs these operations :
- * result.x = f - v.x
- * result.y = f - v.y
- * result.z = f - v.z
- * - * @param f : the floating number - * @param v : the vector3D - * @return the result vector3D - */ - Vector3D operator-(float f,const Vector3D& v); - - /** - * @brief Multiplies a Vector3D by a float - * - * This function performs these operations :
- * result.x = v.x * f
- * result.y = v.y * f
- * result.z = v.z * f
- * - * @param v : the vector3D - * @param f : the floating number - * @return the result vector3D - */ - Vector3D operator*(const Vector3D& v,float f); - - /** - * @brief Multiplies a float by a Vector3D - * - * This function performs these operations :
- * result.x = f * v.x
- * result.y = f * v.y
- * result.z = f * v.z
- * - * @param f : the floating number - * @param v : the vector3D - * @return the result vector3D - */ - Vector3D operator*(float f,const Vector3D& v); - - /** - * @brief Divides a Vector3D by a float - * - * This function performs these operations :
- * result.x = v.x / f
- * result.y = v.y / f
- * result.z = v.z / f
- * - * @param v : the vector3D - * @param f : the floating number - * @return the result vector3D - */ - Vector3D operator/(const Vector3D& v,float f); - - /** - * @brief Divides a float by a Vector3D - * - * This function performs these operations :
- * result.x = f / v.x
- * result.y = f / v.y
- * result.z = f / v.z
- * - * @param f : the floating number - * @param v : the vector3D - * @return the result vector3D - */ - Vector3D operator/(float f,const Vector3D& v); - - /** - * @brief Tests whether 2 Vector3D are equal - * @param v0 : the first Vector3D to compare - * @param v1 : the second Vector3D to compare - * @return true if the Vector3D are equal, false if not - * @since 1.01.01 - */ - bool operator==(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Tests whether 2 Vector3D are different - * @param v0 : the first Vector3D to compare - * @param v1 : the second Vector3D to compare - * @return true if the Vector3D are different, false if not - * @since 1.01.01 - */ - bool operator!=(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Writes a Vector3D on an output stream - * - * The Vector3D is written that way : (x,y,z) - * - * @param s : the output stream where to write - * @param v : the Vector3D to write to the output stream - * @return the output stream - * @since 1.01.01 - */ - std::ostream& operator<<(std::ostream& s,const Vector3D& v); - - //////////////////////// - // External functions // - //////////////////////// - - /** - * @brief Returns the square distance between two Vector3D - * - * This method is faster than getDist(const Vector3D&,const Vector3D&) and should be used when possible. - * - * @param v0 : the first Vector3D - * @param v1 : the second Vector3D - * @return the square distance between the two Vector3D - */ - extern SPK_PREFIX float getSqrDist(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Returns the distance between two Vector3D - * @param v0 : the first Vector3D - * @param v1 : the second Vector3D - * @return the distance between the two Vector3D - */ - extern SPK_PREFIX float getDist(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Returns the dot product between two Vector3D - * @param v0 : the first Vector3D - * @param v1 : the second Vector3D - * @return the dot product (v0 . v1) - */ - float dotProduct(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Returns the cross product between two Vector3D - * @param v0 : the first Vector3D - * @param v1 : the second Vector3D - * @return the cross product (v0 x v1) - */ - extern SPK_PREFIX Vector3D crossProduct(const Vector3D& v0,const Vector3D& v1); - - /** - * @brief Computes the cross product between two Vector3D and stores the result in the Vector3D result - * @param v0 : the first Vector3D - * @param v1 : the second Vector3D - * @param result : the Vector3D where to store the cross product (v0 x v1) - */ - extern SPK_PREFIX void crossProduct(const Vector3D& v0,const Vector3D& v1,Vector3D& result); - - - inline float Vector3D::getSqrNorm() const - { - return x * x + y * y + z * z; - } - - inline float Vector3D::getNorm() const - { - return std::sqrt(getSqrNorm()); - } - - inline Vector3D Vector3D::operator-() const - { - return Vector3D(-x,-y,-z); - } - - inline float dotProduct(const Vector3D& v0,const Vector3D& v1) - { - return v0.x * v1.x + v0.y * v1.y + v0.z * v1.z; - } - - inline Vector3D operator+(const Vector3D& v0,const Vector3D& v1) - { - return Vector3D(v0.x + v1.x,v0.y + v1.y,v0.z + v1.z); - } - - inline Vector3D operator-(const Vector3D& v0,const Vector3D& v1) - { - return Vector3D(v0.x - v1.x,v0.y - v1.y,v0.z - v1.z); - } - - inline Vector3D operator+(const Vector3D& v,float f) - { - return Vector3D(v.x + f,v.y + f,v.z + f); - } - - inline Vector3D operator+(float f,const Vector3D& v) - { - return Vector3D(v.x + f,v.y + f,v.z + f); - } - - inline Vector3D operator-(const Vector3D& v,float f) - { - return Vector3D(v.x - f,v.y - f,v.z - f); - } - - inline Vector3D operator-(float f,const Vector3D& v) - { - return Vector3D(v.x - f,v.y - f,v.z - f); - } - - inline Vector3D operator*(const Vector3D& v,float f) - { - return Vector3D(v.x * f,v.y * f,v.z * f); - } - - inline Vector3D operator*(float f,const Vector3D& v) - { - return Vector3D(v.x * f,v.y * f,v.z * f); - } - - inline Vector3D operator/(const Vector3D& v,float f) - { - float mul = 1.0f / f; - return Vector3D(v.x * mul,v.y * mul,v.z * mul); - } - - inline Vector3D operator/(float f,const Vector3D& v) - { - return Vector3D(f / v.x,f / v.y,f / v.z); - } - - inline bool operator==(const Vector3D& v0,const Vector3D& v1) - { - return (v0.x == v1.x)&&(v0.y == v1.y)&&(v0.z == v1.z); - } - - inline bool operator!=(const Vector3D& v0,const Vector3D& v1) - { - return (v0.x != v1.x)||(v0.y != v1.y)||(v0.z != v1.z); - } - - inline std::ostream& operator<<(std::ostream& s,const Vector3D& v) - { - return s << '(' << v.x << ',' << v.y << ',' << v.z << ')'; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Zone.h b/Extensions/ParticleSystem/SPARK/include/Core/SPK_Zone.h deleted file mode 100644 index a0634b1c6..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Core/SPK_Zone.h +++ /dev/null @@ -1,197 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_ZONE -#define H_SPK_ZONE - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Transformable.h" -#include "Core/SPK_Vector3D.h" - - -namespace SPK -{ - class Particle; - - /** - * @class Zone - * @brief An abstract class that defines a zone in space - * - * A Zone is used in SPARK to : - *
    - *
  • define the area of an Emitter
  • - *
  • define the area of a Modifier
  • - *
- */ - class SPK_PREFIX Zone : public Registerable, public Transformable - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Default constructor for Zone - * @param position : the position of the Zone - */ - Zone(const Vector3D& position = Vector3D()); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Zone */ - virtual ~Zone() {} - - //////////// - // Setter // - //////////// - - /** - * @brief Sets the position of this Zone - * @param v : the position of this Zone - */ - virtual void setPosition(const Vector3D& v); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the position of this Zone - * @return the position of this Zone - */ - const Vector3D& getPosition() const; - - /** - * @brief Gets the transformed position of this Zone - * @return the transformed position of this Zone - * @since 1.03.00 - */ - const Vector3D& getTransformedPosition() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Randomly generates a position inside this Zone for a given Particle - * @param particle : the Particle whose position will be generated - * @param full : true to generate a position in the whole volume of this Zone, false to generate a position only at borders - */ - virtual void generatePosition(Particle& particle,bool full) const = 0; - - /** - * @brief Checks whether a point is within the Zone - * @param point : the point to check - * @return true if the point is within the Zone, false otherwise - */ - virtual bool contains(const Vector3D& point) const = 0; - - /** - * @brief Checks whether a line intersects the Zone - * - * The intersection is computed only if the Vector3D* intersection is not NULL.
- * The normal is computed if the Vector3D* normal AND intersection are not NULL. - * - * @param v0 : start of the line - * @param v1 : end of the line - * @param intersection : the Vector3D where the intersection will be stored, NULL not to compute the intersection - * @param normal : the Vector3D where the normal will be stored, NULL not to compute the normal - * @return true if the line intersects with the Zone, false otherwise - */ - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const = 0; - - /** - * @brief Moves a point at the border of the Zone - * @param point : the point that will be moved to the border of the Zone - * @param inside : true to move the point inside the Zone of APPROXIMATION_VALUE, false to move it outside of APPROXIMATION_VALUE - */ - virtual void moveAtBorder(Vector3D& point,bool inside) const = 0; - - /** - * @brief Computes the normal for the point - * @param point : the point from where the normal is computed - * @return the normal vector - * @since 1.02.00 - */ - virtual Vector3D computeNormal(const Vector3D& point) const = 0; - - protected : - - /** @brief Value used for approximation */ - static const float APPROXIMATION_VALUE; - - /** - * @brief A helper static method to normalize a Vector3D - * - * If the Vector3D is NULL, a random normal Vector3D is set.
- * The randomness is guaranteed to be uniformely distributed. - * - * @param v : the Vector3D to normalize or randomize if not normalizable - * @since 1.03.00 - */ - static void normalizeOrRandomize(Vector3D& v); - - virtual void innerUpdateTransform(); - - private : - - Vector3D position; - Vector3D tPosition; // transformed position - }; - - - inline void Zone::setPosition(const Vector3D& v) - { - position = tPosition = v; - notifyForUpdate(); - } - - inline const Vector3D& Zone::getPosition() const - { - return position; - } - - inline const Vector3D& Zone::getTransformedPosition() const - { - return tPosition; - } - - inline void Zone::normalizeOrRandomize(Vector3D& v) - { - while(!v.normalize()) - { - do v = Vector3D(random(-1.0f,1.0f),random(-1.0f,1.0f),random(-1.0f,1.0f)); - while (v.getSqrNorm() > 1.0f); - } - } - - inline void Zone::innerUpdateTransform() - { - transformPos(tPosition,position); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_NormalEmitter.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_NormalEmitter.h deleted file mode 100644 index e89638914..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_NormalEmitter.h +++ /dev/null @@ -1,146 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_NORMALEMITTER -#define H_SPK_NORMALEMITTER - -#include "Core/SPK_Emitter.h" - - -namespace SPK -{ - /** - * @class NormalEmitter - * @brief An Emitter that emits particles following a Zone normals - * - * The Zone used to derive the direction of emission can either be the Emitter Zone - * or another Zone that can be set with setNormalZone(Zone*).
- * If the normal zone is NULL the emitter Zone is used. - * - * @since 1.02.00 - */ - class SPK_PREFIX NormalEmitter : public Emitter - { - SPK_IMPLEMENT_REGISTERABLE(NormalEmitter) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of NormalEmitter - * @param normalZone : the Zone used to compute normals (NULL to used the Emitter Zone) - * @param inverted : true to invert the normals, false otherwise - */ - NormalEmitter(Zone* normalZone = NULL,bool inverted = false); - - /** - * @brief Creates and registers a new NormalEmitter - * @param normalZone : the Zone used to compute normals (NULL to used the Emitter Zone) - * @param inverted : true to invert the normals, false otherwise - * @return A new registered NormalEmitter - * @since 1.04.00 - */ - static NormalEmitter* create(Zone* normalZone = NULL,bool inverted = false); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets whether normals are inverted or not - * @param inverted true to use inverted normals, false not to - */ - void setInverted(bool inverted); - - /** - * @brief the Zone used to compute normals - * - * Note that if the normal zone is NULL, the Emitter Zone is used. - * - * @param zone : the Zone used to compute normals (NULL to used the Emitter Zone) - */ - void setNormalZone(Zone* zone); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether normals are inverted for this NormalEmitter - * @return true if normals are inverted, false if not - */ - bool isInverted() const; - - /** - * @brief Gets the normal Zone of this NormalEmitter - * @return the normal Zone of this NormalEmitter - */ - Zone* getNormalZone() const; - - /////////////// - // Interface // - /////////////// - - virtual Registerable* findByName(const std::string& name); - - protected : - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool createBase); - virtual void destroyChildren(bool keepChildren); - - private : - - bool inverted; - Zone* normalZone; - - virtual void generateVelocity(Particle& particle,float speed) const; - }; - - - inline NormalEmitter* NormalEmitter::create(Zone* normalZone,bool inverted) - { - NormalEmitter* obj = new NormalEmitter(normalZone,inverted); - registerObject(obj); - return obj; - } - - inline void NormalEmitter::setInverted(bool inverted) - { - this->inverted = inverted; - } - - inline bool NormalEmitter::isInverted() const - { - return inverted; - } - - inline Zone* NormalEmitter::getNormalZone() const - { - return normalZone; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_RandomEmitter.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_RandomEmitter.h deleted file mode 100644 index 95fb56f44..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_RandomEmitter.h +++ /dev/null @@ -1,63 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_RANDOMEMITTER -#define H_SPK_RANDOMEMITTER - -#include "Core/SPK_Emitter.h" - - -namespace SPK -{ - /** - * @class RandomEmitter - * @brief An Emitter that emits in a random direction - * @since 1.02.00 - */ - class SPK_PREFIX RandomEmitter : public Emitter - { - SPK_IMPLEMENT_REGISTERABLE(RandomEmitter) - - public : - - /** - * @brief Creates and registers a new RandomEmitter - * @return A new registered RandomEmitter - * @since 1.04.00 - */ - static RandomEmitter* create(); - - private : - - virtual void generateVelocity(Particle& particle,float speed) const; - }; - - - inline RandomEmitter* RandomEmitter::create() - { - RandomEmitter* obj = new RandomEmitter; - registerObject(obj); - return obj; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_SphericEmitter.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_SphericEmitter.h deleted file mode 100644 index 51b8b970b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_SphericEmitter.h +++ /dev/null @@ -1,183 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SPHERICEMITTER -#define H_SPK_SPHERICEMITTER - -#include "Core/SPK_Emitter.h" - - -namespace SPK -{ - /** - * @class SphericEmitter - * @brief An Emitter that emits particles in a portion of sphere - * - * This Emitter can emit particles in a spheric way. - * To do that 2 angles and a direction Vector3D can be parametered : - *
    - *
  • The direction Vector3D defines the direction of the emitter.
  • - *
  • The angles defines the area in between which wil be emitted the particles velocities.
  • - *
- * Here are a few examples : - *
    - *
  • 0 and 2 * PI will define a complete sphere ie equivalent to a RandomEmitter
  • - *
  • 0 and 0 will define a Emitter equivalent to a StraightEmitter
  • - *
  • PI and PI will define a disk
  • - *
  • PI / 2 and PI / 2 will define a Cone of angle PI / 2
  • - *
  • ...
  • - *
- */ - class SPK_PREFIX SphericEmitter : public Emitter - { - SPK_IMPLEMENT_REGISTERABLE(SphericEmitter) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of SphericEmitter - * @param direction : the direction of the SphericEmitter - * @param angleA : the first angle in radians of the SphericEmitter - * @param angleB : the second angle in radians of the SphericEmitter - */ - SphericEmitter(const Vector3D& direction = Vector3D(0.0f,0.0f,-1.0f),float angleA = 0.0f,float angleB = 0.0f); - - /** - * @brief Creates and registers a new SphericEmitter - * @param direction : the direction of the SphericEmitter - * @param angleA : the first angle in radians of the SphericEmitter - * @param angleB : the second angle in radians of the SphericEmitter - * @since 1.04.00 - */ - static SphericEmitter* create(const Vector3D& direction = Vector3D(0.0f,0.0f,-1.0f),float angleA = 0.0f,float angleB = 0.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the direction of this SphericEmitter - * - * Note that it is not necessary to provide a normalized Vector3D. - * This Vector3D only indicates a direction, its norm does not matter. - * - * @param direction : the direction of this SphericEmitter - */ - void setDirection(const Vector3D& direction); - - /** - * @brief Sets the angles of this SphericEmitter - * - * Note that angles are clamped between 0 and 2 * PI - * AngleA does not have to be inferior to angleB, it has no importance as angles are sorted within the method. - * - * @param angleA : the first angle in radians of this SphericEmitter - * @param angleB : the second angle in radians of this SphericEmitter - */ - void setAngles(float angleA,float angleB); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the direction of this SphericEmitter - * @return the direction of this SphericEmitter - */ - const Vector3D& getDirection() const; - - /** - * @brief Gets the direction of this SphericEmitter - * @return the direction of this SphericEmitter - */ - const Vector3D& getTransformedDirection() const; - - /** - * @brief Gets the minimum angle of this SphericEmitter - * @return the minimum angle of this SphericEmitter - */ - float getAngleMin() const; - - /** - * @brief Gets the maximum angle of this SphericEmitter - * @return the maximum angle of this SphericEmitter - */ - float getAngleMax() const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - static const float PI; - - Vector3D direction; - Vector3D tDirection; // transformed direction - - float angleMin; - float angleMax; - - float cosAngleMin; - float cosAngleMax; - - float matrix[9]; - - void computeMatrix(); - - virtual void generateVelocity(Particle& particle,float speed) const; - }; - - - inline SphericEmitter* SphericEmitter::create(const Vector3D& direction,float angleA,float angleB) - { - SphericEmitter* obj = new SphericEmitter(direction,angleA,angleB); - registerObject(obj); - return obj; - } - - inline const Vector3D& SphericEmitter::getDirection() const - { - return direction; - } - - inline const Vector3D& SphericEmitter::getTransformedDirection() const - { - return tDirection; - } - - inline float SphericEmitter::getAngleMin() const - { - return angleMin; - } - - inline float SphericEmitter::getAngleMax() const - { - return angleMax; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StaticEmitter.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StaticEmitter.h deleted file mode 100644 index 62e01bc16..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StaticEmitter.h +++ /dev/null @@ -1,69 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_STATICEMITTER -#define H_SPK_STATICEMITTER - -#include "Core/SPK_Emitter.h" - - -namespace SPK -{ - /** - * @class StaticEmitter - * @brief An Emitter that emits particles with no initial velocity - * @since 1.05.00 - */ - class StaticEmitter : public Emitter - { - SPK_IMPLEMENT_REGISTERABLE(StaticEmitter) - - public : - - /** - * @brief Creates and registers a new StaticEmitter - * @return A new registered StaticEmitter - */ - static StaticEmitter* create(); - - private : - - virtual void generateVelocity(Particle& particle,float speed) const; - }; - - - inline StaticEmitter* StaticEmitter::create() - { - StaticEmitter* obj = new StaticEmitter; - registerObject(obj); - return obj; - } - - inline void StaticEmitter::generateVelocity(Particle& particle,float speed) const - { - particle.velocity().set(0.0f,0.0f,0.0f); // no initial velocity - } -} - -#endif - - diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StraightEmitter.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StraightEmitter.h deleted file mode 100644 index 9b38683db..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Emitters/SPK_StraightEmitter.h +++ /dev/null @@ -1,126 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_STRAIGHEMITTER -#define H_SPK_STRAIGHEMITTER - -#include "Core/SPK_Emitter.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - /** - * @class StraightEmitter - * @brief An Emitter that emits in a given direction - */ - class SPK_PREFIX StraightEmitter : public Emitter - { - SPK_IMPLEMENT_REGISTERABLE(StraightEmitter) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief The constructor of StraightEmitter - * @param direction : the direction of the StraighEmitter - */ - StraightEmitter(const Vector3D& direction = Vector3D(0.0f,0.0f,-1.0f)); - - /** - * @brief Creates and registers a new StraightEmitter - * @param direction : the direction of the StraighEmitter - * @since 1.04.00 - */ - static StraightEmitter* create(const Vector3D& direction = Vector3D(0.0f,0.0f,-1.0f)); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the direction of this StraightEmitter - * - * Note that it is not necessary to provide a normalized Vector3D. - * This Vector3D only indicates a direction, its norm does not matter. - * - * @param direction : the direction of this StraightEmitter - */ - void setDirection(const Vector3D& direction); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the direction of this StraightEmitter - * @return the direction of this StraightEmitter - */ - const Vector3D& getDirection() const; - - /** - * @brief Gets the transformed direction of this StraightEmitter - * @return the transformed direction of this StraightEmitter - */ - const Vector3D& getTransformedDirection() const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D direction; - Vector3D tDirection; - - virtual void generateVelocity(Particle& particle,float speed) const; - }; - - - inline StraightEmitter* StraightEmitter::create(const Vector3D& direction) - { - StraightEmitter* obj = new StraightEmitter(direction); - registerObject(obj); - return obj; - } - - inline const Vector3D& StraightEmitter::getDirection() const - { - return direction; - } - - inline const Vector3D& StraightEmitter::getTransformedDirection() const - { - return tDirection; - } - - inline void StraightEmitter::generateVelocity(Particle& particle,float speed) const - { - particle.velocity() = tDirection; - particle.velocity() *= speed; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Collision.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Collision.h deleted file mode 100644 index fdedb1cf8..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Collision.h +++ /dev/null @@ -1,165 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_COLLISION -#define H_SPK_COLLISION - -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - /** - * @class Collision - * @brief A Modifier that perfoms particle against particle collisions in the Group - * - * The collision between particles uses the size of the particle to determine its radius.
- * The radius of a particle is computed as follows : - * radius = size * scale * 0.5f
- *
- * Moreover the mass ratio of two particles colliding is used to get realistic collision.
- *
- * The collision can be set as being elastic or inelastic. This is determined thanks to the elasticity of this modifier : - *
    - *
  • An elasticity of 1.0f means the collision is fully elastic
  • - *
  • An elasticity of 0.0f means the collision is fully inelastic
  • - *
  • An elasticity superior to 1.0f means the collision creates energy. It is physically not possible but can however be set
  • - *
  • An elasticity inferior to 0.0f has no sens and cannot be set
  • - *
  • To simulate collisions the elasticity will generally be set between ]0.0f,1.0f[ depending on the material of the particle
  • - *
- * Note that collision particle vs particles requires intensive processing. - * Moreover the algorithm has a complexity that badly scales which means processing times increase fastly as particles count increase.
- * Tries to limitate the number of particles to perform collision on. More than 1000 particles can require a lot of processing time even of recent hardware.
- *
- * The accuracy of the collisions is better with small update steps. - * Therefore try to keep the update time small by for instance multiplying the number of updates per frame. - * - * @since 1.04.00 - */ - class SPK_PREFIX Collision : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(Collision) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of the Collision modifier - * @param scale : the scale of the particles - * @param elasticity : the elasticity of the collisions - */ - Collision(float scale = 1.0f,float elasticity = 1.0f); - - /** - * @brief Creates and registers a new Collision - * @param scale : the scale of the particles - * @param elasticity : the elasticity of the collisions - * @since 1.04.00 - */ - static Collision* create(float scale = 1.0f,float elasticity = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the scale of particles to compute their radius - * - * The radius of a particle is computed as follows :
- * radius = size * scale * 0.5f
- * - * @param scale : the scale of the particles - */ - void setScale(float scale); - - /** - * @brief Sets the elasticity of the collisions - * - * The elasticity of the collisions refers to the coefficient of restitution (also called bounciness).
- * See the class description for more information. - * - * @param elasticity : the elasticity of the collisions - */ - void setElasticity(float elasticity); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the elasticity of the collisions - * @return the elasticity of the collisions - */ - float getElasticity() const; - - /** - * @brief Gets the scale applied on particle radius - * @return the scale - */ - float getScale() const; - - private : - - float elasticity; - float scale; - - virtual void modify(Particle& particle,float deltaTime) const; - - static void getMinMax(const Vector3D& v0,const Vector3D& v1,Vector3D& min,Vector3D& max); - static bool checkBoundingRect(const Vector3D& min1,const Vector3D& max1,const Vector3D& min2,const Vector3D& max2); - }; - - - inline Collision* Collision::create(float scale,float elasticity) - { - Collision* obj = new Collision(scale,elasticity); - registerObject(obj); - return obj; - } - - inline void Collision::setElasticity(float elasticity) - { - if (elasticity >= 0.0f) - this->elasticity = elasticity; - } - - inline void Collision::setScale(float scale) - { - this->scale = scale; - } - - inline float Collision::getElasticity() const - { - return elasticity; - } - - inline float Collision::getScale() const - { - return scale; - } -} - -#endif - diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Destroyer.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Destroyer.h deleted file mode 100644 index cf69fe887..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Destroyer.h +++ /dev/null @@ -1,76 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_DESTROYER -#define H_SPK_DESTROYER - -#include "Core/SPK_Modifier.h" - - -namespace SPK -{ - /** - * @class Destroyer - * @brief A Modifier that destroy particles - */ - class SPK_PREFIX Destroyer : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(Destroyer) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Destroyer - * @param zone : the Zone of the Destroyer - * @param trigger : the trigger of the Destroyer - */ - Destroyer(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE); - - /** - * @brief Creates and registers a new Destroyer - * @param zone : the Zone of the Destroyer - * @param trigger : the trigger of the Destroyer - * @return A new registered Destroyer - * @since 1.04.00 - */ - static Destroyer* create(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE); - - private : - - virtual void modify(Particle& particle,float deltaTime) const; - virtual void modifyWrongSide(Particle& particle,bool inside) const; - }; - - - inline Destroyer* Destroyer::create(Zone* zone,ModifierTrigger trigger) - { - Destroyer* obj = new Destroyer(zone,trigger); - registerObject(obj); - return obj; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_LinearForce.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_LinearForce.h deleted file mode 100644 index fe687403d..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_LinearForce.h +++ /dev/null @@ -1,209 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_LINEARFORCE -#define H_SPK_LINEARFORCE - -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Model.h" - - -namespace SPK -{ - /** - * @enum ForceFactor - * @brief An enum defining the way a factor is applied to a force - * @since 1.03.00 - */ - enum ForceFactor - { - FACTOR_NONE, /**< No factor is applied */ - FACTOR_LINEAR, /**< A linear factor is applied */ - FACTOR_SQUARE, /**< A square factor is applied */ - }; - - /** - * @class LinearForce - * @brief A Modifier applying a linear force on particles - * - * The force is identical from any points of the universe (only if the modifier is triggered).
- * In that way, particles under the influence of a LinearForce can theorically reach an infinite speed if not - * under the influence of a friction.
- *
- * The force can be multiplied or not by a particle parameter either linearly or squared. - *
- * Note that this Modifier can be used to set a global gravity that can be updated for all groups at a time.
- * To do so, the LinearForce has to be used with the param : PARAM_MASS and the FactorType FACTOR_LINEAR. - * - * @since 1.03.00 - */ - class SPK_PREFIX LinearForce : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(LinearForce) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Default constructor for LinearForce - * @param zone : the Zone of the LinearForce or NULL if no Zone - * @param trigger : the trigger of the LinearForce - * @param force : the force of the LinearForce - * @param type : the type of multiplier for the factor - * @param param : the parameter used as the factor (if type != FACTOR_NONE) - */ - LinearForce(Zone* zone = NULL, - ModifierTrigger trigger = INSIDE_ZONE, - const Vector3D& force = Vector3D(), - ForceFactor type = FACTOR_NONE, - ModelParam param = PARAM_SIZE); - - /** - * @brief Creates and registers a new LinearForce - * @param zone : the Zone of the LinearForce or NULL if no Zone - * @param trigger : the trigger of the LinearForce - * @param force : the force of the LinearForce - * @param type : the type of multiplier for the factor - * @param param : the parameter used as the factor (if type != FACTOR_NONE) - * @return A new registered LinearForce - * @since 1.04.00 - */ - static LinearForce* create(Zone* zone = NULL, - ModifierTrigger trigger = INSIDE_ZONE, - const Vector3D& force = Vector3D(), - ForceFactor type = FACTOR_NONE, - ModelParam param = PARAM_SIZE); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the force vector - * @param force : the force vector - * @since 1.03.02 - */ - void setForce(const Vector3D& force); - - /** - * @brief Sets the factor type to apply to the force - * @param type : the type of multiplier for the factor - * @param param : the parameter of the Particle to use as the factor - */ - void setFactor(ForceFactor type,ModelParam param = PARAM_SIZE); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the force vector - * @return the force vector - * @since 1.03.02 - */ - const Vector3D& getForce() const; - - /** - * @brief Gets the transformed force vector - * @return the transformed force vector - * @since 1.03.02 - */ - const Vector3D& getTransformedForce() const; - - /** - * @brief Gets the factor multiplier of this LinearForce - * @return the factor multiplier of this LinearForce - */ - ForceFactor getFactorType() const; - - /** - * @brief Gets the factor parameter of this LinearForce - * @return the factor parameter of this LinearForce - */ - ModelParam getFactorParam() const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D force; - Vector3D tForce; - - ForceFactor factorType; - ModelParam factorParam; - - virtual void modify(Particle& particle,float deltaTime) const; - }; - - - inline LinearForce* LinearForce::create(Zone* zone,ModifierTrigger trigger,const Vector3D& force,ForceFactor type,ModelParam param) - { - LinearForce* obj = new LinearForce(zone,trigger,force,type,param); - registerObject(obj); - return obj; - } - - inline void LinearForce::setForce(const Vector3D& force) - { - this->force = tForce = force; - notifyForUpdate(); - } - - inline void LinearForce::setFactor(ForceFactor type,ModelParam param) - { - factorType = type; - factorParam = param; - } - - inline const Vector3D& LinearForce::getForce() const - { - return force; - } - - inline const Vector3D& LinearForce::getTransformedForce() const - { - return tForce; - } - - inline ForceFactor LinearForce::getFactorType() const - { - return factorType; - } - - inline ModelParam LinearForce::getFactorParam() const - { - return factorParam; - } - - inline void LinearForce::innerUpdateTransform() - { - Modifier::innerUpdateTransform(); - transformDir(tForce,force); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_ModifierGroup.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_ModifierGroup.h deleted file mode 100644 index c5475f7dd..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_ModifierGroup.h +++ /dev/null @@ -1,287 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_MODIFIERGROUP -#define H_SPK_MODIFIERGROUP - -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @class ModifierGroup - * @brief A Group of Modifiers - * - * This modifier can be used in 2 ways : - *
    - *
  • Partition group : to partition the universe and make a global light test before testing inner modifiers more precisely.
  • - *
  • Global group : To activate several modifiers with a single trigger.
  • - *
- * By default a ModifierGroup is used as a partition group. the user can change it by calling useGlobalGroup(bool,bool) or usePartitionGroup(bool). - * - * @since 1.02.00 - */ - class SPK_PREFIX ModifierGroup : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(ModifierGroup) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of ModifierGroup - * @param zone : the Zone of this ModifierGroup - * @param trigger : the trigger of the ModifierGroup - */ - ModifierGroup(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE); - - /** - * @brief Creates and registers a new ModifierGroup - * @param zone : the Zone of this ModifierGroup - * @param trigger : the trigger of the ModifierGroup - * @return A new registered ModifierGroup - * @since 1.04.00 - */ - static ModifierGroup* create(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Uses this ModifierGroup as a global group - * - * A global group allows to use only one trigger for many modifiers. It works as follow :
    - *
  • If the trigger of the partition group is activated, then the all children modifiers are activated no matter their Zone.
  • - *
  • The same happens for the wrong side.
  • - *
- * Note that if a child Modifier needs intersection or normal computation (the Modifier Obstacle for instance), the variables have to be set. - * - * @param useIntersection : true to enable intersection computation in this ModifierGroup - * @param useNormal : true to enable normal computation in this ModifierGroup - */ - void useGlobalGroup(bool useIntersection = false,bool useNormal = false); - - /** - * @brief Uses this ModifierGroup as a partition group - * - * A partition group allows to partition the space in order to have faster tests. It works as follow :
    - *
  • If the trigger of the partition group is activated, then modifiers within are tested to check if they are triggered.
  • - *
  • If yes, the Modifier is activated, if no, nothing happens.
  • - *
  • If handleWrongSize if set, the isWrongSide() method of the partition group calls the isWrongSide() of its children if it has to.
  • - *
- * - * @param handleWrongSide : true to enable intersection computation in this ModifierGroup - */ - void usePartitionGroup(bool handleWrongSide = false); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the number of modifiers in this ModifierGroup - * @return the number of modifiers in this ModifierGroup - */ - size_t getNb() const; - - /** - * @brief Gets the vector containing all the children modifiers - * @return the vector containing all the children modifiers - */ - const std::vector& getModifiers() const; - - /** - * @brief Tells whether this ModifierGroup is a global group - * - * For more information about global groups, see useGlobalGroup(bool,bool). - * - * @return true if this ModifierGroup is a global group, false if not - */ - bool isGlobalGroup() const; - - /** - * @brief Tells whether this ModifierGroup is a partition group - * - * For more information about partition groups, see usePartitionGroup(bool). - * - * @return true if this ModifierGroup is a partition group, false if not - */ - bool isPartitionGroup() const; - - /** - * @brief Tells whether this partition group handles wrong side - * - * If this ModifierGroup is a global group, the return value is not used.
- * For more information about partition groups, see usePartitionGroup(bool).
- *
- * Note that the wrong side can only be used with the following triggers :
    - *
  • ModifierTrigger::INSIDE_ZONE
  • - *
  • ModifierTrigger::OUTSIDE_ZONE
  • - *
  • ModifierTrigger::ENTER_ZONE
  • - *
  • ModifierTrigger::EXIT_ZONE
  • - *
- * - * @return true if this ModifierGroup handles wrong size, false if not - */ - bool handlesWrongSide() const; - - /** - * @brief Tells whether this global group computes the intersection - * - * If this ModifierGroup is a partition group, the return value is not used.
- * For more information about global groups, see useGlobalGroup(bool,bool).
- *
- * Note that the intersection can only be used with the following triggers :
    - *
  • ModifierTrigger::INTERSECT_ZONE
  • - *
  • ModifierTrigger::ENTER_ZONE
  • - *
  • ModifierTrigger::EXIT_ZONE
  • - *
- * - * @return true if this ModifierGroup computes the intersection, false if not - */ - bool usesIntersection() const; - - /** - * @brief Tells whether this global group computes the normal - * - * If this ModifierGroup is a partition group, the return value is not used.
- * For more information about global groups, see useGlobalGroup(bool,bool).
- *
- * Note that the normal can only be used with the following triggers :
    - *
  • ModifierTrigger::INTERSECT_ZONE
  • - *
  • ModifierTrigger::ENTER_ZONE
  • - *
  • ModifierTrigger::EXIT_ZONE
  • - *
- * - * @return true if this ModifierGroup computes the normal, false if not - */ - bool usesNormal() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Adds a Modifier to this ModifierGroup - * @param modifier : the Modifier to add to this ModifierGroup - */ - void addModifier(Modifier* modifier); - - /** - * @brief Removes a Modifier from this ModifierGroup - * @param modifier : the Modifier to remove from this ModifierGroup - * @return true if the Modifier has been found and removed, false if not - */ - bool removeModifier(const Modifier* modifier); - - /** - * @brief Removes all Modifier children from this ModifierGroup - */ - void clear(); - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - virtual Registerable* findByName(const std::string& name); - - protected : - - virtual void registerChildren(bool registerAll); - virtual void copyChildren(const Registerable& object,bool createBase); - virtual void destroyChildren(bool keepChildren); - - virtual bool checkBuffers(const Group& group); - - private : - - std::vector modifiers; - - bool globalZone; - bool handleWrongSide; - - virtual void modify(Particle& particle,float deltaTime) const; - virtual void modifyWrongSide(Particle& particle,bool inside) const; - }; - - - inline ModifierGroup* ModifierGroup::create(Zone* zone,ModifierTrigger trigger) - { - ModifierGroup* obj = new ModifierGroup(zone,trigger); - registerObject(obj); - return obj; - } - - inline void ModifierGroup::useGlobalGroup(bool useIntersection,bool useNormal) - { - globalZone = true; - needsIntersection = useIntersection; - needsNormal = useNormal; - } - - inline void ModifierGroup::usePartitionGroup(bool handleWrongSide) - { - globalZone = false; - this->handleWrongSide = handleWrongSide; - } - - inline size_t ModifierGroup::getNb() const - { - return modifiers.size(); - } - - inline const std::vector& ModifierGroup::getModifiers() const - { - return modifiers; - } - - inline bool ModifierGroup::isGlobalGroup() const - { - return globalZone; - } - - inline bool ModifierGroup::isPartitionGroup() const - { - return !globalZone; - } - - inline bool ModifierGroup::handlesWrongSide() const - { - return handleWrongSide; - } - - inline bool ModifierGroup::usesIntersection() const - { - return needsIntersection; - } - - inline bool ModifierGroup::usesNormal() const - { - return needsNormal; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Obstacle.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Obstacle.h deleted file mode 100644 index 5755bf39e..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Obstacle.h +++ /dev/null @@ -1,148 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_OBSTACLE -#define H_SPK_OBSTACLE - -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @class Obstacle - * @brief A Modifier that acts as an obstacle on particles - */ - class SPK_PREFIX Obstacle : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(Obstacle) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Obstacle - * @param zone : the Zone of the Obstacle - * @param trigger : the trigger of the Destructor - * @param bouncingRatio : the bouncingRatio of the Obstacle - * @param friction : the friction of the Obstacle - */ - Obstacle(Zone* zone = NULL,ModifierTrigger trigger = INTERSECT_ZONE,float bouncingRatio = 1.0f,float friction = 1.0f); - - /** - * @brief Creates and registers a new Obstacle - * @param zone : the Zone of the Obstacle - * @param trigger : the trigger of the Destructor - * @param bouncingRatio : the bouncingRatio of the Obstacle - * @param friction : the friction of the Obstacle - * @return A new registered Obstacle - * @since 1.04.00 - */ - static Obstacle* create(Zone* zone = NULL,ModifierTrigger trigger = INTERSECT_ZONE,float bouncingRatio = 1.0f,float friction = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the bouncing ratio of this Obstacle - * - * The bouncing ratio is the multiplier applied to the normal component of the rebound. - * - * @param bouncingRatio : the bouncing ratio of this Obstacle - */ - void setBouncingRatio(float bouncingRatio); - - /** - * @brief Sets the friction of this Obstacle - * - * The bouncing ratio is the multiplier applied to the tangent component of the rebound. - * - * @param friction : the friction of this Obstacle - */ - void setFriction(float friction); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the bouncing ratio of this Obstacle - * @return the bouncing ratio of this Obstacle - */ - float getBouncingRatio() const; - - /** - * @brief Gets the friction of this Obstacle - * @return the friction of this Obstacle - */ - float getFriction() const; - - private : - - float bouncingRatio; - float friction; - - virtual void modify(Particle& particle,float deltaTime) const; - virtual void modifyWrongSide(Particle& particle,bool inside) const; - }; - - - inline Obstacle* Obstacle::create(Zone* zone,ModifierTrigger trigger,float bouncingRatio,float friction) - { - Obstacle* obj = new Obstacle(zone,trigger,bouncingRatio,friction); - registerObject(obj); - return obj; - } - - inline void Obstacle::setBouncingRatio(float bouncingRatio) - { - this->bouncingRatio = bouncingRatio < 0.0f ? 0.0f : bouncingRatio; - } - - inline void Obstacle::setFriction(float friction) - { - this->friction = friction; - } - - inline float Obstacle::getBouncingRatio() const - { - return bouncingRatio; - } - - inline float Obstacle::getFriction() const - { - return friction; - } - - inline void Obstacle::modifyWrongSide(Particle& particle,bool inside) const - { - if (isFullZone()) - getZone()->moveAtBorder(particle.position(),inside); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_PointMass.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_PointMass.h deleted file mode 100644 index 71e9ac17a..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_PointMass.h +++ /dev/null @@ -1,199 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_POINTMASS -#define H_SPK_POINTMASS - -#include "Core/SPK_Modifier.h" - -namespace SPK -{ - /** - * @class PointMass - * @brief A Modifier defining a point with a mass that attracts or repulses particles - * - * A PointMass triggered on a Particle will affect its velocity as followed :
- * dist = pointMassPosition - particlePosition
- * particleVelocity += dist * mass * step / max(minDistance,|dist|)
- */ - class SPK_PREFIX PointMass : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(PointMass) - - public : - - //////////////// - // Construtor // - //////////////// - - /** - * @brief Constructor of PointMass - * @param zone : the Zone of the PointMass - * @param trigger : the trigger of the PointMass - * @param mass : the mass of the PointMass - * @param minDistance : the minimum distance of the PointMass - */ - PointMass(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE,float mass = 1.0f,float minDistance = 0.05f); - - /** - * @brief Creates and registers a new PointMass - * @param zone : the Zone of the PointMass - * @param trigger : the trigger of the PointMass - * @param mass : the mass of the PointMass - * @param minDistance : the minimum distance of the PointMass - * @return A new registered PointMass - * @since 1.04.00 - */ - static PointMass* create(Zone* zone = NULL,ModifierTrigger trigger = INSIDE_ZONE,float mass = 1.0f,float minDistance = 0.05f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the delta position from the position of the zone (or origin if no zone set) - * @param pos : the delta position - * @since 1.03.02 - */ - void setPosition(const Vector3D& pos); - - /** - * @brief Sets the mass of this PointMass - * - * The mass defines the strenght of the attraction. The more the mass, the stronger the attraction.
- * A position mass will result into an attraction while a negative mass will result into a repulsion. - * Moreover a mass equal to 0 make the PointMass have no effect. - * - * @param mass : the mass of this PointMass - */ - void setMass(float mass); - - /** - * @brief Sets the minimum distance of this PointMass - * - * The minimum distance of the PointMass is the minimum distance that can be considered to compute the force implied by the PointMass. - * If a distance between a Particle and a PointMass is inferior to the minimum distance of the PointMass, the distance is clamped to the minimum distance.
- * This avoids forces that approaching the infinity with Particle getting very close to the PointMass. - * - * @param minDistance : the minimum distance of this PointMass - */ - void setMinDistance(float minDistance); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the delta position - * @return the delta position - * @since 1.03.02 - */ - const Vector3D& getPosition() const; - - /** - * @brief Gets the transformed delta position - * @return the transformed delta position - * @since 1.03.02 - */ - const Vector3D& getTransformedPosition() const; - - /** - * @brief Gets the mass of this PointMass - * @return the mass of this PointMass - */ - float getMass() const; - - /** - * @brief Gets the minimum distance of this PointMass - * @return the minimum distance of this PointMass - */ - float getMinDistance() const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D position; - Vector3D tPosition; - - float mass; - float minDistance; - float sqrMinDistance; - - virtual void modify(Particle& particle,float deltaTime) const; - }; - - - inline PointMass* PointMass::create(Zone* zone,ModifierTrigger trigger,float mass,float minDistance) - { - PointMass* obj = new PointMass(zone,trigger,mass,minDistance); - registerObject(obj); - return obj; - } - - inline void PointMass::setPosition(const Vector3D& pos) - { - position = tPosition = pos; - notifyForUpdate(); - } - - inline void PointMass::setMass(float mass) - { - this->mass = mass; - } - - inline void PointMass::setMinDistance(float minDistance) - { - this->minDistance = minDistance; - sqrMinDistance = minDistance * minDistance; - } - - inline const Vector3D& PointMass::getPosition() const - { - return position; - } - - inline const Vector3D& PointMass::getTransformedPosition() const - { - return tPosition; - } - - inline float PointMass::getMass() const - { - return mass; - } - - inline float PointMass::getMinDistance() const - { - return minDistance; - } - - inline void PointMass::innerUpdateTransform() - { - Modifier::innerUpdateTransform(); - transformDir(tPosition,position); // the delta position is actually a direction not a position - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Rotator.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Rotator.h deleted file mode 100644 index 200d9c94c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Rotator.h +++ /dev/null @@ -1,84 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_ROTATOR -#define H_SPK_ROTATOR - -#include "Core/SPK_Modifier.h" - - -namespace SPK -{ - /** - * @class Rotator - * @brief A Modifier allowing to rotate particle with their rotation speed - * - * Instead of controlling directly the particle angle, this modifier allows to control the particle rotation speed.
- * The rotator derives the particle angle from the particle rotation speed.
- *
- * For this modifier to work, the PARAM_ANGLE must be enabled (and can be random in addition but not mutable or interpolated) - * and the PARAM_ROTATION_SPEED must be at least enabled in the model of the group of particles that are modified. - * - * @since 1.05.00 - */ - class Rotator : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(Rotator) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of Rotator */ - Rotator(); - - /** - * @brief Creates and registers a new Rotator - * @return A new registered Rotator - */ - static Rotator* create(); - - private : - - virtual void modify(Particle& particle,float deltaTime) const; - }; - - - inline Rotator::Rotator() : Modifier(ALWAYS | INSIDE_ZONE | OUTSIDE_ZONE) {} - - inline Rotator* Rotator::create() - { - Rotator* obj = new Rotator; - registerObject(obj); - return obj; - } - - inline void Rotator::modify(Particle& particle,float deltaTime) const - { - float angle = particle.getParamCurrentValue(PARAM_ANGLE) + deltaTime * particle.getParamCurrentValue(PARAM_ROTATION_SPEED); - particle.setParamCurrentValue(PARAM_ANGLE,angle); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Vortex.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Vortex.h deleted file mode 100644 index 82aac9bc3..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Modifiers/SPK_Vortex.h +++ /dev/null @@ -1,338 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_VORTEX -#define H_SPK_VORTEX - -#include "Core/SPK_Modifier.h" - -namespace SPK -{ - /** - * @brief A modifier defining a vortex in the universe - * - * A vortex is a spinning flow around a center. Its center (its eye) is defined as a line in the universe.
- * In addition to its center line, a vortex is defined by 2 speeds : - *
    - *
  • the rotation speed which defines the speed of rotation around the vortex eye.
  • - *
  • the attraction speed which defined the speeds at which a particle is attracted by the eye (or repeled).
  • - *
- * The rotation speed can be defined either in units per second or in radians per seconds. In the first case, - * the closer to the eye particles are, the faster they will spin around. In the second case, the speed is constant.
- *
- * The attraction speed can be either constant or linear (function of the distance to the eye). In the second case, - * the farther particles are from the eye, the faster the are attracted (or repeled). First case can be assimilated - * to a Archimedes' spiral while second is more a logarithmic spiral (Bernoulli's). - *
- * The vertex eye radius can be defined. The user has also the possibility to tell the vortex to destroy particles - * that enter its eye automatically.
- *
- * Note that this modifier does not update particle's velocity. Therefore particles modified by a vortex does not have any inertia.
- * This is because defining an accurate vortex in a discrete environment cannot be performed by using the derivatives of the position and velocity. - * - * @since 1.05.00 - */ - class SPK_PREFIX Vortex : public Modifier - { - SPK_IMPLEMENT_REGISTERABLE(Vortex) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of vortex - * @param position : the position of the eye - * @param direction : the direction of the eye - * @param rotationSpeed : the speed of rotation - * @param attractionSpeed : the speed of attraction - */ - Vortex(const Vector3D& position = Vector3D(),const Vector3D& direction = Vector3D(0.0f,1.0f,0.0f),float rotationSpeed = 1.0f,float attractionSpeed = 0.0f); - - /** - * @brief Creates and registers a new Vortex - * @param position : the position of the eye - * @param direction : the direction of the eye - * @param rotationSpeed : the speed of rotation - * @param attractionSpeed : the speed of attraction - * @return a new registered vortex - */ - static Vortex* create(const Vector3D& position = Vector3D(),const Vector3D& direction = Vector3D(0.0f,1.0f,0.0f),float rotationSpeed = 1.0f,float attractionSpeed = 0.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the position of the eye of the vortex - * - * The eye of the vortex is an infinite line defined by a position and a direction. - * - * @param position : the position of the eye of the vortex - */ - void setPosition(const Vector3D& position); - - /** - * @brief Sets the direction of the eye of the vortex - * - * The eye of the vortex is an infinite line defined by a position and a direction.
- * Note that the direction is normalized internally. - * - * @param direction : the direction of the eye of the vortex - */ - void setDirection(const Vector3D& direction); - - /** - * @brief Sets the rotation speed of the vortex - * - * The rotation speed can either be in units per second or in radians per second (angular).
- * In the case the rotation speed is angular, all particles are rotated around the eye at the same speed.
- * In the other case, the more particles are close to the eye, the faster they rotate.
- *
- * The sens of rotation is defined by the sens of the speed (and depends also on whether we are in a right or left handed system).
- * A speed of 0 means no rotation. - * - * @param rotationSpeed : the speed of rotation (either in units per unit of time or in radians per unit of time dependent on the second parameter) - * @param angular : true to have the rotation in radians per unit of time, false to have it in unit per unit of time. - */ - void setRotationSpeed(float rotationSpeed,bool angular); - - /** - * @brief Sets the attraction speed of the vortex - * - * The attraction speed is the speed that move particles towards the eye of the vortex.
- * It can either be constant or linear (function of the distance of the particle from the eye).
- *
- * A constant attraction speed is defined in units per unit of time, - * a linear attraction speed is also defined in units per unit of time and the value is the speed at a distance of 1.0f from the eye.
- *
- * A negative speed means particles are repelled by the eye.
- * A speed of 0.0f means particles are neither attracted nor repelled by the eye of the vortex. - * - * @param attractionSpeed : the attraction speed of the vortex in units per unit of time - * @param linear : true to set the speed function of the distance from the eye, false to set it constant - */ - void setAttractionSpeed(float attractionSpeed,bool linear); - - /** - * @brief Sets the eye radius - * - * Note that an negative radius is inverted internally - * - * @param eyeRadius : the eye radius - */ - void setEyeRadius(float eyeRadius); - - /** - * @brief Tells whether particles is the eye must be killed or not - * @param kill : true to kill particles in the eye, false not to - */ - void enableParticleKilling(bool kill); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the position of the eye - * @return the position of the eye - */ - const Vector3D& getPosition() const; - - /** - * @brief Gets the direction of the eye - * @return the direction of the eye (normalized) - */ - const Vector3D& getDirection() const; - - /** - * @brief Gets the transformed position of the eye - * @return the transformed position of the eye - */ - const Vector3D& getTransformedPosition() const; - - /** - * @brief Gets the transformed direction of the eye - * @return the transformed direction of the eye (normalized) - */ - const Vector3D& getTransformedDirection() const; - - /** - * @brief Gets the rotation speed - * @return the rotation speed - */ - float getRotationSpeed() const; - - /** - * @brief Gets the attraction speed - * @return the attraction speed - */ - float getAttractionSpeed() const; - - /** - * @brief Tells whether rotation speed is angular - * @return true if rotation speed is angular, false if not - */ - bool isRotationSpeedAngular() const; - - /** - * @brief Tells whether attraction speed is function of the distance from the eye - * @return true if attraction speed is linear, false if it is constant - */ - bool isAttractionSpeedLinear() const; - - /** - * @brief Returns the eye radius - * @return the eye radius - */ - float getEyeRadius() const; - - /** - * @brief Tells whether particles are killed when in the eye - * @return true if particles are killed in the eye, false if not - */ - bool isParticleKillingEnabled() const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D position; - Vector3D direction; - - Vector3D tPosition; - Vector3D tDirection; - - float rotationSpeed; - float attractionSpeed; - - bool angularSpeedEnabled; - bool linearSpeedEnabled; - - float eyeRadius; - bool killingParticleEnabled; - - virtual void modify(Particle& particle,float deltaTime) const; - }; - - - inline Vortex* Vortex::create(const Vector3D& position,const Vector3D& direction,float rotationSpeed,float attractionSpeed) - { - Vortex* obj = new Vortex(position,direction,rotationSpeed,attractionSpeed); - registerObject(obj); - return obj; - } - - inline void Vortex::setPosition(const Vector3D& position) - { - this->position = position; - tPosition = this->position; - notifyForUpdate(); - } - - inline void Vortex::setDirection(const Vector3D& direction) - { - this->direction = direction; - this->direction.normalize(); - tDirection = this->direction; - notifyForUpdate(); - } - - inline void Vortex::setRotationSpeed(float rotationSpeed,bool angular) - { - this->rotationSpeed = rotationSpeed; - angularSpeedEnabled = angular; - } - - inline void Vortex::setAttractionSpeed(float attractionSpeed,bool linear) - { - this->attractionSpeed = attractionSpeed; - linearSpeedEnabled = linear; - } - - inline void Vortex::setEyeRadius(float eyeRadius) - { - if (eyeRadius < 0.0f) eyeRadius = -eyeRadius; - this->eyeRadius = eyeRadius; - } - - inline void Vortex::enableParticleKilling(bool kill) - { - killingParticleEnabled = kill; - } - - inline const Vector3D& Vortex::getPosition() const - { - return position; - } - - inline const Vector3D& Vortex::getDirection() const - { - return direction; - } - - inline const Vector3D& Vortex::getTransformedPosition() const - { - return tPosition; - } - - inline const Vector3D& Vortex::getTransformedDirection() const - { - return tDirection; - } - - inline float Vortex::getRotationSpeed() const - { - return rotationSpeed; - } - - inline float Vortex::getAttractionSpeed() const - { - return attractionSpeed; - } - - inline bool Vortex::isRotationSpeedAngular() const - { - return angularSpeedEnabled; - } - - inline bool Vortex::isAttractionSpeedLinear() const - { - return linearSpeedEnabled; - } - - inline float Vortex::getEyeRadius() const - { - return eyeRadius; - } - - inline bool Vortex::isParticleKillingEnabled() const - { - return killingParticleEnabled; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_LineRendererInterface.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_LineRendererInterface.h deleted file mode 100644 index 45a81cd10..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_LineRendererInterface.h +++ /dev/null @@ -1,125 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_LINERENDERERINTERFACE -#define H_SPK_LINERENDERERINTERFACE - -#include "Core/SPK_DEF.h" - -namespace SPK -{ - /** - * @brief Base Interface for rendering particles with lines - * @since 1.04.00 - */ - class LineRendererInterface - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of LineRendererInterface - * @param length : the length multiplier of this LineRendererInterface - * @param width : the width of this GLLineRenderer - */ - LineRendererInterface(float length = 1.0f,float width = 1.0f); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of LineRendererInterface */ - virtual ~LineRendererInterface() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the length multiplier of this LineRendererInterface - * - * The length multiplier is the value which will be multiplied by the Particle velocity to get the line length in the universe.
- * A positive length means the line will be drawn in advance to the Particle, as opposed to a negative length. - * - * @param length : the length multiplier of this GLLineRenderer - */ - void setLength(float length); - - /** - * @brief Sets the width of this LineRendererInterface - * @param width : the width of this LineRendererInterface - */ - virtual void setWidth(float width); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the length multiplier of this LineRendererInterface - * @return the length multiplier of this LineRendererInterface - */ - float getLength() const; - - /** - * @brief Gets the width of this LineRendererInterface - * @return the width of this LineRendererInterface - */ - float getWidth() const; - - protected : - - float length; - float width; - }; - - - inline LineRendererInterface::LineRendererInterface(float length,float width) : - length(length), - width(width) - {} - - inline void LineRendererInterface::setLength(float length) - { - this->length = length; - } - - inline void LineRendererInterface::setWidth(float width) - { - this->width = width; - } - - inline float LineRendererInterface::getLength() const - { - return length; - } - - inline float LineRendererInterface::getWidth() const - { - return width; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented2DRendererInterface.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented2DRendererInterface.h deleted file mode 100644 index 63013a96c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented2DRendererInterface.h +++ /dev/null @@ -1,216 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_ORIENTED2DRENDERERINTERFACE -#define H_SPK_ORIENTED2DRENDERERINTERFACE - -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Group.h" - -namespace SPK -{ - /** - * @brief Defines the orientation of a particle oriented in 2D - * @since 1.04.00 - */ - enum Orientation2D - { - ORIENTATION2D_UP, /**< Oriented towards the camera plane */ - ORIENTATION2D_DIRECTION, /**< Oriented towards the direction of the particle */ - ORIENTATION2D_POINT, /**< Oriented towards a point in the universe */ - ORIENTATION2D_AXIS /**< The orientation vector is defined by an axis */ - }; - - - /** - * @brief Base Interface for rendering particles that can be oriented in a 2D world - * @since 1.04.00 - */ - class Oriented2DRendererInterface - { - public : - - /////////////// - // Parameter // - /////////////// - - /** - * @brief The orientation vector - * - * It is used in 2 orientation modes : - *
    - *
  • ORIENTATION2D_AXIS : The orientation vector is used as the axis
  • - *
  • ORIENTATION2D_POINT : The orientation vector is the point particle look to
  • - *
- * In other modes the orientation vector is not used - */ - Vector3D orientationVector; - - ////////////////// - // Constructors // - ////////////////// - - /** @brief Constructor of Oriented2DRendererInterface */ - Oriented2DRendererInterface(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Oriented2DRendererInterface */ - virtual ~Oriented2DRendererInterface() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the way quads are oriented in the universe - * @param orientation : the orientation of the quad - */ - void setOrientation(Orientation2D orientation); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the orientation of the quads - * @return the orientation of the quads - */ - Orientation2D getOrientation() const; - - protected : - - Orientation2D orientation; - - bool hasGlobalOrientation(); - void computeGlobalOrientation2D(); - void computeSingleOrientation2D(const Particle& particle); - - void scaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const; - void rotateAndScaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const; - - const Vector3D& quadUp() const; - const Vector3D& quadSide() const; - - private : - - // Used to store the orientation of quads before scaling - mutable Vector3D up; - mutable Vector3D side; - - // This is where are stored quad orientation info after computation - mutable Vector3D sideQuad; - mutable Vector3D upQuad; - }; - - - inline Oriented2DRendererInterface::Oriented2DRendererInterface() : - orientation(ORIENTATION2D_UP) - { - orientationVector.set(0.0f,-1.0f); - } - - inline void Oriented2DRendererInterface::setOrientation(Orientation2D orientation) - { - this->orientation = orientation; - } - - inline Orientation2D Oriented2DRendererInterface::getOrientation() const - { - return orientation; - } - - inline const Vector3D& Oriented2DRendererInterface::quadUp() const - { - return upQuad; - } - - inline const Vector3D& Oriented2DRendererInterface::quadSide() const - { - return sideQuad; - } - - inline bool Oriented2DRendererInterface::hasGlobalOrientation() - { - return ((orientation == ORIENTATION2D_UP)||(ORIENTATION2D_AXIS)); - } - - inline void Oriented2DRendererInterface::computeGlobalOrientation2D() - { - if (orientation == ORIENTATION2D_UP) - up.set(0.0f,-0.5f); - else if (orientation == ORIENTATION2D_AXIS) - { - up.set(orientationVector.x,orientationVector.y); - up.normalize(); - up *= 0.5f; - } - } - - inline void Oriented2DRendererInterface::computeSingleOrientation2D(const Particle& particle) - { - if (orientation == ORIENTATION2D_DIRECTION) - up = particle.velocity(); - else if (orientation == ORIENTATION2D_POINT) - { - up = orientationVector; - up -= particle.position(); - } - - up.z = 0.0f; - up.normalize(); - up *= 0.5f; - } - - inline void Oriented2DRendererInterface::scaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const - { - float size = particle.getParamCurrentValue(PARAM_SIZE); - - upQuad.set(up.x,up.y); - upQuad *= size * scaleY; - - sideQuad.set(-up.y,up.x); - sideQuad *= size * scaleX; - } - - inline void Oriented2DRendererInterface::rotateAndScaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const - { - float size = particle.getParamCurrentValue(PARAM_SIZE); - - float angleTexture = particle.getParamCurrentValue(PARAM_ANGLE); - float cosA = std::cos(angleTexture); - float sinA = std::sin(angleTexture); - - upQuad.x = cosA * up.x + sinA * up.y; - upQuad.y = -sinA * up.x + cosA * up.y; - upQuad.z = 0.0f; - - sideQuad.set(-upQuad.y,upQuad.x); - - sideQuad *= size * scaleX; - upQuad *= size * scaleY; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented3DRendererInterface.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented3DRendererInterface.h deleted file mode 100644 index 3f18f644c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_Oriented3DRendererInterface.h +++ /dev/null @@ -1,387 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_ORIENTED3DRENDERERINTERFACE -#define H_SPK_ORIENTED3DRENDERERINTERFACE - -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Group.h" - -// Packs the orientations parameters into one int for orientation presets -#define PACK_ORIENTATION(lock,look,up) ((lock << 0x10)|(look << 0x8)|(up)) - -namespace SPK -{ - /** - * @brief Defines the orientation of the vector Look of an oriented 3D particle - * - * Enumerators marked as (fast) are the ones that only needs to be computed once for - * a set of particles instead of being computed for each particles. - * - * @since 1.04.00 - */ - enum LookOrientation - { - LOOK_CAMERA_PLANE, /**< Look towards the camera plane (fast) */ - LOOK_CAMERA_POINT, /**< Look towards the camera point (better effect but more expensive) */ - LOOK_AXIS, /**< The look vector is defined by an axis (fast) */ - LOOK_POINT, /**< Look towards a point in the universe */ - }; - - /** - * @brief Defines the orientation of the vector Up of an oriented 3D particle - * - * Enumerators marked as (fast) are the ones that only needs to be computed once for - * a set of particles instead of being computed for each particles. - * - * @since 1.04.00 - */ - enum UpOrientation - { - UP_CAMERA, /**< The up vector is defined by the up vector of the camera (fast) */ - UP_DIRECTION, /**< The up vector is oriented towards the direction of the particle */ - UP_AXIS, /**< The up vector is is defined by an axis (fast) */ - UP_POINT, /**< The up vector is oriented towards a point */ - }; - - /** - * @brief Defines which axis is locked and will not change when computing a cross product. - * - * Note that the side vector cannot be locked as it is always derived from the look and up vectors. - * - * @since 1.04.00 - */ - enum LockedAxis - { - LOCK_LOOK, /**< The look vector is locked */ - LOCK_UP, /**< The up vector is locked */ - }; - - /** - * @brief Orientation presets to easily set up common orientations - * @since 1.04.00 - */ - enum OrientationPreset - { - CAMERA_PLANE_ALIGNED = PACK_ORIENTATION(LOCK_LOOK,LOOK_CAMERA_PLANE,UP_CAMERA), /**< Particles are oriented towards the camera plane (the most common) */ - CAMERA_POINT_ALIGNED = PACK_ORIENTATION(LOCK_LOOK,LOOK_CAMERA_POINT,UP_CAMERA), /**< Particles are oriented towards the camera point (better effect but more expensive) */ - DIRECTION_ALIGNED = PACK_ORIENTATION(LOCK_UP,LOOK_CAMERA_PLANE,UP_DIRECTION), /**< Particles are oriented function of their direction and try to look to the camera */ - AROUND_AXIS = PACK_ORIENTATION(LOCK_UP,LOOK_CAMERA_POINT,LOOK_AXIS), /**< Particles can only rotate around an axis and try to look to the camera */ - TOWARDS_POINT = PACK_ORIENTATION(LOCK_LOOK,LOOK_POINT,UP_CAMERA), /**< Particles are oriented towards a point in the universe */ - FIXED_ORIENTATION = PACK_ORIENTATION(LOCK_LOOK,LOOK_AXIS,UP_AXIS), /**< Particles have a fixed orientation in the universe */ - }; - - - /** - * @brief Base Interface for rendering particles that can be oriented in a 3D world - * @since 1.04.00 - */ - class SPK_PREFIX Oriented3DRendererInterface - { - public : - - /////////////// - // Parameter // - /////////////// - - /** - * @brief The look vector - * - * It is used in 2 LookOrientation modes : - *
    - *
  • LOOK_AXIS : The look vector is used as the axis
  • - *
  • LOOK_POINT : The look vector is the point quads look to
  • - *
- * In other modes the look vector is not used - */ - Vector3D lookVector; - - /** - * @brief The up vector - * - * It is used in 2 UpOrientation modes : - *
    - *
  • UP_AXIS : The up axis is used as the axis
  • - *
  • UP_POINT : The up axis is the point quads will be oriented towards
  • - *
- * In other modes the up vector is not used - */ - Vector3D upVector; - - ////////////////// - // Constructors // - ////////////////// - - /** @brief Constructor of Oriented3DRendererInterface */ - Oriented3DRendererInterface(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of Oriented3DRendererInterface */ - virtual ~Oriented3DRendererInterface() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the way quads are oriented in the universe - * - * This method allows to accuratly configure the orientation of quads.
- * Another method with only one parameters that take presets exist.
- * See setOrientation(OrientationPreset) - * - * @param lookOrientation : The way the look vector of the quad is set - * @param upOrientation : The way the up vector of the quad is set - * @param lockedAxis : tells which axis prevails over the other - */ - void setOrientation(LookOrientation lookOrientation,UpOrientation upOrientation,LockedAxis lockedAxis); - - /** - * @brief Sets the way quads are oriented in the universe - * - * This method takes some presets to orientate the quads.
- * Another method that has more options to configure orientation exists
- * See setOrientation(LookOrientation,UpOrientation,LockedAxis) - * - * @param orientation : the orientation preset of the quad - */ - void setOrientation(OrientationPreset orientation); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the look orientation of the quads - * @return the look orientation of the quads - */ - LookOrientation getLookOrientation() const; - - /** - * @brief Gets the up orientation of the quads - * @return the up orientation of the quads - */ - UpOrientation getUpOrientation() const; - - /** - * @brief Gets the locked axis (the one prevailing over the others) - * @return the locked axis - */ - LockedAxis getLockedAxis() const; - - protected : - - // Orientation - LookOrientation lookOrientation; - UpOrientation upOrientation; - LockedAxis lockedAxis; - - bool precomputeOrientation3D(const Group& group,const Vector3D& look,const Vector3D& up,const Vector3D& pos); - void computeGlobalOrientation3D(); - void computeSingleOrientation3D(const Particle& particle); - - void scaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const; - void rotateAndScaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const; - - const Vector3D& quadUp() const; - const Vector3D& quadSide() const; - - private : - - // Used to store modelview information - mutable Vector3D mVLook; - mutable Vector3D mVUp; - mutable Vector3D mVPos; - - // Used to store precomputed orientation - mutable Vector3D globalLook; - mutable Vector3D globalUp; - - // Used to store the orientation of quads before scaling - mutable Vector3D up; - mutable Vector3D side; - mutable Vector3D look; - - // Is using rotation - mutable int quadRotated; - - // This is where are stored quad orientation info after computation - mutable Vector3D sideQuad; - mutable Vector3D upQuad; - }; - - - inline LookOrientation Oriented3DRendererInterface::getLookOrientation() const - { - return lookOrientation; - } - - inline UpOrientation Oriented3DRendererInterface::getUpOrientation() const - { - return upOrientation; - } - - inline LockedAxis Oriented3DRendererInterface::getLockedAxis() const - { - return lockedAxis; - } - - inline const Vector3D& Oriented3DRendererInterface::quadUp() const - { - return upQuad; - } - - inline const Vector3D& Oriented3DRendererInterface::quadSide() const - { - return sideQuad; - } - - inline bool Oriented3DRendererInterface::precomputeOrientation3D(const Group& group,const Vector3D& modelViewLook,const Vector3D& modelViewUp,const Vector3D& modelViewPos) - { - mVLook = modelViewLook; - mVUp = modelViewUp; - mVPos = modelViewPos; - - bool globalOrientation = true; - - if (lookOrientation == LOOK_CAMERA_PLANE) - globalLook = -mVLook; - else if (lookOrientation == LOOK_AXIS) - globalLook = lookVector; - else - globalOrientation = false; - - if (upOrientation == UP_CAMERA) - globalUp = mVUp; - else if (upOrientation == UP_AXIS) - globalUp = upVector; - else globalOrientation = false; - - quadRotated = group.getModel()->isEnabled(PARAM_ANGLE); - - return globalOrientation; - } - - inline void Oriented3DRendererInterface::computeGlobalOrientation3D() - { - look = globalLook; - up = globalUp; - - crossProduct(up,look,side); - if (lockedAxis == LOCK_LOOK) - crossProduct(look,side,up); - else if (quadRotated) - { - crossProduct(side,up,look); - look.normalize(); - } - - up.normalize(); - up *= 0.5f; - - side.normalize(); - side *= 0.5f; - } - - inline void Oriented3DRendererInterface::computeSingleOrientation3D(const Particle& particle) - { - if (lookOrientation == LOOK_CAMERA_POINT) - { - look = mVPos; - look -= particle.position(); - } - else if (lookOrientation == LOOK_POINT) - { - look = lookVector; - look -= particle.position(); - } - else - look = globalLook; - - if (upOrientation == UP_DIRECTION) - up = particle.velocity(); - else if (upOrientation == UP_POINT) - { - up = upVector; - up -= particle.position(); - } - else - up = globalUp; - - crossProduct(up,look,side); - if (lockedAxis == LOCK_LOOK) - crossProduct(look,side,up); - else if (quadRotated) - { - crossProduct(side,up,look); - look.normalize(); - } - - side.normalize(); - side *= 0.5f; - - up.normalize(); - up *= 0.5f; - } - - inline void Oriented3DRendererInterface::scaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const - { - float size = particle.getParamCurrentValue(PARAM_SIZE); - - sideQuad = side; - sideQuad *= size * scaleX; - - upQuad = up; - upQuad *= size * scaleY; - } - - inline void Oriented3DRendererInterface::rotateAndScaleQuadVectors(const Particle& particle,float scaleX,float scaleY) const - { - float size = particle.getParamCurrentValue(PARAM_SIZE); - - float angleTexture = particle.getParamCurrentValue(PARAM_ANGLE); - float cosA = std::cos(angleTexture); - float sinA = std::sin(angleTexture); - - upQuad.x = (look.x * look.x + (1.0f - look.x * look.x) * cosA) * up.x - + (look.x * look.y * (1.0f - cosA) - look.z * sinA) * up.y - + (look.x * look.z * (1.0f - cosA) + look.y * sinA) * up.z; - - upQuad.y = (look.x * look.y * (1.0f - cosA) + look.z * sinA) * up.x - + (look.y * look.y + (1.0f - look.y * look.y) * cosA) * up.y - + (look.y * look.z * (1.0f - cosA) - look.x * sinA) * up.z; - - upQuad.z = (look.x * look.z * (1.0f - cosA) - look.y * sinA) * up.x - + (look.y * look.z * (1.0f - cosA) + look.x * sinA) * up.y - + (look.z * look.z + (1.0f - look.z * look.z) * cosA) * up.z; - - crossProduct(upQuad,look,sideQuad); - - sideQuad *= size * scaleX; - upQuad *= size * scaleY; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_PointRendererInterface.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_PointRendererInterface.h deleted file mode 100644 index 90cc89f21..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_PointRendererInterface.h +++ /dev/null @@ -1,137 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_POINTRENDERERINTERFACE -#define H_SPK_POINTRENDERERINTERFACE - -#include "Core/SPK_DEF.h" - -namespace SPK -{ - /** - * @enum PointType - * @brief Constants defining the type of points to render - */ - enum PointType - { - POINT_SQUARE, /**< Points are renderered as squares */ - POINT_CIRCLE, /**< Points are renderered as circles */ - POINT_SPRITE, /**< Points are renderered as point sprites (textured points) */ - }; - - /** - * @brief Base Interface for rendering particles with points - * @since 1.04.00 - */ - class PointRendererInterface - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of PointRendererInterface - * @param type : the initial type of this PointRendererInterface (must be supported by default by the platform) - * @param size : the width of this PointRendererInterface - */ - PointRendererInterface(PointType type = POINT_SQUARE,float size = 1.0f); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of PointRendererInterface */ - virtual ~PointRendererInterface() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the type of points to use in this PointRendererInterface - * - * If the type is not supported by the platform, false is returned and the type per default is set. - * - * @param type : the type of points to use in this PointRendererInterface - * @return true if the type can be set, false otherwise - */ - virtual bool setType(PointType type); - - /** - * @brief Sets the size of the points in this PointRendererInterface - * @param size : the size of the points in this PointRendererInterface - */ - virtual void setSize(float size); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the type of points in this PointRendererInterface - * @return the type of points in this PointRendererInterface - */ - PointType getType() const; - - /** - * @brief Gets the size of points in this PointRendererInterface - * @return the size of points in this PointRendererInterface - */ - float getSize() const; - - protected : - - PointType type; - float size; - }; - - - inline PointRendererInterface::PointRendererInterface(PointType type,float size) : - type(type), - size(size) - {} - - inline bool PointRendererInterface::setType(PointType type) - { - this->type = type; - return true; - } - - inline void PointRendererInterface::setSize(float size) - { - this->size = size; - } - - inline PointType PointRendererInterface::getType() const - { - return type; - } - - inline float PointRendererInterface::getSize() const - { - return size; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_QuadRendererInterface.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_QuadRendererInterface.h deleted file mode 100644 index cb61401fe..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Renderers/SPK_QuadRendererInterface.h +++ /dev/null @@ -1,265 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_QUADRENDERERINTERFACE -#define H_SPK_QUADRENDERERINTERFACE - -#include "Core/SPK_DEF.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - /** - * @enum TexturingMode - * @brief Constants defining the way to apply texture over the particles - * @since 1.02.00 - */ - enum TexturingMode - { - TEXTURE_NONE, /**< Constant telling no texturing is used */ - TEXTURE_2D, /**< Constant telling a 2D texture is used */ - TEXTURE_3D, /**< Constant telling a 3D texture is used */ - }; - - - /** - * @brief Base Interface for rendering particles with quads - * @since 1.04.00 - */ - class SPK_PREFIX QuadRendererInterface - { - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of QuadRendererInterface - * @param scaleX the scale of the width of the quad - * @param scaleY the scale of the height of the quad - */ - QuadRendererInterface(float scaleX = 1.0f,float scaleY = 1.0f); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of QuadRendererInterface */ - virtual ~QuadRendererInterface() {} - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the texturing mode for this GLQuadRenderer - * - * The texturing mode defines whether or not to apply a texture - * and if so which type of texture to apply (2D,3D or atlas).
- *
- * Note that the validity of the texturing mode depends on the rendering API below.
- * The method returns true if the rendering mode can be set, false if it cannot - * - * @param mode : the texturing mode of this GLQuadRenderer - * @return true if the rendering mode can be set, false if it cannot - */ - virtual bool setTexturingMode(TexturingMode mode); - - /** - * @brief Sets the cut of the texture - * - * This is available only if SPK::PARAM_TEXTURE_INDEX is enabled and texturing mode is TEXTURE_2D.
- *
- * Particles can be rendered only with a part of the texture depending on their texture index value.
- * The cut can only be constant.
- * The user defines in how many parts the texture must be divided in X and Y.
- * The first index is located at the top left cut, the it goes from left to right and from top to bottom.
- *
- * For instance a cut with nbX = 3 and nbY = 2 will be as followed : - *
- * -------------
- * | 0 | 1 | 2 |
- * -------------
- * | 3 | 4 | 5 |
- * -------------

- *
- * By default nbX and nbY are equal to 1.
- * - * @param nbX : the number of cuts in the X axis - * @param nbY : the number of cuts in the Y axis - */ - void setAtlasDimensions(size_t nbX,size_t nbY); - - /** - * @brief Sets the size ratio of this GLQuadRenderer - * - * These values defines how quads are scaled. - * The height and width of a quad in the universe is defined as followed : - *
    - *
  • width = size * ratioX - *
  • height = size * ratioY - *
- * - * @param scaleX : the scale of the width of the quad - * @param scaleY : the scale of the height of the quad - */ - void setScale(float scaleX,float scaleY); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texturing mode of this GLQuadRenderer - * @return the texturing mode of this GLQuadRenderer - */ - TexturingMode getTexturingMode() const; - - /** - * @brief Gets the atlas dimension on the X axis - * - * See setAtlasDimensions(size_t,size_t) for more information - * - * @return the atlas dimension on the X axis - */ - size_t getAtlasDimensionX() const; - - /** - * @brief Gets the atlas dimension on the Y axis - * - * See setAtlasDimensions(size_t,size_t) for more information - * - * @return the atlas dimension on the Y axis - */ - size_t getAtlasDimensionY() const; - - /** - * @brief Gets the scale of the width of this GLQuadRenderer - * @return the scale of the width of this GLQuadRenderer - */ - float getScaleX() const; - - /** - * @brief Gets the scale of the height of this GLQuadRenderer - * @return the scale of the height of this GLQuadRenderer - */ - float getScaleY() const; - - protected : - - TexturingMode texturingMode; - - float scaleX; - float scaleY; - - // texture atlas info - size_t textureAtlasNbX; - size_t textureAtlasNbY; - float textureAtlasW; - float textureAtlasH; - - void computeAtlasCoordinates(const Particle& particle) const; - - float textureAtlasU0() const; - float textureAtlasU1() const; - float textureAtlasV0() const; - float textureAtlasV1() const; - - private : - - // this is where textureAtlas are stored after computation - mutable float atlasU0; - mutable float atlasU1; - mutable float atlasV0; - mutable float atlasV1; - }; - - - inline bool QuadRendererInterface::setTexturingMode(TexturingMode mode) - { - texturingMode = mode; - return true; - } - - inline void QuadRendererInterface::setScale(float scaleX,float scaleY) - { - this->scaleX = scaleX; - this->scaleY = scaleY; - } - - inline TexturingMode QuadRendererInterface::getTexturingMode() const - { - return texturingMode; - } - - inline size_t QuadRendererInterface::getAtlasDimensionX() const - { - return textureAtlasNbX; - } - - inline size_t QuadRendererInterface::getAtlasDimensionY() const - { - return textureAtlasNbY; - } - - inline float QuadRendererInterface::getScaleX() const - { - return scaleX; - } - - inline float QuadRendererInterface::getScaleY() const - { - return scaleY; - } - - inline float QuadRendererInterface::textureAtlasU0() const - { - return atlasU0; - } - - inline float QuadRendererInterface::textureAtlasU1() const - { - return atlasU1; - } - - inline float QuadRendererInterface::textureAtlasV0() const - { - return atlasV0; - } - - inline float QuadRendererInterface::textureAtlasV1() const - { - return atlasV1; - } - - inline void QuadRendererInterface::computeAtlasCoordinates(const Particle& particle) const - { - int textureIndex = static_cast(particle.getParamCurrentValue(PARAM_TEXTURE_INDEX)); - atlasU0 = atlasU1 = static_cast(textureIndex % textureAtlasNbX) / textureAtlasNbX; - atlasV0 = atlasV1 = static_cast(textureIndex / textureAtlasNbX) / textureAtlasNbY; - atlasU1 += textureAtlasW; - atlasV1 += textureAtlasH; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_AABox.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_AABox.h deleted file mode 100644 index 11e323561..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_AABox.h +++ /dev/null @@ -1,154 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_AABOX -#define H_SPK_AABOX - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @class AABox - * @brief A Zone defining an axis-aligned Box - * - * An AABox is defined by its center and a dimension in each axis. - */ - class SPK_PREFIX AABox : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(AABox) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of AABox - * @param position : the position of the AABox - * @param dimension : the dimension of the AABox - */ - AABox(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& dimension = Vector3D(0.0f,0.0f,0.0f)); - - /** - * @brief Creates and registers a new AABox - * @param position : the position of the AABox - * @param dimension : the dimension of the AABox - * @since 1.04.00 - */ - static AABox* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& dimension = Vector3D(0.0f,0.0f,0.0f)); - - //////////// - // Setter // - //////////// - - /** - * @brief Sets the dimensions of this AABox - * - * The negative dimensions are clamped to 0.
- * An AABox with 0 as its 3 dimensions is equivalent to a Point - * - * @param dimension : the dimensions of this AABox - */ - void setDimension(const Vector3D& dimension); - - //////////// - // Getter // - //////////// - - /** - * @brief Gets the dimensions of this AABox - * @return the dimensions of this AABox - */ - const Vector3D& getDimension() const; - - /////////////// - // Interface // - /////////////// - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - private : - - Vector3D dimension; - - bool slabIntersects(float p0,float p1,float bMin,float bMax,float& tEnter,float& tExit,int& firstAxis,int axis) const; - }; - - - inline AABox* AABox::create(const Vector3D& position,const Vector3D& dimension) - { - AABox* obj = new AABox(position,dimension); - registerObject(obj); - return obj; - } - - inline const Vector3D& AABox::getDimension() const - { - return dimension; - } - - inline bool AABox::slabIntersects(float p0,float p1,float bMin,float bMax,float& tEnter,float& tExit,int& firstAxis,int axis) const - { - float dir = p1 - p0; - - if (dir == 0.0f) - { - if ((p0 < bMin)||(p0 > bMax)) - return false; - return true; - } - - float t0 = (bMin - p0) / dir; - float t1 = (bMax - p0) / dir; - - if (t0 > t1) - { - std::swap(t0,t1); - axis += 3; - } - - if ((t1 < tEnter)||(t0 > tExit)) - return false; - - if (t0 > tEnter) - { - tEnter = t0; - firstAxis = (firstAxis & 0xF0) | (axis & 0x0F); - } - - if (t1 < tExit) - { - tExit = t1; - firstAxis = (firstAxis & 0x0F) | ((axis << 4) & 0xF0); - } - - return true; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Cylinder.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Cylinder.h deleted file mode 100644 index 11b2fa11b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Cylinder.h +++ /dev/null @@ -1,202 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2010 // -// - Julien Fryer - julienfryer@gmail.com // -// - Thibault Lescoat - info-tibo orange fr // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_CYLINDER -#define H_SPK_CYLINDER - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @brief A Zone defining a cylinder in the universe - * - * A cylinder is defined by : - *
    - *
  • The position of its center
  • - *
  • A direction
  • - *
  • The radius of the cylinder
  • - *
  • A dimension (length) along the direction
  • - *
- * Note that the direction does not have to be normalized as it is normalized internally when set. - * - * @since 1.05.03 - */ - class SPK_PREFIX Cylinder : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Cylinder) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of cylinder - * @param position : the position of the cylinder - * @param direction : the direction of the cylinder - * @param radius : the radius of the cylinder - */ - Cylinder(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& direction = Vector3D(0.0f,1.0f,0.0f),float radius = 1.0f,float length = 1.0f); - - /** - * @brief Creates and registers a new cylinder - * @param position : the position of the cylinder - * @param direction : the direction of the cylinder - * @param radius : the radius of the cylinder - * @return a new registered cylinder - */ - static Cylinder* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& direction = Vector3D(0.0f,1.0f,0.0f),float radius = 1.0f,float length = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the direction of the cylinder - * - * Note that the direction is normalized internally - * - * @param direction : the direction of the cylinder - */ - void setDirection(const Vector3D& direction); - - /** - * @brief Sets the radius of this cylinder - * - * A radius cannot be negative.
- * Note that negative radius are inverted internally - * - * @param radius : the radius of this cylinder - */ - void setRadius(float radius); - - /** - * @brief Sets the length of this cylinder - * - * A length cannot be negative.
- * Note that negative length are inverted internally - * - * @param length : the length of this cylinder - */ - void setLength(float length); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the direction of this cylinder - * @return the direction of this cylinder - */ - const Vector3D& getDirection() const; - - /** - * @brief Gets the transformed direction of this cylinder - * @return the transformed direction of this cylinder - */ - const Vector3D& getTransformedDirection() const; - - /** - * @brief Gets the radius of this cylinder - * @return the radius of this cylinder - */ - float getRadius() const; - - /** - * @brief Gets the length of this cylinder - * @return the length of this cylinder - */ - float getLength() const; - - /////////////// - // Interface // - /////////////// - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D direction; - Vector3D tDirection; - - float radius,length; - }; - - - inline Cylinder* Cylinder::create(const Vector3D& position,const Vector3D& direction,float radius,float length) - { - Cylinder* obj = new Cylinder(position,direction,radius,length); - registerObject(obj); - return obj; - } - - inline void Cylinder::setDirection(const Vector3D& direction) - { - this->direction = direction; - this->direction.normalize(); - tDirection = this->direction; - notifyForUpdate(); - } - - inline void Cylinder::setRadius(float radius) - { - this->radius = (radius < 0 ? -radius : radius); - } - - inline void Cylinder::setLength(float length) - { - this->length = (length < 0 ? -length : length); - } - - inline const Vector3D& Cylinder::getDirection() const - { - return direction; - } - - inline const Vector3D& Cylinder::getTransformedDirection() const - { - return tDirection; - } - - inline float Cylinder::getRadius() const - { - return radius; - } - - inline float Cylinder::getLength() const - { - return length; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Line.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Line.h deleted file mode 100644 index 40834ad09..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Line.h +++ /dev/null @@ -1,176 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_LINE -#define H_SPK_LINE - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @class Line - * @brief A Zone defining a line in the universe - * - * As any Zone, a Line is defined by a position. The Line in itself is defined by two bounds.
- * Moving the position results in moving the 2 bounds in the universe by the same vector.
- *
- * To conform with the Zone class (the position is defined as the center of the Zone), the position is always set to - * be the center of the line. Therefore, if a bound is modified, the position will be modified as well. - * - * @since 1.01.00 - */ - class SPK_PREFIX Line : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Line) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Line - * @param p0 : the first bound of this Line - * @param p1 : the second bound of this Line - */ - Line(const Vector3D& p0 = Vector3D(0.0f,0.0f,0.0f),const Vector3D& p1 = Vector3D(0.0f,0.0f,0.0f)); - - /** - * @brief Creates and registers a new Line - * @param p0 : the first bound of this Line - * @param p1 : the second bound of this Line - * @since 1.04.00 - */ - static Line* create(const Vector3D& p0 = Vector3D(0.0f,0.0f,0.0f),const Vector3D& p1 = Vector3D(0.0f,0.0f,0.0f)); - - ///////////// - // Setters // - ///////////// - - void setPosition(const Vector3D& v); - - /** - * @brief Sets the bounds of this Line - * @param p0 : the first bound of this Line - * @param p1 : the second bound of this Line - */ - void setBounds(const Vector3D& p0,const Vector3D& p1); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the bound of index of this Line - * @param index : the index of the bound (0 or 1) - * @return the first bound of index of this Line - * @since 1.03.00 - */ - const Vector3D& getBound(size_t index) const; - - /** - * @brief Gets the transformed bound of index of this Line - * @param index : the index of the bound (0 or 1) - * @return the transformed bound of index of this Line - * @since 1.03.00 - */ - const Vector3D& getTransformedBound(size_t index) const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Pushes a new bound to this Line - * - * This method replaces the first bound by the second bound and the second bound by the new bound.
- * It allows to follow the trajectory of a moving object over time with a single Line. - * - * @param bound : the new bound of this Line - */ - void pushBound(const Vector3D& bound); - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D bounds[2]; - Vector3D tBounds[2]; - - Vector3D tDist; - - void computeDist(); - void computePosition(); - }; - - - inline Line* Line::create(const Vector3D& p0,const Vector3D& p1) - { - Line* obj = new Line(p0,p1); - registerObject(obj); - return obj; - } - - inline const Vector3D& Line::getBound(size_t index) const - { - return bounds[index]; - } - - inline const Vector3D& Line::getTransformedBound(size_t index) const - { - return tBounds[index]; - } - - inline bool Line::contains(const Vector3D& v) const - { - return false; - } - - inline bool Line::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - return false; - } - - inline void Line::moveAtBorder(Vector3D& v,bool inside) const {} - - inline void Line::computeDist() - { - tDist = tBounds[1] - tBounds[0]; - } - - inline void Line::computePosition() - { - Zone::setPosition((bounds[0] + bounds[1]) * 0.5f); - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Plane.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Plane.h deleted file mode 100644 index df92df88f..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Plane.h +++ /dev/null @@ -1,163 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_PLANE -#define H_SPK_PLANE - -#include "Core/SPK_Zone.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - /** - * @class Plane - * @brief A Zone defining a plane in the universe - * - * A Plane is defined by 2 parameters : - *
    - *
  • A Position is the universe
  • - *
  • A Normal
  • - *
- * The defined Plane is the Plane having the normal and passing by the position.
- * The direction of the normal defines the sens of the plane. The normal goes from inside the Plane to outside.
- *
- * Note that the normal does not have to be normalized as it is normalized internally when set. - */ - class SPK_PREFIX Plane : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Plane) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of Plane - * @param position : the position of the Plane - * @param normal : the normal of the Plane - */ - Plane(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f)); - - /** - * @brief Creates and registers a new Plane - * @param position : the position of the Plane - * @param normal : the normal of the Plane - * @return a new registered plane - * @since 1.04.00 - */ - static Plane* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f)); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the normal of this Plane - * - * Note that the normal is normalized internally. - * - * @param normal : the normal of this Plane - */ - void setNormal(const Vector3D& normal); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the normal of this Plane - * @return the normal of this Plane - */ - const Vector3D& getNormal() const; - - /** - * @brief Gets the transformed normal of this Plane - * @return the transformed normal of this Plane - * @since 1.05.00 - */ - const Vector3D& getTransformedNormal() const; - - /////////////// - // Interface // - /////////////// - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D normal; - Vector3D tNormal; - }; - - - inline Plane* Plane::create(const Vector3D& position,const Vector3D& normal) - { - Plane* obj = new Plane(position,normal); - registerObject(obj); - return obj; - } - - inline void Plane::setNormal(const Vector3D& normal) - { - this->normal = normal; - this->normal.normalize(); - tNormal = this->normal; - notifyForUpdate(); - } - - inline const Vector3D& Plane::getNormal() const - { - return normal; - } - - inline const Vector3D& Plane::getTransformedNormal() const - { - return tNormal; - } - - inline void Plane::generatePosition(Particle& particle,bool full) const - { - particle.position() = getTransformedPosition(); - } - - inline bool Plane::contains(const Vector3D& v) const - { - return dotProduct(normal,v - getTransformedPosition()) <= 0.0f; - } - - inline Vector3D Plane::computeNormal(const Vector3D& point) const - { - return tNormal; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Point.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Point.h deleted file mode 100644 index a7fc1dce3..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Point.h +++ /dev/null @@ -1,93 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_POINT -#define H_SPK_POINT - -#include "Core/SPK_Zone.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - /** - * @class Point - * @brief A Zone defining a point in the universe - */ - class SPK_PREFIX Point : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Point) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Point - * @param position : the position of the Point - */ - Point(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f)); - - /** - * @brief Creates and registers a new Point - * @param position : the position of the Point - * @return A new registered Point - * @since 1.04.00 - */ - static Point* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f)); - - // Interface - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - }; - - inline Point* Point::create(const Vector3D& position) - { - Point* obj = new Point(position); - registerObject(obj); - return obj; - } - - inline void Point::generatePosition(Particle& particle,bool full) const - { - particle.position() = getTransformedPosition(); - } - - inline bool Point::contains(const Vector3D& v) const - { - return false; - } - - inline bool Point::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - return false; - } - - inline void Point::moveAtBorder(Vector3D& v,bool inside) const {} -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Ring.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Ring.h deleted file mode 100644 index fbb7aea2b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Ring.h +++ /dev/null @@ -1,198 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_RING -#define H_SPK_RING - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @brief A ZOne defining a flat ring in the universe - * - * A ring is defined by : - *
    - *
  • The position of its center
  • - *
  • The normal of the plane on which it lies
  • - *
  • A minimum and maximum radius
  • - *
- * Note that by having the minimum radius equal to 0, the ring becomes a disk in the universe.
- * Note that the normal does not have to be normalized as it is normalized internally when set. - * - * @since 1.05.00 - */ - class SPK_PREFIX Ring : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Ring) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of ring - * @param position : the position of the ring - * @param normal : the normal of the plane on which lies the ring - * @param minRadius : the minimum radius of the ring - * @param maxRadius : the maximum radius of the ring - */ - Ring(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f),float minRadius = 0.0f,float maxRadius = 1.0f); - - /** - * @brief Creates and registers a new Ring - * @param position : the position of the ring - * @param normal : the normal of the plane on which lies the ring - * @param minRadius : the minimum radius of the ring - * @param maxRadius : the maximum radius of the ring - * @return a new registered ring - */ - static Ring* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),const Vector3D& normal = Vector3D(0.0f,1.0f,0.0f),float minRadius = 0.0f,float maxRadius = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the normal of the plane on which lies this ring - * - * Note that the normal is normalized internally - * - * @param normal : the normal of the plane on which lies the ring - */ - void setNormal(const Vector3D& normal); - - /** - * @brief Sets the min and max radius of this ring - * - * A radius cannot be negative.
- * Note that negative radius are inverted internally - * - * @param minRadius : the minimum radius of this ring - * @param maxRadius : the maximum radius of this ring - */ - void setRadius(float minRadius,float maxRadius); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the normal of this ring - * @return the normal of this ring - */ - const Vector3D& getNormal() const; - - /** - * @brief Gets the transformed normal of this ring - * @return the transformed normal of this ring - */ - const Vector3D& getTransformedNormal() const; - - /** - * @brief Gets the minimum radius of this ring - * @return the minimum radius of this ring - */ - float getMinRadius() const; - - /** - * @brief Gets the maximum radius of this ring - * @return the maximum radius of this ring - */ - float getMaxRadius() const; - - /////////////// - // Interface // - /////////////// - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - protected : - - virtual void innerUpdateTransform(); - - private : - - Vector3D normal; - Vector3D tNormal; - - float minRadius; - float maxRadius; - - // Square of the radius (for optimization purpose) - float sqrMinRadius; - float sqrMaxRadius; - }; - - - inline Ring* Ring::create(const Vector3D& position,const Vector3D& normal,float minRadius,float maxRadius) - { - Ring* obj = new Ring(position,normal,minRadius,maxRadius); - registerObject(obj); - return obj; - } - - inline void Ring::setNormal(const Vector3D& normal) - { - this->normal = normal; - this->normal.normalize(); - tNormal = this->normal; - notifyForUpdate(); - } - - inline const Vector3D& Ring::getNormal() const - { - return normal; - } - - inline const Vector3D& Ring::getTransformedNormal() const - { - return tNormal; - } - - inline float Ring::getMinRadius() const - { - return minRadius; - } - - inline float Ring::getMaxRadius() const - { - return maxRadius; - } - - inline bool Ring::contains(const Vector3D& v) const - { - return false; - } - - inline Vector3D Ring::computeNormal(const Vector3D& point) const - { - return tNormal; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Sphere.h b/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Sphere.h deleted file mode 100644 index a78f10fdf..000000000 --- a/Extensions/ParticleSystem/SPARK/include/Extensions/Zones/SPK_Sphere.h +++ /dev/null @@ -1,117 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SPHERE -#define H_SPK_SPHERE - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - /** - * @class Sphere - * @brief A Zone defining a sphere in the universe - */ - class SPK_PREFIX Sphere : public Zone - { - SPK_IMPLEMENT_REGISTERABLE(Sphere) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of Sphere - * @param position : position of the center of the Sphere - * @param radius : radius of the Sphere - */ - Sphere(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),float radius = 0.0f); - - /** - * @brief Creates and registers a new Sphere - * @param position : position of the center of the Sphere - * @param radius : radius of the Sphere - * @return A new registered Sphere - * @since 1.04.00 - */ - static Sphere* create(const Vector3D& position = Vector3D(0.0f,0.0f,0.0f),float radius = 0.0f); - - //////////// - // Setter // - //////////// - - /** - * @brief Sets the radius of this Sphere - * - * A negative radius will be clamped to 0.0f and the Sphere will therefore acts as a Point. - * - * @param radius : the radius of this Sphere - */ - void setRadius(float radius); - - //////////// - // Getter // - //////////// - - /** - * @brief Gets the radius of this Sphere - * @return the radius of this Sphere - */ - float getRadius() const; - - /////////////// - // Interface // - /////////////// - - virtual void generatePosition(Particle& particle,bool full) const; - virtual bool contains(const Vector3D& v) const; - virtual bool intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const; - virtual void moveAtBorder(Vector3D& v,bool inside) const; - virtual Vector3D computeNormal(const Vector3D& point) const; - - private : - - float radius; - }; - - - inline Sphere* Sphere::create(const Vector3D& position,float radius) - { - Sphere* obj = new Sphere(position,radius); - registerObject(obj); - return obj; - } - - inline void Sphere::setRadius(float radius) - { - this->radius = radius >= 0.0f ? radius : 0.0f; - } - - inline float Sphere::getRadius() const - { - return radius; - } -} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRBuffer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRBuffer.h deleted file mode 100644 index ea8d38017..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRBuffer.h +++ /dev/null @@ -1,233 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_IRRBUFFER -#define H_SPK_IRRBUFFER - -#include "RenderingAPIs/Irrlicht/SPK_IRR_DEF.h" -#include "Core/SPK_Buffer.h" - -namespace SPK -{ -namespace IRR -{ - /** - * @enum E_IRRSPK_INDEXMODE - * @brief Constant defining the way Irrlicht index buffer are stored - * @since 1.04.00 - */ - enum E_IRRSPK_INDEXMODE - { - EII_16BITS = irr::video::EIT_16BIT, /**< Always use 16bits indices. Any attempt to create a buffer with more particles will fail */ - EII_32BITS = irr::video::EIT_32BIT, /**< Try to always use 32bits indices. If not available (old graphic cards), setting this indexmode will result in an undefined behavior */ - EII_AUTO, /**< Choose the best index mode according to the group size */ - }; - - /** - * @brief A buffer to store particle mesh data to be rendered with Irrlicht - * - * The buffer can hold an index buffer of either 16 bits or 32 bits indices.
- * Moreover, it can be used as VBO and store on the GPU side in an optimized way. - * - * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRBuffer : public Buffer - { - friend class IRRBufferCreator; - - public: - - ///////////// - // Setters // - ///////////// - - /** - * @brief Tells whether VBOs for this buffer are initialized or not - * - * This is used internally by the renderers and may not be called by the user. - * - * @param init : true if VBOs are initialized, false of not - */ - void setVBOInitialized(bool init); - - /** - * @brief Tells the amount of data that are used by the buffer - * - * This is used internally by the renderers and may not be called by the user. - * - * @param nb : the amount of data that are used by the buffer - */ - void setUsed(size_t nb); - - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the inner vertex buffer - * @return the inner vertex buffer - */ - irr::scene::IVertexBuffer& getVertexBuffer(); - - /** - * @brief Gets the inner index buffer - * @return the inner index buffer - */ - irr::scene::IIndexBuffer& getIndexBuffer(); - - /** - * @brief Gets the inner mesh buffer - * @return the inner mesh buffer - */ - irr::scene::IDynamicMeshBuffer& getMeshBuffer(); - - /** - * @brief Tells whether VBOs are initialized for this buffer - * - * This is used internally by the renderers and may not be called by the user. - * - * @return true if VBOs are initialized, false of not - */ - bool areVBOInitialized() const; - - - //////////// - // static // - //////////// - - /** - * @brief Sets whether to try to store IRRBuffers on GPU or not - * - * When creating an Irrlicht buffer, the system checks whether the VBO is activated or not.
- * If yes, VBOs may be used.
- *
- * Not that activating VBOs is only a hint, the Irrlicht engine may not use them depending - * on the buffer size, the renderer used and the graphic card.
- * nbParticles) // Prevents the buffers from growing - nb = nbParticles; - - getVertexBuffer().set_used(nb * particleVertexSize); - getIndexBuffer().set_used(nb * particleIndexSize); - } - - inline bool IRRBuffer::areVBOInitialized() const - { - return VBOInitialized; - } - - inline void IRRBuffer::setVBOInitialized(bool init) - { - VBOInitialized = init; - } - - inline bool IRRBuffer::isVBOHintActivated() - { - return useVBO; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.h deleted file mode 100644 index 60b2fd6d3..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.h +++ /dev/null @@ -1,122 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef SPK_IRRLINERENDERER -#define SPK_IRRLINERENDERER - -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h" -#include "Extensions/Renderers/SPK_LineRendererInterface.h" - -namespace SPK -{ -namespace IRR -{ - /** - * @class IRRLineRenderer - * @brief A Renderer drawing particles as lines with Irrlicht - * - * The length of the lines is function of the Particle velocity and is defined in the universe space - * while the width is fixed and defines in the screen space (in pixels).
- * Note that the width only works when using Irrlicht with OpenGL. With Direct3D, the parameter is ignored and 1 is used instead. - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRLineRenderer : public IRRRenderer,public LineRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(IRRLineRenderer) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of IRRLineRenderer - * @param d : the Irrlicht device - * @param length : the length multiplier of this IRRLineRenderer - * @param width : the width of this IRRLineRenderer in pixels - */ - IRRLineRenderer(irr::IrrlichtDevice* d,float length = 1.0f,float width = 1.0f); - - /** - * @brief Creates and registers a new IRRLineRenderer - * @param d : the Irrlicht device - * @param length : the length multiplier of this IRRLineRenderer - * @param width : the width of this IRRLineRenderer in pixels - * @return A new registered IRRLineRenderer - */ - static IRRLineRenderer* create(irr::IrrlichtDevice* d,float length = 1.0f,float width = 1.0f); - - ///////////// - // Setters // - ///////////// - - virtual void setWidth(float width); - - /////////////// - // Interface // - /////////////// - - virtual void render(const Group& group); - - void createBuffers(const Group& group); - - private : - - static const size_t NB_INDICES_PER_QUAD = 2; - static const size_t NB_VERTICES_PER_QUAD = 2; - - // buffer name - static const std::string IRR_BUFFER_NAME; - - virtual const std::string& getBufferName() const; - }; - - - inline IRRLineRenderer* IRRLineRenderer::create(irr::IrrlichtDevice* d,float length,float width) - { - IRRLineRenderer* obj = new IRRLineRenderer(d,length,width); - registerObject(obj); - return obj; - } - - inline void IRRLineRenderer::setWidth(float width) - { - material.Thickness = this->width = width; - } - - inline const std::string& IRRLineRenderer::getBufferName() const - { - return IRR_BUFFER_NAME; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.h deleted file mode 100644 index e15fb5fbf..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.h +++ /dev/null @@ -1,188 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef SPK_IRRPOINTRENDERER -#define SPK_IRRPOINTRENDERER - -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h" -#include "Extensions/Renderers/SPK_PointRendererInterface.h" - -namespace SPK -{ -namespace IRR -{ - /** - * @class IRRPointRenderer - * @brief A Renderer drawing particles as points with Irrlicht - * - * Rendering can be done in 2 ways : - *
    - *
  • SPK::POINT_SQUARE : standard points
  • - *
  • SPK::POINT_SPRITE : point sprites (must be supported by the hardware)
  • - *
- * Note that SPK::POINT_CIRCLE cannot be set with this renderer.
- *
- * Regarding the size of the rendered point, they are dependant of the Irrlicht settings.
- * Basically size of the points is neither in pixels nor in the universe unit.
- * Moreover, points are scaling with the distance but are rapidly clamped.
- * So Irrlicht does not handle point size very well at the moment, maybe it will do better in the future.
- * In that case, this renderer will become very useful. - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRPointRenderer : public IRRRenderer,public PointRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(IRRPointRenderer) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of IRRPointRenderer - * @param d : the Irrlicht device - * @param size : the size of the points - */ - IRRPointRenderer(irr::IrrlichtDevice* d,float size = 1.0f); - - /** - * @brief Creates and registers a new IRRPointRenderer - * @param d : the Irrlicht device - * @param size : the size of the points - * @return A new registered IRRPointRenderer - */ - static IRRPointRenderer* create(irr::IrrlichtDevice* d,float size = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the texture to map on particles - * - * Note that this only works with points being rendered as SPK::POINT_SPRITE - * - * @param texture : the texture to set - */ - void setTexture(irr::video::ITexture* texture); - - // Reimplemented from PointRendererInterface - virtual bool setType(PointType type); - virtual void setSize(float size); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texture of this renderer - * @return the texture of this renderer - */ - irr::video::ITexture* getTexture() const; - - /** - * @brief Gets the material texture layer - * @return the material texture layer - */ - irr::video::SMaterialLayer& getMaterialLayer(); - - /** - * @brief Gets the material texture layer in a constant way - * @return the material texture layer - */ - const irr::video::SMaterialLayer& getMaterialLayer() const; - - /////////////// - // Interface // - /////////////// - - virtual void render(const Group& group); - - void createBuffers(const Group& group); - - private : - - static const size_t NB_INDICES_PER_QUAD = 2; - static const size_t NB_VERTICES_PER_QUAD = 2; - - // buffer name - static const std::string IRR_BUFFER_NAME; - - virtual const std::string& getBufferName() const; - virtual int getBufferPurpose() const; - }; - - - inline IRRPointRenderer* IRRPointRenderer::create(irr::IrrlichtDevice* d,float size) - { - IRRPointRenderer* obj = new IRRPointRenderer(d,size); - registerObject(obj); - return obj; - } - - inline void IRRPointRenderer::setTexture(irr::video::ITexture* texture) - { - material.TextureLayer[0].Texture = texture; - } - - inline void IRRPointRenderer::setSize(float size) - { - material.Thickness = this->size = size; - } - - inline irr::video::ITexture* IRRPointRenderer::getTexture() const - { - return material.TextureLayer[0].Texture; - } - - inline irr::video::SMaterialLayer& IRRPointRenderer::getMaterialLayer() - { - return material.TextureLayer[0]; - } - - inline const irr::video::SMaterialLayer& IRRPointRenderer::getMaterialLayer() const - { - return material.TextureLayer[0]; - } - - inline const std::string& IRRPointRenderer::getBufferName() const - { - return IRR_BUFFER_NAME; - } - - inline int IRRPointRenderer::getBufferPurpose() const - { - return 0; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.h deleted file mode 100644 index 933bded48..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.h +++ /dev/null @@ -1,263 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef SPK_IRRQUADRENDERER -#define SPK_IRRQUADRENDERER - -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h" -#include "Extensions/Renderers/SPK_QuadRendererInterface.h" -#include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h" - -namespace SPK -{ -namespace IRR -{ - /** - * @class IRRQuadRenderer - * @brief A Renderer drawing particles as quads with Irrlicht - * - * The orientation of the quads depends on the orientation parameters set. - * This orientation is computed during rendering by the CPU (further improvement of SPARK will allow to make the computation on GPU side).
- *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_SIZE
  • - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
  • SPK::PARAM_ANGLE
  • - *
  • SPK::PARAM_TEXTURE_INDEX (only if not in TEXTURE_NONE mode)
  • - *
- * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRQuadRenderer : public IRRRenderer, - public QuadRendererInterface, - public Oriented3DRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(IRRQuadRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of IRRQuadRenderer - * @param d : the Irrlicht device - * @param scaleX the scale of the width of the quad - * @param scaleY the scale of the height of the quad - */ - IRRQuadRenderer(irr::IrrlichtDevice* d,float scaleX = 1.0f,float scaleY = 1.0f); - - /** - * @brief Creates and registers a new IRRQuadRenderer - * @param d : the Irrlicht device - * @param scaleX the scale of the width of the quad - * @param scaleY the scale of the height of the quad - * @return A new registered IRRQuadRenderer - * @since 1.04.00 - */ - static IRRQuadRenderer* create(irr::IrrlichtDevice* d,float scaleX = 1.0f,float scaleY = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the texture to map on particles - * - * Note that this only works with points being rendered as SPK::POINT_SPRITE - * - * @param texture : the texture to set - */ - void setTexture(irr::video::ITexture* texture); - - /** - * @brief Sets the atlas dimension of the texture in an Irrlicht way - * - * see setQuadAtlasDimension(unsigned int,unsigned int) for more information - * - * @param dim : the atlas dimension of the texture - */ - void setAtlasDimensions(irr::core::dimension2du dim); - using QuadRendererInterface::setAtlasDimensions; - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texture of this renderer - * @return the texture of this renderer - */ - irr::video::ITexture* getTexture() const; - - /** - * @brief Gets the material texture layer - * @return the material texture layer - */ - irr::video::SMaterialLayer& getMaterialLayer(); - - /** - * @brief Gets the material texture layer in a constant way - * @return the material texture layer - */ - const irr::video::SMaterialLayer& getMaterialLayer() const; - - /** - * @brief Gets the atlas dimension of the texture in an Irrlicht way - * @return the atlas dimension of the texture - */ - irr::core::dimension2du getAtlasDimensions() const; - - /////////////// - // Interface // - /////////////// - - virtual void render(const Group& group); - - void createBuffers(const Group& group); - - private : - - static const size_t NB_INDICES_PER_QUAD = 6; - static const size_t NB_VERTICES_PER_QUAD = 4; - - // buffer name - static const std::string IRR_BUFFER_NAME; - - virtual const std::string& getBufferName() const; - - void FillBufferColorAndVertex(const Particle& particle) const; // Fills Irrlicht buffer with color and position - void FillBufferTextureAtlas(const Particle& particle) const; // Fills Irrlicht buffer with atlas texture coordinates - - static void (IRRQuadRenderer::*renderParticle)(const Particle&) const; // pointer to the right render method - - void renderBasic(const Particle& particle) const; // Rendering for particles with texture or no texture - void renderRot(const Particle& particle) const; // Rendering for particles with texture or no texture and rotation - void renderAtlas(const Particle& particle) const; // Rendering for particles with texture atlas - void renderAtlasRot(const Particle& particle) const; // Rendering for particles with texture atlas and rotation - }; - - - inline IRRQuadRenderer* IRRQuadRenderer::create(irr::IrrlichtDevice* d,float scaleX,float scaleY) - { - IRRQuadRenderer* obj = new IRRQuadRenderer(d,scaleX,scaleY); - registerObject(obj); - return obj; - } - - inline void IRRQuadRenderer::setTexture(irr::video::ITexture* texture) - { - material.TextureLayer[0].Texture = texture; - } - - inline void IRRQuadRenderer::setAtlasDimensions(irr::core::dimension2du dim) - { - setAtlasDimensions(dim.Width,dim.Height); - } - - inline irr::video::ITexture* IRRQuadRenderer::getTexture() const - { - return material.TextureLayer[0].Texture; - } - - inline irr::video::SMaterialLayer& IRRQuadRenderer::getMaterialLayer() - { - return material.TextureLayer[0]; - } - - inline const irr::video::SMaterialLayer& IRRQuadRenderer::getMaterialLayer() const - { - return material.TextureLayer[0]; - } - - inline irr::core::dimension2du IRRQuadRenderer::getAtlasDimensions() const - { - return irr::core::dimension2du(textureAtlasNbX,textureAtlasNbY); - } - - inline const std::string& IRRQuadRenderer::getBufferName() const - { - return IRR_BUFFER_NAME; - } - - inline void IRRQuadRenderer::FillBufferColorAndVertex(const Particle& particle) const - { - size_t offset = particle.getIndex() << 2; - - float x = particle.position().x; - float y = particle.position().y; - float z = particle.position().z; - - irr::video::SColor color(spk2irr( - particle.getParamCurrentValue(PARAM_ALPHA), - particle.getR(), - particle.getG(), - particle.getB())); - - // According to Irrlicht coordinates system, quads are drawn in clockwise order - // Note that the quad side points towards the left as it is a left handed system - // top left vertex - currentBuffer->getVertexBuffer()[offset].Pos.set( - x + quadSide().x + quadUp().x, - y + quadSide().y + quadUp().y, - z + quadSide().z + quadUp().z); - currentBuffer->getVertexBuffer()[offset].Color = color; - - // top right vertex - currentBuffer->getVertexBuffer()[++offset].Pos.set( - x - quadSide().x + quadUp().x, - y - quadSide().y + quadUp().y, - z - quadSide().z + quadUp().z); - currentBuffer->getVertexBuffer()[offset].Color = color; - - // bottom right vertex - currentBuffer->getVertexBuffer()[++offset].Pos.set( - x - quadSide().x - quadUp().x, - y - quadSide().y - quadUp().y, - z - quadSide().z - quadUp().z); - currentBuffer->getVertexBuffer()[offset].Color = color; - - // bottom left vertex - currentBuffer->getVertexBuffer()[++offset].Pos.set( - x + quadSide().x - quadUp().x, - y + quadSide().y - quadUp().y, - z + quadSide().z - quadUp().z); - currentBuffer->getVertexBuffer()[offset].Color = color; - } - - inline void IRRQuadRenderer::FillBufferTextureAtlas(const Particle& particle) const - { - size_t offset = particle.getIndex() << 2; - computeAtlasCoordinates(particle); - currentBuffer->getVertexBuffer()[offset].TCoords.set(textureAtlasU0(),textureAtlasV0()); - currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU1(),textureAtlasV0()); - currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU1(),textureAtlasV1()); - currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU0(),textureAtlasV1()); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRRenderer.h deleted file mode 100644 index b93f06e6c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRRenderer.h +++ /dev/null @@ -1,219 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef SPK_IRRRENDERER -#define SPK_IRRRENDERER - -#include "RenderingAPIs/Irrlicht/SPK_IRR_DEF.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" -#include "Core/SPK_Renderer.h" -#include "Core/SPK_Group.h" - - -namespace SPK -{ -namespace IRR -{ - /** - * @brief The base renderer for all Irrlicht renderers - * - * This class presents a convenient interface to set some parameters common to all Irrlicht renderers (blending mode...).
- *
- * Note that rendering hints work with Irrlicht renderers except the SPK::ALPHA_TEST - * which is always enabled with a threshold of 0. (meaning alpha values of 0 are never rendered). - * - * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRRenderer : public Renderer - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of IRRRenderer - * @param d : the Irrlicht device - */ - IRRRenderer(irr::IrrlichtDevice* d); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of IRRRenderer */ - virtual ~IRRRenderer(){}; - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the blending mode in a very accurate way - * - * This method allows to set any blending mode supported by Irrlicht.
- * Note that a simpler helper method exist to set the most common blending modes :
- * setBlending(BlendingMode) - * - * @param srcFunc : the blending source function - * @param destFunc : the blending destination function - * @param alphaSrc : the alpha source - */ - void setBlending(irr::video::E_BLEND_FACTOR srcFunc,irr::video::E_BLEND_FACTOR destFunc,unsigned int alphaSrc); - virtual void setBlending(BlendingMode blendMode); - - virtual void enableRenderingHint(RenderingHint renderingHint,bool enable); - virtual void setAlphaTestThreshold(float alphaThreshold); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the Irrlicht device of this renderer - * @return the device of this renderer - */ - irr::IrrlichtDevice* getDevice() const; - - /** - * @brief Gets the source blending funtion of this renderer - * @return the source blending funtion of this renderer - */ - irr::video::E_BLEND_FACTOR getBlendSrcFunc() const; - - /** - * @brief Gets the destination blending funtion of this renderer - * @return the destination blending funtion of this renderer - */ - irr::video::E_BLEND_FACTOR getBlendDestFunc() const; - - /** - * @brief Gets the alpha source of this renderer - * @return the alpha source of this renderer - */ - unsigned int getAlphaSource() const; - - /** - * @brief Gets the material of this renderer - * - * Note that the renderer is constant and therefore cannot be modified directly - * - * @return the material of this renderer - */ - const irr::video::SMaterial& getMaterial() const; - - virtual bool isRenderingHintEnabled(RenderingHint renderingHint) const; - - /////////////// - // Interface // - /////////////// - - virtual void destroyBuffers(const Group& group); - - protected : - - irr::IrrlichtDevice* device; // the device - irr::video::SMaterial material; // the material - - mutable IRRBuffer* currentBuffer; - - virtual bool checkBuffers(const Group& group); - static unsigned int getVBOFlag(); - - private : - - irr::video::E_BLEND_FACTOR blendSrcFunc; - irr::video::E_BLEND_FACTOR blendDestFunc; - unsigned int alphaSource; - - /** - * @brief Gets the name of the IRRBuffer used by the renderer - * - * This method must be implemented in all children renderers - * - * @return the name of the IRRBuffer - */ - virtual const std::string& getBufferName() const = 0; - - void updateMaterialBlendingMode(); - }; - - - inline void IRRRenderer::setAlphaTestThreshold(float alphaThreshold) - { - Renderer::setAlphaTestThreshold(0.0f); // the alpha threshold of the irrlicht material is always 0 - } - - inline irr::IrrlichtDevice* IRRRenderer::getDevice() const - { - return device; - } - - inline irr::video::E_BLEND_FACTOR IRRRenderer::getBlendSrcFunc() const - { - return blendSrcFunc; - } - - inline irr::video::E_BLEND_FACTOR IRRRenderer::getBlendDestFunc() const - { - return blendDestFunc; - } - - inline unsigned int IRRRenderer::getAlphaSource() const - { - return alphaSource; - } - - inline const irr::video::SMaterial& IRRRenderer::getMaterial() const - { - return material; - } - - inline void IRRRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(getBufferName()); - } - - inline bool IRRRenderer::checkBuffers(const Group& group) - { - currentBuffer = dynamic_cast(group.getBuffer(getBufferName(),getVBOFlag())); - return currentBuffer != NULL; - } - - inline unsigned int IRRRenderer::getVBOFlag() - { - return IRRBuffer::isVBOHintActivated() ? 1 : 0; - } - - inline void IRRRenderer::updateMaterialBlendingMode() - { - material.MaterialTypeParam = irr::video::pack_texureBlendFunc( - blendSrcFunc, - blendDestFunc, - irr::video::EMFN_MODULATE_1X, - alphaSource); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRSystem.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRSystem.h deleted file mode 100644 index 0cf0be912..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRRSystem.h +++ /dev/null @@ -1,259 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_IRRSYSTEM -#define H_SPK_IRRSYSTEM - -#include "RenderingAPIs/Irrlicht/SPK_IRR_DEF.h" -#include "Core/SPK_System.h" - -namespace SPK -{ -namespace IRR -{ - /** - * @brief A particle system adapted to Irrlicht - * - * This particle system is also a scene node, so you can apply transformations on it.
- * Be aware that only group using Irrlicht as renderer will work correctly.
- *
- * The particle system is rendered automatically in the render process of Irrlicht.
- * If specified it can automatically update all particles (auto-update) on animation pass.
- * It is possible to specify if the system should update particles when not visible.
- * By default, auto-update is enabled only when visible.
- *
- * Note also that an IRRSystem takes care of the camera position automatically when distance computation is enabled - * on one of its Group. Therefore there is no need to call System::setCameraPosition(Vector3D). - * - * @since 1.04.00 - */ - class SPK_IRR_PREFIX IRRSystem : public System, public irr::scene::ISceneNode - { - SPK_IMPLEMENT_REGISTERABLE(IRRSystem) - - public: - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of IRRSystem - * @param parent : the parent node of the particle system - * @param mgr : the Irrlicht scene manager - * @param worldTransformed : true to emit particles in world, false to emit them localy - * @param id : the ID of the node - */ - IRRSystem(irr::scene::ISceneNode* parent,irr::scene::ISceneManager* mgr,bool worldTransformed = true,irr::s32 id=-1); - - IRRSystem(const IRRSystem& system); - - /** - * @brief Creates and registers a new IRRSystem - * @param parent : the parent node of the particle system - * @param mgr : the Irrlicht scene manager - * @param worldTransformed : true to emit particles in world, false to emit them localy - * @param id : the ID of the node - * @return A new registered IRRSystem - */ - static IRRSystem* create(irr::scene::ISceneNode* parent,irr::scene::ISceneManager* mgr,bool worldTransformed = true,irr::s32 id=-1); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Enables or disables auto update - * @param enableState : True to enable auto-update, false to disable it - * @param onlyWhenVisible : True to perform auto-update only if node is visible. This parameter is ignored if auto-update is set to false. - */ - void setAutoUpdateEnabled(bool enableState, bool onlyWhenVisible); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Returns true if auto-update is enabled - * - * If true, the scene node will update particles automatically, else the user must call update(). - * - * @return true if auto-update is enabled, false if disabled - */ - bool isAutoUpdateEnabled() const; - - /** - * @brief Returns true if auto-update is performed only when visible - * @return True if particles are updated only if the scene node is visible (use setVisible() to change visibility). - */ - bool isUpdateOnlyWhenVisible() const; - - /** - * @brief Tells whether this system is world transformed or not - * - * If a system is transformed in the world, only its emitter and zones will be transformed.
- * The emitted particles will remain independent from the system transformation.
- *
- * If it is transformed locally, the emitted particles will be transformed as well. - * - * @return true if this system is world transformed, false if not - */ - bool isWorldTransformed() const; - - /** - * @brief Gets the bounding box - * - * Note that the returned bounding box is invalid if aabb computation is disabled. - * - * @return the bounding box containing all particles - */ - virtual const irr::core::aabbox3d& getBoundingBox() const; - - /** - * @brief Tells whether the system has finished or not - * - * This method will return true if : - *
    - *
  • There is no more active particles in the system
  • - *
  • All the emitters in the system are sleeping
  • - *
- * The IRRSystem provides an accessor for this as the update can be done within the Irrlicht scene manager. - * In that case the user cannot get the returned value of update(float). - * - * @return true if the system has finished, false otherwise - */ - bool hasFinished() const; - - /////////////// - // Interface // - /////////////// - - virtual bool update(float deltaTime); - - /** - * @brief Renders the particles in the system - * - * (Reimplementation of the irr::scene::SceneNode render method.) - */ - virtual void render(); - - /** - * @brief Renders the particles in the system - * - * (Reimplementation of the SPK::System render method.) - */ - virtual void render() const; - - /** @brief This method is called just before the rendering process of the whole scene */ - virtual void OnRegisterSceneNode(); - - /** - * @brief This method is called just before rendering the whole scene - * - * It should be called only by engine. - * - * @param timeMs : Current time in milliseconds - **/ - virtual void OnAnimate(irr::u32 timeMs); - - /** @brief Updates the absolute transformation of this Irrlicht Node */ - virtual void updateAbsolutePosition(); - - private: - - bool AutoUpdate; - bool AlwaysUpdate; - - const bool worldTransformed; - - bool finished; - - mutable irr::core::aabbox3d BBox; - mutable irr::u32 lastUpdatedTime; - - virtual void onRegister(); - virtual void onUnregister(); - - // This sets the right camera position if distance computation is enabled for a group of the system - void updateCameraPosition() const; - }; - - - inline IRRSystem* IRRSystem::create(irr::scene::ISceneNode* parent,irr::scene::ISceneManager* mgr,bool worldTransformed,irr::s32 id) - { - IRRSystem* obj = new IRRSystem(parent,mgr,worldTransformed,id); - registerObject(obj); - return obj; - } - - inline bool IRRSystem::isAutoUpdateEnabled() const - { - return AutoUpdate; - } - - inline bool IRRSystem::isUpdateOnlyWhenVisible() const - { - return !AlwaysUpdate; - } - - inline bool IRRSystem::isWorldTransformed() const - { - return worldTransformed; - } - - inline bool IRRSystem::hasFinished() const - { - return finished; - } - - inline void IRRSystem::setAutoUpdateEnabled(bool enableState, bool onlyWhenVisible) - { - AutoUpdate = enableState; - AlwaysUpdate = !onlyWhenVisible; - } - - inline bool IRRSystem::update(float deltaTime) - { - updateCameraPosition(); - finished = !System::update(deltaTime); - return !finished; - } - - inline void IRRSystem::render() - { - const_cast(this)->render(); - } - - inline void IRRSystem::onRegister() - { - grab(); // when the factory registers a system, it grabs it so that it will not be destroyed by Irrlicht - } - - inline void IRRSystem::onUnregister() - { - remove(); // Removes the IRRSystem from the Irrlicht scene graph - } -}} - -#endif - diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRR_DEF.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRR_DEF.h deleted file mode 100644 index b74ff17b4..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/Irrlicht/SPK_IRR_DEF.h +++ /dev/null @@ -1,89 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK_IRR_DEF -#define H_SPK_IRR_DEF - -#include -#include "Core/SPK_Vector3D.h" - -#ifdef _MSC_VER -#pragma warning(disable : 4275) // disables the warning about exporting DLL classes children of non DLL classes -#endif - -#ifdef SPK_IRR_EXPORT -#define SPK_IRR_PREFIX __declspec(dllexport) -#elif defined(SPK_IMPORT) || defined(SPK_IRR_IMPORT) -#define SPK_IRR_PREFIX __declspec(dllimport) -#else -#define SPK_IRR_PREFIX -#endif - -namespace SPK -{ -/** -* @namespace SPK::IRR -* @brief the namespace for Irrlicht dependent SPARK code -* @since 1.04.00 -*/ -namespace IRR -{ - ////////////////////////// - // Conversion functions // - ////////////////////////// - - /** - * @brief Converts a SPARK Vector3D to an Irrlicht vector3df - * @param v : the Vector3D to convert - * @return the Irrlicht vector3df - */ - inline irr::core::vector3df spk2irr(const Vector3D& v) - { - return irr::core::vector3df(v.x,v.y,v.z); - } - - /** - * @brief Converts an Irrlicht vector3df to a SPARK Vector3D - * @param v : the vector3df to convert - * @return the SPARK Vector3D - */ - inline Vector3D irr2spk(const irr::core::vector3df& v) - { - return Vector3D(v.X,v.Y,v.Z); - } - - /** - * @brief Gets an Irrlicht SColor from rgba values - * @param a : the alpha value - * @param r : the red value - * @param g : the green value - * @param b : the blue value - * @return the Irrlicht SColor - */ - inline irr::video::SColor spk2irr(float a, float r, float g, float b) - { - return irr::video::SColorf(r,g,b,a).toSColor(); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLExtHandler.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLExtHandler.h deleted file mode 100644 index 190d3a9b4..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLExtHandler.h +++ /dev/null @@ -1,381 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLEXTHANDLER -#define H_SPK_GLEXTHANDLER - -#include "Core/SPK_DEF.h" -#include "RenderingAPIs/OpenGL/SPK_GL_DEF.h" - -// OpenGL defines (from glext.h) -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_TEXTURE_3D 0x806F - - -namespace SPK -{ -namespace GL -{ - /** - * @class GLExtHandler - * @brief A class to handle OpenGL extensions - * - * This class presents an interface to handle openGL extensions.
- * The interface is static an has a public and a protected side.
- *
- * A class willing to make use of the openGL extensions must derive from this class to access the protected interface.
- *
- * If an OpenGL extension is not handle by this class, - * the proper way to implement it within SPARK will be to derive this class to implement it. - * Then the Renderer which will use the extension has to extends the child class. - *
- * The opengl extensions implemented are :
    - *
  • point sprites : used in SPARK to attach images on points and therfore gain performance
  • - *
  • point parameters : used in SPARK both to allow to have points size function of the distance and - * to overtake the basic point size limitation (usually 64 pix).
  • - *
  • texture 3D : used in SPARK to animate texture
  • - *
- * - * @since 1.01.00 - */ - class SPK_GL_PREFIX GLExtHandler - { - public : - - /////////////////// - // Point Sprites // - /////////////////// - - /** - * @brief Loads the openGL point sprite extension - * - * Note that this methods is called internally when needed.
- * The extension is loaded or not only at the first call to this method, - * the following calls only tell whether the extension was loaded or not.
- * In that way, this method is only useful to the user, to check whether the extension is supported or not. - * - * @return true if the extension is loaded (supported by the hardware), false if not - */ - static bool loadGLExtPointSprite(); - - ////////////////////// - // Point Parameters // - ////////////////////// - - /** - * @brief Loads the openGL extended point parameter extension - * - * Note that this methods is called internally when needed.
- * The extension is loaded or not only at the first call to this method, - * the further calls only tell whether the extension was loaded or not.
- * In that way, this method is only useful to the user, to check whether the extension is supported or not. - * - * @return true if the extension is loaded (supported by the hardware), false if not - */ - static bool loadGLExtPointParameter(); - - /** - * @brief Computes a conversion ratio between pixels and universe units - * - * This method must be called when using GLPointRenderer with world size enabled.
- * It allows to well transpose world size to pixel size by setting the right openGL parameters.
- *
- * Note that fovy can be replaced by fovx if screenHeight is replaced by screenWidth. - * - * @param fovy : the field of view in the y axis in radians - * @param screenHeight : the height of the viewport in pixels - */ - static void setPixelPerUnit(float fovy,int screenHeight); - - //////////////// - // Texture 3D // - //////////////// - - /** - * @brief Loads the OpenGL texture 3D extension - * - * Note that this methods is called internally when needed.
- * The extension is loaded or not only at the first call to this method, - * the further calls only tell whether the extension was loaded or not.
- * In that way, this method is only useful to the user, to check whether the extension is supported or not. - * - * @return true if the extension is loaded (supported by the hardware), false if not - * @since 1.02.00 - */ - static bool loadGLExtTexture3D(); - - /** - * @brief Specifies a three-dimensional texture image - * - * This method is exactly like calling the glTexImage3D method of OpenGL - * excepts it is already defined.
- * If the OpenGL texture 3D extension is not supported, this method does nothing.
- *
- * For more information, check the OpenGL documentation of glTexImage3D. - * - * @param target : check the OpenGL documentation of glTexImage3D - * @param level : check the OpenGL documentation of glTexImage3D - * @param internalFormat : check the OpenGL documentation of glTexImage3D - * @param width : check the OpenGL documentation of glTexImage3D - * @param height : check the OpenGL documentation of glTexImage3D - * @param depth : check the OpenGL documentation of glTexImage3D - * @param border : check the OpenGL documentation of glTexImage3D - * @param format : check the OpenGL documentation of glTexImage3D - * @param type : check the OpenGL documentation of glTexImage3D - * @param pixels : check the OpenGL documentation of glTexImage3D - * @since 1.02.00 - */ - static void glTexImage3D(GLenum target, - GLint level, - GLenum internalFormat, - GLsizei width, - GLsizei height, - GLsizei depth, - GLint border, - GLenum format, - GLenum type, - const GLvoid* pixels); - - ///////////// - // Shaders // - ///////////// - - /** - * @brief Loads the shader extension - * - * Note that this methods is called internally when needed.
- * The extension is loaded or not only at the first call to this method, - * the further calls only tell whether the extension was loaded or not.
- * In that way, this method is only useful to the user, to check whether the extension is supported or not.
- *
- * NOTE THAT FOR THE MOMENT, EVEN IF SHADER EXTENSIONS CAN BE LOADED, THEY ARE NOT USED WITHIN SPARK - * - * @return true if the extension is loaded (supported by the hardware), false if not - * @since 1.04.00 - */ - static bool loadGLExtShader(); - - protected : - - /** - * @enum GLExtension - * @brief Constants for openGL extension loading - */ - enum GLExtension - { - UNCHECKED, /**< Constant meaning the openGL extension was not tested */ - SUPPORTED, /**< Constant meaning the openGL extension is supported by the hardware */ - UNSUPPORTED, /**< Constant meaning the openGL extension is not supported by the hardware */ - }; - - /** - * @brief Gets the address of an OpenGL function in a portable way - * @param name : the name of the OpenGL function - * @return a pointer to the OpenGL function, or NULL if the function is not found - */ - static void* glGetProcAddress(const char* name); - - /////////////////// - // Point Sprites // - /////////////////// - - /** - * @brief Gets the state of the point sprite extension - * @return the state of the point sprite extension - */ - static GLExtension getPointSpriteGLExt(); - - /** - * @brief Enables the use of point sprites - * - * Note that before calling this method, the user must ensure that the point sprite extension is loaded. - */ - static void enablePointSpriteGLExt(); - - /** - * @brief Disables the use of point sprites - * - * Note that before calling this method, the user must ensure that the point sprite extension is loaded. - */ - static void disablePointSpriteGLExt(); - - ////////////////////// - // Point Parameters // - ////////////////////// - - /** - * @brief Gets the state of the point parameters extension - * @return the state of the point parameters extension - */ - static GLExtension getPointParameterGLExt(); - - /** - * @brief Enables the use of point parameters - * - * This method will set the right point parameters to get the desired point size.
- *
- * It can either be used to have points size function of the distance to the camera (is distance is true) - * or only to allow bigger range for point sizes (if distance is false). - *
- * Note that if distance is set to true setPixelPerUnit(float,int) must be call once before. - *
- * Note that before calling this method, the user must ensure that the point parameters extension is loaded. - * - * @param size : the size of the point - * @param distance : true to enable the modification of the size function of the distance, false not to. - */ - static void enablePointParameterGLExt(float size,bool distance); - - /** - * @brief Disables the use of point parameters - * - * Note that before calling this method, the user must ensure that the point parameters extension is loaded. - */ - static void disablePointParameterGLExt(); - - //////////////// - // Texture 3D // - //////////////// - - /** - * @brief Gets the state of the texture 3D extension - * @return the state of the texture 3D extension - * @since 1.02.00 - */ - static GLExtension getTexture3DGLExt(); - - ///////////// - // Shaders // - ///////////// - - /** - * @brief Gets the state of the shader support - * @return the state of the vertex shader support - * @since 1.04.00 - */ - static GLExtension getShaderGLExt(); - - private : - - // GLchar definition - typedef char GLchar; - - // typedefs for OpenGL pointers of functions (glext.h is however needed) - typedef void (APIENTRY *SPK_PFNGLPOINTPARAMETERFPROC)(GLenum,GLfloat); - typedef void (APIENTRY *SPK_PFNGLPOINTPARAMETERFVPROC)(GLenum,const GLfloat*); - typedef void (APIENTRY *SPK_PFNGLTEXIMAGE3DPROC)(GLenum,GLint,GLint,GLsizei,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid*); - typedef void (APIENTRY *SPK_PFNGLCREATESHADERPROC)(GLenum); - typedef void (APIENTRY *SPK_PFNGLDELETESHADERPROC)(GLuint); - typedef void (APIENTRY *SPK_PFNGLSHADERSOURCEPROC)(GLuint,GLsizei,const GLchar**,const GLint*); - typedef void (APIENTRY *SPK_PFNGLCOMPILESHADERPROC)(GLuint); - typedef void (APIENTRY *SPK_PFNGLCREATEPROGRAMPROC)(void); - typedef void (APIENTRY *SPK_PFNGLDELETEPROGRAMPROC)(GLuint); - typedef void (APIENTRY *SPK_PFNGLATTACHSHADERPROC)(GLuint,GLuint); - typedef void (APIENTRY *SPK_PFNGLDETACHSHADERPROC)(GLuint,GLuint); - typedef void (APIENTRY *SPK_PFNGLLINKPROGRAMPROC)(GLuint); - typedef void (APIENTRY *SPK_PFNGLUSEPROGRAMPROC)(GLuint); - - // Gets the GL function address on MAC -#if defined(__APPLE__) || defined(macintosh) - static void* SPK_NSGLGetProcAddress(const char* name); -#endif - - /////////////////// - // Point Sprites // - /////////////////// - - static GLExtension pointSpriteGLExt; - - ////////////////////// - // Point Parameters // - ////////////////////// - - static GLExtension pointParameterGLExt; - - static SPK_PFNGLPOINTPARAMETERFPROC SPK_glPointParameterf; - static SPK_PFNGLPOINTPARAMETERFVPROC SPK_glPointParameterfv; - - static const float POINT_SIZE_CURRENT; - static const float POINT_SIZE_MIN; - static const float POINT_SIZE_MAX; - - static float pixelPerUnit; - - static const float QUADRATIC_SCREEN[3]; - - //////////////// - // Texture 3D // - //////////////// - - static GLExtension texture3DGLExt; - - static SPK_PFNGLTEXIMAGE3DPROC SPK_glTexImage3D; - - ////////////// - // Shaders // - ////////////// - - static GLExtension shaderGLExt; - - static SPK_PFNGLCREATESHADERPROC SPK_glCreateShader; - static SPK_PFNGLDELETESHADERPROC SPK_glDeleteShader; - static SPK_PFNGLSHADERSOURCEPROC SPK_glShaderSource; - static SPK_PFNGLCOMPILESHADERPROC SPK_glCompileShader; - static SPK_PFNGLCREATEPROGRAMPROC SPK_glCreateProgram; - static SPK_PFNGLDELETEPROGRAMPROC SPK_glDeleteProgram; - static SPK_PFNGLATTACHSHADERPROC SPK_glAttachShader; - static SPK_PFNGLDETACHSHADERPROC SPK_glDetachShader; - static SPK_PFNGLLINKPROGRAMPROC SPK_glLinkProgram; - static SPK_PFNGLUSEPROGRAMPROC SPK_glUseProgram; - }; - - - inline void* GLExtHandler::glGetProcAddress(const char* name) - { -#if defined(WIN32) || defined(_WIN32) - return (void*)wglGetProcAddress(name); // Windows -#elif defined(__APPLE__) || defined(macintosh) - return (void*)SPK_NSGLGetProcAddress(name); // MAC -#elif defined(linux) || defined(__linux) - return (void*)glXGetProcAddressARB(reinterpret_cast(name)); // Linux -#else - return (void*)NULL; -#endif - } - - inline void GLExtHandler::enablePointSpriteGLExt() - { - glTexEnvf(GL_POINT_SPRITE,GL_COORD_REPLACE,GL_TRUE); - glEnable(GL_POINT_SPRITE); - } - - inline void GLExtHandler::disablePointSpriteGLExt() - { - glDisable(GL_POINT_SPRITE); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineRenderer.h deleted file mode 100644 index 0c1d3fa54..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineRenderer.h +++ /dev/null @@ -1,106 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLLINERENDERER -#define H_SPK_GLLINERENDERER - -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" -#include "Extensions/Renderers/SPK_LineRendererInterface.h" - -namespace SPK -{ -namespace GL -{ - /** - * @class GLLineRenderer - * @brief A Renderer drawing particles as OpenGL lines - * - * The length of the lines is function of the Particle velocity and is defined in the universe space - * while the width is fixed and defines in the screen space (in pixels).
- *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- */ - class SPK_GL_PREFIX GLLineRenderer : public GLRenderer, public LineRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(GLLineRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of GLLineRenderer - * @param length : the length multiplier of this GLLineRenderer - * @param width : the width of this GLLineRenderer in pixels - */ - GLLineRenderer(float length = 1.0f,float width = 1.0f); - - /** - * @brief Creates and registers a new GLLineRenderer - * @param length : the length multiplier of this GLLineRenderer - * @param width : the width of this GLLineRenderer in pixels - * @return A new registered GLLineRenderer - * @since 1.04.00 - */ - static GLLineRenderer* create(float length = 1.0f,float width = 1.0f); - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - virtual void render(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - // vertex buffers and iterators - static float* gpuBuffer; - static float* gpuIterator; - - // buffers names - static const std::string GPU_BUFFER_NAME; - }; - - - inline GLLineRenderer* GLLineRenderer::create(float length,float width) - { - GLLineRenderer* obj = new GLLineRenderer(length,width); - registerObject(obj); - return obj; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.h deleted file mode 100644 index 4575b964b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.h +++ /dev/null @@ -1,284 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLLINETRAILRENDERER -#define H_SPK_GLLINETRAILRENDERER - -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Model.h" - - -namespace SPK -{ -namespace GL -{ - /** - * @class GLLineTrailRenderer - * @brief A Renderer drawing particles as line trails defined by the positions of particles over time - * - * The trail coordinates are computed in a procedural manner over time.
- * A trail i defined by a duration. The faster the particle, the longer the trail. It is defined by a numbers of samples.
- * The sampling frequency of the trail is therefore computed by nbSamples / duration and defines its resolution.
- * The higher the sampling frequency, the smoother the trail but the bigger the compution time and the memory consumption.
- *
- * All the particles of a Group are renderered in a single batch of GL_LINE_STRIP, - * which means every trails belong to the same object to reduce overhead on GPU side.
- * To allow that, invisible lines link trails together. They are defined as degenerated lines.
- * This imposes the alpha value is taken into account and the blending is therefore forced with GLLineTrailRenderer.
- * The user has the possibility to set the RGBA values of degenerated lines to keep them invisible function of the blending mode and environment.
- * By default it is set to (0.0f,0.0f,0.0f,0.0f). - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA
  • - *
- * @since 1.03.00 - */ - class SPK_GL_PREFIX GLLineTrailRenderer : public GLRenderer - { - SPK_IMPLEMENT_REGISTERABLE(GLLineTrailRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** @brief Default constructor of GLLineTrailRenderer */ - GLLineTrailRenderer(); - - /** - * @brief Creates and registers a new GLLineTrailRenderer - * @return A new registered GLLineTrailRenderer - * @since 1.04.00 - */ - static GLLineTrailRenderer* create(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the number of samples in a trail - * - * The number of samples defines the number of points used to construct the trail.
- * The bigger the number of samples, the smoother the trail but the bigger the compution time and the memory consumption. - * - * @param nbSamples : the number of samples to construct the trails - */ - void setNbSamples(size_t nbSamples); - - /** - * @brief Sets the width of a trail - * - * Like for GLLineRenderer, the width is defined in pixels and is not dependant of the distance of the trail from the camera - * - * @param width : the width of trails in pixels - */ - void setWidth(float width); - - /** - * @brief Sets the duration of a sample - * - * The duration of a sample is defined by its life time from its creation to its destruction.
- * Note that the alpha of a sample will decrease linearly from its initial alpha to 0. - * - * @param duration : the duration of a sample - */ - void setDuration(float duration); - - /** - * @brief Sets the color components of degenerated lines - * @param r : the red component - * @param g : the green component - * @param b : the blue component - * @param a : the alpha component - */ - void setDegeneratedLines(float r,float g,float b,float a); - - virtual void enableBlending(bool blendingEnabled); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the number of samples per trail - * @return the number of samples per trail - */ - size_t getNbSamples() const; - - /** - * @brief Gets the width of a trail - * @return the width of a trail (in pixels) - */ - float getWidth() const; - - /** - * @brief Gets the duration of a sample - * @return the duration of a sample - */ - float getDuration() const; - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - /** - * @brief Inits all the trails of the particle of the group - * - * All the samples are set to the current position of the particle.
- * The trail of each particle has therefore a length of 0 and is ready for update.
- * This function allows to clear the buffers for GLLineTrailRenderer of the given group. - * - * @param group : the Group whose buffers need to be initialized - */ - void init(const Group& group); - virtual void render(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - size_t nbSamples; - - float width; - float duration; - - float degeneratedR; - float degeneratedG; - float degeneratedB; - float degeneratedA; - - // vertex buffers and iterators - static float* vertexBuffer; - static float* vertexIterator; - static float* colorBuffer; - static float* colorIterator; - static float* valueBuffer; - static float* valueIterator; - - // buffers names - static const std::string VERTEX_BUFFER_NAME; - static const std::string COLOR_BUFFER_NAME; - static const std::string VALUE_BUFFER_NAME; - - void init(const Particle& particle,float age) const; - }; - - - inline GLLineTrailRenderer* GLLineTrailRenderer::create() - { - GLLineTrailRenderer* obj = new GLLineTrailRenderer; - registerObject(obj); - return obj; - } - - inline void GLLineTrailRenderer::enableBlending(bool blendingEnabled) - { - GLRenderer::enableBlending(true); - } - - inline void GLLineTrailRenderer::setNbSamples(size_t nbSamples) - { - this->nbSamples = nbSamples; - } - - inline void GLLineTrailRenderer::setWidth(float width) - { - this->width = width; - } - - inline void GLLineTrailRenderer::setDuration(float duration) - { - this->duration = duration; - } - - inline size_t GLLineTrailRenderer::getNbSamples() const - { - return nbSamples; - } - - inline float GLLineTrailRenderer::getWidth() const - { - return width; - } - - inline float GLLineTrailRenderer::getDuration() const - { - return duration; - } - - inline void GLLineTrailRenderer::init(const Particle& particle,float age) const - { - // Gets the particle's values - const Vector3D& pos = particle.position(); - float r = particle.getR(); - float g = particle.getG(); - float b = particle.getB(); - float a = particle.getParamCurrentValue(PARAM_ALPHA); - - // Inits position - for (size_t i = 0; i < nbSamples + 2; ++i) - { - *(vertexIterator++) = pos.x; - *(vertexIterator++) = pos.y; - *(vertexIterator++) = pos.z; - } - - // Inits color - // degenerate pre vertex - *(colorIterator++) = degeneratedR; - *(colorIterator++) = degeneratedG; - *(colorIterator++) = degeneratedB; - *(colorIterator++) = degeneratedA; - - for (size_t i = 0; i < nbSamples; ++i) - { - *(colorIterator++) = r; - *(colorIterator++) = g; - *(colorIterator++) = b; - *(colorIterator++) = a; - } - - // degenerate post vertex - *(colorIterator++) = degeneratedR; - *(colorIterator++) = degeneratedG; - *(colorIterator++) = degeneratedB; - *(colorIterator++) = degeneratedA; - - // Inits age - for (size_t i = 0; i < nbSamples; ++i) - *(valueIterator++) = age; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLPointRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLPointRenderer.h deleted file mode 100644 index 4e6706d0e..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLPointRenderer.h +++ /dev/null @@ -1,163 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLPOINTRENDERER -#define H_SPK_GLPOINTRENDERER - -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h" -#include "Extensions/Renderers/SPK_PointRendererInterface.h" - -namespace SPK -{ -namespace GL -{ - /** - * @class GLPointRenderer - * @brief A Renderer drawing drawing particles as openGL points - * - * OpenGL points can be configured to render them in 3 different ways : - *
    - *
  • SPK::POINT_SQUARE : standard openGL points
  • - *
  • SPK::POINT_CIRCLE : antialiased openGL points
  • - *
  • SPK::POINT_SPRITE : OpenGL point sprites (must be supported by the hardware)
  • - *
- * Moreover, points size can either be defined in screen space (in pixels) or in the universe space (must be supported by the hardware). - * The advantage of the universe space is that points size on the screen will be dependant to their distance to the camera, whereas in screen space - * all points will have the same size on the screen no matter their distance to the camera. - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- */ - class SPK_GL_PREFIX GLPointRenderer : public GLRenderer, - public PointRendererInterface, - public GLExtHandler - { - - SPK_IMPLEMENT_REGISTERABLE(GLPointRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of GLPointRenderer - * @param size : the size of the points - */ - GLPointRenderer(float size = 1.0f); - - /** - * @brief Creates and registers a new GLPointRenderer - * @param size : the size of the points - * @return A new registered GLPointRenderer - * @since 1.04.00 - */ - static GLPointRenderer* create(float size = 1.0f); - - ///////////// - // Setters // - ///////////// - - virtual bool setType(PointType type); - - /** - * @brief Sets the texture of this GLPointRenderer - * - * Note that the texture is only used if point sprites are used (type is set to SPK::POINT_SPRITE) - * - * @param textureIndex : the index of the openGL texture of this GLPointRenderer - */ - void setTexture(GLuint textureIndex); - - /** - * @brief Sets the way size of points is computed in this GLPointRenderer - * - * if universe size is used (true), the extension is checked.
- * if universe size is not supported by the hardware, false is returned and nothing happens.
- *
- * If world size is enabled, the static method setPixelPetUnit(float,int) must be called to set the conversion between pixels and world units. - * - * @param worldSizeEnabled : true to enable universe size, false to use screen size - * @return true the type of size can be set, false otherwise - */ - bool enableWorldSize(bool worldSizeEnabled); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texture of this GLPointRenderer - * @return the texture of this GLPointRenderer - */ - GLuint getTexture() const; - - /** - * @brief Tells whether world size is enabled or not in this GLPointRenderer - * @return true if world size is enabled, false if not - */ - bool isWorldSizeEnabled() const; - - /////////////// - // Interface // - /////////////// - - virtual void render(const Group& group); - - private : - - GLuint textureIndex; - bool worldSize; - }; - - - inline GLPointRenderer* GLPointRenderer::create(float size) - { - GLPointRenderer* obj = new GLPointRenderer(size); - registerObject(obj); - return obj; - } - - inline void GLPointRenderer::setTexture(GLuint textureIndex) - { - this->textureIndex = textureIndex; - } - - inline GLuint GLPointRenderer::getTexture() const - { - return textureIndex; - } - - inline bool GLPointRenderer::isWorldSizeEnabled() const - { - return worldSize; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.h deleted file mode 100644 index 3b0257cfd..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.h +++ /dev/null @@ -1,305 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLQUADRENDERER -#define H_SPK_GLQUADRENDERER - -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h" -#include "Extensions/Renderers/SPK_QuadRendererInterface.h" -#include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Model.h" - -namespace SPK -{ -namespace GL -{ - /** - * @class GLQuadRenderer - * @brief A Renderer drawing particles as OpenGL quads - * - * the orientation of the quads depends on the orientation parameters set. - * This orientation is computed during rendering by the CPU (further improvement of SPARK will allow to make the computation on GPU side).
- *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_SIZE
  • - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
  • SPK::PARAM_ANGLE
  • - *
  • SPK::PARAM_TEXTURE_INDEX (only if not in TEXTURE_NONE mode)
  • - *
- */ - class SPK_GL_PREFIX GLQuadRenderer : public GLRenderer, - public QuadRendererInterface, - public Oriented3DRendererInterface, - public GLExtHandler - { - SPK_IMPLEMENT_REGISTERABLE(GLQuadRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of GLQuadRenderer - * @param scaleX the scale of the width of the quad - * @param scaleY the scale of the height of the quad - */ - GLQuadRenderer(float scaleX = 1.0f,float scaleY = 1.0f); - - /** - * @brief Creates and registers a new GLQuadRenderer - * @param scaleX the scale of the width of the quad - * @param scaleY the scale of the height of the quad - * @return A new registered GLQuadRenderer - * @since 1.04.00 - */ - static GLQuadRenderer* create(float scaleX = 1.0f,float scaleY = 1.0f); - - ///////////// - // Setters // - ///////////// - - virtual bool setTexturingMode(TexturingMode mode); - - void setTexture(GLuint textureIndex); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texture of this GLQuadRenderer - * @return the texture of this GLQuadRenderer - */ - GLuint getTexture() const; - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - virtual void render(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - mutable float modelView[16]; - mutable float invModelView[16]; - - GLuint textureIndex; - - // vertex buffers and iterators - static float* gpuBuffer; - static float* gpuIterator; - static float* textureBuffer; - static float* textureIterator; - - // buffers names - static const std::string GPU_BUFFER_NAME; - static const std::string TEXTURE_BUFFER_NAME; - - float* createTextureBuffer(const Group& group) const; - - void invertModelView() const; - - void GLCallColorAndVertex(const Particle& particle) const; // OpenGL calls for color and position - void GLCallTexture2DAtlas(const Particle& particle) const; // OpenGL calls for 2D atlastexturing - void GLCallTexture3D(const Particle& particle) const; // OpenGL calls for 3D texturing - - static void (GLQuadRenderer::*renderParticle)(const Particle&) const; // pointer to the right render method - - void render2D(const Particle& particle) const; // Rendering for particles with texture 2D or no texture - void render2DRot(const Particle& particle) const; // Rendering for particles with texture 2D or no texture and rotation - void render3D(const Particle& particle) const; // Rendering for particles with texture 3D - void render3DRot(const Particle& particle) const; // Rendering for particles with texture 3D and rotation - void render2DAtlas(const Particle& particle) const; // Rendering for particles with texture 2D atlas - void render2DAtlasRot(const Particle& particle) const; // Rendering for particles with texture 2D atlas and rotation - }; - - - inline GLQuadRenderer* GLQuadRenderer::create(float scaleX,float scaleY) - { - GLQuadRenderer* obj = new GLQuadRenderer(scaleX,scaleY); - registerObject(obj); - return obj; - } - - inline void GLQuadRenderer::setTexture(GLuint textureIndex) - { - this->textureIndex = textureIndex; - } - - inline GLuint GLQuadRenderer::getTexture() const - { - return textureIndex; - } - - inline void GLQuadRenderer::GLCallColorAndVertex(const Particle& particle) const - { - float x = particle.position().x; - float y = particle.position().y; - float z = particle.position().z; - - // quads are drawn in a counter clockwise order : - // top right vertex - *(gpuIterator++) = x + quadSide().x + quadUp().x; - *(gpuIterator++) = y + quadSide().y + quadUp().y; - *(gpuIterator++) = z + quadSide().z + quadUp().z; - gpuIterator += 4; - - // top left vertex - *(gpuIterator++) = x - quadSide().x + quadUp().x; - *(gpuIterator++) = y - quadSide().y + quadUp().y; - *(gpuIterator++) = z - quadSide().z + quadUp().z; - gpuIterator += 4; - - // bottom left - *(gpuIterator++) = x - quadSide().x - quadUp().x; - *(gpuIterator++) = y - quadSide().y - quadUp().y; - *(gpuIterator++) = z - quadSide().z - quadUp().z; - gpuIterator += 4; - - // bottom right - *(gpuIterator++) = x + quadSide().x - quadUp().x; - *(gpuIterator++) = y + quadSide().y - quadUp().y; - *(gpuIterator++) = z + quadSide().z - quadUp().z; - - *(gpuIterator++) = particle.getR(); - *(gpuIterator++) = particle.getG(); - *(gpuIterator++) = particle.getB(); - *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - } - - inline void GLQuadRenderer::GLCallTexture2DAtlas(const Particle& particle) const - { - computeAtlasCoordinates(particle); - - *(textureIterator++) = textureAtlasU1(); - *(textureIterator++) = textureAtlasV0(); - - *(textureIterator++) = textureAtlasU0(); - *(textureIterator++) = textureAtlasV0(); - - *(textureIterator++) = textureAtlasU0(); - *(textureIterator++) = textureAtlasV1(); - - *(textureIterator++) = textureAtlasU1(); - *(textureIterator++) = textureAtlasV1(); - } - - inline void GLQuadRenderer::GLCallTexture3D(const Particle& particle) const - { - float textureIndex = particle.getParamCurrentValue(PARAM_TEXTURE_INDEX); - - *(textureIterator + 2) = textureIndex; - *(textureIterator + 5) = textureIndex; - *(textureIterator + 8) = textureIndex; - *(textureIterator + 11) = textureIndex; - textureIterator += 12; - } - - inline void GLQuadRenderer::invertModelView() const - { - float tmp[12]; - float src[16]; - - /* transpose matrix */ - for (int i = 0; i < 4; ++i) - { - src[i] = modelView[i << 2]; - src[i + 4] = modelView[(i << 2) + 1]; - src[i + 8] = modelView[(i << 2) + 2]; - src[i + 12] = modelView[(i << 2) + 3]; - } - - /* calculate pairs for first 8 elements (cofactors) */ - tmp[0] = src[10] * src[15]; - tmp[1] = src[11] * src[14]; - tmp[2] = src[9] * src[15]; - tmp[3] = src[11] * src[13]; - tmp[4] = src[9] * src[14]; - tmp[5] = src[10] * src[13]; - tmp[6] = src[8] * src[15]; - tmp[7] = src[11] * src[12]; - tmp[8] = src[8] * src[14]; - tmp[9] = src[10] * src[12]; - tmp[10] = src[8] * src[13]; - tmp[11] = src[9] * src[12]; - - /* calculate first 8 elements (cofactors) */ - invModelView[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7] - tmp[1] * src[5] - tmp[2] * src[6] - tmp[5] * src[7]; - invModelView[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7] - tmp[0] * src[4] - tmp[7] * src[6] - tmp[8] * src[7]; - invModelView[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7] - tmp[3] * src[4] - tmp[6] * src[5] - tmp[11] * src[7]; - invModelView[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6] - tmp[4] * src[4] - tmp[9] * src[5] - tmp[10] * src[6]; - invModelView[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3] - tmp[0] * src[1] - tmp[3] * src[2] - tmp[4] * src[3]; - invModelView[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3] - tmp[1] * src[0]- tmp[6] * src[2] - tmp[9] * src[3]; - invModelView[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3] - tmp[2] * src[0] - tmp[7] * src[1] - tmp[10] * src[3]; - invModelView[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2] - tmp[5]*src[0] - tmp[8]*src[1] - tmp[11]*src[2]; - - /* calculate pairs for second 8 elements (cofactors) */ - tmp[0] = src[2] * src[7]; - tmp[1] = src[3] * src[6]; - tmp[2] = src[1] * src[7]; - tmp[3] = src[3] * src[5]; - tmp[4] = src[1] * src[6]; - tmp[5] = src[2] * src[5]; - tmp[6] = src[0] * src[7]; - tmp[7] = src[3] * src[4]; - tmp[8] = src[0] * src[6]; - tmp[9] = src[2] * src[4]; - tmp[10] = src[0] * src[5]; - tmp[11] = src[1] * src[4]; - - /* calculate second 8 elements (cofactors) */ - invModelView[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15] - tmp[1] * src[13] - tmp[2] * src[14] - tmp[5] * src[15]; - invModelView[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15] - tmp[0] * src[12] - tmp[7] * src[14] - tmp[8] * src[15]; - invModelView[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15] - tmp[3] * src[12] - tmp[6] * src[13] - tmp[11] * src[15]; - invModelView[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14] - tmp[4] * src[12] - tmp[9] * src[13] - tmp[10] * src[14]; - invModelView[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9] - tmp[4] * src[11] - tmp[0] * src[9] - tmp[3] * src[10]; - invModelView[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10] - tmp[6] * src[10] - tmp[9] * src[11] - tmp[1] * src[8]; - invModelView[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8] - tmp[10] * src[11] - tmp[2] * src[8] - tmp[7] * src[9]; - invModelView[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9] - tmp[8] * src[9] - tmp[11] * src[10] - tmp[5] * src[8]; - - /* calculate determinant */ - float det = src[0] * invModelView[0] + src[1] * invModelView[1] + src[2] * invModelView[2] + src[3] * invModelView[3]; - - /* calculate matrix inverse */ - det = 1 / det; - for (int i = 0; i < 16; ++i) - invModelView[i] *= det; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLRenderer.h deleted file mode 100644 index dcbbd3eb1..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GLRenderer.h +++ /dev/null @@ -1,225 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GLRENDERER -#define H_SPK_GLRENDERER - -#include "RenderingAPIs/OpenGL/SPK_GL_DEF.h" -#include "Core/SPK_Renderer.h" - -namespace SPK -{ -namespace GL -{ - /** - * @class GLRenderer - * @brief An abstract Renderer for the openGL renderers - */ - class SPK_GL_PREFIX GLRenderer : public Renderer - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Constructor of GLRenderer */ - GLRenderer(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of GLRenderer */ - virtual ~GLRenderer(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Enables or disables the blending of this GLRenderer - * @param blendingEnabled true to enable the blending, false to disable it - */ - virtual void enableBlending(bool blendingEnabled); - - /** - * @brief Sets the blending functions of this GLRenderer - * - * the blending functions are one of the openGL blending functions. - * - * @param src : the source blending function of this GLRenderer - * @param dest : the destination blending function of this GLRenderer - */ - void setBlendingFunctions(GLuint src,GLuint dest); - virtual void setBlending(BlendingMode blendMode); - - /** - * @brief Sets the texture blending function of this GLRenderer - * - * the texture blending function is one of the openGL texture blending functions. - * - * @param textureBlending : the texture blending function of this GLRenderer - */ - void setTextureBlending(GLuint textureBlending); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Tells whether blending is enabled for this GLRenderer - * @return true if blending is enabled, false if it is disabled - */ - bool isBlendingEnabled() const; - - /** - * @brief Gets the source blending function of this GLRenderer - * @return the source blending function of this GLRenderer - */ - GLuint getSrcBlendingFunction() const; - - /** - * @brief Gets the destination blending function of this GLRenderer - * @return the source destination function of this GLRenderer - */ - GLuint getDestBlendingFunction() const; - - /** - * @brief Gets the texture blending function of this GLRenderer - * @return the texture blending function of this GLRenderer - */ - GLuint getTextureBlending() const; - - /////////////// - // Interface // - /////////////// - - /** - * @brief Saves the current openGL states - * - * This method saves all the states that are likely to be modified by a GLRenderer.
- * Use restoreGLStates() to restore the states.
- *
- * Note that for one saveGLStates call, a call to restoreGLStates must occur. - * In case of several saveGLStates with no restoreGLStates, the restoreGLStates is called priorly in an implicit way. - */ - static void saveGLStates(); - - /** - * @brief Restores the openGL states - * - * This method restores the openGL states at the values they were at the last call of saveGLStates(). - */ - static void restoreGLStates(); - - protected : - - /** @brief Inits the blending of this GLRenderer */ - void initBlending() const; - - /** - * @brief Inits the rendering hints of this GLRenderer - * @since 1.04.00 - */ - void initRenderingHints() const; - - private : - - bool blendingEnabled; - GLuint srcBlending; - GLuint destBlending; - - GLuint textureBlending; - }; - - - inline void GLRenderer::enableBlending(bool blendingEnabled) - { - this->blendingEnabled = blendingEnabled; - } - - inline void GLRenderer::setBlendingFunctions(GLuint src,GLuint dest) - { - srcBlending = src; - destBlending = dest; - } - - inline void GLRenderer::setTextureBlending(GLuint textureBlending) - { - this->textureBlending = textureBlending; - } - - inline bool GLRenderer::isBlendingEnabled() const - { - return blendingEnabled; - } - - inline GLuint GLRenderer::getSrcBlendingFunction() const - { - return srcBlending; - } - - inline GLuint GLRenderer::getDestBlendingFunction() const - { - return destBlending; - } - - inline GLuint GLRenderer::getTextureBlending() const - { - return textureBlending; - } - - inline void GLRenderer::initBlending() const - { - if (blendingEnabled) - { - glBlendFunc(srcBlending,destBlending); - glEnable(GL_BLEND); - } - else - glDisable(GL_BLEND); - } - - inline void GLRenderer::initRenderingHints() const - { - // alpha test - if (isRenderingHintEnabled(ALPHA_TEST)) - { - glAlphaFunc(GL_GEQUAL,getAlphaTestThreshold()); - glEnable(GL_ALPHA_TEST); - } - else - glDisable(GL_ALPHA_TEST); - - // depth test - if (isRenderingHintEnabled(DEPTH_TEST)) - glEnable(GL_DEPTH_TEST); - else - glDisable(GL_DEPTH_TEST); - - // depth write - glDepthMask(isRenderingHintEnabled(DEPTH_WRITE)); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GL_DEF.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GL_DEF.h deleted file mode 100644 index 59cfc49ef..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/OpenGL/SPK_GL_DEF.h +++ /dev/null @@ -1,75 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GL_DEF -#define H_SPK_GL_DEF - -#ifdef _MSC_VER -#pragma warning(disable : 4275) // disables the warning about exporting DLL classes children of non DLL classes -#endif - -// 1.02.02 Compatibility with older versions -#ifdef SPK_DLL -#define SPK_GL_IMPORT -#endif - -#ifdef SPK_GL_EXPORT -#define SPK_GL_PREFIX __declspec(dllexport) -#elif defined(SPK_IMPORT) || defined(SPK_GL_IMPORT) -#define SPK_GL_PREFIX __declspec(dllimport) -#else -#define SPK_GL_PREFIX -#endif - -#ifndef SPK_NO_GL_INC - -#if defined(WIN32) || defined(_WIN32) -#include -#endif - -#if defined(__APPLE__) -#include -#elif defined(macintosh) -#include -#else -#include -#endif - -#if defined(linux) || defined(__linux) -#define GLX_GLXEXT_PROTOTYPES -#include -#endif - -#endif - -// Defines the APIENTRY if not already done -#ifndef APIENTRY -#define APIENTRY -#endif - -/** -* @namespace SPK::GL -* @brief the namespace for openGL dependent SPARK code -* @since 1.01.00 -*/ - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.h deleted file mode 100644 index 9b273b644..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.h +++ /dev/null @@ -1,180 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLDRAWABLERENDERER -#define H_SPK_SFMLDRAWABLERENDERER - -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @class SFMLDrawableRenderer - * @brief A Renderer drawing particles as SFML Drawables for the SFML 2D rendering engine - * - * This SFMLRenderer allows to render particles with any of the SFML Drawables available in the library :
    - *
  • sf::Sprite
  • - *
  • sf::Shape
  • - *
  • sf::PostFX
  • - *
  • sf::String
  • - *
  • SPK::SFML::SFMLSystem
  • - *
  • Any other SFML Drawable implemented by users or to come in future release
  • - *
- *
- * Note that when possible other SFML renderers should be prefered as they are more optimized.
- * For instance, SFMLQuadRenderer should be preferred to SFMLDrawableRenderer with Sprites.
- *
- * The base Drawable should have its center centered on the Drawable (it is the top left corner by default) - * with a call to sf::Drawable::SetCenter() to have scale, translation and rotation well defined.
- * However the center can be set wherever on the Drawable to get desirable effects.
- *
- * Note that the parameters of the base Drawable are modified during rendering.
- * In that way, the initial position, scale, color, angle and blending mode of the Drawable - * is not used but overriden by particle parameters.
- *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_SIZE
  • - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blend mode is not sf::Blend::NONE)
  • - *
  • SPK::PARAM_ANGLE
  • - *
- * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLDrawableRenderer : public SFMLRenderer - { - SPK_IMPLEMENT_REGISTERABLE(SFMLDrawableRenderer) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of SFMLDrawableRenderer - * @param drawable : the base Drawable of this SFMLDrawableRenderer - * @param scaleX : the scale in X axis of this SFMLDrawableRenderer - * @param scaleY : the scale in X axis of this SFMLDrawableRenderer - */ - SFMLDrawableRenderer(sf::Drawable* drawable = NULL,float scaleX = 1.0f,float scaleY = 1.0f); - - /** - * @brief Creates and registers a new SFMLDrawableRenderer - * @param drawable : the base Drawable of this SFMLDrawableRenderer - * @param scaleX : the scale in X axis of this SFMLDrawableRenderer - * @param scaleY : the scale in X axis of this SFMLDrawableRenderer - * @return A new registered SFMLDrawableRenderer - * @since 1.04.00 - */ - static SFMLDrawableRenderer* create(sf::Drawable* drawable = NULL,float scaleX = 1.0f,float scaleY = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the base Drawable of this SFMLDrawableRenderer - * @param drawable : the base Drawable of this SFMLDrawableRenderer - */ - void setDrawable(sf::Drawable* drawable); - - /** - * @brief Sets the scale of this SFMLDrawableRenderer - * @param scaleX : the scale in X axis of this SFMLDrawableRenderer - * @param scaleY : the scale in X axis of this SFMLDrawableRenderer - */ - void setScale(float scaleX,float scaleY); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the base Drawable of this SFMLDrawableRenderer - * @return the base Drawable of this SFMLDrawableRenderer or NULL if no Drawable is set - */ - sf::Drawable* getDrawable() const; - - /** - * @brief Gets the scale in X axis of this SFMLDrawableRenderer - * @return the scale in X axis of this SFMLDrawableRenderer - */ - float getScaleX() const; - - /** - * @brief Gets the scale in Y axis of this SFMLDrawableRenderer - * @return the scale in Y axis of this SFMLDrawableRenderer - */ - float getScaleY() const; - - private : - - static const float RAD2DEG; // ratio to convert radians to degrees - - sf::Drawable* drawable; - float scaleX; - float scaleY; - - void innerRender(const Group& group); - }; - - - inline SFMLDrawableRenderer* SFMLDrawableRenderer::create(sf::Drawable* drawable,float scaleX,float scaleY) - { - SFMLDrawableRenderer* obj = new SFMLDrawableRenderer(drawable,scaleX,scaleY); - registerObject(obj); - return obj; - } - - inline void SFMLDrawableRenderer::setDrawable(sf::Drawable* drawable) - { - this->drawable = drawable; - } - - inline void SFMLDrawableRenderer::setScale(float scaleX,float scaleY) - { - this->scaleX = scaleX; - this->scaleY = scaleY; - } - - inline sf::Drawable* SFMLDrawableRenderer::getDrawable() const - { - return drawable; - } - - inline float SFMLDrawableRenderer::getScaleX() const - { - return scaleX; - } - - inline float SFMLDrawableRenderer::getScaleY() const - { - return scaleY; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLLineRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLLineRenderer.h deleted file mode 100644 index 4a430964a..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLLineRenderer.h +++ /dev/null @@ -1,144 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLLINERENDERER -#define H_SPK_SFMLLINERENDERER - -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" -#include "Extensions/Renderers/SPK_LineRendererInterface.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @class SFMLLineRenderer - * @brief A Renderer drawing particles as lines for the SFML 2D rendering engine - * - * the length of the lines is function of the Particle velocity and is defined in the universe space - * while the width is fixed and defines in the screen space (in pixels).
- * The width can be zoomed with the View using resizeMode (either SPK_SFML::RESIZE_ZOOM_X or SPK_SFML::RESIZE_ZOOM_Y). - * However the maximum width for a line is constraints by the hardware. - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- * - * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLLineRenderer : public SFMLRenderer,public LineRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(SFMLLineRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of SFMLLineRenderer - * @param length : the length multiplier of this SFMLLineRenderer - * @param width : the width of this SFMLLineRenderer in pixels - * @param mode : the resize mode of this SFMLLineRenderer - */ - SFMLLineRenderer(float length = 1.0f,float width = 1.0f,ResizeMode mode = RESIZE_NONE); - - /** - * @brief Creates and registers a new SFMLLineRenderer - * @param length : the length multiplier of this SFMLLineRenderer - * @param width : the width of this SFMLLineRenderer in pixels - * @param mode : the resize mode of this SFMLLineRenderer - * @return A new registered SFMLLineRenderer - * @since 1.04.00 - */ - static SFMLLineRenderer* create(float length = 1.0f,float width = 1.0f,ResizeMode mode = RESIZE_NONE); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the resize mode of this SFMLLineRenderer - * @param mode : the resize mode of this SFMLLineRenderer - */ - void setResizeMode(ResizeMode mode); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the resize mode of this SFMLLineRenderer - * @return the resize mode of this SFMLLineRenderer - */ - ResizeMode getResizeMode() const; - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - ResizeMode resizeMode; - - // vertex buffers and iterators - static float* gpuBuffer; - static float* gpuIterator; - - // buffers names - static const std::string GPU_BUFFER_NAME; - - virtual void innerRender(const Group& group); - }; - - - inline SFMLLineRenderer* SFMLLineRenderer::create(float length,float width,ResizeMode mode) - { - SFMLLineRenderer* obj = new SFMLLineRenderer(length,width,mode = RESIZE_NONE); - registerObject(obj); - return obj; - } - - inline void SFMLLineRenderer::setResizeMode(ResizeMode mode) - { - resizeMode = mode; - } - - inline ResizeMode SFMLLineRenderer::getResizeMode() const - { - return resizeMode; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLPointRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLPointRenderer.h deleted file mode 100644 index 9329233b1..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLPointRenderer.h +++ /dev/null @@ -1,182 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLPOINTRENDERER -#define H_SPK_SFMLPOINTRENDERER - -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h" -#include "Extensions/Renderers/SPK_PointRendererInterface.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @class SFMLPointRenderer - * @brief A Renderer drawing particles as points for the SFML 2D rendering engine - * - * points can be configured to render them in 3 different ways : - *
    - *
  • SPK::POINT_SQUARE : colored square
  • - *
  • SPK::POINT_CIRCLE : colored circle
  • - *
  • SPK::POINT_SPRITE : image attached at the point position
  • - *
- * Points size can be updated in function of the zoom of the SFML view using ResizeMode - * (either SPK_SFML::RESIZE_ZOOM_X or SPK_SFML::RESIZE_ZOOM_Y)
- * The zoom is constraints by the minimum and maximum dimensions of the point size (being generally 1.0f and 64.0f).
- * However on hardware that supports the openGL extension point parameter counteracts these limitations. The extension is - * automatically loaded if possible.
- * User can check whether the extension is available by calling SPK::GL::GLExtHandler::loadGLExtPointParameter() - * - *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blending is enabled)
  • - *
- * - * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLPointRenderer : public SFMLRenderer, - public PointRendererInterface, - public GL::GLExtHandler - { - SPK_IMPLEMENT_REGISTERABLE(SFMLPointRenderer) - - public : - - ////////////////// - // Constructors // - ////////////////// - - /** - * @brief Constructor of SFMLPointRenderer - * @param size : the size of this SFMLPointRenderer - * @param mode : the resize mode of this SFMLPointRenderer - */ - SFMLPointRenderer(float size = 1.0f,ResizeMode mode = RESIZE_NONE); - - /** - * @brief Creates and registers a new SFMLPointRenderer - * @param size : the size of this SFMLPointRenderer - * @param mode : the resize mode of this SFMLPointRenderer - * @return A new registered SFMLPointRenderer - * @since 1.04.00 - */ - static SFMLPointRenderer* create(float size = 1.0f,ResizeMode mode = RESIZE_NONE); - - ///////////// - // Setters // - ///////////// - - bool setType(PointType type); - - /** - * @brief Sets the image of this SFMLPointRenderer - * - * Note that the image is only used if point sprites are used (type is set to SPK::POINT_SPRITE) - * - * @param image : the index of the SFML Image of this SFMLPointRenderer - */ - void setImage(sf::Image* image); - - /** - * @brief Sets the resize mode of this SFMLPointRenderer - * @param mode : the resize mode of this SFMLPointRenderer - */ - void setResizeMode(ResizeMode mode); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the texture of this SFMLPointRenderer - * @return the texture of this SFMLPointRenderer - */ - sf::Image* getImage() const; - - /** - * @brief Gets the resize mode of this SFMLPointRenderer - * @return the resize mode of this SFMLPointRenderer - */ - ResizeMode getResizeMode() const; - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - sf::Image* image; - ResizeMode resizeMode; - - // vertex buffers and iterators - static float* gpuBuffer; - static float* gpuIterator; - - // buffers names - static const std::string GPU_BUFFER_NAME; - - void innerRender(const Group& group); - }; - - - inline SFMLPointRenderer* SFMLPointRenderer::create(float size,ResizeMode mode) - { - SFMLPointRenderer* obj = new SFMLPointRenderer(size,mode); - registerObject(obj); - return obj; - } - - inline void SFMLPointRenderer::setImage(sf::Image* image) - { - this->image = image; - } - - inline void SFMLPointRenderer::setResizeMode(ResizeMode mode) - { - resizeMode = mode; - } - - inline sf::Image* SFMLPointRenderer::getImage() const - { - return image; - } - - inline ResizeMode SFMLPointRenderer::getResizeMode() const - { - return resizeMode; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.h deleted file mode 100644 index 54a04601b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.h +++ /dev/null @@ -1,227 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLQUADRENDERER -#define H_SPK_SFMLQUADRENDERER - -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" -#include "Extensions/Renderers/SPK_QuadRendererInterface.h" -#include "Extensions/Renderers/SPK_Oriented2DRendererInterface.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @class SFMLQuadRenderer - * @brief A Renderer drawing particles as Quads for the SFML 2D rendering engine - * - * A Quad can either be rendererd with a sf::Image or not.
- * If an Image is set, note that its size has no influence on the rendering (unlike sf::Sprite) :
    - *
  • the width of the quad is defined by scaleX * particle size
  • - *
  • the height of the quad is defined by scaleY * particle size
  • - *
- * Note that to gain performance it is better to use SFMLPointRenderer with GL::POINT_SPRITE as point type - * if possible (meaning the extension exists on the hardware, size of particles is identical and no rotation occurs).
- *
- * Below are the parameters of Particle that are used in this Renderer (others have no effects) : - *
    - *
  • SPK::PARAM_SIZE
  • - *
  • SPK::PARAM_RED
  • - *
  • SPK::PARAM_GREEN
  • - *
  • SPK::PARAM_BLUE
  • - *
  • SPK::PARAM_ALPHA (only if blend mode is not sf::Blend::NONE)
  • - *
  • SPK::PARAM_ANGLE
  • - *
  • SPK::PARAM_TEXTURE_INDEX
  • - *
- * - * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLQuadRenderer : public SFMLRenderer, - public QuadRendererInterface, - public Oriented2DRendererInterface - { - SPK_IMPLEMENT_REGISTERABLE(SFMLQuadRenderer) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of SFMLQuadRenderer - * @param image : the Image of this SFMLQuadRenderer - * @param scaleX : the scale on X axis of this SFMLQuadRenderer - * @param scaleY : the scale on Y axis of this SFMLQuadRenderer - */ - SFMLQuadRenderer(sf::Image* image = NULL,float scaleX = 1.0f,float scaleY = 1.0f); - - /** - * @brief Creates and registers a new SFMLQuadRenderer - * @param image : the Image of this SFMLQuadRenderer - * @param scaleX : the scale on X axis of this SFMLQuadRenderer - * @param scaleY : the scale on Y axis of this SFMLQuadRenderer - * @return A new registered SFMLQuadRenderer - * @since 1.04.00 - */ - static SFMLQuadRenderer* create(sf::Image* image = NULL,float scaleX = 1.0f,float scaleY = 1.0f); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the image of this SFMLQuadRenderer - * @param image : the image of this SFMLQuadRenderer or NULL not to set an image - */ - void setImage(sf::Image* image); - - virtual bool setTexturingMode(TexturingMode mode); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the image of this SFMLQuadRenderer - * @return the image of this SFMLQuadRenderer or NULL if no image is set - */ - sf::Image* getImage() const; - - /////////////// - // Interface // - /////////////// - - virtual void createBuffers(const Group& group); - virtual void destroyBuffers(const Group& group); - - protected : - - virtual bool checkBuffers(const Group& group); - - private : - - sf::Image* image; - - // vertex buffers and iterators - static float* gpuBuffer; - static float* gpuIterator; - static float* textureBuffer; - static float* textureIterator; - - // buffers names - static const std::string GPU_BUFFER_NAME; - static const std::string TEXTURE_BUFFER_NAME; - - float* createTextureBuffer(const Group& group) const; - - void innerRender(const Group& group); - - void GLCallColorAndVertex(const Particle& particle) const; // OpenGL calls for color and position - void GLCallTexture2DAtlas(const Particle& particle) const; // OpenGL calls for 2D atlastexturing - - static void (SFMLQuadRenderer::*renderParticle)(const Particle&) const; // pointer to the right render method - - void renderVA(const Particle& particle) const; // Rendering for particles in vertex array mode - void renderRotVA(const Particle& particle) const; // Rendering for particles with rotation in vertex array mode - void renderAtlasVA(const Particle& particle) const; // Rendering for particles with atlas texture in vertex array mode - void renderAtlasRotVA(const Particle& particle) const; // Rendering for particles with atlas texture and rotation in vertex array mode - }; - - - inline SFMLQuadRenderer* SFMLQuadRenderer::create(sf::Image* image,float scaleX,float scaleY) - { - SFMLQuadRenderer* obj = new SFMLQuadRenderer(image,scaleX,scaleY); - registerObject(obj); - return obj; - } - - inline void SFMLQuadRenderer::setImage(sf::Image* image) - { - this->image = image; - texturingMode = (image == NULL ? TEXTURE_NONE : TEXTURE_2D); - } - - inline bool SFMLQuadRenderer::setTexturingMode(TexturingMode mode) - { - if (mode == TEXTURE_3D) - return false; - - texturingMode = mode; - return true; - } - - inline sf::Image* SFMLQuadRenderer::getImage() const - { - return image; - } - - inline void SFMLQuadRenderer::GLCallColorAndVertex(const Particle& particle) const - { - float x = particle.position().x; - float y = particle.position().y; - float deltaY = -particle.position().z * getZFactor(); - - *(gpuIterator++) = x + quadSide().x + quadUp().x; - *(gpuIterator++) = y + quadSide().y + quadUp().y + deltaY; - - gpuIterator += 4; - - *(gpuIterator++) = x - quadSide().x + quadUp().x; - *(gpuIterator++) = y - quadSide().y + quadUp().y + deltaY; - - gpuIterator += 4; - - *(gpuIterator++) = x - quadSide().x - quadUp().x; - *(gpuIterator++) = y - quadSide().y - quadUp().y + deltaY; - - gpuIterator += 4; - - *(gpuIterator++) = x + quadSide().x - quadUp().x; - *(gpuIterator++) = y + quadSide().y - quadUp().y + deltaY; - - *(gpuIterator++) = particle.getR(); - *(gpuIterator++) = particle.getG(); - *(gpuIterator++) = particle.getB(); - *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - } - - inline void SFMLQuadRenderer::GLCallTexture2DAtlas(const Particle& particle) const - { - computeAtlasCoordinates(particle); - - *(textureIterator++) = textureAtlasU1(); - *(textureIterator++) = textureAtlasV0(); - - *(textureIterator++) = textureAtlasU0(); - *(textureIterator++) = textureAtlasV0(); - - *(textureIterator++) = textureAtlasU0(); - *(textureIterator++) = textureAtlasV1(); - - *(textureIterator++) = textureAtlasU1(); - *(textureIterator++) = textureAtlasV1(); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLRenderer.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLRenderer.h deleted file mode 100644 index f7747418b..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLRenderer.h +++ /dev/null @@ -1,281 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLRENDERER -#define H_SPK_SFMLRENDERER - -#include "RenderingAPIs/SFML/SPK_SFML_DEF.h" -#include "Core/SPK_Renderer.h" -#include "RenderingAPIs/SFML/SPK_SFMLSystem.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @enum ResizeMode - * @brief Constants defining the way primitives must be resized when zooming - * @since 1.01.00 - */ - enum ResizeMode - { - RESIZE_NONE, /**< Constant defining no resize */ - RESIZE_ZOOM_X, /**< Constant defining a resize function of the X axis */ - RESIZE_ZOOM_Y, /**< Constant defining a resize function of the Y axis */ - }; - - /** - * @class SFMLRenderer - * @brief An abstract Renderer for the SFML renderers - * - * All children of this renderer are meant to be used with the 2D engine of the SFML library.
- *
- * As the rendering occurs in 2D the X and Y axis are the screen axis and the Z coordinate is subtracted to the - * Y coordinate to have classical 2D height effect.
- * The factor of Z to subtract to the Y can be adjusted with a call to the static method setZFactor(float). - * If the factor is 0, the Z coordinate is ignored. - *
- * Moreover, particles with a negative Z are not rendered as they are considered to be under the other 2D elements. - *
- * In the SFML library, a RenderTarget must be used for rendering. This RenderTarget can be set with a call to - * bindRenderTarget(const sf::RenderTarget&) and released with a call to releaseRenderTarget().
- * A call to render(const Group&) of a SFMLRenderer will not render anything if a RenderTarget is not set.
- * However using SFMLSystem to render particles with SFML will bind the target internally, freeing the user from - * setting it manually. - * - * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLRenderer : public Renderer - { - public : - - ///////////////// - // Constructor // - ///////////////// - - /** @brief Default constructor of SFMLRenderer */ - SFMLRenderer(); - - //////////////// - // Destructor // - //////////////// - - /** @brief Destructor of SFMLRenderer */ - virtual ~SFMLRenderer(); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the blend mode of this SFMLRenderer - * @param mode : the blend mode of this SFMLRenderer in SFML style - */ - void setBlendMode(sf::Blend::Mode mode); - virtual void setBlending(BlendingMode blendMode); - - /** - * @brief Sets whether the ground culling is enabled or not - * - * If it is enabled, all particles with and altitude (z coordinate) lower than zero will not be rendered.
- * This allows to simulate the activation of the zbuffer with the ground. - * - * @param cull : true to enable the ground culling, false to disable it - * @since 1.03.00 - */ - void setGroundCulling(bool cull); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the blend mode of this SFMLRenderer - * @return the blend mode of this SFMLRenderer in SFML style - */ - sf::Blend::Mode getBlendMode() const; - - /** - * @brief Tells whether the ground culling is enabled or not - * - * For more information about ground culling see setGroundCulling(bool). - * - * @return true if the ground culling is enabled, false if it is disabled - * @since 1.03.00 - */ - bool hasGroundCulling() const; - - /////////////// - // Interface // - /////////////// - - void render(const Group& group); - - //////////////////// - // static methods // - //////////////////// - - /** - * @brief Sets the Z factor - * - * The Z factor is the constant that will multiply the Z coordinate of a Particle position - * before being subtracted to the Y coordinate. - *
- * Note that the Z factor is static and in that way identical for all SFMLRenderers. - * - * @param zFactor : the Z factor - */ - static void setZFactor(float zFactor); - - /** - * @brief Gets the Z factor - * - * see setZFactor(float) for more details about Z factor - * - * @return the Z factor - */ - static float getZFactor(); - - /** - * @brief Binds a RenderTarget for rendering - * - * A RenderTarget is compulsory to render with SFML.
- * Rendering with SFMLSystem calls this method internally. - * - * @param target : the SFML RenderTarget to bind - */ - static void bindCurrentTarget(sf::RenderTarget& target); - - /** - * @brief Releases the current RenderTarget - * - * This method only sets the inner pointer to NULL. - */ - static void releaseCurrentTarget(); - - /** - * @brief Binds an SFMLSystem for rendering - * - * This method is used internally to tell the engine which SFMLSystem is currently being rendered.
- * - * @param system : The SFMLSystem that is currently being rendered - * @since 1.03.01 - * @deprecated 1.05.05 Does nothing - */ - static void bindCurrentSystem(const SFMLSystem& system) {} - - /** - * @brief Releases the current SFMLSystem - * - * This method sets internally the SFMLSystem being rendered to NULL - * - * @since 1.03.01 - * @deprecated 1.05.05 Does nothing - */ - static void releaseCurrentSystem() {} - - protected : - - /** - * @brief Gets the current RenderTarget - * @return the current RenderTarget or NULL if no RenderTarget is attached. - */ - static sf::RenderTarget* getCurrentTarget(); - - /** - * @brief Gets the scale factor function of the current zoom and resize mode - * @param mode : the resize mode used to compute the factor - */ - static float getViewZoom(ResizeMode mode); - - - private : - - static float zFactor; - - static sf::RenderTarget* currentTarget; - - sf::Blend::Mode blendMode; - - bool groundCulling; - - void initBlending() const; - - /** - * @brief Calls the rendering of a child of SFMLRenderer - * - * This method has to be implemented in derived class of SFMLRenderer instead of render(Group&) - * - * @param group : the group to render - * @since 1.03.01 - */ - virtual void innerRender(const Group& group) = 0; - }; - - - inline void SFMLRenderer::setBlendMode(sf::Blend::Mode mode) - { - blendMode = mode; - } - - inline void SFMLRenderer::setGroundCulling(bool cull) - { - groundCulling = cull; - } - - inline sf::Blend::Mode SFMLRenderer::getBlendMode() const - { - return blendMode; - } - - inline bool SFMLRenderer::hasGroundCulling() const - { - return groundCulling; - } - - inline void SFMLRenderer::initBlending() const - { - if (blendMode == sf::Blend::None) - glDisable(GL_BLEND); - else - { - glEnable(GL_BLEND); - - switch (blendMode) - { - case sf::Blend::Alpha : - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - break; - - case sf::Blend::Add : - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - break; - - case sf::Blend::Multiply : - glBlendFunc(GL_DST_COLOR,GL_ZERO); - break; - } - } - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLSystem.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLSystem.h deleted file mode 100644 index 9ece2fe76..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFMLSystem.h +++ /dev/null @@ -1,163 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFMLSYSTEM -#define H_SPK_SFMLSYSTEM - -#include "RenderingAPIs/SFML/SPK_SFML_DEF.h" -#include "Core/SPK_System.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @class SFMLSystem - * @brief A System to use particle systems as SFML Drawable object - * - * An SFMLSystem is the link between SPARK and SFML library. - * An SFMLSystem extends the sf::Drawable class and therefore inherits its public interface. - * This allows to handle SPARK particle systems the same way as any SFML Drawable :
    - *
  • Translation
  • - *
  • Rotation
  • - *
  • Scale
  • - *
  • Center
  • - *
  • ...
  • - *
- * However the color and blend mode of the System is ignored and overidden by the color of Particles - * and the blending mode of Renderers.
- *
- * An SFMLSystem typically holds SFMLRenderer but any other Renderer can be used to get desired rendering. - *
- * An SFMLSystem can be renderered in 2 ways :
    - *
  • SFML style using RenderTarget.Draw(const Drawable&)
  • - *
  • SPARK style using SFMLSystem.render()
  • - *
- * In the second case, the System must hold a pointer to a RenderTarget. If not, it cannot be renderered.
- * In the first case, the inner pointer to a RenderTarget of the SFMLSystem is ignored as the RenderTarget is - * explicitely defined. - * - * @since 1.01.00 - */ - class SPK_SFML_PREFIX SFMLSystem : public System,public sf::Drawable - { - SPK_IMPLEMENT_REGISTERABLE(SFMLSystem) - - public : - - ///////////////// - // Constructor // - ///////////////// - - /** - * @brief Constructor of SFMLSystem - * @param worldTransformed : true to emit particles in world, false to emit them localy - * @param renderTarget : the render target - */ - SFMLSystem(bool worldTransformed = true,sf::RenderTarget* renderTarget = NULL); - - /** - * @brief Creates and registers a new SFMLSystem - * @param worldTransformed : true to emit particles in world, false to emit them localy - * @param renderTarget : the render target - * @return A new registered SFMLSystem - * @since 1.04.00 - */ - static SFMLSystem* create(bool worldTransformed = true,sf::RenderTarget* renderTarget = NULL); - - ///////////// - // Setters // - ///////////// - - /** - * @brief Sets the RenderTarget of this SFMLSystem - * - * A RenderTarget is needed when rendering the SFMLSystem in SPARK style using render() - * - * @param target : the RenderTarget of this SFMLSystem - */ - void setRenderTarget(sf::RenderTarget* target); - - ///////////// - // Getters // - ///////////// - - /** - * @brief Gets the RenderTarget of this SFMLSystem - * @return the RenderTarget of this SFMLSystem or NULL if no RenderTarget is set - */ - sf::RenderTarget* getRenderTarget() const; - - /** - * @brief Tells whether this system is world transformed or not - * - * If a system is transformed in the world, only its emitter and zones will be transformed.
- * The emitted particles will remain independent from the system transformation.
- *
- * If it is transformed locally, the emitted particles will be transformed as well. - * - * @return true if this system is world transformed, false if not - * @since 1.03.01 - */ - bool isWorldTransformed() const; - - /////////////// - // Interface // - /////////////// - - virtual bool update(float deltaTime); - virtual void render() const; - - private : - - sf::RenderTarget* target; - const bool worldTransformed; - - // Called internally by SFML when rendering - void Render(sf::RenderTarget& target) const; - }; - - - inline SFMLSystem* SFMLSystem::create(bool worldTransformed,sf::RenderTarget* renderTarget) - { - SFMLSystem* obj = new SFMLSystem(worldTransformed,renderTarget); - registerObject(obj); - return obj; - } - - inline void SFMLSystem::setRenderTarget(sf::RenderTarget* target) - { - this->target = target; - } - - inline sf::RenderTarget* SFMLSystem::getRenderTarget() const - { - return target; - } - - inline bool SFMLSystem::isWorldTransformed() const - { - return worldTransformed; - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_DEF.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_DEF.h deleted file mode 100644 index d3035632a..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_DEF.h +++ /dev/null @@ -1,60 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFML_DEF -#define H_SPK_SFML_DEF - -#ifdef _MSC_VER -#pragma warning(disable : 4275) // disables the warning about exporting DLL classes children of non DLL classes -#endif - -// 1.02.02 Compatibility with older versions -#ifdef SPK_DLL -#define SPK_SFML_IMPORT -#endif - -#ifdef SPK_SFML_EXPORT -#define SPK_SFML_PREFIX __declspec(dllexport) -#elif defined(SPK_IMPORT) || defined(SPK_SFML_IMPORT) -#define SPK_SFML_PREFIX __declspec(dllimport) -#else -#define SPK_SFML_PREFIX -#endif - -#include "RenderingAPIs/OpenGL/SPK_GL_DEF.h" - -#ifndef SPK_NO_SFML_INC -// None is already defined in Xlib.h => We need to undef it ! -#ifdef None -#undef None -#endif -#include -#include -#endif - -/** -* @namespace SPK::SFML -* @brief the namespace for SFML dependent SPARK code -* @since 1.01.00 -*/ - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_GLOBAL.h b/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_GLOBAL.h deleted file mode 100644 index 93caf7f9d..000000000 --- a/Extensions/ParticleSystem/SPARK/include/RenderingAPIs/SFML/SPK_SFML_GLOBAL.h +++ /dev/null @@ -1,158 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFML_GLOBAL -#define H_SPK_SFML_GLOBAL - -#include "RenderingAPIs/SFML/SPK_SFML_DEF.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_System.h" -#include "Core/SPK_Transformable.h" -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" - -namespace SPK -{ -namespace SFML -{ - /** - * @enum CameraAnchor - * @brief Constatns to position the camera in SFML 2D engine - * @since 1.01.01 - */ - enum CameraAnchor - { - CAMERA_CENTER = 0, /**< Constant defining the center */ - CAMERA_LEFT = -1, /**< Constant defining the left */ - CAMERA_RIGHT = 1, /**< Constant defining the right */ - CAMERA_TOP = -1, /**< Constant defining the top */ - CAMERA_BOTTOM = 1, /**< Constant defining the bottom */ - }; - - /** - * @brief Converts an SFML Vector2 into a SPARK Vector3D - * - * It performs this convertion :
- * Vector3D(v.x,v.y,0.0f) - * - * @param v : the SFML Vector2 to convert - * @return the converted Vector3D - * @since 1.01.01 - */ - inline Vector3D vectorSPK(sf::Vector2f& v) - { - return Vector3D(v.x,v.y); - } - - /** - * @brief Converts an SFML Vector3 into a SPARK Vector3D - * - * It performs this convertion :
- * Vector3D(v.x,v.y,v.z) - * - * @param v : the SFML Vector3 to convert - * @return the converted Vector3D - * @since 1.01.01 - */ - inline Vector3D vectorSPK(sf::Vector3f& v) - { - return Vector3D(v.x,v.y,v.z); - } - - /** - * @brief Converts an SPARK Vector3D into a SFML Vector2 - * - * It performs this convertion :
    - *
  • If addZ is false :
    - * sf::Vector2f(v.x,v.y)
  • - *
  • If addZ is true :
    - * sf::Vector2f(v.x,v.y - zFactor * v.z)
  • - *
- * - * @param v : the SPARK Vector3D to convert - * @param addZ : if true the z coodinate of the SPARK Vector is added th its y coordinate for the convertion - * @return the converted sf::Vector2f - * @since 1.01.01 - */ - inline sf::Vector2f vector2SFML(Vector3D& v,bool addZ = false) - { - return sf::Vector2f(v.x,v.y - (addZ ? SFMLRenderer::getZFactor() * v.z : 0.0f)); - } - - /** - * @brief Converts an SPARK Vector3D into a SFML Vector3 - * - * It performs this convertion :
- * sf::Vector3f(v.x,v.y,v.z) - * - * @param v : the SPARK Vector3D to convert - * @return the converted sf::Vector3f - * @since 1.01.01 - */ - inline sf::Vector3f vector3SFML(Vector3D& v) - { - return sf::Vector3f(v.x,v.y,v.z); - } - - /** - * @brief Sets the camera position for a use in the SFML 2D engine - * - * This is an helper function to set up the camera position - * for either particle sorting or particle distance computation.
- *
- * The user has to define where to place the camera with the anchor. - * This will influence the way particle are sorted. - * By default the anchor are CAMERA_RIGHT and CAMERA_BOTTOM - *
- * The altitude and offset parameters can be used by default. - * However the user has the possibility to manually set them.
- * Basically any sorted System must be contained in the cube defined by (2 * offset,2 * offset,altitude)
- *
- * System::setCameraPosition(const Vector3D&) can be used for more control.
- * This function basically calls System::setCameraPosition(Vector3D(anchorX * offset,anchorY * offset,altitude)). - * - * @param anchorX : the anchor on the X axis - * @param anchorY : the anchot on the Y axis - * @param altitude : the altitude of the camera - * @param offset : the offset the camera is positioned if not centered - * @since 1.01.01 - */ - inline void setCameraPosition(CameraAnchor anchorX = CAMERA_RIGHT, - CameraAnchor anchorY = CAMERA_BOTTOM, - float altitude = 10000.0f, - float offset = 1000.0f) - { - System::setCameraPosition(Vector3D(anchorX * offset,anchorY * offset,altitude)); - } - - /** - * @brief A helper function to set a SFML matrix to a transformable - * @param transformable : the transformable which transform should be set - * @param matrix : the SFML matrix to set to the transformable - / @since 1.03.01 - */ - inline void setMatrix(Transformable& transformable,const sf::Matrix3& matrix) - { - transformable.setTransform(matrix.Get4x4Elements()); - } -}} - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/SPK.h b/Extensions/ParticleSystem/SPARK/include/SPK.h deleted file mode 100644 index ae2e79cac..000000000 --- a/Extensions/ParticleSystem/SPARK/include/SPK.h +++ /dev/null @@ -1,80 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef H_SPK -#define H_SPK - -// Defines -#include "Core/SPK_DEF.h" - -// Core -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Buffer.h" // 1.03 -#include "Core/SPK_ArrayBuffer.h" // 1.03 -#include "Core/SPK_Registerable.h" // 1.03 -#include "Core/SPK_Transformable.h" // 1.03 -#include "Core/SPK_BufferHandler.h" // 1.04 -#include "Core/SPK_RegWrapper.h" // 1.03 -#include "Core/SPK_Renderer.h" -#include "Core/SPK_System.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Pool.h" -#include "Core/SPK_Zone.h" -#include "Core/SPK_Interpolator.h" // 1.05 -#include "Core/SPK_Model.h" -#include "Core/SPK_Emitter.h" -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_Factory.h" // 1.03 - -// Zones -#include "Extensions/Zones/SPK_AABox.h" -#include "Extensions/Zones/SPK_Point.h" -#include "Extensions/Zones/SPK_Sphere.h" -#include "Extensions/Zones/SPK_Plane.h" -#include "Extensions/Zones/SPK_Line.h" // 1.01 -#include "Extensions/Zones/SPK_Ring.h" // 1.05 -#include "Extensions/Zones/SPK_Cylinder.h" - -// Emitters -#include "Extensions/Emitters/SPK_StraightEmitter.h" -#include "Extensions/Emitters/SPK_SphericEmitter.h" -#include "Extensions/Emitters/SPK_NormalEmitter.h" // 1.02 -#include "Extensions/Emitters/SPK_RandomEmitter.h" // 1.02 -#include "Extensions/Emitters/SPK_StaticEmitter.h" // 1.05 - -// Modifiers -#include "Extensions/Modifiers/SPK_Obstacle.h" -#include "Extensions/Modifiers/SPK_Destroyer.h" -#include "Extensions/Modifiers/SPK_PointMass.h" -#include "Extensions/Modifiers/SPK_ModifierGroup.h" // 1.02 -#include "Extensions/Modifiers/SPK_LinearForce.h" // 1.03 -#include "Extensions/Modifiers/SPK_Collision.h" // 1.04 -#include "Extensions/Modifiers/SPK_Vortex.h" // 1.05 -#include "Extensions/Modifiers/SPK_Rotator.h" // 1.05 - -// Renderer Interfaces -#include "Extensions/Renderers/SPK_PointRendererInterface.h" // 1.04 -#include "Extensions/Renderers/SPK_LineRendererInterface.h" // 1.04 -#include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h" // 1.04 -#include "Extensions/Renderers/SPK_QuadRendererInterface.h" - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/SPK_GL.h b/Extensions/ParticleSystem/SPARK/include/SPK_GL.h deleted file mode 100644 index 905c4595c..000000000 --- a/Extensions/ParticleSystem/SPARK/include/SPK_GL.h +++ /dev/null @@ -1,41 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_GL -#define H_SPK_GL - -// Defines -#include "RenderingAPIs/OpenGL/SPK_GL_DEF.h" - -// Extension interface -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h" // 1.01 - -// Mother Renderer -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" - -// Renderers -#include "RenderingAPIs/OpenGL/SPK_GLPointRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLLineRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLQuadRenderer.h" -#include "RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.h" // 1.03 - -#endif diff --git a/Extensions/ParticleSystem/SPARK/include/SPK_IRR.h b/Extensions/ParticleSystem/SPARK/include/SPK_IRR.h deleted file mode 100644 index a41c1d6a5..000000000 --- a/Extensions/ParticleSystem/SPARK/include/SPK_IRR.h +++ /dev/null @@ -1,36 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2008-2009 // -// Thibault Lescoat - info-tibo orange fr // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#ifndef _SPARK_IRRLICHT_RENDERER_MAIN_HEADER_ -#define _SPARK_IRRLICHT_RENDERER_MAIN_HEADER_ - -//#include "RenderingAPIs/Irrlicht/SPK_IRR_System.h" - -#include "RenderingAPIs/Irrlicht/SPK_IRR_DEF.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRSystem.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.h" - -#endif // _SPARK_IRRLICHT_RENDERER_MAIN_HEADER_ diff --git a/Extensions/ParticleSystem/SPARK/include/SPK_SFML.h b/Extensions/ParticleSystem/SPARK/include/SPK_SFML.h deleted file mode 100644 index 7b6289951..000000000 --- a/Extensions/ParticleSystem/SPARK/include/SPK_SFML.h +++ /dev/null @@ -1,44 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#ifndef H_SPK_SFML -#define H_SPK_SFML - -// Defines -#include "RenderingAPIs/SFML/SPK_SFML_DEF.h" - -// Global -#include "RenderingAPIs/SFML/SPK_SFML_GLOBAL.h" - -// System -#include "RenderingAPIs/SFML/SPK_SFMLSystem.h" - -// Mother Renderer -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" - -// Renderers -#include "RenderingAPIs/SFML/SPK_SFMLQuadRenderer.h" -#include "RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.h" -#include "RenderingAPIs/SFML/SPK_SFMLLineRenderer.h" -#include "RenderingAPIs/SFML/SPK_SFMLPointRenderer.h" - -#endif diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_All.o b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_All.o deleted file mode 100644 index d9f01198f..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_All.o and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_GL_All.o b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_GL_All.o deleted file mode 100644 index 52c43f3d0..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Debug Win32/src/SPK_GL_All.o and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_All.o b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_All.o deleted file mode 100644 index 00cdb5955..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_All.o and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_GL_All.o b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_GL_All.o deleted file mode 100644 index 748a827b3..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/Release Win32/src/SPK_GL_All.o and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK DLL.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK DLL.cbp deleted file mode 100644 index 3e25ef812..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK DLL.cbp +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL DLL.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL DLL.cbp deleted file mode 100644 index 2517690db..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL DLL.cbp +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL LIB.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL LIB.cbp deleted file mode 100644 index 826101789..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK GL LIB.cbp +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR DLL.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR DLL.cbp deleted file mode 100644 index f3bcc4636..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR DLL.cbp +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR LIB.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR LIB.cbp deleted file mode 100644 index a64eb1bfd..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK IRR LIB.cbp +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK LIB.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK LIB.cbp deleted file mode 100644 index dfbf5d31a..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK LIB.cbp +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML DLL.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML DLL.cbp deleted file mode 100644 index 0883a94a7..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML DLL.cbp +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML LIB.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML LIB.cbp deleted file mode 100644 index 173a00f15..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK SFML LIB.cbp +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK.cbp b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK.cbp deleted file mode 100644 index 261664fd7..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK engine/SPARK.cbp +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK.workspace b/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK.workspace deleted file mode 100644 index 3664ced82..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/codeblocks/SPARK.workspace +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Basic.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Basic.vcproj deleted file mode 100644 index 0376a74e1..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Basic.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision 2.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision 2.vcproj deleted file mode 100644 index ab311392b..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision 2.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision.vcproj deleted file mode 100644 index f07071e1e..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Collision.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Explosion.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Explosion.vcproj deleted file mode 100644 index be34a6144..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Explosion.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Fire.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Fire.vcproj deleted file mode 100644 index 105d1f7da..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Fire.vcproj +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Flakes.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Flakes.vcproj deleted file mode 100644 index e7a38d9f1..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Flakes.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Foutain.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Foutain.vcproj deleted file mode 100644 index 0c194556e..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Foutain.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Galaxy.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Galaxy.vcproj deleted file mode 100644 index c1e7759a4..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Galaxy.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Gravitation.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Gravitation.vcproj deleted file mode 100644 index 6c09573e4..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Gravitation.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht.vcproj deleted file mode 100644 index bd2c5ce31..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht2.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht2.vcproj deleted file mode 100644 index b5fe49199..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Irrlicht2.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Rain.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Rain.vcproj deleted file mode 100644 index b88595ae8..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Rain.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Writing.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Writing.vcproj deleted file mode 100644 index b58882538..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK demos/SPARK Demo Writing.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK DLL.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK DLL.vcproj deleted file mode 100644 index 2b29bcb14..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK DLL.vcproj +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL DLL.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL DLL.vcproj deleted file mode 100644 index 94bea0c93..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL DLL.vcproj +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL LIB.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL LIB.vcproj deleted file mode 100644 index 33a941f61..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK GL LIB.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR DLL.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR DLL.vcproj deleted file mode 100644 index 75d4db5b5..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR DLL.vcproj +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR LIB.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR LIB.vcproj deleted file mode 100644 index 19d356b73..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK IRR LIB.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK LIB.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK LIB.vcproj deleted file mode 100644 index a07d87a81..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK LIB.vcproj +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML DLL.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML DLL.vcproj deleted file mode 100644 index 7f351f5e9..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML DLL.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML LIB.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML LIB.vcproj deleted file mode 100644 index e7f63002f..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK SFML LIB.vcproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK.vcproj deleted file mode 100644 index ca2c746c4..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK engine/SPARK.vcproj +++ /dev/null @@ -1,757 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 1.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 1.vcproj deleted file mode 100644 index 7e060e58c..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 1.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 2.vcproj b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 2.vcproj deleted file mode 100644 index 3580179c1..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK tutos/SPARK Tuto 2.vcproj +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.sln b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.sln deleted file mode 100644 index f4f27251a..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.sln +++ /dev/null @@ -1,104 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Basic", "SPARK demos\SPARK Demo Basic.vcproj", "{5DCBEFF6-44D3-41FB-AEB4-8C11E1D58710}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Collision", "SPARK demos\SPARK Demo Collision.vcproj", "{507E9E28-B62B-428F-A1CB-5D4EF8FF9B57}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Collision 2", "SPARK demos\SPARK Demo Collision 2.vcproj", "{261045EF-5C5C-4B08-8EE9-E9AFB342CDA7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Fire", "SPARK demos\SPARK Demo Fire.vcproj", "{1D2395EB-5DE7-4A77-8C88-A9A1A848B841}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Flakes", "SPARK demos\SPARK Demo Flakes.vcproj", "{68E15D92-5D32-4B65-A6F5-49B27357A758}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Fountain", "SPARK demos\SPARK Demo Foutain.vcproj", "{BE5B1D1F-5C5F-4B58-923D-609FC6188A52}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Gravitation", "SPARK demos\SPARK Demo Gravitation.vcproj", "{5A3AF0E8-8BC4-4072-A54D-5AAC3F96CC03}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Rain", "SPARK demos\SPARK Demo Rain.vcproj", "{3C8AF4C5-28F4-4639-A80C-98E223D495B6}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Writing", "SPARK demos\SPARK Demo Writing.vcproj", "{01C42FDB-D4A5-4656-A19C-13F2952488EB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Tuto 1", "SPARK tutos\SPARK Tuto 1.vcproj", "{CD3F4115-7A9F-405D-B792-825E5CC84DF5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Tuto 2", "SPARK tutos\SPARK Tuto 2.vcproj", "{F9466A91-0D0A-4FA8-94FE-3651551866EE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Irrlicht Basic", "SPARK demos\SPARK Demo Irrlicht.vcproj", "{95537842-C79A-4DBE-9B78-EA2A3A3BB993}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Irrlicht Fire", "SPARK demos\SPARK Demo Irrlicht2.vcproj", "{47220A3C-5A5E-466B-ADCB-A6A30B67B3A4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Galaxy", "SPARK demos\SPARK Demo Galaxy.vcproj", "{5D2E7CA2-0430-4E3B-BEB2-CABAADFEAD19}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Demo Explosion", "SPARK demos\SPARK Demo Explosion.vcproj", "{579AFCF6-BD40-4B28-8E48-6999206E5F49}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5DCBEFF6-44D3-41FB-AEB4-8C11E1D58710}.Debug|Win32.ActiveCfg = Debug|Win32 - {5DCBEFF6-44D3-41FB-AEB4-8C11E1D58710}.Debug|Win32.Build.0 = Debug|Win32 - {5DCBEFF6-44D3-41FB-AEB4-8C11E1D58710}.Release|Win32.ActiveCfg = Release|Win32 - {5DCBEFF6-44D3-41FB-AEB4-8C11E1D58710}.Release|Win32.Build.0 = Release|Win32 - {507E9E28-B62B-428F-A1CB-5D4EF8FF9B57}.Debug|Win32.ActiveCfg = Debug|Win32 - {507E9E28-B62B-428F-A1CB-5D4EF8FF9B57}.Debug|Win32.Build.0 = Debug|Win32 - {507E9E28-B62B-428F-A1CB-5D4EF8FF9B57}.Release|Win32.ActiveCfg = Release|Win32 - {507E9E28-B62B-428F-A1CB-5D4EF8FF9B57}.Release|Win32.Build.0 = Release|Win32 - {261045EF-5C5C-4B08-8EE9-E9AFB342CDA7}.Debug|Win32.ActiveCfg = Debug|Win32 - {261045EF-5C5C-4B08-8EE9-E9AFB342CDA7}.Debug|Win32.Build.0 = Debug|Win32 - {261045EF-5C5C-4B08-8EE9-E9AFB342CDA7}.Release|Win32.ActiveCfg = Release|Win32 - {261045EF-5C5C-4B08-8EE9-E9AFB342CDA7}.Release|Win32.Build.0 = Release|Win32 - {1D2395EB-5DE7-4A77-8C88-A9A1A848B841}.Debug|Win32.ActiveCfg = Debug|Win32 - {1D2395EB-5DE7-4A77-8C88-A9A1A848B841}.Debug|Win32.Build.0 = Debug|Win32 - {1D2395EB-5DE7-4A77-8C88-A9A1A848B841}.Release|Win32.ActiveCfg = Release|Win32 - {1D2395EB-5DE7-4A77-8C88-A9A1A848B841}.Release|Win32.Build.0 = Release|Win32 - {68E15D92-5D32-4B65-A6F5-49B27357A758}.Debug|Win32.ActiveCfg = Debug|Win32 - {68E15D92-5D32-4B65-A6F5-49B27357A758}.Debug|Win32.Build.0 = Debug|Win32 - {68E15D92-5D32-4B65-A6F5-49B27357A758}.Release|Win32.ActiveCfg = Release|Win32 - {68E15D92-5D32-4B65-A6F5-49B27357A758}.Release|Win32.Build.0 = Release|Win32 - {BE5B1D1F-5C5F-4B58-923D-609FC6188A52}.Debug|Win32.ActiveCfg = Debug|Win32 - {BE5B1D1F-5C5F-4B58-923D-609FC6188A52}.Debug|Win32.Build.0 = Debug|Win32 - {BE5B1D1F-5C5F-4B58-923D-609FC6188A52}.Release|Win32.ActiveCfg = Release|Win32 - {BE5B1D1F-5C5F-4B58-923D-609FC6188A52}.Release|Win32.Build.0 = Release|Win32 - {5A3AF0E8-8BC4-4072-A54D-5AAC3F96CC03}.Debug|Win32.ActiveCfg = Debug|Win32 - {5A3AF0E8-8BC4-4072-A54D-5AAC3F96CC03}.Debug|Win32.Build.0 = Debug|Win32 - {5A3AF0E8-8BC4-4072-A54D-5AAC3F96CC03}.Release|Win32.ActiveCfg = Release|Win32 - {5A3AF0E8-8BC4-4072-A54D-5AAC3F96CC03}.Release|Win32.Build.0 = Release|Win32 - {3C8AF4C5-28F4-4639-A80C-98E223D495B6}.Debug|Win32.ActiveCfg = Debug|Win32 - {3C8AF4C5-28F4-4639-A80C-98E223D495B6}.Debug|Win32.Build.0 = Debug|Win32 - {3C8AF4C5-28F4-4639-A80C-98E223D495B6}.Release|Win32.ActiveCfg = Release|Win32 - {3C8AF4C5-28F4-4639-A80C-98E223D495B6}.Release|Win32.Build.0 = Release|Win32 - {01C42FDB-D4A5-4656-A19C-13F2952488EB}.Debug|Win32.ActiveCfg = Debug|Win32 - {01C42FDB-D4A5-4656-A19C-13F2952488EB}.Debug|Win32.Build.0 = Debug|Win32 - {01C42FDB-D4A5-4656-A19C-13F2952488EB}.Release|Win32.ActiveCfg = Release|Win32 - {01C42FDB-D4A5-4656-A19C-13F2952488EB}.Release|Win32.Build.0 = Release|Win32 - {CD3F4115-7A9F-405D-B792-825E5CC84DF5}.Debug|Win32.ActiveCfg = Debug|Win32 - {CD3F4115-7A9F-405D-B792-825E5CC84DF5}.Debug|Win32.Build.0 = Debug|Win32 - {CD3F4115-7A9F-405D-B792-825E5CC84DF5}.Release|Win32.ActiveCfg = Release|Win32 - {CD3F4115-7A9F-405D-B792-825E5CC84DF5}.Release|Win32.Build.0 = Release|Win32 - {F9466A91-0D0A-4FA8-94FE-3651551866EE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F9466A91-0D0A-4FA8-94FE-3651551866EE}.Debug|Win32.Build.0 = Debug|Win32 - {F9466A91-0D0A-4FA8-94FE-3651551866EE}.Release|Win32.ActiveCfg = Release|Win32 - {F9466A91-0D0A-4FA8-94FE-3651551866EE}.Release|Win32.Build.0 = Release|Win32 - {95537842-C79A-4DBE-9B78-EA2A3A3BB993}.Debug|Win32.ActiveCfg = Debug|Win32 - {95537842-C79A-4DBE-9B78-EA2A3A3BB993}.Debug|Win32.Build.0 = Debug|Win32 - {95537842-C79A-4DBE-9B78-EA2A3A3BB993}.Release|Win32.ActiveCfg = Release|Win32 - {95537842-C79A-4DBE-9B78-EA2A3A3BB993}.Release|Win32.Build.0 = Release|Win32 - {47220A3C-5A5E-466B-ADCB-A6A30B67B3A4}.Debug|Win32.ActiveCfg = Debug|Win32 - {47220A3C-5A5E-466B-ADCB-A6A30B67B3A4}.Debug|Win32.Build.0 = Debug|Win32 - {47220A3C-5A5E-466B-ADCB-A6A30B67B3A4}.Release|Win32.ActiveCfg = Release|Win32 - {47220A3C-5A5E-466B-ADCB-A6A30B67B3A4}.Release|Win32.Build.0 = Release|Win32 - {5D2E7CA2-0430-4E3B-BEB2-CABAADFEAD19}.Debug|Win32.ActiveCfg = Debug|Win32 - {5D2E7CA2-0430-4E3B-BEB2-CABAADFEAD19}.Debug|Win32.Build.0 = Debug|Win32 - {5D2E7CA2-0430-4E3B-BEB2-CABAADFEAD19}.Release|Win32.ActiveCfg = Release|Win32 - {5D2E7CA2-0430-4E3B-BEB2-CABAADFEAD19}.Release|Win32.Build.0 = Release|Win32 - {579AFCF6-BD40-4B28-8E48-6999206E5F49}.Debug|Win32.ActiveCfg = Debug|Win32 - {579AFCF6-BD40-4B28-8E48-6999206E5F49}.Debug|Win32.Build.0 = Debug|Win32 - {579AFCF6-BD40-4B28-8E48-6999206E5F49}.Release|Win32.ActiveCfg = Release|Win32 - {579AFCF6-BD40-4B28-8E48-6999206E5F49}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.suo b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.suo deleted file mode 100644 index 06a83bbee..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_demos.suo and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.sln b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.sln deleted file mode 100644 index 2674841bf..000000000 --- a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.sln +++ /dev/null @@ -1,86 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK (not to compile)", "SPARK engine\SPARK.vcproj", "{4323BB69-DA5B-468B-A873-47481E71C451}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine CORE DLL", "SPARK engine\SPARK DLL.vcproj", "{1B841F94-151C-4198-8FC4-27980C8989FE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine GL DLL", "SPARK engine\SPARK GL DLL.vcproj", "{EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0}" - ProjectSection(ProjectDependencies) = postProject - {1B841F94-151C-4198-8FC4-27980C8989FE} = {1B841F94-151C-4198-8FC4-27980C8989FE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine GL LIB", "SPARK engine\SPARK GL LIB.vcproj", "{3BE5B566-4B5E-4D13-8458-3B1762B54CE1}" - ProjectSection(ProjectDependencies) = postProject - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} = {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine CORE LIB", "SPARK engine\SPARK LIB.vcproj", "{FDAD4231-7EB9-4810-AADA-F513BFC29BAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine SFML DLL", "SPARK engine\SPARK SFML DLL.vcproj", "{329F9720-2F4C-43EA-AEF7-6EDCF03D5FD8}" - ProjectSection(ProjectDependencies) = postProject - {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0} = {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0} - {1B841F94-151C-4198-8FC4-27980C8989FE} = {1B841F94-151C-4198-8FC4-27980C8989FE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine SFML LIB", "SPARK engine\SPARK SFML LIB.vcproj", "{D0F5FB5A-ADD9-4E3F-B57F-3D637DBA0610}" - ProjectSection(ProjectDependencies) = postProject - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} = {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} - {3BE5B566-4B5E-4D13-8458-3B1762B54CE1} = {3BE5B566-4B5E-4D13-8458-3B1762B54CE1} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine IRR DLL", "SPARK engine\SPARK IRR DLL.vcproj", "{8E35334D-25B6-4E98-B825-3EA6B25878FC}" - ProjectSection(ProjectDependencies) = postProject - {1B841F94-151C-4198-8FC4-27980C8989FE} = {1B841F94-151C-4198-8FC4-27980C8989FE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPARK Engine IRR LIB", "SPARK engine\SPARK IRR LIB.vcproj", "{3F79E633-E34E-43C0-BC14-F033C8B16E34}" - ProjectSection(ProjectDependencies) = postProject - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} = {FDAD4231-7EB9-4810-AADA-F513BFC29BAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4323BB69-DA5B-468B-A873-47481E71C451}.Debug|Win32.ActiveCfg = Debug|Win32 - {4323BB69-DA5B-468B-A873-47481E71C451}.Release|Win32.ActiveCfg = Release|Win32 - {1B841F94-151C-4198-8FC4-27980C8989FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {1B841F94-151C-4198-8FC4-27980C8989FE}.Debug|Win32.Build.0 = Debug|Win32 - {1B841F94-151C-4198-8FC4-27980C8989FE}.Release|Win32.ActiveCfg = Release|Win32 - {1B841F94-151C-4198-8FC4-27980C8989FE}.Release|Win32.Build.0 = Release|Win32 - {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0}.Debug|Win32.ActiveCfg = Debug|Win32 - {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0}.Debug|Win32.Build.0 = Debug|Win32 - {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0}.Release|Win32.ActiveCfg = Release|Win32 - {EA9C1A81-E1BF-4FA9-B4BB-C90752F3B4B0}.Release|Win32.Build.0 = Release|Win32 - {3BE5B566-4B5E-4D13-8458-3B1762B54CE1}.Debug|Win32.ActiveCfg = Debug|Win32 - {3BE5B566-4B5E-4D13-8458-3B1762B54CE1}.Debug|Win32.Build.0 = Debug|Win32 - {3BE5B566-4B5E-4D13-8458-3B1762B54CE1}.Release|Win32.ActiveCfg = Release|Win32 - {3BE5B566-4B5E-4D13-8458-3B1762B54CE1}.Release|Win32.Build.0 = Release|Win32 - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE}.Debug|Win32.Build.0 = Debug|Win32 - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE}.Release|Win32.ActiveCfg = Release|Win32 - {FDAD4231-7EB9-4810-AADA-F513BFC29BAE}.Release|Win32.Build.0 = Release|Win32 - {329F9720-2F4C-43EA-AEF7-6EDCF03D5FD8}.Debug|Win32.ActiveCfg = Debug|Win32 - {329F9720-2F4C-43EA-AEF7-6EDCF03D5FD8}.Debug|Win32.Build.0 = Debug|Win32 - {329F9720-2F4C-43EA-AEF7-6EDCF03D5FD8}.Release|Win32.ActiveCfg = Release|Win32 - {329F9720-2F4C-43EA-AEF7-6EDCF03D5FD8}.Release|Win32.Build.0 = Release|Win32 - {D0F5FB5A-ADD9-4E3F-B57F-3D637DBA0610}.Debug|Win32.ActiveCfg = Debug|Win32 - {D0F5FB5A-ADD9-4E3F-B57F-3D637DBA0610}.Debug|Win32.Build.0 = Debug|Win32 - {D0F5FB5A-ADD9-4E3F-B57F-3D637DBA0610}.Release|Win32.ActiveCfg = Release|Win32 - {D0F5FB5A-ADD9-4E3F-B57F-3D637DBA0610}.Release|Win32.Build.0 = Release|Win32 - {8E35334D-25B6-4E98-B825-3EA6B25878FC}.Debug|Win32.ActiveCfg = Debug|Win32 - {8E35334D-25B6-4E98-B825-3EA6B25878FC}.Debug|Win32.Build.0 = Debug|Win32 - {8E35334D-25B6-4E98-B825-3EA6B25878FC}.Release|Win32.ActiveCfg = Release|Win32 - {8E35334D-25B6-4E98-B825-3EA6B25878FC}.Release|Win32.Build.0 = Release|Win32 - {3F79E633-E34E-43C0-BC14-F033C8B16E34}.Debug|Win32.ActiveCfg = Debug|Win32 - {3F79E633-E34E-43C0-BC14-F033C8B16E34}.Debug|Win32.Build.0 = Debug|Win32 - {3F79E633-E34E-43C0-BC14-F033C8B16E34}.Release|Win32.ActiveCfg = Release|Win32 - {3F79E633-E34E-43C0-BC14-F033C8B16E34}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.suo b/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.suo deleted file mode 100644 index f633e1287..000000000 Binary files a/Extensions/ParticleSystem/SPARK/projects/vc2008/SPARK_engine.suo and /dev/null differ diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_BufferHandler.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_BufferHandler.cpp deleted file mode 100644 index 8350b1b87..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_BufferHandler.cpp +++ /dev/null @@ -1,53 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_BufferHandler.h" - -namespace SPK -{ - bool BufferHandler::bufferCreation = true; - - void BufferHandler::enableBuffersCreation(bool creation) - { - bufferCreation = creation; - } - - bool BufferHandler::isBuffersCreationEnabled() - { - return bufferCreation; - } - - bool BufferHandler::prepareBuffers(const Group& group) - { - if (!checkBuffers(group)) - { - if (isBuffersCreationEnabled()) - { - destroyBuffers(group); - createBuffers(group); - return true; - } - return false; - } - return true; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_DEF.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_DEF.cpp deleted file mode 100644 index ba151ab93..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_DEF.cpp +++ /dev/null @@ -1,28 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Core/SPK_DEF.h" - - -namespace SPK -{ - unsigned int randomSeed = 1; -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Emitter.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Emitter.cpp deleted file mode 100644 index 8eef778b4..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Emitter.cpp +++ /dev/null @@ -1,132 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Emitter.h" -#include "Extensions/Zones/SPK_Point.h" - - -namespace SPK -{ - Emitter::Emitter() : - Registerable(), - Transformable(), - zone(&getDefaultZone()), - full(true), - tank(-1), - flow(0.0f), - forceMin(0.0f), - forceMax(0.0f), - fraction(random(0.0f,1.0f)), - active(true) - {} - - void Emitter::registerChildren(bool registerAll) - { - Registerable::registerChildren(registerAll); - registerChild(zone,registerAll); - } - - void Emitter::copyChildren(const Registerable& object,bool createBase) - { - const Emitter& emitter = dynamic_cast(object); - Registerable::copyChildren(emitter,createBase); - zone = dynamic_cast(copyChild(emitter.zone,createBase)); - } - - void Emitter::destroyChildren(bool keepChildren) - { - destroyChild(zone,keepChildren); - Registerable::destroyChildren(keepChildren); - } - - Registerable* Emitter::findByName(const std::string& name) - { - Registerable* object = Registerable::findByName(name); - if (object != NULL) - return object; - - return zone->findByName(name); - } - - void Emitter::changeTank(int deltaTank) - { - if (tank >= 0) - { - tank += deltaTank; - if (tank < 0) - tank = 0; - } - } - - void Emitter::changeFlow(float deltaFlow) - { - if (flow >= 0.0f) - { - flow += deltaFlow; - if (flow < 0.0f) - flow = 0.0f; - } - } - - void Emitter::setZone(Zone* zone,bool full) - { - decrementChildReference(this->zone); - incrementChildReference(zone); - - if (zone == NULL) - zone = &getDefaultZone(); - - this->zone = zone; - this->full = full; - } - - Zone& Emitter::getDefaultZone() - { - static Point defaultZone; - return defaultZone; - } - - unsigned int Emitter::updateNumber(float deltaTime) - { - int nbBorn; - if (flow < 0.0f) - { - nbBorn = std::max(0,tank); - tank = 0; - } - else if (tank != 0) - { - fraction += flow * deltaTime; - nbBorn = static_cast(fraction); - if (tank >= 0) - { - nbBorn = std::min(tank,nbBorn); - tank -= nbBorn; - } - fraction -= nbBorn; - } - else - nbBorn = 0; - - return static_cast(nbBorn); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Factory.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Factory.cpp deleted file mode 100644 index 044f835ae..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Factory.cpp +++ /dev/null @@ -1,214 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Factory.h" - - -namespace SPK -{ - SPKFactory* SPKFactory::instance = NULL; - SPK_ID SPKFactory::currentID = NO_ID; - - SPKFactory& SPKFactory::getInstance() - { - if (instance == NULL) - instance = new SPKFactory; - return *instance; - } - - void SPKFactory::destroyInstance() - { - if (instance != NULL) - { - delete instance; - instance = NULL; - } - } - - SPK_ID SPKFactory::create(const Registerable& base) - { - // Clears the adresses set - SPKAdresses.clear(); - - // clones the reference - Registerable* innerBase = base.clone(true); - - // registers the base - registerObject(innerBase); - - return innerBase->ID; - } - - Registerable* SPKFactory::get(SPK_ID ID) - { - std::map::iterator it = SPKRegister.find(ID); - if (it != SPKRegister.end()) // the ID was found - return it->second; - return NULL; // the ID is not registered - } - - Registerable* SPKFactory::copy(SPK_ID ID) - { - // Clears the adresses set - SPKAdresses.clear(); - - std::map::iterator it = SPKRegister.find(ID); - if (it != SPKRegister.end()) // the ID was found - return registerObject(it->second->clone(false)); // registers a copy - return NULL; // the ID is not registered - } - - Registerable* SPKFactory::copy(const Registerable* registerable) - { - // Clears the adresses set - SPKAdresses.clear(); - - if (registerable->isRegistered()) - return registerObject(registerable->clone(false)); // registers a copy - return NULL; - } - - bool SPKFactory::destroy(SPK_ID ID,bool checkNbReferences) - { - std::map::iterator it = SPKRegister.find(ID); - - if ((it != SPKRegister.end())&& // the ID was found - ((!checkNbReferences)|| - (it->second->getNbReferences() == 0))) - { - unregisterObject(it,false); - return true; - } - - return false; // the ID is not registered - } - - bool SPKFactory::destroy(Registerable* object,bool checkNbReferences) - { - if (object == NULL) - return false; - - return destroy(object->getSPKID(),checkNbReferences); - } - - void SPKFactory::destroyAll() - { - std::map::iterator it; - while((it = SPKRegister.begin()) != SPKRegister.end()) - unregisterObject(it,true); - } - - Registerable* SPKFactory::findByName(const std::string& name) - { - for (std::map::const_iterator it = SPKRegister.begin(); it != SPKRegister.end(); ++it) - if (it->second->getName().compare(name) == 0) - return it->second; - - return NULL; - } - - void SPKFactory::trace(SPK_ID ID) - { - std::map::iterator it = SPKRegister.find(ID); - if (it != SPKRegister.end()) // the ID was found - traceObject(it,true); - else // the ID is not registered - std::cout << "No object registered in the SPKFactory with this ID"; - } - - void SPKFactory::trace(const Registerable* registerable) - { - trace(registerable->getSPKID()); - } - - void SPKFactory::traceAll() - { - std::cout << "Nb of objects in the SPKFactory : " << getNbObjects() << std::endl; - for (std::map::iterator it = SPKRegister.begin(); it != SPKRegister.end(); ++it) - traceObject(it,true); - } - - void SPKFactory::traceObject(const std::map::iterator& it,bool nextLine) - { - SPK_ID ID = it->first; - Registerable* object = it->second; - std::cout << object - << " ID:" << ID - << " type:" << object->getClassName().c_str() - << " nbRef:" << object->getNbReferences() - << " flag:"; - if (object->isShared()) std::cout << "S"; - if (object->isDestroyable()) std::cout << "D"; - if (object->getName().length() > 0) std::cout << " \"" << object->getName() << "\""; - if (nextLine) std::cout << std::endl; - } - - Registerable* SPKFactory::registerObject(Registerable* object) - { - object->onRegister(); - object->ID = ++currentID; - - // optimisation at the insertion to get an amortized constant complexity instead of a logarithmic complexity - SPKRegister.insert(SPKRegister.size() != 0 ? --SPKRegister.end() : SPKRegister.begin(), - std::pair(object->ID,object)); - - // Traces allocations -#ifdef SPK_DEBUG - ++nbAlloc; - std::cout << "REGISTER "; - traceObject(SPKRegister.find(object->ID),false); - std::cout << " nbAlloc:" << nbAlloc << " nbObj:" << getNbObjects() << std::endl; -#endif - - return object; - } - - void SPKFactory::unregisterObject(std::map::iterator& it,bool keepChildren) - { - Registerable* object = it->second; - object->onUnregister(); - - // traces desallocations -#ifdef SPK_DEBUG - ++nbDesalloc; - std::cout << "UNREGISTER "; - traceObject(it,false); - std::cout << " nbDesalloc:" << nbDesalloc << " nbObj:" << getNbObjects() - 1 << std::endl; -#endif - - SPKRegister.erase(it); // unregister object - object->ID = NO_ID; - object->destroyChildren(keepChildren); // unregister and destroy registered children - delete object; // destroy object - } - - bool SPKFactory::unregisterObject(SPK_ID ID,bool keepChildren) - { - std::map::iterator it = SPKRegister.find(ID); - if (it != SPKRegister.end()) // the ID was found - { - unregisterObject(it,keepChildren); - return true; - } - return false; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Group.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Group.cpp deleted file mode 100644 index ed518f940..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Group.cpp +++ /dev/null @@ -1,747 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Group.h" -#include "Core/SPK_Emitter.h" -#include "Core/SPK_Modifier.h" -#include "Core/SPK_Renderer.h" -#include "Core/SPK_Factory.h" -#include "Core/SPK_Buffer.h" - - -namespace SPK -{ - bool Group::bufferManagement = true; - - Group::Group(Model* m,size_t capacity) : - Registerable(), - Transformable(), - model(m != NULL ? m : &getDefaultModel()), - renderer(NULL), - friction(0.0f), - gravity(Vector3D()), - pool(Pool(capacity)), - particleData(new Particle::ParticleData[capacity]), - particleCurrentParams(new float[capacity * model->getSizeOfParticleCurrentArray()]), - particleExtendedParams(new float[capacity * model->getSizeOfParticleExtendedArray()]), - sortingEnabled(false), - distanceComputationEnabled(false), - creationBuffer(), - nbBufferedParticles(0), - fupdate(NULL), - fbirth(NULL), - fdeath(NULL), - boundingBoxEnabled(false), - emitters(), - modifiers(), - activeModifiers(), - additionalBuffers(), - swappableBuffers() - {} - - Group::Group(const Group& group) : - Registerable(group), - Transformable(group), - model(group.model), - renderer(group.renderer), - friction(group.friction), - gravity(group.gravity), - pool(group.pool), - sortingEnabled(group.sortingEnabled), - distanceComputationEnabled(group.distanceComputationEnabled), - creationBuffer(group.creationBuffer), - nbBufferedParticles(group.nbBufferedParticles), - fupdate(group.fupdate), - fbirth(group.fbirth), - fdeath(group.fdeath), - boundingBoxEnabled(group.boundingBoxEnabled), - emitters(group.emitters), - modifiers(group.modifiers), - activeModifiers(group.activeModifiers.capacity()), - additionalBuffers(), - swappableBuffers() - { - particleData = new Particle::ParticleData[pool.getNbReserved()]; - particleCurrentParams = new float[pool.getNbReserved() * model->getSizeOfParticleCurrentArray()]; - particleExtendedParams = new float[pool.getNbReserved() * model->getSizeOfParticleExtendedArray()]; - - std::memcpy(particleData,group.particleData,pool.getNbTotal() * sizeof(Particle::ParticleData)); - std::memcpy(particleCurrentParams,group.particleCurrentParams,pool.getNbTotal() * sizeof(float) * model->getSizeOfParticleCurrentArray()); - std::memcpy(particleExtendedParams,group.particleExtendedParams,pool.getNbTotal() * sizeof(float) * model->getSizeOfParticleExtendedArray()); - - for (Pool::iterator it = pool.begin(); it != pool.endInactive(); ++it) - { - it->group = this; - it->data = particleData + it->index; - it->currentParams = particleCurrentParams + it->index * model->getSizeOfParticleCurrentArray(); - it->extendedParams = particleExtendedParams + it->index * model->getSizeOfParticleExtendedArray(); - } - } - - Group::~Group() - { - delete[] particleData; - delete[] particleCurrentParams; - delete[] particleExtendedParams; - - // destroys additional buffers - destroyAllBuffers(); - } - - void Group::registerChildren(bool registerAll) - { - Registerable::registerChildren(registerAll); - - registerChild(model,registerAll); - registerChild(renderer,registerAll); - - for (std::vector::const_iterator it = emitters.begin(); it != emitters.end(); ++it) - registerChild(*it,registerAll); - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - registerChild(*it,registerAll); - } - - void Group::copyChildren(const Registerable& object,bool createBase) - { - const Group& group = dynamic_cast(object); - Registerable::copyChildren(group,createBase); - - model = dynamic_cast(copyChild(group.model,createBase)); - renderer = dynamic_cast(copyChild(group.renderer,createBase)); - - // we clear the copies of pointers pushed in the vectors by the copy constructor - emitters.clear(); - modifiers.clear(); - - for (std::vector::const_iterator it = group.emitters.begin(); it != group.emitters.end(); ++it) - emitters.push_back(dynamic_cast(copyChild(*it,createBase))); - for (std::vector::const_iterator it = group.modifiers.begin(); it != group.modifiers.end(); ++it) - modifiers.push_back(dynamic_cast(copyChild(*it,createBase))); - } - - void Group::destroyChildren(bool keepChildren) - { - destroyChild(model,keepChildren); - destroyChild(renderer,keepChildren); - - for (std::vector::const_iterator it = emitters.begin(); it != emitters.end(); ++it) - destroyChild(*it,keepChildren); - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - destroyChild(*it,keepChildren); - - Registerable::destroyChildren(keepChildren); - } - - Registerable* Group::findByName(const std::string& name) - { - Registerable* object = Registerable::findByName(name); - if (object != NULL) - return object; - - object = model->findByName(name); - if (object != NULL) - return object; - - if (renderer != NULL) - { - object = renderer->findByName(name); - if (object != NULL) - return object; - } - - for (std::vector::const_iterator it = emitters.begin(); it != emitters.end(); ++it) - { - object = (*it)->findByName(name); - if (object != NULL) - return object; - } - - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - { - object = (*it)->findByName(name); - if (object != NULL) - return object; - } - - return NULL; - } - - void Group::setModel(Model* newmodel) - { - if(!newmodel) newmodel = &getDefaultModel(); - if(model == newmodel) return; - - // empty and change model - empty(); - - decrementChildReference(model); - incrementChildReference(newmodel); - model = newmodel; - - // recreate data - delete[] particleData; - delete[] particleCurrentParams; - delete[] particleExtendedParams; - - particleData = new Particle::ParticleData[pool.getNbReserved()]; - particleCurrentParams = new float[pool.getNbReserved() * model->getSizeOfParticleCurrentArray()]; - particleExtendedParams = new float[pool.getNbReserved() * model->getSizeOfParticleExtendedArray()]; - - pool.clear(); - - // Destroys all the buffers - destroyAllBuffers(); - } - - void Group::setRenderer(Renderer* renderer) - { - decrementChildReference(this->renderer); - incrementChildReference(renderer); - - if ((bufferManagement)&&(renderer != this->renderer)) - { - if (this->renderer != NULL) this->renderer->destroyBuffers(*this); - if (renderer != NULL) renderer->createBuffers(*this); - } - - this->renderer = renderer; - } - - void Group::addEmitter(Emitter* emitter) - { - if (emitter == NULL) - return; - - // Checks if the emitter is already in the group (since 1.03.03) - std::vector::const_iterator it = std::find(emitters.begin(),emitters.end(),emitter); - if (it != emitters.end()) - return; - - incrementChildReference(emitter); - emitters.push_back(emitter); - } - - void Group::removeEmitter(Emitter* emitter) - { - std::vector::iterator it = std::find(emitters.begin(),emitters.end(),emitter); - if (it != emitters.end()) - { - decrementChildReference(emitter); - emitters.erase(it); - } - } - - void Group::addModifier(Modifier* modifier) - { - if (modifier == NULL) - return; - - incrementChildReference(modifier); - - if (bufferManagement) - modifier->createBuffers(*this); - - modifiers.push_back(modifier); - } - - void Group::removeModifier(Modifier* modifier) - { - std::vector::iterator it = std::find(modifiers.begin(),modifiers.end(),modifier); - if (it != modifiers.end()) - { - decrementChildReference(modifier); - - if (bufferManagement) - (*it)->createBuffers(*this); - - modifiers.erase(it); - } - } - - bool Group::update(float deltaTime) - { - unsigned int nbManualBorn = nbBufferedParticles; - unsigned int nbAutoBorn = 0; - - bool hasActiveEmitters = false; - - // Updates emitters - activeEmitters.clear(); - std::vector::const_iterator endIt = emitters.end(); - for (std::vector::const_iterator it = emitters.begin(); it != endIt; ++it) - { - if ((*it)->isActive()) - { - int nb = (*it)->updateNumber(deltaTime); - if (nb > 0) - { - EmitterData data = {*it,static_cast(nb)}; - activeEmitters.push_back(data); - nbAutoBorn += nb; - } - } - - hasActiveEmitters |= !((*it)->isSleeping()); - } - std::vector::iterator emitterIt = activeEmitters.begin(); - - unsigned int nbBorn = nbAutoBorn + nbManualBorn; - - // Inits bounding box - if (boundingBoxEnabled) - { - const float maxFloat = std::numeric_limits::max(); - AABBMin.set(maxFloat,maxFloat,maxFloat); - AABBMax.set(-maxFloat,-maxFloat,-maxFloat); - } - - // Prepare modifiers for processing - activeModifiers.clear(); - for (std::vector::iterator it = modifiers.begin(); it != modifiers.end(); ++it) - { - (*it)->beginProcess(*this); - if ((*it)->isActive()) - activeModifiers.push_back(*it); - } - - // Updates particles - for (size_t i = 0; i < pool.getNbActive(); ++i) - { - if ((pool[i].update(deltaTime))||((fupdate != NULL)&&((*fupdate)(pool[i],deltaTime)))) - { - if (fdeath != NULL) - (*fdeath)(pool[i]); - - if (nbBorn > 0) - { - pool[i].init(); - launchParticle(pool[i],emitterIt,nbManualBorn); - --nbBorn; - } - else - { - particleData[i].sqrDist = 0.0f; - pool.makeInactive(i); - --i; - } - } - else - { - if (boundingBoxEnabled) - updateAABB(pool[i]); - - if (distanceComputationEnabled) - pool[i].computeSqrDist(); - } - } - - // Terminates modifiers processing - for (std::vector::iterator it = modifiers.begin(); it != modifiers.end(); ++it) - (*it)->endProcess(*this); - - // Emits new particles if some left - for (int i = nbBorn; i > 0; --i) - pushParticle(emitterIt,nbManualBorn); - - // Sorts particles if enabled - if ((sortingEnabled)&&(pool.getNbActive() > 1)) - sortParticles(0,pool.getNbActive() - 1); - - if ((!boundingBoxEnabled)||(pool.getNbActive() == 0)) - { - AABBMin.set(0.0f,0.0f,0.0f); - AABBMax.set(0.0f,0.0f,0.0f); - } - - return (hasActiveEmitters)||(pool.getNbActive() > 0); - } - - void Group::pushParticle(std::vector::iterator& emitterIt,unsigned int& nbManualBorn) - { - Particle* ptr = pool.makeActive(); - if (ptr == NULL) - { - if (pool.getNbEmpty() > 0) - { - Particle p(this,pool.getNbActive()); - launchParticle(p,emitterIt,nbManualBorn); - pool.pushActive(p); - } - else if (nbManualBorn > 0) - popNextManualAdding(nbManualBorn); - } - else - { - ptr->init(); - launchParticle(*ptr,emitterIt,nbManualBorn); - } - } - - void Group::launchParticle(Particle& p,std::vector::iterator& emitterIt,unsigned int& nbManualBorn) - { - if (nbManualBorn == 0) - { - emitterIt->emitter->emit(p); - if (--emitterIt->nbParticles == 0) - ++emitterIt; - } - else - { - CreationData creationData = creationBuffer.front(); - - if (creationData.zone != NULL) - creationData.zone->generatePosition(p,creationData.full); - else - p.position() = creationData.position; - - if (creationData.emitter != NULL) - creationData.emitter->generateVelocity(p); - else - p.velocity() = creationData.velocity; - - popNextManualAdding(nbManualBorn); - } - - // Resets old position (fix 1.04.00) - p.oldPosition() = p.position(); - - // first parameter interpolation - // must be here so that the velocity has already been initialized - p.interpolateParameters(); - - if (fbirth != NULL) - (*fbirth)(p); - - if (boundingBoxEnabled) - updateAABB(p); - - if (distanceComputationEnabled) - p.computeSqrDist(); - } - - void Group::render() - { - if ((renderer == NULL)||(!renderer->isActive())) - return; - - renderer->render(*this); - } - - void Group::empty() - { - for (size_t i = 0; i < pool.getNbActive(); ++i) - particleData[i].sqrDist = 0.0f; - - pool.makeAllInactive(); - creationBuffer.clear(); - nbBufferedParticles = 0; - } - - void Group::flushAddedParticles() - { - unsigned int nbManualBorn = nbBufferedParticles; - std::vector::iterator emitterIt; // dummy emitterIt because we dont care - while(nbManualBorn > 0) - pushParticle(emitterIt,nbManualBorn); - } - - float Group::addParticles(const Vector3D& start,const Vector3D& end,Emitter* emitter,float step,float offset) - { - if ((step <= 0.0f)||(offset < 0.0f)) - return 0.0f; - - Vector3D displacement = end - start; - float totalDist = displacement.getNorm(); - - while(offset < totalDist) - { - Vector3D position = start; - position += displacement * offset / totalDist; - addParticles(1,position,Vector3D(),NULL,emitter); - offset += step; - } - - return offset - totalDist; - } - - float Group::addParticles(const Vector3D& start,const Vector3D& end,const Vector3D& velocity,float step,float offset) - { - if ((step <= 0.0f)||(offset < 0.0f)) - return 0.0f; - - Vector3D displacement = end - start; - float totalDist = displacement.getNorm(); - - while(offset < totalDist) - { - Vector3D position = start; - position += displacement * (offset / totalDist); - addParticles(1,position,velocity,NULL,NULL); - offset += step; - } - - return offset - totalDist; - } - - void Group::addParticles(unsigned int nb,const Vector3D& position,const Vector3D& velocity,const Zone* zone,Emitter* emitter,bool full) - { - if (nb == 0) - return; - - CreationData data = {nb,position,velocity,zone,emitter,full}; - creationBuffer.push_back(data); - nbBufferedParticles += nb; - } - - void Group::addParticles(unsigned int nb,Emitter* emitter) - { - addParticles(nb,Vector3D(),Vector3D(),emitter->getZone(),emitter,emitter->isFullZone()); - } - - void Group::addParticles(const Zone* zone,Emitter* emitter,float deltaTime,bool full) - { - addParticles(emitter->updateNumber(deltaTime),Vector3D(),Vector3D(),zone,emitter,full); - } - - void Group::addParticles(const Vector3D& position,Emitter* emitter,float deltaTime) - { - addParticles(emitter->updateNumber(deltaTime),position,Vector3D(),NULL,emitter); - } - - void Group::addParticles(Emitter* emitter,float deltaTime) - { - addParticles(emitter->updateNumber(deltaTime),Vector3D(),Vector3D(),emitter->getZone(),emitter,emitter->isFullZone()); - } - - void Group::sortParticles() - { - computeDistances(); - - if (sortingEnabled) - sortParticles(0,pool.getNbActive() - 1); - } - - void Group::computeDistances() - { - if (!distanceComputationEnabled) - return; - - Pool::const_iterator endIt = pool.end(); - for (Pool::iterator it = pool.begin(); it != endIt; ++it) - it->computeSqrDist(); - } - - void Group::computeAABB() - { - if ((!boundingBoxEnabled)||(pool.getNbActive() == 0)) - { - AABBMin.set(0.0f,0.0f,0.0f); - AABBMax.set(0.0f,0.0f,0.0f); - return; - } - - const float maxFloat = std::numeric_limits::max(); - AABBMin.set(maxFloat,maxFloat,maxFloat); - AABBMax.set(-maxFloat,-maxFloat,-maxFloat); - - Pool::iterator endIt = pool.end(); - for (Pool::iterator it = pool.begin(); it != endIt; ++it) - updateAABB(*it); - } - - void Group::reallocate(size_t capacity) - { - if (capacity > pool.getNbReserved()) - { - pool.reallocate(capacity); - - Particle::ParticleData* newData = new Particle::ParticleData[pool.getNbReserved()]; - float* newCurrentParams = new float[pool.getNbReserved() * model->getSizeOfParticleCurrentArray()]; - float* newExtendedParams = new float[pool.getNbReserved() * model->getSizeOfParticleExtendedArray()]; - - std::memcpy(newData,particleData,pool.getNbTotal() * sizeof(Particle::ParticleData)); - std::memcpy(newCurrentParams,particleCurrentParams,pool.getNbTotal() * sizeof(float) * model->getSizeOfParticleCurrentArray()); - std::memcpy(newExtendedParams,particleExtendedParams,pool.getNbTotal() * sizeof(float) * model->getSizeOfParticleExtendedArray()); - - delete[] particleData; - delete[] particleCurrentParams; - delete[] particleExtendedParams; - - particleData = newData; - particleCurrentParams = newCurrentParams; - particleExtendedParams = newExtendedParams; - - for (Pool::iterator it = pool.begin(); it != pool.endInactive(); ++it) - { - it->group = this; - it->data = particleData + it->index; - it->currentParams = particleCurrentParams + it->index * model->getSizeOfParticleCurrentArray(); - it->extendedParams = particleExtendedParams + it->index * model->getSizeOfParticleExtendedArray(); - } - - // Destroys all the buffers - destroyAllBuffers(); - } - } - - void Group::popNextManualAdding(unsigned int& nbManualBorn) - { - --creationBuffer.front().nb; - --nbManualBorn; - --nbBufferedParticles; - if (creationBuffer.front().nb <= 0) - creationBuffer.pop_front(); - } - - void Group::updateAABB(const Particle& particle) - { - const Vector3D& position = particle.position(); - if (AABBMin.x > position.x) - AABBMin.x = position.x; - if (AABBMin.y > position.y) - AABBMin.y = position.y; - if (AABBMin.z > position.z) - AABBMin.z = position.z; - if (AABBMax.x < position.x) - AABBMax.x = position.x; - if (AABBMax.y < position.y) - AABBMax.y = position.y; - if (AABBMax.z < position.z) - AABBMax.z = position.z; - } - - const void* Group::getParamAddress(ModelParam param) const - { - return particleCurrentParams + model->getParameterOffset(param); - } - - size_t Group::getParamStride() const - { - return model->getSizeOfParticleCurrentArray() * sizeof(float); - } - - Buffer* Group::createBuffer(const std::string& ID,const BufferCreator& creator,unsigned int flag,bool swapEnabled) const - { - destroyBuffer(ID); - - Buffer* buffer = creator.createBuffer(pool.getNbReserved(),*this); - - buffer->flag = flag; - buffer->swapEnabled = swapEnabled; - - additionalBuffers.insert(std::pair(ID,buffer)); - if (swapEnabled) - swappableBuffers.insert(buffer); - - return buffer; - } - - void Group::destroyBuffer(const std::string& ID) const - { - std::map::iterator it = additionalBuffers.find(ID); - - if (it != additionalBuffers.end()) - { - if (it->second->isSwapEnabled()) - swappableBuffers.erase(it->second); - delete it->second; - additionalBuffers.erase(it); - - } - } - - void Group::destroyAllBuffers() const - { - for (std::map::const_iterator it = additionalBuffers.begin(); it != additionalBuffers.end(); ++it) - delete it->second; - additionalBuffers.clear(); - swappableBuffers.clear(); - } - - Buffer* Group::getBuffer(const std::string& ID,unsigned int flag) const - { - Buffer* buffer = getBuffer(ID); - - if ((buffer != NULL)&&(buffer->flag == flag)) - return buffer; - - return NULL; - } - - Buffer* Group::getBuffer(const std::string& ID) const - { - std::map::const_iterator it = additionalBuffers.find(ID); - - if (it != additionalBuffers.end()) - return it->second; - - return NULL; - } - - void Group::enableBuffersManagement(bool manage) - { - bufferManagement = manage; - } - - bool Group::isBuffersManagementEnabled() - { - return bufferManagement; - } - - void Group::sortParticles(int start,int end) - { - if (start < end) - { - int i = start - 1; - int j = end + 1; - float pivot = particleData[(start + end) >> 1].sqrDist; - while (true) - { - do ++i; - while (particleData[i].sqrDist > pivot); - do --j; - while (particleData[j].sqrDist < pivot); - if (i < j) - swapParticles(pool[i],pool[j]); - else break; - } - - sortParticles(start,j); - sortParticles(j + 1,end); - } - } - - void Group::propagateUpdateTransform() - { - for (std::vector::const_iterator emitterIt = emitters.begin(); emitterIt != emitters.end(); ++emitterIt) - (*emitterIt)->updateTransform(this); - for (std::vector::const_iterator modifierIt = modifiers.begin(); modifierIt != modifiers.end(); ++modifierIt) - if ((*modifierIt)->isLocalToSystem()) - (*modifierIt)->updateTransform(this); - } - - Model& Group::getDefaultModel() - { - static Model defaultModel; - return defaultModel; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Interpolator.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Interpolator.cpp deleted file mode 100644 index c7cd19645..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Interpolator.cpp +++ /dev/null @@ -1,150 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Interpolator.h" -#include "Core/SPK_Model.h" -#include "Core/SPK_Particle.h" - - -namespace SPK -{ - Interpolator::computeXFn Interpolator::COMPUTE_X_FN[4] = - { - &Interpolator::computeXLifeTime, - &Interpolator::computeXAge, - &Interpolator::computeXParam, - &Interpolator::computeXVelocity, - }; - - Interpolator::Interpolator() : - graph(), - type(INTERPOLATOR_LIFETIME), - param(PARAM_SIZE), - scaleXVariation(0.0f), - offsetXVariation(0.0f), - loopingEnabled(false) - {} - - float Interpolator::computeXLifeTime(const Particle& particle) const - { - return particle.getAge() / (particle.getAge() + particle.getLifeLeft()); - } - - float Interpolator::computeXAge(const Particle& particle) const - { - return particle.getAge(); - } - - float Interpolator::computeXParam(const Particle& particle) const - { - return particle.getParamCurrentValue(param); - } - - float Interpolator::computeXVelocity(const Particle& particle) const - { - return particle.velocity().getSqrNorm(); - } - - float Interpolator::interpolate(const Particle& particle,ModelParam interpolatedParam,float ratioY,float offsetX,float scaleX) - { - // First finds the current X of the particle - InterpolatorEntry currentKey((this->*Interpolator::COMPUTE_X_FN[type])(particle)); - currentKey.x += offsetX; // Offsets it - currentKey.x *= scaleX; // Scales it - - if (loopingEnabled) - { - // If the graph has les than 2 entries, we cannot loop - if (graph.size() < 2) - { - if (graph.empty()) - return Model::getDefaultValue(interpolatedParam); - else - return interpolateY(*(graph.begin()),ratioY); - } - - // Else finds the current X in the range - const float beginX = graph.begin()->x; - const float rangeX = graph.rbegin()->x - beginX; - float newX = (currentKey.x - beginX) / rangeX; - newX -= static_cast(newX); - if (newX < 0.0f) - newX = 1.0f + newX; - currentKey.x = beginX + newX * rangeX; - } - - // Gets the entry that is immediatly after the current X - std::set::const_iterator nextIt = graph.upper_bound(currentKey); - - // If the current X is higher than the one of the last entry - if (nextIt == graph.end()) - { - if (graph.empty()) // If the graph has no entry, sets the default value - return Model::getDefaultValue(interpolatedParam); - else // Else sets the value of the last entry - return interpolateY(*(--nextIt),ratioY); - } - else if (nextIt == graph.begin()) // If the current X is lower than the first entry, sets the value to the first entry - { - return interpolateY(*nextIt,ratioY); - } - else // Else interpolated between the entries before and after the current X - { - const InterpolatorEntry& nextEntry = *nextIt; - const InterpolatorEntry& previousEntry = *(--nextIt); - float y0 = interpolateY(previousEntry,ratioY); - float y1 = interpolateY(nextEntry,ratioY); - - float ratioX = (currentKey.x - previousEntry.x) / (nextEntry.x - previousEntry.x); - return y0 + ratioX * (y1 - y0); - } - } - - void Interpolator::generateSinCurve(float period,float amplitudeMin,float amplitudeMax,float offsetX,float offsetY,float startX,unsigned int length,unsigned int nbSamples) - { - // First clear any previous entry - clearGraph(); - - const float PI = 3.1415926535897932384626433832795f; - - for (size_t i = 0; i < nbSamples; ++i) - { - float x = startX + i * period * length / (nbSamples - 1); - float sin = std::sin((x + offsetX) * 2 * PI / period); - addEntry(x,amplitudeMin * sin + offsetY,amplitudeMax * sin + offsetY); - } - } - - void Interpolator::generatePolyCurve(float constant,float linear,float quadratic,float cubic,float startX,float endX,unsigned int nbSamples) - { - // First clear any previous entry - clearGraph(); - - for (size_t i = 0; i < nbSamples; ++i) - { - float x = startX + i * (endX - startX) / (nbSamples - 1); - float x2 = x * x; - float x3 = x2 * x; - addEntry(x,constant + x * linear + x2 * quadratic + x3 * cubic); - } - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Model.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Model.cpp deleted file mode 100644 index 35b05ec75..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Model.cpp +++ /dev/null @@ -1,299 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Model.h" -#include "Core/SPK_Interpolator.h" - -namespace SPK -{ - const float Model::DEFAULT_VALUES[NB_PARAMS] = - { - 1.0f, // RED - 1.0f, // GREEN - 1.0f, // BLUE - 1.0f, // ALPHA - 1.0f, // SIZE - 1.0f, // MASS - 0.0f, // ANGLE - 0.0f, // TEXTURE_INDEX - 0.0f, // ROTATION_SPEED - 0.0f, // CUSTOM_0 - 0.0f, // CUSTOM_1 - 0.0f, // CUSTOM_2 - }; - - Model::Model(int enableFlag,int mutableFlag,int randomFlag,int interpolatedFlag) : - Registerable(), - lifeTimeMin(1.0f), - lifeTimeMax(1.0f), - immortal(false), - paramsSize(0), - nbEnableParams(0), - nbMutableParams(0), - nbRandomParams(0), - nbInterpolatedParams(0) - { - enableFlag |= FLAG_RED | FLAG_GREEN | FLAG_BLUE; // Adds the color parameters to the enable flag - this->enableFlag = enableFlag & ((1 << (NB_PARAMS + 1)) - 1); // masks the enable flag with the existing parameters - this->interpolatedFlag = interpolatedFlag & this->enableFlag; // masks the interpolated flag with the enable flag - this->mutableFlag = mutableFlag & this->enableFlag; // masks the mutable flag with the enable flag - this->mutableFlag &= ~this->interpolatedFlag; // a param cannot be both interpolated and mutable - this->randomFlag = randomFlag & this->enableFlag; // masks the random flag with the enable flag - this->randomFlag &= ~this->interpolatedFlag; // a param cannot be both interpolated and random - - int particleEnableParamsSize = 0; - int particleMutableParamsSize = 0; - for (size_t i = 0; i < NB_PARAMS; ++i) - { - ModelParam param = static_cast(i); - - int paramSize = 0; - if (isEnabled(param)) - { - ++nbEnableParams; - if (!isInterpolated(param)) - { - interpolators[i] = NULL; - paramSize = 1; - if (isMutable(param)) - { - paramSize = 2; - ++nbMutableParams; - } - if (isRandom(param)) - { - paramSize <<= 1; - ++nbRandomParams; - } - } - else - { - interpolators[i] = new Interpolator(); // Creates the interpolator - ++nbInterpolatedParams; - } - } - else - interpolators[i] = NULL; - - particleEnableIndices[i] = particleEnableParamsSize; - particleMutableIndices[i] = particleMutableParamsSize; - particleEnableParamsSize += isEnabled(param) >> i; - particleMutableParamsSize += isMutable(param) >> i; - - indices[i] = paramsSize; - paramsSize += paramSize; - } - - // creates the array of params for this model - if (paramsSize > 0) - { - params = new float[paramsSize]; - unsigned int currentParamIndex = 0; - unsigned int currentIndex = 0; - while (currentIndex < paramsSize) - { - unsigned int nbValues = getNbValues(static_cast(currentParamIndex)); - for (size_t i = 0; i < nbValues; ++i) - params[currentIndex + i] = DEFAULT_VALUES[currentParamIndex]; - ++currentParamIndex; - currentIndex += nbValues; - } - } - else - params = NULL; - - if (nbEnableParams > 0) - { - enableParams = new int[nbEnableParams]; - size_t index = 0; - for (size_t i = 0; i < NB_PARAMS; ++i) - if (isEnabled(static_cast(i))) - enableParams[index++] = i; - } - else - enableParams = NULL; - - if (nbMutableParams > 0) - { - mutableParams = new int[nbMutableParams]; - size_t index = 0; - for (size_t i = 0; i < NB_PARAMS; ++i) - if (isMutable(static_cast(i))) - mutableParams[index++] = i; - } - else - mutableParams = NULL; - - if (nbInterpolatedParams > 0) - { - interpolatedParams = new int[nbInterpolatedParams]; - size_t index = 0; - for (size_t i = 0; i < NB_PARAMS; ++i) - if (isInterpolated(static_cast(i))) - interpolatedParams[index++] = i; - } - else - interpolatedParams = NULL; - } - - Model::Model(const Model& model) : - Registerable(model), - lifeTimeMin(model.lifeTimeMin), - lifeTimeMax(model.lifeTimeMax), - immortal(model.immortal), - paramsSize(model.paramsSize), - nbEnableParams(model.nbEnableParams), - nbMutableParams(model.nbMutableParams), - nbRandomParams(model.nbRandomParams), - nbInterpolatedParams(model.nbInterpolatedParams), - enableFlag(model.enableFlag), - mutableFlag(model.mutableFlag), - randomFlag(model.randomFlag), - interpolatedFlag(model.interpolatedFlag), - params(NULL), - enableParams(NULL), - mutableParams(NULL), - interpolatedParams(NULL) - { - if (paramsSize > 0) - { - params = new float[paramsSize]; - for (size_t i = 0; i < paramsSize; ++i) - params[i] = model.params[i]; - } - - if (nbEnableParams > 0) - { - enableParams = new int[nbEnableParams]; - for (size_t i = 0; i < nbEnableParams; ++i) - enableParams[i] = model.enableParams[i]; - } - - if (nbMutableParams > 0) - { - mutableParams = new int[nbMutableParams]; - for (size_t i = 0; i < nbMutableParams; ++i) - mutableParams[i] = model.mutableParams[i]; - } - - if (nbInterpolatedParams > 0) - { - interpolatedParams = new int[nbMutableParams]; - for (size_t i = 0; i < nbInterpolatedParams; ++i) - interpolatedParams[i] = model.interpolatedParams[i]; - } - - for (size_t i = 0; i < NB_PARAMS; ++i) - { - indices[i] = model.indices[i]; - particleEnableIndices[i] = model.particleEnableIndices[i]; - particleMutableIndices[i] = model.particleMutableIndices[i]; - if (model.interpolators[i] != NULL) - interpolators[i] = new Interpolator(*model.interpolators[i]); - else - interpolators[i] = NULL; - } - } - - Model::~Model() - { - delete[] enableParams; - delete[] mutableParams; - delete[] interpolatedParams; - delete[] params; - - for (size_t i = 0; i < NB_PARAMS; ++i) - delete interpolators[i]; - } - - bool Model::setParam(ModelParam type,float startMin,float startMax,float endMin,float endMax) - { - // if the given param doesnt have 4 values, return - if (getNbValues(type) != 4) - return false; - - // Sets the values at the right position in params - float* ptr = params + indices[type]; - *ptr++ = startMin; - *ptr++ = startMax; - *ptr++ = endMin; - *ptr = endMax; - - return true; - } - - bool Model::setParam(ModelParam type,float value0,float value1) - { - // if the given param doesnt have 2 values, return - if (getNbValues(type) != 2) - return false; - - // Sets the values at the right position in params - float* ptr = params + indices[type]; - *ptr++ = value0; - *ptr = value1; - - return true; - } - - bool Model::setParam(ModelParam type,float value) - { - // if the given param doesnt have 1 value, return - if (getNbValues(type) != 1) - return false; - - // Sets the value at the right position in params - params[indices[type]] = value; - - return true; - } - - float Model::getParamValue(ModelParam type,size_t index) const - { - unsigned int nbValues = getNbValues(type); - - if (index < nbValues) - return params[indices[type] + index]; - - return DEFAULT_VALUES[type]; - } - - unsigned int Model::getNbValues(ModelParam type) const - { - int value = 1 << type; - if (!(enableFlag & value) || (interpolatedFlag & value)) - return 0; - - if (!(mutableFlag & value) && !(randomFlag & value)) - return 1; - - if ((mutableFlag & value) && (randomFlag & value)) - return 4; - - return 2; - } - - float Model::getDefaultValue(ModelParam param) - { - return DEFAULT_VALUES[param]; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Modifier.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Modifier.cpp deleted file mode 100644 index 4ccd8ac30..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Modifier.cpp +++ /dev/null @@ -1,101 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Core/SPK_Modifier.h" - -namespace SPK -{ - Vector3D Modifier::intersection; - Vector3D Modifier::normal; - - Modifier::Modifier(int availableTriggers,ModifierTrigger trigger,bool needsIntersection,bool needsNormal,Zone* zone) : - Registerable(), - Transformable(), - BufferHandler(), - availableTriggers(availableTriggers), - trigger(trigger), - zone(zone), - needsIntersection(needsIntersection), - needsNormal(needsNormal), - full(false), - active(true), - local(false) - {} - - void Modifier::registerChildren(bool registerAll) - { - Registerable::registerChildren(registerAll); - registerChild(zone,registerAll); - } - - void Modifier::copyChildren(const Registerable& object,bool createBase) - { - const Modifier& modifier = dynamic_cast(object); - Registerable::copyChildren(modifier,createBase); - zone = dynamic_cast(copyChild(modifier.zone,createBase)); - } - - void Modifier::destroyChildren(bool keepChildren) - { - destroyChild(zone,keepChildren); - Registerable::destroyChildren(keepChildren); - } - - Registerable* Modifier::findByName(const std::string& name) - { - Registerable* object = Registerable::findByName(name); - if ((object != NULL)||(zone == NULL)) - return object; - - return zone->findByName(name); - } - - void Modifier::setZone(Zone* zone,bool full) - { - decrementChildReference(this->zone); - incrementChildReference(zone); - - this->zone = zone; - this->full = full; - } - - bool Modifier::setTrigger(ModifierTrigger trigger) - { - if ((trigger & availableTriggers) != 0) - { - this->trigger = trigger; - return true; - } - - return false; - } - - void Modifier::beginProcess(Group& group) - { - savedActive = active; - - if (!active) - return; - - if (!prepareBuffers(group)) - active = false; // if buffers of the modifier in the group are not ready, the modifier is made incative for the frame - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Particle.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Particle.cpp deleted file mode 100644 index 90ed50127..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Particle.cpp +++ /dev/null @@ -1,237 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_Modifier.h" -#include "Core/SPK_System.h" -#include "Core/SPK_Buffer.h" -#include "Core/SPK_Interpolator.h" - - -namespace SPK -{ - Particle::Particle(Group* group,size_t index) : - group(group), - index(index), - data(group->particleData + index), - currentParams(group->particleCurrentParams + index * group->model->getSizeOfParticleCurrentArray()), - extendedParams(group->particleExtendedParams + index * group->model->getSizeOfParticleExtendedArray()) - { - init(); - } - - void Particle::init() - { - const Model* model = group->getModel(); - data->age = 0.0f; - data->life = random(model->lifeTimeMin,model->lifeTimeMax); - - // creates pseudo-iterators to parse arrays - float* particleCurrentIt = currentParams; - float* particleMutableIt = extendedParams; - float* particleInterpolatedIt = extendedParams + model->nbMutableParams; - const int* paramIt = model->enableParams; - - // initializes params - for (size_t i = model->nbEnableParams; i != 0; --i) - { - ModelParam param = static_cast(*paramIt); - const float* templateIt = &model->params[model->indices[param]]; - - if (model->isInterpolated(param)) - { - *particleCurrentIt++ = Model::DEFAULT_VALUES[param]; - *particleInterpolatedIt++ = random(0.0f,1.0f); // ratioY - - Interpolator* interpolator = model->interpolators[param]; - float offsetVariation = interpolator->getOffsetXVariation(); - float scaleVariation = interpolator->getScaleXVariation(); - - *particleInterpolatedIt++ = random(-offsetVariation,offsetVariation); // offsetX - *particleInterpolatedIt++ = 1.0f + random(-scaleVariation,scaleVariation); // scaleX - } - else if (model->isRandom(param)) - { - *particleCurrentIt++ = random(*templateIt,*(templateIt + 1)); - if (model->isMutable(param)) - *particleMutableIt++ = random(*(templateIt + 2),*(templateIt + 3)); - } - else - { - *particleCurrentIt++ = *templateIt; - if (model->isMutable(param)) - *particleMutableIt++ = *(templateIt + 1); - } - - ++paramIt; - } - } - - void Particle::interpolateParameters() - { - const Model* model = group->getModel(); - - float* interpolatedIt = extendedParams + model->nbMutableParams; - for (size_t i = 0; i < model->nbInterpolatedParams; ++i) - { - size_t index = model->interpolatedParams[i]; - size_t enableIndex = model->particleEnableIndices[index]; - currentParams[enableIndex] = model->interpolators[index]->interpolate(*this,static_cast(index),interpolatedIt[0],interpolatedIt[1],interpolatedIt[2]); - interpolatedIt += 3; - } - } - - bool Particle::update(float deltaTime) - { - const Model* model = group->getModel(); - data->age += deltaTime; - - if (!model->immortal) - { - // computes the ratio between the life of the particle and its lifetime - float ratio = std::min(1.0f,deltaTime / data->life); - data->life -= deltaTime; - - // updates mutable parameters - for (size_t i = 0; i < model->nbMutableParams; ++i) - { - size_t index = model->mutableParams[i]; - size_t enableIndex = model->particleEnableIndices[index]; - currentParams[enableIndex] += (extendedParams[i] - currentParams[enableIndex]) * ratio; - } - } - - // updates interpolated parameters - interpolateParameters(); - - // updates position - oldPosition() = position(); - position() += velocity() * deltaTime; - - // updates velocity - velocity() += group->getGravity() * deltaTime; - - std::vector::const_iterator end = group->activeModifiers.end(); - for (std::vector::const_iterator it = group->activeModifiers.begin(); it != end; ++it) - (*it)->process(*this,deltaTime); - - if (group->getFriction() != 0.0f) - velocity() *= 1.0f - std::min(1.0f,group->getFriction() * deltaTime / getParamCurrentValue(PARAM_MASS)); - - return data->life <= 0.0f; - } - - bool Particle::setParamCurrentValue(ModelParam type,float value) - { - const Model* const model = group->getModel(); - if (model->isEnabled(type)) - { - currentParams[model->particleEnableIndices[type]] = value; - return true; - } - - return false; - } - - bool Particle::setParamFinalValue(ModelParam type,float value) - { - const Model* const model = group->getModel(); - if (model->isMutable(type)) - { - extendedParams[model->particleMutableIndices[type]] = value; - return true; - } - - return false; - } - - bool Particle::changeParamCurrentValue(ModelParam type,float delta) - { - const Model* const model = group->getModel(); - if (model->isEnabled(type)) - { - currentParams[model->particleEnableIndices[type]] += delta; - return true; - } - - return false; - } - - bool Particle::changeParamFinalValue(ModelParam type,float delta) - { - const Model* const model = group->getModel(); - if (model->isMutable(type)) - { - extendedParams[model->particleMutableIndices[type]] += delta; - return true; - } - - return false; - } - - float Particle::getParamCurrentValue(ModelParam type) const - { - const Model* const model = group->getModel(); - if (model->isEnabled(type)) - return currentParams[model->particleEnableIndices[type]]; - - return Model::DEFAULT_VALUES[type]; - } - - float Particle::getParamFinalValue(ModelParam type) const - { - const Model* const model = group->getModel(); - if (model->isEnabled(type)) - { - if (model->isMutable(type)) - return extendedParams[model->particleMutableIndices[type] + 1]; - return currentParams[model->particleEnableIndices[type]]; - } - - return Model::DEFAULT_VALUES[type]; - } - - Model* Particle::getModel() const - { - return group->getModel(); - } - - void Particle::computeSqrDist() - { - data->sqrDist = getSqrDist(position(),System::getCameraPosition()); - } - - extern void swapParticles(Particle& a,Particle& b) - { - //std::swap(a.index,b.index); - std::swap(*a.data,*b.data); - for (size_t i = 0; i < a.getModel()->getSizeOfParticleCurrentArray(); ++i) - std::swap(a.currentParams[i],b.currentParams[i]); - for (size_t i = 0; i < a.getModel()->getSizeOfParticleExtendedArray(); ++i) - std::swap(a.extendedParams[i],b.extendedParams[i]); - - // swap additional data (groups are assumed to be the same) - for (std::set::iterator it = a.group->swappableBuffers.begin(); it != a.group->swappableBuffers.end(); ++it) - (*it)->swap(a.index,b.index); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Registerable.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Registerable.cpp deleted file mode 100644 index e179fb167..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Registerable.cpp +++ /dev/null @@ -1,118 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Registerable.h" -#include "Core/SPK_Factory.h" - -namespace SPK -{ - const SPK_ID NO_ID(0); - const std::string NO_NAME; - - Registerable::Registerable() : - ID(NO_ID), - nbReferences(0), - shared(false), - destroyable(true), - name(NO_NAME) - {} - - Registerable::Registerable(const Registerable& registerable) : - ID(NO_ID), - nbReferences(0), - shared(registerable.shared), - destroyable(registerable.destroyable), - name(registerable.name) - {} - - Registerable::~Registerable(){} - - Registerable* Registerable::copyChild(Registerable* child,bool createBase) - { - if (child == NULL) - return NULL; - - if (((child->isRegistered())&&(!child->isShared()))||(createBase)) - { - if (SPKFactory::getInstance().isAlreadyProcessed(child)) - { - Registerable* processedClone = SPKFactory::getInstance().getProcessedObject(child); - processedClone->incrementReference(); - return processedClone; - } - - Registerable* cloneChild = child->clone(createBase); - SPKFactory::getInstance().registerObject(cloneChild); - cloneChild->incrementReference(); - SPKFactory::getInstance().markAsProcessed(child,cloneChild); - return cloneChild; - } - - child->incrementReference(); - return child; - } - - bool Registerable::destroyChild(Registerable* child,bool keepChildren) - { - if ((child == NULL)||(keepChildren)) - return false; - - child->decrementReference(); - - if ((child->isRegistered())&& - (child->isDestroyable())&& - (child->getNbReferences() == 0)) - { - SPKFactory::getInstance().unregisterObject(child->getSPKID()); - return true; - } - - return false; - } - - void Registerable::registerChild(Registerable* child,bool registerAll) - { - if (child == NULL) - return; - - if (child->isRegistered()) - { - child->incrementReference(); - child->registerChildren(registerAll); - } - else if (registerAll) - { - SPKFactory::getInstance().registerObject(child); - child->incrementReference(); - child->registerChildren(registerAll); - } - } - - void Registerable::registerObject(Registerable* obj,bool registerAll) - { - if ((obj != NULL)&&(!obj->isRegistered())) - { - SPKFactory::getInstance().registerObject(obj); - obj->registerChildren(registerAll); - } - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Renderer.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Renderer.cpp deleted file mode 100644 index 5dd891bca..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Renderer.cpp +++ /dev/null @@ -1,37 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Renderer.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Renderer::Renderer() : - Registerable(), - BufferHandler(), - active(true), - renderingHintsMask(DEPTH_TEST | DEPTH_WRITE), - alphaThreshold(1.0f) - {} - - Renderer::~Renderer(){} -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_System.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_System.cpp deleted file mode 100644 index 6147fe465..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_System.cpp +++ /dev/null @@ -1,331 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_System.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_Vector3D.h" -#include "Core/SPK_Emitter.h" -#include "Core/SPK_Modifier.h" - -namespace SPK -{ - Vector3D System::cameraPosition; - - StepMode System::stepMode(STEP_REAL); - float System::constantStep(0.0f); - float System::minStep(0.0f); - float System::maxStep(0.0f); - - bool System::clampStepEnabled(false); - float System::clampStep(1.0f); - - System::System() : - Registerable(), - Transformable(), - groups(), - nbParticles(0), - boundingBoxEnabled(false), - AABBMin(), - AABBMax(), - deltaStep(0.0f) - {} - - void System::registerChildren(bool registerAll) - { - Registerable::registerChildren(registerAll); - - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - registerChild(*it,registerAll); - } - - void System::copyChildren(const Registerable& object,bool createBase) - { - const System& system = dynamic_cast(object); - Registerable::copyChildren(system,createBase); - - // we clear the copies of pointers pushed in the vectors by the copy constructor - groups.clear(); - - for (std::vector::const_iterator it = system.groups.begin(); it != system.groups.end(); ++it) - groups.push_back(dynamic_cast(copyChild(*it,createBase))); - } - - void System::destroyChildren(bool keepChildren) - { - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - destroyChild(*it,keepChildren); - - Registerable::destroyChildren(keepChildren); - } - - void System::addGroup(Group* group) - { - incrementChildReference(group); - groups.push_back(group); - nbParticles += group->getNbParticles(); - } - - void System::removeGroup(Group* group) - { - std::vector::iterator it = std::find(groups.begin(),groups.end(),group); - if (it != groups.end()) - { - decrementChildReference(group); - groups.erase(it); - } - } - - size_t System::computeNbParticles() - { - nbParticles = 0; - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - nbParticles += (*it)->getNbParticles(); - return nbParticles; - } - - bool System::innerUpdate(float deltaTime) - { - nbParticles = 0; - bool isAlive = false; - - bool hasGroupsWithAABB = false; - if (boundingBoxEnabled) - { - const float maxFloat = std::numeric_limits::max(); - AABBMin.set(maxFloat,maxFloat,maxFloat); - AABBMax.set(-maxFloat,-maxFloat,-maxFloat); - } - - for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) - { - isAlive |= (*it)->update(deltaTime); - nbParticles += (*it)->getNbParticles(); - - if ((boundingBoxEnabled)&&((*it)->isAABBComputingEnabled())) - { - Vector3D groupMin = (*it)->getAABBMin(); - Vector3D groupMax = (*it)->getAABBMax(); - if (AABBMin.x > groupMin.x) - AABBMin.x = groupMin.x; - if (AABBMin.y > groupMin.y) - AABBMin.y = groupMin.y; - if (AABBMin.z > groupMin.z) - AABBMin.z = groupMin.z; - if (AABBMax.x < groupMax.x) - AABBMax.x = groupMax.x; - if (AABBMax.y < groupMax.y) - AABBMax.y = groupMax.y; - if (AABBMax.z < groupMax.z) - AABBMax.z = groupMax.z; - hasGroupsWithAABB = true; - } - } - - if ((!boundingBoxEnabled)||(!hasGroupsWithAABB)) - { - AABBMin.set(0.0f,0.0f,0.0f); - AABBMax.set(0.0f,0.0f,0.0f); - } - - return isAlive; - } - - bool System::update(float deltaTime) - { - if ((clampStepEnabled)&&(deltaTime > clampStep)) - deltaTime = clampStep; - - if (stepMode != STEP_REAL) - { - deltaTime += deltaStep; - - float updateStep; - if (stepMode == STEP_ADAPTIVE) - { - if (deltaTime > maxStep) - updateStep = maxStep; - else if (deltaTime < minStep) - updateStep = minStep; - else - { - deltaStep = 0.0f; - return innerUpdate(deltaTime); - } - } - else - updateStep = constantStep; - - bool isAlive = true; - while(deltaTime >= updateStep) - { - if ((isAlive)&&(!innerUpdate(updateStep))) - isAlive = false; - deltaTime -= updateStep; - } - deltaStep = deltaTime; - return isAlive; - - } - else - return innerUpdate(deltaTime); - } - - void System::render() const - { - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - (*it)->render(); - } - - void System::grow(float time,float step) - { - if (step <= 0.0f) - step = time; - - while (time > 0.0f) - { - float currentStep = time > step ? step : time; - update(currentStep); - time -= currentStep; - } - } - - void System::empty() - { - for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) - (*it)->empty(); - nbParticles = 0; - } - - void System::setCameraPosition(const Vector3D& cameraPosition) - { - System::cameraPosition = cameraPosition; - } - - void System::setClampStep(bool enableClampStep,float clamp) - { - clampStepEnabled = enableClampStep; - clampStep = clamp; - } - - void System::useConstantStep(float constantStep) - { - stepMode = STEP_CONSTANT; - System::constantStep = constantStep; - } - - void System::useAdaptiveStep(float minStep,float maxStep) - { - stepMode = STEP_ADAPTIVE; - System::minStep = minStep; - System::maxStep = maxStep; - } - - void System::useRealStep() - { - stepMode = STEP_REAL; - } - - const Vector3D& System::getCameraPosition() - { - return cameraPosition; - } - - StepMode System::getStepMode() - { - return stepMode; - } - - void System::sortParticles() - { - for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) - (*it)->sortParticles(); - } - - void System::computeDistances() - { - for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) - (*it)->computeDistances(); - } - - void System::computeAABB() - { - if (boundingBoxEnabled) - { - const float maxFloat = std::numeric_limits::max(); - AABBMin.set(maxFloat,maxFloat,maxFloat); - AABBMax.set(-maxFloat,-maxFloat,-maxFloat); - } - - bool hasGroupsWithAABB = false; - for (std::vector::iterator it = groups.begin(); it != groups.end(); ++it) - { - (*it)->computeAABB(); - - if ((boundingBoxEnabled)&&((*it)->isAABBComputingEnabled())) - { - Vector3D groupMin = (*it)->getAABBMin(); - Vector3D groupMax = (*it)->getAABBMax(); - if (AABBMin.x > groupMin.x) - AABBMin.x = groupMin.x; - if (AABBMin.y > groupMin.y) - AABBMin.y = groupMin.y; - if (AABBMin.z > groupMin.z) - AABBMin.z = groupMin.z; - if (AABBMax.x < groupMax.x) - AABBMax.x = groupMax.x; - if (AABBMax.y < groupMax.y) - AABBMax.y = groupMax.y; - if (AABBMax.z < groupMax.z) - AABBMax.z = groupMax.z; - hasGroupsWithAABB = true; - } - } - - if ((!boundingBoxEnabled)||(!hasGroupsWithAABB)) - { - const Vector3D pos = getWorldTransformPos(); - AABBMin = AABBMax = pos; - } - } - - Registerable* System::findByName(const std::string& name) - { - Registerable* object = Registerable::findByName(name); - if (object != NULL) - return object; - - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - { - object = (*it)->findByName(name); - if (object != NULL) - return object; - } - - return NULL; - } - - void System::propagateUpdateTransform() - { - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - (*it)->updateTransform(this); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Transformable.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Transformable.cpp deleted file mode 100644 index 0422b5ac8..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Transformable.cpp +++ /dev/null @@ -1,239 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Transformable.h" -#include "Core/SPK_Zone.h" - -namespace SPK -{ - const float Transformable::IDENTITY[] = - { - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - }; - - Transformable::Transformable() : - currentUpdate(0), - lastUpdate(0), - lastParentUpdate(0), - parent(NULL), - localIdentity(true) - { - std::memcpy(local,IDENTITY,sizeof(float) * TRANSFORM_LENGTH); - std::memcpy(world,IDENTITY,sizeof(float) * TRANSFORM_LENGTH); - } - - Transformable::Transformable(const Transformable& transformable) : - currentUpdate(0), - lastUpdate(0), - lastParentUpdate(0), - parent(NULL), - localIdentity(transformable.localIdentity) - { - std::memcpy(local,transformable.local,sizeof(float) * TRANSFORM_LENGTH); - std::memcpy(world,transformable.world,sizeof(float) * TRANSFORM_LENGTH); - } - - void Transformable::setTransformNC(const float* transform) - { - for (size_t i = 0; i < TRANSFORM_LENGTH; ++i) - local[i] = transform[(i >> 2) + ((i & 3) << 2)]; // conversion - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformPosition(const Vector3D& pos) - { - local[12] = pos.x; - local[13] = pos.y; - local[14] = pos.z; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientationRH(Vector3D look,Vector3D up) - { - look.normalize(); - up.normalize(); - - Vector3D side = crossProduct(look,up); - side.normalize(); - - up = crossProduct(side,look); - - local[0] = side.x; - local[1] = side.y; - local[2] = side.z; - local[4] = up.x; - local[5] = up.y; - local[6] = up.z; - local[8] = -look.x; - local[9] = -look.y; - local[10] = -look.z; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientationLH(Vector3D look,Vector3D up) - { - look.normalize(); - - Vector3D side = crossProduct(look,up); - side.normalize(); - - up = crossProduct(side,look); - - local[0] = side.x; - local[1] = side.y; - local[2] = side.z; - local[4] = up.x; - local[5] = up.y; - local[6] = up.z; - local[8] = look.x; - local[9] = look.y; - local[10] = look.z; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientation(Vector3D axis,float angle) - { - axis.normalize(); - float c = std::cos(angle); - float s = std::sin(angle); - float a = 1 - c; - Vector3D axis2(axis.x * axis.x,axis.y * axis.y,axis.z * axis.z); - - local[0] = axis2.x + (1 - axis2.x) * c; - local[1] = axis.x * axis.y * a + axis.z * s; - local[2] = axis.x * axis.z * a - axis.y * s; - local[4] = axis.x * axis.y * a - axis.z * s; - local[5] = axis2.y + (1 - axis2.y) * c; - local[6] = axis.y * axis.z * a + axis.x * s; - local[8] = axis.x * axis.z * a + axis.y * s; - local[9] = axis.y * axis.z * a - axis.x * s; - local[10] = axis2.z + (1 - axis2.z) * c; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientationX(float angle) - { - float cosA = std::cos(angle); - float sinA = std::sin(angle); - - local[0] = 1.0f; - local[1] = 0.0f; - local[2] = 0.0f; - local[4] = 0.0f; - local[5] = cosA; - local[6] = sinA; - local[8] = 0.0f; - local[9] = -sinA; - local[10] = cosA; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientationY(float angle) - { - float cosA = std::cos(angle); - float sinA = std::sin(angle); - - local[0] = cosA; - local[1] = 0.0f; - local[2] = -sinA; - local[4] = 0.0f; - local[5] = 1.0f; - local[6] = 0.0f; - local[8] = sinA; - local[9] = 0.0f; - local[10] = cosA; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::setTransformOrientationZ(float angle) - { - float cosA = std::cos(angle); - float sinA = std::sin(angle); - - local[0] = cosA; - local[1] = sinA; - local[2] = 0.0f; - local[4] = -sinA; - local[5] = cosA; - local[6] = 0.0f; - local[8] = 0.0f; - local[9] = 0.0f; - local[10] = 1.0f; - - localIdentity = false; - notifyForUpdate(); - } - - void Transformable::updateTransform(const Transformable* parent) - { - if (isUpdateNotified() || // the local transform or instance param have been updated - parent != this->parent || // the parent has changed - (parent != NULL && lastParentUpdate != parent->currentUpdate)) // the parent transform has been modified - { - if (parent == NULL) - std::memcpy(world,local,sizeof(float) * TRANSFORM_LENGTH); - else if (isLocalIdentity()) - { - std::memcpy(world,parent->world,sizeof(float) * TRANSFORM_LENGTH); - lastParentUpdate = parent->lastUpdate; - } - else - { - multiply(world,parent->world,local); - lastParentUpdate = parent->lastUpdate; - } - - this->parent = parent; - lastUpdate = ++currentUpdate; - innerUpdateTransform(); - } - - propagateUpdateTransform(); - } - - void Transformable::transformPos(Vector3D& tPos,const Vector3D& pos) - { - multiply(tPos,pos,world); - } - - void Transformable::transformDir(Vector3D& tDir,const Vector3D& dir) - { - rotate(tDir,dir,world); // To transform a direction, the translation is ignored - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Vector3D.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Vector3D.cpp deleted file mode 100644 index 33d428dbe..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Vector3D.cpp +++ /dev/null @@ -1,177 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Vector3D.h" - -namespace SPK -{ - Vector3D::Vector3D(float x,float y,float z) : - x(x), - y(y), - z(z) {} - - Vector3D& Vector3D::operator+=(const Vector3D& v) - { - x += v.x; - y += v.y; - z += v.z; - return *this; - } - - Vector3D& Vector3D::operator-=(const Vector3D& v) - { - x -= v.x; - y -= v.y; - z -= v.z; - return *this; - } - - Vector3D& Vector3D::operator+=(float f) - { - x += f; - y += f; - z += f; - return *this; - } - - Vector3D& Vector3D::operator-=(float f) - { - x -= f; - y -= f; - z -= f; - return *this; - } - - Vector3D& Vector3D::operator*=(float f) - { - x *= f; - y *= f; - z *= f; - return *this; - } - - Vector3D& Vector3D::operator/=(float f) - { - f = 1.0f / f; - x *= f; - y *= f; - z *= f; - return *this; - } - - float& Vector3D::operator[](size_t index) - { - switch(index) - { - case 0 : return x; - case 1 : return y; - default : return z; - } - } - - const float& Vector3D::operator[](size_t index) const - { - switch(index) - { - case 0 : return x; - case 1 : return y; - default : return z; - } - } - - void Vector3D::set(float x,float y,float z) - { - this->x = x; - this->y = y; - this->z = z; - } - - bool Vector3D::normalize() - { - float norm = getNorm(); - if (norm != 0.0f) - { - x /= norm; - y /= norm; - z /= norm; - return true; - } - return false; - } - - void Vector3D::revert() - { - x = -x; - y = -y; - z = -z; - } - - void Vector3D::abs() - { - if (x < 0.0f) x = -x; - if (y < 0.0f) y = -y; - if (z < 0.0f) z = -z; - } - - void Vector3D::crossProduct(const Vector3D& v) - { - Vector3D result; - - result.x = y * v.z - z * v.y; - result.y = z * v.x - x * v.z; - result.z = x * v.y - y * v.x; - - *this = result; - } - - float getSqrDist(const Vector3D& v0,const Vector3D& v1) - { - float dx = v0.x - v1.x; - float dy = v0.y - v1.y; - float dz = v0.z - v1.z; - - return dx * dx + dy * dy + dz * dz; - } - - float getDist(const Vector3D& v0,const Vector3D& v1) - { - return std::sqrt(getSqrDist(v0,v1)); - } - - Vector3D crossProduct(const Vector3D& v0,const Vector3D& v1) - { - Vector3D result; - - result.x = v0.y * v1.z - v0.z * v1.y; - result.y = v0.z * v1.x - v0.x * v1.z; - result.z = v0.x * v1.y - v0.y * v1.x; - - return result; - } - - void crossProduct(const Vector3D& v0,const Vector3D& v1,Vector3D& result) - { - result.x = v0.y * v1.z - v0.z * v1.y; - result.y = v0.z * v1.x - v0.x * v1.z; - result.z = v0.x * v1.y - v0.y * v1.x; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Zone.cpp b/Extensions/ParticleSystem/SPARK/src/Core/SPK_Zone.cpp deleted file mode 100644 index dc5af3b34..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Core/SPK_Zone.cpp +++ /dev/null @@ -1,35 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Core/SPK_Zone.h" - -namespace SPK -{ - const float Zone::APPROXIMATION_VALUE = 0.01f; - - Zone::Zone(const Vector3D& position) : - Registerable(), - Transformable() - { - setPosition(position); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_NormalEmitter.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_NormalEmitter.cpp deleted file mode 100644 index 0c72374ae..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_NormalEmitter.cpp +++ /dev/null @@ -1,76 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Emitters/SPK_NormalEmitter.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - NormalEmitter::NormalEmitter(Zone* normalZone,bool inverted) : - Emitter(), - normalZone(normalZone), - inverted(inverted) - {} - - void NormalEmitter::registerChildren(bool registerAll) - { - Emitter::registerChildren(registerAll); - registerChild(normalZone,registerAll); - } - - void NormalEmitter::copyChildren(const Registerable& object,bool createBase) - { - const NormalEmitter& emitter = dynamic_cast(object); - Emitter::copyChildren(emitter,createBase); - normalZone = dynamic_cast(copyChild(emitter.normalZone,createBase)); - } - - void NormalEmitter::destroyChildren(bool keepChildren) - { - destroyChild(normalZone,keepChildren); - Emitter::destroyChildren(keepChildren); - } - - Registerable* NormalEmitter::findByName(const std::string& name) - { - Registerable* object = Emitter::findByName(name); - if ((object != NULL)||(normalZone == NULL)) - return object; - - return normalZone->findByName(name); - } - - void NormalEmitter::setNormalZone(Zone* zone) - { - decrementChildReference(normalZone); - incrementChildReference(zone); - - normalZone = zone; - } - - void NormalEmitter::generateVelocity(Particle& particle,float speed) const - { - if (inverted) speed = -speed; - const Zone* zone = (normalZone == NULL ? getZone() : normalZone); - particle.velocity() = zone->computeNormal(particle.position()) * speed; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_RandomEmitter.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_RandomEmitter.cpp deleted file mode 100644 index 8ecf1a3fe..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_RandomEmitter.cpp +++ /dev/null @@ -1,39 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Emitters/SPK_RandomEmitter.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - void RandomEmitter::generateVelocity(Particle& particle,float speed) const - { - float norm; - do - { - particle.velocity().set(random(-1.0f,1.0f),random(-1.0f,1.0f),random(-1.0f,1.0f)); - norm = particle.velocity().getNorm(); - } - while((norm > 1.0f) || (norm == 0.0f)); - particle.velocity() *= speed / norm; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_SphericEmitter.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_SphericEmitter.cpp deleted file mode 100644 index 7177a9c36..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_SphericEmitter.cpp +++ /dev/null @@ -1,123 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Emitters/SPK_SphericEmitter.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - const float SphericEmitter::PI = 3.1415926535897932384626433832795f; - - SphericEmitter::SphericEmitter(const Vector3D& direction,float angleA,float angleB) : - Emitter() - { - setDirection(direction); - setAngles(angleA,angleB); - } - - void SphericEmitter::setDirection(const Vector3D& direction) - { - tDirection = direction; - computeMatrix(); - this->direction = tDirection; // as tDirection was normalized in computeMatrix() - notifyForUpdate(); - } - - void SphericEmitter::setAngles(float angleA,float angleB) - { - if (angleB < angleA) - std::swap(angleA,angleB); - - angleA = std::min(2.0f * PI,std::max(0.0f,angleA)); - angleB = std::min(2.0f * PI,std::max(0.0f,angleB)); - - angleMin = angleA; - angleMax = angleB; - - cosAngleMin = std::cos(angleMin * 0.5f); - cosAngleMax = std::cos(angleMax * 0.5f); - } - - void SphericEmitter::computeMatrix() - { - tDirection.normalize(); - if ((tDirection.x == 0.0f)&&(tDirection.y == 0.0f)) - { - - matrix[0] = tDirection.z; - matrix[1] = 0.0f; - matrix[2] = 0.0f; - matrix[3] = 0.0f; - matrix[4] = tDirection.z; - matrix[5] = 0.0f; - matrix[6] = 0.0f; - matrix[7] = 0.0f; - matrix[8] = tDirection.z; - } - else - { - Vector3D axis; - crossProduct(tDirection,Vector3D(0.0f,0.0f,1.0f),axis); - - float cosA = tDirection.z; - float sinA = -axis.getNorm(); - axis /= -sinA; - - float x = axis.x; - float y = axis.y; - float z = axis.z; - - matrix[0] = x * x + cosA * (1.0f - x * x); - matrix[1] = x * y * (1.0f - cosA) - z * sinA; - matrix[2] = tDirection.x; - matrix[3] = x * y * (1.0f - cosA) + z * sinA; - matrix[4] = y * y + cosA * (1.0f - y * y); - matrix[5] = tDirection.y; - matrix[6] = x * z * (1.0f - cosA) - y * sinA; - matrix[7] = y * z * (1.0f - cosA) + x * sinA; - matrix[8] = tDirection.z; - } - } - - void SphericEmitter::generateVelocity(Particle& particle,float speed) const - { - float a = random(cosAngleMax,cosAngleMin); - float theta = std::acos(a); - float phi = random(0.0f,2.0f * PI); - - float sinTheta = std::sin(theta); - float x = sinTheta * std::cos(phi); - float y = sinTheta * std::sin(phi); - float z = std::cos(theta); - - particle.velocity().x = speed * (matrix[0] * x + matrix[1] * y + matrix[2] * z); - particle.velocity().y = speed * (matrix[3] * x + matrix[4] * y + matrix[5] * z); - particle.velocity().z = speed * (matrix[6] * x + matrix[7] * y + matrix[8] * z); - } - - void SphericEmitter::innerUpdateTransform() - { - Emitter::innerUpdateTransform(); - transformDir(tDirection,direction); - computeMatrix(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_StraightEmitter.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_StraightEmitter.cpp deleted file mode 100644 index a5edf2287..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Emitters/SPK_StraightEmitter.cpp +++ /dev/null @@ -1,48 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Emitters/SPK_StraightEmitter.h" - - -namespace SPK -{ - StraightEmitter::StraightEmitter(const Vector3D& direction) : - Emitter() - { - setDirection(direction); - } - - void StraightEmitter::setDirection(const Vector3D& direction) - { - this->direction = direction; - this->direction.normalize(); - tDirection = this->direction; - notifyForUpdate(); - } - - void StraightEmitter::innerUpdateTransform() - { - Emitter::innerUpdateTransform(); - transformDir(tDirection,direction); - tDirection.normalize(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Collision.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Collision.cpp deleted file mode 100644 index d32a9641f..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Collision.cpp +++ /dev/null @@ -1,122 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_Collision.h" -#include "Core/SPK_Group.h" - - -namespace SPK -{ - Collision::Collision(float scale,float elasticity) : - Modifier(), - scale(scale) - { - setElasticity(elasticity); - } - - void Collision::modify(Particle& particle,float deltaTime) const - { - size_t index = particle.getIndex(); - float radius1 = particle.getParamCurrentValue(PARAM_SIZE) * scale * 0.5f; - float m1 = particle.getParamCurrentValue(PARAM_MASS); - Group& group = *particle.getGroup(); - - // Tests collisions with all the particles that are stored before in the pool - for (size_t i = 0; i < index; ++i) - { - Particle& particle2 = group.getParticle(i); - float radius2 = particle2.getParamCurrentValue(PARAM_SIZE) * scale * 0.5f; - - float sqrRadius = radius1 + radius2; - sqrRadius *= sqrRadius; - - // Gets the normal of the collision plane - Vector3D normal = particle.position(); - normal -= particle2.position(); - float sqrDist = normal.getSqrNorm(); - - if (sqrDist < sqrRadius) // particles are intersecting each other - { - Vector3D delta = particle.velocity(); - delta -= particle2.velocity(); - - if (dotProduct(normal,delta) < 0.0f) // particles are moving towards each other - { - float oldSqrDist = getSqrDist(particle.oldPosition(),particle2.oldPosition()); - if (oldSqrDist > sqrDist) - { - // Disables the move from this frame - particle.position() = particle.oldPosition(); - particle2.position() = particle2.oldPosition(); - - normal = particle.position(); - normal -= particle2.position(); - - if (dotProduct(normal,delta) >= 0.0f) - continue; - } - - normal.normalize(); - - // Gets the normal components of the velocities - Vector3D normal1(normal); - Vector3D normal2(normal); - normal1 *= dotProduct(normal,particle.velocity()); - normal2 *= dotProduct(normal,particle2.velocity()); - - // Resolves collision - float m2 = particle2.getParamCurrentValue(PARAM_MASS); - - if (oldSqrDist < sqrRadius && sqrDist < sqrRadius) - { - // Tweak to separate particles that intersects at both t - deltaTime and t - // In that case the collision is no more considered as punctual - if (dotProduct(normal,normal1) < 0.0f) - { - particle.velocity() -= normal1; - particle2.velocity() += normal1; - } - - if (dotProduct(normal,normal2) > 0.0f) - { - particle2.velocity() -= normal2; - particle.velocity() += normal2; - } - } - else - { - // Else classic collision equations are applied - // Tangent components of the velocities are left untouched - particle.velocity() -= (1.0f + (elasticity * m2 - m1) / (m1 + m2)) * normal1; - particle2.velocity() -= (1.0f + (elasticity * m1 - m2) / (m1 + m2)) * normal2; - - normal1 *= ((1.0f + elasticity) * m1) / (m1 + m2); - normal2 *= ((1.0f + elasticity) * m2) / (m1 + m2); - - particle.velocity() += normal2; - particle2.velocity() += normal1; - } - } - } - } - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Destroyer.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Destroyer.cpp deleted file mode 100644 index 4c570a52a..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Destroyer.cpp +++ /dev/null @@ -1,51 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_Destroyer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Zone.h" - - -namespace SPK -{ - Destroyer::Destroyer(Zone* zone,ModifierTrigger trigger) : - Modifier(INSIDE_ZONE | OUTSIDE_ZONE | INTERSECT_ZONE | ENTER_ZONE | EXIT_ZONE,INSIDE_ZONE,true,false,zone) - { - setTrigger(trigger); - } - - void Destroyer::modify(Particle& particle,float deltaTime) const - { - particle.kill(); - if ((trigger != INSIDE_ZONE)||(trigger != OUTSIDE_ZONE)) - particle.position() = intersection; - } - - void Destroyer::modifyWrongSide(Particle& particle,bool inside) const - { - if (isFullZone()) - { - getZone()->moveAtBorder(particle.position(),inside); - particle.kill(); - } - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_LinearForce.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_LinearForce.cpp deleted file mode 100644 index 8baf2e507..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_LinearForce.cpp +++ /dev/null @@ -1,50 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_LinearForce.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - LinearForce::LinearForce(Zone* zone,ModifierTrigger trigger,const Vector3D& force,ForceFactor type,ModelParam param) : - Modifier(ALWAYS | INSIDE_ZONE | OUTSIDE_ZONE,ALWAYS,false,false,zone), - force(force), - tForce(force), - factorType(type), - factorParam(param) - {} - - void LinearForce::modify(Particle& particle,float deltaTime) const - { - float factor = deltaTime / particle.getParamCurrentValue(PARAM_MASS); - - if (factorType != FACTOR_NONE) - { - float param = particle.getParamCurrentValue(factorParam); - factor *= param; // linearity function of the parameter - if (factorType == FACTOR_SQUARE) - factor *= param; // linearity function of the square of the parameter - } - - particle.velocity() += tForce * factor; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_ModifierGroup.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_ModifierGroup.cpp deleted file mode 100644 index 9b9b6a315..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_ModifierGroup.cpp +++ /dev/null @@ -1,170 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_ModifierGroup.h" - -namespace SPK -{ - ModifierGroup::ModifierGroup(Zone* zone,ModifierTrigger trigger) : - Modifier(INSIDE_ZONE | OUTSIDE_ZONE | INTERSECT_ZONE | ENTER_ZONE | EXIT_ZONE,trigger,false,false,zone), - modifiers(), - globalZone(false), - handleWrongSide(false) - {} - - void ModifierGroup::registerChildren(bool registerAll) - { - Modifier::registerChildren(registerAll); - - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - registerChild(*it,registerAll); - } - - void ModifierGroup::copyChildren(const Registerable& object,bool createBase) - { - const ModifierGroup& modifier = dynamic_cast(object); - Modifier::copyChildren(modifier,createBase); - - // we clear the copies of pointers pushed in the vectors by the copy constructor - modifiers.clear(); - - for (std::vector::const_iterator it = modifier.modifiers.begin(); it != modifier.modifiers.end(); ++it) - modifiers.push_back(dynamic_cast(copyChild(*it,createBase))); - } - - void ModifierGroup::destroyChildren(bool keepChildren) - { - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - destroyChild(*it,keepChildren); - - Modifier::destroyChildren(keepChildren); - } - - Registerable* ModifierGroup::findByName(const std::string& name) - { - Registerable* object = Modifier::findByName(name); - if (object != NULL) - return object; - - for (std::vector::const_iterator it = modifiers.begin(); it != modifiers.end(); ++it) - { - object = (*it)->findByName(name); - if (object != NULL) - return object; - } - - return NULL; - } - - void ModifierGroup::addModifier(Modifier* modifier) - { - if (modifier == NULL) - return; - - incrementChildReference(modifier); - modifiers.push_back(modifier); - } - - bool ModifierGroup::removeModifier(const Modifier* modifier) - { - std::vector::iterator it = std::find::iterator,const Modifier*>(modifiers.begin(),modifiers.end(),modifier); - if (it != modifiers.end()) - { - decrementChildReference(*it); - modifiers.erase(it); - return true; - } - - return false; - } - - void ModifierGroup::clear() - { - for (std::vector::iterator it = modifiers.begin(); it != modifiers.end(); ++it) - decrementChildReference(*it); - - modifiers.clear(); - } - - void ModifierGroup::modify(Particle& particle,float deltaTime) const - { - std::vector::const_iterator end = modifiers.end(); - - if (globalZone) - for (std::vector::const_iterator it = modifiers.begin(); it != end; ++it) - { - Zone* oldZone = (*it)->getZone(); - (*it)->setZone(getZone()); - (*it)->modify(particle,deltaTime); - (*it)->setZone(oldZone); - } - else - for (std::vector::const_iterator it = modifiers.begin(); it != end; ++it) - (*it)->process(particle,deltaTime); - } - - void ModifierGroup::modifyWrongSide(Particle& particle,bool inside) const - { - if (globalZone) - { - std::vector::const_iterator end = modifiers.end(); - for (std::vector::const_iterator it = modifiers.begin(); it != end; ++it) - { - Zone* oldZone = (*it)->getZone(); - (*it)->setZone(getZone()); - (*it)->modifyWrongSide(particle,inside); - (*it)->setZone(oldZone); - } - } - else if (handleWrongSide) - { - std::vector::const_iterator end = modifiers.end(); - for (std::vector::const_iterator it = modifiers.begin(); it != end; ++it) - if (((*it)->getZone() != NULL)&&((*it)->getTrigger() != INTERSECT_ZONE)) - modifyWrongSide(particle,true); - } - } - - void ModifierGroup::createBuffers(const Group& group) - { - std::vector::iterator end = modifiers.end(); - for (std::vector::iterator it = modifiers.begin(); it != end; ++it) - (*it)->createBuffers(group); - } - - void ModifierGroup::destroyBuffers(const Group& group) - { - std::vector::iterator end = modifiers.end(); - for (std::vector::iterator it = modifiers.begin(); it != end; ++it) - (*it)->destroyBuffers(group); - } - - bool ModifierGroup::checkBuffers(const Group& group) - { - std::vector::iterator end = modifiers.end(); - for (std::vector::iterator it = modifiers.begin(); it != end; ++it) - if (!(*it)->checkBuffers(group)) - return false; - - return true; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Obstacle.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Obstacle.cpp deleted file mode 100644 index 54d30aeeb..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Obstacle.cpp +++ /dev/null @@ -1,57 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_Obstacle.h" - - -namespace SPK -{ - Obstacle::Obstacle(Zone* zone,ModifierTrigger trigger,float bouncingRatio,float friction) : - Modifier(INTERSECT_ZONE | ENTER_ZONE | EXIT_ZONE,INTERSECT_ZONE,true,true,zone), - bouncingRatio(bouncingRatio), - friction(friction) - { - setTrigger(trigger); - } - - void Obstacle::modify(Particle& particle,float deltaTime) const - { - Vector3D& velocity = particle.velocity(); - velocity = particle.position(); - velocity -= particle.oldPosition(); - - if (deltaTime != 0.0f) - velocity *= 1.0f / deltaTime; - else - velocity.set(0.0f,0.0f,0.0f); - - float dist = dotProduct(velocity,normal); - - normal *= dist; - velocity -= normal; // tangent component - velocity *= friction; - normal *= bouncingRatio; // normal component - velocity -= normal; - - particle.position() = intersection; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_PointMass.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_PointMass.cpp deleted file mode 100644 index 37b729361..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_PointMass.cpp +++ /dev/null @@ -1,49 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Modifiers/SPK_PointMass.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Zone.h" - -namespace SPK -{ - PointMass::PointMass(Zone* zone,ModifierTrigger trigger,float mass,float minDistance) : - Modifier(ALWAYS | INSIDE_ZONE | OUTSIDE_ZONE,ALWAYS,false,false,zone), - position(), - tPosition(), - mass(mass) - { - setTrigger(trigger); - setMinDistance(minDistance); - } - - void PointMass::modify(Particle& particle,float deltaTime) const - { - Vector3D force = tPosition; - if (getZone() != NULL) - force += getZone()->getTransformedPosition(); - - force -= particle.position(); - force *= mass * deltaTime / std::max(sqrMinDistance,force.getSqrNorm()); - particle.velocity() += force; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Vortex.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Vortex.cpp deleted file mode 100644 index da45de8f9..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Modifiers/SPK_Vortex.cpp +++ /dev/null @@ -1,84 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Extensions/Modifiers/SPK_Vortex.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Vortex::Vortex(const Vector3D& position,const Vector3D& direction,float rotationSpeed,float attractionSpeed) : - Modifier(ALWAYS | INSIDE_ZONE |OUTSIDE_ZONE,ALWAYS,false,false,NULL), - rotationSpeed(rotationSpeed), - attractionSpeed(attractionSpeed), - angularSpeedEnabled(false), - linearSpeedEnabled(false), - killingParticleEnabled(false), - eyeRadius(0.0f) - { - setPosition(position); - setDirection(direction); - } - - void Vortex::modify(Particle& particle,float deltaTime) const - { - // Distance of the projection point from the position of the vortex - float dist = dotProduct(tDirection,particle.position() - tPosition); - - // Position of the rotation center (orthogonal projection of the particle) - Vector3D rotationCenter = tDirection; - rotationCenter *= dist; - rotationCenter += tPosition; - - // Distance of the particle from the eye of the vortex - dist = getDist(rotationCenter,particle.position()); - - if (dist <= eyeRadius) - { - if (killingParticleEnabled) - particle.kill(); - return; - } - - float angle = angularSpeedEnabled ? rotationSpeed * deltaTime : rotationSpeed * deltaTime / dist; - - // Computes ortho base - Vector3D normal = (particle.position() - rotationCenter) / dist; - Vector3D tangent = crossProduct(tDirection,normal); - - float endRadius = linearSpeedEnabled ? dist * (1.0f - attractionSpeed * deltaTime) : dist - attractionSpeed * deltaTime; - if (endRadius <= eyeRadius) - { - endRadius = eyeRadius; - if (killingParticleEnabled) - particle.kill(); - } - - particle.position() = rotationCenter + normal * endRadius * std::cos(angle) + tangent * endRadius * std::sin(angle); - } - - void Vortex::innerUpdateTransform() - { - Modifier::innerUpdateTransform(); - transformPos(tPosition,position); - transformDir(tDirection,direction); - tDirection.normalize(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_Oriented3DRendererInterface.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_Oriented3DRendererInterface.cpp deleted file mode 100644 index b9909accf..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_Oriented3DRendererInterface.cpp +++ /dev/null @@ -1,48 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h" - -namespace SPK -{ - Oriented3DRendererInterface::Oriented3DRendererInterface() : - lookOrientation(LOOK_CAMERA_PLANE), - upOrientation(UP_CAMERA), - lockedAxis(LOCK_UP) - { - lookVector.set(0.0f,0.0f,1.0f); - upVector.set(0.0f,1.0f,0.0f); - } - - void Oriented3DRendererInterface::setOrientation(LookOrientation lookOrientation,UpOrientation upOrientation,LockedAxis lockedAxis) - { - this->lookOrientation = lookOrientation; - this->upOrientation = upOrientation; - this->lockedAxis = lockedAxis; - } - - void Oriented3DRendererInterface::setOrientation(OrientationPreset orientation) - { - this->lookOrientation = static_cast((orientation >> 0x8) & 0xFF); - this->upOrientation = static_cast(orientation & 0xFF); - this->lockedAxis = static_cast((orientation >> 0x10) & 0xFF); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_QuadRendererInterface.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_QuadRendererInterface.cpp deleted file mode 100644 index e42a7ee59..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Renderers/SPK_QuadRendererInterface.cpp +++ /dev/null @@ -1,43 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Extensions/Renderers/SPK_QuadRendererInterface.h" - -namespace SPK -{ - QuadRendererInterface::QuadRendererInterface(float scaleX,float scaleY) : - scaleX(scaleX), - scaleY(scaleY), - texturingMode(TEXTURE_NONE), - textureAtlasNbX(1), - textureAtlasNbY(1), - textureAtlasW(1.0f), - textureAtlasH(1.0f) - {} - - void QuadRendererInterface::setAtlasDimensions(size_t nbX,size_t nbY) - { - textureAtlasNbX = nbX; - textureAtlasNbY = nbY; - textureAtlasW = 1.0f / nbX; - textureAtlasH = 1.0f / nbY; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_AABox.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_AABox.cpp deleted file mode 100644 index 70af04daa..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_AABox.cpp +++ /dev/null @@ -1,160 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Zones/SPK_AABox.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - AABox::AABox(const Vector3D& position,const Vector3D& dimension) : - Zone(position) - { - setDimension(dimension); - } - - void AABox::setDimension(const Vector3D& dimension) - { - this->dimension.set(std::max(0.0f,dimension.x),std::max(0.0f,dimension.y),std::max(0.0f,dimension.z)); - } - - void AABox::generatePosition(Particle& particle,bool full) const - { - particle.position().x = getTransformedPosition().x + random(-dimension.x * 0.5f,dimension.x * 0.5f); - particle.position().y = getTransformedPosition().y + random(-dimension.y * 0.5f,dimension.y * 0.5f); - particle.position().z = getTransformedPosition().z + random(-dimension.z * 0.5f,dimension.z * 0.5f); - - if (!full) - { - int axis = random(0,3); - int sens = (random(0,2) << 1) - 1; - - switch(axis) - { - case 0 : - particle.position().x = getTransformedPosition().x + sens * dimension.x * 0.5f; - break; - case 1 : - particle.position().y = getTransformedPosition().y + sens * dimension.y * 0.5f; - break; - default : - particle.position().z = getTransformedPosition().z + sens * dimension.z * 0.5f; - break; - } - } - } - - bool AABox::contains(const Vector3D& v) const - { - if ((v.x >= getTransformedPosition().x - dimension.x * 0.5f)&&(v.x <= getTransformedPosition().x + dimension.x * 0.5f) - &&(v.y >= getTransformedPosition().y - dimension.y * 0.5f)&&(v.y <= getTransformedPosition().y + dimension.y * 0.5f) - &&(v.z >= getTransformedPosition().z - dimension.z * 0.5f)&&(v.z <= getTransformedPosition().z + dimension.z * 0.5f)) - return true; - - return false; - } - - bool AABox::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - float tEnter = 0.0f; - float tExit = 1.0f; - - int axis = 0; - - if (!slabIntersects(v0.x,v1.x,getTransformedPosition().x - dimension.x * 0.5f,getTransformedPosition().x + dimension.x * 0.5f,tEnter,tExit,axis,0)) - return false; - - if (!slabIntersects(v0.y,v1.y,getTransformedPosition().y - dimension.y * 0.5f,getTransformedPosition().y + dimension.y * 0.5f,tEnter,tExit,axis,1)) - return false; - - if (!slabIntersects(v0.z,v1.z,getTransformedPosition().z - dimension.z * 0.5f,getTransformedPosition().z + dimension.z * 0.5f,tEnter,tExit,axis,2)) - return false; - - if ((tEnter <= 0.0f)&&(tExit >= 1.0f)) - return false; - - if (intersection != NULL) - { - if (tEnter <= 0.0f) - { - tEnter = tExit; - axis = (axis & 0xF0) >> 4; - } - else - axis &= 0x0F; - - Vector3D vDir = v1 - v0; - float norm = vDir.getNorm() * tEnter; - tEnter = norm < APPROXIMATION_VALUE ? 0.0f : tEnter * (norm - APPROXIMATION_VALUE) / norm; - - vDir *= tEnter; - *intersection = v0 + vDir; - - if (normal != NULL) - { - switch(axis) - { - case 0 : - *normal = Vector3D(-1.0f,0.0f,0.0f); - break; - case 1 : - *normal = Vector3D(0.0f,-1.0f,0.0f); - break; - case 2 : - *normal = Vector3D(0.0f,0.0f,-1.0f); - break; - case 3 : - *normal = Vector3D(1.0f,0.0f,0.0f); - break; - case 4 : - *normal = Vector3D(0.0f,1.0f,0.0f); - break; - case 5 : - *normal = Vector3D(0.0f,0.0f,1.0f); - break; - } - } - } - - return true; - } - - void AABox::moveAtBorder(Vector3D& v,bool inside) const - { - if (inside) - { - Vector3D rayEnd(v - getTransformedPosition()); - float maxDim = getTransformedPosition().x + getTransformedPosition().y + getTransformedPosition().z; - rayEnd *= maxDim * maxDim / rayEnd.getSqrNorm(); - intersects(getTransformedPosition() + rayEnd,getTransformedPosition(),&v,NULL); - } - else - intersects(getTransformedPosition(),v,&v,NULL); - } - - Vector3D AABox::computeNormal(const Vector3D& point) const - { - // TO DO - Vector3D normal(point - getTransformedPosition()); - normalizeOrRandomize(normal); - return normal; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Cylinder.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Cylinder.cpp deleted file mode 100644 index 10067c43b..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Cylinder.cpp +++ /dev/null @@ -1,172 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2010 // -// - Julien Fryer - julienfryer@gmail.com // -// - Thibault Lescoat - info-tibo orange fr // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Extensions/Zones/SPK_Cylinder.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Cylinder::Cylinder(const Vector3D& position,const Vector3D& direction,float radius,float length) : - Zone(position) - { - setDirection(direction); - setRadius(radius); - setLength(length); - } - - bool Cylinder::contains(const Vector3D& v) const - { - float dist = dotProduct(tDirection,v - getTransformedPosition()); - - Vector3D ext = v - (tDirection*dist + getTransformedPosition()); - float r = ext.getNorm(); - - return dist <= length*0.5f && dist >= -length*0.5f && r <= radius; - } - Vector3D Cylinder::computeNormal(const Vector3D& point) const - { - float dist = dotProduct(tDirection,point - getTransformedPosition()); - if(dist >= length*0.5f) return tDirection; - if(dist <= -length*0.5f) return -tDirection; - - Vector3D ext = point - (tDirection*dist + getTransformedPosition()); - float r = ext.getNorm(); ext = ext / r; - - return ext; - } - - void Cylinder::generatePosition(Particle& particle,bool full) const - { - float cRadius = full ? random(0.0f,radius) : radius, - cLength = full ? random(0.0f,length)-length*0.5f : length, - cAngle = random(0.0f,3.15f); // 3.15 > PI, but it has no importance here... - - // We need at least two points to compute a base - Vector3D rPoint = getTransformedPosition() + Vector3D(10.0f,10.0f,10.0f); - float dist = dotProduct(tDirection,rPoint); - while(dist == 0.0f || tDirection*dist +getTransformedPosition() == rPoint) - { - // avoid dist == 0, which leads to a div by zero. - rPoint += Vector3D(10.0f,10.0f,random(-10.0f,10.0f)); - dist = dotProduct(tDirection,rPoint); - } - - Vector3D p1 = tDirection*dist +getTransformedPosition(); - dist = getDist(p1,rPoint); - - Vector3D a = (rPoint - p1) / dist; - Vector3D tmp1 = tDirection, tmp2 = a; tmp2.crossProduct(tmp1*(-1)); - Vector3D b = tmp2; - - particle.position() = getTransformedPosition() + cLength * tDirection + a * cRadius * std::cos(cAngle) + b * cRadius * std::sin(cAngle); - } - - bool Cylinder::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - if(!intersection) return false; - - // mindist between line directed by tDir and line(v0 v1). - Vector3D u = v1 - v0; u.normalize(); - if(tDirection == u || tDirection == -u) // colinear - { - float dist = dotProduct(tDirection,v0 - getTransformedPosition()); - - Vector3D ext = v0 - (tDirection*dist + getTransformedPosition()); - float r = ext.getNorm(); ext = ext / r; - - if(r == radius) //intersection - { - *intersection = getTransformedPosition() + ext * radius; - if(normal) - *normal = computeNormal(*intersection); - return true; - } - else if(r < radius) - { - *intersection = getTransformedPosition() + tDirection * length*0.5f + ext * r; - if(normal) - *normal = computeNormal(*intersection); - return true; - } - return false; - } - else - { - Vector3D pp = getTransformedPosition() - v0, uv = u; - uv.crossProduct(tDirection); - float dist = std::abs(dotProduct(pp,uv))/uv.getNorm(); - - float d = dotProduct(tDirection,v0 - getTransformedPosition()); - Vector3D ext = v0 - (tDirection*d + getTransformedPosition()); - float r = ext.getNorm(); - - float ah = std::cos(std::asin(dist/r))*r; - Vector3D h = v0 + u*ah; - - if(contains(h)) // intersection - { - float offset = 3.1415926535897932384626433832795f*0.5f*dist/radius; - *intersection = h - offset * u; - if(normal) - *normal = computeNormal(*intersection); - return true; - } - return false; - } - } - - void Cylinder::moveAtBorder(Vector3D& v,bool inside) const - { - float approx = inside ? -APPROXIMATION_VALUE : APPROXIMATION_VALUE; - float dist = dotProduct(tDirection,v - getTransformedPosition()); - - Vector3D ext = v - (tDirection*dist + getTransformedPosition()); - float r = ext.getNorm(); ext = ext / r; - if(dist > length*0.5f) - { - v -= tDirection * (dist - length*0.5f - approx); - if(r > radius) - v -= ext*(r-radius-approx); - return; - } - else if(dist < -length * 0.5f) - { - v += tDirection * (length*0.5f - dist - approx); - if(r > radius) - v -= ext*(r-radius-approx); - return; - } - - if(r > radius) - v -= ext*(r-radius-approx); - else - v += ext*(radius-r+approx); - } - - void Cylinder::innerUpdateTransform() - { - Zone::innerUpdateTransform(); - transformDir(tDirection,direction); - tDirection.normalize(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Line.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Line.cpp deleted file mode 100644 index e9b4106eb..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Line.cpp +++ /dev/null @@ -1,92 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Zones/SPK_Line.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Line::Line(const Vector3D& p0,const Vector3D& p1) : - Zone(Vector3D()) - { - setBounds(p0,p1); - } - - void Line::setPosition(const Vector3D& v) - { - Vector3D displacement = v - getPosition(); - bounds[0] = tBounds[0] += displacement; - bounds[1] = tBounds[1] += displacement; - computeDist(); - Zone::setPosition(v); - } - - void Line::setBounds(const Vector3D& p0,const Vector3D& p1) - { - bounds[0] = tBounds[0] = p0; - bounds[1] = tBounds[1] = p1; - computeDist(); - computePosition(); - } - - void Line::pushBound(const Vector3D& bound) - { - bounds[0] = tBounds[0] = bounds[1]; - bounds[1] = tBounds[1] = bound; - computeDist(); - computePosition(); - } - - void Line::generatePosition(Particle& particle,bool full) const - { - float ratio = random(0.0f,1.0f); - particle.position() = tBounds[0] + tDist * ratio; - } - - Vector3D Line::computeNormal(const Vector3D& point) const - { - float d = -dotProduct(tDist,point); - float sqrNorm = tDist.getSqrNorm(); - float t = 0.0f; - if (sqrNorm > 0.0f) - { - t = -(dotProduct(tDist,tBounds[0]) + d) / sqrNorm; - // t is clamped to the segment - if (t < 0.0f) t = 0.0f; - else if (t > 1.0f) t = 1.0f; - } - - Vector3D normal = point; - normal -= tBounds[0] + t * tDist; - - normalizeOrRandomize(normal); - return normal; - } - - void Line::innerUpdateTransform() - { - Zone::innerUpdateTransform(); - transformPos(tBounds[0],bounds[0]); - transformPos(tBounds[1],bounds[1]); - computeDist(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Plane.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Plane.cpp deleted file mode 100644 index 132b04206..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Plane.cpp +++ /dev/null @@ -1,84 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Zones/SPK_Plane.h" - -namespace SPK -{ - Plane::Plane(const Vector3D& position,const Vector3D& normal) : - Zone(position) - { - setNormal(normal); - } - - bool Plane::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - float dist0 = dotProduct(tNormal,v0 - getTransformedPosition()); - float dist1 = dotProduct(tNormal,v1 - getTransformedPosition()); - - if ((dist0 <= 0.0f) == (dist1 <= 0.0f)) // both points are on the same side - return false; - - if (intersection != NULL) - { - if (dist0 <= 0.0f) - dist0 = -dist0; - else - dist1 = -dist1; - - if (normal != NULL) - *normal = tNormal; - - float ti = dist0 / (dist0 + dist1); - - Vector3D vDir = v1 - v0; - float norm = vDir.getNorm(); - - norm *= ti; - ti = norm < APPROXIMATION_VALUE ? 0.0f : ti * (norm - APPROXIMATION_VALUE) / norm; - - vDir *= ti; - *intersection = v0 + vDir; - } - - return true; - } - - void Plane::moveAtBorder(Vector3D& v,bool inside) const - { - float dist = dotProduct(tNormal,v - getTransformedPosition()); - - if ((dist <= 0.0f) == inside) - inside ? dist += APPROXIMATION_VALUE : dist -= APPROXIMATION_VALUE; - else - inside ? dist -= APPROXIMATION_VALUE : dist += APPROXIMATION_VALUE; - - v += tNormal * -dist; - } - - void Plane::innerUpdateTransform() - { - Zone::innerUpdateTransform(); - transformDir(tNormal,normal); - tNormal.normalize(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Point.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Point.cpp deleted file mode 100644 index 0ebf1b64c..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Point.cpp +++ /dev/null @@ -1,38 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Zones/SPK_Point.h" - -namespace SPK -{ - Point::Point(const Vector3D& position) : - Zone(position) - {} - - Vector3D Point::computeNormal(const Vector3D& point) const - { - Vector3D normal(point - getTransformedPosition()); - normalizeOrRandomize(normal); - - return normal; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Ring.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Ring.cpp deleted file mode 100644 index cb43fe916..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Ring.cpp +++ /dev/null @@ -1,125 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "Extensions/Zones/SPK_Ring.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Ring::Ring(const Vector3D& position,const Vector3D& normal,float minRadius,float maxRadius) : - Zone(position) - { - setNormal(normal); - setRadius(minRadius,maxRadius); - } - - void Ring::setRadius(float minRadius,float maxRadius) - { - if (minRadius < 0.0f) minRadius = -minRadius; - if (maxRadius < 0.0f) maxRadius = -maxRadius; - if (minRadius > maxRadius) std::swap(minRadius,maxRadius); - this->minRadius = minRadius; - this->maxRadius = maxRadius; - sqrMinRadius = minRadius * minRadius; - sqrMaxRadius = maxRadius * maxRadius; - } - - void Ring::generatePosition(Particle& particle,bool full) const - { - Vector3D tmp; - do tmp = Vector3D(random(-1.0f,1.0f),random(-1.0f,1.0f),random(-1.0f,1.0f)); - while (tmp.getSqrNorm() > 1.0f); - - crossProduct(tNormal,tmp,particle.position()); - normalizeOrRandomize(particle.position()); - - particle.position() *= std::sqrt(random(sqrMinRadius,sqrMaxRadius)); // to have a uniform distribution - particle.position() += getTransformedPosition(); - } - - bool Ring::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - float dist0 = dotProduct(tNormal,v0 - getTransformedPosition()); - float dist1 = dotProduct(tNormal,v1 - getTransformedPosition()); - - if ((dist0 <= 0.0f) == (dist1 <= 0.0f)) // both points are on the same side - return false; - - if (dist0 <= 0.0f) - dist0 = -dist0; - else - dist1 = -dist1; - - float ti = dist0 / (dist0 + dist1); - - Vector3D vDir(v1 - v0); - float norm = vDir.getNorm(); - - norm *= ti; - ti = norm < APPROXIMATION_VALUE ? 0.0f : ti * (norm - APPROXIMATION_VALUE) / norm; - - vDir *= ti; - Vector3D inter(v0 + vDir); - - float distFromCenter = getSqrDist(inter,getTransformedPosition()); - if (distFromCenter > sqrMaxRadius || distFromCenter < sqrMinRadius) // intersection is not in the ring - return false; - - if (intersection != NULL) - { - *intersection = inter; - if (normal != NULL) - *normal = tNormal; - } - - return true; - } - - void Ring::moveAtBorder(Vector3D& v,bool inside) const - { - float dist = dotProduct(tNormal,v - getTransformedPosition()); - v += tNormal * -dist; - - float distFromCenter = getSqrDist(v,getTransformedPosition()); - - if (distFromCenter > sqrMaxRadius) - { - distFromCenter = std::sqrt(distFromCenter); - Vector3D vDir(v - getTransformedPosition()); - vDir *= maxRadius / distFromCenter; - v = getTransformedPosition() + vDir; - } - else if (distFromCenter < sqrMinRadius) - { - distFromCenter = std::sqrt(distFromCenter); - Vector3D vDir(v - getTransformedPosition()); - vDir *= minRadius / distFromCenter; - v = getTransformedPosition() + vDir; - } - } - - void Ring::innerUpdateTransform() - { - Zone::innerUpdateTransform(); - transformDir(tNormal,normal); - tNormal.normalize(); - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Sphere.cpp b/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Sphere.cpp deleted file mode 100644 index c0edc3210..000000000 --- a/Extensions/ParticleSystem/SPARK/src/Extensions/Zones/SPK_Sphere.cpp +++ /dev/null @@ -1,116 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "Extensions/Zones/SPK_Sphere.h" -#include "Core/SPK_Particle.h" - -namespace SPK -{ - Sphere::Sphere(const Vector3D& position,float radius) : - Zone(position) - { - setRadius(radius); - } - - void Sphere::generatePosition(Particle& particle,bool full) const - { - do particle.position() = Vector3D(random(-radius,radius),random(-radius,radius),random(-radius,radius)); - while (particle.position().getSqrNorm() > radius * radius); - - if ((!full)&&(radius > 0.0f)) - particle.position() *= radius / particle.position().getNorm(); - - particle.position() += getTransformedPosition(); - } - - bool Sphere::contains(const Vector3D& v) const - { - return getSqrDist(getTransformedPosition(),v) <= radius * radius; - } - - bool Sphere::intersects(const Vector3D& v0,const Vector3D& v1,Vector3D* intersection,Vector3D* normal) const - { - float r2 = radius * radius; - float dist0 = getSqrDist(getTransformedPosition(),v0); - float dist1 = getSqrDist(getTransformedPosition(),v1); - - if ((dist0 <= r2) == (dist1 <= r2)) - return false; - - if (intersection != NULL) - { - Vector3D vDir = v1 - v0; - float norm = vDir.getNorm(); - - float d = dotProduct(vDir,getTransformedPosition() - v0) / norm; - float a = std::sqrt(r2 - dist0 + d * d); - - float ti; - if (dist0 <= r2) - ti = d - a; - else - ti = d + a; - - ti /= norm; - - if (ti < 0.0f) ti = 0.0f; - if (ti > 1.0f) ti = 1.0f; - - norm *= ti; - ti = norm < APPROXIMATION_VALUE ? 0.0f : ti * (norm - APPROXIMATION_VALUE) / norm; - - vDir *= ti; - *intersection = v0 + vDir; - - if (normal != NULL) - { - if (dist0 <= r2) - *normal = getTransformedPosition() - *intersection; - else - *normal = *intersection - getTransformedPosition(); - normal->normalize(); - } - } - - return true; - } - - void Sphere::moveAtBorder(Vector3D& v,bool inside) const - { - Vector3D vDir = v - getTransformedPosition(); - float norm = vDir.getNorm(); - - if (inside) - vDir *= (radius + APPROXIMATION_VALUE) / norm; - else - vDir *= (radius - APPROXIMATION_VALUE) / norm; - - v = getTransformedPosition() + vDir; - } - - Vector3D Sphere::computeNormal(const Vector3D& point) const - { - Vector3D normal(point - getTransformedPosition()); - normalizeOrRandomize(normal); - return normal; - } -} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRBuffer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRBuffer.cpp deleted file mode 100644 index 178d8728d..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRBuffer.cpp +++ /dev/null @@ -1,375 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" - -namespace SPK -{ -namespace IRR -{ - bool IRRBuffer::useVBO = false; - - IRRBuffer::IRRBuffer(irr::IrrlichtDevice* device,size_t nbParticles,size_t particleVertexSize,size_t particleIndexSize,irr::video::E_INDEX_TYPE indexType) : - Buffer(), - device(device), - meshBuffer(irr::video::EVT_STANDARD,indexType), - nbParticles(nbParticles), - particleVertexSize(particleVertexSize), - particleIndexSize(particleIndexSize), - VBOInitialized(false) - { - initInnerBuffers(); - } - - IRRBuffer::IRRBuffer(const IRRBuffer& buffer) : - Buffer(buffer), - device(buffer.device), - meshBuffer(irr::video::EVT_STANDARD,buffer.meshBuffer.getIndexType()), - nbParticles(buffer.nbParticles), - particleVertexSize(buffer.particleVertexSize), - particleIndexSize(buffer.particleIndexSize), - VBOInitialized(false) - { - initInnerBuffers(); - } - - IRRBuffer::~IRRBuffer() - { - device->getVideoDriver()->removeHardwareBuffer(&meshBuffer); - } - - void IRRBuffer::initInnerBuffers() - { - if (useVBO) // VBOs are at the moment only usable with triangles in Irrlicht - { - meshBuffer.setHardwareMappingHint(irr::scene::EHM_STREAM,irr::scene::EBT_VERTEX); - meshBuffer.setHardwareMappingHint(irr::scene::EHM_STATIC,irr::scene::EBT_INDEX); - } - else - meshBuffer.setHardwareMappingHint(irr::scene::EHM_NEVER,irr::scene::EBT_VERTEX_AND_INDEX); - - // Allocates enough space - getVertexBuffer().set_used(nbParticles * particleVertexSize); - getIndexBuffer().set_used(nbParticles * particleIndexSize); - } - - void IRRBuffer::swap(size_t index0,size_t index1) - { - // Not useful but implemented for consistency - size_t startIndex0 = index0 * particleVertexSize; - size_t startIndex1 = index1 * particleVertexSize; - for (size_t i = 0; i < particleVertexSize; ++i) - std::swap(getVertexBuffer()[startIndex0 + i],getVertexBuffer()[startIndex1 + i]); - meshBuffer.setDirty(irr::scene::EBT_VERTEX); - } - - IRRBufferCreator::IRRBufferCreator(irr::IrrlichtDevice* device,size_t particleVertexSize,size_t particleIndexSize,E_IRRSPK_INDEXMODE indexType) : - BufferCreator(), - device(device), - particleVertexSize(particleVertexSize), - particleIndexSize(particleIndexSize), - indexType(indexType) - {} - - IRRBuffer* IRRBufferCreator::createBuffer(size_t nbParticles, const Group& group) const - { - IRRBuffer* buffer = NULL; - - switch(indexType) - { - case EII_32BITS : - return new IRRBuffer(device,nbParticles,particleVertexSize,particleIndexSize,irr::video::EIT_32BIT); - - case EII_16BITS : - if(nbParticles * particleVertexSize > 65536) - { - device->getLogger()->log(L"Unable to create particle buffer using 16bits indices : too many particles\n",irr::ELL_WARNING); - return NULL; - } - else - return new IRRBuffer(device,nbParticles,particleVertexSize,particleIndexSize,irr::video::EIT_16BIT); - - case EII_AUTO : - if (nbParticles * particleVertexSize > 65536) - return new IRRBuffer(device,nbParticles,particleVertexSize,particleIndexSize,irr::video::EIT_32BIT); - else - return new IRRBuffer(device,nbParticles,particleVertexSize,particleIndexSize,irr::video::EIT_16BIT); - - default : - { - device->getLogger()->log(L"Unknown index mode !\n",irr::ELL_INFORMATION); - return NULL; - } - } - } - - void IRRBuffer::activateVBOHint(bool activate) - { - useVBO = activate; - } -}} - - - - - - - - - - - - - - - - - - - - - - - - - - - //IRRBuffer::IRRBuffer(irr::video::IVideoDriver* d, int it) : - // irr::scene::SMeshBuffer(), - // Purpose(0), - // driver(d) - // { - // if(it == 32) - // IndexType = irr::video::EIT_32BIT; - // else - // IndexType = irr::video::EIT_16BIT; - //} - - // void IRRBuffer::constructIndicesForPointRendering() - // { - // Purpose=0; - - // if(IndexType==irr::video::EIT_32BIT) - // { - // Indices_32.set_used(Vertices.size()); - // for(unsigned int t=0; t=0 && purpose<3) - // { - // Purpose=purpose; - // switch(Purpose) - // { - // case 0: - // { - // Vertices.set_used(nbParticles); - // for(unsigned int t = 0; t < Vertices.size(); t++) - // Vertices[t] = irr::video::S3DVertex(); - // constructIndicesForPointRendering(); - // break; - // } - // case 1: - // { - // Vertices.set_used(nbParticles*2); - // for(unsigned int t = 0; t < Vertices.size(); t++) - // Vertices[t] = irr::video::S3DVertex(); - // constructIndicesForLineRendering(); - // break; - // } - // case 2: - // { - // Vertices.set_used(nbParticles*4); - // for(unsigned int t=0; tgetVideoDriver(),32); - // else if(m == EII_16BITS) - // { - // if(nbParticles > (unsigned int)65535/(p==0?1:2*p)) - // { - // device->getLogger()->log(L"Unable to create particle buffer using 16bits indices : too much particles\n",irr::ELL_WARNING); - // return 0; - // } - // else - // buff = new IRRBuffer(device->getVideoDriver(),16); - // } - // else - // { - // if(m != EII_AUTO) - // { - // wchar_t temp[12]; - // _snwprintf_s(temp,12,L"%i",(int)m); - // device->getLogger()->log(L"Unknown index mode, switching to EII_AUTO; specified value\n",temp,irr::ELL_INFORMATION); - // } - // if(nbParticles > (unsigned int)65535/(p==0?1:2*p)) - // buff = new IRRBuffer(device->getVideoDriver(),32); - // else - // buff = new IRRBuffer(device->getVideoDriver(),16); - // } - // buff->set(nbParticles,p); - // return buff; - // } diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.cpp deleted file mode 100644 index 410b0dca4..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.cpp +++ /dev/null @@ -1,103 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" - -namespace SPK -{ -namespace IRR -{ - const std::string IRRLineRenderer::IRR_BUFFER_NAME("SPK_IRRLineRenderer_Buffer"); - - IRRLineRenderer::IRRLineRenderer(irr::IrrlichtDevice* d,float length,float width) : - IRRRenderer(d), - LineRendererInterface(length,width) - { - material.Thickness = width; - } - - void IRRLineRenderer::createBuffers(const Group& group) - { - currentBuffer = dynamic_cast(group.createBuffer(getBufferName(), - IRRBufferCreator(device, - NB_VERTICES_PER_QUAD, - NB_INDICES_PER_QUAD), - getVBOFlag(), - false)); - - size_t nbTotalIndices = group.getParticles().getNbReserved() << 1; - - irr::scene::IIndexBuffer& indexBuffer = currentBuffer->getIndexBuffer(); - if (indexBuffer.getType() == irr::video::EIT_32BIT) - { - irr::u32* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalIndices; ++t) - indices[t] = t; - } - else - { - irr::u16* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalIndices; ++t) - indices[t] = t; - } - - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_INDEX); - currentBuffer->setVBOInitialized(true); - } - - void IRRLineRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - for (size_t t = 0; t < group.getNbParticles() << 1; t += 2) - { - const Particle& particle = group.getParticle(t >> 1); - - irr::video::SColor color(spk2irr( - particle.getParamCurrentValue(PARAM_ALPHA), - particle.getR(), - particle.getG(), - particle.getB())); - - currentBuffer->getVertexBuffer()[t].Pos = spk2irr(particle.position()); - currentBuffer->getVertexBuffer()[t].Color = color; - - currentBuffer->getVertexBuffer()[t + 1].Pos = spk2irr(particle.position() + particle.velocity() * length); - currentBuffer->getVertexBuffer()[t + 1].Color = color; - } - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_VERTEX); - - irr::video::IVideoDriver* driver = device->getVideoDriver(); - driver->setMaterial(material); - driver->drawVertexPrimitiveList( - currentBuffer->getVertexBuffer().pointer(), - group.getNbParticles() * NB_VERTICES_PER_QUAD, - currentBuffer->getIndexBuffer().pointer(), - group.getNbParticles(), - irr::video::EVT_STANDARD, - irr::scene::EPT_LINES, - currentBuffer->getIndexBuffer().getType()); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.cpp deleted file mode 100644 index 13e333b03..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.cpp +++ /dev/null @@ -1,102 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" - -namespace SPK -{ -namespace IRR -{ - const std::string IRRPointRenderer::IRR_BUFFER_NAME("SPK_IRRPointRenderer_Buffer"); - - IRRPointRenderer::IRRPointRenderer(irr::IrrlichtDevice* d,float size) : - IRRRenderer(d), - PointRendererInterface(POINT_SQUARE,size) - { - material.Thickness = size; - } - - bool IRRPointRenderer::setType(PointType type) - { - if (type == POINT_CIRCLE) - return false; - - this->type = type; - return true; - } - - void IRRPointRenderer::createBuffers(const Group& group) - { - currentBuffer = dynamic_cast(group.createBuffer(getBufferName(), - IRRBufferCreator(device, - NB_VERTICES_PER_QUAD, - NB_INDICES_PER_QUAD), - getVBOFlag(), - false)); - - size_t nbTotalParticles = group.getParticles().getNbReserved(); - - irr::scene::IIndexBuffer& indexBuffer = currentBuffer->getIndexBuffer(); - if (indexBuffer.getType() == irr::video::EIT_32BIT) - { - irr::u32* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalParticles; ++t) - indices[t] = t; - } - else - { - irr::u16* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalParticles; ++t) - indices[t] = t; - } - - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_INDEX); - currentBuffer->setVBOInitialized(true); - } - - void IRRPointRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - for (size_t t = 0; t < group.getNbParticles(); ++t) - { - const Particle& p = group.getParticle(t); - currentBuffer->getVertexBuffer()[t].Pos = spk2irr(p.position()); - currentBuffer->getVertexBuffer()[t].Color = spk2irr(p.getParamCurrentValue(PARAM_ALPHA),p.getR(),p.getG(),p.getB()); - } - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_VERTEX); - - irr::video::IVideoDriver* driver = device->getVideoDriver(); - driver->setMaterial(material); - driver->drawVertexPrimitiveList( - currentBuffer->getVertexBuffer().pointer(), - group.getNbParticles(), - currentBuffer->getIndexBuffer().pointer(), - group.getNbParticles(), - irr::video::EVT_STANDARD, - type == POINT_SPRITE ? irr::scene::EPT_POINT_SPRITES : irr::scene::EPT_POINTS, - currentBuffer->getIndexBuffer().getType()); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.cpp deleted file mode 100644 index cb84c4597..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.cpp +++ /dev/null @@ -1,199 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.h" -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.h" - -namespace SPK -{ -namespace IRR -{ - const std::string IRRQuadRenderer::IRR_BUFFER_NAME("SPK_IRRQuadRenderer_Buffer"); - void (IRRQuadRenderer::*IRRQuadRenderer::renderParticle)(const Particle&) const = NULL; - - IRRQuadRenderer::IRRQuadRenderer(irr::IrrlichtDevice* d,float scaleX,float scaleY) : - IRRRenderer(d), - QuadRendererInterface(scaleX,scaleY), - Oriented3DRendererInterface() - {} - - void IRRQuadRenderer::createBuffers(const Group& group) - { - currentBuffer = dynamic_cast(group.createBuffer(getBufferName(), - IRRBufferCreator(device, - NB_VERTICES_PER_QUAD, - NB_INDICES_PER_QUAD), - getVBOFlag(), - false)); - size_t nbTotalParticles = group.getParticles().getNbReserved(); - - irr::scene::IIndexBuffer& indexBuffer = currentBuffer->getIndexBuffer(); - if (indexBuffer.getType() == irr::video::EIT_32BIT) - { - irr::u32* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalParticles; ++t) - { - indices[NB_INDICES_PER_QUAD*t+0] = NB_VERTICES_PER_QUAD*t+0; - indices[NB_INDICES_PER_QUAD*t+1] = NB_VERTICES_PER_QUAD*t+1; - indices[NB_INDICES_PER_QUAD*t+2] = NB_VERTICES_PER_QUAD*t+2; - indices[NB_INDICES_PER_QUAD*t+3] = NB_VERTICES_PER_QUAD*t+0; - indices[NB_INDICES_PER_QUAD*t+4] = NB_VERTICES_PER_QUAD*t+2; - indices[NB_INDICES_PER_QUAD*t+5] = NB_VERTICES_PER_QUAD*t+3; - } - } - else if (indexBuffer.getType() == irr::video::EIT_16BIT) - { - irr::u16* indices = reinterpret_cast(indexBuffer.pointer()); - for (size_t t = 0; t < nbTotalParticles; ++t) - { - indices[NB_INDICES_PER_QUAD*t+0] = NB_VERTICES_PER_QUAD*t+0; - indices[NB_INDICES_PER_QUAD*t+1] = NB_VERTICES_PER_QUAD*t+1; - indices[NB_INDICES_PER_QUAD*t+2] = NB_VERTICES_PER_QUAD*t+2; - indices[NB_INDICES_PER_QUAD*t+3] = NB_VERTICES_PER_QUAD*t+0; - indices[NB_INDICES_PER_QUAD*t+4] = NB_VERTICES_PER_QUAD*t+2; - indices[NB_INDICES_PER_QUAD*t+5] = NB_VERTICES_PER_QUAD*t+3; - } - } - - irr::video::S3DVertex* vertices = currentBuffer->getVertexBuffer().pointer(); - for (size_t t = 0; t < nbTotalParticles; t++) - { - vertices[NB_VERTICES_PER_QUAD*t+0].TCoords = irr::core::vector2df(0.0f,0.0f); - vertices[NB_VERTICES_PER_QUAD*t+1].TCoords = irr::core::vector2df(1.0f,0.0f); - vertices[NB_VERTICES_PER_QUAD*t+2].TCoords = irr::core::vector2df(1.0f,1.0f); - vertices[NB_VERTICES_PER_QUAD*t+3].TCoords = irr::core::vector2df(0.0f,1.0f); - } - - if (IRRBuffer::isVBOHintActivated()) - { - for (size_t t = 0; t < nbTotalParticles * NB_VERTICES_PER_QUAD; t++) - { - vertices[t].Pos = irr::core::vector3df(0.0f,0.0f,0.0f); - vertices[t].Color = irr::video::SColor(0x00000000); - } - } - else - currentBuffer->setVBOInitialized(true); - - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_VERTEX_AND_INDEX); - } - - void IRRQuadRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - irr::video::IVideoDriver* driver = device->getVideoDriver(); - - // Computes the inverse model view - irr::core::matrix4 invModelView; - { - irr::core::matrix4 modelView(driver->getTransform(irr::video::ETS_VIEW)); - modelView *= driver->getTransform(irr::video::ETS_WORLD); - modelView.getInversePrimitive(invModelView); // wont work for odd modelview matrices (but should happen in very special cases) - } - - // Saves the renderer texture - irr::video::ITexture* savedTexture = material.TextureLayer[0].Texture; - if (texturingMode == TEXTURE_NONE) - material.TextureLayer[0].Texture = NULL; - - if ((texturingMode == TEXTURE_2D)&&(group.getModel()->isEnabled(PARAM_TEXTURE_INDEX))) - { - if (group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &IRRQuadRenderer::renderAtlasRot; - else - renderParticle = &IRRQuadRenderer::renderAtlas; - } - else - { - if (group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &IRRQuadRenderer::renderRot; - else - renderParticle = &IRRQuadRenderer::renderBasic; - } - - // At the first frame we pass the full buffer so that VBOs are correctly initialised - // Then at next frames we pass only what is needed to be rendered - if (currentBuffer->areVBOInitialized()) - currentBuffer->setUsed(group.getNbParticles()); - else - currentBuffer->setUsed(group.getParticles().getNbReserved()); - - bool globalOrientation = precomputeOrientation3D( - group, - Vector3D(invModelView[8],invModelView[9],invModelView[10]), - Vector3D(invModelView[4],invModelView[5],invModelView[6]), - Vector3D(invModelView[12],invModelView[13],invModelView[14])); - - if (globalOrientation) - { - computeGlobalOrientation3D(); - - for (size_t t = 0; t < group.getNbParticles(); ++t) - (this->*renderParticle)(group.getParticle(t)); - } - else - { - for (size_t t = 0; t < group.getNbParticles(); ++t) - { - const Particle& particle = group.getParticle(t); - computeSingleOrientation3D(particle); - (this->*renderParticle)(particle); - } - } - currentBuffer->getMeshBuffer().setDirty(irr::scene::EBT_VERTEX); - - driver->setMaterial(material); - driver->drawMeshBuffer(¤tBuffer->getMeshBuffer()); // this draw call is used in order to be able to use VBOs - - currentBuffer->setVBOInitialized(true); - material.TextureLayer[0].Texture = savedTexture; // Restores the texture - } - - void IRRQuadRenderer::renderBasic(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - FillBufferColorAndVertex(particle); - } - - void IRRQuadRenderer::renderRot(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - FillBufferColorAndVertex(particle); - } - - void IRRQuadRenderer::renderAtlas(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - FillBufferColorAndVertex(particle); - FillBufferTextureAtlas(particle); - } - - void IRRQuadRenderer::renderAtlasRot(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - FillBufferColorAndVertex(particle); - FillBufferTextureAtlas(particle); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRRenderer.cpp deleted file mode 100644 index 9b6e574a7..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRRenderer.cpp +++ /dev/null @@ -1,104 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h" - -namespace SPK -{ -namespace IRR -{ - IRRRenderer::IRRRenderer(irr::IrrlichtDevice* d) : - device(d), - currentBuffer(NULL) - { - material.GouraudShading = true; // fix 1.05.00 for ATI cards - material.Lighting = false; // No lights per default - material.BackfaceCulling = false; // Deactivates backface culling - material.MaterialType = irr::video::EMT_ONETEXTURE_BLEND; // To allow complex blending functions - setBlending(BLENDING_NONE); // Blending is disabled per default - } - - void IRRRenderer::setBlending(irr::video::E_BLEND_FACTOR srcFunc,irr::video::E_BLEND_FACTOR destFunc,unsigned int alphaSrc) - { - blendSrcFunc = srcFunc; - blendDestFunc = destFunc; - alphaSource = alphaSrc; - updateMaterialBlendingMode(); - } - - void IRRRenderer::setBlending(BlendingMode blendMode) - { - switch(blendMode) - { - case BLENDING_NONE : - blendSrcFunc = irr::video::EBF_ONE; - blendDestFunc = irr::video::EBF_ZERO; - alphaSource = irr::video::EAS_NONE; - break; - - case BLENDING_ADD : - blendSrcFunc = irr::video::EBF_SRC_ALPHA; - blendDestFunc = irr::video::EBF_ONE; - alphaSource = irr::video::EAS_VERTEX_COLOR | irr::video::EAS_TEXTURE; - break; - - case BLENDING_ALPHA : - blendSrcFunc = irr::video::EBF_SRC_ALPHA; - blendDestFunc = irr::video::EBF_ONE_MINUS_SRC_ALPHA; - alphaSource = irr::video::EAS_VERTEX_COLOR | irr::video::EAS_TEXTURE; - break; - } - updateMaterialBlendingMode(); - } - - void IRRRenderer::enableRenderingHint(RenderingHint renderingHint,bool enable) - { - switch(renderingHint) - { - case DEPTH_TEST : - material.ZBuffer = (enable ? 1 : 0); - break; - - case DEPTH_WRITE : - material.ZWriteEnable = enable; - break; - } - } - - bool IRRRenderer::isRenderingHintEnabled(RenderingHint renderingHint) const - { - switch(renderingHint) - { - case DEPTH_TEST : - return material.ZBuffer != 0; - - case DEPTH_WRITE : - return material.ZWriteEnable; - - case ALPHA_TEST : - return true; // always enabled in the irrlicht material - } - - return false; - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRSystem.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRSystem.cpp deleted file mode 100644 index 9bb53f21e..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/Irrlicht/SPK_IRRSystem.cpp +++ /dev/null @@ -1,119 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/Irrlicht/SPK_IRRSystem.h" -#include "Core/SPK_Group.h" - -namespace SPK -{ -namespace IRR -{ - IRRSystem::IRRSystem(irr::scene::ISceneNode* parent, irr::scene::ISceneManager* mgr,bool worldTransformed,irr::s32 id) : - irr::scene::ISceneNode(parent,mgr,id), - System(), - worldTransformed(worldTransformed), - AutoUpdate(true), - AlwaysUpdate(false), - finished(false), - lastUpdatedTime(0) - {} - - IRRSystem::IRRSystem(const IRRSystem& system) : - System(system), - ISceneNode(system.getParent(),system.getSceneManager()), - AutoUpdate(system.AutoUpdate), - AlwaysUpdate(system.AlwaysUpdate), - worldTransformed(system.worldTransformed), - finished(system.finished), - lastUpdatedTime(0) - { - cloneMembers(&const_cast(system),NULL); - //updateAbsolutePosition(); - } - - void IRRSystem::OnRegisterSceneNode() - { - if(IsVisible) - SceneManager->registerNodeForRendering(this,irr::scene::ESNRP_TRANSPARENT_EFFECT); // Draws in transparent effect pass (may be optimized) - - irr::scene::ISceneNode::OnRegisterSceneNode(); - } - - void IRRSystem::render() const - { - // Sets the transform matrix - SceneManager->getVideoDriver()->setTransform(irr::video::ETS_WORLD,AbsoluteTransformation); - - // Renders particles - SPK::System::render(); - } - - void IRRSystem::OnAnimate(irr::u32 timeMs) - { - ISceneNode::OnAnimate(timeMs); - - if (lastUpdatedTime == 0) - lastUpdatedTime = timeMs; - - if(AutoUpdate && (AlwaysUpdate || (IsVisible/* && !SceneManager->isCulled(this)*/))) // check culling (disabled atm) - update((timeMs - lastUpdatedTime) * 0.001f); - - lastUpdatedTime = timeMs; - } - - void IRRSystem::updateAbsolutePosition() - { - irr::scene::ISceneNode::updateAbsolutePosition(); - - if (worldTransformed) - { - this->setTransform(AbsoluteTransformation.pointer()); - updateTransform(); - AbsoluteTransformation.makeIdentity(); - } - } - - const irr::core::aabbox3d& IRRSystem::getBoundingBox() const - { - BBox.MaxEdge = spk2irr(getAABBMax()); - BBox.MinEdge = spk2irr(getAABBMin()); - return BBox; - } - - void IRRSystem::updateCameraPosition() const - { - for (std::vector::const_iterator it = groups.begin(); it != groups.end(); ++it) - if ((*it)->isDistanceComputationEnabled()) - { - irr::core::vector3df pos = SceneManager->getActiveCamera()->getAbsolutePosition(); - if (!worldTransformed) - { - irr::core::matrix4 invTransform; - AbsoluteTransformation.getInversePrimitive(invTransform); - invTransform.transformVect(pos); - } - setCameraPosition(irr2spk(pos)); - break; - } - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLExtHandler.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLExtHandler.cpp deleted file mode 100644 index 1b26bdb4f..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLExtHandler.cpp +++ /dev/null @@ -1,326 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h" - -#if defined(__APPLE__) || defined(macintosh) -// Necessary includes to get GL functions pointers from MAC -#include -#include -#include -#endif - -namespace SPK -{ -namespace GL -{ - GLExtHandler::GLExtension GLExtHandler::pointSpriteGLExt = UNCHECKED; - GLExtHandler::GLExtension GLExtHandler::pointParameterGLExt = UNCHECKED; - GLExtHandler::GLExtension GLExtHandler::texture3DGLExt = UNCHECKED; - GLExtHandler::GLExtension GLExtHandler::shaderGLExt = UNCHECKED; - - GLExtHandler::SPK_PFNGLPOINTPARAMETERFPROC GLExtHandler::SPK_glPointParameterf = NULL; - GLExtHandler::SPK_PFNGLPOINTPARAMETERFVPROC GLExtHandler::SPK_glPointParameterfv = NULL; - GLExtHandler::SPK_PFNGLTEXIMAGE3DPROC GLExtHandler::SPK_glTexImage3D = NULL; - GLExtHandler::SPK_PFNGLCREATESHADERPROC GLExtHandler::SPK_glCreateShader = NULL; - GLExtHandler::SPK_PFNGLDELETESHADERPROC GLExtHandler::SPK_glDeleteShader = NULL; - GLExtHandler::SPK_PFNGLSHADERSOURCEPROC GLExtHandler::SPK_glShaderSource = NULL; - GLExtHandler::SPK_PFNGLCOMPILESHADERPROC GLExtHandler::SPK_glCompileShader = NULL; - GLExtHandler::SPK_PFNGLCREATEPROGRAMPROC GLExtHandler::SPK_glCreateProgram = NULL; - GLExtHandler::SPK_PFNGLDELETEPROGRAMPROC GLExtHandler::SPK_glDeleteProgram = NULL; - GLExtHandler::SPK_PFNGLATTACHSHADERPROC GLExtHandler::SPK_glAttachShader = NULL; - GLExtHandler::SPK_PFNGLDETACHSHADERPROC GLExtHandler::SPK_glDetachShader = NULL; - GLExtHandler::SPK_PFNGLLINKPROGRAMPROC GLExtHandler::SPK_glLinkProgram = NULL; - GLExtHandler::SPK_PFNGLUSEPROGRAMPROC GLExtHandler::SPK_glUseProgram = NULL; - - const float GLExtHandler::QUADRATIC_SCREEN[3] = {1.0f,0.0f,0.0f}; - - float GLExtHandler::pixelPerUnit = 1024.0f; - - const float GLExtHandler::POINT_SIZE_CURRENT = 32.0f; - const float GLExtHandler::POINT_SIZE_MIN = 1.0f; - const float GLExtHandler::POINT_SIZE_MAX = 1024.0f; - -#ifdef SPK_NO_GLEXT - bool GLExtHandler::loadGLExtPointSprite() - { - pointSpriteGLExt = UNSUPPORTED; - return false; - } - - bool GLExtHandler::loadGLExtPointParameter() - { - pointParameterGLExt = UNSUPPORTED; - return false; - } - - bool GLExtHandler::loadGLExtTexture3D() - { - texture3DGLExt = UNSUPPORTED; - return false; - } - - bool GLExtHandler::loadGLExtShader() - { - shaderGLExt = UNSUPPORTED; - return false; - } -#else - bool GLExtHandler::loadGLExtPointSprite() - { - if (pointSpriteGLExt == UNCHECKED) - { - pointSpriteGLExt = UNSUPPORTED; - - std::string version = reinterpret_cast(glGetString(GL_VERSION)); - // openGL 2.0 and higher - if (int(version[0] - '0') >= 2) - pointSpriteGLExt = SUPPORTED; - else - { - std::string extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); - if ((extensions.find("GL_ARB_point_sprites") != std::string::npos) - ||(extensions.find("GL_NV_point_sprites") != std::string::npos)) - pointSpriteGLExt = SUPPORTED; - } - } - - return pointSpriteGLExt == SUPPORTED; - } - - bool GLExtHandler::loadGLExtPointParameter() - { - if (pointParameterGLExt == UNCHECKED) - { - pointParameterGLExt = UNSUPPORTED; - - std::string version = reinterpret_cast(glGetString(GL_VERSION)); - std::string extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); - - // openGL 1.4 and higher - if (((int(version[0] - '0') == 1)&&(int(version[2] - '0') >= 4)) - ||(int(version[0] - '0') > 1)) - { - SPK_glPointParameterf = (SPK_PFNGLPOINTPARAMETERFPROC)glGetProcAddress("glPointParameterf"); - SPK_glPointParameterfv = (SPK_PFNGLPOINTPARAMETERFVPROC)glGetProcAddress("glPointParameterfv"); - } - - // point parameter ARB - if (((SPK_glPointParameterf == NULL)||(SPK_glPointParameterfv == NULL)) - &&(extensions.find("GL_ARB_point_parameters") != std::string::npos)) - { - SPK_glPointParameterf = (SPK_PFNGLPOINTPARAMETERFPROC)glGetProcAddress("glPointParameterfARB"); - SPK_glPointParameterfv = (SPK_PFNGLPOINTPARAMETERFVPROC)glGetProcAddress("glPointParameterfvARB"); - } - - // point parameter EXT - if (((SPK_glPointParameterf == NULL)||(SPK_glPointParameterfv == NULL)) - &&(extensions.find("GL_EXT_point_parameters") != std::string::npos)) - { - SPK_glPointParameterf = (SPK_PFNGLPOINTPARAMETERFPROC)glGetProcAddress("glPointParameterfEXT"); - SPK_glPointParameterfv = (SPK_PFNGLPOINTPARAMETERFVPROC)glGetProcAddress("glPointParameterfvEXT"); - } - - // point parameter SGIS - if (((SPK_glPointParameterf == NULL)||(SPK_glPointParameterfv == NULL)) - &&(extensions.find("GL_SGIS_point_parameters") != std::string::npos)) - { - SPK_glPointParameterf = (SPK_PFNGLPOINTPARAMETERFPROC)glGetProcAddress("glPointParameterfSGIS"); - SPK_glPointParameterfv = (SPK_PFNGLPOINTPARAMETERFVPROC)glGetProcAddress("glPointParameterfvSGIS"); - } - - if ((SPK_glPointParameterf != NULL)&&(SPK_glPointParameterfv != NULL)) - pointParameterGLExt = SUPPORTED; - } - - return pointParameterGLExt == SUPPORTED; - } - - bool GLExtHandler::loadGLExtTexture3D() - { - if (texture3DGLExt == UNCHECKED) - { - texture3DGLExt = UNSUPPORTED; - - std::string version = reinterpret_cast(glGetString(GL_VERSION)); - std::string extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); - - // openGL 1.2 and higher - if (((int(version[0] - '0') == 1)&&(int(version[2] - '0') >= 4)) - ||(int(version[0] - '0') > 1)) - SPK_glTexImage3D = (SPK_PFNGLTEXIMAGE3DPROC)glGetProcAddress("glTexImage3D"); - - // texture 3D EXT - if ((SPK_glTexImage3D == NULL)&&(extensions.find("GL_EXT_texture3D") != std::string::npos)) - SPK_glTexImage3D = (SPK_PFNGLTEXIMAGE3DPROC)glGetProcAddress("glTexImage3DEXT"); - - if (SPK_glTexImage3D != NULL) - texture3DGLExt = SUPPORTED; - } - - return texture3DGLExt == SUPPORTED; - } - - bool GLExtHandler::loadGLExtShader() - { - if (shaderGLExt == UNCHECKED) - { - shaderGLExt = UNSUPPORTED; - - std::string version = reinterpret_cast(glGetString(GL_VERSION)); - - // openGL 2.0 and higher - if (int(version[0] - '0') >= 2) - { - bool ok = true; - - if (ok && ((SPK_glCreateShader = (SPK_PFNGLCREATESHADERPROC)glGetProcAddress("glCreateShader")) == NULL)) ok = false; - if (ok && ((SPK_glDeleteShader = (SPK_PFNGLDELETESHADERPROC)glGetProcAddress("glDeleteShader")) == NULL)) ok = false; - if (ok && ((SPK_glShaderSource = (SPK_PFNGLSHADERSOURCEPROC)glGetProcAddress("glShaderSource")) == NULL)) ok = false; - if (ok && ((SPK_glCompileShader = (SPK_PFNGLCOMPILESHADERPROC)glGetProcAddress("glCompileShader")) == NULL)) ok = false; - if (ok && ((SPK_glCreateProgram = (SPK_PFNGLCREATEPROGRAMPROC)glGetProcAddress("glCreateProgram")) == NULL)) ok = false; - if (ok && ((SPK_glDeleteProgram = (SPK_PFNGLDELETEPROGRAMPROC)glGetProcAddress("glDeleteProgram")) == NULL)) ok = false; - if (ok && ((SPK_glAttachShader = (SPK_PFNGLATTACHSHADERPROC)glGetProcAddress("glAttachShader")) == NULL)) ok = false; - if (ok && ((SPK_glDetachShader = (SPK_PFNGLDETACHSHADERPROC)glGetProcAddress("glDetachShader")) == NULL)) ok = false; - if (ok && ((SPK_glLinkProgram = (SPK_PFNGLLINKPROGRAMPROC)glGetProcAddress("glLinkProgram")) == NULL)) ok = false; - if (ok && ((SPK_glUseProgram = (SPK_PFNGLUSEPROGRAMPROC)glGetProcAddress("glUseProgram")) == NULL)) ok = false; - - if (ok) shaderGLExt = SUPPORTED; - } - - if (shaderGLExt == UNSUPPORTED) - { - std::string extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); - - if ((extensions.find("GL_ARB_shading_language_100") != std::string::npos)&& - (extensions.find("GL_ARB_shader_objects") != std::string::npos)&& - (extensions.find("GL_ARB_vertex_shader") != std::string::npos)&& - (extensions.find("GL_ARB_fragment_shader") != std::string::npos)) - { - bool ok = true; - - if (ok && ((SPK_glCreateShader = (SPK_PFNGLCREATESHADERPROC)glGetProcAddress("glCreateShaderObjectARB")) == NULL)) ok = false; - if (ok && ((SPK_glDeleteShader = SPK_glDeleteProgram = (SPK_PFNGLDELETESHADERPROC)glGetProcAddress("glDeleteObjectARB")) == NULL)) ok = false; - if (ok && ((SPK_glShaderSource = (SPK_PFNGLSHADERSOURCEPROC)glGetProcAddress("glShaderSourceARB")) == NULL)) ok = false; - if (ok && ((SPK_glCompileShader = (SPK_PFNGLCOMPILESHADERPROC)glGetProcAddress("glCompileShaderARB")) == NULL)) ok = false; - if (ok && ((SPK_glCreateProgram = (SPK_PFNGLCREATEPROGRAMPROC)glGetProcAddress("glCreateProgramObjectARB")) == NULL)) ok = false; - if (ok && ((SPK_glAttachShader = (SPK_PFNGLATTACHSHADERPROC)glGetProcAddress("glAttachObjectARB")) == NULL)) ok = false; - if (ok && ((SPK_glDetachShader = (SPK_PFNGLDETACHSHADERPROC)glGetProcAddress("glDetachObjectARB")) == NULL)) ok = false; - if (ok && ((SPK_glLinkProgram = (SPK_PFNGLLINKPROGRAMPROC)glGetProcAddress("glLinkProgramARB")) == NULL)) ok = false; - if (ok && ((SPK_glUseProgram = (SPK_PFNGLUSEPROGRAMPROC)glGetProcAddress("glUseProgramObjectARB")) == NULL)) ok = false; - - if (ok) shaderGLExt = SUPPORTED; - } - } - } - - return shaderGLExt == SUPPORTED; - } -#endif - -#if defined(__APPLE__) || defined(macintosh) - void* GLExtHandler::SPK_NSGLGetProcAddress(const char* name) - { - NSSymbol symbol; - char *symbolName; - - symbolName = (char*)malloc (strlen (name) + 2); - strcpy(symbolName + 1, name); - symbolName[0] = '_'; - symbol = NULL; - - if (NSIsSymbolNameDefined (symbolName)) - symbol = NSLookupAndBindSymbol (symbolName); - - free (symbolName); - - return symbol ? NSAddressOfSymbol (symbol) : NULL; - } -#endif - - void GLExtHandler::setPixelPerUnit(float fovy,int screenHeight) - { - // the pixel per unit is computed for a distance from the camera of screenHeight - pixelPerUnit = screenHeight / (2.0f * std::tan(fovy * 0.5f)); - } - - void GLExtHandler::glTexImage3D(GLenum target, - GLint level, - GLenum internalFormat, - GLsizei width, - GLsizei height, - GLsizei depth, - GLint border, - GLenum format, - GLenum type, - const GLvoid* pixels) - { - if (loadGLExtTexture3D()) - SPK_glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels); - } - - GLExtHandler::GLExtension GLExtHandler::getPointSpriteGLExt() - { - return pointSpriteGLExt; - } - - GLExtHandler::GLExtension GLExtHandler::getPointParameterGLExt() - { - return pointParameterGLExt; - } - - void GLExtHandler::enablePointParameterGLExt(float size,bool distance) - { - // derived size = size * sqrt(1 / (A + B * distance + C * distance²)) - if (distance) - { - const float sqrtC = POINT_SIZE_CURRENT / (size * pixelPerUnit); - const float QUADRATIC_WORLD[3] = {0.0f,0.0f,sqrtC * sqrtC}; // A = 0; B = 0; C = (POINT_SIZE_CURRENT / (size * pixelPerUnit))² - SPK_glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION,QUADRATIC_WORLD); - } - else - { - const float sqrtA = POINT_SIZE_CURRENT / size; - const float QUADRATIC_WORLD[3] = {sqrtA * sqrtA,0.0f,0.0f}; // A = (POINT_SIZE_CURRENT / size)²; B = 0; C = 0 - SPK_glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION,QUADRATIC_WORLD); - } - - glPointSize(POINT_SIZE_CURRENT); - SPK_glPointParameterf(GL_POINT_SIZE_MIN,POINT_SIZE_MIN); - SPK_glPointParameterf(GL_POINT_SIZE_MAX,POINT_SIZE_MAX); - } - - void GLExtHandler::disablePointParameterGLExt() - { - SPK_glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION,QUADRATIC_SCREEN); - } - - GLExtHandler::GLExtension GLExtHandler::getTexture3DGLExt() - { - return texture3DGLExt; - } - - GLExtHandler::GLExtension GLExtHandler::getShaderGLExt() - { - return shaderGLExt; - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineRenderer.cpp deleted file mode 100644 index 813cd1f80..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineRenderer.cpp +++ /dev/null @@ -1,107 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLLineRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace GL -{ - const std::string GLLineRenderer::GPU_BUFFER_NAME("SPK_GLLineRenderer_GPU"); - - float* GLLineRenderer::gpuBuffer = NULL; - float* GLLineRenderer::gpuIterator = NULL; - - GLLineRenderer::GLLineRenderer(float length,float width) : - GLRenderer(), - LineRendererInterface(length,width) - {} - - bool GLLineRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fBuffer; - if ((fBuffer = dynamic_cast(group.getBuffer(GPU_BUFFER_NAME))) == NULL) - return false; - - gpuIterator = gpuBuffer = fBuffer->getData(); - return true; - } - - void GLLineRenderer::createBuffers(const Group& group) - { - FloatBuffer* fBuffer = dynamic_cast(group.createBuffer(GPU_BUFFER_NAME,FloatBufferCreator(14),0,false)); - gpuIterator = gpuBuffer = fBuffer->getData(); - } - - void GLLineRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(GPU_BUFFER_NAME); - } - - void GLLineRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - initBlending(); - initRenderingHints(); - - glLineWidth(width); - glDisable(GL_TEXTURE_2D); - glShadeModel(GL_FLAT); - - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - - *(gpuIterator++) = particle.position().x; - *(gpuIterator++) = particle.position().y; - *(gpuIterator++) = particle.position().z; - - gpuIterator += 4; // skips the first vertex color data as GL_FLAT was forced - - *(gpuIterator++) = particle.position().x + particle.velocity().x * length; - *(gpuIterator++) = particle.position().y + particle.velocity().y * length; - *(gpuIterator++) = particle.position().z + particle.velocity().z * length; - - *(gpuIterator++) = particle.getR(); - *(gpuIterator++) = particle.getG(); - *(gpuIterator++) = particle.getB(); - *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - // interleaves vertex and color data - glVertexPointer(3,GL_FLOAT,7 * sizeof(float),gpuBuffer); - glColorPointer(4,GL_FLOAT,7 * sizeof(float),gpuBuffer + 3); - - glDrawArrays(GL_LINES,0,group.getNbParticles() << 1); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.cpp deleted file mode 100644 index 1fe2d280c..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.cpp +++ /dev/null @@ -1,204 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace GL -{ - const std::string GLLineTrailRenderer::VERTEX_BUFFER_NAME("SPK_GLLineTrailRenderer_Vertex"); - const std::string GLLineTrailRenderer::COLOR_BUFFER_NAME("SPK_GLLineTrailRenderer_Color"); - const std::string GLLineTrailRenderer::VALUE_BUFFER_NAME("SPK_GLLineTrailRenderer_Value"); - - float* GLLineTrailRenderer::vertexBuffer = NULL; - float* GLLineTrailRenderer::vertexIterator = NULL; - float* GLLineTrailRenderer::colorBuffer = NULL; - float* GLLineTrailRenderer::colorIterator = NULL; - float* GLLineTrailRenderer::valueBuffer = NULL; - float* GLLineTrailRenderer::valueIterator = NULL; - - GLLineTrailRenderer::GLLineTrailRenderer() : - GLRenderer(), - nbSamples(8), - width(1.0f), - duration(1.0f), - degeneratedR(0.0f), - degeneratedG(0.0f), - degeneratedB(0.0f), - degeneratedA(0.0f) - { - enableBlending(true); - } - - void GLLineTrailRenderer::setDegeneratedLines(float r,float g,float b,float a) - { - degeneratedR = r; - degeneratedG = g; - degeneratedB = b; - degeneratedA = a; - } - - bool GLLineTrailRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fVertexBuffer; - FloatBuffer* fColorBuffer; - FloatBuffer* fValueBuffer; - - if ((fVertexBuffer = dynamic_cast(group.getBuffer(VERTEX_BUFFER_NAME,nbSamples))) == NULL) - return false; - - if ((fColorBuffer = dynamic_cast(group.getBuffer(COLOR_BUFFER_NAME,nbSamples))) == NULL) - return false; - - if ((fValueBuffer = dynamic_cast(group.getBuffer(VALUE_BUFFER_NAME,nbSamples))) == NULL) - return false; - - vertexIterator = vertexBuffer = fVertexBuffer->getData(); - colorIterator = colorBuffer = fColorBuffer->getData(); - valueIterator = valueBuffer = fValueBuffer->getData(); - - return true; - } - - void GLLineTrailRenderer::createBuffers(const Group& group) - { - FloatBuffer* fVertexBuffer = dynamic_cast(group.createBuffer(VERTEX_BUFFER_NAME,FloatBufferCreator((nbSamples + 2) * 3),nbSamples,true)); - FloatBuffer* fColorBuffer = dynamic_cast(group.createBuffer(COLOR_BUFFER_NAME,FloatBufferCreator((nbSamples + 2) << 2),nbSamples,true)); - FloatBuffer* fValueBuffer = dynamic_cast(group.createBuffer(VALUE_BUFFER_NAME,FloatBufferCreator(nbSamples),nbSamples,true)); - - vertexIterator = vertexBuffer = fVertexBuffer->getData(); - colorIterator = colorBuffer = fColorBuffer->getData(); - valueIterator = valueBuffer = fValueBuffer->getData(); - - // Fills the buffers with correct values - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - init(particle,particle.getAge()); - } - - // Resets the iterators at the beginning after the init - vertexIterator = vertexBuffer; - colorIterator = colorBuffer; - valueIterator = valueBuffer; - } - - void GLLineTrailRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(VERTEX_BUFFER_NAME); - group.destroyBuffer(COLOR_BUFFER_NAME); - group.destroyBuffer(VALUE_BUFFER_NAME); - } - - void GLLineTrailRenderer::init(const Group& group) - { - if (!prepareBuffers(group)) - return; - - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - init(particle,particle.getAge()); - } - } - - void GLLineTrailRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - initBlending(); - initRenderingHints(); - - // Inits lines' parameters - glLineWidth(width); - glDisable(GL_TEXTURE_2D); - glShadeModel(GL_SMOOTH); - - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - float age = particle.getAge(); - float oldAge = *valueIterator; - - if ((age == 0.0f)||(age < *valueIterator)) // If the particle is new, buffers for it are reinitialized - init(particle,0.0f); - else - { - if (age - *(valueIterator + 1) >= duration / (nbSamples - 1)) // shifts the data by one - { - std::memmove(vertexIterator + 6,vertexIterator + 3,(nbSamples - 1) * 3 * sizeof(float)); - std::memmove(colorIterator + 8,colorIterator + 4,((nbSamples - 1) << 2) * sizeof(float)); - std::memmove(valueIterator + 1,valueIterator,(nbSamples - 1) * sizeof(float)); - - // post degenerated vertex copy - std::memcpy(vertexIterator + (nbSamples + 1) * 3,vertexIterator + nbSamples * 3,3 * sizeof(float)); - } - - // Updates the current sample - const Vector3D& pos = particle.position(); - *(vertexIterator++) = pos.x; - *(vertexIterator++) = pos.y; - *(vertexIterator++) = pos.z; - - std::memcpy(vertexIterator,vertexIterator - 3,3 * sizeof(float)); - vertexIterator += (nbSamples + 1) * 3; - - colorIterator += 4; // skips post degenerated vertex color - *(colorIterator++) = particle.getR(); - *(colorIterator++) = particle.getG(); - *(colorIterator++) = particle.getB(); - *(colorIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - colorIterator += 3; - - *(valueIterator++) = age; - //valueIterator += nbSamples; - - // Updates alpha - for (size_t i = 0; i < nbSamples - 1; ++i) - { - float ratio = (age - oldAge) / (duration - age + *valueIterator); - if (ratio > 0.0f) - *colorIterator *= ratio < 1.0f ? 1.0f - ratio : 0.0f; - colorIterator += 4; - ++valueIterator; - } - ++colorIterator; - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - glColorPointer(4,GL_FLOAT,0,colorBuffer); - glVertexPointer(3,GL_FLOAT,0,vertexBuffer); - - glDrawArrays(GL_LINE_STRIP,0,group.getNbParticles() * (nbSamples + 2)); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLPointRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLPointRenderer.cpp deleted file mode 100644 index 3698f2bf9..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLPointRenderer.cpp +++ /dev/null @@ -1,104 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLPointRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" - -namespace SPK -{ -namespace GL -{ - GLPointRenderer::GLPointRenderer(float size) : - GLRenderer(), - PointRendererInterface(POINT_SQUARE,size), - GLExtHandler(), - textureIndex(0), - worldSize(false) - {} - - bool GLPointRenderer::setType(PointType type) - { - if ((type == POINT_SPRITE)&&(!loadGLExtPointSprite())) - return false; - - this->type = type; - return true; - } - - bool GLPointRenderer::enableWorldSize(bool worldSizeEnabled) - { - worldSize = ((worldSizeEnabled)&&(loadGLExtPointParameter())); - return worldSize; - } - - void GLPointRenderer::render(const Group& group) - { - initBlending(); - initRenderingHints(); - - switch(type) - { - case POINT_SQUARE : - glDisable(GL_TEXTURE_2D); - glDisable(GL_POINT_SMOOTH); - if (getPointSpriteGLExt() == SUPPORTED) - disablePointSpriteGLExt(); - break; - - case POINT_SPRITE : - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D,textureIndex); - glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,getTextureBlending()); - enablePointSpriteGLExt(); - break; - - case POINT_CIRCLE : - glDisable(GL_TEXTURE_2D); - glEnable(GL_POINT_SMOOTH); - if (getPointSpriteGLExt() == SUPPORTED) - disablePointSpriteGLExt(); - break; - } - - if (worldSize) - enablePointParameterGLExt(size,true); - else - { - glPointSize(size); - - if (getPointParameterGLExt() == SUPPORTED) - disablePointParameterGLExt(); - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - glColorPointer(group.getModel()->isEnabled(PARAM_ALPHA) ? 4 : 3,GL_FLOAT,group.getParamStride(),group.getParamAddress(PARAM_RED)); - glVertexPointer(3,GL_FLOAT,group.getPositionStride(),group.getPositionAddress()); - - glDrawArrays(GL_POINTS,0,group.getNbParticles()); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.cpp deleted file mode 100644 index fb437843f..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLQuadRenderer.cpp +++ /dev/null @@ -1,282 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLQuadRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace GL -{ - const std::string GLQuadRenderer::GPU_BUFFER_NAME("SPK_GLQuadRenderer_GPU"); - const std::string GLQuadRenderer::TEXTURE_BUFFER_NAME("SPK_GLQuadRenderer_Texture"); - - float* GLQuadRenderer::gpuBuffer = NULL; - float* GLQuadRenderer::gpuIterator = NULL; - float* GLQuadRenderer::textureBuffer = NULL; - float* GLQuadRenderer::textureIterator = NULL; - - void (GLQuadRenderer::*GLQuadRenderer::renderParticle)(const Particle&) const = NULL; - - GLQuadRenderer::GLQuadRenderer(float scaleX,float scaleY) : - GLRenderer(), - QuadRendererInterface(scaleX,scaleY), - Oriented3DRendererInterface(), - GLExtHandler(), - textureIndex(0) - {} - - bool GLQuadRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fGpuBuffer; - - if ((fGpuBuffer = dynamic_cast(group.getBuffer(GPU_BUFFER_NAME))) == NULL) - return false; - - if (texturingMode != TEXTURE_NONE) - { - FloatBuffer* fTextureBuffer; - - if ((fTextureBuffer = dynamic_cast(group.getBuffer(TEXTURE_BUFFER_NAME,texturingMode))) == NULL) - textureBuffer = createTextureBuffer(group); - - if ( fTextureBuffer ) - textureIterator = textureBuffer = fTextureBuffer->getData(); - else - textureIterator = textureBuffer; - } - - gpuIterator = gpuBuffer = fGpuBuffer->getData(); - return true; - } - - void GLQuadRenderer::createBuffers(const Group& group) - { - FloatBuffer* fBuffer = dynamic_cast(group.createBuffer(GPU_BUFFER_NAME,FloatBufferCreator(28),0,false)); - gpuIterator = gpuBuffer = fBuffer->getData(); - if (texturingMode != TEXTURE_NONE) - textureIterator = textureBuffer = createTextureBuffer(group); - } - - void GLQuadRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(GPU_BUFFER_NAME); - group.destroyBuffer(TEXTURE_BUFFER_NAME); - } - - float* GLQuadRenderer::createTextureBuffer(const Group& group) const - { - FloatBuffer* fbuffer = NULL; - - switch(texturingMode) - { - case TEXTURE_2D : - fbuffer = dynamic_cast(group.createBuffer(TEXTURE_BUFFER_NAME,FloatBufferCreator(8),TEXTURE_2D,false)); - if (!group.getModel()->isEnabled(PARAM_TEXTURE_INDEX)) - { - float t[8] = {1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f}; - for (size_t i = 0; i < group.getParticles().getNbReserved() << 3; ++i) - fbuffer->getData()[i] = t[i & 7]; - } - break; - - case TEXTURE_3D : - fbuffer = dynamic_cast(group.createBuffer(TEXTURE_BUFFER_NAME,FloatBufferCreator(12),TEXTURE_3D,false)); - float t[12] = {1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,1.0f,1.0f,0.0f}; - for (size_t i = 0; i < group.getParticles().getNbReserved() * 12; ++i) - fbuffer->getData()[i] = t[i % 12]; - break; - } - - return fbuffer->getData(); - } - - bool GLQuadRenderer::setTexturingMode(TexturingMode mode) - { - if ((mode == TEXTURE_3D)&&(!loadGLExtTexture3D())) - return false; - - texturingMode = mode; - return true; - } - - void GLQuadRenderer::render(const Group& group) - { - if (!prepareBuffers(group)) - return; - - float oldModelView[16]; - for (int i = 0; i < 16; ++i) - oldModelView[i] = modelView[i]; - glGetFloatv(GL_MODELVIEW_MATRIX,modelView); - for (int i = 0; i < 16; ++i) - if (oldModelView[i] != modelView[i]) - { - invertModelView(); - break; - } - - initBlending(); - initRenderingHints(); - - glShadeModel(GL_FLAT); - - switch(texturingMode) - { - case TEXTURE_2D : - if (getTexture3DGLExt() == SUPPORTED) - glDisable(GL_TEXTURE_3D); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D,textureIndex); - glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,getTextureBlending()); - - if (!group.getModel()->isEnabled(PARAM_TEXTURE_INDEX)) - { - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &GLQuadRenderer::render2D; - else - renderParticle = &GLQuadRenderer::render2DRot; - } - else - { - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &GLQuadRenderer::render2DAtlas; - else - renderParticle = &GLQuadRenderer::render2DAtlasRot; - } - break; - - case TEXTURE_3D : - glDisable(GL_TEXTURE_2D); - glEnable(GL_TEXTURE_3D); - glBindTexture(GL_TEXTURE_3D,textureIndex); - glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,getTextureBlending()); - - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &GLQuadRenderer::render3D; - else - renderParticle = &GLQuadRenderer::render3DRot; - break; - - case TEXTURE_NONE : - glDisable(GL_TEXTURE_2D); - if (getTexture3DGLExt() == SUPPORTED) - glDisable(GL_TEXTURE_3D); - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &GLQuadRenderer::render2D; - else - renderParticle = &GLQuadRenderer::render2DRot; - break; - } - - bool globalOrientation = precomputeOrientation3D( - group, - Vector3D(-invModelView[8],-invModelView[9],-invModelView[10]), - Vector3D(invModelView[4],invModelView[5],invModelView[6]), - Vector3D(invModelView[12],invModelView[13],invModelView[14])); - - if (globalOrientation) - { - computeGlobalOrientation3D(); - - for (size_t i = 0; i < group.getNbParticles(); ++i) - (this->*renderParticle)(group.getParticle(i)); - } - else - { - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - computeSingleOrientation3D(particle); - (this->*renderParticle)(particle); - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - if (texturingMode == TEXTURE_2D) - { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2,GL_FLOAT,0,textureBuffer); - } - else if (texturingMode == TEXTURE_3D) - { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(3,GL_FLOAT,0,textureBuffer); - } - - // interleaves vertex and color data - glVertexPointer(3,GL_FLOAT,7 * sizeof(float),gpuBuffer); - glColorPointer(4,GL_FLOAT,7 * sizeof(float),gpuBuffer + 3); - - glDrawArrays(GL_QUADS,0,group.getNbParticles() << 2); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - - if (texturingMode != TEXTURE_NONE) - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - - void GLQuadRenderer::render2D(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - } - - void GLQuadRenderer::render2DRot(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - } - - void GLQuadRenderer::render3D(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture3D(particle); - } - - void GLQuadRenderer::render3DRot(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture3D(particle); - } - - void GLQuadRenderer::render2DAtlas(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture2DAtlas(particle); - } - - void GLQuadRenderer::render2DAtlasRot(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture2DAtlas(particle); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLRenderer.cpp deleted file mode 100644 index cbc0e337b..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/OpenGL/SPK_GLRenderer.cpp +++ /dev/null @@ -1,80 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.h" - -namespace SPK -{ -namespace GL -{ - GLRenderer::GLRenderer() : - Renderer(), - blendingEnabled(false), - srcBlending(GL_SRC_ALPHA), - destBlending(GL_ONE_MINUS_SRC_ALPHA), - textureBlending(GL_MODULATE) - {} - - GLRenderer::~GLRenderer() {} - - void GLRenderer::setBlending(BlendingMode blendMode) - { - switch(blendMode) - { - case BLENDING_NONE : - srcBlending = GL_ONE; - destBlending = GL_ZERO; - blendingEnabled = false; - break; - - case BLENDING_ADD : - srcBlending = GL_SRC_ALPHA; - destBlending = GL_ONE; - blendingEnabled = true; - break; - - case BLENDING_ALPHA : - srcBlending = GL_SRC_ALPHA; - destBlending = GL_ONE_MINUS_SRC_ALPHA; - blendingEnabled = true; - break; - } - } - - void GLRenderer::saveGLStates() - { - glPushAttrib(GL_POINT_BIT | - GL_LINE_BIT | - GL_ENABLE_BIT | - GL_COLOR_BUFFER_BIT | - GL_CURRENT_BIT | - GL_TEXTURE_BIT | - GL_DEPTH_BUFFER_BIT | - GL_LIGHTING_BIT | - GL_POLYGON_BIT); - } - - void GLRenderer::restoreGLStates() - { - glPopAttrib(); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.cpp deleted file mode 100644 index e7389e206..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.cpp +++ /dev/null @@ -1,70 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" - -namespace SPK -{ -namespace SFML -{ - const float SFMLDrawableRenderer::RAD2DEG = 180.0f / 3.1415926535897932384626433832795f; - - SFMLDrawableRenderer::SFMLDrawableRenderer(sf::Drawable* drawable,float scaleX,float scaleY) : - SFMLRenderer(), - drawable(drawable), - scaleX(scaleX), - scaleY(scaleY) - {} - - void SFMLDrawableRenderer::innerRender(const Group& group) - { - if (drawable == NULL) - return; - - drawable->SetBlendMode(getBlendMode()); - - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - - if ((!hasGroundCulling())||(particle.position().z >= 0.0f)) - { - drawable->SetPosition(particle.position().x, - particle.position().y - particle.position().z * getZFactor()); - - drawable->SetColor(sf::Color(static_cast(particle.getR() * 255.0f), - static_cast(particle.getG() * 255.0f), - static_cast(particle.getB() * 255.0f), - static_cast(particle.getParamCurrentValue(PARAM_ALPHA) * 255.0f))); - - drawable->SetScale(particle.getParamCurrentValue(PARAM_SIZE) * scaleX, - particle.getParamCurrentValue(PARAM_SIZE) * scaleY); - - drawable->SetRotation(-particle.getParamCurrentValue(PARAM_ANGLE) * RAD2DEG); - - getCurrentTarget()->Draw(*drawable); - } - } - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLLineRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLLineRenderer.cpp deleted file mode 100644 index 2ad450540..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLLineRenderer.cpp +++ /dev/null @@ -1,113 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/SFML/SPK_SFMLLineRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace SFML -{ - const std::string SFMLLineRenderer::GPU_BUFFER_NAME("SPK_SFMLLineRenderer_GPU"); - - float* SFMLLineRenderer::gpuBuffer = NULL; - float* SFMLLineRenderer::gpuIterator = NULL; - - SFMLLineRenderer::SFMLLineRenderer(float length,float width,ResizeMode mode) : - SFMLRenderer(), - LineRendererInterface(length,width), - resizeMode(mode) - {} - - bool SFMLLineRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fBuffer; - if ((fBuffer = dynamic_cast(group.getBuffer(GPU_BUFFER_NAME))) == NULL) - return false; - - gpuIterator = gpuBuffer = fBuffer->getData(); - return true; - } - - void SFMLLineRenderer::createBuffers(const Group& group) - { - FloatBuffer* fBuffer = dynamic_cast(group.createBuffer(GPU_BUFFER_NAME,FloatBufferCreator(12),0,false)); - gpuIterator = gpuBuffer = fBuffer->getData(); - } - - void SFMLLineRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(GPU_BUFFER_NAME); - } - - void SFMLLineRenderer::innerRender(const Group& group) - { - glLineWidth(width * getViewZoom(resizeMode)); - glDisable(GL_TEXTURE_2D); - glShadeModel(GL_FLAT); - - size_t nbToRender = 0; - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - - if ((!hasGroundCulling())||(particle.position().z >= 0.0f)||(particle.position().z + particle.velocity().z * length >= 0.0f)) - { - float x = particle.position().x; - float y = particle.position().y; - float z = particle.position().z; - float dx = particle.velocity().x; - float dy = particle.velocity().y; - float dz = particle.velocity().z; - - *(gpuIterator++) = x; - *(gpuIterator++) = y - z * getZFactor(); - - gpuIterator += 4; // skips the first vertex color data as GL_FLAT was forced - - *(gpuIterator++) = x + dx * length; - *(gpuIterator++) = y + dy * length - (z + dz * length) * getZFactor(); - - *(gpuIterator++) = particle.getR(); - *(gpuIterator++) = particle.getG(); - *(gpuIterator++) = particle.getB(); - *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - - ++nbToRender; - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - // interleaves vertex and color data - glVertexPointer(2,GL_FLOAT,6 * sizeof(float),gpuBuffer); - glColorPointer(4,GL_FLOAT,6 * sizeof(float),gpuBuffer + 2); - - glDrawArrays(GL_LINES,0,nbToRender << 1); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLPointRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLPointRenderer.cpp deleted file mode 100644 index f295a71f1..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLPointRenderer.cpp +++ /dev/null @@ -1,137 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/SFML/SPK_SFMLPointRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace SFML -{ - const std::string SFMLPointRenderer::GPU_BUFFER_NAME("SPK_SFMLPointRenderer_GPU"); - - float* SFMLPointRenderer::gpuBuffer = NULL; - float* SFMLPointRenderer::gpuIterator = NULL; - - SFMLPointRenderer::SFMLPointRenderer(float size,ResizeMode mode) : - SFMLRenderer(), - PointRendererInterface(POINT_SQUARE,size), - GL::GLExtHandler(), - resizeMode(mode), - image(NULL) - {} - - bool SFMLPointRenderer::setType(PointType type) - { - if ((type == POINT_SPRITE)&&(!loadGLExtPointSprite())) - return false; - - this->type = type; - return true; - } - - bool SFMLPointRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fBuffer; - if ((fBuffer = dynamic_cast(group.getBuffer(GPU_BUFFER_NAME))) == NULL) - return false; - - gpuIterator = gpuBuffer = fBuffer->getData(); - return true; - } - - void SFMLPointRenderer::createBuffers(const Group& group) - { - FloatBuffer* fBuffer = dynamic_cast(group.createBuffer(GPU_BUFFER_NAME,FloatBufferCreator(6),0,false)); - gpuIterator = gpuBuffer = fBuffer->getData(); - } - - void SFMLPointRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(GPU_BUFFER_NAME); - } - - void SFMLPointRenderer::innerRender(const Group& group) - { - if (loadGLExtPointParameter()) - enablePointParameterGLExt(size * getViewZoom(resizeMode),false); - else - glPointSize(size * getViewZoom(resizeMode)); - - switch(type) - { - case POINT_SQUARE : - glDisable(GL_TEXTURE_2D); - glDisable(GL_POINT_SMOOTH); - if (getPointSpriteGLExt() == SUPPORTED) - disablePointSpriteGLExt(); - break; - - case POINT_SPRITE : - if (image != NULL) - image->Bind(); - glTexEnvf(GL_POINT_SPRITE,GL_COORD_REPLACE,GL_TRUE); - enablePointSpriteGLExt(); - break; - - case POINT_CIRCLE : - glDisable(GL_TEXTURE_2D); - glEnable(GL_POINT_SMOOTH); - if (getPointSpriteGLExt() == SUPPORTED) - disablePointSpriteGLExt(); - break; - } - - size_t nbToRender = 0; - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - - if ((!hasGroundCulling())||(particle.position().z >= 0.0f)) - { - *(gpuIterator++) = particle.position().x; - *(gpuIterator++) = particle.position().y - particle.position().z * getZFactor(); - - *(gpuIterator++) = particle.getR(); - *(gpuIterator++) = particle.getG(); - *(gpuIterator++) = particle.getB(); - *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA); - - ++nbToRender; - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - // interleaves vertex and color data - glVertexPointer(2,GL_FLOAT,6 * sizeof(float),gpuBuffer); - glColorPointer(4,GL_FLOAT,6 * sizeof(float),gpuBuffer + 2); - - glDrawArrays(GL_POINTS,0,nbToRender); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.cpp deleted file mode 100644 index 6b6791f1d..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLQuadRenderer.cpp +++ /dev/null @@ -1,208 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/SFML/SPK_SFMLQuadRenderer.h" -#include "Core/SPK_Particle.h" -#include "Core/SPK_Group.h" -#include "Core/SPK_ArrayBuffer.h" - -namespace SPK -{ -namespace SFML -{ - const std::string SFMLQuadRenderer::GPU_BUFFER_NAME("SPK_SFMLQuadRenderer_GPU"); - const std::string SFMLQuadRenderer::TEXTURE_BUFFER_NAME("SPK_SFMLQuadRenderer_Texture"); - - float* SFMLQuadRenderer::gpuBuffer = NULL; - float* SFMLQuadRenderer::gpuIterator = NULL; - float* SFMLQuadRenderer::textureBuffer = NULL; - float* SFMLQuadRenderer::textureIterator = NULL; - - void (SFMLQuadRenderer::*SFMLQuadRenderer::renderParticle)(const Particle&) const = NULL; - - SFMLQuadRenderer::SFMLQuadRenderer(sf::Image* image,float scaleX,float scaleY) : - SFMLRenderer(), - QuadRendererInterface(scaleX,scaleY), - Oriented2DRendererInterface(), - image(image) - { - if (image != NULL) - setTexturingMode(image != NULL ? TEXTURE_2D : TEXTURE_NONE); - } - - bool SFMLQuadRenderer::checkBuffers(const Group& group) - { - FloatBuffer* fBuffer; - if ((fBuffer = dynamic_cast(group.getBuffer(GPU_BUFFER_NAME))) == NULL) - return false; - - if (texturingMode != TEXTURE_NONE) - { - FloatBuffer* fTextureBuffer; - - if ((fTextureBuffer = dynamic_cast(group.getBuffer(TEXTURE_BUFFER_NAME))) == NULL) - textureBuffer = createTextureBuffer(group); - - textureIterator = textureBuffer = fTextureBuffer->getData(); - } - - gpuIterator = gpuBuffer = fBuffer->getData(); - return true; - } - - void SFMLQuadRenderer::createBuffers(const Group& group) - { - FloatBuffer* fBuffer = dynamic_cast(group.createBuffer(GPU_BUFFER_NAME,FloatBufferCreator(24),0,false)); - gpuIterator = gpuBuffer = fBuffer->getData(); - if (texturingMode != TEXTURE_NONE) - textureIterator = textureBuffer = createTextureBuffer(group); - } - - float* SFMLQuadRenderer::createTextureBuffer(const Group& group) const - { - FloatBuffer* fbuffer = dynamic_cast(group.createBuffer(TEXTURE_BUFFER_NAME,FloatBufferCreator(8),0,false)); - if (!group.getModel()->isEnabled(PARAM_TEXTURE_INDEX)) - { - float t[8] = {1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f}; - for (size_t i = 0; i < group.getParticles().getNbReserved() << 3; ++i) - fbuffer->getData()[i] = t[i & 7]; - } - return fbuffer->getData(); - } - - void SFMLQuadRenderer::destroyBuffers(const Group& group) - { - group.destroyBuffer(GPU_BUFFER_NAME); - group.destroyBuffer(TEXTURE_BUFFER_NAME); - } - - void SFMLQuadRenderer::innerRender(const Group& group) - { - if (texturingMode == TEXTURE_2D) - { - if (image != NULL) - image->Bind(); - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - { - if (!group.getModel()->isEnabled(PARAM_TEXTURE_INDEX)) - renderParticle = &SFMLQuadRenderer::renderVA; - else - renderParticle = &SFMLQuadRenderer::renderAtlasVA; - } - else - { - if (!group.getModel()->isEnabled(PARAM_TEXTURE_INDEX)) - renderParticle = &SFMLQuadRenderer::renderRotVA; - else - renderParticle = &SFMLQuadRenderer::renderAtlasRotVA; - } - } - else - { - glDisable(GL_TEXTURE_2D); - if (!group.getModel()->isEnabled(PARAM_ANGLE)) - renderParticle = &SFMLQuadRenderer::renderVA; - else - renderParticle = &SFMLQuadRenderer::renderRotVA; - } - - glShadeModel(GL_FLAT); - - bool globalOrientation = hasGlobalOrientation(); - - size_t nbToRender = 0; - if (globalOrientation) - { - computeGlobalOrientation2D(); - - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - if ((!hasGroundCulling())||(particle.position().z >= 0.0f)) - { - (this->*renderParticle)(particle); - ++nbToRender; - } - } - } - else - { - for (size_t i = 0; i < group.getNbParticles(); ++i) - { - const Particle& particle = group.getParticle(i); - if ((!hasGroundCulling())||(particle.position().z >= 0.0f)) - { - computeSingleOrientation2D(particle); - (this->*renderParticle)(particle); - ++nbToRender; - } - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - - if (texturingMode == TEXTURE_2D) - { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2,GL_FLOAT,0,textureBuffer); - } - - // interleaves vertex and color data - glVertexPointer(2,GL_FLOAT,6 * sizeof(float),gpuBuffer); - glColorPointer(4,GL_FLOAT,6 * sizeof(float),gpuBuffer + 2); - - glDrawArrays(GL_QUADS,0,nbToRender << 2); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - - if (texturingMode == TEXTURE_2D) - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - - void SFMLQuadRenderer::renderVA(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - } - - void SFMLQuadRenderer::renderAtlasVA(const Particle& particle) const - { - scaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture2DAtlas(particle); - } - - void SFMLQuadRenderer::renderRotVA(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - } - - void SFMLQuadRenderer::renderAtlasRotVA(const Particle& particle) const - { - rotateAndScaleQuadVectors(particle,scaleX,scaleY); - GLCallColorAndVertex(particle); - GLCallTexture2DAtlas(particle); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLRenderer.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLRenderer.cpp deleted file mode 100644 index 327a8e490..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLRenderer.cpp +++ /dev/null @@ -1,118 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" -#include "Core/SPK_Group.h" - -namespace SPK -{ -namespace SFML -{ - float SFMLRenderer::zFactor = 0.0f; - - sf::RenderTarget* SFMLRenderer::currentTarget = NULL; - - SFMLRenderer::SFMLRenderer() : - Renderer(), - blendMode(sf::Blend::None), - groundCulling(false) - {} - - SFMLRenderer::~SFMLRenderer() {} - - void SFMLRenderer::setBlending(BlendingMode blendMode) - { - switch(blendMode) - { - case BLENDING_NONE : - this->blendMode = sf::Blend::None; - break; - - case BLENDING_ADD : - this->blendMode = sf::Blend::Add; - break; - - case BLENDING_ALPHA : - this->blendMode = sf::Blend::Alpha; - break; - } - } - - void SFMLRenderer::render(const Group& group) - { - if ((getCurrentTarget() == NULL)||(!prepareBuffers(group))) - return; - - initBlending(); - - if (isRenderingHintEnabled(ALPHA_TEST)) - { - glAlphaFunc(GL_GEQUAL,getAlphaTestThreshold()); - glEnable(GL_ALPHA_TEST); - } - else - glDisable(GL_ALPHA_TEST); - - innerRender(group); - } - - void SFMLRenderer::setZFactor(float zFactor) - { - SFMLRenderer::zFactor = zFactor; - } - - float SFMLRenderer::getZFactor() - { - return zFactor; - } - - void SFMLRenderer::bindCurrentTarget(sf::RenderTarget& target) - { - currentTarget = ⌖ - } - - void SFMLRenderer::releaseCurrentTarget() - { - currentTarget = NULL; - } - - sf::RenderTarget* SFMLRenderer::getCurrentTarget() - { - return currentTarget; - } - - float SFMLRenderer::getViewZoom(ResizeMode mode) - { - if (mode == RESIZE_NONE) - return 1.0f; - - sf::Vector2f halfSize(currentTarget->GetView().GetHalfSize()); - - if (mode == RESIZE_ZOOM_X) - return currentTarget->GetWidth() / (halfSize.x * 2.0f); // target width / view width - - if (mode == RESIZE_ZOOM_Y) - return currentTarget->GetHeight() / (halfSize.y * 2.0f); // target height / view height - - return 0.0f; - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLSystem.cpp b/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLSystem.cpp deleted file mode 100644 index 69f77ddb1..000000000 --- a/Extensions/ParticleSystem/SPARK/src/RenderingAPIs/SFML/SPK_SFMLSystem.cpp +++ /dev/null @@ -1,65 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - -#include "RenderingAPIs/SFML/SPK_SFML_GLOBAL.h" -#include "RenderingAPIs/SFML/SPK_SFMLSystem.h" -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.h" - -namespace SPK -{ -namespace SFML -{ - SFMLSystem::SFMLSystem(bool worldTransformed,sf::RenderTarget* renderTarget) : - System(), - sf::Drawable(), - worldTransformed(worldTransformed), - target(renderTarget) - {} - - bool SFMLSystem::update(float deltaTime) - { - if (isWorldTransformed()) - { - setMatrix(*this,GetMatrix()); - updateTransform(); - } - return System::update(deltaTime); - } - - void SFMLSystem::render() const - { - if (target != NULL) - target->Draw(*this); - } - - void SFMLSystem::Render(sf::RenderTarget& target) const - { - SFMLRenderer::bindCurrentTarget(target); - - if (isWorldTransformed()) - { - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - } - - System::render(); - } -}} diff --git a/Extensions/ParticleSystem/SPARK/src/SPK_All.cpp b/Extensions/ParticleSystem/SPARK/src/SPK_All.cpp deleted file mode 100644 index e49bac088..000000000 --- a/Extensions/ParticleSystem/SPARK/src/SPK_All.cpp +++ /dev/null @@ -1,79 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////// -// Note : // -// // -// This file is used to speed up the compilation of a module, lower the size // -// of the output library on certain compilers and allow deeper optimizations // -// by reunifying all compilation units into one (single compilation unit // -// method). // -// // -// Either only this file or all the files below should be compiled, not both or // -// some 'multiple definition of symbols' errors will occur. // -////////////////////////////////////////////////////////////////////////////////// - - -// Core -#include "Core/SPK_DEF.cpp" -#include "Core/SPK_Vector3D.cpp" -#include "Core/SPK_Registerable.cpp" // 1.03 -#include "Core/SPK_Transformable.cpp" // 1.03 -#include "Core/SPK_BufferHandler.cpp" // 1.04 -#include "Core/SPK_Renderer.cpp" -#include "Core/SPK_System.cpp" -#include "Core/SPK_Particle.cpp" -#include "Core/SPK_Zone.cpp" -#include "Core/SPK_Interpolator.cpp" // 1.05 -#include "Core/SPK_Model.cpp" -#include "Core/SPK_Emitter.cpp" -#include "Core/SPK_Modifier.cpp" -#include "Core/SPK_Group.cpp" -#include "Core/SPK_Factory.cpp" // 1.03 - -// Zones -#include "Extensions/Zones/SPK_AABox.cpp" -#include "Extensions/Zones/SPK_Point.cpp" -#include "Extensions/Zones/SPK_Sphere.cpp" -#include "Extensions/Zones/SPK_Plane.cpp" -#include "Extensions/Zones/SPK_Line.cpp" // 1.01 -#include "Extensions/Zones/SPK_Ring.cpp" // 1.05 -#include "Extensions/Zones/SPK_Cylinder.cpp" - -// Emitters -#include "Extensions/Emitters/SPK_StraightEmitter.cpp" -#include "Extensions/Emitters/SPK_SphericEmitter.cpp" -#include "Extensions/Emitters/SPK_NormalEmitter.cpp" // 1.02 -#include "Extensions/Emitters/SPK_RandomEmitter.cpp" // 1.02 - -// Modifiers -#include "Extensions/Modifiers/SPK_Obstacle.cpp" -#include "Extensions/Modifiers/SPK_Destroyer.cpp" -#include "Extensions/Modifiers/SPK_PointMass.cpp" -#include "Extensions/Modifiers/SPK_ModifierGroup.cpp" // 1.02 -#include "Extensions/Modifiers/SPK_LinearForce.cpp" // 1.03 -#include "Extensions/Modifiers/SPK_Collision.cpp" // 1.04 -#include "Extensions/Modifiers/SPK_Vortex.cpp" // 1.05 - -// Renderer Interfaces -#include "Extensions/Renderers/SPK_QuadRendererInterface.cpp" // 1.04 -#include "Extensions/Renderers/SPK_Oriented3DRendererInterface.cpp" // 1.04 diff --git a/Extensions/ParticleSystem/SPARK/src/SPK_GL_All.cpp b/Extensions/ParticleSystem/SPARK/src/SPK_GL_All.cpp deleted file mode 100644 index 68e1f4faf..000000000 --- a/Extensions/ParticleSystem/SPARK/src/SPK_GL_All.cpp +++ /dev/null @@ -1,42 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////// -// Note : // -// // -// This file is used to speed up the compilation of a module, lower the size // -// of the output library on certain compilers and allow deeper optimizations // -// by reunifying all compilation units into one (single compilation unit // -// method). // -// // -// Either only this file or all the files below should be compiled, not both or // -// some 'multiple definition of symbols' errors will occur. // -////////////////////////////////////////////////////////////////////////////////// - - -// GL -#include "RenderingAPIs/OpenGL/SPK_GLExtHandler.cpp" // 1.01 -#include "RenderingAPIs/OpenGL/SPK_GLRenderer.cpp" -#include "RenderingAPIs/OpenGL/SPK_GLLineRenderer.cpp" -#include "RenderingAPIs/OpenGL/SPK_GLPointRenderer.cpp" -#include "RenderingAPIs/OpenGL/SPK_GLQuadRenderer.cpp" -#include "RenderingAPIs/OpenGL/SPK_GLLineTrailRenderer.cpp" // 1.03 diff --git a/Extensions/ParticleSystem/SPARK/src/SPK_IRR_ALL.cpp b/Extensions/ParticleSystem/SPARK/src/SPK_IRR_ALL.cpp deleted file mode 100644 index 7fd8b0240..000000000 --- a/Extensions/ParticleSystem/SPARK/src/SPK_IRR_ALL.cpp +++ /dev/null @@ -1,44 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK Irrlicht Rendering library // -// Copyright (C) 2008-2009 // -// Thibault Lescoat - info-tibo orange fr // -// Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////// -// Note : // -// // -// This file is used to speed up the compilation of a module, lower the size // -// of the output library on certain compilers and allow deeper optimizations // -// by reunifying all compilation units into one (single compilation unit // -// method). // -// // -// Either only this file or all the files below should be compiled, not both or // -// some 'multiple definition of symbols' errors will occur. // -////////////////////////////////////////////////////////////////////////////////// - - -// IRR -#include "RenderingAPIs/Irrlicht/SPK_IRRBuffer.cpp" -#include "RenderingAPIs/Irrlicht/SPK_IRRSystem.cpp" -#include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.cpp" -#include "RenderingAPIs/Irrlicht/SPK_IRRPointRenderer.cpp" -#include "RenderingAPIs/Irrlicht/SPK_IRRLineRenderer.cpp" -#include "RenderingAPIs/Irrlicht/SPK_IRRQuadRenderer.cpp" diff --git a/Extensions/ParticleSystem/SPARK/src/SPK_SFML_All.cpp b/Extensions/ParticleSystem/SPARK/src/SPK_SFML_All.cpp deleted file mode 100644 index f3e616ea5..000000000 --- a/Extensions/ParticleSystem/SPARK/src/SPK_SFML_All.cpp +++ /dev/null @@ -1,42 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////// -// SPARK particle engine // -// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com // -// // -// This software is provided 'as-is', without any express or implied // -// warranty. In no event will the authors be held liable for any damages // -// arising from the use of this software. // -// // -// Permission is granted to anyone to use this software for any purpose, // -// including commercial applications, and to alter it and redistribute it // -// freely, subject to the following restrictions: // -// // -// 1. The origin of this software must not be misrepresented; you must not // -// claim that you wrote the original software. If you use this software // -// in a product, an acknowledgment in the product documentation would be // -// appreciated but is not required. // -// 2. Altered source versions must be plainly marked as such, and must not be // -// misrepresented as being the original software. // -// 3. This notice may not be removed or altered from any source distribution. // -////////////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////// -// Note : // -// // -// This file is used to speed up the compilation of a module, lower the size // -// of the output library on certain compilers and allow deeper optimizations // -// by reunifying all compilation units into one (single compilation unit // -// method). // -// // -// Either only this file or all the files below should be compiled, not both or // -// some 'multiple definition of symbols' errors will occur. // -////////////////////////////////////////////////////////////////////////////////// - - -// SFML -#include "RenderingAPIs/SFML/SPK_SFMLSystem.cpp" -#include "RenderingAPIs/SFML/SPK_SFMLRenderer.cpp" -#include "RenderingAPIs/SFML/SPK_SFMLQuadRenderer.cpp" -#include "RenderingAPIs/SFML/SPK_SFMLDrawableRenderer.cpp" -#include "RenderingAPIs/SFML/SPK_SFMLLineRenderer.cpp" -#include "RenderingAPIs/SFML/SPK_SFMLPointRenderer.cpp" diff --git a/Extensions/PathfindingBehavior/CMakeLists.txt b/Extensions/PathfindingBehavior/CMakeLists.txt index 4f05f6e8d..dcc8bdc01 100644 --- a/Extensions/PathfindingBehavior/CMakeLists.txt +++ b/Extensions/PathfindingBehavior/CMakeLists.txt @@ -13,19 +13,8 @@ gd_add_extension_definitions(PathfindingBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(PathfindingBehavior "${source_files}") - gd_add_extension_target(PathfindingBehavior "${source_files}") -gdcpp_add_runtime_extension_target(PathfindingBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(PathfindingBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(PathfindingBehavior_Runtime) - -#Tests for the GD C++ Runtime extension -### -file(GLOB_RECURSE test_source_files tests/*) -gdcpp_add_tests_extension_target(PathfindingBehavior_Runtime_tests "${test_source_files}") diff --git a/Extensions/PathfindingBehavior/Extension.cpp b/Extensions/PathfindingBehavior/Extension.cpp index 41b073bf6..2774237d8 100644 --- a/Extensions/PathfindingBehavior/Extension.cpp +++ b/Extensions/PathfindingBehavior/Extension.cpp @@ -5,12 +5,12 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h" +#include "GDCore/Tools/Localization.h" +#include "GDCore/Project/BehaviorsSharedData.h" #include "PathfindingBehavior.h" #include "PathfindingObstacleBehavior.h" -#include "PathfindingObstacleRuntimeBehavior.h" -#include "PathfindingRuntimeBehavior.h" void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -695,45 +695,3 @@ void DeclarePathfindingBehaviorExtension(gd::PlatformExtension& extension) { #endif } } - -/** - * \brief This class declares information about the extension. - */ -class PathfindingBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - PathfindingBehaviorCppExtension() { - DeclarePathfindingBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("PathfindingBehavior::Pathfinding"), - "PathfindingRuntimeBehavior"); - GetBehaviorMetadata("PathfindingBehavior::Pathfinding") - .SetIncludeFile("PathfindingBehavior/PathfindingRuntimeBehavior.h"); - - AddRuntimeBehavior( - GetBehaviorMetadata("PathfindingBehavior::PathfindingObstacle"), - "PathfindingObstacleRuntimeBehavior"); - GetBehaviorMetadata("PathfindingBehavior::PathfindingObstacle") - .SetIncludeFile( - "PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppPathfindingBehaviorExtension() { - return new PathfindingBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new PathfindingBehaviorCppExtension; -} -#endif diff --git a/Extensions/PathfindingBehavior/PathfindingBehavior.cpp b/Extensions/PathfindingBehavior/PathfindingBehavior.cpp index cfccadc42..c3f7e9ddc 100644 --- a/Extensions/PathfindingBehavior/PathfindingBehavior.cpp +++ b/Extensions/PathfindingBehavior/PathfindingBehavior.cpp @@ -9,7 +9,7 @@ This project is released under the MIT License. #include #include "GDCore/Project/PropertyDescriptor.h" #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/Serialization/SerializerElement.h" void PathfindingBehavior::InitializeContent( gd::SerializerElement& behaviorContent) { diff --git a/Extensions/PathfindingBehavior/PathfindingBehavior.h b/Extensions/PathfindingBehavior/PathfindingBehavior.h index 9f67a40fc..d48cc2b4c 100644 --- a/Extensions/PathfindingBehavior/PathfindingBehavior.h +++ b/Extensions/PathfindingBehavior/PathfindingBehavior.h @@ -9,8 +9,8 @@ This project is released under the MIT License. #define PATHFINDINGBEHAVIOR_H #include #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" namespace gd { class Layout; } @@ -25,7 +25,7 @@ class RuntimeScenePlatformData; /** * \brief Compute path for objects avoiding obstacles */ -class GD_EXTENSION_API PathfindingBehavior : public Behavior { +class GD_EXTENSION_API PathfindingBehavior : public gd::Behavior { public: PathfindingBehavior(){}; virtual ~PathfindingBehavior(){}; diff --git a/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.cpp b/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.cpp index 64a762a44..258a03758 100644 --- a/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.cpp +++ b/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.cpp @@ -7,7 +7,7 @@ This project is released under the MIT License. #include "PathfindingObstacleBehavior.h" #include "GDCore/Project/PropertyDescriptor.h" #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/Serialization/SerializerElement.h" void PathfindingObstacleBehavior::InitializeContent( gd::SerializerElement& behaviorContent) { diff --git a/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.h b/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.h index 942b6133e..c313ea531 100644 --- a/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.h +++ b/Extensions/PathfindingBehavior/PathfindingObstacleBehavior.h @@ -8,7 +8,7 @@ This project is released under the MIT License. #ifndef PATHFINDINGOBSTACLEBEHAVIOR_H #define PATHFINDINGOBSTACLEBEHAVIOR_H #include -#include "GDCpp/Runtime/Project/Behavior.h" +#include "GDCore/Project/Behavior.h" namespace gd { class SerializerElement; class PropertyDescriptor; @@ -20,7 +20,7 @@ class Layout; * \brief Behavior that mark object as being obstacles for objects using * pathfinding behavior. */ -class GD_EXTENSION_API PathfindingObstacleBehavior : public Behavior { +class GD_EXTENSION_API PathfindingObstacleBehavior : public gd::Behavior { public: PathfindingObstacleBehavior(){}; virtual ~PathfindingObstacleBehavior(){}; diff --git a/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.cpp b/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.cpp deleted file mode 100644 index 1aeff97dd..000000000 --- a/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#include "PathfindingObstacleRuntimeBehavior.h" -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "ScenePathfindingObstaclesManager.h" -#if defined(GD_IDE_ONLY) -#include -#include -#include "GDCore/Project/PropertyDescriptor.h" -#include "GDCore/Tools/Localization.h" -#endif - -PathfindingObstacleRuntimeBehavior::PathfindingObstacleRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - parentScene(NULL), - sceneManager(NULL), - registeredInManager(false), - impassable(true), - cost(2) { - impassable = behaviorContent.GetBoolAttribute("impassable"); - cost = behaviorContent.GetDoubleAttribute("cost"); -} - -PathfindingObstacleRuntimeBehavior::~PathfindingObstacleRuntimeBehavior() { - if (sceneManager && registeredInManager) sceneManager->RemoveObstacle(this); -} - -void PathfindingObstacleRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - if (sceneManager) // Remove the object from any old scene manager. - sceneManager->RemoveObstacle(this); - - parentScene = &scene; - sceneManager = parentScene - ? &ScenePathfindingObstaclesManager::managers[&scene] - : NULL; - registeredInManager = false; - } - - if (!activated && registeredInManager) { - if (sceneManager) sceneManager->RemoveObstacle(this); - registeredInManager = false; - } else if (activated && !registeredInManager) { - if (sceneManager) { - sceneManager->AddObstacle(this); - registeredInManager = true; - } - } -} - -void PathfindingObstacleRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { -} - -void PathfindingObstacleRuntimeBehavior::OnActivate() { - if (sceneManager) { - sceneManager->AddObstacle(this); - registeredInManager = true; - } -} - -void PathfindingObstacleRuntimeBehavior::OnDeActivate() { - if (sceneManager) sceneManager->RemoveObstacle(this); - - registeredInManager = false; -} diff --git a/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h b/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h deleted file mode 100644 index 1bddc2b88..000000000 --- a/Extensions/PathfindingBehavior/PathfindingObstacleRuntimeBehavior.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PATHFINDINGOBSTACLERUNTIMEBEHAVIOR_H -#define PATHFINDINGOBSTACLERUNTIMEBEHAVIOR_H -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class ScenePathfindingObstaclesManager; -class RuntimeScene; -namespace gd { -class SerializerElement; -} - -/** - * \brief Behavior that mark object as being obstacles for objects using - * pathfinding behavior. - */ -class GD_EXTENSION_API PathfindingObstacleRuntimeBehavior : public RuntimeBehavior { - public: - PathfindingObstacleRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~PathfindingObstacleRuntimeBehavior(); - virtual PathfindingObstacleRuntimeBehavior* Clone() const { - return new PathfindingObstacleRuntimeBehavior(*this); - } - - /** - * \brief Return the object owning this behavior. - */ - RuntimeObject* GetObject() const { return object; } - - /** - * \brief Return true if the obstacle is impassable. - */ - bool IsImpassable() const { return impassable; } - - /** - * \brief Set the object as impassable or not. - */ - void SetImpassable(bool impassable_ = true) { impassable = impassable_; } - - /** - * \brief Return the cost of moving on the object. - */ - float GetCost() const { return cost; } - - /** - * \brief Change the cost of moving on the object. - */ - void SetCost(float newCost) { cost = newCost; } - - private: - virtual void OnActivate(); - virtual void OnDeActivate(); - - virtual void DoStepPreEvents(RuntimeScene& scene); - virtual void DoStepPostEvents(RuntimeScene& scene); - - RuntimeScene* parentScene; ///< The scene the object belongs to. - ScenePathfindingObstaclesManager* - sceneManager; ///< The obstacles manager associated to the scene. - bool registeredInManager; ///< True if the behavior is registered in the list - ///< of obstacles of the scene. - bool impassable; - float cost; ///< The cost of moving on the obstacle (for when impassable == - ///< false) -}; - -#endif // PATHFINDINGOBSTACLERUNTIMEBEHAVIOR_H diff --git a/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.cpp b/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.cpp deleted file mode 100644 index d9409b3c8..000000000 --- a/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.cpp +++ /dev/null @@ -1,615 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "PathfindingRuntimeBehavior.h" -#include -#include -#include -#include -#include -#include -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "PathfindingObstacleRuntimeBehavior.h" -#include "ScenePathfindingObstaclesManager.h" - -/** - * \brief Internal tool class representing the position of a node when looking - * for a path. - */ -class NodePosition { - public: - NodePosition(int x_, int y_) : x(x_), y(y_){}; - - int x; - int y; -}; - -std::ostream& operator<<(std::ostream& stream, const NodePosition& nodePos) { - stream << nodePos.x << ";" << nodePos.y; - return stream; -} - -bool operator==(const NodePosition& a, const NodePosition& b) { - return ((a.x == b.x) && (a.y == b.y)); -} - -namespace std { -/** - * \brief Tool function used to store a NodePosition as key in - * std::unordered_set. - */ -template <> -struct hash { - std::size_t operator()(NodePosition const& n) const { - return (std::hash()(n.x)) ^ (std::hash()(n.y) << 1); - } -}; - -} // namespace std - -namespace { -/** - * \brief Internal tool class representing a node when looking for a path - */ -class Node { - public: - Node() - : pos(0, 0), - cost(0), - smallestCost(-1), - estimateCost(-1), - parent(NULL), - open(true){}; - Node(int x, int y) - : pos(x, y), - cost(0), - smallestCost(-1), - estimateCost(-1), - parent(NULL), - open(true){}; - Node(const NodePosition& pos_) - : pos(pos_), - cost(0), - smallestCost(-1), - estimateCost(-1), - parent(NULL), - open(true){}; - - NodePosition pos; - float cost; ///< The cost for traveling on this node - float smallestCost; ///< the cost to go to this node (when considering the - ///< shortest path). - float estimateCost; ///< the estimate cost total to go to the destination - ///< through this node (when considering the shortest - ///< path). - const Node* parent; ///< The previous node to be visited to go to this node - ///< (when considering the shortest path). - bool open; ///< true if the node is "open" (must be explored), false if - ///< "close" (already explored) - - /** - * \brief Tool function used to store a Node in a priority_queue. - */ - class NodeComparator { - public: - bool operator()(const Node* n1, const Node* n2) { - return n1->estimateCost < n2->estimateCost; - } - }; -}; - -bool operator==(Node const& n1, Node const& n2) { - return n1.pos.x == n2.pos.x && n1.pos.y == n2.pos.y; -}; - -typedef float (*DistanceFunPtr)(const NodePosition&, const NodePosition&); - -/** - * \brief Internal tool class containing the structures used by A* and members - * functions related to them. - */ -class SearchContext { - public: - SearchContext(ScenePathfindingObstaclesManager& obstacles_, - bool allowsDiagonal_ = true) - : obstacles(obstacles_), - finalNode(NULL), - destination(0, 0), - startX(0), - startY(0), - allowsDiagonal(allowsDiagonal_), - maxComplexityFactor(50), - cellWidth(20), - cellHeight(20), - leftBorder(0), - rightBorder(0), - topBorder(0), - bottomBorder(0) { - distanceFunction = allowsDiagonal ? &SearchContext::EuclideanDistance - : &SearchContext::ManhattanDistance; - } - - /** - * \brief Set the start position. - * \param x The coordinate on X axis of the start position, in "world" - * coordinates. \param y The coordinate on Y axis of the start position, in - * "world" coordinates. - */ - SearchContext& SetStartPosition(float x, float y) { - startX = x; - startY = y; - return *this; - } - - /** - * \brief Set the size to be considered for the object for which the path will - * be planned. - */ - SearchContext& SetObjectSize(float leftBorder_, - float topBorder_, - float rightBorder_, - float bottomBorder_) { - leftBorder = leftBorder_; - rightBorder = rightBorder_; - topBorder = topBorder_; - bottomBorder = bottomBorder_; - return *this; - } - - /** - * \brief Change the size of a virtual cell, in pixels. - */ - SearchContext& SetCellSize(unsigned int cellWidth_, - unsigned int cellHeight_) { - cellWidth = cellWidth_; - cellHeight = cellHeight_; - return *this; - } - - /** - * \brief Compute a path to the specified position, considering the obstacles - * and the start position passed in the constructor. - * \return true if computation found a path, in which case you can call - * GetFinalNode method to construct the path. \param x The coordinate on X - * axis of the target position, in "world" coordinates. \param y The - * coordinate on Y axis of the target position, in "world" coordinates. - */ - bool ComputePathTo(float targetX, float targetY) { - destination = NodePosition(GDRound(targetX / cellWidth), - GDRound(targetY / cellHeight)); - NodePosition start(GDRound(startX / cellWidth), - GDRound(startY / cellHeight)); - - // Initialize the algorithm - allNodes.clear(); - Node& startNode = GetNode(start); - startNode.smallestCost = 0; - startNode.estimateCost = 0 + distanceFunction(start, destination); - openNodes.clear(); - openNodes.insert(&startNode); - - // A* algorithm main loop - std::size_t iterationCount = 0; - std::size_t maxIterationCount = - startNode.estimateCost * maxComplexityFactor; - while (!openNodes.empty()) { - if (iterationCount++ > maxIterationCount) - return false; // Make sure we do not search forever. - - Node* n = *openNodes.begin(); // Get the most promising node... - n->open = false; //...and flag it as explored - openNodes.erase( - openNodes.begin()); // Be sure to remove ONLY the first element! - - // Check if we reached destination? - if (n->pos.x == destination.x && n->pos.y == destination.y) { - finalNode = n; - return true; - } - - // No, so add neighbors to the nodes to explore. - InsertNeighbors(*n); - } - - return false; - } - - /** - * @return The final node of the computed path. - * Iterate on the parent member to create the path. Beware, the coordinates of - * the node must be multiplied by the cell size to get the "world" coordinates - * of the path. - */ - Node* GetFinalNode() const { return finalNode; } - - private: - /** - * Insert the neighbors of the current node in the open list - * (Only if they are not closed, and if the cost is better than the already - * existing smallest cost). - */ - void InsertNeighbors(const Node& currentNode) { - AddOrUpdateNode( - NodePosition(currentNode.pos.x + 1, currentNode.pos.y), currentNode, 1); - AddOrUpdateNode( - NodePosition(currentNode.pos.x - 1, currentNode.pos.y), currentNode, 1); - AddOrUpdateNode( - NodePosition(currentNode.pos.x, currentNode.pos.y + 1), currentNode, 1); - AddOrUpdateNode( - NodePosition(currentNode.pos.x, currentNode.pos.y - 1), currentNode, 1); - if (allowsDiagonal) { - AddOrUpdateNode( - NodePosition(currentNode.pos.x + 1, currentNode.pos.y + 1), - currentNode, - sqrt2); - AddOrUpdateNode( - NodePosition(currentNode.pos.x + 1, currentNode.pos.y - 1), - currentNode, - sqrt2); - AddOrUpdateNode( - NodePosition(currentNode.pos.x - 1, currentNode.pos.y - 1), - currentNode, - sqrt2); - AddOrUpdateNode( - NodePosition(currentNode.pos.x - 1, currentNode.pos.y + 1), - currentNode, - sqrt2); - } - } - - /** - * \brief Get (or dynamically construct) a node. - * - * *All* nodes should be created using this method: The cost of the node is - * computed thanks to the objects flagged as obstacles. - */ - Node& GetNode(const NodePosition& pos) { - if (allNodes.find(pos) != allNodes.end()) return allNodes.find(pos)->second; - - Node newNode(pos); - - bool objectsOnCell = false; - const std::set& allObstacles = - obstacles.GetAllObstacles(); - for (std::set::const_iterator it = - allObstacles.begin(); - it != allObstacles.end(); - ++it) { - RuntimeObject* obj = (*it)->GetObject(); - int topLeftCellX = - floor((obj->GetDrawableX() - rightBorder) / (float)cellWidth); - int topLeftCellY = - floor((obj->GetDrawableY() - bottomBorder) / (float)cellHeight); - int bottomRightCellX = - ceil((obj->GetDrawableX() + obj->GetWidth() + leftBorder) / - (float)cellWidth); - int bottomRightCellY = - ceil((obj->GetDrawableY() + obj->GetHeight() + topBorder) / - (float)cellHeight); - if (topLeftCellX < pos.x && pos.x < bottomRightCellX && - topLeftCellY < pos.y && pos.y < bottomRightCellY) { - objectsOnCell = true; - if ((*it)->IsImpassable()) { - newNode.cost = -1; - break; // The cell is impassable, stop here. - } else // Superimpose obstacles - newNode.cost += (*it)->GetCost(); - } - } - - if (!objectsOnCell) - newNode.cost = 1; // Default cost when no objects put on the cell. - - allNodes[pos] = newNode; - return allNodes[pos]; - } - - /** - * Compute the euclidean distance between two positions. - */ - static float EuclideanDistance(const NodePosition& a, const NodePosition& b) { - return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); - } - - /** - * Compute the taxi distance between two positions. - */ - static float ManhattanDistance(const NodePosition& a, const NodePosition& b) { - return abs(a.x - b.x) + abs(a.y - b.y); - } - - /** - * Add a node to the openNodes (only if the cost to reach it is less than the - * existing cost, if any). - */ - void AddOrUpdateNode(const NodePosition& newNodePosition, - const Node& currentNode, - float factor) { - Node& neighbor = GetNode(newNodePosition); - if (!neighbor.open || - neighbor.cost < 0) // cost < 0 means impassable obstacle - return; - - // Update the node costs and parent if the path coming from currentNode is - // better: - if (neighbor.smallestCost == -1 || - neighbor.smallestCost > - currentNode.smallestCost + - (currentNode.cost + neighbor.cost) / 2.0 * factor) { - if (neighbor.smallestCost != -1) // The node is already in the open list: - { - // remove it as its estimate cost will be updated. - auto it = openNodes.find(&neighbor); - if (it != - openNodes.end()) // /!\ ALWAYS use an iterator with multiset::erase - openNodes.erase(it); // otherwise, other nodes which are equivalent - // get removed too. - } - - neighbor.smallestCost = currentNode.smallestCost + - (currentNode.cost + neighbor.cost) / 2.0 * factor; - neighbor.parent = ¤tNode; - neighbor.estimateCost = - neighbor.smallestCost + distanceFunction(neighbor.pos, destination); - - openNodes.insert(&neighbor); - } - } - - std::unordered_map allNodes; ///< All the nodes - std::multiset - openNodes; ///< Only the open nodes (Such that Node::open == true) - const ScenePathfindingObstaclesManager& - obstacles; ///< A reference to all the obstacles of the scene - Node* finalNode; // If computation succeeded, the final node is stored here. - NodePosition destination; - int startX; ///< The start X position, in "world" coordinates (not in "node" - ///< coordinates!). - int startY; ///< The start Y position, in "world" coordinates (not in "node" - ///< coordinates!). - DistanceFunPtr distanceFunction; - bool allowsDiagonal; ///< True to allow diagonals when planning the path. - std::size_t maxComplexityFactor; - float cellWidth; - float cellHeight; - float leftBorder; - float rightBorder; - float topBorder; - float bottomBorder; - - static const float sqrt2; -}; - -const float SearchContext::sqrt2 = 1.414213562; - -} // namespace - -PathfindingRuntimeBehavior::PathfindingRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - parentScene(NULL), - sceneManager(NULL), - pathFound(false), - allowDiagonals(true), - acceleration(400), - maxSpeed(200), - angularMaxSpeed(180), - rotateObject(true), - angleOffset(0), - cellWidth(20), - cellHeight(20), - extraBorder(0), - speed(0), - angularSpeed(0), - timeOnSegment(0), - totalSegmentTime(0), - currentSegment(0), - reachedEnd(false) { - allowDiagonals = behaviorContent.GetBoolAttribute("allowDiagonals"); - acceleration = behaviorContent.GetDoubleAttribute("acceleration"); - maxSpeed = behaviorContent.GetDoubleAttribute("maxSpeed"); - angularMaxSpeed = behaviorContent.GetDoubleAttribute("angularMaxSpeed"); - rotateObject = behaviorContent.GetBoolAttribute("rotateObject"); - angleOffset = behaviorContent.GetDoubleAttribute("angleOffset"); - extraBorder = behaviorContent.GetDoubleAttribute("extraBorder"); - { - int value = behaviorContent.GetIntAttribute("cellWidth", 0); - if (value > 0) cellWidth = value; - } - { - int value = behaviorContent.GetIntAttribute("cellHeight", 0); - if (value > 0) cellHeight = value; - } -} - -void PathfindingRuntimeBehavior::MoveTo(RuntimeScene& scene, float x, float y) { - if (parentScene != &scene) // Parent scene has changed - { - parentScene = &scene; - sceneManager = parentScene - ? &ScenePathfindingObstaclesManager::managers[&scene] - : NULL; - } - - path.clear(); - - // First be sure that there is a path to compute. - int targetCellX = GDRound(x / (float)cellWidth); - int targetCellY = GDRound(y / (float)cellHeight); - int startCellX = GDRound(object->GetX() / (float)cellWidth); - int startCellY = GDRound(object->GetY() / (float)cellHeight); - if (startCellX == targetCellX && startCellY == targetCellY) { - path.push_back(sf::Vector2f(object->GetX(), object->GetY())); - path.push_back(sf::Vector2f(x, y)); - EnterSegment(0); - pathFound = true; - return; - } - - // Start searching for a path - // TODO: Customizable heuristic. - ::SearchContext ctx(*sceneManager, allowDiagonals); - ctx.SetCellSize(cellWidth, cellHeight) - .SetStartPosition(object->GetX(), object->GetY()); - ctx.SetObjectSize(object->GetX() - object->GetDrawableX() + extraBorder, - object->GetY() - object->GetDrawableY() + extraBorder, - object->GetWidth() - - (object->GetX() - object->GetDrawableX()) + extraBorder, - object->GetHeight() - - (object->GetY() - object->GetDrawableY()) + - extraBorder); - if (ctx.ComputePathTo(x, y)) { - // Path found: memorize it - const ::Node* node = ctx.GetFinalNode(); - while (node) { - path.push_back(sf::Vector2f(node->pos.x * (float)cellWidth, - node->pos.y * (float)cellHeight)); - node = node->parent; - } - - std::reverse(path.begin(), path.end()); - path[0] = sf::Vector2f(object->GetX(), object->GetY()); - EnterSegment(0); - pathFound = true; - return; - } - - // Not path found - pathFound = false; -} - -void PathfindingRuntimeBehavior::EnterSegment(std::size_t segmentNumber) { - if (path.empty()) return; - - currentSegment = segmentNumber; - if (currentSegment < path.size() - 1) { - sf::Vector2f newPath = (path[currentSegment + 1] - path[currentSegment]); - totalSegmentTime = sqrtf(newPath.x * newPath.x + newPath.y * newPath.y); - timeOnSegment = 0; - reachedEnd = false; - } else { - reachedEnd = true; - speed = 0; - } -} - -void PathfindingRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - parentScene = &scene; - sceneManager = parentScene - ? &ScenePathfindingObstaclesManager::managers[&scene] - : NULL; - } - - if (!sceneManager) return; - - if (path.empty() || reachedEnd) return; - - // Update the speed of the object - float timeDelta = - static_cast(object->GetElapsedTime(scene)) / 1000000.0; - speed += acceleration * timeDelta; - if (speed > maxSpeed) speed = maxSpeed; - angularSpeed = angularMaxSpeed; // No acceleration for angular speed for now - - // Update the time on the segment and change segment if needed - timeOnSegment += speed * timeDelta; - if (timeOnSegment >= totalSegmentTime && currentSegment < path.size()) - EnterSegment(currentSegment + 1); - - // Position object on the segment and update its angle - sf::Vector2f newPos; - float pathAngle = object->GetAngle(); - if (currentSegment < path.size() - 1) { - newPos = path[currentSegment] + - (path[currentSegment + 1] - path[currentSegment]) * - (timeOnSegment / totalSegmentTime); - pathAngle = atan2(path[currentSegment + 1].y - path[currentSegment].y, - path[currentSegment + 1].x - path[currentSegment].x) * - 180 / 3.14159 + - angleOffset; - } else - newPos = path.back(); - - object->SetX(newPos.x); - object->SetY(newPos.y); - - // Also update angle if needed - if (rotateObject) object->RotateTowardAngle(pathAngle, angularSpeed, scene); -} - -void PathfindingRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - parentScene = &scene; - sceneManager = parentScene - ? &ScenePathfindingObstaclesManager::managers[&scene] - : NULL; - } -} - -float PathfindingRuntimeBehavior::GetNodeX(std::size_t index) const { - if (index < path.size()) return path[index].x; - return 0; -} -float PathfindingRuntimeBehavior::GetNodeY(std::size_t index) const { - if (index < path.size()) return path[index].y; - return 0; -} -std::size_t PathfindingRuntimeBehavior::GetNextNodeIndex() const { - if (currentSegment + 1 < path.size()) - return currentSegment + 1; - else - return path.size() - 1; -} -float PathfindingRuntimeBehavior::GetNextNodeX() const { - if (path.empty()) return 0; - - if (currentSegment + 1 < path.size()) - return path[currentSegment + 1].x; - else - return path.back().x; -} -float PathfindingRuntimeBehavior::GetNextNodeY() const { - if (path.empty()) return 0; - - if (currentSegment + 1 < path.size()) - return path[currentSegment + 1].y; - else - return path.back().y; -} -float PathfindingRuntimeBehavior::GetLastNodeX() const { - if (path.size() < 2) return 0; - - if (currentSegment < path.size() - 1) - return path[currentSegment].x; - else - return path[path.size() - 1].x; -} -float PathfindingRuntimeBehavior::GetLastNodeY() const { - if (path.size() < 2) return 0; - - if (currentSegment < path.size() - 1) - return path[currentSegment].y; - else - return path[path.size() - 1].y; -} -float PathfindingRuntimeBehavior::GetDestinationX() const { - if (path.empty()) return 0; - return path.back().x; -} -float PathfindingRuntimeBehavior::GetDestinationY() const { - if (path.empty()) return 0; - return path.back().y; -} diff --git a/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.h b/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.h deleted file mode 100644 index 7b1bb54eb..000000000 --- a/Extensions/PathfindingBehavior/PathfindingRuntimeBehavior.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PATHFINDINGRUNTIMEBEHAVIOR_H -#define PATHFINDINGRUNTIMEBEHAVIOR_H -#include -#include -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/Project/Object.h" -namespace gd { -class Layout; -} -class RuntimeScene; -class PlatformBehavior; -class ScenePathfindingObstaclesManager; -namespace gd { -class SerializerElement; -} -class RuntimeScenePlatformData; - -/** - * \brief Compute path for objects avoiding obstacles - */ -class GD_EXTENSION_API PathfindingRuntimeBehavior : public RuntimeBehavior { - public: - PathfindingRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~PathfindingRuntimeBehavior(){}; - virtual RuntimeBehavior* Clone() const { return new PathfindingRuntimeBehavior(*this); } - - /** - * \brief Compute and move on the path to the specified destination. - */ - void MoveTo(RuntimeScene& scene, float x, float y); - - // Path information: - /** - * \brief Return true if the latest call to MoveTo succeeded. - */ - bool PathFound() { return pathFound; } - - /** - * \brief Return true if the object reached its destination - */ - bool DestinationReached() { return reachedEnd; } - - float GetNodeX(std::size_t index) const; - float GetNodeY(std::size_t index) const; - std::size_t GetNextNodeIndex() const; - std::size_t GetNodeCount() const { return path.size(); }; - float GetNextNodeX() const; - float GetNextNodeY() const; - float GetLastNodeX() const; - float GetLastNodeY() const; - float GetDestinationX() const; - float GetDestinationY() const; - - // Configuration: - bool DiagonalsAllowed() { return allowDiagonals; }; - float GetAcceleration() { return acceleration; }; - float GetMaxSpeed() { return maxSpeed; }; - float GetAngularMaxSpeed() { return angularMaxSpeed; }; - bool IsObjectRotated() { return rotateObject; } - float GetAngleOffset() { return angleOffset; }; - unsigned int GetCellWidth() { return cellWidth; }; - unsigned int GetCellHeight() { return cellHeight; }; - float GetExtraBorder() { return extraBorder; }; - - void SetAllowDiagonals(bool allowDiagonals_) { - allowDiagonals = allowDiagonals_; - }; - void SetAcceleration(float acceleration_) { acceleration = acceleration_; }; - void SetMaxSpeed(float maxSpeed_) { maxSpeed = maxSpeed_; }; - void SetAngularMaxSpeed(float angularMaxSpeed_) { - angularMaxSpeed = angularMaxSpeed_; - }; - void SetRotateObject(bool rotateObject_) { rotateObject = rotateObject_; }; - void SetAngleOffset(float angleOffset_) { angleOffset = angleOffset_; }; - void SetCellWidth(unsigned int cellWidth_) { cellWidth = cellWidth_; }; - void SetCellHeight(unsigned int cellHeight_) { cellHeight = cellHeight_; }; - void SetExtraBorder(float extraBorder_) { extraBorder = extraBorder_; }; - - float GetSpeed() { return speed; }; - void SetSpeed(float speed_) { speed = speed_; }; - - private: - virtual void DoStepPreEvents(RuntimeScene& scene); - virtual void DoStepPostEvents(RuntimeScene& scene); - void EnterSegment(std::size_t segmentNumber); - - RuntimeScene* parentScene; ///< The scene the object belongs to. - ScenePathfindingObstaclesManager* - sceneManager; ///< The platform objects manager associated to the scene. - std::vector path; ///< The computed path - bool pathFound; - - // Behavior configuration: - bool allowDiagonals; - float acceleration; - float maxSpeed; - float angularMaxSpeed; - bool rotateObject; ///< If true, the object is rotated according to the - ///< current segment's angle. - float angleOffset; ///< Angle offset (added to the angle calculated with the - ///< segment) - unsigned int cellWidth; - unsigned int cellHeight; - float extraBorder; - - // Attributes used for traveling on the path: - float speed; - float angularSpeed; - float timeOnSegment; - float totalSegmentTime; - std::size_t currentSegment; - bool reachedEnd; -}; -#endif // PATHFINDINGRUNTIMEBEHAVIOR_H diff --git a/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.cpp b/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.cpp deleted file mode 100644 index 35ae5611f..000000000 --- a/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#include "ScenePathfindingObstaclesManager.h" -#include -#include "PathfindingObstacleRuntimeBehavior.h" - -std::map - ScenePathfindingObstaclesManager::managers; - -ScenePathfindingObstaclesManager::~ScenePathfindingObstaclesManager() { - for (std::set::iterator it = - allObstacles.begin(); - it != allObstacles.end(); - ++it) { - (*it)->Activate(false); - } -} - -void ScenePathfindingObstaclesManager::AddObstacle( - PathfindingObstacleRuntimeBehavior* obstacle) { - allObstacles.insert(obstacle); -} -void ScenePathfindingObstaclesManager::RemoveObstacle( - PathfindingObstacleRuntimeBehavior* obstacle) { - allObstacles.erase(obstacle); -} diff --git a/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.h b/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.h deleted file mode 100644 index 832691939..000000000 --- a/Extensions/PathfindingBehavior/ScenePathfindingObstaclesManager.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#ifndef SCENEPLATFORMOBJECTSMANAGER_H -#define SCENEPLATFORMOBJECTSMANAGER_H -#include -#include -#include "GDCpp/Runtime/RuntimeScene.h" -class PathfindingObstacleRuntimeBehavior; - -/** - * \brief Contains lists of all obstacle related objects of a scene. - * - * \note Could be drastically improved by using spatial hashing (see JS - * implementation). - */ -class ScenePathfindingObstaclesManager { - public: - /** - * \brief Map containing, for each RuntimeScene, its associated - * ScenePathfindingObstaclesManager. - */ - static std::map managers; - - ScenePathfindingObstaclesManager(){}; - virtual ~ScenePathfindingObstaclesManager(); - - /** - * \brief Notify the manager that there is a new obstacle on the scene. - * \param obstacle The new obstacle - */ - void AddObstacle(PathfindingObstacleRuntimeBehavior* obstacle); - - /** - * \brief Notify the manager that a obstacle was removed from the scene. - * \param obstacle The removed obstacle - */ - void RemoveObstacle(PathfindingObstacleRuntimeBehavior* obstacle); - - /** - * \brief Get a read only access to the list of all obstacles - */ - const std::set& GetAllObstacles() const { - return allObstacles; - } - - private: - std::set - allObstacles; ///< The list of all obstacles of the scene. -}; - -#endif diff --git a/Extensions/PathfindingBehavior/tests/PathfindingBehavior.cpp b/Extensions/PathfindingBehavior/tests/PathfindingBehavior.cpp deleted file mode 100644 index 355fd9f7e..000000000 --- a/Extensions/PathfindingBehavior/tests/PathfindingBehavior.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/** - -GDevelop - Pathfinding Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -/** - * @file Tests for the Pathfinding extension. - */ -#define CATCH_CONFIG_MAIN -#include "../PathfindingBehavior.h" -#include "../PathfindingObstacleBehavior.h" -#include "../PathfindingObstacleRuntimeBehavior.h" -#include "../PathfindingRuntimeBehavior.h" -#include "GDCore/CommonTools.h" -#include "GDCore/Project/Layout.h" -#include "GDCore/Project/Object.h" -#include "GDCore/Project/ObjectsContainer.h" -#include "GDCpp/Extensions/Builtin/ObjectTools.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "catch.hpp" - -// Mock objects that can have a specific size -class ResizableRuntimeObject : public RuntimeObject { - public: - ResizableRuntimeObject(RuntimeScene &scene, const gd::Object &obj) - : RuntimeObject(scene, obj) {} - - float GetWidth() const override { return width; } - float GetHeight() const override { return height; } - void SetWidth(float newWidth) override { width = newWidth; } - void SetHeight(float newHeight) override { height = newHeight; } - - private: - float width; - float height; -}; - -namespace { -template -std::unique_ptr CreateNewRuntimeBehavior() { - gd::SerializerElement behaviorContent; - TBehavior behavior; - behavior.InitializeContent(behaviorContent); - return std::move(gd::make_unique(behaviorContent)); -}; -} // namespace - -TEST_CASE("PathfindingRuntimeBehavior", "[game-engine][pathfinding]") { - SECTION("Basics") { - // Prepare some objects and the context - RuntimeGame game; - gd::Object playerObject("player"); - RuntimeScene scene(NULL, &game); - RuntimeObject player(scene, playerObject); - player.AddBehavior("Pathfinding", - CreateNewRuntimeBehavior()); - - PathfindingRuntimeBehavior *runtimeBehavior = - static_cast( - player.GetBehaviorRawPointer("Pathfinding")); - - // Check that a path can be computed without obstacles - runtimeBehavior->MoveTo(scene, 1200, 1300); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeCount() == 66); - REQUIRE(runtimeBehavior->GetNodeX(65) == 1200); // Check that destination - REQUIRE(runtimeBehavior->GetNodeY(65) == 1300); // is correct - - // Add an obstacle - gd::Object obstacleObj("obstacle"); - std::unique_ptr obstacle( - new ResizableRuntimeObject(scene, obstacleObj)); - - obstacle->AddBehavior( - "PathfindingObstacle", - CreateNewRuntimeBehavior()); - - obstacle->SetX(1100); - obstacle->SetY(1200); - obstacle->SetWidth(200); - obstacle->SetHeight(200); - - scene.objectsInstances.AddObject(std::move(obstacle)); - - scene.RenderAndStep(); - - runtimeBehavior->MoveTo(scene, 1200, 1300); - REQUIRE(runtimeBehavior->PathFound() == false); - REQUIRE(runtimeBehavior->GetNodeCount() == 0); - } - SECTION("Obstacle in the middle") { - // Prepare some objects and the context - RuntimeGame game; - - gd::Object playerObj("player"); - gd::Object obstacleObj("obstacle"); - - RuntimeScene scene(NULL, &game); - auto *player = scene.objectsInstances.AddObject( - std::unique_ptr(new RuntimeObject(scene, playerObj))); - - player->AddBehavior("Pathfinding", - CreateNewRuntimeBehavior()); - auto *obstacle = - scene.objectsInstances.AddObject(std::unique_ptr( - new ResizableRuntimeObject(scene, obstacleObj))); - obstacle->AddBehavior( - "PathfindingObstacle", - CreateNewRuntimeBehavior()); - - obstacle->SetX(300); - obstacle->SetY(600); - obstacle->SetWidth(32); - obstacle->SetHeight(32); - scene.RenderAndStep(); - - PathfindingRuntimeBehavior *runtimeBehavior = - static_cast( - player->GetBehaviorRawPointer("Pathfinding")); - - // Check that a path changes when adding obstacles - runtimeBehavior->MoveTo(scene, 1200, 1300); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeX(30) == 540); - REQUIRE(runtimeBehavior->GetNodeY(30) == 600); - REQUIRE(runtimeBehavior->GetNodeCount() == 66); - - // Enlarge the obstacle - obstacle->SetWidth(600); - scene.RenderAndStep(); - - runtimeBehavior->MoveTo(scene, 1200, 1300); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeCount() == 77); - - // Enlarge more - obstacle->SetX(0); - obstacle->SetWidth(1300); - scene.RenderAndStep(); - - runtimeBehavior->MoveTo(scene, 1200, 1300); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeCount() == 92); - } - SECTION("Obstacles making a corridor") { - // Prepare some objects and the context - RuntimeGame game; - - gd::Object playerObj("player"); - gd::Object obstacleObj("obstacle"); - - RuntimeScene scene(NULL, &game); - - auto *player = scene.objectsInstances.AddObject( - std::unique_ptr(new RuntimeObject(scene, playerObj))); - - player->AddBehavior("Pathfinding", - CreateNewRuntimeBehavior()); - auto *obstacle1 = - scene.objectsInstances.AddObject(std::unique_ptr( - new ResizableRuntimeObject(scene, obstacleObj))); - obstacle1->AddBehavior( - "PathfindingObstacle", - CreateNewRuntimeBehavior()); - auto *obstacle2 = - scene.objectsInstances.AddObject(std::unique_ptr( - new ResizableRuntimeObject(scene, obstacleObj))); - obstacle1->AddBehavior( - "PathfindingObstacle", - CreateNewRuntimeBehavior()); - - obstacle1->SetX(-20); - obstacle2->SetX(20); - obstacle1->SetWidth(20); - obstacle1->SetHeight(20); - obstacle2->SetWidth(20); - obstacle2->SetHeight(20); - player->SetX(5); - player->SetY(25); - scene.RenderAndStep(); - - PathfindingRuntimeBehavior *runtimeBehavior = - static_cast( - player->GetBehaviorRawPointer("Pathfinding")); - - // Check that a path changes when adding obstacles - runtimeBehavior->MoveTo(scene, 5, -5); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeCount() == 2); - } - SECTION("Diagonals") { - // Prepare some objects and the context - RuntimeGame game; - - gd::Object playerObj("player"); - - RuntimeScene scene(NULL, &game); - auto *player = scene.objectsInstances.AddObject( - std::unique_ptr(new RuntimeObject(scene, playerObj))); - - player->AddBehavior("Pathfinding", - CreateNewRuntimeBehavior()); - - PathfindingRuntimeBehavior *runtimeBehavior = - static_cast( - player->GetBehaviorRawPointer("Pathfinding")); - - // Test a specific path that can lead to false computations - // in case the algorithm open nodes list is not implemented properly - // and can remove node with same cost. - runtimeBehavior->MoveTo(scene, 1 * 20, 4 * 20); - REQUIRE(runtimeBehavior->PathFound() == true); - REQUIRE(runtimeBehavior->GetNodeCount() == 5); - REQUIRE(runtimeBehavior->GetNodeX(0) == 0); - REQUIRE(runtimeBehavior->GetNodeY(0) == 0); - REQUIRE(runtimeBehavior->GetNodeX(1) == 0); - REQUIRE(runtimeBehavior->GetNodeY(1) == 20); - REQUIRE(runtimeBehavior->GetNodeX(2) == 0); - REQUIRE(runtimeBehavior->GetNodeY(2) == 40); - REQUIRE(runtimeBehavior->GetNodeX(3) == 0); - REQUIRE(runtimeBehavior->GetNodeY(3) == 60); - REQUIRE(runtimeBehavior->GetNodeX(4) == 20); - REQUIRE(runtimeBehavior->GetNodeY(4) == 80); - } -} diff --git a/Extensions/PathfindingBehavior/tests/catch.hpp b/Extensions/PathfindingBehavior/tests/catch.hpp deleted file mode 100644 index 1fba6a34e..000000000 --- a/Extensions/PathfindingBehavior/tests/catch.hpp +++ /dev/null @@ -1,8974 +0,0 @@ -/* - * CATCH v1.0 build 52 (master branch) - * Generated: 2014-07-10 09:17:43.994453 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - -#define TWOBLUECUBES_CATCH_HPP_INCLUDED - -// #included from: internal/catch_suppress_warnings.h - -#define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wglobal-constructors" -#pragma clang diagnostic ignored "-Wvariadic-macros" -#pragma clang diagnostic ignored "-Wc99-extensions" -#pragma clang diagnostic ignored "-Wunused-variable" -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#pragma clang diagnostic ignored "-Wc++98-compat" -#pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif - -#ifdef CATCH_CONFIG_MAIN -# define CATCH_CONFIG_RUNNER -#endif - -#ifdef CATCH_CONFIG_RUNNER -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// #included from: internal/catch_notimplemented_exception.h -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED - -// #included from: catch_common.h -#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED - -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) - -#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr -#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) - -#include -#include -#include - -// #included from: catch_compiler_capabilities.h -#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED - -// Much of the following code is based on Boost (1.53) - -#ifdef __clang__ - -# if __has_feature(cxx_nullptr) -# define CATCH_CONFIG_CPP11_NULLPTR -# endif - -# if __has_feature(cxx_noexcept) -# define CATCH_CONFIG_CPP11_NOEXCEPT -# endif - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Borland -#ifdef __BORLANDC__ - -#if (__BORLANDC__ > 0x582 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __BORLANDC__ - -//////////////////////////////////////////////////////////////////////////////// -// EDG -#ifdef __EDG_VERSION__ - -#if (__EDG_VERSION__ > 238 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __EDG_VERSION__ - -//////////////////////////////////////////////////////////////////////////////// -// Digital Mars -#ifdef __DMC__ - -#if (__DMC__ > 0x840 ) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // __DMC__ - -//////////////////////////////////////////////////////////////////////////////// -// GCC -#ifdef __GNUC__ - -#if __GNUC__ < 3 - -#if (__GNUC_MINOR__ >= 96 ) -//#define CATCH_CONFIG_SFINAE -#endif - -#elif __GNUC__ >= 3 - -// #define CATCH_CONFIG_SFINAE // Taking this out completely for now - -#endif // __GNUC__ < 3 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__) ) - -#define CATCH_CONFIG_CPP11_NULLPTR -#endif - -#endif // __GNUC__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#ifdef _MSC_VER - -#if (_MSC_VER >= 1310 ) // (VC++ 7.0+) -//#define CATCH_CONFIG_SFINAE // Not confirmed -#endif - -#endif // _MSC_VER - -// Use variadic macros if the compiler supports them -#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \ - ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \ - ( defined __GNUC__ && __GNUC__ >= 3 ) || \ - ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L ) - -#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS -#define CATCH_CONFIG_VARIADIC_MACROS -#endif - -#endif - -//////////////////////////////////////////////////////////////////////////////// -// C++ language feature support - -// detect language version: -#if (__cplusplus == 201103L) -# define CATCH_CPP11 -# define CATCH_CPP11_OR_GREATER -#elif (__cplusplus >= 201103L) -# define CATCH_CPP11_OR_GREATER -#endif - -// noexcept support: -#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT) -# define CATCH_NOEXCEPT noexcept -# define CATCH_NOEXCEPT_IS(x) noexcept(x) -#else -# define CATCH_NOEXCEPT throw() -# define CATCH_NOEXCEPT_IS(x) -#endif - -namespace Catch { - - class NonCopyable { - NonCopyable( NonCopyable const& ); - void operator = ( NonCopyable const& ); - protected: - NonCopyable() {} - virtual ~NonCopyable(); - }; - - class SafeBool { - public: - typedef void (SafeBool::*type)() const; - - static type makeSafe( bool value ) { - return value ? &SafeBool::trueValue : 0; - } - private: - void trueValue() const {} - }; - - template - inline void deleteAll( ContainerT& container ) { - typename ContainerT::const_iterator it = container.begin(); - typename ContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete *it; - } - template - inline void deleteAllValues( AssociativeContainerT& container ) { - typename AssociativeContainerT::const_iterator it = container.begin(); - typename AssociativeContainerT::const_iterator itEnd = container.end(); - for(; it != itEnd; ++it ) - delete it->second; - } - - bool startsWith( std::string const& s, std::string const& prefix ); - bool endsWith( std::string const& s, std::string const& suffix ); - bool contains( std::string const& s, std::string const& infix ); - void toLowerInPlace( std::string& s ); - std::string toLower( std::string const& s ); - std::string trim( std::string const& str ); - - struct pluralise { - pluralise( std::size_t count, std::string const& label ); - - friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); - - std::size_t m_count; - std::string m_label; - }; - - struct SourceLineInfo { - - SourceLineInfo(); - SourceLineInfo( char const* _file, std::size_t _line ); - SourceLineInfo( SourceLineInfo const& other ); -# ifdef CATCH_CPP11_OR_GREATER - SourceLineInfo( SourceLineInfo && ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo& operator = ( SourceLineInfo && ) = default; -# endif - bool empty() const; - bool operator == ( SourceLineInfo const& other ) const; - - std::string file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // This is just here to avoid compiler warnings with macro constants and boolean literals - inline bool isTrue( bool value ){ return value; } - inline bool alwaysTrue() { return true; } - inline bool alwaysFalse() { return false; } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ); - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() { - return std::string(); - } - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) -#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO ); - -#include - -namespace Catch { - - class NotImplementedException : public std::exception - { - public: - NotImplementedException( SourceLineInfo const& lineInfo ); - NotImplementedException( NotImplementedException const& ) {} - - virtual ~NotImplementedException() CATCH_NOEXCEPT {} - - virtual const char* what() const CATCH_NOEXCEPT; - - private: - std::string m_what; - SourceLineInfo m_lineInfo; - }; - -} // end namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO ) - -// #included from: internal/catch_context.h -#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED - -// #included from: catch_interfaces_generators.h -#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED - -#include - -namespace Catch { - - struct IGeneratorInfo { - virtual ~IGeneratorInfo(); - virtual bool moveNext() = 0; - virtual std::size_t getCurrentIndex() const = 0; - }; - - struct IGeneratorsForTest { - virtual ~IGeneratorsForTest(); - - virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0; - virtual bool moveNext() = 0; - }; - - IGeneratorsForTest* createGeneratorsForTest(); - -} // end namespace Catch - -// #included from: catch_ptr.hpp -#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - // An intrusive reference counting smart pointer. - // T must implement addRef() and release() methods - // typically implementing the IShared interface - template - class Ptr { - public: - Ptr() : m_p( NULL ){} - Ptr( T* p ) : m_p( p ){ - if( m_p ) - m_p->addRef(); - } - Ptr( Ptr const& other ) : m_p( other.m_p ){ - if( m_p ) - m_p->addRef(); - } - ~Ptr(){ - if( m_p ) - m_p->release(); - } - void reset() { - if( m_p ) - m_p->release(); - m_p = NULL; - } - Ptr& operator = ( T* p ){ - Ptr temp( p ); - swap( temp ); - return *this; - } - Ptr& operator = ( Ptr const& other ){ - Ptr temp( other ); - swap( temp ); - return *this; - } - void swap( Ptr& other ) { std::swap( m_p, other.m_p ); } - T* get() { return m_p; } - const T* get() const{ return m_p; } - T& operator*() const { return *m_p; } - T* operator->() const { return m_p; } - bool operator !() const { return m_p == NULL; } - operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); } - - private: - T* m_p; - }; - - struct IShared : NonCopyable { - virtual ~IShared(); - virtual void addRef() const = 0; - virtual void release() const = 0; - }; - - template - struct SharedImpl : T { - - SharedImpl() : m_rc( 0 ){} - - virtual void addRef() const { - ++m_rc; - } - virtual void release() const { - if( --m_rc == 0 ) - delete this; - } - - mutable unsigned int m_rc; - }; - -} // end namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#include -#include -#include - -namespace Catch { - - class TestCase; - class Stream; - struct IResultCapture; - struct IRunner; - struct IGeneratorsForTest; - struct IConfig; - - struct IContext - { - virtual ~IContext(); - - virtual IResultCapture* getResultCapture() = 0; - virtual IRunner* getRunner() = 0; - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0; - virtual bool advanceGeneratorsForCurrentTest() = 0; - virtual Ptr getConfig() const = 0; - }; - - struct IMutableContext : IContext - { - virtual ~IMutableContext(); - virtual void setResultCapture( IResultCapture* resultCapture ) = 0; - virtual void setRunner( IRunner* runner ) = 0; - virtual void setConfig( Ptr const& config ) = 0; - }; - - IContext& getCurrentContext(); - IMutableContext& getCurrentMutableContext(); - void cleanUpContext(); - Stream createStream( std::string const& streamName ); - -} - -// #included from: internal/catch_test_registry.hpp -#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED - -// #included from: catch_interfaces_testcase.h -#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED - -#include - -namespace Catch { - - class TestSpec; - - struct ITestCase : IShared { - virtual void invoke () const = 0; - protected: - virtual ~ITestCase(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const = 0; - - }; -} - -namespace Catch { - -template -class MethodTestCase : public SharedImpl { - -public: - MethodTestCase( void (C::*method)() ) : m_method( method ) {} - - virtual void invoke() const { - C obj; - (obj.*m_method)(); - } - -private: - virtual ~MethodTestCase() {} - - void (C::*m_method)(); -}; - -typedef void(*TestFunction)(); - -struct NameAndDesc { - NameAndDesc( const char* _name = "", const char* _description= "" ) - : name( _name ), description( _description ) - {} - - const char* name; - const char* description; -}; - -struct AutoReg { - - AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ); - - template - AutoReg( void (C::*method)(), - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - registerTestCase( new MethodTestCase( method ), - className, - nameAndDesc, - lineInfo ); - } - - void registerTestCase( ITestCase* testCase, - char const* className, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ); - - ~AutoReg(); - -private: - AutoReg( AutoReg const& ); - void operator= ( AutoReg const& ); -}; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( ... ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#else - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ - static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )() - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ - namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } - - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ - namespace{ \ - struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ - void test(); \ - }; \ - Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ - } \ - void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test() - -#endif - -// #included from: internal/catch_capture.hpp -#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED - -// #included from: catch_result_builder.h -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED - -// #included from: catch_result_type.h -#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED - -namespace Catch { - - // ResultWas::OfType enum - struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, - - FailureBit = 0x10, - - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, - - Exception = 0x100 | FailureBit, - - ThrewException = Exception | 1, - DidntThrowException = Exception | 2 - - }; }; - - inline bool isOk( ResultWas::OfType resultType ) { - return ( resultType & ResultWas::FailureBit ) == 0; - } - inline bool isJustInfo( int flags ) { - return flags == ResultWas::Info; - } - - // ResultDisposition::Flags enum - struct ResultDisposition { enum Flags { - Normal = 0x00, - - ContinueOnFailure = 0x01, // Failures fail test, but execution continues - FalseTest = 0x02, // Prefix expression with ! - SuppressFail = 0x04 // Failures are reported but do not fail the test - }; }; - - inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { - return static_cast( static_cast( lhs ) | static_cast( rhs ) ); - } - - inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } - inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } - inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } - -} // end namespace Catch - -// #included from: catch_assertionresult.h -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED - -#include - -namespace Catch { - - struct AssertionInfo - { - AssertionInfo() {} - AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ); - - std::string macroName; - SourceLineInfo lineInfo; - std::string capturedExpression; - ResultDisposition::Flags resultDisposition; - }; - - struct AssertionResultData - { - AssertionResultData() : resultType( ResultWas::Unknown ) {} - - std::string reconstructedExpression; - std::string message; - ResultWas::OfType resultType; - }; - - class AssertionResult { - public: - AssertionResult(); - AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); - ~AssertionResult(); -# ifdef CATCH_CPP11_OR_GREATER - AssertionResult( AssertionResult const& ) = default; - AssertionResult( AssertionResult && ) = default; - AssertionResult& operator = ( AssertionResult const& ) = default; - AssertionResult& operator = ( AssertionResult && ) = default; -# endif - - bool isOk() const; - bool succeeded() const; - ResultWas::OfType getResultType() const; - bool hasExpression() const; - bool hasMessage() const; - std::string getExpression() const; - std::string getExpressionInMacro() const; - bool hasExpandedExpression() const; - std::string getExpandedExpression() const; - std::string getMessage() const; - SourceLineInfo getSourceInfo() const; - std::string getTestMacroName() const; - - protected: - AssertionInfo m_info; - AssertionResultData m_resultData; - }; - -} // end namespace Catch - -namespace Catch { - - struct TestFailureException{}; - - template class ExpressionLhs; - - struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison; - - struct CopyableStream { - CopyableStream() {} - CopyableStream( CopyableStream const& other ) { - oss << other.oss.str(); - } - CopyableStream& operator=( CopyableStream const& other ) { - oss.str(""); - oss << other.oss.str(); - return *this; - } - std::ostringstream oss; - }; - - class ResultBuilder { - public: - ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ); - - template - ExpressionLhs operator->* ( T const& operand ); - ExpressionLhs operator->* ( bool value ); - - template - ResultBuilder& operator << ( T const& value ) { - m_stream.oss << value; - return *this; - } - - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - - ResultBuilder& setResultType( ResultWas::OfType result ); - ResultBuilder& setResultType( bool result ); - ResultBuilder& setLhs( std::string const& lhs ); - ResultBuilder& setRhs( std::string const& rhs ); - ResultBuilder& setOp( std::string const& op ); - - void endExpression(); - - std::string reconstructExpression() const; - AssertionResult build() const; - - void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal ); - void captureResult( ResultWas::OfType resultType ); - void captureExpression(); - void react(); - bool shouldDebugBreak() const; - bool allowThrows() const; - - private: - AssertionInfo m_assertionInfo; - AssertionResultData m_data; - struct ExprComponents { - ExprComponents() : testFalse( false ) {} - bool testFalse; - std::string lhs, rhs, op; - } m_exprComponents; - CopyableStream m_stream; - - bool m_shouldDebugBreak; - bool m_shouldThrow; - }; - -} // namespace Catch - -// Include after due to circular dependency: -// #included from: catch_expression_lhs.hpp -#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED - -// #included from: catch_evaluate.hpp -#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4389) // '==' : signed/unsigned mismatch -#endif - -#include - -namespace Catch { -namespace Internal { - - enum Operator { - IsEqualTo, - IsNotEqualTo, - IsLessThan, - IsGreaterThan, - IsLessThanOrEqualTo, - IsGreaterThanOrEqualTo - }; - - template struct OperatorTraits { static const char* getName(){ return "*error*"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "=="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "!="; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<"; } }; - template<> struct OperatorTraits { static const char* getName(){ return ">"; } }; - template<> struct OperatorTraits { static const char* getName(){ return "<="; } }; - template<> struct OperatorTraits{ static const char* getName(){ return ">="; } }; - - template - inline T& opCast(T const& t) { return const_cast(t); } - -// nullptr_t support based on pull request #154 from Konstantin Baumann -#ifdef CATCH_CONFIG_CPP11_NULLPTR - inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; } -#endif // CATCH_CONFIG_CPP11_NULLPTR - - // So the compare overloads can be operator agnostic we convey the operator as a template - // enum, which is used to specialise an Evaluator for doing the comparison. - template - class Evaluator{}; - - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs) { - return opCast( lhs ) == opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) != opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) < opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) > opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) >= opCast( rhs ); - } - }; - template - struct Evaluator { - static bool evaluate( T1 const& lhs, T2 const& rhs ) { - return opCast( lhs ) <= opCast( rhs ); - } - }; - - template - bool applyEvaluator( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // This level of indirection allows us to specialise for integer types - // to avoid signed/ unsigned warnings - - // "base" overload - template - bool compare( T1 const& lhs, T2 const& rhs ) { - return Evaluator::evaluate( lhs, rhs ); - } - - // unsigned X to int - template bool compare( unsigned int lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, int rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // unsigned X to long - template bool compare( unsigned int lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned long lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - template bool compare( unsigned char lhs, long rhs ) { - return applyEvaluator( lhs, static_cast( rhs ) ); - } - - // int to unsigned X - template bool compare( int lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( int lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // long to unsigned X - template bool compare( long lhs, unsigned int rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned long rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - template bool compare( long lhs, unsigned char rhs ) { - return applyEvaluator( static_cast( lhs ), rhs ); - } - - // pointer to long (when comparing against NULL) - template bool compare( long lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, long rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - - // pointer to int (when comparing against NULL) - template bool compare( int lhs, T* rhs ) { - return Evaluator::evaluate( reinterpret_cast( lhs ), rhs ); - } - template bool compare( T* lhs, int rhs ) { - return Evaluator::evaluate( lhs, reinterpret_cast( rhs ) ); - } - -#ifdef CATCH_CONFIG_CPP11_NULLPTR - // pointer to nullptr_t (when comparing against nullptr) - template bool compare( std::nullptr_t, T* rhs ) { - return Evaluator::evaluate( NULL, rhs ); - } - template bool compare( T* lhs, std::nullptr_t ) { - return Evaluator::evaluate( lhs, NULL ); - } -#endif // CATCH_CONFIG_CPP11_NULLPTR - -} // end of namespace Internal -} // end of namespace Catch - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -// #included from: catch_tostring.h -#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED - -// #included from: catch_sfinae.hpp -#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED - -// Try to detect if the current compiler supports SFINAE - -namespace Catch { - - struct TrueType { - static const bool value = true; - typedef void Enable; - char sizer[1]; - }; - struct FalseType { - static const bool value = false; - typedef void Disable; - char sizer[2]; - }; - -#ifdef CATCH_CONFIG_SFINAE - - template struct NotABooleanExpression; - - template struct If : NotABooleanExpression {}; - template<> struct If : TrueType {}; - template<> struct If : FalseType {}; - - template struct SizedIf; - template<> struct SizedIf : TrueType {}; - template<> struct SizedIf : FalseType {}; - -#endif // CATCH_CONFIG_SFINAE - -} // end namespace Catch - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -// #included from: catch_objc_arc.hpp -#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED - -#import - -#ifdef __has_feature -#define CATCH_ARC_ENABLED __has_feature(objc_arc) -#else -#define CATCH_ARC_ENABLED 0 -#endif - -void arcSafeRelease( NSObject* obj ); -id performOptionalSelector( id obj, SEL sel ); - -#if !CATCH_ARC_ENABLED -inline void arcSafeRelease( NSObject* obj ) { - [obj release]; -} -inline id performOptionalSelector( id obj, SEL sel ) { - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; - return nil; -} -#define CATCH_UNSAFE_UNRETAINED -#define CATCH_ARC_STRONG -#else -inline void arcSafeRelease( NSObject* ){} -inline id performOptionalSelector( id obj, SEL sel ) { -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" -#endif - if( [obj respondsToSelector: sel] ) - return [obj performSelector: sel]; -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - return nil; -} -#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained -#define CATCH_ARC_STRONG __strong -#endif - -#endif - -namespace Catch { -namespace Detail { - -// SFINAE is currently disabled by default for all compilers. -// If the non SFINAE version of IsStreamInsertable is ambiguous for you -// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE -#ifdef CATCH_CONFIG_SFINAE - - template - class IsStreamInsertableHelper { - template struct TrueIfSizeable : TrueType {}; - - template - static TrueIfSizeable dummy(T2*); - static FalseType dummy(...); - - public: - typedef SizedIf type; - }; - - template - struct IsStreamInsertable : IsStreamInsertableHelper::type {}; - -#else - - struct BorgType { - template BorgType( T const& ); - }; - - TrueType& testStreamable( std::ostream& ); - FalseType testStreamable( FalseType ); - - FalseType operator<<( std::ostream const&, BorgType const& ); - - template - struct IsStreamInsertable { - static std::ostream &s; - static T const&t; - enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) }; - }; - -#endif - - template - struct StringMakerBase { - template - static std::string convert( T const& ) { return "{?}"; } - }; - - template<> - struct StringMakerBase { - template - static std::string convert( T const& _value ) { - std::ostringstream oss; - oss << _value; - return oss.str(); - } - }; - - std::string rawMemoryToString( const void *object, std::size_t size ); - - template - inline std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); - } - -} // end namespace Detail - -template -std::string toString( T const& value ); - -template -struct StringMaker : - Detail::StringMakerBase::value> {}; - -template -struct StringMaker { - template - static std::string convert( U* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -template -struct StringMaker { - static std::string convert( R C::* p ) { - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - else - return Detail::rawMemoryToString( p ); - } -}; - -namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ); -} - -template -struct StringMaker > { - static std::string convert( std::vector const& v ) { - return Detail::rangeToString( v.begin(), v.end() ); - } -}; - -namespace Detail { - template - std::string makeString( T const& value ) { - return StringMaker::convert( value ); - } -} // end namespace Detail - -/// \brief converts any type to a string -/// -/// The default template forwards on to ostringstream - except when an -/// ostringstream overload does not exist - in which case it attempts to detect -/// that and writes {?}. -/// Overload (not specialise) this template for custom typs that you don't want -/// to provide an ostream overload for. -template -std::string toString( T const& value ) { - return StringMaker::convert( value ); -} - -// Built in overloads - -std::string toString( std::string const& value ); -std::string toString( std::wstring const& value ); -std::string toString( const char* const value ); -std::string toString( char* const value ); -std::string toString( int value ); -std::string toString( unsigned long value ); -std::string toString( unsigned int value ); -std::string toString( const double value ); -std::string toString( const float value ); -std::string toString( bool value ); -std::string toString( char value ); -std::string toString( signed char value ); -std::string toString( unsigned char value ); - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ); -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ); - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ); - std::string toString( NSObject* const& nsObject ); -#endif - - namespace Detail { - template - std::string rangeToString( InputIterator first, InputIterator last ) { - std::ostringstream oss; - oss << "{ "; - if( first != last ) { - oss << toString( *first ); - for( ++first ; first != last ; ++first ) { - oss << ", " << toString( *first ); - } - } - oss << " }"; - return oss.str(); - } -} - -} // end namespace Catch - -namespace Catch { - -// Wraps the LHS of an expression and captures the operator and RHS (if any) - -// wrapping them all in a ResultBuilder object -template -class ExpressionLhs { - ExpressionLhs& operator = ( ExpressionLhs const& ); -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs& operator = ( ExpressionLhs && ) = delete; -# endif - -public: - ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ) {} -# ifdef CATCH_CPP11_OR_GREATER - ExpressionLhs( ExpressionLhs const& ) = default; - ExpressionLhs( ExpressionLhs && ) = default; -# endif - - template - ResultBuilder& operator == ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator != ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator < ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator > ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator <= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - template - ResultBuilder& operator >= ( RhsT const& rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator == ( bool rhs ) { - return captureExpression( rhs ); - } - - ResultBuilder& operator != ( bool rhs ) { - return captureExpression( rhs ); - } - - void endExpression() { - bool value = m_lhs ? true : false; - m_rb - .setLhs( Catch::toString( value ) ) - .setResultType( value ) - .endExpression(); - } - - // Only simple binary expressions are allowed on the LHS. - // If more complex compositions are required then place the sub expression in parentheses - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( RhsT const& ); - template STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( RhsT const& ); - -private: - template - ResultBuilder& captureExpression( RhsT const& rhs ) { - return m_rb - .setResultType( Internal::compare( m_lhs, rhs ) ) - .setLhs( Catch::toString( m_lhs ) ) - .setRhs( Catch::toString( rhs ) ) - .setOp( Internal::OperatorTraits::getName() ); - } - -private: - ResultBuilder& m_rb; - T m_lhs; -}; - -} // end namespace Catch - - -namespace Catch { - - template - inline ExpressionLhs ResultBuilder::operator->* ( T const& operand ) { - return ExpressionLhs( *this, operand ); - } - - inline ExpressionLhs ResultBuilder::operator->* ( bool value ) { - return ExpressionLhs( *this, value ); - } - -} // namespace Catch - -// #included from: catch_message.h -#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED - -#include - -namespace Catch { - - struct MessageInfo { - MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ); - - std::string macroName; - SourceLineInfo lineInfo; - ResultWas::OfType type; - std::string message; - unsigned int sequence; - - bool operator == ( MessageInfo const& other ) const { - return sequence == other.sequence; - } - bool operator < ( MessageInfo const& other ) const { - return sequence < other.sequence; - } - private: - static unsigned int globalCount; - }; - - struct MessageBuilder { - MessageBuilder( std::string const& macroName, - SourceLineInfo const& lineInfo, - ResultWas::OfType type ) - : m_info( macroName, lineInfo, type ) - {} - - template - MessageBuilder& operator << ( T const& value ) { - m_stream << value; - return *this; - } - - MessageInfo m_info; - std::ostringstream m_stream; - }; - - class ScopedMessage { - public: - ScopedMessage( MessageBuilder const& builder ); - ScopedMessage( ScopedMessage const& other ); - ~ScopedMessage(); - - MessageInfo m_info; - }; - -} // end namespace Catch - -// #included from: catch_interfaces_capture.h -#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - class AssertionResult; - struct AssertionInfo; - struct SectionInfo; - struct MessageInfo; - class ScopedMessageBuilder; - struct Counts; - - struct IResultCapture { - - virtual ~IResultCapture(); - - virtual void assertionEnded( AssertionResult const& result ) = 0; - virtual bool sectionStarted( SectionInfo const& sectionInfo, - Counts& assertions ) = 0; - virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0; - virtual void pushScopedMessage( MessageInfo const& message ) = 0; - virtual void popScopedMessage( MessageInfo const& message ) = 0; - - virtual std::string getCurrentTestName() const = 0; - virtual const AssertionResult* getLastResult() const = 0; - }; - - IResultCapture& getResultCapture(); -} - -// #included from: catch_debugger.h -#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED - -// #included from: catch_platform.h -#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED - -#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_MAC -#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) -#define CATCH_PLATFORM_IPHONE -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) -#define CATCH_PLATFORM_WINDOWS -#endif - -#include - -namespace Catch{ - - bool isDebuggerActive(); - void writeToDebugConsole( std::string const& text ); -} - -#ifdef CATCH_PLATFORM_MAC - - // The following code snippet based on: - // http://cocoawithlove.com/2008/03/break-into-debugger.html - #ifdef DEBUG - #if defined(__ppc64__) || defined(__ppc__) - #define CATCH_BREAK_INTO_DEBUGGER() \ - if( Catch::isDebuggerActive() ) { \ - __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \ - : : : "memory","r0","r3","r4" ); \ - } - #else - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );} - #endif - #endif - -#elif defined(_MSC_VER) - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) void __stdcall DebugBreak(); - #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); } -#endif - -#ifndef CATCH_BREAK_INTO_DEBUGGER -#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue(); -#endif - -// #included from: catch_interfaces_runner.h -#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED - -namespace Catch { - class TestCase; - - struct IRunner { - virtual ~IRunner(); - virtual bool aborting() const = 0; - }; -} - -/////////////////////////////////////////////////////////////////////////////// -// In the event of a failure works out if the debugger needs to be invoked -// and/or an exception thrown and takes appropriate action. -// This needs to be done as a macro so the debugger will stop in the user -// source code rather than in Catch library code -#define INTERNAL_CATCH_REACT( resultBuilder ) \ - if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ - resultBuilder.react(); - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - ( __catchResult->*expr ).endExpression(); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( Catch::ResultDisposition::Normal ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_ELSE( expr, resultDisposition, macroName ) \ - INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ); \ - if( !Catch::getResultCapture().getLastResult()->succeeded() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_NO_THROW( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS( expr, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( ... ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_THROWS_AS( expr, exceptionType, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \ - if( __catchResult.allowThrows() ) \ - try { \ - expr; \ - __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ - } \ - catch( exceptionType ) { \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - } \ - catch( ... ) { \ - __catchResult.useActiveException( resultDisposition ); \ - } \ - else \ - __catchResult.captureResult( Catch::ResultWas::Ok ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -/////////////////////////////////////////////////////////////////////////////// -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, ... ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#else - #define INTERNAL_CATCH_MSG( messageType, resultDisposition, macroName, log ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ - __catchResult << log + ::Catch::StreamEndStop(); \ - __catchResult.captureResult( messageType ); \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) -#endif - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_INFO( log, macroName ) \ - Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log; - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \ - do { \ - Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg " " #matcher, resultDisposition ); \ - try { \ - std::string matcherAsString = ::Catch::Matchers::matcher.toString(); \ - __catchResult \ - .setLhs( Catch::toString( arg ) ) \ - .setRhs( matcherAsString == "{?}" ? #matcher : matcherAsString ) \ - .setOp( "matches" ) \ - .setResultType( ::Catch::Matchers::matcher.match( arg ) ); \ - __catchResult.captureExpression(); \ - } catch( ... ) { \ - __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \ - } \ - INTERNAL_CATCH_REACT( __catchResult ) \ - } while( Catch::alwaysFalse() ) - -// #included from: internal/catch_section.h -#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED - -// #included from: catch_section_info.h -#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED - -namespace Catch { - - struct SectionInfo { - SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description = std::string() ); - - std::string name; - std::string description; - SourceLineInfo lineInfo; - }; - -} // end namespace Catch - -// #included from: catch_totals.hpp -#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED - -#include - -namespace Catch { - - struct Counts { - Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {} - - Counts operator - ( Counts const& other ) const { - Counts diff; - diff.passed = passed - other.passed; - diff.failed = failed - other.failed; - diff.failedButOk = failedButOk - other.failedButOk; - return diff; - } - Counts& operator += ( Counts const& other ) { - passed += other.passed; - failed += other.failed; - failedButOk += other.failedButOk; - return *this; - } - - std::size_t total() const { - return passed + failed + failedButOk; - } - bool allPassed() const { - return failed == 0 && failedButOk == 0; - } - - std::size_t passed; - std::size_t failed; - std::size_t failedButOk; - }; - - struct Totals { - - Totals operator - ( Totals const& other ) const { - Totals diff; - diff.assertions = assertions - other.assertions; - diff.testCases = testCases - other.testCases; - return diff; - } - - Totals delta( Totals const& prevTotals ) const { - Totals diff = *this - prevTotals; - if( diff.assertions.failed > 0 ) - ++diff.testCases.failed; - else if( diff.assertions.failedButOk > 0 ) - ++diff.testCases.failedButOk; - else - ++diff.testCases.passed; - return diff; - } - - Totals& operator += ( Totals const& other ) { - assertions += other.assertions; - testCases += other.testCases; - return *this; - } - - Counts assertions; - Counts testCases; - }; -} - -// #included from: catch_timer.h -#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED - -#ifdef CATCH_PLATFORM_WINDOWS -typedef unsigned long long uint64_t; -#else -#include -#endif - -namespace Catch { - - class Timer { - public: - Timer() : m_ticks( 0 ) {} - void start(); - unsigned int getElapsedNanoseconds() const; - unsigned int getElapsedMilliseconds() const; - double getElapsedSeconds() const; - - private: - uint64_t m_ticks; - }; - -} // namespace Catch - -#include - -namespace Catch { - - class Section { - public: - Section( SectionInfo const& info ); - ~Section(); - - // This indicates whether the section should be executed or not - operator bool() const; - - private: -#ifdef CATCH_CPP11_OR_GREATER - Section( Section const& ) = delete; - Section( Section && ) = delete; - Section& operator = ( Section const& ) = delete; - Section& operator = ( Section && ) = delete; -#else - Section( Section const& info ); - Section& operator = ( Section const& ); -#endif - SectionInfo m_info; - - std::string m_name; - Counts m_assertions; - bool m_sectionIncluded; - Timer m_timer; - }; - -} // end namespace Catch - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define INTERNAL_CATCH_SECTION( ... ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) -#else - #define INTERNAL_CATCH_SECTION( name, desc ) \ - if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) ) -#endif - -// #included from: internal/catch_generators.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - -template -struct IGenerator { - virtual ~IGenerator() {} - virtual T getValue( std::size_t index ) const = 0; - virtual std::size_t size () const = 0; -}; - -template -class BetweenGenerator : public IGenerator { -public: - BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){} - - virtual T getValue( std::size_t index ) const { - return m_from+static_cast( index ); - } - - virtual std::size_t size() const { - return static_cast( 1+m_to-m_from ); - } - -private: - - T m_from; - T m_to; -}; - -template -class ValuesGenerator : public IGenerator { -public: - ValuesGenerator(){} - - void add( T value ) { - m_values.push_back( value ); - } - - virtual T getValue( std::size_t index ) const { - return m_values[index]; - } - - virtual std::size_t size() const { - return m_values.size(); - } - -private: - std::vector m_values; -}; - -template -class CompositeGenerator { -public: - CompositeGenerator() : m_totalSize( 0 ) {} - - // *** Move semantics, similar to auto_ptr *** - CompositeGenerator( CompositeGenerator& other ) - : m_fileInfo( other.m_fileInfo ), - m_totalSize( 0 ) - { - move( other ); - } - - CompositeGenerator& setFileInfo( const char* fileInfo ) { - m_fileInfo = fileInfo; - return *this; - } - - ~CompositeGenerator() { - deleteAll( m_composed ); - } - - operator T () const { - size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize ); - - typename std::vector*>::const_iterator it = m_composed.begin(); - typename std::vector*>::const_iterator itEnd = m_composed.end(); - for( size_t index = 0; it != itEnd; ++it ) - { - const IGenerator* generator = *it; - if( overallIndex >= index && overallIndex < index + generator->size() ) - { - return generator->getValue( overallIndex-index ); - } - index += generator->size(); - } - CATCH_INTERNAL_ERROR( "Indexed past end of generated range" ); - return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so - } - - void add( const IGenerator* generator ) { - m_totalSize += generator->size(); - m_composed.push_back( generator ); - } - - CompositeGenerator& then( CompositeGenerator& other ) { - move( other ); - return *this; - } - - CompositeGenerator& then( T value ) { - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( value ); - add( valuesGen ); - return *this; - } - -private: - - void move( CompositeGenerator& other ) { - std::copy( other.m_composed.begin(), other.m_composed.end(), std::back_inserter( m_composed ) ); - m_totalSize += other.m_totalSize; - other.m_composed.clear(); - } - - std::vector*> m_composed; - std::string m_fileInfo; - size_t m_totalSize; -}; - -namespace Generators -{ - template - CompositeGenerator between( T from, T to ) { - CompositeGenerator generators; - generators.add( new BetweenGenerator( from, to ) ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3 ){ - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - generators.add( valuesGen ); - return generators; - } - - template - CompositeGenerator values( T val1, T val2, T val3, T val4 ) { - CompositeGenerator generators; - ValuesGenerator* valuesGen = new ValuesGenerator(); - valuesGen->add( val1 ); - valuesGen->add( val2 ); - valuesGen->add( val3 ); - valuesGen->add( val4 ); - generators.add( valuesGen ); - return generators; - } - -} // end namespace Generators - -using namespace Generators; - -} // end namespace Catch - -#define INTERNAL_CATCH_LINESTR2( line ) #line -#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line ) - -#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" ) - -// #included from: internal/catch_interfaces_exception.h -#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED - -#include -// #included from: catch_interfaces_registry_hub.h -#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED - -#include - -namespace Catch { - - class TestCase; - struct ITestCaseRegistry; - struct IExceptionTranslatorRegistry; - struct IExceptionTranslator; - struct IReporterRegistry; - struct IReporterFactory; - - struct IRegistryHub { - virtual ~IRegistryHub(); - - virtual IReporterRegistry const& getReporterRegistry() const = 0; - virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; - }; - - struct IMutableRegistryHub { - virtual ~IMutableRegistryHub(); - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; - virtual void registerTest( TestCase const& testInfo ) = 0; - virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; - }; - - IRegistryHub& getRegistryHub(); - IMutableRegistryHub& getMutableRegistryHub(); - void cleanUp(); - std::string translateActiveException(); - -} - - -namespace Catch { - - typedef std::string(*exceptionTranslateFunction)(); - - struct IExceptionTranslator { - virtual ~IExceptionTranslator(); - virtual std::string translate() const = 0; - }; - - struct IExceptionTranslatorRegistry { - virtual ~IExceptionTranslatorRegistry(); - - virtual std::string translateActiveException() const = 0; - }; - - class ExceptionTranslatorRegistrar { - template - class ExceptionTranslator : public IExceptionTranslator { - public: - - ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) - {} - - virtual std::string translate() const { - try { - throw; - } - catch( T& ex ) { - return m_translateFunction( ex ); - } - } - - protected: - std::string(*m_translateFunction)( T& ); - }; - - public: - template - ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { - getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); - } - }; -} - -/////////////////////////////////////////////////////////////////////////////// -#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ - namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ - static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ) - -// #included from: internal/catch_approx.hpp -#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED - -#include -#include - -namespace Catch { -namespace Detail { - - class Approx { - public: - explicit Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_scale( 1.0 ), - m_value( value ) - {} - - Approx( Approx const& other ) - : m_epsilon( other.m_epsilon ), - m_scale( other.m_scale ), - m_value( other.m_value ) - {} - - static Approx custom() { - return Approx( 0 ); - } - - Approx operator()( double value ) { - Approx approx( value ); - approx.epsilon( m_epsilon ); - approx.scale( m_scale ); - return approx; - } - - friend bool operator == ( double lhs, Approx const& rhs ) { - // Thanks to Richard Harris for his help refining this formula - return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) ); - } - - friend bool operator == ( Approx const& lhs, double rhs ) { - return operator==( rhs, lhs ); - } - - friend bool operator != ( double lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } - - friend bool operator != ( Approx const& lhs, double rhs ) { - return !operator==( rhs, lhs ); - } - - Approx& epsilon( double newEpsilon ) { - m_epsilon = newEpsilon; - return *this; - } - - Approx& scale( double newScale ) { - m_scale = newScale; - return *this; - } - - std::string toString() const { - std::ostringstream oss; - oss << "Approx( " << Catch::toString( m_value ) << " )"; - return oss.str(); - } - - private: - double m_epsilon; - double m_scale; - double m_value; - }; -} - -template<> -inline std::string toString( Detail::Approx const& value ) { - return value.toString(); -} - -} // end namespace Catch - -// #included from: internal/catch_matchers.hpp -#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED - -namespace Catch { -namespace Matchers { - namespace Impl { - - template - struct Matcher : SharedImpl - { - typedef ExpressionT ExpressionType; - - virtual ~Matcher() {} - virtual Ptr clone() const = 0; - virtual bool match( ExpressionT const& expr ) const = 0; - virtual std::string toString() const = 0; - }; - - template - struct MatcherImpl : Matcher { - - virtual Ptr > clone() const { - return Ptr >( new DerivedT( static_cast( *this ) ) ); - } - }; - - namespace Generic { - - template - class AllOf : public MatcherImpl, ExpressionT> { - public: - - AllOf() {} - AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {} - - AllOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( !m_matchers[i]->match( expr ) ) - return false; - return true; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " and "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - template - class AnyOf : public MatcherImpl, ExpressionT> { - public: - - AnyOf() {} - AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {} - - AnyOf& add( Matcher const& matcher ) { - m_matchers.push_back( matcher.clone() ); - return *this; - } - virtual bool match( ExpressionT const& expr ) const - { - for( std::size_t i = 0; i < m_matchers.size(); ++i ) - if( m_matchers[i]->match( expr ) ) - return true; - return false; - } - virtual std::string toString() const { - std::ostringstream oss; - oss << "( "; - for( std::size_t i = 0; i < m_matchers.size(); ++i ) { - if( i != 0 ) - oss << " or "; - oss << m_matchers[i]->toString(); - } - oss << " )"; - return oss.str(); - } - - private: - std::vector > > m_matchers; - }; - - } - - namespace StdString { - - inline std::string makeString( std::string const& str ) { return str; } - inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); } - - struct Equals : MatcherImpl { - Equals( std::string const& str ) : m_str( str ){} - Equals( Equals const& other ) : m_str( other.m_str ){} - - virtual ~Equals(); - - virtual bool match( std::string const& expr ) const { - return m_str == expr; - } - virtual std::string toString() const { - return "equals: \"" + m_str + "\""; - } - - std::string m_str; - }; - - struct Contains : MatcherImpl { - Contains( std::string const& substr ) : m_substr( substr ){} - Contains( Contains const& other ) : m_substr( other.m_substr ){} - - virtual ~Contains(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) != std::string::npos; - } - virtual std::string toString() const { - return "contains: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct StartsWith : MatcherImpl { - StartsWith( std::string const& substr ) : m_substr( substr ){} - StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~StartsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == 0; - } - virtual std::string toString() const { - return "starts with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - - struct EndsWith : MatcherImpl { - EndsWith( std::string const& substr ) : m_substr( substr ){} - EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){} - - virtual ~EndsWith(); - - virtual bool match( std::string const& expr ) const { - return expr.find( m_substr ) == expr.size() - m_substr.size(); - } - virtual std::string toString() const { - return "ends with: \"" + m_substr + "\""; - } - - std::string m_substr; - }; - } // namespace StdString - } // namespace Impl - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AllOf AllOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AllOf().add( m1 ).add( m2 ).add( m3 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ); - } - template - inline Impl::Generic::AnyOf AnyOf( Impl::Matcher const& m1, - Impl::Matcher const& m2, - Impl::Matcher const& m3 ) { - return Impl::Generic::AnyOf().add( m1 ).add( m2 ).add( m3 ); - } - - inline Impl::StdString::Equals Equals( std::string const& str ) { - return Impl::StdString::Equals( str ); - } - inline Impl::StdString::Equals Equals( const char* str ) { - return Impl::StdString::Equals( Impl::StdString::makeString( str ) ); - } - inline Impl::StdString::Contains Contains( std::string const& substr ) { - return Impl::StdString::Contains( substr ); - } - inline Impl::StdString::Contains Contains( const char* substr ) { - return Impl::StdString::Contains( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) { - return Impl::StdString::StartsWith( substr ); - } - inline Impl::StdString::StartsWith StartsWith( const char* substr ) { - return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) ); - } - inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) { - return Impl::StdString::EndsWith( substr ); - } - inline Impl::StdString::EndsWith EndsWith( const char* substr ) { - return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) ); - } - -} // namespace Matchers - -using namespace Matchers; - -} // namespace Catch - -// #included from: internal/catch_interfaces_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED - -// #included from: catch_tag_alias.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED - -#include - -namespace Catch { - - struct TagAlias { - TagAlias( std::string _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {} - - std::string tag; - SourceLineInfo lineInfo; - }; - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } -// #included from: catch_option.hpp -#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED - -namespace Catch { - - // An optional type - template - class Option { - public: - Option() : nullableValue( NULL ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : NULL ) - {} - - ~Option() { - reset(); - } - - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); - } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = NULL; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } - - bool some() const { return nullableValue != NULL; } - bool none() const { return nullableValue == NULL; } - - bool operator !() const { return nullableValue == NULL; } - operator SafeBool::type() const { - return SafeBool::makeSafe( some() ); - } - - private: - T* nullableValue; - char storage[sizeof(T)]; - }; - -} // end namespace Catch - -namespace Catch { - - struct ITagAliasRegistry { - virtual ~ITagAliasRegistry(); - virtual Option find( std::string const& alias ) const = 0; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; - - static ITagAliasRegistry const& get(); - }; - -} // end namespace Catch - -// These files are included here so the single_include script doesn't put them -// in the conditionally compiled sections -// #included from: internal/catch_test_case_info.h -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED - -#include -#include - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - struct ITestCase; - - struct TestCaseInfo { - enum SpecialProperties{ - None = 0, - IsHidden = 1 << 1, - ShouldFail = 1 << 2, - MayFail = 1 << 3, - Throws = 1 << 4 - }; - - TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ); - - TestCaseInfo( TestCaseInfo const& other ); - - bool isHidden() const; - bool throws() const; - bool okToFail() const; - bool expectedToFail() const; - - std::string name; - std::string className; - std::string description; - std::set tags; - std::set lcaseTags; - std::string tagsAsString; - SourceLineInfo lineInfo; - SpecialProperties properties; - }; - - class TestCase : public TestCaseInfo { - public: - - TestCase( ITestCase* testCase, TestCaseInfo const& info ); - TestCase( TestCase const& other ); - - TestCase withName( std::string const& _newName ) const; - - void invoke() const; - - TestCaseInfo const& getTestCaseInfo() const; - - void swap( TestCase& other ); - bool operator == ( TestCase const& other ) const; - bool operator < ( TestCase const& other ) const; - TestCase& operator = ( TestCase const& other ); - - private: - Ptr test; - }; - - TestCase makeTestCase( ITestCase* testCase, - std::string const& className, - std::string const& name, - std::string const& description, - SourceLineInfo const& lineInfo ); -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - - -#ifdef __OBJC__ -// #included from: internal/catch_objc.hpp -#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED - -#import - -#include - -// NB. Any general catch headers included here must be included -// in catch.hpp first to make sure they are included by the single -// header for non obj-usage - -/////////////////////////////////////////////////////////////////////////////// -// This protocol is really only here for (self) documenting purposes, since -// all its methods are optional. -@protocol OcFixture - -@optional - --(void) setUp; --(void) tearDown; - -@end - -namespace Catch { - - class OcMethod : public SharedImpl { - - public: - OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} - - virtual void invoke() const { - id obj = [[m_cls alloc] init]; - - performOptionalSelector( obj, @selector(setUp) ); - performOptionalSelector( obj, m_sel ); - performOptionalSelector( obj, @selector(tearDown) ); - - arcSafeRelease( obj ); - } - private: - virtual ~OcMethod() {} - - Class m_cls; - SEL m_sel; - }; - - namespace Detail{ - - inline std::string getAnnotation( Class cls, - std::string const& annotationName, - std::string const& testCaseName ) { - NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; - SEL sel = NSSelectorFromString( selStr ); - arcSafeRelease( selStr ); - id value = performOptionalSelector( cls, sel ); - if( value ) - return [(NSString*)value UTF8String]; - return ""; - } - } - - inline size_t registerTestMethods() { - size_t noTestMethods = 0; - int noClasses = objc_getClassList( NULL, 0 ); - - Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); - objc_getClassList( classes, noClasses ); - - for( int c = 0; c < noClasses; c++ ) { - Class cls = classes[c]; - { - u_int count; - Method* methods = class_copyMethodList( cls, &count ); - for( u_int m = 0; m < count ; m++ ) { - SEL selector = method_getName(methods[m]); - std::string methodName = sel_getName(selector); - if( startsWith( methodName, "Catch_TestCase_" ) ) { - std::string testCaseName = methodName.substr( 15 ); - std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); - std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); - const char* className = class_getName( cls ); - - getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) ); - noTestMethods++; - } - } - free(methods); - } - } - return noTestMethods; - } - - namespace Matchers { - namespace Impl { - namespace NSStringMatchers { - - template - struct StringHolder : MatcherImpl{ - StringHolder( NSString* substr ) : m_substr( [substr copy] ){} - StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} - StringHolder() { - arcSafeRelease( m_substr ); - } - - NSString* m_substr; - }; - - struct Equals : StringHolder { - Equals( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str isEqualToString:m_substr]; - } - - virtual std::string toString() const { - return "equals string: " + Catch::toString( m_substr ); - } - }; - - struct Contains : StringHolder { - Contains( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location != NSNotFound; - } - - virtual std::string toString() const { - return "contains string: " + Catch::toString( m_substr ); - } - }; - - struct StartsWith : StringHolder { - StartsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == 0; - } - - virtual std::string toString() const { - return "starts with: " + Catch::toString( m_substr ); - } - }; - struct EndsWith : StringHolder { - EndsWith( NSString* substr ) : StringHolder( substr ){} - - virtual bool match( ExpressionType const& str ) const { - return (str != nil || m_substr == nil ) && - [str rangeOfString:m_substr].location == [str length] - [m_substr length]; - } - - virtual std::string toString() const { - return "ends with: " + Catch::toString( m_substr ); - } - }; - - } // namespace NSStringMatchers - } // namespace Impl - - inline Impl::NSStringMatchers::Equals - Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } - - inline Impl::NSStringMatchers::Contains - Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } - - inline Impl::NSStringMatchers::StartsWith - StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } - - inline Impl::NSStringMatchers::EndsWith - EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } - - } // namespace Matchers - - using namespace Matchers; - -} // namespace Catch - -/////////////////////////////////////////////////////////////////////////////// -#define OC_TEST_CASE( name, desc )\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ -{\ -return @ name; \ -}\ -+(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ -{ \ -return @ desc; \ -} \ --(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) - -#endif - -#ifdef CATCH_CONFIG_RUNNER -// #included from: internal/catch_impl.hpp -#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED - -// Collect all the implementation files together here -// These are the equivalent of what would usually be cpp files - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wweak-vtables" -#endif - -// #included from: catch_runner.hpp -#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED - -// #included from: internal/catch_commandline.hpp -#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED - -// #included from: catch_config.hpp -#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED - -// #included from: catch_test_spec_parser.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -// #included from: catch_test_spec.hpp -#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpadded" -#endif - -#include -#include - -namespace Catch { - - class TestSpec { - struct Pattern : SharedImpl<> { - virtual ~Pattern(); - virtual bool matches( TestCaseInfo const& testCase ) const = 0; - }; - class NamePattern : public Pattern { - enum WildcardPosition { - NoWildcard = 0, - WildcardAtStart = 1, - WildcardAtEnd = 2, - WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd - }; - - public: - NamePattern( std::string const& name ) : m_name( toLower( name ) ), m_wildcard( NoWildcard ) { - if( startsWith( m_name, "*" ) ) { - m_name = m_name.substr( 1 ); - m_wildcard = WildcardAtStart; - } - if( endsWith( m_name, "*" ) ) { - m_name = m_name.substr( 0, m_name.size()-1 ); - m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); - } - } - virtual ~NamePattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - switch( m_wildcard ) { - case NoWildcard: - return m_name == toLower( testCase.name ); - case WildcardAtStart: - return endsWith( toLower( testCase.name ), m_name ); - case WildcardAtEnd: - return startsWith( toLower( testCase.name ), m_name ); - case WildcardAtBothEnds: - return contains( toLower( testCase.name ), m_name ); - } - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunreachable-code" -#endif - throw std::logic_error( "Unknown enum" ); -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - } - private: - std::string m_name; - WildcardPosition m_wildcard; - }; - class TagPattern : public Pattern { - public: - TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} - virtual ~TagPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { - return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end(); - } - private: - std::string m_tag; - }; - class ExcludedPattern : public Pattern { - public: - ExcludedPattern( Ptr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - virtual ~ExcludedPattern(); - virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } - private: - Ptr m_underlyingPattern; - }; - - struct Filter { - std::vector > m_patterns; - - bool matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( std::vector >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) - if( !(*it)->matches( testCase ) ) - return false; - return true; - } - }; - - public: - bool hasFilters() const { - return !m_filters.empty(); - } - bool matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( std::vector::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it ) - if( it->matches( testCase ) ) - return true; - return false; - } - - private: - std::vector m_filters; - - friend class TestSpecParser; - }; -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -namespace Catch { - - class TestSpecParser { - enum Mode{ None, Name, QuotedName, Tag }; - Mode m_mode; - bool m_exclusion; - std::size_t m_start, m_pos; - std::string m_arg; - TestSpec::Filter m_currentFilter; - TestSpec m_testSpec; - ITagAliasRegistry const* m_tagAliases; - - public: - TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} - - TestSpecParser& parse( std::string const& arg ) { - m_mode = None; - m_exclusion = false; - m_start = std::string::npos; - m_arg = m_tagAliases->expandAliases( arg ); - for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern(); - return *this; - } - TestSpec testSpec() { - addFilter(); - return m_testSpec; - } - private: - void visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - default: startNewMode( Name, m_pos ); break; - } - } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern(); - startNewMode( Tag, ++m_pos ); - } - } - else if( m_mode == QuotedName && c == '"' ) - addPattern(); - else if( m_mode == Tag && c == ']' ) - addPattern(); - } - void startNewMode( Mode mode, std::size_t start ) { - m_mode = mode; - m_start = start; - } - std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); } - template - void addPattern() { - std::string token = subString(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - Ptr pattern = new T( token ); - if( m_exclusion ) - pattern = new TestSpec::ExcludedPattern( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; - } - void addFilter() { - if( !m_currentFilter.m_patterns.empty() ) { - m_testSpec.m_filters.push_back( m_currentFilter ); - m_currentFilter = TestSpec::Filter(); - } - } - }; - inline TestSpec parseTestSpec( std::string const& arg ) { - return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -// #included from: catch_interfaces_config.h -#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct Verbosity { enum Level { - NoOutput = 0, - Quiet, - Normal - }; }; - - struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01 - }; }; - - struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; - - class TestSpec; - - struct IConfig : IShared { - - virtual ~IConfig(); - - virtual bool allowThrows() const = 0; - virtual std::ostream& stream() const = 0; - virtual std::string name() const = 0; - virtual bool includeSuccessfulResults() const = 0; - virtual bool shouldDebugBreak() const = 0; - virtual bool warnAboutMissingAssertions() const = 0; - virtual int abortAfter() const = 0; - virtual bool showInvisibles() const = 0; - virtual ShowDurations::OrNot showDurations() const = 0; - virtual TestSpec const& testSpec() const = 0; - }; -} - -// #included from: catch_stream.h -#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED - -#include - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wpadded" -#endif - -namespace Catch { - - class Stream { - public: - Stream(); - Stream( std::streambuf* _streamBuf, bool _isOwned ); - void release(); - - std::streambuf* streamBuf; - - private: - bool isOwned; - }; -} - -#include -#include -#include -#include - -#ifndef CATCH_CONFIG_CONSOLE_WIDTH -#define CATCH_CONFIG_CONSOLE_WIDTH 80 -#endif - -namespace Catch { - - struct ConfigData { - - ConfigData() - : listTests( false ), - listTags( false ), - listReporters( false ), - listTestNamesOnly( false ), - showSuccessfulTests( false ), - shouldDebugBreak( false ), - noThrow( false ), - showHelp( false ), - showInvisibles( false ), - abortAfter( -1 ), - verbosity( Verbosity::Normal ), - warnings( WarnAbout::Nothing ), - showDurations( ShowDurations::DefaultForReporter ) - {} - - bool listTests; - bool listTags; - bool listReporters; - bool listTestNamesOnly; - - bool showSuccessfulTests; - bool shouldDebugBreak; - bool noThrow; - bool showHelp; - bool showInvisibles; - - int abortAfter; - - Verbosity::Level verbosity; - WarnAbout::What warnings; - ShowDurations::OrNot showDurations; - - std::string reporterName; - std::string outputFilename; - std::string name; - std::string processName; - - std::vector testsOrTags; - }; - - class Config : public SharedImpl { - private: - Config( Config const& other ); - Config& operator = ( Config const& other ); - virtual void dummy(); - public: - - Config() - : m_os( std::cout.rdbuf() ) - {} - - Config( ConfigData const& data ) - : m_data( data ), - m_os( std::cout.rdbuf() ) - { - if( !data.testsOrTags.empty() ) { - TestSpecParser parser( ITagAliasRegistry::get() ); - for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) - parser.parse( data.testsOrTags[i] ); - m_testSpec = parser.testSpec(); - } - } - - virtual ~Config() { - m_os.rdbuf( std::cout.rdbuf() ); - m_stream.release(); - } - - void setFilename( std::string const& filename ) { - m_data.outputFilename = filename; - } - - std::string const& getFilename() const { - return m_data.outputFilename ; - } - - bool listTests() const { return m_data.listTests; } - bool listTestNamesOnly() const { return m_data.listTestNamesOnly; } - bool listTags() const { return m_data.listTags; } - bool listReporters() const { return m_data.listReporters; } - - std::string getProcessName() const { return m_data.processName; } - - bool shouldDebugBreak() const { return m_data.shouldDebugBreak; } - - void setStreamBuf( std::streambuf* buf ) { - m_os.rdbuf( buf ? buf : std::cout.rdbuf() ); - } - - void useStream( std::string const& streamName ) { - Stream stream = createStream( streamName ); - setStreamBuf( stream.streamBuf ); - m_stream.release(); - m_stream = stream; - } - - std::string getReporterName() const { return m_data.reporterName; } - - int abortAfter() const { return m_data.abortAfter; } - - TestSpec const& testSpec() const { return m_testSpec; } - - bool showHelp() const { return m_data.showHelp; } - bool showInvisibles() const { return m_data.showInvisibles; } - - // IConfig interface - virtual bool allowThrows() const { return !m_data.noThrow; } - virtual std::ostream& stream() const { return m_os; } - virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } - virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } - virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; } - virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; } - - private: - ConfigData m_data; - - Stream m_stream; - mutable std::ostream m_os; - TestSpec m_testSpec; - }; - -} // end namespace Catch - -// #included from: catch_clara.h -#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED - -// Use Catch's value for console width (store Clara's off to the side, if present) -#ifdef CLARA_CONFIG_CONSOLE_WIDTH -#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH -#undef CLARA_CONFIG_CONSOLE_WIDTH -#endif -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -// Declare Clara inside the Catch namespace -#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch { -// #included from: ../external/clara.h - -// Only use header guard if we are not using an outer namespace -#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE) - -#ifndef STITCH_CLARA_OPEN_NAMESPACE -#define TWOBLUECUBES_CLARA_H_INCLUDED -#define STITCH_CLARA_OPEN_NAMESPACE -#define STITCH_CLARA_CLOSE_NAMESPACE -#else -#define STITCH_CLARA_CLOSE_NAMESPACE } -#endif - -#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE - -// ----------- #included from tbc_text_format.h ----------- - -// Only use header guard if we are not using an outer namespace -#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) -#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -#define TBC_TEXT_FORMAT_H_INCLUDED -#endif - -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TBC_TEXT_FORMAT_H_INCLUDED - -// ----------- end of #include from tbc_text_format.h ----------- -// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h - -#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE - -#include -#include -#include -#include - -// Use optional outer namespace -#ifdef STITCH_CLARA_OPEN_NAMESPACE -STITCH_CLARA_OPEN_NAMESPACE -#endif - -namespace Clara { - - struct UnpositionalTag {}; - - extern UnpositionalTag _; - -#ifdef CLARA_CONFIG_MAIN - UnpositionalTag _; -#endif - - namespace Detail { - -#ifdef CLARA_CONSOLE_WIDTH - const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - using namespace Tbc; - - inline bool startsWith( std::string const& str, std::string const& prefix ) { - return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix; - } - - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - template struct RemoveConstRef{ typedef T type; }; - - template struct IsBool { static const bool value = false; }; - template<> struct IsBool { static const bool value = true; }; - - template - void convertInto( std::string const& _source, T& _dest ) { - std::stringstream ss; - ss << _source; - ss >> _dest; - if( ss.fail() ) - throw std::runtime_error( "Unable to convert " + _source + " to destination type" ); - } - inline void convertInto( std::string const& _source, std::string& _dest ) { - _dest = _source; - } - inline void convertInto( std::string const& _source, bool& _dest ) { - std::string sourceLC = _source; - std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower ); - if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" ) - _dest = true; - else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" ) - _dest = false; - else - throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" ); - } - inline void convertInto( bool _source, bool& _dest ) { - _dest = _source; - } - template - inline void convertInto( bool, T& ) { - throw std::runtime_error( "Invalid conversion" ); - } - - template - struct IArgFunction { - virtual ~IArgFunction() {} -# ifdef CATCH_CPP11_OR_GREATER - IArgFunction() = default; - IArgFunction( IArgFunction const& ) = default; -# endif - virtual void set( ConfigT& config, std::string const& value ) const = 0; - virtual void setFlag( ConfigT& config ) const = 0; - virtual bool takesArg() const = 0; - virtual IArgFunction* clone() const = 0; - }; - - template - class BoundArgFunction { - public: - BoundArgFunction() : functionObj( NULL ) {} - BoundArgFunction( IArgFunction* _functionObj ) : functionObj( _functionObj ) {} - BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : NULL ) {} - BoundArgFunction& operator = ( BoundArgFunction const& other ) { - IArgFunction* newFunctionObj = other.functionObj ? other.functionObj->clone() : NULL; - delete functionObj; - functionObj = newFunctionObj; - return *this; - } - ~BoundArgFunction() { delete functionObj; } - - void set( ConfigT& config, std::string const& value ) const { - functionObj->set( config, value ); - } - void setFlag( ConfigT& config ) const { - functionObj->setFlag( config ); - } - bool takesArg() const { return functionObj->takesArg(); } - - bool isSet() const { - return functionObj != NULL; - } - private: - IArgFunction* functionObj; - }; - - template - struct NullBinder : IArgFunction{ - virtual void set( C&, std::string const& ) const {} - virtual void setFlag( C& ) const {} - virtual bool takesArg() const { return true; } - virtual IArgFunction* clone() const { return new NullBinder( *this ); } - }; - - template - struct BoundDataMember : IArgFunction{ - BoundDataMember( M C::* _member ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - convertInto( stringValue, p.*member ); - } - virtual void setFlag( C& p ) const { - convertInto( true, p.*member ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundDataMember( *this ); } - M C::* member; - }; - template - struct BoundUnaryMethod : IArgFunction{ - BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - (p.*member)( value ); - } - virtual void setFlag( C& p ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - (p.*member)( value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundUnaryMethod( *this ); } - void (C::*member)( M ); - }; - template - struct BoundNullaryMethod : IArgFunction{ - BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {} - virtual void set( C& p, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - (p.*member)(); - } - virtual void setFlag( C& p ) const { - (p.*member)(); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundNullaryMethod( *this ); } - void (C::*member)(); - }; - - template - struct BoundUnaryFunction : IArgFunction{ - BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - bool value; - convertInto( stringValue, value ); - if( value ) - function( obj ); - } - virtual void setFlag( C& p ) const { - function( p ); - } - virtual bool takesArg() const { return false; } - virtual IArgFunction* clone() const { return new BoundUnaryFunction( *this ); } - void (*function)( C& ); - }; - - template - struct BoundBinaryFunction : IArgFunction{ - BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {} - virtual void set( C& obj, std::string const& stringValue ) const { - typename RemoveConstRef::type value; - convertInto( stringValue, value ); - function( obj, value ); - } - virtual void setFlag( C& obj ) const { - typename RemoveConstRef::type value; - convertInto( true, value ); - function( obj, value ); - } - virtual bool takesArg() const { return !IsBool::value; } - virtual IArgFunction* clone() const { return new BoundBinaryFunction( *this ); } - void (*function)( C&, T ); - }; - - } // namespace Detail - - struct Parser { - Parser() : separators( " \t=:" ) {} - - struct Token { - enum Type { Positional, ShortOpt, LongOpt }; - Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {} - Type type; - std::string data; - }; - - void parseIntoTokens( int argc, char const * const * argv, std::vector& tokens ) const { - const std::string doubleDash = "--"; - for( int i = 1; i < argc && argv[i] != doubleDash; ++i ) - parseIntoTokens( argv[i] , tokens); - } - void parseIntoTokens( std::string arg, std::vector& tokens ) const { - while( !arg.empty() ) { - Parser::Token token( Parser::Token::Positional, arg ); - arg = ""; - if( token.data[0] == '-' ) { - if( token.data.size() > 1 && token.data[1] == '-' ) { - token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) ); - } - else { - token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) ); - if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) { - arg = "-" + token.data.substr( 1 ); - token.data = token.data.substr( 0, 1 ); - } - } - } - if( token.type != Parser::Token::Positional ) { - std::size_t pos = token.data.find_first_of( separators ); - if( pos != std::string::npos ) { - arg = token.data.substr( pos+1 ); - token.data = token.data.substr( 0, pos ); - } - } - tokens.push_back( token ); - } - } - std::string separators; - }; - - template - struct CommonArgProperties { - CommonArgProperties() {} - CommonArgProperties( Detail::BoundArgFunction const& _boundField ) : boundField( _boundField ) {} - - Detail::BoundArgFunction boundField; - std::string description; - std::string detail; - std::string placeholder; // Only value if boundField takes an arg - - bool takesArg() const { - return !placeholder.empty(); - } - void validate() const { - if( !boundField.isSet() ) - throw std::logic_error( "option not bound" ); - } - }; - struct OptionArgProperties { - std::vector shortNames; - std::string longName; - - bool hasShortName( std::string const& shortName ) const { - return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end(); - } - bool hasLongName( std::string const& _longName ) const { - return _longName == longName; - } - }; - struct PositionalArgProperties { - PositionalArgProperties() : position( -1 ) {} - int position; // -1 means non-positional (floating) - - bool isFixedPositional() const { - return position != -1; - } - }; - - template - class CommandLine { - - struct Arg : CommonArgProperties, OptionArgProperties, PositionalArgProperties { - Arg() {} - Arg( Detail::BoundArgFunction const& _boundField ) : CommonArgProperties( _boundField ) {} - - using CommonArgProperties::placeholder; // !TBD - - std::string dbgName() const { - if( !longName.empty() ) - return "--" + longName; - if( !shortNames.empty() ) - return "-" + shortNames[0]; - return "positional args"; - } - std::string commands() const { - std::ostringstream oss; - bool first = true; - std::vector::const_iterator it = shortNames.begin(), itEnd = shortNames.end(); - for(; it != itEnd; ++it ) { - if( first ) - first = false; - else - oss << ", "; - oss << "-" << *it; - } - if( !longName.empty() ) { - if( !first ) - oss << ", "; - oss << "--" << longName; - } - if( !placeholder.empty() ) - oss << " <" << placeholder << ">"; - return oss.str(); - } - }; - - // NOTE: std::auto_ptr is deprecated in c++11/c++0x -#if defined(__cplusplus) && __cplusplus > 199711L - typedef std::unique_ptr ArgAutoPtr; -#else - typedef std::auto_ptr ArgAutoPtr; -#endif - - friend void addOptName( Arg& arg, std::string const& optName ) - { - if( optName.empty() ) - return; - if( Detail::startsWith( optName, "--" ) ) { - if( !arg.longName.empty() ) - throw std::logic_error( "Only one long opt may be specified. '" - + arg.longName - + "' already specified, now attempting to add '" - + optName + "'" ); - arg.longName = optName.substr( 2 ); - } - else if( Detail::startsWith( optName, "-" ) ) - arg.shortNames.push_back( optName.substr( 1 ) ); - else - throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" ); - } - friend void setPositionalArg( Arg& arg, int position ) - { - arg.position = position; - } - - class ArgBuilder { - public: - ArgBuilder( Arg* arg ) : m_arg( arg ) {} - - // Bind a non-boolean data member (requires placeholder string) - template - void bind( M C::* field, std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - m_arg->placeholder = placeholder; - } - // Bind a boolean data member (no placeholder required) - template - void bind( bool C::* field ) { - m_arg->boundField = new Detail::BoundDataMember( field ); - } - - // Bind a method taking a single, non-boolean argument (requires a placeholder string) - template - void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - m_arg->placeholder = placeholder; - } - - // Bind a method taking a single, boolean argument (no placeholder string required) - template - void bind( void (C::* unaryMethod)( bool ) ) { - m_arg->boundField = new Detail::BoundUnaryMethod( unaryMethod ); - } - - // Bind a method that takes no arguments (will be called if opt is present) - template - void bind( void (C::* nullaryMethod)() ) { - m_arg->boundField = new Detail::BoundNullaryMethod( nullaryMethod ); - } - - // Bind a free function taking a single argument - the object to operate on (no placeholder string required) - template - void bind( void (* unaryFunction)( C& ) ) { - m_arg->boundField = new Detail::BoundUnaryFunction( unaryFunction ); - } - - // Bind a free function taking a single argument - the object to operate on (requires a placeholder string) - template - void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) { - m_arg->boundField = new Detail::BoundBinaryFunction( binaryFunction ); - m_arg->placeholder = placeholder; - } - - ArgBuilder& describe( std::string const& description ) { - m_arg->description = description; - return *this; - } - ArgBuilder& detail( std::string const& detail ) { - m_arg->detail = detail; - return *this; - } - - protected: - Arg* m_arg; - }; - - class OptBuilder : public ArgBuilder { - public: - OptBuilder( Arg* arg ) : ArgBuilder( arg ) {} - OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {} - - OptBuilder& operator[]( std::string const& optName ) { - addOptName( *ArgBuilder::m_arg, optName ); - return *this; - } - }; - - public: - - CommandLine() - : m_boundProcessName( new Detail::NullBinder() ), - m_highestSpecifiedArgPosition( 0 ), - m_throwOnUnrecognisedTokens( false ) - {} - CommandLine( CommandLine const& other ) - : m_boundProcessName( other.m_boundProcessName ), - m_options ( other.m_options ), - m_positionalArgs( other.m_positionalArgs ), - m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ), - m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens ) - { - if( other.m_floatingArg.get() ) - m_floatingArg = ArgAutoPtr( new Arg( *other.m_floatingArg ) ); - } - - CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) { - m_throwOnUnrecognisedTokens = shouldThrow; - return *this; - } - - OptBuilder operator[]( std::string const& optName ) { - m_options.push_back( Arg() ); - addOptName( m_options.back(), optName ); - OptBuilder builder( &m_options.back() ); - return builder; - } - - ArgBuilder operator[]( int position ) { - m_positionalArgs.insert( std::make_pair( position, Arg() ) ); - if( position > m_highestSpecifiedArgPosition ) - m_highestSpecifiedArgPosition = position; - setPositionalArg( m_positionalArgs[position], position ); - ArgBuilder builder( &m_positionalArgs[position] ); - return builder; - } - - // Invoke this with the _ instance - ArgBuilder operator[]( UnpositionalTag ) { - if( m_floatingArg.get() ) - throw std::logic_error( "Only one unpositional argument can be added" ); - m_floatingArg = ArgAutoPtr( new Arg() ); - ArgBuilder builder( m_floatingArg.get() ); - return builder; - } - - template - void bindProcessName( M C::* field ) { - m_boundProcessName = new Detail::BoundDataMember( field ); - } - template - void bindProcessName( void (C::*_unaryMethod)( M ) ) { - m_boundProcessName = new Detail::BoundUnaryMethod( _unaryMethod ); - } - - void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const { - typename std::vector::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it; - std::size_t maxWidth = 0; - for( it = itBegin; it != itEnd; ++it ) - maxWidth = (std::max)( maxWidth, it->commands().size() ); - - for( it = itBegin; it != itEnd; ++it ) { - Detail::Text usage( it->commands(), Detail::TextAttributes() - .setWidth( maxWidth+indent ) - .setIndent( indent ) ); - Detail::Text desc( it->description, Detail::TextAttributes() - .setWidth( width - maxWidth - 3 ) ); - - for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) { - std::string usageCol = i < usage.size() ? usage[i] : ""; - os << usageCol; - - if( i < desc.size() && !desc[i].empty() ) - os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' ) - << desc[i]; - os << "\n"; - } - } - } - std::string optUsage() const { - std::ostringstream oss; - optUsage( oss ); - return oss.str(); - } - - void argSynopsis( std::ostream& os ) const { - for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) { - if( i > 1 ) - os << " "; - typename std::map::const_iterator it = m_positionalArgs.find( i ); - if( it != m_positionalArgs.end() ) - os << "<" << it->second.placeholder << ">"; - else if( m_floatingArg.get() ) - os << "<" << m_floatingArg->placeholder << ">"; - else - throw std::logic_error( "non consecutive positional arguments with no floating args" ); - } - // !TBD No indication of mandatory args - if( m_floatingArg.get() ) { - if( m_highestSpecifiedArgPosition > 1 ) - os << " "; - os << "[<" << m_floatingArg->placeholder << "> ...]"; - } - } - std::string argSynopsis() const { - std::ostringstream oss; - argSynopsis( oss ); - return oss.str(); - } - - void usage( std::ostream& os, std::string const& procName ) const { - validate(); - os << "usage:\n " << procName << " "; - argSynopsis( os ); - if( !m_options.empty() ) { - os << " [options]\n\nwhere options are: \n"; - optUsage( os, 2 ); - } - os << "\n"; - } - std::string usage( std::string const& procName ) const { - std::ostringstream oss; - usage( oss, procName ); - return oss.str(); - } - - ConfigT parse( int argc, char const * const * argv ) const { - ConfigT config; - parseInto( argc, argv, config ); - return config; - } - - std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { - std::string processName = argv[0]; - std::size_t lastSlash = processName.find_last_of( "/\\" ); - if( lastSlash != std::string::npos ) - processName = processName.substr( lastSlash+1 ); - m_boundProcessName.set( config, processName ); - std::vector tokens; - Parser parser; - parser.parseIntoTokens( argc, argv, tokens ); - return populate( tokens, config ); - } - - std::vector populate( std::vector const& tokens, ConfigT& config ) const { - validate(); - std::vector unusedTokens = populateOptions( tokens, config ); - unusedTokens = populateFixedArgs( unusedTokens, config ); - unusedTokens = populateFloatingArgs( unusedTokens, config ); - return unusedTokens; - } - - std::vector populateOptions( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - std::vector errors; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::vector::const_iterator it = m_options.begin(), itEnd = m_options.end(); - for(; it != itEnd; ++it ) { - Arg const& arg = *it; - - try { - if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) || - ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) { - if( arg.takesArg() ) { - if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional ) - errors.push_back( "Expected argument to option: " + token.data ); - else - arg.boundField.set( config, tokens[++i].data ); - } - else { - arg.boundField.setFlag( config ); - } - break; - } - } - catch( std::exception& ex ) { - errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" ); - } - } - if( it == itEnd ) { - if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens ) - unusedTokens.push_back( token ); - else if( m_throwOnUnrecognisedTokens ) - errors.push_back( "unrecognised option: " + token.data ); - } - } - if( !errors.empty() ) { - std::ostringstream oss; - for( std::vector::const_iterator it = errors.begin(), itEnd = errors.end(); - it != itEnd; - ++it ) { - if( it != errors.begin() ) - oss << "\n"; - oss << *it; - } - throw std::runtime_error( oss.str() ); - } - return unusedTokens; - } - std::vector populateFixedArgs( std::vector const& tokens, ConfigT& config ) const { - std::vector unusedTokens; - int position = 1; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - typename std::map::const_iterator it = m_positionalArgs.find( position ); - if( it != m_positionalArgs.end() ) - it->second.boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - if( token.type == Parser::Token::Positional ) - position++; - } - return unusedTokens; - } - std::vector populateFloatingArgs( std::vector const& tokens, ConfigT& config ) const { - if( !m_floatingArg.get() ) - return tokens; - std::vector unusedTokens; - for( std::size_t i = 0; i < tokens.size(); ++i ) { - Parser::Token const& token = tokens[i]; - if( token.type == Parser::Token::Positional ) - m_floatingArg->boundField.set( config, token.data ); - else - unusedTokens.push_back( token ); - } - return unusedTokens; - } - - void validate() const - { - if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() ) - throw std::logic_error( "No options or arguments specified" ); - - for( typename std::vector::const_iterator it = m_options.begin(), - itEnd = m_options.end(); - it != itEnd; ++it ) - it->validate(); - } - - private: - Detail::BoundArgFunction m_boundProcessName; - std::vector m_options; - std::map m_positionalArgs; - ArgAutoPtr m_floatingArg; - int m_highestSpecifiedArgPosition; - bool m_throwOnUnrecognisedTokens; - }; - -} // end namespace Clara - -STITCH_CLARA_CLOSE_NAMESPACE -#undef STITCH_CLARA_OPEN_NAMESPACE -#undef STITCH_CLARA_CLOSE_NAMESPACE - -#endif // TWOBLUECUBES_CLARA_H_INCLUDED -#undef STITCH_CLARA_OPEN_NAMESPACE - -// Restore Clara's value for console width, if present -#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH -#endif - -#include - -namespace Catch { - - inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; } - inline void abortAfterX( ConfigData& config, int x ) { - if( x < 1 ) - throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" ); - config.abortAfter = x; - } - inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); } - - inline void addWarning( ConfigData& config, std::string const& _warning ) { - if( _warning == "NoAssertions" ) - config.warnings = static_cast( config.warnings | WarnAbout::NoAssertions ); - else - throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); - - } - inline void setVerbosity( ConfigData& config, int level ) { - // !TBD: accept strings? - config.verbosity = static_cast( level ); - } - inline void setShowDurations( ConfigData& config, bool _showDurations ) { - config.showDurations = _showDurations - ? ShowDurations::Always - : ShowDurations::Never; - } - inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) { - std::ifstream f( _filename.c_str() ); - if( !f.is_open() ) - throw std::domain_error( "Unable to load input file: " + _filename ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, "#" ) ) - addTestOrTags( config, "\"" + line + "\"," ); - } - } - - inline Clara::CommandLine makeCommandLineParser() { - - using namespace Clara; - CommandLine cli; - - cli.bindProcessName( &ConfigData::processName ); - - cli["-?"]["-h"]["--help"] - .describe( "display usage information" ) - .bind( &ConfigData::showHelp ); - - cli["-l"]["--list-tests"] - .describe( "list all/matching test cases" ) - .bind( &ConfigData::listTests ); - - cli["-t"]["--list-tags"] - .describe( "list all/matching tags" ) - .bind( &ConfigData::listTags ); - - cli["-s"]["--success"] - .describe( "include successful tests in output" ) - .bind( &ConfigData::showSuccessfulTests ); - - cli["-b"]["--break"] - .describe( "break into debugger on failure" ) - .bind( &ConfigData::shouldDebugBreak ); - - cli["-e"]["--nothrow"] - .describe( "skip exception tests" ) - .bind( &ConfigData::noThrow ); - - cli["-i"]["--invisibles"] - .describe( "show invisibles (tabs, newlines)" ) - .bind( &ConfigData::showInvisibles ); - - cli["-o"]["--out"] - .describe( "output filename" ) - .bind( &ConfigData::outputFilename, "filename" ); - - cli["-r"]["--reporter"] -// .placeholder( "name[:filename]" ) - .describe( "reporter to use (defaults to console)" ) - .bind( &ConfigData::reporterName, "name" ); - - cli["-n"]["--name"] - .describe( "suite name" ) - .bind( &ConfigData::name, "name" ); - - cli["-a"]["--abort"] - .describe( "abort at first failure" ) - .bind( &abortAfterFirst ); - - cli["-x"]["--abortx"] - .describe( "abort after x failures" ) - .bind( &abortAfterX, "no. failures" ); - - cli["-w"]["--warn"] - .describe( "enable warnings" ) - .bind( &addWarning, "warning name" ); - -// - needs updating if reinstated -// cli.into( &setVerbosity ) -// .describe( "level of verbosity (0=no output)" ) -// .shortOpt( "v") -// .longOpt( "verbosity" ) -// .placeholder( "level" ); - - cli[_] - .describe( "which test or tests to use" ) - .bind( &addTestOrTags, "test name, pattern or tags" ); - - cli["-d"]["--durations"] - .describe( "show test durations" ) - .bind( &setShowDurations, "yes/no" ); - - cli["-f"]["--input-file"] - .describe( "load test names to run from a file" ) - .bind( &loadTestNamesFromFile, "filename" ); - - // Less common commands which don't have a short form - cli["--list-test-names-only"] - .describe( "list all/matching test cases names only" ) - .bind( &ConfigData::listTestNamesOnly ); - - cli["--list-reporters"] - .describe( "list all reporters" ) - .bind( &ConfigData::listReporters ); - - return cli; - } - -} // end namespace Catch - -// #included from: internal/catch_list.hpp -#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED - -// #included from: catch_text.h -#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED - -#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch -// #included from: ../external/tbc_text_format.h -// Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#include -#include -#include - -// Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { -#endif - -namespace Tbc { - -#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH - const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; -#else - const unsigned int consoleWidth = 80; -#endif - - struct TextAttributes { - TextAttributes() - : initialIndent( std::string::npos ), - indent( 0 ), - width( consoleWidth-1 ), - tabChar( '\t' ) - {} - - TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } - TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } - TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } - TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } - - std::size_t initialIndent; // indent of first line, or npos - std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos - std::size_t width; // maximum width of text, including indent. Longer text will wrap - char tabChar; // If this char is seen the indent is changed to current pos - }; - - class Text { - public: - Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) - : attr( _attr ) - { - std::string wrappableChars = " [({.,/|\\-"; - std::size_t indent = _attr.initialIndent != std::string::npos - ? _attr.initialIndent - : _attr.indent; - std::string remainder = _str; - - while( !remainder.empty() ) { - if( lines.size() >= 1000 ) { - lines.push_back( "... message truncated due to excessive size" ); - return; - } - std::size_t tabPos = std::string::npos; - std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); - std::size_t pos = remainder.find_first_of( '\n' ); - if( pos <= width ) { - width = pos; - } - pos = remainder.find_last_of( _attr.tabChar, width ); - if( pos != std::string::npos ) { - tabPos = pos; - if( remainder[width] == '\n' ) - width--; - remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); - } - - if( width == remainder.size() ) { - spliceLine( indent, remainder, width ); - } - else if( remainder[width] == '\n' ) { - spliceLine( indent, remainder, width ); - if( width <= 1 || remainder.size() != 1 ) - remainder = remainder.substr( 1 ); - indent = _attr.indent; - } - else { - pos = remainder.find_last_of( wrappableChars, width ); - if( pos != std::string::npos && pos > 0 ) { - spliceLine( indent, remainder, pos ); - if( remainder[0] == ' ' ) - remainder = remainder.substr( 1 ); - } - else { - spliceLine( indent, remainder, width-1 ); - lines.back() += "-"; - } - if( lines.size() == 1 ) - indent = _attr.indent; - if( tabPos != std::string::npos ) - indent += tabPos; - } - } - } - - void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { - lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); - _remainder = _remainder.substr( _pos ); - } - - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const { return lines.begin(); } - const_iterator end() const { return lines.end(); } - std::string const& last() const { return lines.back(); } - std::size_t size() const { return lines.size(); } - std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } - std::string toString() const { - std::ostringstream oss; - oss << *this; - return oss.str(); - } - - inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { - for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); - it != itEnd; ++it ) { - if( it != _text.begin() ) - _stream << "\n"; - _stream << *it; - } - return _stream; - } - - private: - std::string str; - TextAttributes attr; - std::vector lines; - }; - -} // end namespace Tbc - -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -} // end outer namespace -#endif - -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE - -namespace Catch { - using Tbc::Text; - using Tbc::TextAttributes; -} - -// #included from: catch_console_colour.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED - -namespace Catch { - - namespace Detail { - struct IColourImpl; - } - - struct Colour { - enum Code { - None = 0, - - White, - Red, - Green, - Blue, - Cyan, - Yellow, - Grey, - - Bright = 0x10, - - BrightRed = Bright | Red, - BrightGreen = Bright | Green, - LightGrey = Bright | Grey, - BrightWhite = Bright | White, - - // By intention - FileName = LightGrey, - Warning = Yellow, - ResultError = BrightRed, - ResultSuccess = BrightGreen, - ResultExpectedFailure = Warning, - - Error = BrightRed, - Success = Green, - - OriginalExpression = Cyan, - ReconstructedExpression = Yellow, - - SecondaryText = LightGrey, - Headers = White - }; - - // Use constructed object for RAII guard - Colour( Code _colourCode ); - Colour( Colour const& other ); - ~Colour(); - - // Use static method for one-shot changes - static void use( Code _colourCode ); - - private: - static Detail::IColourImpl* impl(); - bool m_moved; - }; - - inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } - -} // end namespace Catch - -// #included from: catch_interfaces_reporter.h -#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED - -#include -#include -#include -#include - -namespace Catch -{ - struct ReporterConfig { - explicit ReporterConfig( Ptr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} - - ReporterConfig( Ptr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} - - std::ostream& stream() const { return *m_stream; } - Ptr fullConfig() const { return m_fullConfig; } - - private: - std::ostream* m_stream; - Ptr m_fullConfig; - }; - - struct ReporterPreferences { - ReporterPreferences() - : shouldRedirectStdOut( false ) - {} - - bool shouldRedirectStdOut; - }; - - template - struct LazyStat : Option { - LazyStat() : used( false ) {} - LazyStat& operator=( T const& _value ) { - Option::operator=( _value ); - used = false; - return *this; - } - void reset() { - Option::reset(); - used = false; - } - bool used; - }; - - struct TestRunInfo { - TestRunInfo( std::string const& _name ) : name( _name ) {} - std::string name; - }; - struct GroupInfo { - GroupInfo( std::string const& _name, - std::size_t _groupIndex, - std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) - {} - - std::string name; - std::size_t groupIndex; - std::size_t groupsCounts; - }; - - struct AssertionStats { - AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) - { - if( assertionResult.hasMessage() ) { - // Copy message into messages list. - // !TBD This should have been done earlier, somewhere - MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); - builder << assertionResult.getMessage(); - builder.m_info.message = builder.m_stream.str(); - - infoMessages.push_back( builder.m_info ); - } - } - virtual ~AssertionStats(); - -# ifdef CATCH_CPP11_OR_GREATER - AssertionStats( AssertionStats const& ) = default; - AssertionStats( AssertionStats && ) = default; - AssertionStats& operator = ( AssertionStats const& ) = default; - AssertionStats& operator = ( AssertionStats && ) = default; -# endif - - AssertionResult assertionResult; - std::vector infoMessages; - Totals totals; - }; - - struct SectionStats { - SectionStats( SectionInfo const& _sectionInfo, - Counts const& _assertions, - double _durationInSeconds, - bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) - {} - virtual ~SectionStats(); -# ifdef CATCH_CPP11_OR_GREATER - SectionStats( SectionStats const& ) = default; - SectionStats( SectionStats && ) = default; - SectionStats& operator = ( SectionStats const& ) = default; - SectionStats& operator = ( SectionStats && ) = default; -# endif - - SectionInfo sectionInfo; - Counts assertions; - double durationInSeconds; - bool missingAssertions; - }; - - struct TestCaseStats { - TestCaseStats( TestCaseInfo const& _testInfo, - Totals const& _totals, - std::string const& _stdOut, - std::string const& _stdErr, - bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) - {} - virtual ~TestCaseStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestCaseStats( TestCaseStats const& ) = default; - TestCaseStats( TestCaseStats && ) = default; - TestCaseStats& operator = ( TestCaseStats const& ) = default; - TestCaseStats& operator = ( TestCaseStats && ) = default; -# endif - - TestCaseInfo testInfo; - Totals totals; - std::string stdOut; - std::string stdErr; - bool aborting; - }; - - struct TestGroupStats { - TestGroupStats( GroupInfo const& _groupInfo, - Totals const& _totals, - bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) - {} - TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) - {} - virtual ~TestGroupStats(); - -# ifdef CATCH_CPP11_OR_GREATER - TestGroupStats( TestGroupStats const& ) = default; - TestGroupStats( TestGroupStats && ) = default; - TestGroupStats& operator = ( TestGroupStats const& ) = default; - TestGroupStats& operator = ( TestGroupStats && ) = default; -# endif - - GroupInfo groupInfo; - Totals totals; - bool aborting; - }; - - struct TestRunStats { - TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) - {} - virtual ~TestRunStats(); - -# ifndef CATCH_CPP11_OR_GREATER - TestRunStats( TestRunStats const& _other ) - : runInfo( _other.runInfo ), - totals( _other.totals ), - aborting( _other.aborting ) - {} -# else - TestRunStats( TestRunStats const& ) = default; - TestRunStats( TestRunStats && ) = default; - TestRunStats& operator = ( TestRunStats const& ) = default; - TestRunStats& operator = ( TestRunStats && ) = default; -# endif - - TestRunInfo runInfo; - Totals totals; - bool aborting; - }; - - struct IStreamingReporter : IShared { - virtual ~IStreamingReporter(); - - // Implementing class must also provide the following static method: - // static std::string getDescription(); - - virtual ReporterPreferences getPreferences() const = 0; - - virtual void noMatchingTestCases( std::string const& spec ) = 0; - - virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; - virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - - virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; - virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - - virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; - - virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; - virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; - }; - - struct IReporterFactory { - virtual ~IReporterFactory(); - virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; - virtual std::string getDescription() const = 0; - }; - - struct IReporterRegistry { - typedef std::map FactoryMap; - - virtual ~IReporterRegistry(); - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const = 0; - virtual FactoryMap const& getFactories() const = 0; - }; - -} - -#include -#include - -namespace Catch { - - inline std::size_t listTests( Config const& config ) { - - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Matching test cases:\n"; - else { - std::cout << "All available test cases:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::size_t matchedTests = 0; - TextAttributes nameAttr, tagsAttr; - nameAttr.setInitialIndent( 2 ).setIndent( 4 ); - tagsAttr.setIndent( 6 ); - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; - Colour colourGuard( colour ); - - std::cout << Text( testCaseInfo.name, nameAttr ) << std::endl; - if( !testCaseInfo.tags.empty() ) - std::cout << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl; - } - - if( !config.testSpec().hasFilters() ) - std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl; - else - std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl; - return matchedTests; - } - - inline std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( !config.testSpec().hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - std::size_t matchedTests = 0; - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - matchedTests++; - TestCaseInfo const& testCaseInfo = it->getTestCaseInfo(); - std::cout << testCaseInfo.name << std::endl; - } - return matchedTests; - } - - struct TagInfo { - TagInfo() : count ( 0 ) {} - void add( std::string const& spelling ) { - ++count; - spellings.insert( spelling ); - } - std::string all() const { - std::string out; - for( std::set::const_iterator it = spellings.begin(), itEnd = spellings.end(); - it != itEnd; - ++it ) - out += "[" + *it + "]"; - return out; - } - std::set spellings; - std::size_t count; - }; - - inline std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); - if( config.testSpec().hasFilters() ) - std::cout << "Tags for matching test cases:\n"; - else { - std::cout << "All available tags:\n"; - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec(); - } - - std::map tagCounts; - - std::vector matchedTestCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases ); - for( std::vector::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end(); - it != itEnd; - ++it ) { - for( std::set::const_iterator tagIt = it->getTestCaseInfo().tags.begin(), - tagItEnd = it->getTestCaseInfo().tags.end(); - tagIt != tagItEnd; - ++tagIt ) { - std::string tagName = *tagIt; - std::string lcaseTagName = toLower( tagName ); - std::map::iterator countIt = tagCounts.find( lcaseTagName ); - if( countIt == tagCounts.end() ) - countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; - countIt->second.add( tagName ); - } - } - - for( std::map::const_iterator countIt = tagCounts.begin(), - countItEnd = tagCounts.end(); - countIt != countItEnd; - ++countIt ) { - std::ostringstream oss; - oss << " " << std::setw(2) << countIt->second.count << " "; - Text wrapper( countIt->second.all(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( oss.str().size() ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) ); - std::cout << oss.str() << wrapper << "\n"; - } - std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl; - return tagCounts.size(); - } - - inline std::size_t listReporters( Config const& /*config*/ ) { - std::cout << "Available reports:\n"; - IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); - IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it; - std::size_t maxNameLen = 0; - for(it = itBegin; it != itEnd; ++it ) - maxNameLen = (std::max)( maxNameLen, it->first.size() ); - - for(it = itBegin; it != itEnd; ++it ) { - Text wrapper( it->second->getDescription(), TextAttributes() - .setInitialIndent( 0 ) - .setIndent( 7+maxNameLen ) - .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) ); - std::cout << " " - << it->first - << ":" - << std::string( maxNameLen - it->first.size() + 2, ' ' ) - << wrapper << "\n"; - } - std::cout << std::endl; - return factories.size(); - } - - inline Option list( Config const& config ) { - Option listedCount; - if( config.listTests() ) - listedCount = listedCount.valueOr(0) + listTests( config ); - if( config.listTestNamesOnly() ) - listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); - if( config.listTags() ) - listedCount = listedCount.valueOr(0) + listTags( config ); - if( config.listReporters() ) - listedCount = listedCount.valueOr(0) + listReporters( config ); - return listedCount; - } - -} // end namespace Catch - -// #included from: internal/catch_runner_impl.hpp -#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED - -// #included from: catch_test_case_tracker.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { -namespace SectionTracking { - - class TrackedSection { - - typedef std::map TrackedSections; - - public: - enum RunState { - NotStarted, - Executing, - ExecutingChildren, - Completed - }; - - TrackedSection( std::string const& name, TrackedSection* parent ) - : m_name( name ), m_runState( NotStarted ), m_parent( parent ) - {} - - RunState runState() const { return m_runState; } - - TrackedSection* findChild( std::string const& childName ) { - TrackedSections::iterator it = m_children.find( childName ); - return it != m_children.end() - ? &it->second - : NULL; - } - TrackedSection* acquireChild( std::string const& childName ) { - if( TrackedSection* child = findChild( childName ) ) - return child; - m_children.insert( std::make_pair( childName, TrackedSection( childName, this ) ) ); - return findChild( childName ); - } - void enter() { - if( m_runState == NotStarted ) - m_runState = Executing; - } - void leave() { - for( TrackedSections::const_iterator it = m_children.begin(), itEnd = m_children.end(); - it != itEnd; - ++it ) - if( it->second.runState() != Completed ) { - m_runState = ExecutingChildren; - return; - } - m_runState = Completed; - } - TrackedSection* getParent() { - return m_parent; - } - bool hasChildren() const { - return !m_children.empty(); - } - - private: - std::string m_name; - RunState m_runState; - TrackedSections m_children; - TrackedSection* m_parent; - - }; - - class TestCaseTracker { - public: - TestCaseTracker( std::string const& testCaseName ) - : m_testCase( testCaseName, NULL ), - m_currentSection( &m_testCase ), - m_completedASectionThisRun( false ) - {} - - bool enterSection( std::string const& name ) { - TrackedSection* child = m_currentSection->acquireChild( name ); - if( m_completedASectionThisRun || child->runState() == TrackedSection::Completed ) - return false; - - m_currentSection = child; - m_currentSection->enter(); - return true; - } - void leaveSection() { - m_currentSection->leave(); - m_currentSection = m_currentSection->getParent(); - assert( m_currentSection != NULL ); - m_completedASectionThisRun = true; - } - - bool currentSectionHasChildren() const { - return m_currentSection->hasChildren(); - } - bool isCompleted() const { - return m_testCase.runState() == TrackedSection::Completed; - } - - class Guard { - public: - Guard( TestCaseTracker& tracker ) : m_tracker( tracker ) { - m_tracker.enterTestCase(); - } - ~Guard() { - m_tracker.leaveTestCase(); - } - private: - Guard( Guard const& ); - void operator = ( Guard const& ); - TestCaseTracker& m_tracker; - }; - - private: - void enterTestCase() { - m_currentSection = &m_testCase; - m_completedASectionThisRun = false; - m_testCase.enter(); - } - void leaveTestCase() { - m_testCase.leave(); - } - - TrackedSection m_testCase; - TrackedSection* m_currentSection; - bool m_completedASectionThisRun; - }; - -} // namespace SectionTracking - -using SectionTracking::TestCaseTracker; - -} // namespace Catch - -#include -#include - -namespace Catch { - - class StreamRedirect { - - public: - StreamRedirect( std::ostream& stream, std::string& targetString ) - : m_stream( stream ), - m_prevBuf( stream.rdbuf() ), - m_targetString( targetString ) - { - stream.rdbuf( m_oss.rdbuf() ); - } - - ~StreamRedirect() { - m_targetString += m_oss.str(); - m_stream.rdbuf( m_prevBuf ); - } - - private: - std::ostream& m_stream; - std::streambuf* m_prevBuf; - std::ostringstream m_oss; - std::string& m_targetString; - }; - - /////////////////////////////////////////////////////////////////////////// - - class RunContext : public IResultCapture, public IRunner { - - RunContext( RunContext const& ); - void operator =( RunContext const& ); - - public: - - explicit RunContext( Ptr const& config, Ptr const& reporter ) - : m_runInfo( config->name() ), - m_context( getCurrentMutableContext() ), - m_activeTestCase( NULL ), - m_config( config ), - m_reporter( reporter ), - m_prevRunner( m_context.getRunner() ), - m_prevResultCapture( m_context.getResultCapture() ), - m_prevConfig( m_context.getConfig() ) - { - m_context.setRunner( this ); - m_context.setConfig( m_config ); - m_context.setResultCapture( this ); - m_reporter->testRunStarting( m_runInfo ); - } - - virtual ~RunContext() { - m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) ); - m_context.setRunner( m_prevRunner ); - m_context.setConfig( NULL ); - m_context.setResultCapture( m_prevResultCapture ); - m_context.setConfig( m_prevConfig ); - } - - void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) ); - } - void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) { - m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) ); - } - - Totals runTest( TestCase const& testCase ) { - Totals prevTotals = m_totals; - - std::string redirectedCout; - std::string redirectedCerr; - - TestCaseInfo testInfo = testCase.getTestCaseInfo(); - - m_reporter->testCaseStarting( testInfo ); - - m_activeTestCase = &testCase; - m_testCaseTracker = TestCaseTracker( testInfo.name ); - - do { - do { - runCurrentTest( redirectedCout, redirectedCerr ); - } - while( !m_testCaseTracker->isCompleted() && !aborting() ); - } - while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() ); - - Totals deltaTotals = m_totals.delta( prevTotals ); - m_totals.testCases += deltaTotals.testCases; - m_reporter->testCaseEnded( TestCaseStats( testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting() ) ); - - m_activeTestCase = NULL; - m_testCaseTracker.reset(); - - return deltaTotals; - } - - Ptr config() const { - return m_config; - } - - private: // IResultCapture - - virtual void assertionEnded( AssertionResult const& result ) { - if( result.getResultType() == ResultWas::Ok ) { - m_totals.assertions.passed++; - } - else if( !result.isOk() ) { - m_totals.assertions.failed++; - } - - if( m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ) ) - m_messages.clear(); - - // Reset working state - m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); - m_lastResult = result; - } - - virtual bool sectionStarted ( - SectionInfo const& sectionInfo, - Counts& assertions - ) - { - std::ostringstream oss; - oss << sectionInfo.name << "@" << sectionInfo.lineInfo; - - if( !m_testCaseTracker->enterSection( oss.str() ) ) - return false; - - m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; - - m_reporter->sectionStarting( sectionInfo ); - - assertions = m_totals.assertions; - - return true; - } - bool testForMissingAssertions( Counts& assertions ) { - if( assertions.total() != 0 || - !m_config->warnAboutMissingAssertions() || - m_testCaseTracker->currentSectionHasChildren() ) - return false; - m_totals.assertions.failed++; - assertions.failed++; - return true; - } - - virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) { - if( std::uncaught_exception() ) { - m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) ); - return; - } - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - m_testCaseTracker->leaveSection(); - - m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) ); - m_messages.clear(); - } - - virtual void pushScopedMessage( MessageInfo const& message ) { - m_messages.push_back( message ); - } - - virtual void popScopedMessage( MessageInfo const& message ) { - m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() ); - } - - virtual std::string getCurrentTestName() const { - return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : ""; - } - - virtual const AssertionResult* getLastResult() const { - return &m_lastResult; - } - - public: - // !TBD We need to do this another way! - bool aborting() const { - return m_totals.assertions.failed == static_cast( m_config->abortAfter() ); - } - - private: - - void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) { - TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); - SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description ); - m_reporter->sectionStarting( testCaseSection ); - Counts prevAssertions = m_totals.assertions; - double duration = 0; - try { - m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); - TestCaseTracker::Guard guard( *m_testCaseTracker ); - - Timer timer; - timer.start(); - if( m_reporter->getPreferences().shouldRedirectStdOut ) { - StreamRedirect coutRedir( std::cout, redirectedCout ); - StreamRedirect cerrRedir( std::cerr, redirectedCerr ); - m_activeTestCase->invoke(); - } - else { - m_activeTestCase->invoke(); - } - duration = timer.getElapsedSeconds(); - } - catch( TestFailureException& ) { - // This just means the test was aborted due to failure - } - catch(...) { - ResultBuilder exResult( m_lastAssertionInfo.macroName.c_str(), - m_lastAssertionInfo.lineInfo, - m_lastAssertionInfo.capturedExpression.c_str(), - m_lastAssertionInfo.resultDisposition ); - exResult.useActiveException(); - } - // If sections ended prematurely due to an exception we stored their - // infos here so we can tear them down outside the unwind process. - for( std::vector::const_reverse_iterator it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); - it != itEnd; - ++it ) - sectionEnded( it->info, it->prevAssertions, it->durationInSeconds ); - m_unfinishedSections.clear(); - m_messages.clear(); - - Counts assertions = m_totals.assertions - prevAssertions; - bool missingAssertions = testForMissingAssertions( assertions ); - - if( testCaseInfo.okToFail() ) { - std::swap( assertions.failedButOk, assertions.failed ); - m_totals.assertions.failed -= assertions.failedButOk; - m_totals.assertions.failedButOk += assertions.failedButOk; - } - - SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions ); - m_reporter->sectionEnded( testCaseSectionStats ); - } - - private: - struct UnfinishedSections { - UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds ) - : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) - {} - - SectionInfo info; - Counts prevAssertions; - double durationInSeconds; - }; - - TestRunInfo m_runInfo; - IMutableContext& m_context; - TestCase const* m_activeTestCase; - Option m_testCaseTracker; - AssertionResult m_lastResult; - - Ptr m_config; - Totals m_totals; - Ptr m_reporter; - std::vector m_messages; - IRunner* m_prevRunner; - IResultCapture* m_prevResultCapture; - Ptr m_prevConfig; - AssertionInfo m_lastAssertionInfo; - std::vector m_unfinishedSections; - }; - - IResultCapture& getResultCapture() { - if( IResultCapture* capture = getCurrentContext().getResultCapture() ) - return *capture; - else - throw std::logic_error( "No result capture instance" ); - } - -} // end namespace Catch - -// #included from: internal/catch_version.h -#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED - -namespace Catch { - - // Versioning information - struct Version { - Version( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _buildNumber, - char const* const _branchName ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - buildNumber( _buildNumber ), - branchName( _branchName ) - {} - - unsigned int const majorVersion; - unsigned int const minorVersion; - unsigned int const buildNumber; - char const* const branchName; - - private: - void operator=( Version const& ); - }; - - extern Version libraryVersion; -} - -#include -#include -#include - -namespace Catch { - - class Runner { - - public: - Runner( Ptr const& config ) - : m_config( config ) - { - openStream(); - makeReporter(); - } - - Totals runTests() { - - RunContext context( m_config.get(), m_reporter ); - - Totals totals; - - context.testGroupStarting( "", 1, 1 ); // deprecated? - - TestSpec testSpec = m_config->testSpec(); - if( !testSpec.hasFilters() ) - testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests - - std::vector testCases; - getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, *m_config, testCases ); - - int testsRunForGroup = 0; - for( std::vector::const_iterator it = testCases.begin(), itEnd = testCases.end(); - it != itEnd; - ++it ) { - testsRunForGroup++; - if( m_testsAlreadyRun.find( *it ) == m_testsAlreadyRun.end() ) { - - if( context.aborting() ) - break; - - totals += context.runTest( *it ); - m_testsAlreadyRun.insert( *it ); - } - } - context.testGroupEnded( "", totals, 1, 1 ); - return totals; - } - - private: - void openStream() { - // Open output file, if specified - if( !m_config->getFilename().empty() ) { - m_ofs.open( m_config->getFilename().c_str() ); - if( m_ofs.fail() ) { - std::ostringstream oss; - oss << "Unable to open file: '" << m_config->getFilename() << "'"; - throw std::domain_error( oss.str() ); - } - m_config->setStreamBuf( m_ofs.rdbuf() ); - } - } - void makeReporter() { - std::string reporterName = m_config->getReporterName().empty() - ? "console" - : m_config->getReporterName(); - - m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() ); - if( !m_reporter ) { - std::ostringstream oss; - oss << "No reporter registered with name: '" << reporterName << "'"; - throw std::domain_error( oss.str() ); - } - } - - private: - Ptr m_config; - std::ofstream m_ofs; - Ptr m_reporter; - std::set m_testsAlreadyRun; - }; - - class Session { - static bool alreadyInstantiated; - - public: - - struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; }; - - Session() - : m_cli( makeCommandLineParser() ) { - if( alreadyInstantiated ) { - std::string msg = "Only one instance of Catch::Session can ever be used"; - std::cerr << msg << std::endl; - throw std::logic_error( msg ); - } - alreadyInstantiated = true; - } - ~Session() { - Catch::cleanUp(); - } - - void showHelp( std::string const& processName ) { - std::cout << "\nCatch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " build " - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - std::cout << " (" << libraryVersion.branchName << " branch)"; - std::cout << "\n"; - - m_cli.usage( std::cout, processName ); - std::cout << "For more detail usage please see the project docs\n" << std::endl; - } - - int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) { - try { - m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail ); - m_unusedTokens = m_cli.parseInto( argc, argv, m_configData ); - if( m_configData.showHelp ) - showHelp( m_configData.processName ); - m_config.reset(); - } - catch( std::exception& ex ) { - { - Colour colourGuard( Colour::Red ); - std::cerr << "\nError(s) in input:\n" - << Text( ex.what(), TextAttributes().setIndent(2) ) - << "\n\n"; - } - m_cli.usage( std::cout, m_configData.processName ); - return (std::numeric_limits::max)(); - } - return 0; - } - - void useConfigData( ConfigData const& _configData ) { - m_configData = _configData; - m_config.reset(); - } - - int run( int argc, char* const argv[] ) { - - int returnCode = applyCommandLine( argc, argv ); - if( returnCode == 0 ) - returnCode = run(); - return returnCode; - } - - int run() { - if( m_configData.showHelp ) - return 0; - - try - { - config(); // Force config to be constructed - Runner runner( m_config ); - - // Handle list request - if( Option listed = list( config() ) ) - return static_cast( *listed ); - - return static_cast( runner.runTests().assertions.failed ); - } - catch( std::exception& ex ) { - std::cerr << ex.what() << std::endl; - return (std::numeric_limits::max)(); - } - } - - Clara::CommandLine const& cli() const { - return m_cli; - } - std::vector const& unusedTokens() const { - return m_unusedTokens; - } - ConfigData& configData() { - return m_configData; - } - Config& config() { - if( !m_config ) - m_config = new Config( m_configData ); - return *m_config; - } - - private: - Clara::CommandLine m_cli; - std::vector m_unusedTokens; - ConfigData m_configData; - Ptr m_config; - }; - - bool Session::alreadyInstantiated = false; - -} // end namespace Catch - -// #included from: catch_registry_hub.hpp -#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED - -// #included from: catch_test_case_registry_impl.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class TestRegistry : public ITestCaseRegistry { - public: - TestRegistry() : m_unnamedCount( 0 ) {} - virtual ~TestRegistry(); - - virtual void registerTest( TestCase const& testCase ) { - std::string name = testCase.getTestCaseInfo().name; - if( name == "" ) { - std::ostringstream oss; - oss << "Anonymous test case " << ++m_unnamedCount; - return registerTest( testCase.withName( oss.str() ) ); - } - - if( m_functions.find( testCase ) == m_functions.end() ) { - m_functions.insert( testCase ); - m_functionsInOrder.push_back( testCase ); - if( !testCase.isHidden() ) - m_nonHiddenFunctions.push_back( testCase ); - } - else { - TestCase const& prev = *m_functions.find( testCase ); - { - Colour colourGuard( Colour::Red ); - std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << testCase.getTestCaseInfo().lineInfo << std::endl; - } - exit(1); - } - } - - virtual std::vector const& getAllTests() const { - return m_functionsInOrder; - } - - virtual std::vector const& getAllNonHiddenTests() const { - return m_nonHiddenFunctions; - } - - virtual void getFilteredTests( TestSpec const& testSpec, IConfig const& config, std::vector& matchingTestCases ) const { - for( std::vector::const_iterator it = m_functionsInOrder.begin(), - itEnd = m_functionsInOrder.end(); - it != itEnd; - ++it ) { - if( testSpec.matches( *it ) && ( config.allowThrows() || !it->throws() ) ) - matchingTestCases.push_back( *it ); - } - } - - private: - - std::set m_functions; - std::vector m_functionsInOrder; - std::vector m_nonHiddenFunctions; - size_t m_unnamedCount; - }; - - /////////////////////////////////////////////////////////////////////////// - - class FreeFunctionTestCase : public SharedImpl { - public: - - FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {} - - virtual void invoke() const { - m_fun(); - } - - private: - virtual ~FreeFunctionTestCase(); - - TestFunction m_fun; - }; - - inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; - if( startsWith( className, "&" ) ) - { - std::size_t lastColons = className.rfind( "::" ); - std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); - if( penultimateColons == std::string::npos ) - penultimateColons = 1; - className = className.substr( penultimateColons, lastColons-penultimateColons ); - } - return className; - } - - /////////////////////////////////////////////////////////////////////////// - - AutoReg::AutoReg( TestFunction function, - SourceLineInfo const& lineInfo, - NameAndDesc const& nameAndDesc ) { - registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo ); - } - - AutoReg::~AutoReg() {} - - void AutoReg::registerTestCase( ITestCase* testCase, - char const* classOrQualifiedMethodName, - NameAndDesc const& nameAndDesc, - SourceLineInfo const& lineInfo ) { - - getMutableRegistryHub().registerTest - ( makeTestCase( testCase, - extractClassName( classOrQualifiedMethodName ), - nameAndDesc.name, - nameAndDesc.description, - lineInfo ) ); - } - -} // end namespace Catch - -// #included from: catch_reporter_registry.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED - -#include - -namespace Catch { - - class ReporterRegistry : public IReporterRegistry { - - public: - - virtual ~ReporterRegistry() { - deleteAllValues( m_factories ); - } - - virtual IStreamingReporter* create( std::string const& name, Ptr const& config ) const { - FactoryMap::const_iterator it = m_factories.find( name ); - if( it == m_factories.end() ) - return NULL; - return it->second->create( ReporterConfig( config ) ); - } - - void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_factories.insert( std::make_pair( name, factory ) ); - } - - FactoryMap const& getFactories() const { - return m_factories; - } - - private: - FactoryMap m_factories; - }; -} - -// #included from: catch_exception_translator_registry.hpp -#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED - -#ifdef __OBJC__ -#import "Foundation/Foundation.h" -#endif - -namespace Catch { - - class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { - public: - ~ExceptionTranslatorRegistry() { - deleteAll( m_translators ); - } - - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_translators.push_back( translator ); - } - - virtual std::string translateActiveException() const { - try { -#ifdef __OBJC__ - // In Objective-C try objective-c exceptions first - @try { - throw; - } - @catch (NSException *exception) { - return toString( [exception description] ); - } -#else - throw; -#endif - } - catch( TestFailureException& ) { - throw; - } - catch( std::exception& ex ) { - return ex.what(); - } - catch( std::string& msg ) { - return msg; - } - catch( const char* msg ) { - return msg; - } - catch(...) { - return tryTranslators( m_translators.begin() ); - } - } - - std::string tryTranslators( std::vector::const_iterator it ) const { - if( it == m_translators.end() ) - return "Unknown exception"; - - try { - return (*it)->translate(); - } - catch(...) { - return tryTranslators( it+1 ); - } - } - - private: - std::vector m_translators; - }; -} - -namespace Catch { - - namespace { - - class RegistryHub : public IRegistryHub, public IMutableRegistryHub { - - RegistryHub( RegistryHub const& ); - void operator=( RegistryHub const& ); - - public: // IRegistryHub - RegistryHub() { - } - virtual IReporterRegistry const& getReporterRegistry() const { - return m_reporterRegistry; - } - virtual ITestCaseRegistry const& getTestCaseRegistry() const { - return m_testCaseRegistry; - } - virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { - return m_exceptionTranslatorRegistry; - } - - public: // IMutableRegistryHub - virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { - m_reporterRegistry.registerReporter( name, factory ); - } - virtual void registerTest( TestCase const& testInfo ) { - m_testCaseRegistry.registerTest( testInfo ); - } - virtual void registerTranslator( const IExceptionTranslator* translator ) { - m_exceptionTranslatorRegistry.registerTranslator( translator ); - } - - private: - TestRegistry m_testCaseRegistry; - ReporterRegistry m_reporterRegistry; - ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; - }; - - // Single, global, instance - inline RegistryHub*& getTheRegistryHub() { - static RegistryHub* theRegistryHub = NULL; - if( !theRegistryHub ) - theRegistryHub = new RegistryHub(); - return theRegistryHub; - } - } - - IRegistryHub& getRegistryHub() { - return *getTheRegistryHub(); - } - IMutableRegistryHub& getMutableRegistryHub() { - return *getTheRegistryHub(); - } - void cleanUp() { - delete getTheRegistryHub(); - getTheRegistryHub() = NULL; - cleanUpContext(); - } - std::string translateActiveException() { - return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); - } - -} // end namespace Catch - -// #included from: catch_notimplemented_exception.hpp -#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED - -#include - -namespace Catch { - - NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo ) - : m_lineInfo( lineInfo ) { - std::ostringstream oss; - oss << lineInfo << ": function "; - oss << "not implemented"; - m_what = oss.str(); - } - - const char* NotImplementedException::what() const CATCH_NOEXCEPT { - return m_what.c_str(); - } - -} // end namespace Catch - -// #included from: catch_context_impl.hpp -#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED - -// #included from: catch_stream.hpp -#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED - -// #included from: catch_streambuf.h -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase() CATCH_NOEXCEPT; - }; -} - -#include -#include - -namespace Catch { - - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } - - ~StreamBufImpl() CATCH_NOEXCEPT { - sync(); - } - - private: - int overflow( int c ) { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); - } - return 0; - } - - int sync() { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); - } - return 0; - } - }; - - /////////////////////////////////////////////////////////////////////////// - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; - - Stream::Stream() - : streamBuf( NULL ), isOwned( false ) - {} - - Stream::Stream( std::streambuf* _streamBuf, bool _isOwned ) - : streamBuf( _streamBuf ), isOwned( _isOwned ) - {} - - void Stream::release() { - if( isOwned ) { - delete streamBuf; - streamBuf = NULL; - isOwned = false; - } - } -} - -namespace Catch { - - class Context : public IMutableContext { - - Context() : m_config( NULL ), m_runner( NULL ), m_resultCapture( NULL ) {} - Context( Context const& ); - void operator=( Context const& ); - - public: // IContext - virtual IResultCapture* getResultCapture() { - return m_resultCapture; - } - virtual IRunner* getRunner() { - return m_runner; - } - virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) { - return getGeneratorsForCurrentTest() - .getGeneratorInfo( fileInfo, totalSize ) - .getCurrentIndex(); - } - virtual bool advanceGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - return generators && generators->moveNext(); - } - - virtual Ptr getConfig() const { - return m_config; - } - - public: // IMutableContext - virtual void setResultCapture( IResultCapture* resultCapture ) { - m_resultCapture = resultCapture; - } - virtual void setRunner( IRunner* runner ) { - m_runner = runner; - } - virtual void setConfig( Ptr const& config ) { - m_config = config; - } - - friend IMutableContext& getCurrentMutableContext(); - - private: - IGeneratorsForTest* findGeneratorsForCurrentTest() { - std::string testName = getResultCapture()->getCurrentTestName(); - - std::map::const_iterator it = - m_generatorsByTestName.find( testName ); - return it != m_generatorsByTestName.end() - ? it->second - : NULL; - } - - IGeneratorsForTest& getGeneratorsForCurrentTest() { - IGeneratorsForTest* generators = findGeneratorsForCurrentTest(); - if( !generators ) { - std::string testName = getResultCapture()->getCurrentTestName(); - generators = createGeneratorsForTest(); - m_generatorsByTestName.insert( std::make_pair( testName, generators ) ); - } - return *generators; - } - - private: - Ptr m_config; - IRunner* m_runner; - IResultCapture* m_resultCapture; - std::map m_generatorsByTestName; - }; - - namespace { - Context* currentContext = NULL; - } - IMutableContext& getCurrentMutableContext() { - if( !currentContext ) - currentContext = new Context(); - return *currentContext; - } - IContext& getCurrentContext() { - return getCurrentMutableContext(); - } - - Stream createStream( std::string const& streamName ) { - if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); - if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); - if( streamName == "debug" ) return Stream( new StreamBufImpl, true ); - - throw std::domain_error( "Unknown stream: " + streamName ); - } - - void cleanUpContext() { - delete currentContext; - currentContext = NULL; - } -} - -// #included from: catch_console_colour_impl.hpp -#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED - -namespace Catch { namespace Detail { - struct IColourImpl { - virtual ~IColourImpl() {} - virtual void use( Colour::Code _colourCode ) = 0; - }; -}} - -#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// - -#ifndef NOMINMAX -#define NOMINMAX -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -namespace Catch { -namespace { - - class Win32ColourImpl : public Detail::IColourImpl { - public: - Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) - { - CONSOLE_SCREEN_BUFFER_INFO csbiInfo; - GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); - originalAttributes = csbiInfo.wAttributes; - } - - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: return setTextAttribute( originalAttributes ); - case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - case Colour::Red: return setTextAttribute( FOREGROUND_RED ); - case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); - case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); - case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); - case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); - case Colour::Grey: return setTextAttribute( 0 ); - - case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); - case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); - case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); - case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - - private: - void setTextAttribute( WORD _textAttribute ) { - SetConsoleTextAttribute( stdoutHandle, _textAttribute ); - } - HANDLE stdoutHandle; - WORD originalAttributes; - }; - - inline bool shouldUseColourForPlatform() { - return true; - } - - static Detail::IColourImpl* platformColourInstance() { - static Win32ColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#else // Not Windows - assumed to be POSIX compatible ////////////////////////// - -#include - -namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public Detail::IColourImpl { - public: - virtual void use( Colour::Code _colourCode ) { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0:34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - - case Colour::Bright: throw std::logic_error( "not a colour" ); - } - } - private: - void setColour( const char* _escapeCode ) { - std::cout << '\033' << _escapeCode; - } - }; - - inline bool shouldUseColourForPlatform() { - return isatty(STDOUT_FILENO); - } - - static Detail::IColourImpl* platformColourInstance() { - static PosixColourImpl s_instance; - return &s_instance; - } - -} // end anon namespace -} // end namespace Catch - -#endif // not Windows - -namespace Catch { - - namespace { - struct NoColourImpl : Detail::IColourImpl { - void use( Colour::Code ) {} - - static IColourImpl* instance() { - static NoColourImpl s_instance; - return &s_instance; - } - }; - static bool shouldUseColour() { - return shouldUseColourForPlatform() && !isDebuggerActive(); - } - } - - Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); } - Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast( _other ).m_moved = true; } - Colour::~Colour(){ if( !m_moved ) use( None ); } - void Colour::use( Code _colourCode ) { - impl()->use( _colourCode ); - } - - Detail::IColourImpl* Colour::impl() { - return shouldUseColour() - ? platformColourInstance() - : NoColourImpl::instance(); - } - -} // end namespace Catch - -// #included from: catch_generators_impl.hpp -#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED - -#include -#include -#include - -namespace Catch { - - struct GeneratorInfo : IGeneratorInfo { - - GeneratorInfo( std::size_t size ) - : m_size( size ), - m_currentIndex( 0 ) - {} - - bool moveNext() { - if( ++m_currentIndex == m_size ) { - m_currentIndex = 0; - return false; - } - return true; - } - - std::size_t getCurrentIndex() const { - return m_currentIndex; - } - - std::size_t m_size; - std::size_t m_currentIndex; - }; - - /////////////////////////////////////////////////////////////////////////// - - class GeneratorsForTest : public IGeneratorsForTest { - - public: - ~GeneratorsForTest() { - deleteAll( m_generatorsInOrder ); - } - - IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) { - std::map::const_iterator it = m_generatorsByName.find( fileInfo ); - if( it == m_generatorsByName.end() ) { - IGeneratorInfo* info = new GeneratorInfo( size ); - m_generatorsByName.insert( std::make_pair( fileInfo, info ) ); - m_generatorsInOrder.push_back( info ); - return *info; - } - return *it->second; - } - - bool moveNext() { - std::vector::const_iterator it = m_generatorsInOrder.begin(); - std::vector::const_iterator itEnd = m_generatorsInOrder.end(); - for(; it != itEnd; ++it ) { - if( (*it)->moveNext() ) - return true; - } - return false; - } - - private: - std::map m_generatorsByName; - std::vector m_generatorsInOrder; - }; - - IGeneratorsForTest* createGeneratorsForTest() - { - return new GeneratorsForTest(); - } - -} // end namespace Catch - -// #included from: catch_assertionresult.hpp -#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED - -namespace Catch { - - AssertionInfo::AssertionInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - std::string const& _capturedExpression, - ResultDisposition::Flags _resultDisposition ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - capturedExpression( _capturedExpression ), - resultDisposition( _resultDisposition ) - {} - - AssertionResult::AssertionResult() {} - - AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) - {} - - AssertionResult::~AssertionResult() {} - - // Result was a success - bool AssertionResult::succeeded() const { - return Catch::isOk( m_resultData.resultType ); - } - - // Result was a success, or failure is suppressed - bool AssertionResult::isOk() const { - return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); - } - - ResultWas::OfType AssertionResult::getResultType() const { - return m_resultData.resultType; - } - - bool AssertionResult::hasExpression() const { - return !m_info.capturedExpression.empty(); - } - - bool AssertionResult::hasMessage() const { - return !m_resultData.message.empty(); - } - - std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!" + m_info.capturedExpression; - else - return m_info.capturedExpression; - } - std::string AssertionResult::getExpressionInMacro() const { - if( m_info.macroName.empty() ) - return m_info.capturedExpression; - else - return m_info.macroName + "( " + m_info.capturedExpression + " )"; - } - - bool AssertionResult::hasExpandedExpression() const { - return hasExpression() && getExpandedExpression() != getExpression(); - } - - std::string AssertionResult::getExpandedExpression() const { - return m_resultData.reconstructedExpression; - } - - std::string AssertionResult::getMessage() const { - return m_resultData.message; - } - SourceLineInfo AssertionResult::getSourceInfo() const { - return m_info.lineInfo; - } - - std::string AssertionResult::getTestMacroName() const { - return m_info.macroName; - } - -} // end namespace Catch - -// #included from: catch_test_case_info.hpp -#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED - -namespace Catch { - - inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { - if( tag == "." || - tag == "hide" || - tag == "!hide" ) - return TestCaseInfo::IsHidden; - else if( tag == "!throws" ) - return TestCaseInfo::Throws; - else if( tag == "!shouldfail" ) - return TestCaseInfo::ShouldFail; - else if( tag == "!mayfail" ) - return TestCaseInfo::MayFail; - else - return TestCaseInfo::None; - } - inline bool isReservedTag( std::string const& tag ) { - return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !isalnum( tag[0] ); - } - inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { - if( isReservedTag( tag ) ) { - { - Colour colourGuard( Colour::Red ); - std::cerr - << "Tag name [" << tag << "] not allowed.\n" - << "Tag names starting with non alpha-numeric characters are reserved\n"; - } - { - Colour colourGuard( Colour::FileName ); - std::cerr << _lineInfo << std::endl; - } - exit(1); - } - } - - TestCase makeTestCase( ITestCase* _testCase, - std::string const& _className, - std::string const& _name, - std::string const& _descOrTags, - SourceLineInfo const& _lineInfo ) - { - bool isHidden( startsWith( _name, "./" ) ); // Legacy support - - // Parse out tags - std::set tags; - std::string desc, tag; - bool inTag = false; - for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { - char c = _descOrTags[i]; - if( !inTag ) { - if( c == '[' ) - inTag = true; - else - desc += c; - } - else { - if( c == ']' ) { - enforceNotReservedTag( tag, _lineInfo ); - - inTag = false; - if( tag == "hide" || tag == "." ) - isHidden = true; - else - tags.insert( tag ); - tag.clear(); - } - else - tag += c; - } - } - if( isHidden ) { - tags.insert( "hide" ); - tags.insert( "." ); - } - - TestCaseInfo info( _name, _className, desc, tags, _lineInfo ); - return TestCase( _testCase, info ); - } - - TestCaseInfo::TestCaseInfo( std::string const& _name, - std::string const& _className, - std::string const& _description, - std::set const& _tags, - SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - tags( _tags ), - lineInfo( _lineInfo ), - properties( None ) - { - std::ostringstream oss; - for( std::set::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it ) { - oss << "[" << *it << "]"; - std::string lcaseTag = toLower( *it ); - properties = static_cast( properties | parseSpecialTag( lcaseTag ) ); - lcaseTags.insert( lcaseTag ); - } - tagsAsString = oss.str(); - } - - TestCaseInfo::TestCaseInfo( TestCaseInfo const& other ) - : name( other.name ), - className( other.className ), - description( other.description ), - tags( other.tags ), - lcaseTags( other.lcaseTags ), - tagsAsString( other.tagsAsString ), - lineInfo( other.lineInfo ), - properties( other.properties ) - {} - - bool TestCaseInfo::isHidden() const { - return ( properties & IsHidden ) != 0; - } - bool TestCaseInfo::throws() const { - return ( properties & Throws ) != 0; - } - bool TestCaseInfo::okToFail() const { - return ( properties & (ShouldFail | MayFail ) ) != 0; - } - bool TestCaseInfo::expectedToFail() const { - return ( properties & (ShouldFail ) ) != 0; - } - - TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {} - - TestCase::TestCase( TestCase const& other ) - : TestCaseInfo( other ), - test( other.test ) - {} - - TestCase TestCase::withName( std::string const& _newName ) const { - TestCase other( *this ); - other.name = _newName; - return other; - } - - void TestCase::swap( TestCase& other ) { - test.swap( other.test ); - name.swap( other.name ); - className.swap( other.className ); - description.swap( other.description ); - tags.swap( other.tags ); - lcaseTags.swap( other.lcaseTags ); - tagsAsString.swap( other.tagsAsString ); - std::swap( TestCaseInfo::properties, static_cast( other ).properties ); - std::swap( lineInfo, other.lineInfo ); - } - - void TestCase::invoke() const { - test->invoke(); - } - - bool TestCase::operator == ( TestCase const& other ) const { - return test.get() == other.test.get() && - name == other.name && - className == other.className; - } - - bool TestCase::operator < ( TestCase const& other ) const { - return name < other.name; - } - TestCase& TestCase::operator = ( TestCase const& other ) { - TestCase temp( other ); - swap( temp ); - return *this; - } - - TestCaseInfo const& TestCase::getTestCaseInfo() const - { - return *this; - } - -} // end namespace Catch - -// #included from: catch_version.hpp -#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED - -namespace Catch { - - // These numbers are maintained by a script - Version libraryVersion( 1, 0, 52, "master" ); -} - -// #included from: catch_message.hpp -#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED - -namespace Catch { - - MessageInfo::MessageInfo( std::string const& _macroName, - SourceLineInfo const& _lineInfo, - ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) - {} - - // This may need protecting if threading support is added - unsigned int MessageInfo::globalCount = 0; - - //////////////////////////////////////////////////////////////////////////// - - ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ) - { - m_info.message = builder.m_stream.str(); - getResultCapture().pushScopedMessage( m_info ); - } - ScopedMessage::ScopedMessage( ScopedMessage const& other ) - : m_info( other.m_info ) - {} - - ScopedMessage::~ScopedMessage() { - getResultCapture().popScopedMessage( m_info ); - } - -} // end namespace Catch - -// #included from: catch_legacy_reporter_adapter.hpp -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED - -// #included from: catch_legacy_reporter_adapter.h -#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED - -namespace Catch -{ - // Deprecated - struct IReporter : IShared { - virtual ~IReporter(); - - virtual bool shouldRedirectStdout() const = 0; - - virtual void StartTesting() = 0; - virtual void EndTesting( Totals const& totals ) = 0; - virtual void StartGroup( std::string const& groupName ) = 0; - virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0; - virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0; - virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0; - virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0; - virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0; - virtual void NoAssertionsInSection( std::string const& sectionName ) = 0; - virtual void NoAssertionsInTestCase( std::string const& testName ) = 0; - virtual void Aborted() = 0; - virtual void Result( AssertionResult const& result ) = 0; - }; - - class LegacyReporterAdapter : public SharedImpl - { - public: - LegacyReporterAdapter( Ptr const& legacyReporter ); - virtual ~LegacyReporterAdapter(); - - virtual ReporterPreferences getPreferences() const; - virtual void noMatchingTestCases( std::string const& ); - virtual void testRunStarting( TestRunInfo const& ); - virtual void testGroupStarting( GroupInfo const& groupInfo ); - virtual void testCaseStarting( TestCaseInfo const& testInfo ); - virtual void sectionStarting( SectionInfo const& sectionInfo ); - virtual void assertionStarting( AssertionInfo const& ); - virtual bool assertionEnded( AssertionStats const& assertionStats ); - virtual void sectionEnded( SectionStats const& sectionStats ); - virtual void testCaseEnded( TestCaseStats const& testCaseStats ); - virtual void testGroupEnded( TestGroupStats const& testGroupStats ); - virtual void testRunEnded( TestRunStats const& testRunStats ); - - private: - Ptr m_legacyReporter; - }; -} - -namespace Catch -{ - LegacyReporterAdapter::LegacyReporterAdapter( Ptr const& legacyReporter ) - : m_legacyReporter( legacyReporter ) - {} - LegacyReporterAdapter::~LegacyReporterAdapter() {} - - ReporterPreferences LegacyReporterAdapter::getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout(); - return prefs; - } - - void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {} - void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) { - m_legacyReporter->StartTesting(); - } - void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) { - m_legacyReporter->StartGroup( groupInfo.name ); - } - void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) { - m_legacyReporter->StartTestCase( testInfo ); - } - void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) { - m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description ); - } - void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) { - // Not on legacy interface - } - - bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { - for( std::vector::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); - it != itEnd; - ++it ) { - if( it->type == ResultWas::Info ) { - ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal ); - rb << it->message; - rb.setResultType( ResultWas::Info ); - AssertionResult result = rb.build(); - m_legacyReporter->Result( result ); - } - } - } - m_legacyReporter->Result( assertionStats.assertionResult ); - return true; - } - void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) { - if( sectionStats.missingAssertions ) - m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name ); - m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions ); - } - void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) { - m_legacyReporter->EndTestCase - ( testCaseStats.testInfo, - testCaseStats.totals, - testCaseStats.stdOut, - testCaseStats.stdErr ); - } - void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) { - if( testGroupStats.aborting ) - m_legacyReporter->Aborted(); - m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals ); - } - void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) { - m_legacyReporter->EndTesting( testRunStats.totals ); - } -} - -// #included from: catch_timer.hpp - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc++11-long-long" -#endif - -#ifdef CATCH_PLATFORM_WINDOWS -#include -#else -#include -#endif - -namespace Catch { - - namespace { -#ifdef CATCH_PLATFORM_WINDOWS - uint64_t getCurrentTicks() { - static uint64_t hz=0, hzo=0; - if (!hz) { - QueryPerformanceFrequency((LARGE_INTEGER*)&hz); - QueryPerformanceCounter((LARGE_INTEGER*)&hzo); - } - uint64_t t; - QueryPerformanceCounter((LARGE_INTEGER*)&t); - return ((t-hzo)*1000000)/hz; - } -#else - uint64_t getCurrentTicks() { - timeval t; - gettimeofday(&t,NULL); - return static_cast( t.tv_sec ) * 1000000ull + static_cast( t.tv_usec ); - } -#endif - } - - void Timer::start() { - m_ticks = getCurrentTicks(); - } - unsigned int Timer::getElapsedNanoseconds() const { - return static_cast(getCurrentTicks() - m_ticks); - } - unsigned int Timer::getElapsedMilliseconds() const { - return static_cast((getCurrentTicks() - m_ticks)/1000); - } - double Timer::getElapsedSeconds() const { - return (getCurrentTicks() - m_ticks)/1000000.0; - } - -} // namespace Catch - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -// #included from: catch_common.hpp -#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED - -namespace Catch { - - bool startsWith( std::string const& s, std::string const& prefix ) { - return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; - } - bool endsWith( std::string const& s, std::string const& suffix ) { - return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; - } - bool contains( std::string const& s, std::string const& infix ) { - return s.find( infix ) != std::string::npos; - } - void toLowerInPlace( std::string& s ) { - std::transform( s.begin(), s.end(), s.begin(), ::tolower ); - } - std::string toLower( std::string const& s ) { - std::string lc = s; - toLowerInPlace( lc ); - return lc; - } - std::string trim( std::string const& str ) { - static char const* whitespaceChars = "\n\r\t "; - std::string::size_type start = str.find_first_not_of( whitespaceChars ); - std::string::size_type end = str.find_last_not_of( whitespaceChars ); - - return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; - } - - pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) - {} - - std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { - os << pluraliser.m_count << " " << pluraliser.m_label; - if( pluraliser.m_count != 1 ) - os << "s"; - return os; - } - - SourceLineInfo::SourceLineInfo() : line( 0 ){} - SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) - : file( _file ), - line( _line ) - {} - SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) - : file( other.file ), - line( other.line ) - {} - bool SourceLineInfo::empty() const { - return file.empty(); - } - bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { - return line == other.line && file == other.file; - } - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { -#ifndef __GNUG__ - os << info.file << "(" << info.line << ")"; -#else - os << info.file << ":" << info.line; -#endif - return os; - } - - void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { - std::ostringstream oss; - oss << locationInfo << ": Internal Catch error: '" << message << "'"; - if( alwaysTrue() ) - throw std::logic_error( oss.str() ); - } -} - -// #included from: catch_section.hpp -#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED - -namespace Catch { - - SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& _description ) - : name( _name ), - description( _description ), - lineInfo( _lineInfo ) - {} - - Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) - { - m_timer.start(); - } - - Section::~Section() { - if( m_sectionIncluded ) - getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); - } - - // This indicates whether the section should be executed or not - Section::operator bool() const { - return m_sectionIncluded; - } - -} // end namespace Catch - -// #included from: catch_debugger.hpp -#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED - -#include - -#ifdef CATCH_PLATFORM_MAC - - #include - #include - #include - #include - #include - - namespace Catch{ - - // The following function is taken directly from the following technical note: - // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html - - // Returns true if the current process is being debugged (either - // running under the debugger or has a debugger attached post facto). - bool isDebuggerActive(){ - - int mib[4]; - struct kinfo_proc info; - size_t size; - - // Initialize the flags so that, if sysctl fails for some bizarre - // reason, we get a predictable result. - - info.kp_proc.p_flag = 0; - - // Initialize mib, which tells sysctl the info we want, in this case - // we're looking for information about a specific process ID. - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - // Call sysctl. - - size = sizeof(info); - if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { - std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; - return false; - } - - // We're being debugged if the P_TRACED flag is set. - - return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); - } - } // namespace Catch - -#elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#elif defined(__MINGW32__) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); - namespace Catch { - bool isDebuggerActive() { - return IsDebuggerPresent() != 0; - } - } -#else - namespace Catch { - inline bool isDebuggerActive() { return false; } - } -#endif // Platform - -#ifdef CATCH_PLATFORM_WINDOWS - extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* ); - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - ::OutputDebugStringA( text.c_str() ); - } - } -#else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - std::cout << text; - } - } -#endif // Platform - -// #included from: catch_tostring.hpp -#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED - -namespace Catch { - -namespace Detail { - - namespace { - struct Endianness { - enum Arch { Big, Little }; - - static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; - } - }; - } - - std::string rawMemoryToString( const void *object, std::size_t size ) - { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; - } - - unsigned char const *bytes = static_cast(object); - std::ostringstream os; - os << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - os << std::setw(2) << static_cast(bytes[i]); - return os.str(); - } -} - -std::string toString( std::string const& value ) { - std::string s = value; - if( getCurrentContext().getConfig()->showInvisibles() ) { - for(size_t i = 0; i < s.size(); ++i ) { - std::string subs; - switch( s[i] ) { - case '\n': subs = "\\n"; break; - case '\t': subs = "\\t"; break; - default: break; - } - if( !subs.empty() ) { - s = s.substr( 0, i ) + subs + s.substr( i+1 ); - ++i; - } - } - } - return "\"" + s + "\""; -} -std::string toString( std::wstring const& value ) { - - std::string s; - s.reserve( value.size() ); - for(size_t i = 0; i < value.size(); ++i ) - s += value[i] <= 0xff ? static_cast( value[i] ) : '?'; - return toString( s ); -} - -std::string toString( const char* const value ) { - return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" ); -} - -std::string toString( char* const value ) { - return Catch::toString( static_cast( value ) ); -} - -std::string toString( int value ) { - std::ostringstream oss; - oss << value; - return oss.str(); -} - -std::string toString( unsigned long value ) { - std::ostringstream oss; - if( value > 8192 ) - oss << "0x" << std::hex << value; - else - oss << value; - return oss.str(); -} - -std::string toString( unsigned int value ) { - return toString( static_cast( value ) ); -} - -template -std::string fpToString( T value, int precision ) { - std::ostringstream oss; - oss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = oss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); - } - return d; -} - -std::string toString( const double value ) { - return fpToString( value, 10 ); -} -std::string toString( const float value ) { - return fpToString( value, 5 ) + "f"; -} - -std::string toString( bool value ) { - return value ? "true" : "false"; -} - -std::string toString( char value ) { - return value < ' ' - ? toString( static_cast( value ) ) - : Detail::makeString( value ); -} - -std::string toString( signed char value ) { - return toString( static_cast( value ) ); -} - -std::string toString( unsigned char value ) { - return toString( static_cast( value ) ); -} - -#ifdef CATCH_CONFIG_CPP11_NULLPTR -std::string toString( std::nullptr_t ) { - return "nullptr"; -} -#endif - -#ifdef __OBJC__ - std::string toString( NSString const * const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) { - if( !nsstring ) - return "nil"; - return "@" + toString([nsstring UTF8String]); - } - std::string toString( NSObject* const& nsObject ) { - return toString( [nsObject description] ); - } -#endif - -} // end namespace Catch - -// #included from: catch_result_builder.hpp -#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED - -namespace Catch { - - ResultBuilder::ResultBuilder( char const* macroName, - SourceLineInfo const& lineInfo, - char const* capturedExpression, - ResultDisposition::Flags resultDisposition ) - : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ), - m_shouldDebugBreak( false ), - m_shouldThrow( false ) - {} - - ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) { - m_data.resultType = result; - return *this; - } - ResultBuilder& ResultBuilder::setResultType( bool result ) { - m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed; - return *this; - } - ResultBuilder& ResultBuilder::setLhs( std::string const& lhs ) { - m_exprComponents.lhs = lhs; - return *this; - } - ResultBuilder& ResultBuilder::setRhs( std::string const& rhs ) { - m_exprComponents.rhs = rhs; - return *this; - } - ResultBuilder& ResultBuilder::setOp( std::string const& op ) { - m_exprComponents.op = op; - return *this; - } - - void ResultBuilder::endExpression() { - m_exprComponents.testFalse = isFalseTest( m_assertionInfo.resultDisposition ); - captureExpression(); - } - - void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) { - m_assertionInfo.resultDisposition = resultDisposition; - m_stream.oss << Catch::translateActiveException(); - captureResult( ResultWas::ThrewException ); - } - - void ResultBuilder::captureResult( ResultWas::OfType resultType ) { - setResultType( resultType ); - captureExpression(); - } - - void ResultBuilder::captureExpression() { - AssertionResult result = build(); - getResultCapture().assertionEnded( result ); - - if( !result.isOk() ) { - if( getCurrentContext().getConfig()->shouldDebugBreak() ) - m_shouldDebugBreak = true; - if( getCurrentContext().getRunner()->aborting() || m_assertionInfo.resultDisposition == ResultDisposition::Normal ) - m_shouldThrow = true; - } - } - void ResultBuilder::react() { - if( m_shouldThrow ) - throw Catch::TestFailureException(); - } - - bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; } - bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); } - - AssertionResult ResultBuilder::build() const - { - assert( m_data.resultType != ResultWas::Unknown ); - - AssertionResultData data = m_data; - - // Flip bool results if testFalse is set - if( m_exprComponents.testFalse ) { - if( data.resultType == ResultWas::Ok ) - data.resultType = ResultWas::ExpressionFailed; - else if( data.resultType == ResultWas::ExpressionFailed ) - data.resultType = ResultWas::Ok; - } - - data.message = m_stream.oss.str(); - data.reconstructedExpression = reconstructExpression(); - if( m_exprComponents.testFalse ) { - if( m_exprComponents.op == "" ) - data.reconstructedExpression = "!" + data.reconstructedExpression; - else - data.reconstructedExpression = "!(" + data.reconstructedExpression + ")"; - } - return AssertionResult( m_assertionInfo, data ); - } - std::string ResultBuilder::reconstructExpression() const { - if( m_exprComponents.op == "" ) - return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs; - else if( m_exprComponents.op == "matches" ) - return m_exprComponents.lhs + " " + m_exprComponents.rhs; - else if( m_exprComponents.op != "!" ) { - if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 && - m_exprComponents.lhs.find("\n") == std::string::npos && - m_exprComponents.rhs.find("\n") == std::string::npos ) - return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs; - else - return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs; - } - else - return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}"; - } - -} // end namespace Catch - -// #included from: catch_tag_alias_registry.hpp -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED - -// #included from: catch_tag_alias_registry.h -#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED - -#include - -namespace Catch { - - class TagAliasRegistry : public ITagAliasRegistry { - public: - virtual ~TagAliasRegistry(); - virtual Option find( std::string const& alias ) const; - virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const; - void add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - static TagAliasRegistry& get(); - - private: - std::map m_registry; - }; - -} // end namespace Catch - -#include -#include - -namespace Catch { - - TagAliasRegistry::~TagAliasRegistry() {} - - Option TagAliasRegistry::find( std::string const& alias ) const { - std::map::const_iterator it = m_registry.find( alias ); - if( it != m_registry.end() ) - return it->second; - else - return Option(); - } - - std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { - std::string expandedTestSpec = unexpandedTestSpec; - for( std::map::const_iterator it = m_registry.begin(), itEnd = m_registry.end(); - it != itEnd; - ++it ) { - std::size_t pos = expandedTestSpec.find( it->first ); - if( pos != std::string::npos ) { - expandedTestSpec = expandedTestSpec.substr( 0, pos ) + - it->second.tag + - expandedTestSpec.substr( pos + it->first.size() ); - } - } - return expandedTestSpec; - } - - void TagAliasRegistry::add( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - - if( !startsWith( alias, "[@" ) || !endsWith( alias, "]" ) ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n" << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) { - std::ostringstream oss; - oss << "error: tag alias, \"" << alias << "\" already registered.\n" - << "\tFirst seen at " << find(alias)->lineInfo << "\n" - << "\tRedefined at " << lineInfo; - throw std::domain_error( oss.str().c_str() ); - } - } - - TagAliasRegistry& TagAliasRegistry::get() { - static TagAliasRegistry instance; - return instance; - - } - - ITagAliasRegistry::~ITagAliasRegistry() {} - ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); } - - RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) { - try { - TagAliasRegistry::get().add( alias, tag, lineInfo ); - } - catch( std::exception& ex ) { - Colour colourGuard( Colour::Red ); - std::cerr << ex.what() << std::endl; - exit(1); - } - } - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_xml.hpp -#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED - -// #included from: catch_reporter_bases.hpp -#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED - -namespace Catch { - - struct StreamingReporterBase : SharedImpl { - - StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - - virtual ~StreamingReporterBase(); - - virtual void noMatchingTestCases( std::string const& ) {} - - virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { - currentTestRunInfo = _testRunInfo; - } - virtual void testGroupStarting( GroupInfo const& _groupInfo ) { - currentGroupInfo = _groupInfo; - } - - virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { - currentTestCaseInfo = _testInfo; - } - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_sectionStack.push_back( _sectionInfo ); - } - - virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { - currentTestCaseInfo.reset(); - assert( m_sectionStack.empty() ); - } - virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { - currentGroupInfo.reset(); - } - virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { - currentTestCaseInfo.reset(); - currentGroupInfo.reset(); - currentTestRunInfo.reset(); - } - - Ptr m_config; - std::ostream& stream; - - LazyStat currentTestRunInfo; - LazyStat currentGroupInfo; - LazyStat currentTestCaseInfo; - - std::vector m_sectionStack; - }; - - struct CumulativeReporterBase : SharedImpl { - template - struct Node : SharedImpl<> { - explicit Node( T const& _value ) : value( _value ) {} - virtual ~Node() {} - - typedef std::vector > ChildNodes; - T value; - ChildNodes children; - }; - struct SectionNode : SharedImpl<> { - explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {} - virtual ~SectionNode(); - - bool operator == ( SectionNode const& other ) const { - return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; - } - bool operator == ( Ptr const& other ) const { - return operator==( *other ); - } - - SectionStats stats; - typedef std::vector > ChildSections; - typedef std::vector Assertions; - ChildSections childSections; - Assertions assertions; - std::string stdOut; - std::string stdErr; - }; - - struct BySectionInfo { - BySectionInfo( SectionInfo const& other ) : m_other( other ) {} - BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} - bool operator() ( Ptr const& node ) const { - return node->stats.sectionInfo.lineInfo == m_other.lineInfo; - } - private: - void operator=( BySectionInfo const& ); - SectionInfo const& m_other; - }; - - typedef Node TestCaseNode; - typedef Node TestGroupNode; - typedef Node TestRunNode; - - CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) - {} - ~CumulativeReporterBase(); - - virtual void testRunStarting( TestRunInfo const& ) {} - virtual void testGroupStarting( GroupInfo const& ) {} - - virtual void testCaseStarting( TestCaseInfo const& ) {} - - virtual void sectionStarting( SectionInfo const& sectionInfo ) { - SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); - Ptr node; - if( m_sectionStack.empty() ) { - if( !m_rootSection ) - m_rootSection = new SectionNode( incompleteStats ); - node = m_rootSection; - } - else { - SectionNode& parentNode = *m_sectionStack.back(); - SectionNode::ChildSections::const_iterator it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); - if( it == parentNode.childSections.end() ) { - node = new SectionNode( incompleteStats ); - parentNode.childSections.push_back( node ); - } - else - node = *it; - } - m_sectionStack.push_back( node ); - m_deepestSection = node; - } - - virtual void assertionStarting( AssertionInfo const& ) {} - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& sectionNode = *m_sectionStack.back(); - sectionNode.assertions.push_back( assertionStats ); - return true; - } - virtual void sectionEnded( SectionStats const& sectionStats ) { - assert( !m_sectionStack.empty() ); - SectionNode& node = *m_sectionStack.back(); - node.stats = sectionStats; - m_sectionStack.pop_back(); - } - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - Ptr node = new TestCaseNode( testCaseStats ); - assert( m_sectionStack.size() == 0 ); - node->children.push_back( m_rootSection ); - m_testCases.push_back( node ); - m_rootSection.reset(); - - assert( m_deepestSection ); - m_deepestSection->stdOut = testCaseStats.stdOut; - m_deepestSection->stdErr = testCaseStats.stdErr; - } - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - Ptr node = new TestGroupNode( testGroupStats ); - node->children.swap( m_testCases ); - m_testGroups.push_back( node ); - } - virtual void testRunEnded( TestRunStats const& testRunStats ) { - Ptr node = new TestRunNode( testRunStats ); - node->children.swap( m_testGroups ); - m_testRuns.push_back( node ); - testRunEndedCumulative(); - } - virtual void testRunEndedCumulative() = 0; - - Ptr m_config; - std::ostream& stream; - std::vector m_assertions; - std::vector > > m_sections; - std::vector > m_testCases; - std::vector > m_testGroups; - - std::vector > m_testRuns; - - Ptr m_rootSection; - Ptr m_deepestSection; - std::vector > m_sectionStack; - - }; - -} // end namespace Catch - -// #included from: ../internal/catch_reporter_registrars.hpp -#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED - -namespace Catch { - - template - class LegacyReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new LegacyReporterAdapter( new T( config ) ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - LegacyReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; - - template - class ReporterRegistrar { - - class ReporterFactory : public IReporterFactory { - - // *** Please Note ***: - // - If you end up here looking at a compiler error because it's trying to register - // your custom reporter class be aware that the native reporter interface has changed - // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via - // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter. - // However please consider updating to the new interface as the old one is now - // deprecated and will probably be removed quite soon! - // Please contact me via github if you have any questions at all about this. - // In fact, ideally, please contact me anyway to let me know you've hit this - as I have - // no idea who is actually using custom reporters at all (possibly no-one!). - // The new interface is designed to minimise exposure to interface changes in the future. - virtual IStreamingReporter* create( ReporterConfig const& config ) const { - return new T( config ); - } - - virtual std::string getDescription() const { - return T::getDescription(); - } - }; - - public: - - ReporterRegistrar( std::string const& name ) { - getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); - } - }; -} - -#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ - namespace{ Catch::LegacyReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } -#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ - namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } - -// #included from: ../internal/catch_xmlwriter.hpp -#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED - -#include -#include -#include -#include - -namespace Catch { - - class XmlWriter { - public: - - class ScopedElement { - public: - ScopedElement( XmlWriter* writer ) - : m_writer( writer ) - {} - - ScopedElement( ScopedElement const& other ) - : m_writer( other.m_writer ){ - other.m_writer = NULL; - } - - ~ScopedElement() { - if( m_writer ) - m_writer->endElement(); - } - - ScopedElement& writeText( std::string const& text, bool indent = true ) { - m_writer->writeText( text, indent ); - return *this; - } - - template - ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { - m_writer->writeAttribute( name, attribute ); - return *this; - } - - private: - mutable XmlWriter* m_writer; - }; - - XmlWriter() - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &std::cout ) - {} - - XmlWriter( std::ostream& os ) - : m_tagIsOpen( false ), - m_needsNewline( false ), - m_os( &os ) - {} - - ~XmlWriter() { - while( !m_tags.empty() ) - endElement(); - } - -//# ifndef CATCH_CPP11_OR_GREATER -// XmlWriter& operator = ( XmlWriter const& other ) { -// XmlWriter temp( other ); -// swap( temp ); -// return *this; -// } -//# else -// XmlWriter( XmlWriter const& ) = default; -// XmlWriter( XmlWriter && ) = default; -// XmlWriter& operator = ( XmlWriter const& ) = default; -// XmlWriter& operator = ( XmlWriter && ) = default; -//# endif -// -// void swap( XmlWriter& other ) { -// std::swap( m_tagIsOpen, other.m_tagIsOpen ); -// std::swap( m_needsNewline, other.m_needsNewline ); -// std::swap( m_tags, other.m_tags ); -// std::swap( m_indent, other.m_indent ); -// std::swap( m_os, other.m_os ); -// } - - XmlWriter& startElement( std::string const& name ) { - ensureTagClosed(); - newlineIfNecessary(); - stream() << m_indent << "<" << name; - m_tags.push_back( name ); - m_indent += " "; - m_tagIsOpen = true; - return *this; - } - - ScopedElement scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); - return scoped; - } - - XmlWriter& endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); - if( m_tagIsOpen ) { - stream() << "/>\n"; - m_tagIsOpen = false; - } - else { - stream() << m_indent << "\n"; - } - m_tags.pop_back(); - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) { - if( !name.empty() && !attribute.empty() ) { - stream() << " " << name << "=\""; - writeEncodedText( attribute ); - stream() << "\""; - } - return *this; - } - - XmlWriter& writeAttribute( std::string const& name, bool attribute ) { - stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\""; - return *this; - } - - template - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - if( !name.empty() ) - stream() << " " << name << "=\"" << attribute << "\""; - return *this; - } - - XmlWriter& writeText( std::string const& text, bool indent = true ) { - if( !text.empty() ){ - bool tagWasOpen = m_tagIsOpen; - ensureTagClosed(); - if( tagWasOpen && indent ) - stream() << m_indent; - writeEncodedText( text ); - m_needsNewline = true; - } - return *this; - } - - XmlWriter& writeComment( std::string const& text ) { - ensureTagClosed(); - stream() << m_indent << ""; - m_needsNewline = true; - return *this; - } - - XmlWriter& writeBlankLine() { - ensureTagClosed(); - stream() << "\n"; - return *this; - } - - void setStream( std::ostream& os ) { - m_os = &os; - } - - private: - XmlWriter( XmlWriter const& ); - void operator=( XmlWriter const& ); - - std::ostream& stream() { - return *m_os; - } - - void ensureTagClosed() { - if( m_tagIsOpen ) { - stream() << ">\n"; - m_tagIsOpen = false; - } - } - - void newlineIfNecessary() { - if( m_needsNewline ) { - stream() << "\n"; - m_needsNewline = false; - } - } - - void writeEncodedText( std::string const& text ) { - static const char* charsToEncode = "<&\""; - std::string mtext = text; - std::string::size_type pos = mtext.find_first_of( charsToEncode ); - while( pos != std::string::npos ) { - stream() << mtext.substr( 0, pos ); - - switch( mtext[pos] ) { - case '<': - stream() << "<"; - break; - case '&': - stream() << "&"; - break; - case '\"': - stream() << """; - break; - } - mtext = mtext.substr( pos+1 ); - pos = mtext.find_first_of( charsToEncode ); - } - stream() << mtext; - } - - bool m_tagIsOpen; - bool m_needsNewline; - std::vector m_tags; - std::string m_indent; - std::ostream* m_os; - }; - -} -namespace Catch { - class XmlReporter : public SharedImpl { - public: - XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} - - static std::string getDescription() { - return "Reports test results as an XML document"; - } - virtual ~XmlReporter(); - - private: // IReporter - - virtual bool shouldRedirectStdout() const { - return true; - } - - virtual void StartTesting() { - m_xml.setStream( m_config.stream() ); - m_xml.startElement( "Catch" ); - if( !m_config.fullConfig()->name().empty() ) - m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); - } - - virtual void EndTesting( const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartGroup( const std::string& groupName ) { - m_xml.startElement( "Group" ) - .writeAttribute( "name", groupName ); - } - - virtual void EndGroup( const std::string&, const Totals& totals ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", totals.assertions.passed ) - .writeAttribute( "failures", totals.assertions.failed ) - .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); - m_xml.endElement(); - } - - virtual void StartSection( const std::string& sectionName, const std::string& description ) { - if( m_sectionDepth++ > 0 ) { - m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionName ) ) - .writeAttribute( "description", description ); - } - } - virtual void NoAssertionsInSection( const std::string& ) {} - virtual void NoAssertionsInTestCase( const std::string& ) {} - - virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { - if( --m_sectionDepth > 0 ) { - m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", assertions.passed ) - .writeAttribute( "failures", assertions.failed ) - .writeAttribute( "expectedFailures", assertions.failedButOk ); - m_xml.endElement(); - } - } - - virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { - m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); - m_currentTestSuccess = true; - } - - virtual void Result( const Catch::AssertionResult& assertionResult ) { - if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) - return; - - if( assertionResult.hasExpression() ) { - m_xml.startElement( "Expression" ) - .writeAttribute( "success", assertionResult.succeeded() ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ); - - m_xml.scopedElement( "Original" ) - .writeText( assertionResult.getExpression() ); - m_xml.scopedElement( "Expanded" ) - .writeText( assertionResult.getExpandedExpression() ); - m_currentTestSuccess &= assertionResult.succeeded(); - } - - switch( assertionResult.getResultType() ) { - case ResultWas::ThrewException: - m_xml.scopedElement( "Exception" ) - .writeAttribute( "filename", assertionResult.getSourceInfo().file ) - .writeAttribute( "line", assertionResult.getSourceInfo().line ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Info: - m_xml.scopedElement( "Info" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::Warning: - m_xml.scopedElement( "Warning" ) - .writeText( assertionResult.getMessage() ); - break; - case ResultWas::ExplicitFailure: - m_xml.scopedElement( "Failure" ) - .writeText( assertionResult.getMessage() ); - m_currentTestSuccess = false; - break; - case ResultWas::Unknown: - case ResultWas::Ok: - case ResultWas::FailureBit: - case ResultWas::ExpressionFailed: - case ResultWas::Exception: - case ResultWas::DidntThrowException: - break; - } - if( assertionResult.hasExpression() ) - m_xml.endElement(); - } - - virtual void Aborted() { - // !TBD - } - - virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { - m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); - m_xml.endElement(); - } - - private: - ReporterConfig m_config; - bool m_currentTestSuccess; - XmlWriter m_xml; - int m_sectionDepth; - }; - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_junit.hpp -#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED - -#include - -namespace Catch { - - class JunitReporter : public CumulativeReporterBase { - public: - JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - {} - - ~JunitReporter(); - - static std::string getDescription() { - return "Reports test results in an XML format that looks like Ant's junitreport target"; - } - - virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = true; - return prefs; - } - - virtual void testRunStarting( TestRunInfo const& runInfo ) { - CumulativeReporterBase::testRunStarting( runInfo ); - xml.startElement( "testsuites" ); - } - - virtual void testGroupStarting( GroupInfo const& groupInfo ) { - suiteTimer.start(); - stdOutForSuite.str(""); - stdErrForSuite.str(""); - unexpectedExceptions = 0; - CumulativeReporterBase::testGroupStarting( groupInfo ); - } - - virtual bool assertionEnded( AssertionStats const& assertionStats ) { - if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) - unexpectedExceptions++; - return CumulativeReporterBase::assertionEnded( assertionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { - stdOutForSuite << testCaseStats.stdOut; - stdErrForSuite << testCaseStats.stdErr; - CumulativeReporterBase::testCaseEnded( testCaseStats ); - } - - virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { - double suiteTime = suiteTimer.getElapsedSeconds(); - CumulativeReporterBase::testGroupEnded( testGroupStats ); - writeGroup( *m_testGroups.back(), suiteTime ); - } - - virtual void testRunEndedCumulative() { - xml.endElement(); - } - - void writeGroup( TestGroupNode const& groupNode, double suiteTime ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); - TestGroupStats const& stats = groupNode.value; - xml.writeAttribute( "name", stats.groupInfo.name ); - xml.writeAttribute( "errors", unexpectedExceptions ); - xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); - xml.writeAttribute( "tests", stats.totals.assertions.total() ); - xml.writeAttribute( "hostname", "tbd" ); // !TBD - if( m_config->showDurations() == ShowDurations::Never ) - xml.writeAttribute( "time", "" ); - else - xml.writeAttribute( "time", suiteTime ); - xml.writeAttribute( "timestamp", "tbd" ); // !TBD - - // Write test cases - for( TestGroupNode::ChildNodes::const_iterator - it = groupNode.children.begin(), itEnd = groupNode.children.end(); - it != itEnd; - ++it ) - writeTestCase( **it ); - - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false ); - } - - void writeTestCase( TestCaseNode const& testCaseNode ) { - TestCaseStats const& stats = testCaseNode.value; - - // All test cases have exactly one section - which represents the - // test case itself. That section may have 0-n nested sections - assert( testCaseNode.children.size() == 1 ); - SectionNode const& rootSection = *testCaseNode.children.front(); - - std::string className = stats.testInfo.className; - - if( className.empty() ) { - if( rootSection.childSections.empty() ) - className = "global"; - } - writeSection( className, "", rootSection ); - } - - void writeSection( std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode ) { - std::string name = trim( sectionNode.stats.sectionInfo.name ); - if( !rootName.empty() ) - name = rootName + "/" + name; - - if( !sectionNode.assertions.empty() || - !sectionNode.stdOut.empty() || - !sectionNode.stdErr.empty() ) { - XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); - if( className.empty() ) { - xml.writeAttribute( "classname", name ); - xml.writeAttribute( "name", "root" ); - } - else { - xml.writeAttribute( "classname", className ); - xml.writeAttribute( "name", name ); - } - xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) ); - - writeAssertions( sectionNode ); - - if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); - if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); - } - for( SectionNode::ChildSections::const_iterator - it = sectionNode.childSections.begin(), - itEnd = sectionNode.childSections.end(); - it != itEnd; - ++it ) - if( className.empty() ) - writeSection( name, "", **it ); - else - writeSection( className, name, **it ); - } - - void writeAssertions( SectionNode const& sectionNode ) { - for( SectionNode::Assertions::const_iterator - it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end(); - it != itEnd; - ++it ) - writeAssertion( *it ); - } - void writeAssertion( AssertionStats const& stats ) { - AssertionResult const& result = stats.assertionResult; - if( !result.isOk() ) { - std::string elementName; - switch( result.getResultType() ) { - case ResultWas::ThrewException: - elementName = "error"; - break; - case ResultWas::ExplicitFailure: - elementName = "failure"; - break; - case ResultWas::ExpressionFailed: - elementName = "failure"; - break; - case ResultWas::DidntThrowException: - elementName = "failure"; - break; - - // We should never see these here: - case ResultWas::Info: - case ResultWas::Warning: - case ResultWas::Ok: - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - elementName = "internalError"; - break; - } - - XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - - xml.writeAttribute( "message", result.getExpandedExpression() ); - xml.writeAttribute( "type", result.getTestMacroName() ); - - std::ostringstream oss; - if( !result.getMessage().empty() ) - oss << result.getMessage() << "\n"; - for( std::vector::const_iterator - it = stats.infoMessages.begin(), - itEnd = stats.infoMessages.end(); - it != itEnd; - ++it ) - if( it->type == ResultWas::Info ) - oss << it->message << "\n"; - - oss << "at " << result.getSourceInfo(); - xml.writeText( oss.str(), false ); - } - } - - XmlWriter xml; - Timer suiteTimer; - std::ostringstream stdOutForSuite; - std::ostringstream stdErrForSuite; - unsigned int unexpectedExceptions; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_console.hpp -#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED - -#include - -namespace Catch { - - struct ConsoleReporter : StreamingReporterBase { - ConsoleReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_headerPrinted( false ) - {} - - virtual ~ConsoleReporter(); - static std::string getDescription() { - return "Reports test results as plain lines of text"; - } - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - lazyPrint(); - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - stream << std::endl; - return true; - } - - virtual void sectionStarting( SectionInfo const& _sectionInfo ) { - m_headerPrinted = false; - StreamingReporterBase::sectionStarting( _sectionInfo ); - } - virtual void sectionEnded( SectionStats const& _sectionStats ) { - if( _sectionStats.missingAssertions ) { - lazyPrint(); - Colour colour( Colour::ResultError ); - if( m_sectionStack.size() > 1 ) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - if( m_headerPrinted ) { - if( m_config->showDurations() == ShowDurations::Always ) - stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - m_headerPrinted = false; - } - else { - if( m_config->showDurations() == ShowDurations::Always ) - stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl; - } - StreamingReporterBase::sectionEnded( _sectionStats ); - } - - virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { - StreamingReporterBase::testCaseEnded( _testCaseStats ); - m_headerPrinted = false; - } - virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { - if( currentGroupInfo.used ) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals( _testGroupStats.totals ); - stream << "\n" << std::endl; - } - StreamingReporterBase::testGroupEnded( _testGroupStats ); - } - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotalsDivider( _testRunStats.totals ); - printTotals( _testRunStats.totals ); - stream << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ), - stats( _stats ), - result( _stats.assertionResult ), - colour( Colour::None ), - message( result.getMessage() ), - messages( _stats.infoMessages ), - printInfoMessages( _printInfoMessages ) - { - switch( result.getResultType() ) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } - else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if( _stats.infoMessages.size() == 1 ) - messageLabel = "with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with message"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if( _stats.infoMessages.size() == 1 ) - messageLabel = "explicitly with message"; - if( _stats.infoMessages.size() > 1 ) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if( stats.totals.assertions.total() > 0 ) { - if( result.isOk() ) - stream << "\n"; - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } - else { - stream << "\n"; - } - printMessage(); - } - - private: - void printResultType() const { - if( !passOrFail.empty() ) { - Colour colourGuard( colour ); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if( result.hasExpression() ) { - Colour colourGuard( Colour::OriginalExpression ); - stream << " "; - stream << result.getExpressionInMacro(); - stream << "\n"; - } - } - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - stream << "with expansion:\n"; - Colour colourGuard( Colour::ReconstructedExpression ); - stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n"; - } - } - void printMessage() const { - if( !messageLabel.empty() ) - stream << messageLabel << ":" << "\n"; - for( std::vector::const_iterator it = messages.begin(), itEnd = messages.end(); - it != itEnd; - ++it ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || it->type != ResultWas::Info ) - stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n"; - } - } - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; - }; - - void lazyPrint() { - - if( !currentTestRunInfo.used ) - lazyPrintRunInfo(); - if( !currentGroupInfo.used ) - lazyPrintGroupInfo(); - - if( !m_headerPrinted ) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; - } - } - void lazyPrintRunInfo() { - stream << "\n" << getLineOfChars<'~'>() << "\n"; - Colour colour( Colour::SecondaryText ); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion.majorVersion << "." - << libraryVersion.minorVersion << " b" - << libraryVersion.buildNumber; - if( libraryVersion.branchName != std::string( "master" ) ) - stream << " (" << libraryVersion.branchName << ")"; - stream << " host application.\n" - << "Run with -? for options\n\n"; - - currentTestRunInfo.used = true; - } - void lazyPrintGroupInfo() { - if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) { - printClosedHeader( "Group: " + currentGroupInfo->name ); - currentGroupInfo.used = true; - } - } - void printTestCaseAndSectionHeader() { - assert( !m_sectionStack.empty() ); - printOpenHeader( currentTestCaseInfo->name ); - - if( m_sectionStack.size() > 1 ) { - Colour colourGuard( Colour::Headers ); - - std::vector::const_iterator - it = m_sectionStack.begin()+1, // Skip first section (test case) - itEnd = m_sectionStack.end(); - for( ; it != itEnd; ++it ) - printHeaderString( it->name, 2 ); - } - - SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; - - if( !lineInfo.empty() ){ - stream << getLineOfChars<'-'>() << "\n"; - Colour colourGuard( Colour::FileName ); - stream << lineInfo << "\n"; - } - stream << getLineOfChars<'.'>() << "\n" << std::endl; - } - - void printClosedHeader( std::string const& _name ) { - printOpenHeader( _name ); - stream << getLineOfChars<'.'>() << "\n"; - } - void printOpenHeader( std::string const& _name ) { - stream << getLineOfChars<'-'>() << "\n"; - { - Colour colourGuard( Colour::Headers ); - printHeaderString( _name ); - } - } - - // if string has a : in first line will set indent to follow it on - // subsequent lines - void printHeaderString( std::string const& _string, std::size_t indent = 0 ) { - std::size_t i = _string.find( ": " ); - if( i != std::string::npos ) - i+=2; - else - i = 0; - stream << Text( _string, TextAttributes() - .setIndent( indent+i) - .setInitialIndent( indent ) ) << "\n"; - } - - struct SummaryColumn { - - SummaryColumn( std::string const& _label, Colour::Code _colour ) - : label( _label ), - colour( _colour ) - {} - SummaryColumn addRow( std::size_t count ) { - std::ostringstream oss; - oss << count; - std::string row = oss.str(); - for( std::vector::iterator it = rows.begin(); it != rows.end(); ++it ) { - while( it->size() < row.size() ) - *it = " " + *it; - while( it->size() > row.size() ) - row = " " + row; - } - rows.push_back( row ); - return *this; - } - - std::string label; - Colour::Code colour; - std::vector rows; - - }; - - void printTotals( Totals const& totals ) { - if( totals.testCases.total() == 0 ) { - stream << Colour( Colour::Warning ) << "No tests ran\n"; - } - else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) { - stream << Colour( Colour::ResultSuccess ) << "All tests passed"; - stream << " (" - << pluralise( totals.assertions.passed, "assertion" ) << " in " - << pluralise( totals.testCases.passed, "test case" ) << ")" - << "\n"; - } - else { - - std::vector columns; - columns.push_back( SummaryColumn( "", Colour::None ) - .addRow( totals.testCases.total() ) - .addRow( totals.assertions.total() ) ); - columns.push_back( SummaryColumn( "passed", Colour::Success ) - .addRow( totals.testCases.passed ) - .addRow( totals.assertions.passed ) ); - columns.push_back( SummaryColumn( "failed", Colour::ResultError ) - .addRow( totals.testCases.failed ) - .addRow( totals.assertions.failed ) ); - columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure ) - .addRow( totals.testCases.failedButOk ) - .addRow( totals.assertions.failedButOk ) ); - - printSummaryRow( "test cases", columns, 0 ); - printSummaryRow( "assertions", columns, 1 ); - } - } - void printSummaryRow( std::string const& label, std::vector const& cols, std::size_t row ) { - for( std::vector::const_iterator it = cols.begin(); it != cols.end(); ++it ) { - std::string value = it->rows[row]; - if( it->label.empty() ) { - stream << label << ": "; - if( value != "0" ) - stream << value; - else - stream << Colour( Colour::Warning ) << "- none -"; - } - else if( value != "0" ) { - stream << Colour( Colour::LightGrey ) << " | "; - stream << Colour( it->colour ) - << value << " " << it->label; - } - } - stream << "\n"; - } - - static std::size_t makeRatio( std::size_t number, std::size_t total ) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0; - return ( ratio == 0 && number > 0 ) ? 1 : ratio; - } - static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) { - if( i > j && i > k ) - return i; - else if( j > k ) - return j; - else - return k; - } - - void printTotalsDivider( Totals const& totals ) { - if( totals.testCases.total() > 0 ) { - std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() ); - std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() ); - std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() ); - while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )++; - while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 ) - findMax( failedRatio, failedButOkRatio, passedRatio )--; - - stream << Colour( Colour::Error ) << std::string( failedRatio, '=' ); - stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' ); - if( totals.testCases.allPassed() ) - stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' ); - else - stream << Colour( Colour::Success ) << std::string( passedRatio, '=' ); - } - else { - stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' ); - } - stream << "\n"; - } - void printSummaryDivider() { - stream << getLineOfChars<'-'>() << "\n"; - } - template - static char const* getLineOfChars() { - static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; - if( !*line ) { - memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); - line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; - } - return line; - } - - private: - bool m_headerPrinted; - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter ) - -} // end namespace Catch - -// #included from: ../reporters/catch_reporter_compact.hpp -#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED - -namespace Catch { - - struct CompactReporter : StreamingReporterBase { - - CompactReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ) - {} - - virtual ~CompactReporter(); - - static std::string getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } - - virtual ReporterPreferences getPreferences() const { - ReporterPreferences prefs; - prefs.shouldRedirectStdOut = false; - return prefs; - } - - virtual void noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << "'" << std::endl; - } - - virtual void assertionStarting( AssertionInfo const& ) { - } - - virtual bool assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; - - bool printInfoMessages = true; - - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } - - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); - - stream << std::endl; - return true; - } - - virtual void testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( _testRunStats.totals ); - stream << "\n" << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } - - private: - class AssertionPrinter { - void operator= ( AssertionPrinter const& ); - public: - AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages ) - : stream( _stream ) - , stats( _stats ) - , result( _stats.assertionResult ) - , messages( _stats.infoMessages ) - , itMessage( _stats.infoMessages.begin() ) - , printInfoMessages( _printInfoMessages ) - {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch( result.getResultType() ) { - case ResultWas::Ok: - printResultType( Colour::ResultSuccess, passedString() ); - printOriginalExpression(); - printReconstructedExpression(); - if ( ! result.hasExpression() ) - printRemainingMessages( Colour::None ); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if( result.isOk() ) - printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) ); - else - printResultType( Colour::Error, failedString() ); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType( Colour::Error, failedString() ); - printIssue( "unexpected exception with message:" ); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType( Colour::Error, failedString() ); - printIssue( "expected exception, got none" ); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType( Colour::None, "info" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType( Colour::None, "warning" ); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType( Colour::Error, failedString() ); - printIssue( "explicitly" ); - printRemainingMessages( Colour::None ); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType( Colour::Error, "** internal error **" ); - break; - } - } - - private: - // Colour::LightGrey - - static Colour::Code dimColour() { return Colour::FileName; } - -#ifdef CATCH_PLATFORM_MAC - static const char* failedString() { return "FAILED"; } - static const char* passedString() { return "PASSED"; } -#else - static const char* failedString() { return "failed"; } - static const char* passedString() { return "passed"; } -#endif - - void printSourceInfo() const { - Colour colourGuard( Colour::FileName ); - stream << result.getSourceInfo() << ":"; - } - - void printResultType( Colour::Code colour, std::string passOrFail ) const { - if( !passOrFail.empty() ) { - { - Colour colourGuard( colour ); - stream << " " << passOrFail; - } - stream << ":"; - } - } - - void printIssue( std::string issue ) const { - stream << " " << issue; - } - - void printExpressionWas() { - if( result.hasExpression() ) { - stream << ";"; - { - Colour colour( dimColour() ); - stream << " expression was:"; - } - printOriginalExpression(); - } - } - - void printOriginalExpression() const { - if( result.hasExpression() ) { - stream << " " << result.getExpression(); - } - } - - void printReconstructedExpression() const { - if( result.hasExpandedExpression() ) { - { - Colour colour( dimColour() ); - stream << " for: "; - } - stream << result.getExpandedExpression(); - } - } - - void printMessage() { - if ( itMessage != messages.end() ) { - stream << " '" << itMessage->message << "'"; - ++itMessage; - } - } - - void printRemainingMessages( Colour::Code colour = dimColour() ) { - if ( itMessage == messages.end() ) - return; - - // using messages.end() directly yields compilation error: - std::vector::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast( std::distance( itMessage, itEnd ) ); - - { - Colour colourGuard( colour ); - stream << " with " << pluralise( N, "message" ) << ":"; - } - - for(; itMessage != itEnd; ) { - // If this assertion is a warning ignore any INFO messages - if( printInfoMessages || itMessage->type != ResultWas::Info ) { - stream << " '" << itMessage->message << "'"; - if ( ++itMessage != itEnd ) { - Colour colourGuard( dimColour() ); - stream << " and"; - } - } - } - } - - private: - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; - }; - - // Colour, message variants: - // - white: No tests ran. - // - red: Failed [both/all] N test cases, failed [both/all] M assertions. - // - white: Passed [both/all] N test cases (no assertions). - // - red: Failed N tests cases, failed M assertions. - // - green: Passed [both/all] N tests cases with M assertions. - - std::string bothOrAll( std::size_t count ) const { - return count == 1 ? "" : count == 2 ? "both " : "all " ; - } - - void printTotals( const Totals& totals ) const { - if( totals.testCases.total() == 0 ) { - stream << "No tests ran."; - } - else if( totals.testCases.failed == totals.testCases.total() ) { - Colour colour( Colour::ResultError ); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll( totals.assertions.failed ) : ""; - stream << - "Failed " << bothOrAll( totals.testCases.failed ) - << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << qualify_assertions_failed << - pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else if( totals.assertions.total() == 0 ) { - stream << - "Passed " << bothOrAll( totals.testCases.total() ) - << pluralise( totals.testCases.total(), "test case" ) - << " (no assertions)."; - } - else if( totals.assertions.failed ) { - Colour colour( Colour::ResultError ); - stream << - "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", " - "failed " << pluralise( totals.assertions.failed, "assertion" ) << "."; - } - else { - Colour colour( Colour::ResultSuccess ); - stream << - "Passed " << bothOrAll( totals.testCases.passed ) - << pluralise( totals.testCases.passed, "test case" ) << - " with " << pluralise( totals.assertions.passed, "assertion" ) << "."; - } - } - }; - - INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter ) - -} // end namespace Catch - -namespace Catch { - NonCopyable::~NonCopyable() {} - IShared::~IShared() {} - StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} - IContext::~IContext() {} - IResultCapture::~IResultCapture() {} - ITestCase::~ITestCase() {} - ITestCaseRegistry::~ITestCaseRegistry() {} - IRegistryHub::~IRegistryHub() {} - IMutableRegistryHub::~IMutableRegistryHub() {} - IExceptionTranslator::~IExceptionTranslator() {} - IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {} - IReporter::~IReporter() {} - IReporterFactory::~IReporterFactory() {} - IReporterRegistry::~IReporterRegistry() {} - IStreamingReporter::~IStreamingReporter() {} - AssertionStats::~AssertionStats() {} - SectionStats::~SectionStats() {} - TestCaseStats::~TestCaseStats() {} - TestGroupStats::~TestGroupStats() {} - TestRunStats::~TestRunStats() {} - CumulativeReporterBase::SectionNode::~SectionNode() {} - CumulativeReporterBase::~CumulativeReporterBase() {} - - StreamingReporterBase::~StreamingReporterBase() {} - ConsoleReporter::~ConsoleReporter() {} - CompactReporter::~CompactReporter() {} - IRunner::~IRunner() {} - IMutableContext::~IMutableContext() {} - IConfig::~IConfig() {} - XmlReporter::~XmlReporter() {} - JunitReporter::~JunitReporter() {} - TestRegistry::~TestRegistry() {} - FreeFunctionTestCase::~FreeFunctionTestCase() {} - IGeneratorInfo::~IGeneratorInfo() {} - IGeneratorsForTest::~IGeneratorsForTest() {} - TestSpec::Pattern::~Pattern() {} - TestSpec::NamePattern::~NamePattern() {} - TestSpec::TagPattern::~TagPattern() {} - TestSpec::ExcludedPattern::~ExcludedPattern() {} - - Matchers::Impl::StdString::Equals::~Equals() {} - Matchers::Impl::StdString::Contains::~Contains() {} - Matchers::Impl::StdString::StartsWith::~StartsWith() {} - Matchers::Impl::StdString::EndsWith::~EndsWith() {} - - void Config::dummy() {} - - INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) -} - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif - -#ifdef CATCH_CONFIG_MAIN -// #included from: internal/catch_default_main.hpp -#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED - -#ifndef __OBJC__ - -// Standard C/C++ main entry point -int main (int argc, char * const argv[]) { - return Catch::Session().run( argc, argv ); -} - -#else // __OBJC__ - -// Objective-C entry point -int main (int argc, char * const argv[]) { -#if !CATCH_ARC_ENABLED - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -#endif - - Catch::registerTestMethods(); - int result = Catch::Session().run( argc, (char* const*)argv ); - -#if !CATCH_ARC_ENABLED - [pool drain]; -#endif - - return result; -} - -#endif // __OBJC__ - -#endif - -#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED -# undef CLARA_CONFIG_MAIN -#endif - -////// - -// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ -#ifdef CATCH_CONFIG_PREFIX_ALL - -#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE" ) -#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE" ) - -#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS" ) -#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS" ) -#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW" ) - -#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK" ) -#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE" ) -#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF" ) -#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE" ) -#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL" ) - -#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS" ) -#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS" ) -#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" ) -#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" ) - -#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg ) -#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" ) -#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) -#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ ) - #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ ) -#else - #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg ) - #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg ) -#endif -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags ) -#endif -#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" ) -#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" ) -#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" ) -#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" ) -#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" ) - -// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required -#else - -#define REQUIRE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal, "REQUIRE" ) -#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE" ) - -#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::Normal, "REQUIRE_THROWS" ) -#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS" ) -#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW" ) - -#define CHECK( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK" ) -#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE" ) -#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF" ) -#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE" ) -#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL" ) - -#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS" ) -#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS" ) -#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW" ) - -#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" ) -#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" ) - -#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define WARN( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg ) -#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" ) -#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) -#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" ) - -#ifdef CATCH_CONFIG_VARIADIC_MACROS - #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) - #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) - #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) - #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) - #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ ) - #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ ) -#else - #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description ) - #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description ) - #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description ) - #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description ) - #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg ) - #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg ) -#endif -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" ) - -#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) -#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) - -#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr ) - -#endif - -#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) - -// "BDD-style" convenience wrappers -#ifdef CATCH_CONFIG_VARIADIC_MACROS -#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) -#else -#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags ) -#endif -#define GIVEN( desc ) SECTION( " Given: " desc, "" ) -#define WHEN( desc ) SECTION( " When: " desc, "" ) -#define AND_WHEN( desc ) SECTION( "And when: " desc, "" ) -#define THEN( desc ) SECTION( " Then: " desc, "" ) -#define AND_THEN( desc ) SECTION( " And: " desc, "" ) - -using Catch::Detail::Approx; - -// #included from: internal/catch_reenable_warnings.h - -#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2D.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2D.h deleted file mode 100644 index d8f47dcb9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2D.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BOX2D_H -#define BOX2D_H - -/** -\mainpage Box2D API Documentation - -\section intro_sec Getting Started - -For documentation please see http://box2d.org/documentation.html - -For discussion please visit http://box2d.org/forum -*/ - -// These include files constitute the main Box2D API - -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2DConfig.cmake b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2DConfig.cmake deleted file mode 100644 index f3d7fd044..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Box2DConfig.cmake +++ /dev/null @@ -1,3 +0,0 @@ -get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(${SELF_DIR}/Box2D-targets.cmake) -get_filename_component(Box2D_INCLUDE_DIRS "${SELF_DIR}/../../include" ABSOLUTE) diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/CMakeLists.txt deleted file mode 100644 index 1fe9e5756..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/CMakeLists.txt +++ /dev/null @@ -1,177 +0,0 @@ -set(BOX2D_Collision_SRCS - Collision/b2BroadPhase.cpp - Collision/b2CollideCircle.cpp - Collision/b2CollidePolygon.cpp - Collision/b2Collision.cpp - Collision/b2Distance.cpp - Collision/b2DynamicTree.cpp - Collision/b2TimeOfImpact.cpp -) -set(BOX2D_Collision_HDRS - Collision/b2BroadPhase.h - Collision/b2Collision.h - Collision/b2Distance.h - Collision/b2DynamicTree.h - Collision/b2TimeOfImpact.h -) -set(BOX2D_Shapes_SRCS - Collision/Shapes/b2CircleShape.cpp - Collision/Shapes/b2PolygonShape.cpp -) -set(BOX2D_Shapes_HDRS - Collision/Shapes/b2CircleShape.h - Collision/Shapes/b2PolygonShape.h - Collision/Shapes/b2Shape.h -) -set(BOX2D_Common_SRCS - Common/b2BlockAllocator.cpp - Common/b2Math.cpp - Common/b2Settings.cpp - Common/b2StackAllocator.cpp -) -set(BOX2D_Common_HDRS - Common/b2BlockAllocator.h - Common/b2Math.h - Common/b2Settings.h - Common/b2StackAllocator.h -) -set(BOX2D_Dynamics_SRCS - Dynamics/b2Body.cpp - Dynamics/b2ContactManager.cpp - Dynamics/b2Fixture.cpp - Dynamics/b2Island.cpp - Dynamics/b2World.cpp - Dynamics/b2WorldCallbacks.cpp -) -set(BOX2D_Dynamics_HDRS - Dynamics/b2Body.h - Dynamics/b2ContactManager.h - Dynamics/b2Fixture.h - Dynamics/b2Island.h - Dynamics/b2TimeStep.h - Dynamics/b2World.h - Dynamics/b2WorldCallbacks.h -) -set(BOX2D_Contacts_SRCS - Dynamics/Contacts/b2CircleContact.cpp - Dynamics/Contacts/b2Contact.cpp - Dynamics/Contacts/b2ContactSolver.cpp - Dynamics/Contacts/b2PolygonAndCircleContact.cpp - Dynamics/Contacts/b2PolygonContact.cpp - Dynamics/Contacts/b2TOISolver.cpp -) -set(BOX2D_Contacts_HDRS - Dynamics/Contacts/b2CircleContact.h - Dynamics/Contacts/b2Contact.h - Dynamics/Contacts/b2ContactSolver.h - Dynamics/Contacts/b2PolygonAndCircleContact.h - Dynamics/Contacts/b2PolygonContact.h - Dynamics/Contacts/b2TOISolver.h -) -set(BOX2D_Joints_SRCS - Dynamics/Joints/b2DistanceJoint.cpp - Dynamics/Joints/b2FrictionJoint.cpp - Dynamics/Joints/b2GearJoint.cpp - Dynamics/Joints/b2Joint.cpp - Dynamics/Joints/b2LineJoint.cpp - Dynamics/Joints/b2MouseJoint.cpp - Dynamics/Joints/b2PrismaticJoint.cpp - Dynamics/Joints/b2PulleyJoint.cpp - Dynamics/Joints/b2RevoluteJoint.cpp - Dynamics/Joints/b2WeldJoint.cpp -) -set(BOX2D_Joints_HDRS - Dynamics/Joints/b2DistanceJoint.h - Dynamics/Joints/b2FrictionJoint.h - Dynamics/Joints/b2GearJoint.h - Dynamics/Joints/b2Joint.h - Dynamics/Joints/b2LineJoint.h - Dynamics/Joints/b2MouseJoint.h - Dynamics/Joints/b2PrismaticJoint.h - Dynamics/Joints/b2PulleyJoint.h - Dynamics/Joints/b2RevoluteJoint.h - Dynamics/Joints/b2WeldJoint.h -) -set(BOX2D_General_HDRS - Box2D.h -) -include_directories( ../ ) - -if(BOX2D_BUILD_SHARED) - add_library(Box2D_shared SHARED - ${BOX2D_General_HDRS} - ${BOX2D_Joints_SRCS} - ${BOX2D_Joints_HDRS} - ${BOX2D_Contacts_SRCS} - ${BOX2D_Contacts_HDRS} - ${BOX2D_Dynamics_SRCS} - ${BOX2D_Dynamics_HDRS} - ${BOX2D_Common_SRCS} - ${BOX2D_Common_HDRS} - ${BOX2D_Shapes_SRCS} - ${BOX2D_Shapes_HDRS} - ${BOX2D_Collision_SRCS} - ${BOX2D_Collision_HDRS} - ) - set_target_properties(Box2D_shared PROPERTIES - OUTPUT_NAME "Box2D" - CLEAN_DIRECT_OUTPUT 1 - VERSION ${BOX2D_VERSION} - ) -endif() - -if(BOX2D_BUILD_STATIC) - add_library(Box2D STATIC - ${BOX2D_General_HDRS} - ${BOX2D_Joints_SRCS} - ${BOX2D_Joints_HDRS} - ${BOX2D_Contacts_SRCS} - ${BOX2D_Contacts_HDRS} - ${BOX2D_Dynamics_SRCS} - ${BOX2D_Dynamics_HDRS} - ${BOX2D_Common_SRCS} - ${BOX2D_Common_HDRS} - ${BOX2D_Shapes_SRCS} - ${BOX2D_Shapes_HDRS} - ${BOX2D_Collision_SRCS} - ${BOX2D_Collision_HDRS} - ) - set_target_properties(Box2D PROPERTIES - CLEAN_DIRECT_OUTPUT 1 - VERSION ${BOX2D_VERSION} - ) -endif() - -if(MSVC) - # These are used to create visual studio folders. - source_group(Collision FILES ${BOX2D_Collision_SRCS} ${BOX2D_Collision_HDRS}) - source_group(Collision\\Shapes FILES ${BOX2D_Shapes_SRCS} ${BOX2D_Shapes_HDRS}) - source_group(Common FILES ${BOX2D_Common_SRCS} ${BOX2D_Common_HDRS}) - source_group(Dynamics FILES ${BOX2D_Dynamics_SRCS} ${BOX2D_Dynamics_HDRS}) - source_group(Dynamics\\Contacts FILES ${BOX2D_Contacts_SRCS} ${BOX2D_Contacts_HDRS}) - source_group(Dynamics\\Joints FILES ${BOX2D_Joints_SRCS} ${BOX2D_Joints_HDRS}) - source_group(Include FILES ${BOX2D_General_HDRS}) -endif() - -if(BOX2D_INSTALL) - # install headers - install(FILES ${BOX2D_General_HDRS} DESTINATION include/Box2D) - install(FILES ${BOX2D_Collision_HDRS} DESTINATION include/Box2D/Collision) - install(FILES ${BOX2D_Shapes_HDRS} DESTINATION include/Box2D/Collision/Shapes) - install(FILES ${BOX2D_Common_HDRS} DESTINATION include/Box2D/Common) - install(FILES ${BOX2D_Dynamics_HDRS} DESTINATION include/Box2D/Dynamics) - install(FILES ${BOX2D_Contacts_HDRS} DESTINATION include/Box2D/Dynamics/Contacts) - install(FILES ${BOX2D_Joints_HDRS} DESTINATION include/Box2D/Dynamics/Joints) - - # install libraries - if(BOX2D_BUILD_SHARED) - install(TARGETS Box2D_shared EXPORT Box2D-targets DESTINATION lib) - endif() - if(BOX2D_BUILD_STATIC) - install(TARGETS Box2D EXPORT Box2D-targets DESTINATION lib) - endif() - - # install build system hooks for third-party apps - install(EXPORT Box2D-targets DESTINATION lib/Box2D) - install(FILES Box2DConfig.cmake DESTINATION lib/Box2D) -endif(BOX2D_INSTALL) \ No newline at end of file diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.cpp deleted file mode 100644 index 4707f44b5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2CircleShape)); - b2CircleShape* clone = new (mem) b2CircleShape; - *clone = *this; - return clone; -} - -bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const -{ - b2Vec2 center = transform.position + b2Mul(transform.R, m_p); - b2Vec2 d = p - center; - return b2Dot(d, d) <= m_radius * m_radius; -} - -// Collision Detection in Interactive 3D Environments by Gino van den Bergen -// From Section 3.1.2 -// x = s + a * r -// norm(x) = radius -bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const -{ - b2Vec2 position = transform.position + b2Mul(transform.R, m_p); - b2Vec2 s = input.p1 - position; - float32 b = b2Dot(s, s) - m_radius * m_radius; - - // Solve quadratic equation. - b2Vec2 r = input.p2 - input.p1; - float32 c = b2Dot(s, r); - float32 rr = b2Dot(r, r); - float32 sigma = c * c - rr * b; - - // Check for negative discriminant and short segment. - if (sigma < 0.0f || rr < b2_epsilon) - { - return false; - } - - // Find the point of intersection of the line with the circle. - float32 a = -(c + b2Sqrt(sigma)); - - // Is the intersection point on the segment? - if (0.0f <= a && a <= input.maxFraction * rr) - { - a /= rr; - output->fraction = a; - output->normal = s + a * r; - output->normal.Normalize(); - return true; - } - - return false; -} - -void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform) const -{ - b2Vec2 p = transform.position + b2Mul(transform.R, m_p); - aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); - aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); -} - -void b2CircleShape::ComputeMass(b2MassData* massData, float32 density) const -{ - massData->mass = density * b2_pi * m_radius * m_radius; - massData->center = m_p; - - // inertia about the local origin - massData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_p, m_p)); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.h deleted file mode 100644 index cfe15406f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2CircleShape.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CIRCLE_SHAPE_H -#define B2_CIRCLE_SHAPE_H - -#include - -/// A circle shape. -class b2CircleShape : public b2Shape -{ -public: - b2CircleShape(); - - /// Implement b2Shape. - b2Shape* Clone(b2BlockAllocator* allocator) const; - - /// Implement b2Shape. - bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; - - /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; - - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData, float32 density) const; - - /// Get the supporting vertex index in the given direction. - int32 GetSupport(const b2Vec2& d) const; - - /// Get the supporting vertex in the given direction. - const b2Vec2& GetSupportVertex(const b2Vec2& d) const; - - /// Get the vertex count. - int32 GetVertexCount() const { return 1; } - - /// Get a vertex by index. Used by b2Distance. - const b2Vec2& GetVertex(int32 index) const; - - /// Position - b2Vec2 m_p; -}; - -inline b2CircleShape::b2CircleShape() -{ - m_type = e_circle; - m_radius = 0.0f; - m_p.SetZero(); -} - -inline int32 b2CircleShape::GetSupport(const b2Vec2 &d) const -{ - B2_NOT_USED(d); - return 0; -} - -inline const b2Vec2& b2CircleShape::GetSupportVertex(const b2Vec2 &d) const -{ - B2_NOT_USED(d); - return m_p; -} - -inline const b2Vec2& b2CircleShape::GetVertex(int32 index) const -{ - B2_NOT_USED(index); - b2Assert(index == 0); - return m_p; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.cpp deleted file mode 100644 index 7dd07ff11..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -b2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2PolygonShape)); - b2PolygonShape* clone = new (mem) b2PolygonShape; - *clone = *this; - return clone; -} - -void b2PolygonShape::SetAsBox(float32 hx, float32 hy) -{ - m_vertexCount = 4; - m_vertices[0].Set(-hx, -hy); - m_vertices[1].Set( hx, -hy); - m_vertices[2].Set( hx, hy); - m_vertices[3].Set(-hx, hy); - m_normals[0].Set(0.0f, -1.0f); - m_normals[1].Set(1.0f, 0.0f); - m_normals[2].Set(0.0f, 1.0f); - m_normals[3].Set(-1.0f, 0.0f); - m_centroid.SetZero(); -} - -void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle) -{ - m_vertexCount = 4; - m_vertices[0].Set(-hx, -hy); - m_vertices[1].Set( hx, -hy); - m_vertices[2].Set( hx, hy); - m_vertices[3].Set(-hx, hy); - m_normals[0].Set(0.0f, -1.0f); - m_normals[1].Set(1.0f, 0.0f); - m_normals[2].Set(0.0f, 1.0f); - m_normals[3].Set(-1.0f, 0.0f); - m_centroid = center; - - b2Transform xf; - xf.position = center; - xf.R.Set(angle); - - // Transform vertices and normals. - for (int32 i = 0; i < m_vertexCount; ++i) - { - m_vertices[i] = b2Mul(xf, m_vertices[i]); - m_normals[i] = b2Mul(xf.R, m_normals[i]); - } -} - -void b2PolygonShape::SetAsEdge(const b2Vec2& v1, const b2Vec2& v2) -{ - m_vertexCount = 2; - m_vertices[0] = v1; - m_vertices[1] = v2; - m_centroid = 0.5f * (v1 + v2); - m_normals[0] = b2Cross(v2 - v1, 1.0f); - m_normals[0].Normalize(); - m_normals[1] = -m_normals[0]; -} - -static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) -{ - b2Assert(count >= 2); - - b2Vec2 c; c.Set(0.0f, 0.0f); - float32 area = 0.0f; - - if (count == 2) - { - c = 0.5f * (vs[0] + vs[1]); - return c; - } - - // pRef is the reference point for forming triangles. - // It's location doesn't change the result (except for rounding error). - b2Vec2 pRef(0.0f, 0.0f); -#if 0 - // This code would put the reference point inside the polygon. - for (int32 i = 0; i < count; ++i) - { - pRef += vs[i]; - } - pRef *= 1.0f / count; -#endif - - const float32 inv3 = 1.0f / 3.0f; - - for (int32 i = 0; i < count; ++i) - { - // Triangle vertices. - b2Vec2 p1 = pRef; - b2Vec2 p2 = vs[i]; - b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; - - b2Vec2 e1 = p2 - p1; - b2Vec2 e2 = p3 - p1; - - float32 D = b2Cross(e1, e2); - - float32 triangleArea = 0.5f * D; - area += triangleArea; - - // Area weighted centroid - c += triangleArea * inv3 * (p1 + p2 + p3); - } - - // Centroid - b2Assert(area > b2_epsilon); - c *= 1.0f / area; - return c; -} - -void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) -{ - b2Assert(2 <= count && count <= b2_maxPolygonVertices); - m_vertexCount = count; - - // Copy vertices. - for (int32 i = 0; i < m_vertexCount; ++i) - { - m_vertices[i] = vertices[i]; - } - - // Compute normals. Ensure the edges have non-zero length. - for (int32 i = 0; i < m_vertexCount; ++i) - { - int32 i1 = i; - int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; - b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; - b2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon); - m_normals[i] = b2Cross(edge, 1.0f); - m_normals[i].Normalize(); - } - -#ifdef _DEBUG - // Ensure the polygon is convex and the interior - // is to the left of each edge. - for (int32 i = 0; i < m_vertexCount; ++i) - { - int32 i1 = i; - int32 i2 = i + 1 < m_vertexCount ? i + 1 : 0; - b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; - - for (int32 j = 0; j < m_vertexCount; ++j) - { - // Don't check vertices on the current edge. - if (j == i1 || j == i2) - { - continue; - } - - b2Vec2 r = m_vertices[j] - m_vertices[i1]; - - // Your polygon is non-convex (it has an indentation) or - // has colinear edges. - float32 s = b2Cross(edge, r); - b2Assert(s > 0.0f); - } - } -#endif - - // Compute the polygon centroid. - m_centroid = ComputeCentroid(m_vertices, m_vertexCount); -} - -bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const -{ - b2Vec2 pLocal = b2MulT(xf.R, p - xf.position); - - for (int32 i = 0; i < m_vertexCount; ++i) - { - float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); - if (dot > 0.0f) - { - return false; - } - } - - return true; -} - -bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& xf) const -{ - // Put the ray into the polygon's frame of reference. - b2Vec2 p1 = b2MulT(xf.R, input.p1 - xf.position); - b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); - b2Vec2 d = p2 - p1; - - if (m_vertexCount == 2) - { - b2Vec2 v1 = m_vertices[0]; - b2Vec2 v2 = m_vertices[1]; - b2Vec2 normal = m_normals[0]; - - // q = p1 + t * d - // dot(normal, q - v1) = 0 - // dot(normal, p1 - v1) + t * dot(normal, d) = 0 - float32 numerator = b2Dot(normal, v1 - p1); - float32 denominator = b2Dot(normal, d); - - if (denominator == 0.0f) - { - return false; - } - - float32 t = numerator / denominator; - if (t < 0.0f || 1.0f < t) - { - return false; - } - - b2Vec2 q = p1 + t * d; - - // q = v1 + s * r - // s = dot(q - v1, r) / dot(r, r) - b2Vec2 r = v2 - v1; - float32 rr = b2Dot(r, r); - if (rr == 0.0f) - { - return false; - } - - float32 s = b2Dot(q - v1, r) / rr; - if (s < 0.0f || 1.0f < s) - { - return false; - } - - output->fraction = t; - if (numerator > 0.0f) - { - output->normal = -normal; - } - else - { - output->normal = normal; - } - return true; - } - else - { - float32 lower = 0.0f, upper = input.maxFraction; - - int32 index = -1; - - for (int32 i = 0; i < m_vertexCount; ++i) - { - // p = p1 + a * d - // dot(normal, p - v) = 0 - // dot(normal, p1 - v) + a * dot(normal, d) = 0 - float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); - float32 denominator = b2Dot(m_normals[i], d); - - if (denominator == 0.0f) - { - if (numerator < 0.0f) - { - return false; - } - } - else - { - // Note: we want this predicate without division: - // lower < numerator / denominator, where denominator < 0 - // Since denominator < 0, we have to flip the inequality: - // lower < numerator / denominator <==> denominator * lower > numerator. - if (denominator < 0.0f && numerator < lower * denominator) - { - // Increase lower. - // The segment enters this half-space. - lower = numerator / denominator; - index = i; - } - else if (denominator > 0.0f && numerator < upper * denominator) - { - // Decrease upper. - // The segment exits this half-space. - upper = numerator / denominator; - } - } - - // The use of epsilon here causes the assert on lower to trip - // in some cases. Apparently the use of epsilon was to make edge - // shapes work, but now those are handled separately. - //if (upper < lower - b2_epsilon) - if (upper < lower) - { - return false; - } - } - - b2Assert(0.0f <= lower && lower <= input.maxFraction); - - if (index >= 0) - { - output->fraction = lower; - output->normal = b2Mul(xf.R, m_normals[index]); - return true; - } - } - - return false; -} - -void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf) const -{ - b2Vec2 lower = b2Mul(xf, m_vertices[0]); - b2Vec2 upper = lower; - - for (int32 i = 1; i < m_vertexCount; ++i) - { - b2Vec2 v = b2Mul(xf, m_vertices[i]); - lower = b2Min(lower, v); - upper = b2Max(upper, v); - } - - b2Vec2 r(m_radius, m_radius); - aabb->lowerBound = lower - r; - aabb->upperBound = upper + r; -} - -void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const -{ - // Polygon mass, centroid, and inertia. - // Let rho be the polygon density in mass per unit area. - // Then: - // mass = rho * int(dA) - // centroid.x = (1/mass) * rho * int(x * dA) - // centroid.y = (1/mass) * rho * int(y * dA) - // I = rho * int((x*x + y*y) * dA) - // - // We can compute these integrals by summing all the integrals - // for each triangle of the polygon. To evaluate the integral - // for a single triangle, we make a change of variables to - // the (u,v) coordinates of the triangle: - // x = x0 + e1x * u + e2x * v - // y = y0 + e1y * u + e2y * v - // where 0 <= u && 0 <= v && u + v <= 1. - // - // We integrate u from [0,1-v] and then v from [0,1]. - // We also need to use the Jacobian of the transformation: - // D = cross(e1, e2) - // - // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3) - // - // The rest of the derivation is handled by computer algebra. - - b2Assert(m_vertexCount >= 2); - - // A line segment has zero mass. - if (m_vertexCount == 2) - { - massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); - massData->mass = 0.0f; - massData->I = 0.0f; - return; - } - - b2Vec2 center; center.Set(0.0f, 0.0f); - float32 area = 0.0f; - float32 I = 0.0f; - - // pRef is the reference point for forming triangles. - // It's location doesn't change the result (except for rounding error). - b2Vec2 pRef(0.0f, 0.0f); -#if 0 - // This code would put the reference point inside the polygon. - for (int32 i = 0; i < m_vertexCount; ++i) - { - pRef += m_vertices[i]; - } - pRef *= 1.0f / count; -#endif - - const float32 k_inv3 = 1.0f / 3.0f; - - for (int32 i = 0; i < m_vertexCount; ++i) - { - // Triangle vertices. - b2Vec2 p1 = pRef; - b2Vec2 p2 = m_vertices[i]; - b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; - - b2Vec2 e1 = p2 - p1; - b2Vec2 e2 = p3 - p1; - - float32 D = b2Cross(e1, e2); - - float32 triangleArea = 0.5f * D; - area += triangleArea; - - // Area weighted centroid - center += triangleArea * k_inv3 * (p1 + p2 + p3); - - float32 px = p1.x, py = p1.y; - float32 ex1 = e1.x, ey1 = e1.y; - float32 ex2 = e2.x, ey2 = e2.y; - - float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; - float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; - - I += D * (intx2 + inty2); - } - - // Total mass - massData->mass = density * area; - - // Center of mass - b2Assert(area > b2_epsilon); - center *= 1.0f / area; - massData->center = center; - - // Inertia tensor relative to the local origin. - massData->I = density * I; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.h deleted file mode 100644 index b35492315..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2PolygonShape.h +++ /dev/null @@ -1,132 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_POLYGON_SHAPE_H -#define B2_POLYGON_SHAPE_H - -#include - -/// A convex polygon. It is assumed that the interior of the polygon is to -/// the left of each edge. -class b2PolygonShape : public b2Shape -{ -public: - b2PolygonShape(); - - /// Implement b2Shape. - b2Shape* Clone(b2BlockAllocator* allocator) const; - - /// Copy vertices. This assumes the vertices define a convex polygon. - /// It is assumed that the exterior is the the right of each edge. - void Set(const b2Vec2* vertices, int32 vertexCount); - - /// Build vertices to represent an axis-aligned box. - /// @param hx the half-width. - /// @param hy the half-height. - void SetAsBox(float32 hx, float32 hy); - - /// Build vertices to represent an oriented box. - /// @param hx the half-width. - /// @param hy the half-height. - /// @param center the center of the box in local coordinates. - /// @param angle the rotation of the box in local coordinates. - void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); - - /// Set this as a single edge. - void SetAsEdge(const b2Vec2& v1, const b2Vec2& v2); - - /// @see b2Shape::TestPoint - bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; - - /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; - - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData, float32 density) const; - - /// Get the supporting vertex index in the given direction. - int32 GetSupport(const b2Vec2& d) const; - - /// Get the supporting vertex in the given direction. - const b2Vec2& GetSupportVertex(const b2Vec2& d) const; - - /// Get the vertex count. - int32 GetVertexCount() const { return m_vertexCount; } - - /// Get a vertex by index. - const b2Vec2& GetVertex(int32 index) const; - - b2Vec2 m_centroid; - b2Vec2 m_vertices[b2_maxPolygonVertices]; - b2Vec2 m_normals[b2_maxPolygonVertices]; - int32 m_vertexCount; -}; - -inline b2PolygonShape::b2PolygonShape() -{ - m_type = e_polygon; - m_radius = b2_polygonRadius; - m_vertexCount = 0; - m_centroid.SetZero(); -} - -inline int32 b2PolygonShape::GetSupport(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return bestIndex; -} - -inline const b2Vec2& b2PolygonShape::GetSupportVertex(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_vertexCount; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return m_vertices[bestIndex]; -} - -inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const -{ - b2Assert(0 <= index && index < m_vertexCount); - return m_vertices[index]; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2Shape.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2Shape.h deleted file mode 100644 index a0c130991..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/b2Shape.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_SHAPE_H -#define B2_SHAPE_H - -#include -#include -#include - -/// This holds the mass data computed for a shape. -struct b2MassData -{ - /// The mass of the shape, usually in kilograms. - float32 mass; - - /// The position of the shape's centroid relative to the shape's origin. - b2Vec2 center; - - /// The rotational inertia of the shape about the local origin. - float32 I; -}; - -/// A shape is used for collision detection. You can create a shape however you like. -/// Shapes used for simulation in b2World are created automatically when a b2Fixture -/// is created. -class b2Shape -{ -public: - - enum Type - { - e_unknown= -1, - e_circle = 0, - e_polygon = 1, - e_typeCount = 2, - }; - - b2Shape() { m_type = e_unknown; } - virtual ~b2Shape() {} - - /// Clone the concrete shape using the provided allocator. - virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0; - - /// Get the type of this shape. You can use this to down cast to the concrete shape. - /// @return the shape type. - Type GetType() const; - - /// Test a point for containment in this shape. This only works for convex shapes. - /// @param xf the shape world transform. - /// @param p a point in world coordinates. - virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0; - - /// Cast a ray against this shape. - /// @param output the ray-cast results. - /// @param input the ray-cast input parameters. - /// @param transform the transform to be applied to the shape. - virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; - - /// Given a transform, compute the associated axis aligned bounding box for this shape. - /// @param aabb returns the axis aligned box. - /// @param xf the world transform of the shape. - virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) const = 0; - - /// Compute the mass properties of this shape using its dimensions and density. - /// The inertia tensor is computed about the local origin. - /// @param massData returns the mass data for this shape. - /// @param density the density in kilograms per meter squared. - virtual void ComputeMass(b2MassData* massData, float32 density) const = 0; - - Type m_type; - float32 m_radius; -}; - -inline b2Shape::Type b2Shape::GetType() const -{ - return m_type; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.cpp deleted file mode 100644 index 9e85a9473..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -b2BroadPhase::b2BroadPhase() -{ - m_proxyCount = 0; - - m_pairCapacity = 16; - m_pairCount = 0; - m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); - - m_moveCapacity = 16; - m_moveCount = 0; - m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); -} - -b2BroadPhase::~b2BroadPhase() -{ - b2Free(m_moveBuffer); - b2Free(m_pairBuffer); -} - -int32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) -{ - int32 proxyId = m_tree.CreateProxy(aabb, userData); - ++m_proxyCount; - BufferMove(proxyId); - return proxyId; -} - -void b2BroadPhase::DestroyProxy(int32 proxyId) -{ - UnBufferMove(proxyId); - --m_proxyCount; - m_tree.DestroyProxy(proxyId); -} - -void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) -{ - bool buffer = m_tree.MoveProxy(proxyId, aabb, displacement); - if (buffer) - { - BufferMove(proxyId); - } -} - -void b2BroadPhase::BufferMove(int32 proxyId) -{ - if (m_moveCount == m_moveCapacity) - { - int32* oldBuffer = m_moveBuffer; - m_moveCapacity *= 2; - m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); - memcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32)); - b2Free(oldBuffer); - } - - m_moveBuffer[m_moveCount] = proxyId; - ++m_moveCount; -} - -void b2BroadPhase::UnBufferMove(int32 proxyId) -{ - for (int32 i = 0; i < m_moveCount; ++i) - { - if (m_moveBuffer[i] == proxyId) - { - m_moveBuffer[i] = e_nullProxy; - return; - } - } -} - -// This is called from b2DynamicTree::Query when we are gathering pairs. -bool b2BroadPhase::QueryCallback(int32 proxyId) -{ - // A proxy cannot form a pair with itself. - if (proxyId == m_queryProxyId) - { - return true; - } - - // Grow the pair buffer as needed. - if (m_pairCount == m_pairCapacity) - { - b2Pair* oldBuffer = m_pairBuffer; - m_pairCapacity *= 2; - m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); - memcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair)); - b2Free(oldBuffer); - } - - m_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId); - m_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId); - ++m_pairCount; - - return true; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.h deleted file mode 100644 index 95478a137..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2BroadPhase.h +++ /dev/null @@ -1,230 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_BROAD_PHASE_H -#define B2_BROAD_PHASE_H - -#include -#include -#include -#include - -struct b2Pair -{ - int32 proxyIdA; - int32 proxyIdB; - int32 next; -}; - -/// The broad-phase is used for computing pairs and performing volume queries and ray casts. -/// This broad-phase does not persist pairs. Instead, this reports potentially new pairs. -/// It is up to the client to consume the new pairs and to track subsequent overlap. -class b2BroadPhase -{ -public: - - enum - { - e_nullProxy = -1, - }; - - b2BroadPhase(); - ~b2BroadPhase(); - - /// Create a proxy with an initial AABB. Pairs are not reported until - /// UpdatePairs is called. - int32 CreateProxy(const b2AABB& aabb, void* userData); - - /// Destroy a proxy. It is up to the client to remove any pairs. - void DestroyProxy(int32 proxyId); - - /// Call MoveProxy as many times as you like, then when you are done - /// call UpdatePairs to finalized the proxy pairs (for your time step). - void MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement); - - /// Get the fat AABB for a proxy. - const b2AABB& GetFatAABB(int32 proxyId) const; - - /// Get user data from a proxy. Returns NULL if the id is invalid. - void* GetUserData(int32 proxyId) const; - - /// Test overlap of fat AABBs. - bool TestOverlap(int32 proxyIdA, int32 proxyIdB) const; - - /// Get the number of proxies. - int32 GetProxyCount() const; - - /// Update the pairs. This results in pair callbacks. This can only add pairs. - template - void UpdatePairs(T* callback); - - /// Query an AABB for overlapping proxies. The callback class - /// is called for each proxy that overlaps the supplied AABB. - template - void Query(T* callback, const b2AABB& aabb) const; - - /// Ray-cast against the proxies in the tree. This relies on the callback - /// to perform a exact ray-cast in the case were the proxy contains a shape. - /// The callback also performs the any collision filtering. This has performance - /// roughly equal to k * log(n), where k is the number of collisions and n is the - /// number of proxies in the tree. - /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). - /// @param callback a callback class that is called for each proxy that is hit by the ray. - template - void RayCast(T* callback, const b2RayCastInput& input) const; - - /// Compute the height of the embedded tree. - int32 ComputeHeight() const; - -private: - - friend class b2DynamicTree; - - void BufferMove(int32 proxyId); - void UnBufferMove(int32 proxyId); - - bool QueryCallback(int32 proxyId); - - b2DynamicTree m_tree; - - int32 m_proxyCount; - - int32* m_moveBuffer; - int32 m_moveCapacity; - int32 m_moveCount; - - b2Pair* m_pairBuffer; - int32 m_pairCapacity; - int32 m_pairCount; - - int32 m_queryProxyId; -}; - -/// This is used to sort pairs. -inline bool b2PairLessThan(const b2Pair& pair1, const b2Pair& pair2) -{ - if (pair1.proxyIdA < pair2.proxyIdA) - { - return true; - } - - if (pair1.proxyIdA == pair2.proxyIdA) - { - return pair1.proxyIdB < pair2.proxyIdB; - } - - return false; -} - -inline void* b2BroadPhase::GetUserData(int32 proxyId) const -{ - return m_tree.GetUserData(proxyId); -} - -inline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const -{ - const b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA); - const b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB); - return b2TestOverlap(aabbA, aabbB); -} - -inline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const -{ - return m_tree.GetFatAABB(proxyId); -} - -inline int32 b2BroadPhase::GetProxyCount() const -{ - return m_proxyCount; -} - -inline int32 b2BroadPhase::ComputeHeight() const -{ - return m_tree.ComputeHeight(); -} - -template -void b2BroadPhase::UpdatePairs(T* callback) -{ - // Reset pair buffer - m_pairCount = 0; - - // Perform tree queries for all moving proxies. - for (int32 i = 0; i < m_moveCount; ++i) - { - m_queryProxyId = m_moveBuffer[i]; - if (m_queryProxyId == e_nullProxy) - { - continue; - } - - // We have to query the tree with the fat AABB so that - // we don't fail to create a pair that may touch later. - const b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId); - - // Query tree, create pairs and add them pair buffer. - m_tree.Query(this, fatAABB); - } - - // Reset move buffer - m_moveCount = 0; - - // Sort the pair buffer to expose duplicates. - std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan); - - // Send the pairs back to the client. - int32 i = 0; - while (i < m_pairCount) - { - b2Pair* primaryPair = m_pairBuffer + i; - void* userDataA = m_tree.GetUserData(primaryPair->proxyIdA); - void* userDataB = m_tree.GetUserData(primaryPair->proxyIdB); - - callback->AddPair(userDataA, userDataB); - ++i; - - // Skip any duplicate pairs. - while (i < m_pairCount) - { - b2Pair* pair = m_pairBuffer + i; - if (pair->proxyIdA != primaryPair->proxyIdA || pair->proxyIdB != primaryPair->proxyIdB) - { - break; - } - ++i; - } - } - - // Try to keep the tree balanced. - m_tree.Rebalance(4); -} - -template -inline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const -{ - m_tree.Query(callback, aabb); -} - -template -inline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const -{ - m_tree.RayCast(callback, input); -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollideCircle.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollideCircle.cpp deleted file mode 100644 index ca84790ef..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollideCircle.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -void b2CollideCircles( - b2Manifold* manifold, - const b2CircleShape* circleA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB) -{ - manifold->pointCount = 0; - - b2Vec2 pA = b2Mul(xfA, circleA->m_p); - b2Vec2 pB = b2Mul(xfB, circleB->m_p); - - b2Vec2 d = pB - pA; - float32 distSqr = b2Dot(d, d); - float32 rA = circleA->m_radius, rB = circleB->m_radius; - float32 radius = rA + rB; - if (distSqr > radius * radius) - { - return; - } - - manifold->type = b2Manifold::e_circles; - manifold->localPoint = circleA->m_p; - manifold->localNormal.SetZero(); - manifold->pointCount = 1; - - manifold->points[0].localPoint = circleB->m_p; - manifold->points[0].id.key = 0; -} - -void b2CollidePolygonAndCircle( - b2Manifold* manifold, - const b2PolygonShape* polygonA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB) -{ - manifold->pointCount = 0; - - // Compute circle position in the frame of the polygon. - b2Vec2 c = b2Mul(xfB, circleB->m_p); - b2Vec2 cLocal = b2MulT(xfA, c); - - // Find the min separating edge. - int32 normalIndex = 0; - float32 separation = -b2_maxFloat; - float32 radius = polygonA->m_radius + circleB->m_radius; - int32 vertexCount = polygonA->m_vertexCount; - const b2Vec2* vertices = polygonA->m_vertices; - const b2Vec2* normals = polygonA->m_normals; - - for (int32 i = 0; i < vertexCount; ++i) - { - float32 s = b2Dot(normals[i], cLocal - vertices[i]); - - if (s > radius) - { - // Early out. - return; - } - - if (s > separation) - { - separation = s; - normalIndex = i; - } - } - - // Vertices that subtend the incident face. - int32 vertIndex1 = normalIndex; - int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; - b2Vec2 v1 = vertices[vertIndex1]; - b2Vec2 v2 = vertices[vertIndex2]; - - // If the center is inside the polygon ... - if (separation < b2_epsilon) - { - manifold->pointCount = 1; - manifold->type = b2Manifold::e_faceA; - manifold->localNormal = normals[normalIndex]; - manifold->localPoint = 0.5f * (v1 + v2); - manifold->points[0].localPoint = circleB->m_p; - manifold->points[0].id.key = 0; - return; - } - - // Compute barycentric coordinates - float32 u1 = b2Dot(cLocal - v1, v2 - v1); - float32 u2 = b2Dot(cLocal - v2, v1 - v2); - if (u1 <= 0.0f) - { - if (b2DistanceSquared(cLocal, v1) > radius * radius) - { - return; - } - - manifold->pointCount = 1; - manifold->type = b2Manifold::e_faceA; - manifold->localNormal = cLocal - v1; - manifold->localNormal.Normalize(); - manifold->localPoint = v1; - manifold->points[0].localPoint = circleB->m_p; - manifold->points[0].id.key = 0; - } - else if (u2 <= 0.0f) - { - if (b2DistanceSquared(cLocal, v2) > radius * radius) - { - return; - } - - manifold->pointCount = 1; - manifold->type = b2Manifold::e_faceA; - manifold->localNormal = cLocal - v2; - manifold->localNormal.Normalize(); - manifold->localPoint = v2; - manifold->points[0].localPoint = circleB->m_p; - manifold->points[0].id.key = 0; - } - else - { - b2Vec2 faceCenter = 0.5f * (v1 + v2); - float32 separation = b2Dot(cLocal - faceCenter, normals[vertIndex1]); - if (separation > radius) - { - return; - } - - manifold->pointCount = 1; - manifold->type = b2Manifold::e_faceA; - manifold->localNormal = normals[vertIndex1]; - manifold->localPoint = faceCenter; - manifold->points[0].localPoint = circleB->m_p; - manifold->points[0].id.key = 0; - } -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollidePolygon.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollidePolygon.cpp deleted file mode 100644 index 11b838dc2..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2CollidePolygon.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -// Find the separation between poly1 and poly2 for a give edge normal on poly1. -static float32 b2EdgeSeparation(const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, - const b2PolygonShape* poly2, const b2Transform& xf2) -{ - int32 count1 = poly1->m_vertexCount; - const b2Vec2* vertices1 = poly1->m_vertices; - const b2Vec2* normals1 = poly1->m_normals; - - int32 count2 = poly2->m_vertexCount; - const b2Vec2* vertices2 = poly2->m_vertices; - - b2Assert(0 <= edge1 && edge1 < count1); - - // Convert normal from poly1's frame into poly2's frame. - b2Vec2 normal1World = b2Mul(xf1.R, normals1[edge1]); - b2Vec2 normal1 = b2MulT(xf2.R, normal1World); - - // Find support vertex on poly2 for -normal. - int32 index = 0; - float32 minDot = b2_maxFloat; - - for (int32 i = 0; i < count2; ++i) - { - float32 dot = b2Dot(vertices2[i], normal1); - if (dot < minDot) - { - minDot = dot; - index = i; - } - } - - b2Vec2 v1 = b2Mul(xf1, vertices1[edge1]); - b2Vec2 v2 = b2Mul(xf2, vertices2[index]); - float32 separation = b2Dot(v2 - v1, normal1World); - return separation; -} - -// Find the max separation between poly1 and poly2 using edge normals from poly1. -static float32 b2FindMaxSeparation(int32* edgeIndex, - const b2PolygonShape* poly1, const b2Transform& xf1, - const b2PolygonShape* poly2, const b2Transform& xf2) -{ - int32 count1 = poly1->m_vertexCount; - const b2Vec2* normals1 = poly1->m_normals; - - // Vector pointing from the centroid of poly1 to the centroid of poly2. - b2Vec2 d = b2Mul(xf2, poly2->m_centroid) - b2Mul(xf1, poly1->m_centroid); - b2Vec2 dLocal1 = b2MulT(xf1.R, d); - - // Find edge normal on poly1 that has the largest projection onto d. - int32 edge = 0; - float32 maxDot = -b2_maxFloat; - for (int32 i = 0; i < count1; ++i) - { - float32 dot = b2Dot(normals1[i], dLocal1); - if (dot > maxDot) - { - maxDot = dot; - edge = i; - } - } - - // Get the separation for the edge normal. - float32 s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); - - // Check the separation for the previous edge normal. - int32 prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1; - float32 sPrev = b2EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2); - - // Check the separation for the next edge normal. - int32 nextEdge = edge + 1 < count1 ? edge + 1 : 0; - float32 sNext = b2EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2); - - // Find the best edge and the search direction. - int32 bestEdge; - float32 bestSeparation; - int32 increment; - if (sPrev > s && sPrev > sNext) - { - increment = -1; - bestEdge = prevEdge; - bestSeparation = sPrev; - } - else if (sNext > s) - { - increment = 1; - bestEdge = nextEdge; - bestSeparation = sNext; - } - else - { - *edgeIndex = edge; - return s; - } - - // Perform a local search for the best edge normal. - for ( ; ; ) - { - if (increment == -1) - edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1; - else - edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0; - - s = b2EdgeSeparation(poly1, xf1, edge, poly2, xf2); - - if (s > bestSeparation) - { - bestEdge = edge; - bestSeparation = s; - } - else - { - break; - } - } - - *edgeIndex = bestEdge; - return bestSeparation; -} - -static void b2FindIncidentEdge(b2ClipVertex c[2], - const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, - const b2PolygonShape* poly2, const b2Transform& xf2) -{ - int32 count1 = poly1->m_vertexCount; - const b2Vec2* normals1 = poly1->m_normals; - - int32 count2 = poly2->m_vertexCount; - const b2Vec2* vertices2 = poly2->m_vertices; - const b2Vec2* normals2 = poly2->m_normals; - - b2Assert(0 <= edge1 && edge1 < count1); - - // Get the normal of the reference edge in poly2's frame. - b2Vec2 normal1 = b2MulT(xf2.R, b2Mul(xf1.R, normals1[edge1])); - - // Find the incident edge on poly2. - int32 index = 0; - float32 minDot = b2_maxFloat; - for (int32 i = 0; i < count2; ++i) - { - float32 dot = b2Dot(normal1, normals2[i]); - if (dot < minDot) - { - minDot = dot; - index = i; - } - } - - // Build the clip vertices for the incident edge. - int32 i1 = index; - int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; - - c[0].v = b2Mul(xf2, vertices2[i1]); - c[0].id.features.referenceEdge = (uint8)edge1; - c[0].id.features.incidentEdge = (uint8)i1; - c[0].id.features.incidentVertex = 0; - - c[1].v = b2Mul(xf2, vertices2[i2]); - c[1].id.features.referenceEdge = (uint8)edge1; - c[1].id.features.incidentEdge = (uint8)i2; - c[1].id.features.incidentVertex = 1; -} - -// Find edge normal of max separation on A - return if separating axis is found -// Find edge normal of max separation on B - return if separation axis is found -// Choose reference edge as min(minA, minB) -// Find incident edge -// Clip - -// The normal points from 1 to 2 -void b2CollidePolygons(b2Manifold* manifold, - const b2PolygonShape* polyA, const b2Transform& xfA, - const b2PolygonShape* polyB, const b2Transform& xfB) -{ - manifold->pointCount = 0; - float32 totalRadius = polyA->m_radius + polyB->m_radius; - - int32 edgeA = 0; - float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); - if (separationA > totalRadius) - return; - - int32 edgeB = 0; - float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); - if (separationB > totalRadius) - return; - - const b2PolygonShape* poly1; // reference polygon - const b2PolygonShape* poly2; // incident polygon - b2Transform xf1, xf2; - int32 edge1; // reference edge - uint8 flip; - const float32 k_relativeTol = 0.98f; - const float32 k_absoluteTol = 0.001f; - - if (separationB > k_relativeTol * separationA + k_absoluteTol) - { - poly1 = polyB; - poly2 = polyA; - xf1 = xfB; - xf2 = xfA; - edge1 = edgeB; - manifold->type = b2Manifold::e_faceB; - flip = 1; - } - else - { - poly1 = polyA; - poly2 = polyB; - xf1 = xfA; - xf2 = xfB; - edge1 = edgeA; - manifold->type = b2Manifold::e_faceA; - flip = 0; - } - - b2ClipVertex incidentEdge[2]; - b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); - - int32 count1 = poly1->m_vertexCount; - const b2Vec2* vertices1 = poly1->m_vertices; - - b2Vec2 v11 = vertices1[edge1]; - b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; - - b2Vec2 localTangent = v12 - v11; - localTangent.Normalize(); - - b2Vec2 localNormal = b2Cross(localTangent, 1.0f); - b2Vec2 planePoint = 0.5f * (v11 + v12); - - b2Vec2 tangent = b2Mul(xf1.R, localTangent); - b2Vec2 normal = b2Cross(tangent, 1.0f); - - v11 = b2Mul(xf1, v11); - v12 = b2Mul(xf1, v12); - - // Face offset. - float32 frontOffset = b2Dot(normal, v11); - - // Side offsets, extended by polytope skin thickness. - float32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius; - float32 sideOffset2 = b2Dot(tangent, v12) + totalRadius; - - // Clip incident edge against extruded edge1 side edges. - b2ClipVertex clipPoints1[2]; - b2ClipVertex clipPoints2[2]; - int np; - - // Clip to box side 1 - np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1); - - if (np < 2) - return; - - // Clip to negative box side 1 - np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2); - - if (np < 2) - { - return; - } - - // Now clipPoints2 contains the clipped points. - manifold->localNormal = localNormal; - manifold->localPoint = planePoint; - - int32 pointCount = 0; - for (int32 i = 0; i < b2_maxManifoldPoints; ++i) - { - float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset; - - if (separation <= totalRadius) - { - b2ManifoldPoint* cp = manifold->points + pointCount; - cp->localPoint = b2MulT(xf2, clipPoints2[i].v); - cp->id = clipPoints2[i].id; - cp->id.features.flip = flip; - ++pointCount; - } - } - - manifold->pointCount = pointCount; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.cpp deleted file mode 100644 index 1aa7fde9e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -void b2WorldManifold::Initialize(const b2Manifold* manifold, - const b2Transform& xfA, float32 radiusA, - const b2Transform& xfB, float32 radiusB) -{ - if (manifold->pointCount == 0) - { - return; - } - - switch (manifold->type) - { - case b2Manifold::e_circles: - { - normal.Set(1.0f, 0.0f); - b2Vec2 pointA = b2Mul(xfA, manifold->localPoint); - b2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint); - if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) - { - normal = pointB - pointA; - normal.Normalize(); - } - - b2Vec2 cA = pointA + radiusA * normal; - b2Vec2 cB = pointB - radiusB * normal; - points[0] = 0.5f * (cA + cB); - } - break; - - case b2Manifold::e_faceA: - { - normal = b2Mul(xfA.R, manifold->localNormal); - b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint); - - for (int32 i = 0; i < manifold->pointCount; ++i) - { - b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint); - b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal; - b2Vec2 cB = clipPoint - radiusB * normal; - points[i] = 0.5f * (cA + cB); - } - } - break; - - case b2Manifold::e_faceB: - { - normal = b2Mul(xfB.R, manifold->localNormal); - b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint); - - for (int32 i = 0; i < manifold->pointCount; ++i) - { - b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint); - b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal; - b2Vec2 cA = clipPoint - radiusA * normal; - points[i] = 0.5f * (cA + cB); - } - - // Ensure normal points from A to B. - normal = -normal; - } - break; - } -} - -void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], - const b2Manifold* manifold1, const b2Manifold* manifold2) -{ - for (int32 i = 0; i < b2_maxManifoldPoints; ++i) - { - state1[i] = b2_nullState; - state2[i] = b2_nullState; - } - - // Detect persists and removes. - for (int32 i = 0; i < manifold1->pointCount; ++i) - { - b2ContactID id = manifold1->points[i].id; - - state1[i] = b2_removeState; - - for (int32 j = 0; j < manifold2->pointCount; ++j) - { - if (manifold2->points[j].id.key == id.key) - { - state1[i] = b2_persistState; - break; - } - } - } - - // Detect persists and adds. - for (int32 i = 0; i < manifold2->pointCount; ++i) - { - b2ContactID id = manifold2->points[i].id; - - state2[i] = b2_addState; - - for (int32 j = 0; j < manifold1->pointCount; ++j) - { - if (manifold1->points[j].id.key == id.key) - { - state2[i] = b2_persistState; - break; - } - } - } -} - -// From Real-time Collision Detection, p179. -bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const -{ - float32 tmin = -b2_maxFloat; - float32 tmax = b2_maxFloat; - - b2Vec2 p = input.p1; - b2Vec2 d = input.p2 - input.p1; - b2Vec2 absD = b2Abs(d); - - b2Vec2 normal; - - for (int32 i = 0; i < 2; ++i) - { - if (absD(i) < b2_epsilon) - { - // Parallel. - if (p(i) < lowerBound(i) || upperBound(i) < p(i)) - { - return false; - } - } - else - { - float32 inv_d = 1.0f / d(i); - float32 t1 = (lowerBound(i) - p(i)) * inv_d; - float32 t2 = (upperBound(i) - p(i)) * inv_d; - - // Sign of the normal vector. - float32 s = -1.0f; - - if (t1 > t2) - { - b2Swap(t1, t2); - s = 1.0f; - } - - // Push the min up - if (t1 > tmin) - { - normal.SetZero(); - normal(i) = s; - tmin = t1; - } - - // Pull the max down - tmax = b2Min(tmax, t2); - - if (tmin > tmax) - { - return false; - } - } - } - - // Does the ray start inside the box? - // Does the ray intersect beyond the max fraction? - if (tmin < 0.0f || input.maxFraction < tmin) - { - return false; - } - - // Intersection. - output->fraction = tmin; - output->normal = normal; - return true; -} - -// Sutherland-Hodgman clipping. -int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], - const b2Vec2& normal, float32 offset) -{ - // Start with no output points - int32 numOut = 0; - - // Calculate the distance of end points to the line - float32 distance0 = b2Dot(normal, vIn[0].v) - offset; - float32 distance1 = b2Dot(normal, vIn[1].v) - offset; - - // If the points are behind the plane - if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; - if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; - - // If the points are on different sides of the plane - if (distance0 * distance1 < 0.0f) - { - // Find intersection point of edge and plane - float32 interp = distance0 / (distance0 - distance1); - vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); - if (distance0 > 0.0f) - { - vOut[numOut].id = vIn[0].id; - } - else - { - vOut[numOut].id = vIn[1].id; - } - ++numOut; - } - - return numOut; -} - -bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, - const b2Transform& xfA, const b2Transform& xfB) -{ - b2DistanceInput input; - input.proxyA.Set(shapeA); - input.proxyB.Set(shapeB); - input.transformA = xfA; - input.transformB = xfB; - input.useRadii = true; - - b2SimplexCache cache; - cache.count = 0; - - b2DistanceOutput output; - - b2Distance(&output, &cache, &input); - - return output.distance < 10.0f * b2_epsilon; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.h deleted file mode 100644 index 22c10413a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Collision.h +++ /dev/null @@ -1,241 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_COLLISION_H -#define B2_COLLISION_H - -#include -#include - -/// @file -/// Structures and functions used for computing contact points, distance -/// queries, and TOI queries. - -class b2Shape; -class b2CircleShape; -class b2PolygonShape; - -const uint8 b2_nullFeature = UCHAR_MAX; - -/// Contact ids to facilitate warm starting. -union b2ContactID -{ - /// The features that intersect to form the contact point - struct Features - { - uint8 referenceEdge; ///< The edge that defines the outward contact normal. - uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. - uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. - uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. - } features; - uint32 key; ///< Used to quickly compare contact ids. -}; - -/// A manifold point is a contact point belonging to a contact -/// manifold. It holds details related to the geometry and dynamics -/// of the contact points. -/// The local point usage depends on the manifold type: -/// -e_circles: the local center of circleB -/// -e_faceA: the local center of cirlceB or the clip point of polygonB -/// -e_faceB: the clip point of polygonA -/// This structure is stored across time steps, so we keep it small. -/// Note: the impulses are used for internal caching and may not -/// provide reliable contact forces, especially for high speed collisions. -struct b2ManifoldPoint -{ - b2Vec2 localPoint; ///< usage depends on manifold type - float32 normalImpulse; ///< the non-penetration impulse - float32 tangentImpulse; ///< the friction impulse - b2ContactID id; ///< uniquely identifies a contact point between two shapes -}; - -/// A manifold for two touching convex shapes. -/// Box2D supports multiple types of contact: -/// - clip point versus plane with radius -/// - point versus point with radius (circles) -/// The local point usage depends on the manifold type: -/// -e_circles: the local center of circleA -/// -e_faceA: the center of faceA -/// -e_faceB: the center of faceB -/// Similarly the local normal usage: -/// -e_circles: not used -/// -e_faceA: the normal on polygonA -/// -e_faceB: the normal on polygonB -/// We store contacts in this way so that position correction can -/// account for movement, which is critical for continuous physics. -/// All contact scenarios must be expressed in one of these types. -/// This structure is stored across time steps, so we keep it small. -struct b2Manifold -{ - enum Type - { - e_circles, - e_faceA, - e_faceB - }; - - b2ManifoldPoint points[b2_maxManifoldPoints]; ///< the points of contact - b2Vec2 localNormal; ///< not use for Type::e_points - b2Vec2 localPoint; ///< usage depends on manifold type - Type type; - int32 pointCount; ///< the number of manifold points -}; - -/// This is used to compute the current state of a contact manifold. -struct b2WorldManifold -{ - /// Evaluate the manifold with supplied transforms. This assumes - /// modest motion from the original state. This does not change the - /// point count, impulses, etc. The radii must come from the shapes - /// that generated the manifold. - void Initialize(const b2Manifold* manifold, - const b2Transform& xfA, float32 radiusA, - const b2Transform& xfB, float32 radiusB); - - b2Vec2 normal; ///< world vector pointing from A to B - b2Vec2 points[b2_maxManifoldPoints]; ///< world contact point (point of intersection) -}; - -/// This is used for determining the state of contact points. -enum b2PointState -{ - b2_nullState, ///< point does not exist - b2_addState, ///< point was added in the update - b2_persistState, ///< point persisted across the update - b2_removeState ///< point was removed in the update -}; - -/// Compute the point states given two manifolds. The states pertain to the transition from manifold1 -/// to manifold2. So state1 is either persist or remove while state2 is either add or persist. -void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], - const b2Manifold* manifold1, const b2Manifold* manifold2); - -/// Used for computing contact manifolds. -struct b2ClipVertex -{ - b2Vec2 v; - b2ContactID id; -}; - -/// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). -struct b2RayCastInput -{ - b2Vec2 p1, p2; - float32 maxFraction; -}; - -/// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2 -/// come from b2RayCastInput. -struct b2RayCastOutput -{ - b2Vec2 normal; - float32 fraction; -}; - -/// An axis aligned bounding box. -struct b2AABB -{ - /// Verify that the bounds are sorted. - bool IsValid() const; - - /// Get the center of the AABB. - b2Vec2 GetCenter() const - { - return 0.5f * (lowerBound + upperBound); - } - - /// Get the extents of the AABB (half-widths). - b2Vec2 GetExtents() const - { - return 0.5f * (upperBound - lowerBound); - } - - /// Combine two AABBs into this one. - void Combine(const b2AABB& aabb1, const b2AABB& aabb2) - { - lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound); - upperBound = b2Max(aabb1.upperBound, aabb2.upperBound); - } - - /// Does this aabb contain the provided AABB. - bool Contains(const b2AABB& aabb) const - { - bool result = true; - result = result && lowerBound.x <= aabb.lowerBound.x; - result = result && lowerBound.y <= aabb.lowerBound.y; - result = result && aabb.upperBound.x <= upperBound.x; - result = result && aabb.upperBound.y <= upperBound.y; - return result; - } - - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; - - b2Vec2 lowerBound; ///< the lower vertex - b2Vec2 upperBound; ///< the upper vertex -}; - -/// Compute the collision manifold between two circles. -void b2CollideCircles(b2Manifold* manifold, - const b2CircleShape* circle1, const b2Transform& xf1, - const b2CircleShape* circle2, const b2Transform& xf2); - -/// Compute the collision manifold between a polygon and a circle. -void b2CollidePolygonAndCircle(b2Manifold* manifold, - const b2PolygonShape* polygon, const b2Transform& xf1, - const b2CircleShape* circle, const b2Transform& xf2); - -/// Compute the collision manifold between two polygons. -void b2CollidePolygons(b2Manifold* manifold, - const b2PolygonShape* polygon1, const b2Transform& xf1, - const b2PolygonShape* polygon2, const b2Transform& xf2); - -/// Clipping for contact manifolds. -int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], - const b2Vec2& normal, float32 offset); - -/// Determine if two generic shapes overlap. -bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, - const b2Transform& xfA, const b2Transform& xfB); - -// ---------------- Inline Functions ------------------------------------------ - -inline bool b2AABB::IsValid() const -{ - b2Vec2 d = upperBound - lowerBound; - bool valid = d.x >= 0.0f && d.y >= 0.0f; - valid = valid && lowerBound.IsValid() && upperBound.IsValid(); - return valid; -} - -inline bool b2TestOverlap(const b2AABB& a, const b2AABB& b) -{ - b2Vec2 d1, d2; - d1 = b.lowerBound - a.upperBound; - d2 = a.lowerBound - b.upperBound; - - if (d1.x > 0.0f || d1.y > 0.0f) - return false; - - if (d2.x > 0.0f || d2.y > 0.0f) - return false; - - return true; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.cpp deleted file mode 100644 index 77f39e81b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. -int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - -void b2DistanceProxy::Set(const b2Shape* shape) -{ - switch (shape->GetType()) - { - case b2Shape::e_circle: - { - const b2CircleShape* circle = (b2CircleShape*)shape; - m_vertices = &circle->m_p; - m_count = 1; - m_radius = circle->m_radius; - } - break; - - case b2Shape::e_polygon: - { - const b2PolygonShape* polygon = (b2PolygonShape*)shape; - m_vertices = polygon->m_vertices; - m_count = polygon->m_vertexCount; - m_radius = polygon->m_radius; - } - break; - - default: - b2Assert(false); - } -} - - -struct b2SimplexVertex -{ - b2Vec2 wA; // support point in proxyA - b2Vec2 wB; // support point in proxyB - b2Vec2 w; // wB - wA - float32 a; // barycentric coordinate for closest point - int32 indexA; // wA index - int32 indexB; // wB index -}; - -struct b2Simplex -{ - void ReadCache( const b2SimplexCache* cache, - const b2DistanceProxy* proxyA, const b2Transform& transformA, - const b2DistanceProxy* proxyB, const b2Transform& transformB) - { - b2Assert(cache->count <= 3); - - // Copy data from cache. - m_count = cache->count; - b2SimplexVertex* vertices = &m_v1; - for (int32 i = 0; i < m_count; ++i) - { - b2SimplexVertex* v = vertices + i; - v->indexA = cache->indexA[i]; - v->indexB = cache->indexB[i]; - b2Vec2 wALocal = proxyA->GetVertex(v->indexA); - b2Vec2 wBLocal = proxyB->GetVertex(v->indexB); - v->wA = b2Mul(transformA, wALocal); - v->wB = b2Mul(transformB, wBLocal); - v->w = v->wB - v->wA; - v->a = 0.0f; - } - - // Compute the new simplex metric, if it is substantially different than - // old metric then flush the simplex. - if (m_count > 1) - { - float32 metric1 = cache->metric; - float32 metric2 = GetMetric(); - if (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon) - { - // Reset the simplex. - m_count = 0; - } - } - - // If the cache is empty or invalid ... - if (m_count == 0) - { - b2SimplexVertex* v = vertices + 0; - v->indexA = 0; - v->indexB = 0; - b2Vec2 wALocal = proxyA->GetVertex(0); - b2Vec2 wBLocal = proxyB->GetVertex(0); - v->wA = b2Mul(transformA, wALocal); - v->wB = b2Mul(transformB, wBLocal); - v->w = v->wB - v->wA; - m_count = 1; - } - } - - void WriteCache(b2SimplexCache* cache) const - { - cache->metric = GetMetric(); - cache->count = uint16(m_count); - const b2SimplexVertex* vertices = &m_v1; - for (int32 i = 0; i < m_count; ++i) - { - cache->indexA[i] = uint8(vertices[i].indexA); - cache->indexB[i] = uint8(vertices[i].indexB); - } - } - - b2Vec2 GetSearchDirection() const - { - switch (m_count) - { - case 1: - return -m_v1.w; - - case 2: - { - b2Vec2 e12 = m_v2.w - m_v1.w; - float32 sgn = b2Cross(e12, -m_v1.w); - if (sgn > 0.0f) - { - // Origin is left of e12. - return b2Cross(1.0f, e12); - } - else - { - // Origin is right of e12. - return b2Cross(e12, 1.0f); - } - } - - default: - b2Assert(false); - return b2Vec2_zero; - } - } - - b2Vec2 GetClosestPoint() const - { - switch (m_count) - { - case 0: - b2Assert(false); - return b2Vec2_zero; - - case 1: - return m_v1.w; - - case 2: - return m_v1.a * m_v1.w + m_v2.a * m_v2.w; - - case 3: - return b2Vec2_zero; - - default: - b2Assert(false); - return b2Vec2_zero; - } - } - - void GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const - { - switch (m_count) - { - case 0: - b2Assert(false); - break; - - case 1: - *pA = m_v1.wA; - *pB = m_v1.wB; - break; - - case 2: - *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA; - *pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB; - break; - - case 3: - *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA; - *pB = *pA; - break; - - default: - b2Assert(false); - break; - } - } - - float32 GetMetric() const - { - switch (m_count) - { - case 0: - b2Assert(false); - return 0.0; - - case 1: - return 0.0f; - - case 2: - return b2Distance(m_v1.w, m_v2.w); - - case 3: - return b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w); - - default: - b2Assert(false); - return 0.0f; - } - } - - void Solve2(); - void Solve3(); - - b2SimplexVertex m_v1, m_v2, m_v3; - int32 m_count; -}; - - -// Solve a line segment using barycentric coordinates. -// -// p = a1 * w1 + a2 * w2 -// a1 + a2 = 1 -// -// The vector from the origin to the closest point on the line is -// perpendicular to the line. -// e12 = w2 - w1 -// dot(p, e) = 0 -// a1 * dot(w1, e) + a2 * dot(w2, e) = 0 -// -// 2-by-2 linear system -// [1 1 ][a1] = [1] -// [w1.e12 w2.e12][a2] = [0] -// -// Define -// d12_1 = dot(w2, e12) -// d12_2 = -dot(w1, e12) -// d12 = d12_1 + d12_2 -// -// Solution -// a1 = d12_1 / d12 -// a2 = d12_2 / d12 -void b2Simplex::Solve2() -{ - b2Vec2 w1 = m_v1.w; - b2Vec2 w2 = m_v2.w; - b2Vec2 e12 = w2 - w1; - - // w1 region - float32 d12_2 = -b2Dot(w1, e12); - if (d12_2 <= 0.0f) - { - // a2 <= 0, so we clamp it to 0 - m_v1.a = 1.0f; - m_count = 1; - return; - } - - // w2 region - float32 d12_1 = b2Dot(w2, e12); - if (d12_1 <= 0.0f) - { - // a1 <= 0, so we clamp it to 0 - m_v2.a = 1.0f; - m_count = 1; - m_v1 = m_v2; - return; - } - - // Must be in e12 region. - float32 inv_d12 = 1.0f / (d12_1 + d12_2); - m_v1.a = d12_1 * inv_d12; - m_v2.a = d12_2 * inv_d12; - m_count = 2; -} - -// Possible regions: -// - points[2] -// - edge points[0]-points[2] -// - edge points[1]-points[2] -// - inside the triangle -void b2Simplex::Solve3() -{ - b2Vec2 w1 = m_v1.w; - b2Vec2 w2 = m_v2.w; - b2Vec2 w3 = m_v3.w; - - // Edge12 - // [1 1 ][a1] = [1] - // [w1.e12 w2.e12][a2] = [0] - // a3 = 0 - b2Vec2 e12 = w2 - w1; - float32 w1e12 = b2Dot(w1, e12); - float32 w2e12 = b2Dot(w2, e12); - float32 d12_1 = w2e12; - float32 d12_2 = -w1e12; - - // Edge13 - // [1 1 ][a1] = [1] - // [w1.e13 w3.e13][a3] = [0] - // a2 = 0 - b2Vec2 e13 = w3 - w1; - float32 w1e13 = b2Dot(w1, e13); - float32 w3e13 = b2Dot(w3, e13); - float32 d13_1 = w3e13; - float32 d13_2 = -w1e13; - - // Edge23 - // [1 1 ][a2] = [1] - // [w2.e23 w3.e23][a3] = [0] - // a1 = 0 - b2Vec2 e23 = w3 - w2; - float32 w2e23 = b2Dot(w2, e23); - float32 w3e23 = b2Dot(w3, e23); - float32 d23_1 = w3e23; - float32 d23_2 = -w2e23; - - // Triangle123 - float32 n123 = b2Cross(e12, e13); - - float32 d123_1 = n123 * b2Cross(w2, w3); - float32 d123_2 = n123 * b2Cross(w3, w1); - float32 d123_3 = n123 * b2Cross(w1, w2); - - // w1 region - if (d12_2 <= 0.0f && d13_2 <= 0.0f) - { - m_v1.a = 1.0f; - m_count = 1; - return; - } - - // e12 - if (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f) - { - float32 inv_d12 = 1.0f / (d12_1 + d12_2); - m_v1.a = d12_1 * inv_d12; - m_v2.a = d12_2 * inv_d12; - m_count = 2; - return; - } - - // e13 - if (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f) - { - float32 inv_d13 = 1.0f / (d13_1 + d13_2); - m_v1.a = d13_1 * inv_d13; - m_v3.a = d13_2 * inv_d13; - m_count = 2; - m_v2 = m_v3; - return; - } - - // w2 region - if (d12_1 <= 0.0f && d23_2 <= 0.0f) - { - m_v2.a = 1.0f; - m_count = 1; - m_v1 = m_v2; - return; - } - - // w3 region - if (d13_1 <= 0.0f && d23_1 <= 0.0f) - { - m_v3.a = 1.0f; - m_count = 1; - m_v1 = m_v3; - return; - } - - // e23 - if (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f) - { - float32 inv_d23 = 1.0f / (d23_1 + d23_2); - m_v2.a = d23_1 * inv_d23; - m_v3.a = d23_2 * inv_d23; - m_count = 2; - m_v1 = m_v3; - return; - } - - // Must be in triangle123 - float32 inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3); - m_v1.a = d123_1 * inv_d123; - m_v2.a = d123_2 * inv_d123; - m_v3.a = d123_3 * inv_d123; - m_count = 3; -} - -void b2Distance(b2DistanceOutput* output, - b2SimplexCache* cache, - const b2DistanceInput* input) -{ - ++b2_gjkCalls; - - const b2DistanceProxy* proxyA = &input->proxyA; - const b2DistanceProxy* proxyB = &input->proxyB; - - b2Transform transformA = input->transformA; - b2Transform transformB = input->transformB; - - // Initialize the simplex. - b2Simplex simplex; - simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB); - - // Get simplex vertices as an array. - b2SimplexVertex* vertices = &simplex.m_v1; - const int32 k_maxIters = 20; - - // These store the vertices of the last simplex so that we - // can check for duplicates and prevent cycling. - int32 saveA[3], saveB[3]; - int32 saveCount = 0; - - b2Vec2 closestPoint = simplex.GetClosestPoint(); - float32 distanceSqr1 = closestPoint.LengthSquared(); - float32 distanceSqr2 = distanceSqr1; - - // Main iteration loop. - int32 iter = 0; - while (iter < k_maxIters) - { - // Copy simplex so we can identify duplicates. - saveCount = simplex.m_count; - for (int32 i = 0; i < saveCount; ++i) - { - saveA[i] = vertices[i].indexA; - saveB[i] = vertices[i].indexB; - } - - switch (simplex.m_count) - { - case 1: - break; - - case 2: - simplex.Solve2(); - break; - - case 3: - simplex.Solve3(); - break; - - default: - b2Assert(false); - } - - // If we have 3 points, then the origin is in the corresponding triangle. - if (simplex.m_count == 3) - { - break; - } - - // Compute closest point. - b2Vec2 p = simplex.GetClosestPoint(); - distanceSqr2 = p.LengthSquared(); - - // Ensure progress - if (distanceSqr2 >= distanceSqr1) - { - //break; - } - distanceSqr1 = distanceSqr2; - - // Get search direction. - b2Vec2 d = simplex.GetSearchDirection(); - - // Ensure the search direction is numerically fit. - if (d.LengthSquared() < b2_epsilon * b2_epsilon) - { - // The origin is probably contained by a line segment - // or triangle. Thus the shapes are overlapped. - - // We can't return zero here even though there may be overlap. - // In case the simplex is a point, segment, or triangle it is difficult - // to determine if the origin is contained in the CSO or very close to it. - break; - } - - // Compute a tentative new simplex vertex using support points. - b2SimplexVertex* vertex = vertices + simplex.m_count; - vertex->indexA = proxyA->GetSupport(b2MulT(transformA.R, -d)); - vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA)); - b2Vec2 wBLocal; - vertex->indexB = proxyB->GetSupport(b2MulT(transformB.R, d)); - vertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB)); - vertex->w = vertex->wB - vertex->wA; - - // Iteration count is equated to the number of support point calls. - ++iter; - ++b2_gjkIters; - - // Check for duplicate support points. This is the main termination criteria. - bool duplicate = false; - for (int32 i = 0; i < saveCount; ++i) - { - if (vertex->indexA == saveA[i] && vertex->indexB == saveB[i]) - { - duplicate = true; - break; - } - } - - // If we found a duplicate support point we must exit to avoid cycling. - if (duplicate) - { - break; - } - - // New vertex is ok and needed. - ++simplex.m_count; - } - - b2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter); - - // Prepare output. - simplex.GetWitnessPoints(&output->pointA, &output->pointB); - output->distance = b2Distance(output->pointA, output->pointB); - output->iterations = iter; - - // Cache the simplex. - simplex.WriteCache(cache); - - // Apply radii if requested. - if (input->useRadii) - { - float32 rA = proxyA->m_radius; - float32 rB = proxyB->m_radius; - - if (output->distance > rA + rB && output->distance > b2_epsilon) - { - // Shapes are still no overlapped. - // Move the witness points to the outer surface. - output->distance -= rA + rB; - b2Vec2 normal = output->pointB - output->pointA; - normal.Normalize(); - output->pointA += rA * normal; - output->pointB -= rB * normal; - } - else - { - // Shapes are overlapped when radii are considered. - // Move the witness points to the middle. - b2Vec2 p = 0.5f * (output->pointA + output->pointB); - output->pointA = p; - output->pointB = p; - output->distance = 0.0f; - } - } -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.h deleted file mode 100644 index d7d6ff70c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2Distance.h +++ /dev/null @@ -1,142 +0,0 @@ - -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_DISTANCE_H -#define B2_DISTANCE_H - -#include -#include - -class b2Shape; - -/// A distance proxy is used by the GJK algorithm. -/// It encapsulates any shape. -struct b2DistanceProxy -{ - b2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {} - - /// Initialize the proxy using the given shape. The shape - /// must remain in scope while the proxy is in use. - void Set(const b2Shape* shape); - - /// Get the supporting vertex index in the given direction. - int32 GetSupport(const b2Vec2& d) const; - - /// Get the supporting vertex in the given direction. - const b2Vec2& GetSupportVertex(const b2Vec2& d) const; - - /// Get the vertex count. - int32 GetVertexCount() const; - - /// Get a vertex by index. Used by b2Distance. - const b2Vec2& GetVertex(int32 index) const; - - const b2Vec2* m_vertices; - int32 m_count; - float32 m_radius; -}; - -/// Used to warm start b2Distance. -/// Set count to zero on first call. -struct b2SimplexCache -{ - float32 metric; ///< length or area - uint16 count; - uint8 indexA[3]; ///< vertices on shape A - uint8 indexB[3]; ///< vertices on shape B -}; - -/// Input for b2Distance. -/// You have to option to use the shape radii -/// in the computation. Even -struct b2DistanceInput -{ - b2DistanceProxy proxyA; - b2DistanceProxy proxyB; - b2Transform transformA; - b2Transform transformB; - bool useRadii; -}; - -/// Output for b2Distance. -struct b2DistanceOutput -{ - b2Vec2 pointA; ///< closest point on shapeA - b2Vec2 pointB; ///< closest point on shapeB - float32 distance; - int32 iterations; ///< number of GJK iterations used -}; - -/// Compute the closest points between two shapes. Supports any combination of: -/// b2CircleShape, b2PolygonShape, b2EdgeShape. The simplex cache is input/output. -/// On the first call set b2SimplexCache.count to zero. -void b2Distance(b2DistanceOutput* output, - b2SimplexCache* cache, - const b2DistanceInput* input); - - -////////////////////////////////////////////////////////////////////////// - -inline int32 b2DistanceProxy::GetVertexCount() const -{ - return m_count; -} - -inline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const -{ - b2Assert(0 <= index && index < m_count); - return m_vertices[index]; -} - -inline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_count; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return bestIndex; -} - -inline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const -{ - int32 bestIndex = 0; - float32 bestValue = b2Dot(m_vertices[0], d); - for (int32 i = 1; i < m_count; ++i) - { - float32 value = b2Dot(m_vertices[i], d); - if (value > bestValue) - { - bestIndex = i; - bestValue = value; - } - } - - return m_vertices[bestIndex]; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.cpp deleted file mode 100644 index 8d3cea343..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -b2DynamicTree::b2DynamicTree() -{ - m_root = b2_nullNode; - - m_nodeCapacity = 16; - m_nodeCount = 0; - m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); - memset(m_nodes, 0, m_nodeCapacity * sizeof(b2DynamicTreeNode)); - - // Build a linked list for the free list. - for (int32 i = 0; i < m_nodeCapacity - 1; ++i) - { - m_nodes[i].next = i + 1; - } - m_nodes[m_nodeCapacity-1].next = b2_nullNode; - m_freeList = 0; - - m_path = 0; - - m_insertionCount = 0; -} - -b2DynamicTree::~b2DynamicTree() -{ - // This frees the entire tree in one shot. - b2Free(m_nodes); -} - -// Allocate a node from the pool. Grow the pool if necessary. -int32 b2DynamicTree::AllocateNode() -{ - // Expand the node pool as needed. - if (m_freeList == b2_nullNode) - { - b2Assert(m_nodeCount == m_nodeCapacity); - - // The free list is empty. Rebuild a bigger pool. - b2DynamicTreeNode* oldNodes = m_nodes; - m_nodeCapacity *= 2; - m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); - memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2DynamicTreeNode)); - b2Free(oldNodes); - - // Build a linked list for the free list. The parent - // pointer becomes the "next" pointer. - for (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i) - { - m_nodes[i].next = i + 1; - } - m_nodes[m_nodeCapacity-1].next = b2_nullNode; - m_freeList = m_nodeCount; - } - - // Peel a node off the free list. - int32 nodeId = m_freeList; - m_freeList = m_nodes[nodeId].next; - m_nodes[nodeId].parent = b2_nullNode; - m_nodes[nodeId].child1 = b2_nullNode; - m_nodes[nodeId].child2 = b2_nullNode; - ++m_nodeCount; - return nodeId; -} - -// Return a node to the pool. -void b2DynamicTree::FreeNode(int32 nodeId) -{ - b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); - b2Assert(0 < m_nodeCount); - m_nodes[nodeId].next = m_freeList; - m_freeList = nodeId; - --m_nodeCount; -} - -// Create a proxy in the tree as a leaf node. We return the index -// of the node instead of a pointer so that we can grow -// the node pool. -int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) -{ - int32 proxyId = AllocateNode(); - - // Fatten the aabb. - b2Vec2 r(b2_aabbExtension, b2_aabbExtension); - m_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r; - m_nodes[proxyId].aabb.upperBound = aabb.upperBound + r; - m_nodes[proxyId].userData = userData; - - InsertLeaf(proxyId); - - // Rebalance if necessary. - int32 iterationCount = m_nodeCount >> 4; - int32 tryCount = 0; - int32 height = ComputeHeight(); - while (height > 64 && tryCount < 10) - { - Rebalance(iterationCount); - height = ComputeHeight(); - ++tryCount; - } - - return proxyId; -} - -void b2DynamicTree::DestroyProxy(int32 proxyId) -{ - b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); - b2Assert(m_nodes[proxyId].IsLeaf()); - - RemoveLeaf(proxyId); - FreeNode(proxyId); -} - -bool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) -{ - b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); - - b2Assert(m_nodes[proxyId].IsLeaf()); - - if (m_nodes[proxyId].aabb.Contains(aabb)) - { - return false; - } - - RemoveLeaf(proxyId); - - // Extend AABB. - b2AABB b = aabb; - b2Vec2 r(b2_aabbExtension, b2_aabbExtension); - b.lowerBound = b.lowerBound - r; - b.upperBound = b.upperBound + r; - - // Predict AABB displacement. - b2Vec2 d = b2_aabbMultiplier * displacement; - - if (d.x < 0.0f) - { - b.lowerBound.x += d.x; - } - else - { - b.upperBound.x += d.x; - } - - if (d.y < 0.0f) - { - b.lowerBound.y += d.y; - } - else - { - b.upperBound.y += d.y; - } - - m_nodes[proxyId].aabb = b; - - InsertLeaf(proxyId); - return true; -} - -void b2DynamicTree::InsertLeaf(int32 leaf) -{ - ++m_insertionCount; - - if (m_root == b2_nullNode) - { - m_root = leaf; - m_nodes[m_root].parent = b2_nullNode; - return; - } - - // Find the best sibling for this node. - b2Vec2 center = m_nodes[leaf].aabb.GetCenter(); - int32 sibling = m_root; - if (m_nodes[sibling].IsLeaf() == false) - { - do - { - int32 child1 = m_nodes[sibling].child1; - int32 child2 = m_nodes[sibling].child2; - - b2Vec2 delta1 = b2Abs(m_nodes[child1].aabb.GetCenter() - center); - b2Vec2 delta2 = b2Abs(m_nodes[child2].aabb.GetCenter() - center); - - float32 norm1 = delta1.x + delta1.y; - float32 norm2 = delta2.x + delta2.y; - - if (norm1 < norm2) - { - sibling = child1; - } - else - { - sibling = child2; - } - - } - while(m_nodes[sibling].IsLeaf() == false); - } - - // Create a parent for the siblings. - int32 node1 = m_nodes[sibling].parent; - int32 node2 = AllocateNode(); - m_nodes[node2].parent = node1; - m_nodes[node2].userData = NULL; - m_nodes[node2].aabb.Combine(m_nodes[leaf].aabb, m_nodes[sibling].aabb); - - if (node1 != b2_nullNode) - { - if (m_nodes[m_nodes[sibling].parent].child1 == sibling) - { - m_nodes[node1].child1 = node2; - } - else - { - m_nodes[node1].child2 = node2; - } - - m_nodes[node2].child1 = sibling; - m_nodes[node2].child2 = leaf; - m_nodes[sibling].parent = node2; - m_nodes[leaf].parent = node2; - - do - { - if (m_nodes[node1].aabb.Contains(m_nodes[node2].aabb)) - { - break; - } - - m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); - node2 = node1; - node1 = m_nodes[node1].parent; - } - while(node1 != b2_nullNode); - } - else - { - m_nodes[node2].child1 = sibling; - m_nodes[node2].child2 = leaf; - m_nodes[sibling].parent = node2; - m_nodes[leaf].parent = node2; - m_root = node2; - } -} - -void b2DynamicTree::RemoveLeaf(int32 leaf) -{ - if (leaf == m_root) - { - m_root = b2_nullNode; - return; - } - - int32 node2 = m_nodes[leaf].parent; - int32 node1 = m_nodes[node2].parent; - int32 sibling; - if (m_nodes[node2].child1 == leaf) - { - sibling = m_nodes[node2].child2; - } - else - { - sibling = m_nodes[node2].child1; - } - - if (node1 != b2_nullNode) - { - // Destroy node2 and connect node1 to sibling. - if (m_nodes[node1].child1 == node2) - { - m_nodes[node1].child1 = sibling; - } - else - { - m_nodes[node1].child2 = sibling; - } - m_nodes[sibling].parent = node1; - FreeNode(node2); - - // Adjust ancestor bounds. - while (node1 != b2_nullNode) - { - b2AABB oldAABB = m_nodes[node1].aabb; - m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); - - if (oldAABB.Contains(m_nodes[node1].aabb)) - { - break; - } - - node1 = m_nodes[node1].parent; - } - } - else - { - m_root = sibling; - m_nodes[sibling].parent = b2_nullNode; - FreeNode(node2); - } -} - -void b2DynamicTree::Rebalance(int32 iterations) -{ - if (m_root == b2_nullNode) - { - return; - } - - for (int32 i = 0; i < iterations; ++i) - { - int32 node = m_root; - - uint32 bit = 0; - while (m_nodes[node].IsLeaf() == false) - { - int32* children = &m_nodes[node].child1; - node = children[(m_path >> bit) & 1]; - bit = (bit + 1) & (8* sizeof(uint32) - 1); - } - ++m_path; - - RemoveLeaf(node); - InsertLeaf(node); - } -} - -// Compute the height of a sub-tree. -int32 b2DynamicTree::ComputeHeight(int32 nodeId) const -{ - if (nodeId == b2_nullNode) - { - return 0; - } - - b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); - b2DynamicTreeNode* node = m_nodes + nodeId; - int32 height1 = ComputeHeight(node->child1); - int32 height2 = ComputeHeight(node->child2); - return 1 + b2Max(height1, height2); -} - -int32 b2DynamicTree::ComputeHeight() const -{ - return ComputeHeight(m_root); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.h deleted file mode 100644 index 3afaf4af8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2DynamicTree.h +++ /dev/null @@ -1,287 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_DYNAMIC_TREE_H -#define B2_DYNAMIC_TREE_H - -#include - -/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. - -#define b2_nullNode (-1) - -/// A node in the dynamic tree. The client does not interact with this directly. -struct b2DynamicTreeNode -{ - bool IsLeaf() const - { - return child1 == b2_nullNode; - } - - /// This is the fattened AABB. - b2AABB aabb; - - //int32 userData; - void* userData; - - union - { - int32 parent; - int32 next; - }; - - int32 child1; - int32 child2; -}; - -/// A dynamic tree arranges data in a binary tree to accelerate -/// queries such as volume queries and ray casts. Leafs are proxies -/// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor -/// so that the proxy AABB is bigger than the client object. This allows the client -/// object to move by small amounts without triggering a tree update. -/// -/// Nodes are pooled and relocatable, so we use node indices rather than pointers. -class b2DynamicTree -{ -public: - - /// Constructing the tree initializes the node pool. - b2DynamicTree(); - - /// Destroy the tree, freeing the node pool. - ~b2DynamicTree(); - - /// Create a proxy. Provide a tight fitting AABB and a userData pointer. - int32 CreateProxy(const b2AABB& aabb, void* userData); - - /// Destroy a proxy. This asserts if the id is invalid. - void DestroyProxy(int32 proxyId); - - /// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB, - /// then the proxy is removed from the tree and re-inserted. Otherwise - /// the function returns immediately. - /// @return true if the proxy was re-inserted. - bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); - - /// Perform some iterations to re-balance the tree. - void Rebalance(int32 iterations); - - /// Get proxy user data. - /// @return the proxy user data or 0 if the id is invalid. - void* GetUserData(int32 proxyId) const; - - /// Get the fat AABB for a proxy. - const b2AABB& GetFatAABB(int32 proxyId) const; - - /// Compute the height of the tree. - int32 ComputeHeight() const; - - /// Query an AABB for overlapping proxies. The callback class - /// is called for each proxy that overlaps the supplied AABB. - template - void Query(T* callback, const b2AABB& aabb) const; - - /// Ray-cast against the proxies in the tree. This relies on the callback - /// to perform a exact ray-cast in the case were the proxy contains a shape. - /// The callback also performs the any collision filtering. This has performance - /// roughly equal to k * log(n), where k is the number of collisions and n is the - /// number of proxies in the tree. - /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). - /// @param callback a callback class that is called for each proxy that is hit by the ray. - template - void RayCast(T* callback, const b2RayCastInput& input) const; - -private: - - int32 AllocateNode(); - void FreeNode(int32 node); - - void InsertLeaf(int32 node); - void RemoveLeaf(int32 node); - - int32 ComputeHeight(int32 nodeId) const; - - int32 m_root; - - b2DynamicTreeNode* m_nodes; - int32 m_nodeCount; - int32 m_nodeCapacity; - - int32 m_freeList; - - /// This is used incrementally traverse the tree for re-balancing. - uint32 m_path; - - int32 m_insertionCount; -}; - -inline void* b2DynamicTree::GetUserData(int32 proxyId) const -{ - b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); - return m_nodes[proxyId].userData; -} - -inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const -{ - b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); - return m_nodes[proxyId].aabb; -} - -template -inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const -{ - const int32 k_stackSize = 128; - int32 stack[k_stackSize]; - - int32 count = 0; - stack[count++] = m_root; - - while (count > 0) - { - int32 nodeId = stack[--count]; - if (nodeId == b2_nullNode) - { - continue; - } - - const b2DynamicTreeNode* node = m_nodes + nodeId; - - if (b2TestOverlap(node->aabb, aabb)) - { - if (node->IsLeaf()) - { - bool proceed = callback->QueryCallback(nodeId); - if (proceed == false) - { - return; - } - } - else - { - if (count < k_stackSize) - { - stack[count++] = node->child1; - } - - if (count < k_stackSize) - { - stack[count++] = node->child2; - } - } - } - } -} - -template -inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const -{ - b2Vec2 p1 = input.p1; - b2Vec2 p2 = input.p2; - b2Vec2 r = p2 - p1; - b2Assert(r.LengthSquared() > 0.0f); - r.Normalize(); - - // v is perpendicular to the segment. - b2Vec2 v = b2Cross(1.0f, r); - b2Vec2 abs_v = b2Abs(v); - - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - - float32 maxFraction = input.maxFraction; - - // Build a bounding box for the segment. - b2AABB segmentAABB; - { - b2Vec2 t = p1 + maxFraction * (p2 - p1); - segmentAABB.lowerBound = b2Min(p1, t); - segmentAABB.upperBound = b2Max(p1, t); - } - - const int32 k_stackSize = 128; - int32 stack[k_stackSize]; - - int32 count = 0; - stack[count++] = m_root; - - while (count > 0) - { - int32 nodeId = stack[--count]; - if (nodeId == b2_nullNode) - { - continue; - } - - const b2DynamicTreeNode* node = m_nodes + nodeId; - - if (b2TestOverlap(node->aabb, segmentAABB) == false) - { - continue; - } - - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - b2Vec2 c = node->aabb.GetCenter(); - b2Vec2 h = node->aabb.GetExtents(); - float32 separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h); - if (separation > 0.0f) - { - continue; - } - - if (node->IsLeaf()) - { - b2RayCastInput subInput; - subInput.p1 = input.p1; - subInput.p2 = input.p2; - subInput.maxFraction = maxFraction; - - float32 value = callback->RayCastCallback(subInput, nodeId); - - if (value == 0.0f) - { - // The client has terminated the ray cast. - return; - } - - if (value > 0.0f) - { - // Update segment bounding box. - maxFraction = value; - b2Vec2 t = p1 + maxFraction * (p2 - p1); - segmentAABB.lowerBound = b2Min(p1, t); - segmentAABB.upperBound = b2Max(p1, t); - } - } - else - { - if (count < k_stackSize) - { - stack[count++] = node->child1; - } - - if (count < k_stackSize) - { - stack[count++] = node->child2; - } - } - } -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.cpp deleted file mode 100644 index c22d83305..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -#include - -int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; -int32 b2_toiRootIters, b2_toiMaxRootIters; - -int32 b2_toiMaxOptIters; - -struct b2SeparationFunction -{ - enum Type - { - e_points, - e_faceA, - e_faceB - }; - - // TODO_ERIN might not need to return the separation - - float32 Initialize(const b2SimplexCache* cache, - const b2DistanceProxy* proxyA, const b2Sweep& sweepA, - const b2DistanceProxy* proxyB, const b2Sweep& sweepB) - { - m_proxyA = proxyA; - m_proxyB = proxyB; - int32 count = cache->count; - b2Assert(0 < count && count < 3); - - m_sweepA = sweepA; - m_sweepB = sweepB; - - b2Transform xfA, xfB; - m_sweepA.GetTransform(&xfA, 0.0f); - m_sweepB.GetTransform(&xfB, 0.0f); - - if (count == 1) - { - m_type = e_points; - b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]); - b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); - b2Vec2 pointA = b2Mul(xfA, localPointA); - b2Vec2 pointB = b2Mul(xfB, localPointB); - m_axis = pointB - pointA; - float32 s = m_axis.Normalize(); - return s; - } - else if (cache->indexA[0] == cache->indexA[1]) - { - // Two points on B and one on A. - m_type = e_faceB; - b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]); - b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]); - - m_axis = b2Cross(localPointB2 - localPointB1, 1.0f); - m_axis.Normalize(); - b2Vec2 normal = b2Mul(xfB.R, m_axis); - - m_localPoint = 0.5f * (localPointB1 + localPointB2); - b2Vec2 pointB = b2Mul(xfB, m_localPoint); - - b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]); - b2Vec2 pointA = b2Mul(xfA, localPointA); - - float32 s = b2Dot(pointA - pointB, normal); - if (s < 0.0f) - { - m_axis = -m_axis; - s = -s; - } - return s; - } - else - { - // Two points on A and one or two points on B. - m_type = e_faceA; - b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]); - b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]); - - m_axis = b2Cross(localPointA2 - localPointA1, 1.0f); - m_axis.Normalize(); - b2Vec2 normal = b2Mul(xfA.R, m_axis); - - m_localPoint = 0.5f * (localPointA1 + localPointA2); - b2Vec2 pointA = b2Mul(xfA, m_localPoint); - - b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); - b2Vec2 pointB = b2Mul(xfB, localPointB); - - float32 s = b2Dot(pointB - pointA, normal); - if (s < 0.0f) - { - m_axis = -m_axis; - s = -s; - } - return s; - } - } - - float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const - { - b2Transform xfA, xfB; - m_sweepA.GetTransform(&xfA, t); - m_sweepB.GetTransform(&xfB, t); - - switch (m_type) - { - case e_points: - { - b2Vec2 axisA = b2MulT(xfA.R, m_axis); - b2Vec2 axisB = b2MulT(xfB.R, -m_axis); - - *indexA = m_proxyA->GetSupport(axisA); - *indexB = m_proxyB->GetSupport(axisB); - - b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); - b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); - - b2Vec2 pointA = b2Mul(xfA, localPointA); - b2Vec2 pointB = b2Mul(xfB, localPointB); - - float32 separation = b2Dot(pointB - pointA, m_axis); - return separation; - } - - case e_faceA: - { - b2Vec2 normal = b2Mul(xfA.R, m_axis); - b2Vec2 pointA = b2Mul(xfA, m_localPoint); - - b2Vec2 axisB = b2MulT(xfB.R, -normal); - - *indexA = -1; - *indexB = m_proxyB->GetSupport(axisB); - - b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); - b2Vec2 pointB = b2Mul(xfB, localPointB); - - float32 separation = b2Dot(pointB - pointA, normal); - return separation; - } - - case e_faceB: - { - b2Vec2 normal = b2Mul(xfB.R, m_axis); - b2Vec2 pointB = b2Mul(xfB, m_localPoint); - - b2Vec2 axisA = b2MulT(xfA.R, -normal); - - *indexB = -1; - *indexA = m_proxyA->GetSupport(axisA); - - b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); - b2Vec2 pointA = b2Mul(xfA, localPointA); - - float32 separation = b2Dot(pointA - pointB, normal); - return separation; - } - - default: - b2Assert(false); - *indexA = -1; - *indexB = -1; - return 0.0f; - } - } - - float32 Evaluate(int32 indexA, int32 indexB, float32 t) const - { - b2Transform xfA, xfB; - m_sweepA.GetTransform(&xfA, t); - m_sweepB.GetTransform(&xfB, t); - - switch (m_type) - { - case e_points: - { - b2Vec2 axisA = b2MulT(xfA.R, m_axis); - b2Vec2 axisB = b2MulT(xfB.R, -m_axis); - - b2Vec2 localPointA = m_proxyA->GetVertex(indexA); - b2Vec2 localPointB = m_proxyB->GetVertex(indexB); - - b2Vec2 pointA = b2Mul(xfA, localPointA); - b2Vec2 pointB = b2Mul(xfB, localPointB); - float32 separation = b2Dot(pointB - pointA, m_axis); - - return separation; - } - - case e_faceA: - { - b2Vec2 normal = b2Mul(xfA.R, m_axis); - b2Vec2 pointA = b2Mul(xfA, m_localPoint); - - b2Vec2 axisB = b2MulT(xfB.R, -normal); - - b2Vec2 localPointB = m_proxyB->GetVertex(indexB); - b2Vec2 pointB = b2Mul(xfB, localPointB); - - float32 separation = b2Dot(pointB - pointA, normal); - return separation; - } - - case e_faceB: - { - b2Vec2 normal = b2Mul(xfB.R, m_axis); - b2Vec2 pointB = b2Mul(xfB, m_localPoint); - - b2Vec2 axisA = b2MulT(xfA.R, -normal); - - b2Vec2 localPointA = m_proxyA->GetVertex(indexA); - b2Vec2 pointA = b2Mul(xfA, localPointA); - - float32 separation = b2Dot(pointA - pointB, normal); - return separation; - } - - default: - b2Assert(false); - return 0.0f; - } - } - - const b2DistanceProxy* m_proxyA; - const b2DistanceProxy* m_proxyB; - b2Sweep m_sweepA, m_sweepB; - Type m_type; - b2Vec2 m_localPoint; - b2Vec2 m_axis; -}; - -// CCD via the local separating axis method. This seeks progression -// by computing the largest time at which separation is maintained. -void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input) -{ - ++b2_toiCalls; - - output->state = b2TOIOutput::e_unknown; - output->t = input->tMax; - - const b2DistanceProxy* proxyA = &input->proxyA; - const b2DistanceProxy* proxyB = &input->proxyB; - - b2Sweep sweepA = input->sweepA; - b2Sweep sweepB = input->sweepB; - - // Large rotations can make the root finder fail, so we normalize the - // sweep angles. - sweepA.Normalize(); - sweepB.Normalize(); - - float32 tMax = input->tMax; - - float32 totalRadius = proxyA->m_radius + proxyB->m_radius; - float32 target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop); - float32 tolerance = 0.25f * b2_linearSlop; - b2Assert(target > tolerance); - - float32 t1 = 0.0f; - const int32 k_maxIterations = 20; // TODO_ERIN b2Settings - int32 iter = 0; - - // Prepare input for distance query. - b2SimplexCache cache; - cache.count = 0; - b2DistanceInput distanceInput; - distanceInput.proxyA = input->proxyA; - distanceInput.proxyB = input->proxyB; - distanceInput.useRadii = false; - - // The outer loop progressively attempts to compute new separating axes. - // This loop terminates when an axis is repeated (no progress is made). - for(;;) - { - b2Transform xfA, xfB; - sweepA.GetTransform(&xfA, t1); - sweepB.GetTransform(&xfB, t1); - - // Get the distance between shapes. We can also use the results - // to get a separating axis. - distanceInput.transformA = xfA; - distanceInput.transformB = xfB; - b2DistanceOutput distanceOutput; - b2Distance(&distanceOutput, &cache, &distanceInput); - - // If the shapes are overlapped, we give up on continuous collision. - if (distanceOutput.distance <= 0.0f) - { - // Failure! - output->state = b2TOIOutput::e_overlapped; - output->t = 0.0f; - break; - } - - if (distanceOutput.distance < target + tolerance) - { - // Victory! - output->state = b2TOIOutput::e_touching; - output->t = t1; - break; - } - - // Initialize the separating axis. - b2SeparationFunction fcn; - fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB); -#if 0 - // Dump the curve seen by the root finder - { - const int32 N = 100; - float32 dx = 1.0f / N; - float32 xs[N+1]; - float32 fs[N+1]; - - float32 x = 0.0f; - - for (int32 i = 0; i <= N; ++i) - { - sweepA.GetTransform(&xfA, x); - sweepB.GetTransform(&xfB, x); - float32 f = fcn.Evaluate(xfA, xfB) - target; - - printf("%g %g\n", x, f); - - xs[i] = x; - fs[i] = f; - - x += dx; - } - } -#endif - - // Compute the TOI on the separating axis. We do this by successively - // resolving the deepest point. This loop is bounded by the number of vertices. - bool done = false; - float32 t2 = tMax; - int32 pushBackIter = 0; - for (;;) - { - // Find the deepest point at t2. Store the witness point indices. - int32 indexA, indexB; - float32 s2 = fcn.FindMinSeparation(&indexA, &indexB, t2); - - // Is the final configuration separated? - if (s2 > target + tolerance) - { - // Victory! - output->state = b2TOIOutput::e_separated; - output->t = tMax; - done = true; - break; - } - - // Has the separation reached tolerance? - if (s2 > target - tolerance) - { - // Advance the sweeps - t1 = t2; - break; - } - - // Compute the initial separation of the witness points. - float32 s1 = fcn.Evaluate(indexA, indexB, t1); - - // Check for initial overlap. This might happen if the root finder - // runs out of iterations. - if (s1 < target - tolerance) - { - output->state = b2TOIOutput::e_failed; - output->t = t1; - done = true; - break; - } - - // Check for touching - if (s1 <= target + tolerance) - { - // Victory! t1 should hold the TOI (could be 0.0). - output->state = b2TOIOutput::e_touching; - output->t = t1; - done = true; - break; - } - - // Compute 1D root of: f(x) - target = 0 - int32 rootIterCount = 0; - float32 a1 = t1, a2 = t2; - for (;;) - { - // Use a mix of the secant rule and bisection. - float32 t; - if (rootIterCount & 1) - { - // Secant rule to improve convergence. - t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); - } - else - { - // Bisection to guarantee progress. - t = 0.5f * (a1 + a2); - } - - float32 s = fcn.Evaluate(indexA, indexB, t); - - if (b2Abs(s - target) < tolerance) - { - // t2 holds a tentative value for t1 - t2 = t; - break; - } - - // Ensure we continue to bracket the root. - if (s > target) - { - a1 = t; - s1 = s; - } - else - { - a2 = t; - s2 = s; - } - - ++rootIterCount; - ++b2_toiRootIters; - - if (rootIterCount == 50) - { - break; - } - } - - b2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount); - - ++pushBackIter; - - if (pushBackIter == b2_maxPolygonVertices) - { - break; - } - } - - ++iter; - ++b2_toiIters; - - if (done) - { - break; - } - - if (iter == k_maxIterations) - { - // Root finder got stuck. Semi-victory. - output->state = b2TOIOutput::e_failed; - output->t = t1; - break; - } - } - - b2_toiMaxIters = b2Max(b2_toiMaxIters, iter); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.h deleted file mode 100644 index 217a171f5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/b2TimeOfImpact.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_TIME_OF_IMPACT_H -#define B2_TIME_OF_IMPACT_H - -#include -#include -#include - -/// Input parameters for b2TimeOfImpact -struct b2TOIInput -{ - b2DistanceProxy proxyA; - b2DistanceProxy proxyB; - b2Sweep sweepA; - b2Sweep sweepB; - float32 tMax; // defines sweep interval [0, tMax] -}; - -// Output parameters for b2TimeOfImpact. -struct b2TOIOutput -{ - enum State - { - e_unknown, - e_failed, - e_overlapped, - e_touching, - e_separated - }; - - State state; - float32 t; -}; - -/// Compute the upper bound on time before two shapes penetrate. Time is represented as -/// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate, -/// non-tunneling collision. If you change the time interval, you should call this function -/// again. -/// Note: use b2Distance to compute the contact point and normal at the time of impact. -void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input); - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.cpp deleted file mode 100644 index 3eeef7ba5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = -{ - 16, // 0 - 32, // 1 - 64, // 2 - 96, // 3 - 128, // 4 - 160, // 5 - 192, // 6 - 224, // 7 - 256, // 8 - 320, // 9 - 384, // 10 - 448, // 11 - 512, // 12 - 640, // 13 -}; -uint8 b2BlockAllocator::s_blockSizeLookup[b2_maxBlockSize + 1]; -bool b2BlockAllocator::s_blockSizeLookupInitialized; - -struct b2Chunk -{ - int32 blockSize; - b2Block* blocks; -}; - -struct b2Block -{ - b2Block* next; -}; - -b2BlockAllocator::b2BlockAllocator() -{ - b2Assert(b2_blockSizes < UCHAR_MAX); - - m_chunkSpace = b2_chunkArrayIncrement; - m_chunkCount = 0; - m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); - - memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); - memset(m_freeLists, 0, sizeof(m_freeLists)); - - if (s_blockSizeLookupInitialized == false) - { - int32 j = 0; - for (int32 i = 1; i <= b2_maxBlockSize; ++i) - { - b2Assert(j < b2_blockSizes); - if (i <= s_blockSizes[j]) - { - s_blockSizeLookup[i] = (uint8)j; - } - else - { - ++j; - s_blockSizeLookup[i] = (uint8)j; - } - } - - s_blockSizeLookupInitialized = true; - } -} - -b2BlockAllocator::~b2BlockAllocator() -{ - for (int32 i = 0; i < m_chunkCount; ++i) - { - b2Free(m_chunks[i].blocks); - } - - b2Free(m_chunks); -} - -void* b2BlockAllocator::Allocate(int32 size) -{ - if (size == 0) - return NULL; - - b2Assert(0 < size && size <= b2_maxBlockSize); - - int32 index = s_blockSizeLookup[size]; - b2Assert(0 <= index && index < b2_blockSizes); - - if (m_freeLists[index]) - { - b2Block* block = m_freeLists[index]; - m_freeLists[index] = block->next; - return block; - } - else - { - if (m_chunkCount == m_chunkSpace) - { - b2Chunk* oldChunks = m_chunks; - m_chunkSpace += b2_chunkArrayIncrement; - m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); - memcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk)); - memset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk)); - b2Free(oldChunks); - } - - b2Chunk* chunk = m_chunks + m_chunkCount; - chunk->blocks = (b2Block*)b2Alloc(b2_chunkSize); -#if defined(_DEBUG) - memset(chunk->blocks, 0xcd, b2_chunkSize); -#endif - int32 blockSize = s_blockSizes[index]; - chunk->blockSize = blockSize; - int32 blockCount = b2_chunkSize / blockSize; - b2Assert(blockCount * blockSize <= b2_chunkSize); - for (int32 i = 0; i < blockCount - 1; ++i) - { - b2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i); - b2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1)); - block->next = next; - } - b2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1)); - last->next = NULL; - - m_freeLists[index] = chunk->blocks->next; - ++m_chunkCount; - - return chunk->blocks; - } -} - -void b2BlockAllocator::Free(void* p, int32 size) -{ - if (size == 0) - { - return; - } - - b2Assert(0 < size && size <= b2_maxBlockSize); - - int32 index = s_blockSizeLookup[size]; - b2Assert(0 <= index && index < b2_blockSizes); - -#ifdef _DEBUG - // Verify the memory address and size is valid. - int32 blockSize = s_blockSizes[index]; - bool found = false; - for (int32 i = 0; i < m_chunkCount; ++i) - { - b2Chunk* chunk = m_chunks + i; - if (chunk->blockSize != blockSize) - { - b2Assert( (int8*)p + blockSize <= (int8*)chunk->blocks || - (int8*)chunk->blocks + b2_chunkSize <= (int8*)p); - } - else - { - if ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize) - { - found = true; - } - } - } - - b2Assert(found); - - memset(p, 0xfd, blockSize); -#endif - - b2Block* block = (b2Block*)p; - block->next = m_freeLists[index]; - m_freeLists[index] = block; -} - -void b2BlockAllocator::Clear() -{ - for (int32 i = 0; i < m_chunkCount; ++i) - { - b2Free(m_chunks[i].blocks); - } - - m_chunkCount = 0; - memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); - - memset(m_freeLists, 0, sizeof(m_freeLists)); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.h deleted file mode 100644 index f493b17b1..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2BlockAllocator.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_BLOCK_ALLOCATOR_H -#define B2_BLOCK_ALLOCATOR_H - -#include - -const int32 b2_chunkSize = 4096; -const int32 b2_maxBlockSize = 640; -const int32 b2_blockSizes = 14; -const int32 b2_chunkArrayIncrement = 128; - -struct b2Block; -struct b2Chunk; - -// This is a small object allocator used for allocating small -// objects that persist for more than one time step. -// See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp -class b2BlockAllocator -{ -public: - b2BlockAllocator(); - ~b2BlockAllocator(); - - void* Allocate(int32 size); - void Free(void* p, int32 size); - - void Clear(); - -private: - - b2Chunk* m_chunks; - int32 m_chunkCount; - int32 m_chunkSpace; - - b2Block* m_freeLists[b2_blockSizes]; - - static int32 s_blockSizes[b2_blockSizes]; - static uint8 s_blockSizeLookup[b2_maxBlockSize + 1]; - static bool s_blockSizeLookupInitialized; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.cpp deleted file mode 100644 index 0c96b341e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include - -const b2Vec2 b2Vec2_zero(0.0f, 0.0f); -const b2Mat22 b2Mat22_identity(1.0f, 0.0f, 0.0f, 1.0f); -const b2Transform b2Transform_identity(b2Vec2_zero, b2Mat22_identity); - -/// Solve A * x = b, where b is a column vector. This is more efficient -/// than computing the inverse in one-shot cases. -b2Vec3 b2Mat33::Solve33(const b2Vec3& b) const -{ - float32 det = b2Dot(col1, b2Cross(col2, col3)); - if (det != 0.0f) - { - det = 1.0f / det; - } - b2Vec3 x; - x.x = det * b2Dot(b, b2Cross(col2, col3)); - x.y = det * b2Dot(col1, b2Cross(b, col3)); - x.z = det * b2Dot(col1, b2Cross(col2, b)); - return x; -} - -/// Solve A * x = b, where b is a column vector. This is more efficient -/// than computing the inverse in one-shot cases. -b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const -{ - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; - float32 det = a11 * a22 - a12 * a21; - if (det != 0.0f) - { - det = 1.0f / det; - } - b2Vec2 x; - x.x = det * (a22 * b.x - a12 * b.y); - x.y = det * (a11 * b.y - a21 * b.x); - return x; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.h deleted file mode 100644 index b6ba49497..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Math.h +++ /dev/null @@ -1,625 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_MATH_H -#define B2_MATH_H - -#include - -#include -#include -#include -#include - -/// This function is used to ensure that a floating point number is -/// not a NaN or infinity. -inline bool b2IsValid(float32 x) -{ - if (x != x) - { - // NaN. - return false; - } - - float32 infinity = std::numeric_limits::infinity(); - return -infinity < x && x < infinity; -} - -/// This is a approximate yet fast inverse square-root. -inline float32 b2InvSqrt(float32 x) -{ - union - { - float32 x; - int32 i; - } convert; - - convert.x = x; - float32 xhalf = 0.5f * x; - convert.i = 0x5f3759df - (convert.i >> 1); - x = convert.x; - x = x * (1.5f - xhalf * x * x); - return x; -} - -#define b2Sqrt(x) sqrtf(x) -#define b2Atan2(y, x) atan2f(y, x) - -inline float32 b2Abs(float32 a) -{ - return a > 0.0f ? a : -a; -} - -/// A 2D column vector. -struct b2Vec2 -{ - /// Default constructor does nothing (for performance). - b2Vec2() {} - - /// Construct using coordinates. - b2Vec2(float32 x, float32 y) : x(x), y(y) {} - - /// Set this vector to all zeros. - void SetZero() { x = 0.0f; y = 0.0f; } - - /// Set this vector to some specified coordinates. - void Set(float32 x_, float32 y_) { x = x_; y = y_; } - - /// Negate this vector. - b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; } - - /// Read from and indexed element. - float32 operator () (int32 i) const - { - return (&x)[i]; - } - - /// Write to an indexed element. - float32& operator () (int32 i) - { - return (&x)[i]; - } - - /// Add a vector to this vector. - void operator += (const b2Vec2& v) - { - x += v.x; y += v.y; - } - - /// Subtract a vector from this vector. - void operator -= (const b2Vec2& v) - { - x -= v.x; y -= v.y; - } - - /// Multiply this vector by a scalar. - void operator *= (float32 a) - { - x *= a; y *= a; - } - - /// Get the length of this vector (the norm). - float32 Length() const - { - return b2Sqrt(x * x + y * y); - } - - /// Get the length squared. For performance, use this instead of - /// b2Vec2::Length (if possible). - float32 LengthSquared() const - { - return x * x + y * y; - } - - /// Convert this vector into a unit vector. Returns the length. - float32 Normalize() - { - float32 length = Length(); - if (length < b2_epsilon) - { - return 0.0f; - } - float32 invLength = 1.0f / length; - x *= invLength; - y *= invLength; - - return length; - } - - /// Does this vector contain finite coordinates? - bool IsValid() const - { - return b2IsValid(x) && b2IsValid(y); - } - - float32 x, y; -}; - -/// A 2D column vector with 3 elements. -struct b2Vec3 -{ - /// Default constructor does nothing (for performance). - b2Vec3() {} - - /// Construct using coordinates. - b2Vec3(float32 x, float32 y, float32 z) : x(x), y(y), z(z) {} - - /// Set this vector to all zeros. - void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; } - - /// Set this vector to some specified coordinates. - void Set(float32 x_, float32 y_, float32 z_) { x = x_; y = y_; z = z_; } - - /// Negate this vector. - b2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; } - - /// Add a vector to this vector. - void operator += (const b2Vec3& v) - { - x += v.x; y += v.y; z += v.z; - } - - /// Subtract a vector from this vector. - void operator -= (const b2Vec3& v) - { - x -= v.x; y -= v.y; z -= v.z; - } - - /// Multiply this vector by a scalar. - void operator *= (float32 s) - { - x *= s; y *= s; z *= s; - } - - float32 x, y, z; -}; - -/// A 2-by-2 matrix. Stored in column-major order. -struct b2Mat22 -{ - /// The default constructor does nothing (for performance). - b2Mat22() {} - - /// Construct this matrix using columns. - b2Mat22(const b2Vec2& c1, const b2Vec2& c2) - { - col1 = c1; - col2 = c2; - } - - /// Construct this matrix using scalars. - b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22) - { - col1.x = a11; col1.y = a21; - col2.x = a12; col2.y = a22; - } - - /// Construct this matrix using an angle. This matrix becomes - /// an orthonormal rotation matrix. - explicit b2Mat22(float32 angle) - { - // TODO_ERIN compute sin+cos together. - float32 c = cosf(angle), s = sinf(angle); - col1.x = c; col2.x = -s; - col1.y = s; col2.y = c; - } - - /// Initialize this matrix using columns. - void Set(const b2Vec2& c1, const b2Vec2& c2) - { - col1 = c1; - col2 = c2; - } - - /// Initialize this matrix using an angle. This matrix becomes - /// an orthonormal rotation matrix. - void Set(float32 angle) - { - float32 c = cosf(angle), s = sinf(angle); - col1.x = c; col2.x = -s; - col1.y = s; col2.y = c; - } - - /// Set this to the identity matrix. - void SetIdentity() - { - col1.x = 1.0f; col2.x = 0.0f; - col1.y = 0.0f; col2.y = 1.0f; - } - - /// Set this matrix to all zeros. - void SetZero() - { - col1.x = 0.0f; col2.x = 0.0f; - col1.y = 0.0f; col2.y = 0.0f; - } - - /// Extract the angle from this matrix (assumed to be - /// a rotation matrix). - float32 GetAngle() const - { - return b2Atan2(col1.y, col1.x); - } - - b2Mat22 GetInverse() const - { - float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; - b2Mat22 B; - float32 det = a * d - b * c; - if (det != 0.0f) - { - det = 1.0f / det; - } - B.col1.x = det * d; B.col2.x = -det * b; - B.col1.y = -det * c; B.col2.y = det * a; - return B; - } - - /// Solve A * x = b, where b is a column vector. This is more efficient - /// than computing the inverse in one-shot cases. - b2Vec2 Solve(const b2Vec2& b) const - { - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; - float32 det = a11 * a22 - a12 * a21; - if (det != 0.0f) - { - det = 1.0f / det; - } - b2Vec2 x; - x.x = det * (a22 * b.x - a12 * b.y); - x.y = det * (a11 * b.y - a21 * b.x); - return x; - } - - b2Vec2 col1, col2; -}; - -/// A 3-by-3 matrix. Stored in column-major order. -struct b2Mat33 -{ - /// The default constructor does nothing (for performance). - b2Mat33() {} - - /// Construct this matrix using columns. - b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3) - { - col1 = c1; - col2 = c2; - col3 = c3; - } - - /// Set this matrix to all zeros. - void SetZero() - { - col1.SetZero(); - col2.SetZero(); - col3.SetZero(); - } - - /// Solve A * x = b, where b is a column vector. This is more efficient - /// than computing the inverse in one-shot cases. - b2Vec3 Solve33(const b2Vec3& b) const; - - /// Solve A * x = b, where b is a column vector. This is more efficient - /// than computing the inverse in one-shot cases. Solve only the upper - /// 2-by-2 matrix equation. - b2Vec2 Solve22(const b2Vec2& b) const; - - b2Vec3 col1, col2, col3; -}; - -/// A transform contains translation and rotation. It is used to represent -/// the position and orientation of rigid frames. -struct b2Transform -{ - /// The default constructor does nothing (for performance). - b2Transform() {} - - /// Initialize using a position vector and a rotation matrix. - b2Transform(const b2Vec2& position, const b2Mat22& R) : position(position), R(R) {} - - /// Set this to the identity transform. - void SetIdentity() - { - position.SetZero(); - R.SetIdentity(); - } - - /// Set this based on the position and angle. - void Set(const b2Vec2& p, float32 angle) - { - position = p; - R.Set(angle); - } - - /// Calculate the angle that the rotation matrix represents. - float32 GetAngle() const - { - return b2Atan2(R.col1.y, R.col1.x); - } - - b2Vec2 position; - b2Mat22 R; -}; - -/// This describes the motion of a body/shape for TOI computation. -/// Shapes are defined with respect to the body origin, which may -/// no coincide with the center of mass. However, to support dynamics -/// we must interpolate the center of mass position. -struct b2Sweep -{ - /// Get the interpolated transform at a specific time. - /// @param alpha is a factor in [0,1], where 0 indicates t0. - void GetTransform(b2Transform* xf, float32 alpha) const; - - /// Advance the sweep forward, yielding a new initial state. - /// @param t the new initial time. - void Advance(float32 t); - - /// Normalize the angles. - void Normalize(); - - b2Vec2 localCenter; ///< local center of mass position - b2Vec2 c0, c; ///< center world positions - float32 a0, a; ///< world angles -}; - - -extern const b2Vec2 b2Vec2_zero; -extern const b2Mat22 b2Mat22_identity; -extern const b2Transform b2Transform_identity; - -/// Perform the dot product on two vectors. -inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) -{ - return a.x * b.x + a.y * b.y; -} - -/// Perform the cross product on two vectors. In 2D this produces a scalar. -inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) -{ - return a.x * b.y - a.y * b.x; -} - -/// Perform the cross product on a vector and a scalar. In 2D this produces -/// a vector. -inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) -{ - return b2Vec2(s * a.y, -s * a.x); -} - -/// Perform the cross product on a scalar and a vector. In 2D this produces -/// a vector. -inline b2Vec2 b2Cross(float32 s, const b2Vec2& a) -{ - return b2Vec2(-s * a.y, s * a.x); -} - -/// Multiply a matrix times a vector. If a rotation matrix is provided, -/// then this transforms the vector from one frame to another. -inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v) -{ - return b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y); -} - -/// Multiply a matrix transpose times a vector. If a rotation matrix is provided, -/// then this transforms the vector from one frame to another (inverse transform). -inline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v) -{ - return b2Vec2(b2Dot(v, A.col1), b2Dot(v, A.col2)); -} - -/// Add two vectors component-wise. -inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b) -{ - return b2Vec2(a.x + b.x, a.y + b.y); -} - -/// Subtract two vectors component-wise. -inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b) -{ - return b2Vec2(a.x - b.x, a.y - b.y); -} - -inline b2Vec2 operator * (float32 s, const b2Vec2& a) -{ - return b2Vec2(s * a.x, s * a.y); -} - -inline bool operator == (const b2Vec2& a, const b2Vec2& b) -{ - return a.x == b.x && a.y == b.y; -} - -inline float32 b2Distance(const b2Vec2& a, const b2Vec2& b) -{ - b2Vec2 c = a - b; - return c.Length(); -} - -inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b) -{ - b2Vec2 c = a - b; - return b2Dot(c, c); -} - -inline b2Vec3 operator * (float32 s, const b2Vec3& a) -{ - return b2Vec3(s * a.x, s * a.y, s * a.z); -} - -/// Add two vectors component-wise. -inline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b) -{ - return b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z); -} - -/// Subtract two vectors component-wise. -inline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b) -{ - return b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z); -} - -/// Perform the dot product on two vectors. -inline float32 b2Dot(const b2Vec3& a, const b2Vec3& b) -{ - return a.x * b.x + a.y * b.y + a.z * b.z; -} - -/// Perform the cross product on two vectors. -inline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b) -{ - return b2Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); -} - -inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B) -{ - return b2Mat22(A.col1 + B.col1, A.col2 + B.col2); -} - -// A * B -inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B) -{ - return b2Mat22(b2Mul(A, B.col1), b2Mul(A, B.col2)); -} - -// A^T * B -inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B) -{ - b2Vec2 c1(b2Dot(A.col1, B.col1), b2Dot(A.col2, B.col1)); - b2Vec2 c2(b2Dot(A.col1, B.col2), b2Dot(A.col2, B.col2)); - return b2Mat22(c1, c2); -} - -/// Multiply a matrix times a vector. -inline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v) -{ - return v.x * A.col1 + v.y * A.col2 + v.z * A.col3; -} - -inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v) -{ - float32 x = T.position.x + T.R.col1.x * v.x + T.R.col2.x * v.y; - float32 y = T.position.y + T.R.col1.y * v.x + T.R.col2.y * v.y; - - return b2Vec2(x, y); -} - -inline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v) -{ - return b2MulT(T.R, v - T.position); -} - -inline b2Vec2 b2Abs(const b2Vec2& a) -{ - return b2Vec2(b2Abs(a.x), b2Abs(a.y)); -} - -inline b2Mat22 b2Abs(const b2Mat22& A) -{ - return b2Mat22(b2Abs(A.col1), b2Abs(A.col2)); -} - -template -inline T b2Min(T a, T b) -{ - return a < b ? a : b; -} - -inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b) -{ - return b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y)); -} - -template -inline T b2Max(T a, T b) -{ - return a > b ? a : b; -} - -inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b) -{ - return b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y)); -} - -template -inline T b2Clamp(T a, T low, T high) -{ - return b2Max(low, b2Min(a, high)); -} - -inline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high) -{ - return b2Max(low, b2Min(a, high)); -} - -template inline void b2Swap(T& a, T& b) -{ - T tmp = a; - a = b; - b = tmp; -} - -/// "Next Largest Power of 2 -/// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm -/// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with -/// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next -/// largest power of 2. For a 32-bit value:" -inline uint32 b2NextPowerOfTwo(uint32 x) -{ - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x + 1; -} - -inline bool b2IsPowerOfTwo(uint32 x) -{ - bool result = x > 0 && (x & (x - 1)) == 0; - return result; -} - -inline void b2Sweep::GetTransform(b2Transform* xf, float32 alpha) const -{ - xf->position = (1.0f - alpha) * c0 + alpha * c; - float32 angle = (1.0f - alpha) * a0 + alpha * a; - xf->R.Set(angle); - - // Shift to origin - xf->position -= b2Mul(xf->R, localCenter); -} - -inline void b2Sweep::Advance(float32 t) -{ - c0 = (1.0f - t) * c0 + t * c; - a0 = (1.0f - t) * a0 + t * a; -} - -/// Normalize an angle in radians to be between -pi and pi -inline void b2Sweep::Normalize() -{ - float32 twoPi = 2.0f * b2_pi; - float32 d = twoPi * floorf(a0 / twoPi); - a0 -= d; - a -= d; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.cpp deleted file mode 100644 index f23bd95b4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -b2Version b2_version = {2, 1, 2}; - -// Memory allocators. Modify these to use your own allocator. -void* b2Alloc(int32 size) -{ - return malloc(size); -} - -void b2Free(void* mem) -{ - free(mem); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.h deleted file mode 100644 index 5905652f4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2Settings.h +++ /dev/null @@ -1,152 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_SETTINGS_H -#define B2_SETTINGS_H - -#include -#include - -#define B2_NOT_USED(x) ((void)(x)) -#define b2Assert(A) assert(A) - -typedef signed char int8; -typedef signed short int16; -typedef signed int int32; -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; -typedef float float32; - -#define b2_maxFloat FLT_MAX -#define b2_epsilon FLT_EPSILON -#define b2_pi 3.14159265359f - -/// @file -/// Global tuning constants based on meters-kilograms-seconds (MKS) units. -/// - -// Collision - -/// The maximum number of contact points between two convex shapes. -#define b2_maxManifoldPoints 2 - -/// The maximum number of vertices on a convex polygon. -#define b2_maxPolygonVertices 8 - -/// This is used to fatten AABBs in the dynamic tree. This allows proxies -/// to move by a small amount without triggering a tree adjustment. -/// This is in meters. -#define b2_aabbExtension 0.1f - -/// This is used to fatten AABBs in the dynamic tree. This is used to predict -/// the future position based on the current displacement. -/// This is a dimensionless multiplier. -#define b2_aabbMultiplier 2.0f - -/// A small length used as a collision and constraint tolerance. Usually it is -/// chosen to be numerically significant, but visually insignificant. -#define b2_linearSlop 0.005f - -/// A small angle used as a collision and constraint tolerance. Usually it is -/// chosen to be numerically significant, but visually insignificant. -#define b2_angularSlop (2.0f / 180.0f * b2_pi) - -/// The radius of the polygon/edge shape skin. This should not be modified. Making -/// this smaller means polygons will have an insufficient buffer for continuous collision. -/// Making it larger may create artifacts for vertex collision. -#define b2_polygonRadius (2.0f * b2_linearSlop) - - -// Dynamics - -/// Maximum number of contacts to be handled to solve a TOI impact. -#define b2_maxTOIContacts 32 - -/// A velocity threshold for elastic collisions. Any collision with a relative linear -/// velocity below this threshold will be treated as inelastic. -#define b2_velocityThreshold 1.0f - -/// The maximum linear position correction used when solving constraints. This helps to -/// prevent overshoot. -#define b2_maxLinearCorrection 0.2f - -/// The maximum angular position correction used when solving constraints. This helps to -/// prevent overshoot. -#define b2_maxAngularCorrection (8.0f / 180.0f * b2_pi) - -/// The maximum linear velocity of a body. This limit is very large and is used -/// to prevent numerical problems. You shouldn't need to adjust this. -#define b2_maxTranslation 2.0f -#define b2_maxTranslationSquared (b2_maxTranslation * b2_maxTranslation) - -/// The maximum angular velocity of a body. This limit is very large and is used -/// to prevent numerical problems. You shouldn't need to adjust this. -#define b2_maxRotation (0.5f * b2_pi) -#define b2_maxRotationSquared (b2_maxRotation * b2_maxRotation) - -/// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so -/// that overlap is removed in one time step. However using values close to 1 often lead -/// to overshoot. -#define b2_contactBaumgarte 0.2f - -// Sleep - -/// The time that a body must be still before it will go to sleep. -#define b2_timeToSleep 0.5f - -/// A body cannot sleep if its linear velocity is above this tolerance. -#define b2_linearSleepTolerance 0.01f - -/// A body cannot sleep if its angular velocity is above this tolerance. -#define b2_angularSleepTolerance (2.0f / 180.0f * b2_pi) - -// Memory Allocation - -/// Implement this function to use your own memory allocator. -void* b2Alloc(int32 size); - -/// If you implement b2Alloc, you should also implement this function. -void b2Free(void* mem); - -/// Version numbering scheme. -/// See http://en.wikipedia.org/wiki/Software_versioning -struct b2Version -{ - int32 major; ///< significant changes - int32 minor; ///< incremental changes - int32 revision; ///< bug fixes -}; - -/// Current version. -extern b2Version b2_version; - -/// Friction mixing law. Feel free to customize this. -inline float32 b2MixFriction(float32 friction1, float32 friction2) -{ - return sqrtf(friction1 * friction2); -} - -/// Restitution mixing law. Feel free to customize this. -inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) -{ - return restitution1 > restitution2 ? restitution1 : restitution2; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.cpp deleted file mode 100644 index bf688d076..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -b2StackAllocator::b2StackAllocator() -{ - m_index = 0; - m_allocation = 0; - m_maxAllocation = 0; - m_entryCount = 0; -} - -b2StackAllocator::~b2StackAllocator() -{ - b2Assert(m_index == 0); - b2Assert(m_entryCount == 0); -} - -void* b2StackAllocator::Allocate(int32 size) -{ - b2Assert(m_entryCount < b2_maxStackEntries); - - b2StackEntry* entry = m_entries + m_entryCount; - entry->size = size; - if (m_index + size > b2_stackSize) - { - entry->data = (char*)b2Alloc(size); - entry->usedMalloc = true; - } - else - { - entry->data = m_data + m_index; - entry->usedMalloc = false; - m_index += size; - } - - m_allocation += size; - m_maxAllocation = b2Max(m_maxAllocation, m_allocation); - ++m_entryCount; - - return entry->data; -} - -void b2StackAllocator::Free(void* p) -{ - b2Assert(m_entryCount > 0); - b2StackEntry* entry = m_entries + m_entryCount - 1; - b2Assert(p == entry->data); - if (entry->usedMalloc) - { - b2Free(p); - } - else - { - m_index -= entry->size; - } - m_allocation -= entry->size; - --m_entryCount; - - p = NULL; -} - -int32 b2StackAllocator::GetMaxAllocation() const -{ - return m_maxAllocation; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.h deleted file mode 100644 index 1979aa0da..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/b2StackAllocator.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_STACK_ALLOCATOR_H -#define B2_STACK_ALLOCATOR_H - -#include - -const int32 b2_stackSize = 100 * 1024; // 100k -const int32 b2_maxStackEntries = 32; - -struct b2StackEntry -{ - char* data; - int32 size; - bool usedMalloc; -}; - -// This is a stack allocator used for fast per step allocations. -// You must nest allocate/free pairs. The code will assert -// if you try to interleave multiple allocate/free pairs. -class b2StackAllocator -{ -public: - b2StackAllocator(); - ~b2StackAllocator(); - - void* Allocate(int32 size); - void Free(void* p); - - int32 GetMaxAllocation() const; - -private: - - char m_data[b2_stackSize]; - int32 m_index; - - int32 m_allocation; - int32 m_maxAllocation; - - b2StackEntry m_entries[b2_maxStackEntries]; - int32 m_entryCount; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.cpp deleted file mode 100644 index df1c33be3..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include - -#include - -b2Contact* b2CircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2CircleContact)); - return new (mem) b2CircleContact(fixtureA, fixtureB); -} - -void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2CircleContact*)contact)->~b2CircleContact(); - allocator->Free(contact, sizeof(b2CircleContact)); -} - -b2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) - : b2Contact(fixtureA, fixtureB) -{ - b2Assert(m_fixtureA->GetType() == b2Shape::e_circle); - b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); -} - -void b2CircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -{ - b2CollideCircles(manifold, - (b2CircleShape*)m_fixtureA->GetShape(), xfA, - (b2CircleShape*)m_fixtureB->GetShape(), xfB); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.h deleted file mode 100644 index 290c1f436..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2CircleContact.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CIRCLE_CONTACT_H -#define B2_CIRCLE_CONTACT_H - -#include - -class b2BlockAllocator; - -class b2CircleContact : public b2Contact -{ -public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - - b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); - ~b2CircleContact() {} - - void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp deleted file mode 100644 index 483eacf23..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -b2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; -bool b2Contact::s_initialized = false; - -void b2Contact::InitializeRegisters() -{ - AddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle); - AddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle); - AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon); -} - -void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, - b2Shape::Type type1, b2Shape::Type type2) -{ - b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); - - s_registers[type1][type2].createFcn = createFcn; - s_registers[type1][type2].destroyFcn = destoryFcn; - s_registers[type1][type2].primary = true; - - if (type1 != type2) - { - s_registers[type2][type1].createFcn = createFcn; - s_registers[type2][type1].destroyFcn = destoryFcn; - s_registers[type2][type1].primary = false; - } -} - -b2Contact* b2Contact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -{ - if (s_initialized == false) - { - InitializeRegisters(); - s_initialized = true; - } - - b2Shape::Type type1 = fixtureA->GetType(); - b2Shape::Type type2 = fixtureB->GetType(); - - b2Assert(b2Shape::e_unknown < type1 && type1 < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < type2 && type2 < b2Shape::e_typeCount); - - b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; - if (createFcn) - { - if (s_registers[type1][type2].primary) - { - return createFcn(fixtureA, fixtureB, allocator); - } - else - { - return createFcn(fixtureB, fixtureA, allocator); - } - } - else - { - return NULL; - } -} - -void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - b2Assert(s_initialized == true); - - if (contact->m_manifold.pointCount > 0) - { - contact->GetFixtureA()->GetBody()->SetAwake(true); - contact->GetFixtureB()->GetBody()->SetAwake(true); - } - - b2Shape::Type typeA = contact->GetFixtureA()->GetType(); - b2Shape::Type typeB = contact->GetFixtureB()->GetType(); - - b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); - b2Assert(b2Shape::e_unknown < typeA && typeB < b2Shape::e_typeCount); - - b2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn; - destroyFcn(contact, allocator); -} - -b2Contact::b2Contact(b2Fixture* fA, b2Fixture* fB) -{ - m_flags = e_enabledFlag; - - m_fixtureA = fA; - m_fixtureB = fB; - - m_manifold.pointCount = 0; - - m_prev = NULL; - m_next = NULL; - - m_nodeA.contact = NULL; - m_nodeA.prev = NULL; - m_nodeA.next = NULL; - m_nodeA.other = NULL; - - m_nodeB.contact = NULL; - m_nodeB.prev = NULL; - m_nodeB.next = NULL; - m_nodeB.other = NULL; - - m_toiCount = 0; -} - -// Update the contact manifold and touching status. -// Note: do not assume the fixture AABBs are overlapping or are valid. -void b2Contact::Update(b2ContactListener* listener) -{ - b2Manifold oldManifold = m_manifold; - - // Re-enable this contact. - m_flags |= e_enabledFlag; - - bool touching = false; - bool wasTouching = (m_flags & e_touchingFlag) == e_touchingFlag; - - bool sensorA = m_fixtureA->IsSensor(); - bool sensorB = m_fixtureB->IsSensor(); - bool sensor = sensorA || sensorB; - - b2Body* bodyA = m_fixtureA->GetBody(); - b2Body* bodyB = m_fixtureB->GetBody(); - const b2Transform& xfA = bodyA->GetTransform(); - const b2Transform& xfB = bodyB->GetTransform(); - - // Is this contact a sensor? - if (sensor) - { - const b2Shape* shapeA = m_fixtureA->GetShape(); - const b2Shape* shapeB = m_fixtureB->GetShape(); - touching = b2TestOverlap(shapeA, shapeB, xfA, xfB); - - // Sensors don't generate manifolds. - m_manifold.pointCount = 0; - } - else - { - Evaluate(&m_manifold, xfA, xfB); - touching = m_manifold.pointCount > 0; - - // Match old contact ids to new contact ids and copy the - // stored impulses to warm start the solver. - for (int32 i = 0; i < m_manifold.pointCount; ++i) - { - b2ManifoldPoint* mp2 = m_manifold.points + i; - mp2->normalImpulse = 0.0f; - mp2->tangentImpulse = 0.0f; - b2ContactID id2 = mp2->id; - - for (int32 j = 0; j < oldManifold.pointCount; ++j) - { - b2ManifoldPoint* mp1 = oldManifold.points + j; - - if (mp1->id.key == id2.key) - { - mp2->normalImpulse = mp1->normalImpulse; - mp2->tangentImpulse = mp1->tangentImpulse; - break; - } - } - } - - if (touching != wasTouching) - { - bodyA->SetAwake(true); - bodyB->SetAwake(true); - } - } - - if (touching) - { - m_flags |= e_touchingFlag; - } - else - { - m_flags &= ~e_touchingFlag; - } - - if (wasTouching == false && touching == true && listener) - { - listener->BeginContact(this); - } - - if (wasTouching == true && touching == false && listener) - { - listener->EndContact(this); - } - - if (sensor == false && touching && listener) - { - listener->PreSolve(this, &oldManifold); - } -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.h deleted file mode 100644 index dbcb54dc1..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2Contact.h +++ /dev/null @@ -1,243 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONTACT_H -#define B2_CONTACT_H - -#include -#include -#include -#include -#include - -class b2Body; -class b2Contact; -class b2Fixture; -class b2World; -class b2BlockAllocator; -class b2StackAllocator; -class b2ContactListener; - -typedef b2Contact* b2ContactCreateFcn(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); -typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator); - -struct b2ContactRegister -{ - b2ContactCreateFcn* createFcn; - b2ContactDestroyFcn* destroyFcn; - bool primary; -}; - -/// A contact edge is used to connect bodies and contacts together -/// in a contact graph where each body is a node and each contact -/// is an edge. A contact edge belongs to a doubly linked list -/// maintained in each attached body. Each contact has two contact -/// nodes, one for each attached body. -struct b2ContactEdge -{ - b2Body* other; ///< provides quick access to the other body attached. - b2Contact* contact; ///< the contact - b2ContactEdge* prev; ///< the previous contact edge in the body's contact list - b2ContactEdge* next; ///< the next contact edge in the body's contact list -}; - -/// The class manages contact between two shapes. A contact exists for each overlapping -/// AABB in the broad-phase (except if filtered). Therefore a contact object may exist -/// that has no contact points. -class b2Contact -{ -public: - - /// Get the contact manifold. Do not modify the manifold unless you understand the - /// internals of Box2D. - b2Manifold* GetManifold(); - const b2Manifold* GetManifold() const; - - /// Get the world manifold. - void GetWorldManifold(b2WorldManifold* worldManifold) const; - - /// Is this contact touching? - bool IsTouching() const; - - /// Enable/disable this contact. This can be used inside the pre-solve - /// contact listener. The contact is only disabled for the current - /// time step (or sub-step in continuous collisions). - void SetEnabled(bool flag); - - /// Has this contact been disabled? - bool IsEnabled() const; - - /// Get the next contact in the world's contact list. - b2Contact* GetNext(); - const b2Contact* GetNext() const; - - /// Get the first fixture in this contact. - b2Fixture* GetFixtureA(); - const b2Fixture* GetFixtureA() const; - - /// Get the second fixture in this contact. - b2Fixture* GetFixtureB(); - const b2Fixture* GetFixtureB() const; - - /// Evaluate this contact with your own manifold and transforms. - virtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0; - -protected: - friend class b2ContactManager; - friend class b2World; - friend class b2ContactSolver; - friend class b2Body; - friend class b2Fixture; - - // Flags stored in m_flags - enum - { - // Used when crawling contact graph when forming islands. - e_islandFlag = 0x0001, - - // Set when the shapes are touching. - e_touchingFlag = 0x0002, - - // This contact can be disabled (by user) - e_enabledFlag = 0x0004, - - // This contact needs filtering because a fixture filter was changed. - e_filterFlag = 0x0008, - - // This bullet contact had a TOI event - e_bulletHitFlag = 0x0010, - - }; - - /// Flag this contact for filtering. Filtering will occur the next time step. - void FlagForFiltering(); - - static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, - b2Shape::Type typeA, b2Shape::Type typeB); - static void InitializeRegisters(); - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - - b2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {} - b2Contact(b2Fixture* fixtureA, b2Fixture* fixtureB); - virtual ~b2Contact() {} - - void Update(b2ContactListener* listener); - - static b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; - static bool s_initialized; - - uint32 m_flags; - - // World pool and list pointers. - b2Contact* m_prev; - b2Contact* m_next; - - // Nodes for connecting bodies. - b2ContactEdge m_nodeA; - b2ContactEdge m_nodeB; - - b2Fixture* m_fixtureA; - b2Fixture* m_fixtureB; - - b2Manifold m_manifold; - - int32 m_toiCount; -// float32 m_toi; -}; - -inline b2Manifold* b2Contact::GetManifold() -{ - return &m_manifold; -} - -inline const b2Manifold* b2Contact::GetManifold() const -{ - return &m_manifold; -} - -inline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const -{ - const b2Body* bodyA = m_fixtureA->GetBody(); - const b2Body* bodyB = m_fixtureB->GetBody(); - const b2Shape* shapeA = m_fixtureA->GetShape(); - const b2Shape* shapeB = m_fixtureB->GetShape(); - - worldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius); -} - -inline void b2Contact::SetEnabled(bool flag) -{ - if (flag) - { - m_flags |= e_enabledFlag; - } - else - { - m_flags &= ~e_enabledFlag; - } -} - -inline bool b2Contact::IsEnabled() const -{ - return (m_flags & e_enabledFlag) == e_enabledFlag; -} - -inline bool b2Contact::IsTouching() const -{ - return (m_flags & e_touchingFlag) == e_touchingFlag; -} - -inline b2Contact* b2Contact::GetNext() -{ - return m_next; -} - -inline const b2Contact* b2Contact::GetNext() const -{ - return m_next; -} - -inline b2Fixture* b2Contact::GetFixtureA() -{ - return m_fixtureA; -} - -inline const b2Fixture* b2Contact::GetFixtureA() const -{ - return m_fixtureA; -} - -inline b2Fixture* b2Contact::GetFixtureB() -{ - return m_fixtureB; -} - -inline const b2Fixture* b2Contact::GetFixtureB() const -{ - return m_fixtureB; -} - -inline void b2Contact::FlagForFiltering() -{ - m_flags |= e_filterFlag; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.cpp deleted file mode 100644 index 23f1913af..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.cpp +++ /dev/null @@ -1,624 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include - -#define B2_DEBUG_SOLVER 0 - -b2ContactSolver::b2ContactSolver(b2Contact** contacts, int32 contactCount, - b2StackAllocator* allocator, float32 impulseRatio) -{ - m_allocator = allocator; - - m_constraintCount = contactCount; - m_constraints = (b2ContactConstraint*)m_allocator->Allocate(m_constraintCount * sizeof(b2ContactConstraint)); - - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2Contact* contact = contacts[i]; - - b2Fixture* fixtureA = contact->m_fixtureA; - b2Fixture* fixtureB = contact->m_fixtureB; - b2Shape* shapeA = fixtureA->GetShape(); - b2Shape* shapeB = fixtureB->GetShape(); - float32 radiusA = shapeA->m_radius; - float32 radiusB = shapeB->m_radius; - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - b2Manifold* manifold = contact->GetManifold(); - - float32 friction = b2MixFriction(fixtureA->GetFriction(), fixtureB->GetFriction()); - float32 restitution = b2MixRestitution(fixtureA->GetRestitution(), fixtureB->GetRestitution()); - - b2Vec2 vA = bodyA->m_linearVelocity; - b2Vec2 vB = bodyB->m_linearVelocity; - float32 wA = bodyA->m_angularVelocity; - float32 wB = bodyB->m_angularVelocity; - - b2Assert(manifold->pointCount > 0); - - b2WorldManifold worldManifold; - worldManifold.Initialize(manifold, bodyA->m_xf, radiusA, bodyB->m_xf, radiusB); - - b2ContactConstraint* cc = m_constraints + i; - cc->bodyA = bodyA; - cc->bodyB = bodyB; - cc->manifold = manifold; - cc->normal = worldManifold.normal; - cc->pointCount = manifold->pointCount; - cc->friction = friction; - - cc->localNormal = manifold->localNormal; - cc->localPoint = manifold->localPoint; - cc->radius = radiusA + radiusB; - cc->type = manifold->type; - - for (int32 j = 0; j < cc->pointCount; ++j) - { - b2ManifoldPoint* cp = manifold->points + j; - b2ContactConstraintPoint* ccp = cc->points + j; - - ccp->normalImpulse = impulseRatio * cp->normalImpulse; - ccp->tangentImpulse = impulseRatio * cp->tangentImpulse; - - ccp->localPoint = cp->localPoint; - - ccp->rA = worldManifold.points[j] - bodyA->m_sweep.c; - ccp->rB = worldManifold.points[j] - bodyB->m_sweep.c; - - float32 rnA = b2Cross(ccp->rA, cc->normal); - float32 rnB = b2Cross(ccp->rB, cc->normal); - rnA *= rnA; - rnB *= rnB; - - float32 kNormal = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rnA + bodyB->m_invI * rnB; - - b2Assert(kNormal > b2_epsilon); - ccp->normalMass = 1.0f / kNormal; - - b2Vec2 tangent = b2Cross(cc->normal, 1.0f); - - float32 rtA = b2Cross(ccp->rA, tangent); - float32 rtB = b2Cross(ccp->rB, tangent); - rtA *= rtA; - rtB *= rtB; - - float32 kTangent = bodyA->m_invMass + bodyB->m_invMass + bodyA->m_invI * rtA + bodyB->m_invI * rtB; - - b2Assert(kTangent > b2_epsilon); - ccp->tangentMass = 1.0f / kTangent; - - // Setup a velocity bias for restitution. - ccp->velocityBias = 0.0f; - float32 vRel = b2Dot(cc->normal, vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA)); - if (vRel < -b2_velocityThreshold) - { - ccp->velocityBias = -restitution * vRel; - } - } - - // If we have two points, then prepare the block solver. - if (cc->pointCount == 2) - { - b2ContactConstraintPoint* ccp1 = cc->points + 0; - b2ContactConstraintPoint* ccp2 = cc->points + 1; - - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - - float32 rn1A = b2Cross(ccp1->rA, cc->normal); - float32 rn1B = b2Cross(ccp1->rB, cc->normal); - float32 rn2A = b2Cross(ccp2->rA, cc->normal); - float32 rn2B = b2Cross(ccp2->rB, cc->normal); - - float32 k11 = invMassA + invMassB + invIA * rn1A * rn1A + invIB * rn1B * rn1B; - float32 k22 = invMassA + invMassB + invIA * rn2A * rn2A + invIB * rn2B * rn2B; - float32 k12 = invMassA + invMassB + invIA * rn1A * rn2A + invIB * rn1B * rn2B; - - // Ensure a reasonable condition number. - const float32 k_maxConditionNumber = 100.0f; - if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) - { - // K is safe to invert. - cc->K.col1.Set(k11, k12); - cc->K.col2.Set(k12, k22); - cc->normalMass = cc->K.GetInverse(); - } - else - { - // The constraints are redundant, just use one. - // TODO_ERIN use deepest? - cc->pointCount = 1; - } - } - } -} - -b2ContactSolver::~b2ContactSolver() -{ - m_allocator->Free(m_constraints); -} - -void b2ContactSolver::WarmStart() -{ - // Warm start. - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - b2Vec2 normal = c->normal; - b2Vec2 tangent = b2Cross(normal, 1.0f); - - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - b2Vec2 P = ccp->normalImpulse * normal + ccp->tangentImpulse * tangent; - bodyA->m_angularVelocity -= invIA * b2Cross(ccp->rA, P); - bodyA->m_linearVelocity -= invMassA * P; - bodyB->m_angularVelocity += invIB * b2Cross(ccp->rB, P); - bodyB->m_linearVelocity += invMassB * P; - } - } -} - -void b2ContactSolver::SolveVelocityConstraints() -{ - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - float32 wA = bodyA->m_angularVelocity; - float32 wB = bodyB->m_angularVelocity; - b2Vec2 vA = bodyA->m_linearVelocity; - b2Vec2 vB = bodyB->m_linearVelocity; - float32 invMassA = bodyA->m_invMass; - float32 invIA = bodyA->m_invI; - float32 invMassB = bodyB->m_invMass; - float32 invIB = bodyB->m_invI; - b2Vec2 normal = c->normal; - b2Vec2 tangent = b2Cross(normal, 1.0f); - float32 friction = c->friction; - - b2Assert(c->pointCount == 1 || c->pointCount == 2); - - // Solve tangent constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2ContactConstraintPoint* ccp = c->points + j; - - // Relative velocity at contact - b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); - - // Compute tangent force - float32 vt = b2Dot(dv, tangent); - float32 lambda = ccp->tangentMass * (-vt); - - // b2Clamp the accumulated force - float32 maxFriction = friction * ccp->normalImpulse; - float32 newImpulse = b2Clamp(ccp->tangentImpulse + lambda, -maxFriction, maxFriction); - lambda = newImpulse - ccp->tangentImpulse; - - // Apply contact impulse - b2Vec2 P = lambda * tangent; - - vA -= invMassA * P; - wA -= invIA * b2Cross(ccp->rA, P); - - vB += invMassB * P; - wB += invIB * b2Cross(ccp->rB, P); - - ccp->tangentImpulse = newImpulse; - } - - // Solve normal constraints - if (c->pointCount == 1) - { - b2ContactConstraintPoint* ccp = c->points + 0; - - // Relative velocity at contact - b2Vec2 dv = vB + b2Cross(wB, ccp->rB) - vA - b2Cross(wA, ccp->rA); - - // Compute normal impulse - float32 vn = b2Dot(dv, normal); - float32 lambda = -ccp->normalMass * (vn - ccp->velocityBias); - - // b2Clamp the accumulated impulse - float32 newImpulse = b2Max(ccp->normalImpulse + lambda, 0.0f); - lambda = newImpulse - ccp->normalImpulse; - - // Apply contact impulse - b2Vec2 P = lambda * normal; - vA -= invMassA * P; - wA -= invIA * b2Cross(ccp->rA, P); - - vB += invMassB * P; - wB += invIB * b2Cross(ccp->rB, P); - ccp->normalImpulse = newImpulse; - } - else - { - // Block solver developed in collaboration with Dirk Gregorius (back in 01/07 on Box2D_Lite). - // Build the mini LCP for this contact patch - // - // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = 1..2 - // - // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) - // b = vn_0 - velocityBias - // - // The system is solved using the "Total enumeration method" (s. Murty). The complementary constraint vn_i * x_i - // implies that we must have in any solution either vn_i = 0 or x_i = 0. So for the 2D contact problem the cases - // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and vn1 = 0 need to be tested. The first valid - // solution that satisfies the problem is chosen. - // - // In order to account of the accumulated impulse 'a' (because of the iterative nature of the solver which only requires - // that the accumulated impulse is clamped and not the incremental impulse) we change the impulse variable (x_i). - // - // Substitute: - // - // x = x' - a - // - // Plug into above equation: - // - // vn = A * x + b - // = A * (x' - a) + b - // = A * x' + b - A * a - // = A * x' + b' - // b' = b - A * a; - - b2ContactConstraintPoint* cp1 = c->points + 0; - b2ContactConstraintPoint* cp2 = c->points + 1; - - b2Vec2 a(cp1->normalImpulse, cp2->normalImpulse); - b2Assert(a.x >= 0.0f && a.y >= 0.0f); - - // Relative velocity at contact - b2Vec2 dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); - b2Vec2 dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); - - // Compute normal velocity - float32 vn1 = b2Dot(dv1, normal); - float32 vn2 = b2Dot(dv2, normal); - - b2Vec2 b; - b.x = vn1 - cp1->velocityBias; - b.y = vn2 - cp2->velocityBias; - b -= b2Mul(c->K, a); - - const float32 k_errorTol = 1e-3f; - B2_NOT_USED(k_errorTol); - - for (;;) - { - // - // Case 1: vn = 0 - // - // 0 = A * x' + b' - // - // Solve for x': - // - // x' = - inv(A) * b' - // - b2Vec2 x = - b2Mul(c->normalMass, b); - - if (x.x >= 0.0f && x.y >= 0.0f) - { - // Resubstitute for the incremental impulse - b2Vec2 d = x - a; - - // Apply incremental impulse - b2Vec2 P1 = d.x * normal; - b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); - - // Accumulate - cp1->normalImpulse = x.x; - cp2->normalImpulse = x.y; - -#if B2_DEBUG_SOLVER == 1 - // Postconditions - dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); - dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); - - // Compute normal velocity - vn1 = b2Dot(dv1, normal); - vn2 = b2Dot(dv2, normal); - - b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); - b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); -#endif - break; - } - - // - // Case 2: vn1 = 0 and x2 = 0 - // - // 0 = a11 * x1' + a12 * 0 + b1' - // vn2 = a21 * x1' + a22 * 0 + b2' - // - x.x = - cp1->normalMass * b.x; - x.y = 0.0f; - vn1 = 0.0f; - vn2 = c->K.col1.y * x.x + b.y; - - if (x.x >= 0.0f && vn2 >= 0.0f) - { - // Resubstitute for the incremental impulse - b2Vec2 d = x - a; - - // Apply incremental impulse - b2Vec2 P1 = d.x * normal; - b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); - - // Accumulate - cp1->normalImpulse = x.x; - cp2->normalImpulse = x.y; - -#if B2_DEBUG_SOLVER == 1 - // Postconditions - dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); - - // Compute normal velocity - vn1 = b2Dot(dv1, normal); - - b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); -#endif - break; - } - - - // - // Case 3: vn2 = 0 and x1 = 0 - // - // vn1 = a11 * 0 + a12 * x2' + b1' - // 0 = a21 * 0 + a22 * x2' + b2' - // - x.x = 0.0f; - x.y = - cp2->normalMass * b.y; - vn1 = c->K.col2.x * x.y + b.x; - vn2 = 0.0f; - - if (x.y >= 0.0f && vn1 >= 0.0f) - { - // Resubstitute for the incremental impulse - b2Vec2 d = x - a; - - // Apply incremental impulse - b2Vec2 P1 = d.x * normal; - b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); - - // Accumulate - cp1->normalImpulse = x.x; - cp2->normalImpulse = x.y; - -#if B2_DEBUG_SOLVER == 1 - // Postconditions - dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); - - // Compute normal velocity - vn2 = b2Dot(dv2, normal); - - b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); -#endif - break; - } - - // - // Case 4: x1 = 0 and x2 = 0 - // - // vn1 = b1 - // vn2 = b2; - x.x = 0.0f; - x.y = 0.0f; - vn1 = b.x; - vn2 = b.y; - - if (vn1 >= 0.0f && vn2 >= 0.0f ) - { - // Resubstitute for the incremental impulse - b2Vec2 d = x - a; - - // Apply incremental impulse - b2Vec2 P1 = d.x * normal; - b2Vec2 P2 = d.y * normal; - vA -= invMassA * (P1 + P2); - wA -= invIA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); - - vB += invMassB * (P1 + P2); - wB += invIB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); - - // Accumulate - cp1->normalImpulse = x.x; - cp2->normalImpulse = x.y; - - break; - } - - // No solution, give up. This is hit sometimes, but it doesn't seem to matter. - break; - } - } - - bodyA->m_linearVelocity = vA; - bodyA->m_angularVelocity = wA; - bodyB->m_linearVelocity = vB; - bodyB->m_angularVelocity = wB; - } -} - -void b2ContactSolver::StoreImpulses() -{ - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Manifold* m = c->manifold; - - for (int32 j = 0; j < c->pointCount; ++j) - { - m->points[j].normalImpulse = c->points[j].normalImpulse; - m->points[j].tangentImpulse = c->points[j].tangentImpulse; - } - } -} - -struct b2PositionSolverManifold -{ - void Initialize(b2ContactConstraint* cc, int32 index) - { - b2Assert(cc->pointCount > 0); - - switch (cc->type) - { - case b2Manifold::e_circles: - { - b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); - b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->points[0].localPoint); - if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) - { - normal = pointB - pointA; - normal.Normalize(); - } - else - { - normal.Set(1.0f, 0.0f); - } - - point = 0.5f * (pointA + pointB); - separation = b2Dot(pointB - pointA, normal) - cc->radius; - } - break; - - case b2Manifold::e_faceA: - { - normal = cc->bodyA->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->points[index].localPoint); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - } - break; - - case b2Manifold::e_faceB: - { - normal = cc->bodyB->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->points[index].localPoint); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - - // Ensure normal points from A to B - normal = -normal; - } - break; - } - } - - b2Vec2 normal; - b2Vec2 point; - float32 separation; -}; - -// Sequential solver. -bool b2ContactSolver::SolvePositionConstraints(float32 baumgarte) -{ - float32 minSeparation = 0.0f; - - for (int32 i = 0; i < m_constraintCount; ++i) - { - b2ContactConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - - float32 invMassA = bodyA->m_mass * bodyA->m_invMass; - float32 invIA = bodyA->m_mass * bodyA->m_invI; - float32 invMassB = bodyB->m_mass * bodyB->m_invMass; - float32 invIB = bodyB->m_mass * bodyB->m_invI; - - // Solve normal constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2PositionSolverManifold psm; - psm.Initialize(c, j); - b2Vec2 normal = psm.normal; - - b2Vec2 point = psm.point; - float32 separation = psm.separation; - - b2Vec2 rA = point - bodyA->m_sweep.c; - b2Vec2 rB = point - bodyB->m_sweep.c; - - // Track max constraint error. - minSeparation = b2Min(minSeparation, separation); - - // Prevent large corrections and allow slop. - float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); - - // Compute the effective mass. - float32 rnA = b2Cross(rA, normal); - float32 rnB = b2Cross(rB, normal); - float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; - - // Compute normal impulse - float32 impulse = K > 0.0f ? - C / K : 0.0f; - - b2Vec2 P = impulse * normal; - - bodyA->m_sweep.c -= invMassA * P; - bodyA->m_sweep.a -= invIA * b2Cross(rA, P); - bodyA->SynchronizeTransform(); - - bodyB->m_sweep.c += invMassB * P; - bodyB->m_sweep.a += invIB * b2Cross(rB, P); - bodyB->SynchronizeTransform(); - } - } - - // We can't expect minSpeparation >= -b2_linearSlop because we don't - // push the separation above -b2_linearSlop. - return minSeparation >= -1.5f * b2_linearSlop; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.h deleted file mode 100644 index 04d936889..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2ContactSolver.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONTACT_SOLVER_H -#define B2_CONTACT_SOLVER_H - -#include -#include -#include - -class b2Contact; -class b2Body; -class b2StackAllocator; - -struct b2ContactConstraintPoint -{ - b2Vec2 localPoint; - b2Vec2 rA; - b2Vec2 rB; - float32 normalImpulse; - float32 tangentImpulse; - float32 normalMass; - float32 tangentMass; - float32 velocityBias; -}; - -struct b2ContactConstraint -{ - b2ContactConstraintPoint points[b2_maxManifoldPoints]; - b2Vec2 localNormal; - b2Vec2 localPoint; - b2Vec2 normal; - b2Mat22 normalMass; - b2Mat22 K; - b2Body* bodyA; - b2Body* bodyB; - b2Manifold::Type type; - float32 radius; - float32 friction; - int32 pointCount; - b2Manifold* manifold; -}; - -class b2ContactSolver -{ -public: - b2ContactSolver(b2Contact** contacts, int32 contactCount, - b2StackAllocator* allocator, float32 impulseRatio); - - ~b2ContactSolver(); - - void WarmStart(); - void SolveVelocityConstraints(); - void StoreImpulses(); - - bool SolvePositionConstraints(float32 baumgarte); - - b2StackAllocator* m_allocator; - b2ContactConstraint* m_constraints; - int m_constraintCount; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp deleted file mode 100644 index 2b7268a3c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include - -#include - -b2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact)); - return new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB); -} - -void b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2PolygonAndCircleContact*)contact)->~b2PolygonAndCircleContact(); - allocator->Free(contact, sizeof(b2PolygonAndCircleContact)); -} - -b2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) -: b2Contact(fixtureA, fixtureB) -{ - b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); - b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); -} - -void b2PolygonAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -{ - b2CollidePolygonAndCircle( manifold, - (b2PolygonShape*)m_fixtureA->GetShape(), xfA, - (b2CircleShape*)m_fixtureB->GetShape(), xfB); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h deleted file mode 100644 index c06393ee7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_POLYGON_AND_CIRCLE_CONTACT_H -#define B2_POLYGON_AND_CIRCLE_CONTACT_H - -#include - -class b2BlockAllocator; - -class b2PolygonAndCircleContact : public b2Contact -{ -public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - - b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); - ~b2PolygonAndCircleContact() {} - - void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.cpp deleted file mode 100644 index 4b87b554c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include - -#include - -b2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -{ - void* mem = allocator->Allocate(sizeof(b2PolygonContact)); - return new (mem) b2PolygonContact(fixtureA, fixtureB); -} - -void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -{ - ((b2PolygonContact*)contact)->~b2PolygonContact(); - allocator->Free(contact, sizeof(b2PolygonContact)); -} - -b2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB) - : b2Contact(fixtureA, fixtureB) -{ - b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); - b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); -} - -void b2PolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -{ - b2CollidePolygons( manifold, - (b2PolygonShape*)m_fixtureA->GetShape(), xfA, - (b2PolygonShape*)m_fixtureB->GetShape(), xfB); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.h deleted file mode 100644 index ed040614d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2PolygonContact.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_POLYGON_CONTACT_H -#define B2_POLYGON_CONTACT_H - -#include - -class b2BlockAllocator; - -class b2PolygonContact : public b2Contact -{ -public: - static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); - static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); - - b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB); - ~b2PolygonContact() {} - - void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.cpp deleted file mode 100644 index cd0ca440d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -struct b2TOIConstraint -{ - b2Vec2 localPoints[b2_maxManifoldPoints]; - b2Vec2 localNormal; - b2Vec2 localPoint; - b2Manifold::Type type; - float32 radius; - int32 pointCount; - b2Body* bodyA; - b2Body* bodyB; -}; - -b2TOISolver::b2TOISolver(b2StackAllocator* allocator) -{ - m_allocator = allocator; - m_constraints = NULL; - m_count = 0; - m_toiBody = NULL; -} - -b2TOISolver::~b2TOISolver() -{ - Clear(); -} - -void b2TOISolver::Clear() -{ - if (m_allocator && m_constraints) - { - m_allocator->Free(m_constraints); - m_constraints = NULL; - } -} - -void b2TOISolver::Initialize(b2Contact** contacts, int32 count, b2Body* toiBody) -{ - Clear(); - - m_count = count; - m_toiBody = toiBody; - - m_constraints = (b2TOIConstraint*) m_allocator->Allocate(m_count * sizeof(b2TOIConstraint)); - - for (int32 i = 0; i < m_count; ++i) - { - b2Contact* contact = contacts[i]; - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - b2Shape* shapeA = fixtureA->GetShape(); - b2Shape* shapeB = fixtureB->GetShape(); - float32 radiusA = shapeA->m_radius; - float32 radiusB = shapeB->m_radius; - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - b2Manifold* manifold = contact->GetManifold(); - - b2Assert(manifold->pointCount > 0); - - b2TOIConstraint* constraint = m_constraints + i; - constraint->bodyA = bodyA; - constraint->bodyB = bodyB; - constraint->localNormal = manifold->localNormal; - constraint->localPoint = manifold->localPoint; - constraint->type = manifold->type; - constraint->pointCount = manifold->pointCount; - constraint->radius = radiusA + radiusB; - - for (int32 j = 0; j < constraint->pointCount; ++j) - { - b2ManifoldPoint* cp = manifold->points + j; - constraint->localPoints[j] = cp->localPoint; - } - } -} - -struct b2TOISolverManifold -{ - void Initialize(b2TOIConstraint* cc, int32 index) - { - b2Assert(cc->pointCount > 0); - - switch (cc->type) - { - case b2Manifold::e_circles: - { - b2Vec2 pointA = cc->bodyA->GetWorldPoint(cc->localPoint); - b2Vec2 pointB = cc->bodyB->GetWorldPoint(cc->localPoints[0]); - if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) - { - normal = pointB - pointA; - normal.Normalize(); - } - else - { - normal.Set(1.0f, 0.0f); - } - - point = 0.5f * (pointA + pointB); - separation = b2Dot(pointB - pointA, normal) - cc->radius; - } - break; - - case b2Manifold::e_faceA: - { - normal = cc->bodyA->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyA->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyB->GetWorldPoint(cc->localPoints[index]); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - } - break; - - case b2Manifold::e_faceB: - { - normal = cc->bodyB->GetWorldVector(cc->localNormal); - b2Vec2 planePoint = cc->bodyB->GetWorldPoint(cc->localPoint); - - b2Vec2 clipPoint = cc->bodyA->GetWorldPoint(cc->localPoints[index]); - separation = b2Dot(clipPoint - planePoint, normal) - cc->radius; - point = clipPoint; - - // Ensure normal points from A to B - normal = -normal; - } - break; - } - } - - b2Vec2 normal; - b2Vec2 point; - float32 separation; -}; - -// Push out the toi body to provide clearance for further simulation. -bool b2TOISolver::Solve(float32 baumgarte) -{ - float32 minSeparation = 0.0f; - - for (int32 i = 0; i < m_count; ++i) - { - b2TOIConstraint* c = m_constraints + i; - b2Body* bodyA = c->bodyA; - b2Body* bodyB = c->bodyB; - - float32 massA = bodyA->m_mass; - float32 massB = bodyB->m_mass; - - // Only the TOI body should move. - if (bodyA == m_toiBody) - { - massB = 0.0f; - } - else - { - massA = 0.0f; - } - - float32 invMassA = massA * bodyA->m_invMass; - float32 invIA = massA * bodyA->m_invI; - float32 invMassB = massB * bodyB->m_invMass; - float32 invIB = massB * bodyB->m_invI; - - // Solve normal constraints - for (int32 j = 0; j < c->pointCount; ++j) - { - b2TOISolverManifold psm; - psm.Initialize(c, j); - b2Vec2 normal = psm.normal; - - b2Vec2 point = psm.point; - float32 separation = psm.separation; - - b2Vec2 rA = point - bodyA->m_sweep.c; - b2Vec2 rB = point - bodyB->m_sweep.c; - - // Track max constraint error. - minSeparation = b2Min(minSeparation, separation); - - // Prevent large corrections and allow slop. - float32 C = b2Clamp(baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); - - // Compute the effective mass. - float32 rnA = b2Cross(rA, normal); - float32 rnB = b2Cross(rB, normal); - float32 K = invMassA + invMassB + invIA * rnA * rnA + invIB * rnB * rnB; - - // Compute normal impulse - float32 impulse = K > 0.0f ? - C / K : 0.0f; - - b2Vec2 P = impulse * normal; - - bodyA->m_sweep.c -= invMassA * P; - bodyA->m_sweep.a -= invIA * b2Cross(rA, P); - bodyA->SynchronizeTransform(); - - bodyB->m_sweep.c += invMassB * P; - bodyB->m_sweep.a += invIB * b2Cross(rB, P); - bodyB->SynchronizeTransform(); - } - } - - // We can't expect minSpeparation >= -b2_linearSlop because we don't - // push the separation above -b2_linearSlop. - return minSeparation >= -1.5f * b2_linearSlop; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.h deleted file mode 100644 index 08c7ac7de..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/b2TOISolver.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_TOI_SOLVER_H -#define B2_TOI_SOLVER_H - -#include - -class b2Contact; -class b2Body; -struct b2TOIConstraint; -class b2StackAllocator; - -/// This is a pure position solver for a single movable body in contact with -/// multiple non-moving bodies. -class b2TOISolver -{ -public: - b2TOISolver(b2StackAllocator* allocator); - ~b2TOISolver(); - - void Initialize(b2Contact** contacts, int32 contactCount, b2Body* toiBody); - void Clear(); - - // Perform one solver iteration. Returns true if converged. - bool Solve(float32 baumgarte); - -private: - - b2TOIConstraint* m_constraints; - int32 m_count; - b2Body* m_toiBody; - b2StackAllocator* m_allocator; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.cpp deleted file mode 100644 index 9c3e49dfa..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// 1-D constrained system -// m (v2 - v1) = lambda -// v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. -// x2 = x1 + h * v2 - -// 1-D mass-damper-spring system -// m (v2 - v1) + h * d * v2 + h * k * - -// C = norm(p2 - p1) - L -// u = (p2 - p1) / norm(p2 - p1) -// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) -// J = [-u -cross(r1, u) u cross(r2, u)] -// K = J * invM * JT -// = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 - -void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, - const b2Vec2& anchor1, const b2Vec2& anchor2) -{ - bodyA = b1; - bodyB = b2; - localAnchorA = bodyA->GetLocalPoint(anchor1); - localAnchorB = bodyB->GetLocalPoint(anchor2); - b2Vec2 d = anchor2 - anchor1; - length = d.Length(); -} - - -b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_length = def->length; - m_frequencyHz = def->frequencyHz; - m_dampingRatio = def->dampingRatio; - m_impulse = 0.0f; - m_gamma = 0.0f; - m_bias = 0.0f; -} - -void b2DistanceJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - m_u = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - - // Handle singularity. - float32 length = m_u.Length(); - if (length > b2_linearSlop) - { - m_u *= 1.0f / length; - } - else - { - m_u.Set(0.0f, 0.0f); - } - - float32 cr1u = b2Cross(r1, m_u); - float32 cr2u = b2Cross(r2, m_u); - float32 invMass = b1->m_invMass + b1->m_invI * cr1u * cr1u + b2->m_invMass + b2->m_invI * cr2u * cr2u; - - m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; - - if (m_frequencyHz > 0.0f) - { - float32 C = length - m_length; - - // Frequency - float32 omega = 2.0f * b2_pi * m_frequencyHz; - - // Damping coefficient - float32 d = 2.0f * m_mass * m_dampingRatio * omega; - - // Spring stiffness - float32 k = m_mass * omega * omega; - - // magic formulas - m_gamma = step.dt * (d + step.dt * k); - m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; - m_bias = C * step.dt * k * m_gamma; - - m_mass = invMass + m_gamma; - m_mass = m_mass != 0.0f ? 1.0f / m_mass : 0.0f; - } - - if (step.warmStarting) - { - // Scale the impulse to support a variable time step. - m_impulse *= step.dtRatio; - - b2Vec2 P = m_impulse * m_u; - b1->m_linearVelocity -= b1->m_invMass * P; - b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); - b2->m_linearVelocity += b2->m_invMass * P; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); - } - else - { - m_impulse = 0.0f; - } -} - -void b2DistanceJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - B2_NOT_USED(step); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - // Cdot = dot(u, v + cross(w, r)) - b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); - float32 Cdot = b2Dot(m_u, v2 - v1); - - float32 impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse); - m_impulse += impulse; - - b2Vec2 P = impulse * m_u; - b1->m_linearVelocity -= b1->m_invMass * P; - b1->m_angularVelocity -= b1->m_invI * b2Cross(r1, P); - b2->m_linearVelocity += b2->m_invMass * P; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P); -} - -bool b2DistanceJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - if (m_frequencyHz > 0.0f) - { - // There is no position correction for soft distance constraints. - return true; - } - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - - float32 length = d.Normalize(); - float32 C = length - m_length; - C = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection); - - float32 impulse = -m_mass * C; - m_u = d; - b2Vec2 P = impulse * m_u; - - b1->m_sweep.c -= b1->m_invMass * P; - b1->m_sweep.a -= b1->m_invI * b2Cross(r1, P); - b2->m_sweep.c += b2->m_invMass * P; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - return b2Abs(C) < b2_linearSlop; -} - -b2Vec2 b2DistanceJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2DistanceJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const -{ - b2Vec2 F = (inv_dt * m_impulse) * m_u; - return F; -} - -float32 b2DistanceJoint::GetReactionTorque(float32 inv_dt) const -{ - B2_NOT_USED(inv_dt); - return 0.0f; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.h deleted file mode 100644 index 264540026..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2DistanceJoint.h +++ /dev/null @@ -1,141 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_DISTANCE_JOINT_H -#define B2_DISTANCE_JOINT_H - -#include - -/// Distance joint definition. This requires defining an -/// anchor point on both bodies and the non-zero length of the -/// distance joint. The definition uses local anchor points -/// so that the initial configuration can violate the constraint -/// slightly. This helps when saving and loading a game. -/// @warning Do not use a zero or short length. -struct b2DistanceJointDef : public b2JointDef -{ - b2DistanceJointDef() - { - type = e_distanceJoint; - localAnchorA.Set(0.0f, 0.0f); - localAnchorB.Set(0.0f, 0.0f); - length = 1.0f; - frequencyHz = 0.0f; - dampingRatio = 0.0f; - } - - /// Initialize the bodies, anchors, and length using the world - /// anchors. - void Initialize(b2Body* bodyA, b2Body* bodyB, - const b2Vec2& anchorA, const b2Vec2& anchorB); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The natural length between the anchor points. - float32 length; - - /// The mass-spring-damper frequency in Hertz. - float32 frequencyHz; - - /// The damping ratio. 0 = no damping, 1 = critical damping. - float32 dampingRatio; -}; - -/// A distance joint constrains two points on two bodies -/// to remain at a fixed distance from each other. You can view -/// this as a massless, rigid rod. -class b2DistanceJoint : public b2Joint -{ -public: - - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Set/get the natural length. - /// Manipulating the length can lead to non-physical behavior when the frequency is zero. - void SetLength(float32 length); - float32 GetLength() const; - - // Set/get frequency in Hz. - void SetFrequency(float32 hz); - float32 GetFrequency() const; - - // Set/get damping ratio. - void SetDampingRatio(float32 ratio); - float32 GetDampingRatio() const; - -protected: - - friend class b2Joint; - b2DistanceJoint(const b2DistanceJointDef* data); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_u; - float32 m_frequencyHz; - float32 m_dampingRatio; - float32 m_gamma; - float32 m_bias; - float32 m_impulse; - float32 m_mass; - float32 m_length; -}; - -inline void b2DistanceJoint::SetLength(float32 length) -{ - m_length = length; -} - -inline float32 b2DistanceJoint::GetLength() const -{ - return m_length; -} - -inline void b2DistanceJoint::SetFrequency(float32 hz) -{ - m_frequencyHz = hz; -} - -inline float32 b2DistanceJoint::GetFrequency() const -{ - return m_frequencyHz; -} - -inline void b2DistanceJoint::SetDampingRatio(float32 ratio) -{ - m_dampingRatio = ratio; -} - -inline float32 b2DistanceJoint::GetDampingRatio() const -{ - return m_dampingRatio; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.cpp deleted file mode 100644 index 1713278ce..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Point-to-point constraint -// Cdot = v2 - v1 -// = v2 + cross(w2, r2) - v1 - cross(w1, r1) -// J = [-I -r1_skew I r2_skew ] -// Identity used: -// w k % (rx i + ry j) = w * (-ry i + rx j) - -// Angle constraint -// Cdot = w2 - w1 -// J = [0 0 -1 0 0 1] -// K = invI1 + invI2 - -void b2FrictionJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) -{ - bodyA = bA; - bodyB = bB; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); -} - -b2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def) -: b2Joint(def) -{ - m_localAnchorA = def->localAnchorA; - m_localAnchorB = def->localAnchorB; - - m_linearImpulse.SetZero(); - m_angularImpulse = 0.0f; - - m_maxForce = def->maxForce; - m_maxTorque = def->maxTorque; -} - -void b2FrictionJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; - - // Compute the effective mass matrix. - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Mat22 K1; - K1.col1.x = mA + mB; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = mA + mB; - - b2Mat22 K2; - K2.col1.x = iA * rA.y * rA.y; K2.col2.x = -iA * rA.x * rA.y; - K2.col1.y = -iA * rA.x * rA.y; K2.col2.y = iA * rA.x * rA.x; - - b2Mat22 K3; - K3.col1.x = iB * rB.y * rB.y; K3.col2.x = -iB * rB.x * rB.y; - K3.col1.y = -iB * rB.x * rB.y; K3.col2.y = iB * rB.x * rB.x; - - b2Mat22 K = K1 + K2 + K3; - m_linearMass = K.GetInverse(); - - m_angularMass = iA + iB; - if (m_angularMass > 0.0f) - { - m_angularMass = 1.0f / m_angularMass; - } - - if (step.warmStarting) - { - // Scale impulses to support a variable time step. - m_linearImpulse *= step.dtRatio; - m_angularImpulse *= step.dtRatio; - - b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); - - bA->m_linearVelocity -= mA * P; - bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_angularImpulse); - - bB->m_linearVelocity += mB * P; - bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_angularImpulse); - } - else - { - m_linearImpulse.SetZero(); - m_angularImpulse = 0.0f; - } -} - -void b2FrictionJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - B2_NOT_USED(step); - - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; - - b2Vec2 vA = bA->m_linearVelocity; - float32 wA = bA->m_angularVelocity; - b2Vec2 vB = bB->m_linearVelocity; - float32 wB = bB->m_angularVelocity; - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - // Solve angular friction - { - float32 Cdot = wB - wA; - float32 impulse = -m_angularMass * Cdot; - - float32 oldImpulse = m_angularImpulse; - float32 maxImpulse = step.dt * m_maxTorque; - m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse); - impulse = m_angularImpulse - oldImpulse; - - wA -= iA * impulse; - wB += iB * impulse; - } - - // Solve linear friction - { - b2Vec2 Cdot = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); - - b2Vec2 impulse = -b2Mul(m_linearMass, Cdot); - b2Vec2 oldImpulse = m_linearImpulse; - m_linearImpulse += impulse; - - float32 maxImpulse = step.dt * m_maxForce; - - if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) - { - m_linearImpulse.Normalize(); - m_linearImpulse *= maxImpulse; - } - - impulse = m_linearImpulse - oldImpulse; - - vA -= mA * impulse; - wA -= iA * b2Cross(rA, impulse); - - vB += mB * impulse; - wB += iB * b2Cross(rB, impulse); - } - - bA->m_linearVelocity = vA; - bA->m_angularVelocity = wA; - bB->m_linearVelocity = vB; - bB->m_angularVelocity = wB; -} - -bool b2FrictionJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - return true; -} - -b2Vec2 b2FrictionJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchorA); -} - -b2Vec2 b2FrictionJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchorB); -} - -b2Vec2 b2FrictionJoint::GetReactionForce(float32 inv_dt) const -{ - return inv_dt * m_linearImpulse; -} - -float32 b2FrictionJoint::GetReactionTorque(float32 inv_dt) const -{ - return inv_dt * m_angularImpulse; -} - -void b2FrictionJoint::SetMaxForce(float32 force) -{ - b2Assert(b2IsValid(force) && force >= 0.0f); - m_maxForce = force; -} - -float32 b2FrictionJoint::GetMaxForce() const -{ - return m_maxForce; -} - -void b2FrictionJoint::SetMaxTorque(float32 torque) -{ - b2Assert(b2IsValid(torque) && torque >= 0.0f); - m_maxTorque = torque; -} - -float32 b2FrictionJoint::GetMaxTorque() const -{ - return m_maxTorque; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.h deleted file mode 100644 index 0c2fae5f8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2FrictionJoint.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_FRICTION_JOINT_H -#define B2_FRICTION_JOINT_H - -#include - -/// Friction joint definition. -struct b2FrictionJointDef : public b2JointDef -{ - b2FrictionJointDef() - { - type = e_frictionJoint; - localAnchorA.SetZero(); - localAnchorB.SetZero(); - maxForce = 0.0f; - maxTorque = 0.0f; - } - - /// Initialize the bodies, anchors, axis, and reference angle using the world - /// anchor and world axis. - void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); - - /// The local anchor point relative to bodyA's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to bodyB's origin. - b2Vec2 localAnchorB; - - /// The maximum friction force in N. - float32 maxForce; - - /// The maximum friction torque in N-m. - float32 maxTorque; -}; - -/// Friction joint. This is used for top-down friction. -/// It provides 2D translational friction and angular friction. -class b2FrictionJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Set the maximum friction force in N. - void SetMaxForce(float32 force); - - /// Get the maximum friction force in N. - float32 GetMaxForce() const; - - /// Set the maximum friction torque in N*m. - void SetMaxTorque(float32 torque); - - /// Get the maximum friction torque in N*m. - float32 GetMaxTorque() const; - -protected: - - friend class b2Joint; - - b2FrictionJoint(const b2FrictionJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchorA; - b2Vec2 m_localAnchorB; - - b2Mat22 m_linearMass; - float32 m_angularMass; - - b2Vec2 m_linearImpulse; - float32 m_angularImpulse; - - float32 m_maxForce; - float32 m_maxTorque; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.cpp deleted file mode 100644 index 480bb10b0..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -// Gear Joint: -// C0 = (coordinate1 + ratio * coordinate2)_initial -// C = C0 - (cordinate1 + ratio * coordinate2) = 0 -// Cdot = -(Cdot1 + ratio * Cdot2) -// J = -[J1 ratio * J2] -// K = J * invM * JT -// = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T -// -// Revolute: -// coordinate = rotation -// Cdot = angularVelocity -// J = [0 0 1] -// K = J * invM * JT = invI -// -// Prismatic: -// coordinate = dot(p - pg, ug) -// Cdot = dot(v + cross(w, r), ug) -// J = [ug cross(r, ug)] -// K = J * invM * JT = invMass + invI * cross(r, ug)^2 - -b2GearJoint::b2GearJoint(const b2GearJointDef* def) -: b2Joint(def) -{ - b2JointType type1 = def->joint1->GetType(); - b2JointType type2 = def->joint2->GetType(); - - b2Assert(type1 == e_revoluteJoint || type1 == e_prismaticJoint); - b2Assert(type2 == e_revoluteJoint || type2 == e_prismaticJoint); - b2Assert(def->joint1->GetBodyA()->GetType() == b2_staticBody); - b2Assert(def->joint2->GetBodyA()->GetType() == b2_staticBody); - - m_revolute1 = NULL; - m_prismatic1 = NULL; - m_revolute2 = NULL; - m_prismatic2 = NULL; - - float32 coordinate1, coordinate2; - - m_ground1 = def->joint1->GetBodyA(); - m_bodyA = def->joint1->GetBodyB(); - if (type1 == e_revoluteJoint) - { - m_revolute1 = (b2RevoluteJoint*)def->joint1; - m_groundAnchor1 = m_revolute1->m_localAnchor1; - m_localAnchor1 = m_revolute1->m_localAnchor2; - coordinate1 = m_revolute1->GetJointAngle(); - } - else - { - m_prismatic1 = (b2PrismaticJoint*)def->joint1; - m_groundAnchor1 = m_prismatic1->m_localAnchor1; - m_localAnchor1 = m_prismatic1->m_localAnchor2; - coordinate1 = m_prismatic1->GetJointTranslation(); - } - - m_ground2 = def->joint2->GetBodyA(); - m_bodyB = def->joint2->GetBodyB(); - if (type2 == e_revoluteJoint) - { - m_revolute2 = (b2RevoluteJoint*)def->joint2; - m_groundAnchor2 = m_revolute2->m_localAnchor1; - m_localAnchor2 = m_revolute2->m_localAnchor2; - coordinate2 = m_revolute2->GetJointAngle(); - } - else - { - m_prismatic2 = (b2PrismaticJoint*)def->joint2; - m_groundAnchor2 = m_prismatic2->m_localAnchor1; - m_localAnchor2 = m_prismatic2->m_localAnchor2; - coordinate2 = m_prismatic2->GetJointTranslation(); - } - - m_ratio = def->ratio; - - m_constant = coordinate1 + m_ratio * coordinate2; - - m_impulse = 0.0f; -} - -void b2GearJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* g1 = m_ground1; - b2Body* g2 = m_ground2; - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - float32 K = 0.0f; - m_J.SetZero(); - - if (m_revolute1) - { - m_J.angularA = -1.0f; - K += b1->m_invI; - } - else - { - b2Vec2 ug = b2Mul(g1->GetTransform().R, m_prismatic1->m_localXAxis1); - b2Vec2 r = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - float32 crug = b2Cross(r, ug); - m_J.linearA = -ug; - m_J.angularA = -crug; - K += b1->m_invMass + b1->m_invI * crug * crug; - } - - if (m_revolute2) - { - m_J.angularB = -m_ratio; - K += m_ratio * m_ratio * b2->m_invI; - } - else - { - b2Vec2 ug = b2Mul(g2->GetTransform().R, m_prismatic2->m_localXAxis1); - b2Vec2 r = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - float32 crug = b2Cross(r, ug); - m_J.linearB = -m_ratio * ug; - m_J.angularB = -m_ratio * crug; - K += m_ratio * m_ratio * (b2->m_invMass + b2->m_invI * crug * crug); - } - - // Compute effective mass. - m_mass = K > 0.0f ? 1.0f / K : 0.0f; - - if (step.warmStarting) - { - // Warm starting. - b1->m_linearVelocity += b1->m_invMass * m_impulse * m_J.linearA; - b1->m_angularVelocity += b1->m_invI * m_impulse * m_J.angularA; - b2->m_linearVelocity += b2->m_invMass * m_impulse * m_J.linearB; - b2->m_angularVelocity += b2->m_invI * m_impulse * m_J.angularB; - } - else - { - m_impulse = 0.0f; - } -} - -void b2GearJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - B2_NOT_USED(step); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - float32 Cdot = m_J.Compute( b1->m_linearVelocity, b1->m_angularVelocity, - b2->m_linearVelocity, b2->m_angularVelocity); - - float32 impulse = m_mass * (-Cdot); - m_impulse += impulse; - - b1->m_linearVelocity += b1->m_invMass * impulse * m_J.linearA; - b1->m_angularVelocity += b1->m_invI * impulse * m_J.angularA; - b2->m_linearVelocity += b2->m_invMass * impulse * m_J.linearB; - b2->m_angularVelocity += b2->m_invI * impulse * m_J.angularB; -} - -bool b2GearJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - float32 linearError = 0.0f; - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - float32 coordinate1, coordinate2; - if (m_revolute1) - { - coordinate1 = m_revolute1->GetJointAngle(); - } - else - { - coordinate1 = m_prismatic1->GetJointTranslation(); - } - - if (m_revolute2) - { - coordinate2 = m_revolute2->GetJointAngle(); - } - else - { - coordinate2 = m_prismatic2->GetJointTranslation(); - } - - float32 C = m_constant - (coordinate1 + m_ratio * coordinate2); - - float32 impulse = m_mass * (-C); - - b1->m_sweep.c += b1->m_invMass * impulse * m_J.linearA; - b1->m_sweep.a += b1->m_invI * impulse * m_J.angularA; - b2->m_sweep.c += b2->m_invMass * impulse * m_J.linearB; - b2->m_sweep.a += b2->m_invI * impulse * m_J.angularB; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - // TODO_ERIN not implemented - return linearError < b2_linearSlop; -} - -b2Vec2 b2GearJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2GearJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const -{ - // TODO_ERIN not tested - b2Vec2 P = m_impulse * m_J.linearB; - return inv_dt * P; -} - -float32 b2GearJoint::GetReactionTorque(float32 inv_dt) const -{ - // TODO_ERIN not tested - b2Vec2 r = b2Mul(m_bodyB->GetTransform().R, m_localAnchor2 - m_bodyB->GetLocalCenter()); - b2Vec2 P = m_impulse * m_J.linearB; - float32 L = m_impulse * m_J.angularB - b2Cross(r, P); - return inv_dt * L; -} - -void b2GearJoint::SetRatio(float32 ratio) -{ - b2Assert(b2IsValid(ratio)); - m_ratio = ratio; -} - -float32 b2GearJoint::GetRatio() const -{ - return m_ratio; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.h deleted file mode 100644 index 0348cb923..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2GearJoint.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_GEAR_JOINT_H -#define B2_GEAR_JOINT_H - -#include - -class b2RevoluteJoint; -class b2PrismaticJoint; - -/// Gear joint definition. This definition requires two existing -/// revolute or prismatic joints (any combination will work). -/// The provided joints must attach a dynamic body to a static body. -struct b2GearJointDef : public b2JointDef -{ - b2GearJointDef() - { - type = e_gearJoint; - joint1 = NULL; - joint2 = NULL; - ratio = 1.0f; - } - - /// The first revolute/prismatic joint attached to the gear joint. - b2Joint* joint1; - - /// The second revolute/prismatic joint attached to the gear joint. - b2Joint* joint2; - - /// The gear ratio. - /// @see b2GearJoint for explanation. - float32 ratio; -}; - -/// A gear joint is used to connect two joints together. Either joint -/// can be a revolute or prismatic joint. You specify a gear ratio -/// to bind the motions together: -/// coordinate1 + ratio * coordinate2 = constant -/// The ratio can be negative or positive. If one joint is a revolute joint -/// and the other joint is a prismatic joint, then the ratio will have units -/// of length or units of 1/length. -/// @warning The revolute and prismatic joints must be attached to -/// fixed bodies (which must be body1 on those joints). -class b2GearJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Set/Get the gear ratio. - void SetRatio(float32 ratio); - float32 GetRatio() const; - -protected: - - friend class b2Joint; - b2GearJoint(const b2GearJointDef* data); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Body* m_ground1; - b2Body* m_ground2; - - // One of these is NULL. - b2RevoluteJoint* m_revolute1; - b2PrismaticJoint* m_prismatic1; - - // One of these is NULL. - b2RevoluteJoint* m_revolute2; - b2PrismaticJoint* m_prismatic2; - - b2Vec2 m_groundAnchor1; - b2Vec2 m_groundAnchor2; - - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - - b2Jacobian m_J; - - float32 m_constant; - float32 m_ratio; - - // Effective mass - float32 m_mass; - - // Impulse for accumulation/warm starting. - float32 m_impulse; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.cpp deleted file mode 100644 index 3703bd17e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) -{ - b2Joint* joint = NULL; - - switch (def->type) - { - case e_distanceJoint: - { - void* mem = allocator->Allocate(sizeof(b2DistanceJoint)); - joint = new (mem) b2DistanceJoint((b2DistanceJointDef*)def); - } - break; - - case e_mouseJoint: - { - void* mem = allocator->Allocate(sizeof(b2MouseJoint)); - joint = new (mem) b2MouseJoint((b2MouseJointDef*)def); - } - break; - - case e_prismaticJoint: - { - void* mem = allocator->Allocate(sizeof(b2PrismaticJoint)); - joint = new (mem) b2PrismaticJoint((b2PrismaticJointDef*)def); - } - break; - - case e_revoluteJoint: - { - void* mem = allocator->Allocate(sizeof(b2RevoluteJoint)); - joint = new (mem) b2RevoluteJoint((b2RevoluteJointDef*)def); - } - break; - - case e_pulleyJoint: - { - void* mem = allocator->Allocate(sizeof(b2PulleyJoint)); - joint = new (mem) b2PulleyJoint((b2PulleyJointDef*)def); - } - break; - - case e_gearJoint: - { - void* mem = allocator->Allocate(sizeof(b2GearJoint)); - joint = new (mem) b2GearJoint((b2GearJointDef*)def); - } - break; - - case e_lineJoint: - { - void* mem = allocator->Allocate(sizeof(b2LineJoint)); - joint = new (mem) b2LineJoint((b2LineJointDef*)def); - } - break; - - case e_weldJoint: - { - void* mem = allocator->Allocate(sizeof(b2WeldJoint)); - joint = new (mem) b2WeldJoint((b2WeldJointDef*)def); - } - break; - - case e_frictionJoint: - { - void* mem = allocator->Allocate(sizeof(b2FrictionJoint)); - joint = new (mem) b2FrictionJoint((b2FrictionJointDef*)def); - } - break; - - default: - b2Assert(false); - break; - } - - return joint; -} - -void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) -{ - joint->~b2Joint(); - switch (joint->m_type) - { - case e_distanceJoint: - allocator->Free(joint, sizeof(b2DistanceJoint)); - break; - - case e_mouseJoint: - allocator->Free(joint, sizeof(b2MouseJoint)); - break; - - case e_prismaticJoint: - allocator->Free(joint, sizeof(b2PrismaticJoint)); - break; - - case e_revoluteJoint: - allocator->Free(joint, sizeof(b2RevoluteJoint)); - break; - - case e_pulleyJoint: - allocator->Free(joint, sizeof(b2PulleyJoint)); - break; - - case e_gearJoint: - allocator->Free(joint, sizeof(b2GearJoint)); - break; - - case e_lineJoint: - allocator->Free(joint, sizeof(b2LineJoint)); - break; - - case e_weldJoint: - allocator->Free(joint, sizeof(b2WeldJoint)); - break; - - case e_frictionJoint: - allocator->Free(joint, sizeof(b2FrictionJoint)); - break; - - default: - b2Assert(false); - break; - } -} - -b2Joint::b2Joint(const b2JointDef* def) -{ - b2Assert(def->bodyA != def->bodyB); - - m_type = def->type; - m_prev = NULL; - m_next = NULL; - m_bodyA = def->bodyA; - m_bodyB = def->bodyB; - m_collideConnected = def->collideConnected; - m_islandFlag = false; - m_userData = def->userData; - - m_edgeA.joint = NULL; - m_edgeA.other = NULL; - m_edgeA.prev = NULL; - m_edgeA.next = NULL; - - m_edgeB.joint = NULL; - m_edgeB.other = NULL; - m_edgeB.prev = NULL; - m_edgeB.next = NULL; -} - -bool b2Joint::IsActive() const -{ - return m_bodyA->IsActive() && m_bodyB->IsActive(); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.h deleted file mode 100644 index 01de22d26..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2Joint.h +++ /dev/null @@ -1,227 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_JOINT_H -#define B2_JOINT_H - -#include - -class b2Body; -class b2Joint; -struct b2TimeStep; -class b2BlockAllocator; - -enum b2JointType -{ - e_unknownJoint, - e_revoluteJoint, - e_prismaticJoint, - e_distanceJoint, - e_pulleyJoint, - e_mouseJoint, - e_gearJoint, - e_lineJoint, - e_weldJoint, - e_frictionJoint, -}; - -enum b2LimitState -{ - e_inactiveLimit, - e_atLowerLimit, - e_atUpperLimit, - e_equalLimits -}; - -struct b2Jacobian -{ - b2Vec2 linearA; - float32 angularA; - b2Vec2 linearB; - float32 angularB; - - void SetZero(); - void Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); - float32 Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2); -}; - -/// A joint edge is used to connect bodies and joints together -/// in a joint graph where each body is a node and each joint -/// is an edge. A joint edge belongs to a doubly linked list -/// maintained in each attached body. Each joint has two joint -/// nodes, one for each attached body. -struct b2JointEdge -{ - b2Body* other; ///< provides quick access to the other body attached. - b2Joint* joint; ///< the joint - b2JointEdge* prev; ///< the previous joint edge in the body's joint list - b2JointEdge* next; ///< the next joint edge in the body's joint list -}; - -/// Joint definitions are used to construct joints. -struct b2JointDef -{ - b2JointDef() - { - type = e_unknownJoint; - userData = NULL; - bodyA = NULL; - bodyB = NULL; - collideConnected = false; - } - - /// The joint type is set automatically for concrete joint types. - b2JointType type; - - /// Use this to attach application specific data to your joints. - void* userData; - - /// The first attached body. - b2Body* bodyA; - - /// The second attached body. - b2Body* bodyB; - - /// Set this flag to true if the attached bodies should collide. - bool collideConnected; -}; - -/// The base joint class. Joints are used to constraint two bodies together in -/// various fashions. Some joints also feature limits and motors. -class b2Joint -{ -public: - - /// Get the type of the concrete joint. - b2JointType GetType() const; - - /// Get the first body attached to this joint. - b2Body* GetBodyA(); - - /// Get the second body attached to this joint. - b2Body* GetBodyB(); - - /// Get the anchor point on bodyA in world coordinates. - virtual b2Vec2 GetAnchorA() const = 0; - - /// Get the anchor point on bodyB in world coordinates. - virtual b2Vec2 GetAnchorB() const = 0; - - /// Get the reaction force on body2 at the joint anchor in Newtons. - virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0; - - /// Get the reaction torque on body2 in N*m. - virtual float32 GetReactionTorque(float32 inv_dt) const = 0; - - /// Get the next joint the world joint list. - b2Joint* GetNext(); - - /// Get the user data pointer. - void* GetUserData() const; - - /// Set the user data pointer. - void SetUserData(void* data); - - /// Short-cut function to determine if either body is inactive. - bool IsActive() const; - -protected: - friend class b2World; - friend class b2Body; - friend class b2Island; - - static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator); - static void Destroy(b2Joint* joint, b2BlockAllocator* allocator); - - b2Joint(const b2JointDef* def); - virtual ~b2Joint() {} - - virtual void InitVelocityConstraints(const b2TimeStep& step) = 0; - virtual void SolveVelocityConstraints(const b2TimeStep& step) = 0; - - // This returns true if the position errors are within tolerance. - virtual bool SolvePositionConstraints(float32 baumgarte) = 0; - - b2JointType m_type; - b2Joint* m_prev; - b2Joint* m_next; - b2JointEdge m_edgeA; - b2JointEdge m_edgeB; - b2Body* m_bodyA; - b2Body* m_bodyB; - - bool m_islandFlag; - bool m_collideConnected; - - void* m_userData; - - // Cache here per time step to reduce cache misses. - b2Vec2 m_localCenterA, m_localCenterB; - float32 m_invMassA, m_invIA; - float32 m_invMassB, m_invIB; -}; - -inline void b2Jacobian::SetZero() -{ - linearA.SetZero(); angularA = 0.0f; - linearB.SetZero(); angularB = 0.0f; -} - -inline void b2Jacobian::Set(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) -{ - linearA = x1; angularA = a1; - linearB = x2; angularB = a2; -} - -inline float32 b2Jacobian::Compute(const b2Vec2& x1, float32 a1, const b2Vec2& x2, float32 a2) -{ - return b2Dot(linearA, x1) + angularA * a1 + b2Dot(linearB, x2) + angularB * a2; -} - -inline b2JointType b2Joint::GetType() const -{ - return m_type; -} - -inline b2Body* b2Joint::GetBodyA() -{ - return m_bodyA; -} - -inline b2Body* b2Joint::GetBodyB() -{ - return m_bodyB; -} - -inline b2Joint* b2Joint::GetNext() -{ - return m_next; -} - -inline void* b2Joint::GetUserData() const -{ - return m_userData; -} - -inline void b2Joint::SetUserData(void* data) -{ - m_userData = data; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.cpp deleted file mode 100644 index 40a641597..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.cpp +++ /dev/null @@ -1,589 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Linear constraint (point-to-line) -// d = p2 - p1 = x2 + r2 - x1 - r1 -// C = dot(perp, d) -// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1)) -// = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2) -// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] -// -// K = J * invM * JT -// -// J = [-a -s1 a s2] -// a = perp -// s1 = cross(d + r1, a) = cross(p2 - x1, a) -// s2 = cross(r2, a) = cross(p2 - x2, a) - - -// Motor/Limit linear constraint -// C = dot(ax1, d) -// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) -// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] - -// Block Solver -// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even -// when the mass has poor distribution (leading to large torques about the joint anchor points). -// -// The Jacobian has 3 rows: -// J = [-uT -s1 uT s2] // linear -// [-vT -a1 vT a2] // limit -// -// u = perp -// v = axis -// s1 = cross(d + r1, u), s2 = cross(r2, u) -// a1 = cross(d + r1, v), a2 = cross(r2, v) - -// M * (v2 - v1) = JT * df -// J * v2 = bias -// -// v2 = v1 + invM * JT * df -// J * (v1 + invM * JT * df) = bias -// K * df = bias - J * v1 = -Cdot -// K = J * invM * JT -// Cdot = J * v1 - bias -// -// Now solve for f2. -// df = f2 - f1 -// K * (f2 - f1) = -Cdot -// f2 = invK * (-Cdot) + f1 -// -// Clamp accumulated limit impulse. -// lower: f2(2) = max(f2(2), 0) -// upper: f2(2) = min(f2(2), 0) -// -// Solve for correct f2(1) -// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * f2(2) + K(1,1:2) * f1 -// = -Cdot(1) - K(1,2) * f2(2) + K(1,1) * f1(1) + K(1,2) * f1(2) -// K(1,1) * f2(1) = -Cdot(1) - K(1,2) * (f2(2) - f1(2)) + K(1,1) * f1(1) -// f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) -// -// Now compute impulse to be applied: -// df = f2 - f1 - -void b2LineJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) -{ - bodyA = b1; - bodyB = b2; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); - localAxisA = bodyA->GetLocalVector(axis); -} - -b2LineJoint::b2LineJoint(const b2LineJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_localXAxis1 = def->localAxisA; - m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); - - m_impulse.SetZero(); - m_motorMass = 0.0; - m_motorImpulse = 0.0f; - - m_lowerTranslation = def->lowerTranslation; - m_upperTranslation = def->upperTranslation; - m_maxMotorForce = def->maxMotorForce; - m_motorSpeed = def->motorSpeed; - m_enableLimit = def->enableLimit; - m_enableMotor = def->enableMotor; - m_limitState = e_inactiveLimit; - - m_axis.SetZero(); - m_perp.SetZero(); -} - -void b2LineJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - m_localCenterA = b1->GetLocalCenter(); - m_localCenterB = b2->GetLocalCenter(); - - b2Transform xf1 = b1->GetTransform(); - b2Transform xf2 = b2->GetTransform(); - - // Compute the effective masses. - b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - - m_invMassA = b1->m_invMass; - m_invIA = b1->m_invI; - m_invMassB = b2->m_invMass; - m_invIB = b2->m_invI; - - // Compute motor Jacobian and effective mass. - { - m_axis = b2Mul(xf1.R, m_localXAxis1); - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; - if (m_motorMass > b2_epsilon) - { - m_motorMass = 1.0f / m_motorMass; - } - else - { - m_motorMass = 0.0f; - } - } - - // Prismatic constraint. - { - m_perp = b2Mul(xf1.R, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12); - m_K.col2.Set(k12, k22); - } - - // Compute motor and limit terms. - if (m_enableLimit) - { - float32 jointTranslation = b2Dot(m_axis, d); - if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) - { - m_limitState = e_equalLimits; - } - else if (jointTranslation <= m_lowerTranslation) - { - if (m_limitState != e_atLowerLimit) - { - m_limitState = e_atLowerLimit; - m_impulse.y = 0.0f; - } - } - else if (jointTranslation >= m_upperTranslation) - { - if (m_limitState != e_atUpperLimit) - { - m_limitState = e_atUpperLimit; - m_impulse.y = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - m_impulse.y = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - } - - if (m_enableMotor == false) - { - m_motorImpulse = 0.0f; - } - - if (step.warmStarting) - { - // Account for variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; - - b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis; - float32 L1 = m_impulse.x * m_s1 + (m_motorImpulse + m_impulse.y) * m_a1; - float32 L2 = m_impulse.x * m_s2 + (m_motorImpulse + m_impulse.y) * m_a2; - - b1->m_linearVelocity -= m_invMassA * P; - b1->m_angularVelocity -= m_invIA * L1; - - b2->m_linearVelocity += m_invMassB * P; - b2->m_angularVelocity += m_invIB * L2; - } - else - { - m_impulse.SetZero(); - m_motorImpulse = 0.0f; - } -} - -void b2LineJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; - - // Solve linear motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - float32 impulse = m_motorMass * (m_motorSpeed - Cdot); - float32 oldImpulse = m_motorImpulse; - float32 maxImpulse = step.dt * m_maxMotorForce; - m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = m_motorImpulse - oldImpulse; - - b2Vec2 P = impulse * m_axis; - float32 L1 = impulse * m_a1; - float32 L2 = impulse * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - float32 Cdot1 = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; - - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - // Solve prismatic and limit constraint in block form. - float32 Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - b2Vec2 Cdot(Cdot1, Cdot2); - - b2Vec2 f1 = m_impulse; - b2Vec2 df = m_K.Solve(-Cdot); - m_impulse += df; - - if (m_limitState == e_atLowerLimit) - { - m_impulse.y = b2Max(m_impulse.y, 0.0f); - } - else if (m_limitState == e_atUpperLimit) - { - m_impulse.y = b2Min(m_impulse.y, 0.0f); - } - - // f2(1) = invK(1,1) * (-Cdot(1) - K(1,2) * (f2(2) - f1(2))) + f1(1) - float32 b = -Cdot1 - (m_impulse.y - f1.y) * m_K.col2.x; - float32 f2r; - if (m_K.col1.x != 0.0f) - { - f2r = b / m_K.col1.x + f1.x; - } - else - { - f2r = f1.x; - } - - m_impulse.x = f2r; - - df = m_impulse - f1; - - b2Vec2 P = df.x * m_perp + df.y * m_axis; - float32 L1 = df.x * m_s1 + df.y * m_a1; - float32 L2 = df.x * m_s2 + df.y * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - else - { - // Limit is inactive, just solve the prismatic constraint in block form. - float32 df; - if (m_K.col1.x != 0.0f) - { - df = - Cdot1 / m_K.col1.x; - } - else - { - df = 0.0f; - } - m_impulse.x += df; - - b2Vec2 P = df * m_perp; - float32 L1 = df * m_s1; - float32 L2 = df * m_s2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; -} - -bool b2LineJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 c1 = b1->m_sweep.c; - float32 a1 = b1->m_sweep.a; - - b2Vec2 c2 = b2->m_sweep.c; - float32 a2 = b2->m_sweep.a; - - // Solve linear limit constraint. - float32 linearError = 0.0f, angularError = 0.0f; - bool active = false; - float32 C2 = 0.0f; - - b2Mat22 R1(a1), R2(a2); - - b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); - b2Vec2 d = c2 + r2 - c1 - r1; - - if (m_enableLimit) - { - m_axis = b2Mul(R1, m_localXAxis1); - - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - float32 translation = b2Dot(m_axis, d); - if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) - { - // Prevent large angular corrections - C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); - linearError = b2Abs(translation); - active = true; - } - else if (translation <= m_lowerTranslation) - { - // Prevent large linear corrections and allow some slop. - C2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - linearError = m_lowerTranslation - translation; - active = true; - } - else if (translation >= m_upperTranslation) - { - // Prevent large linear corrections and allow some slop. - C2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection); - linearError = translation - m_upperTranslation; - active = true; - } - } - - m_perp = b2Mul(R1, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - b2Vec2 impulse; - float32 C1; - C1 = b2Dot(m_perp, d); - - linearError = b2Max(linearError, b2Abs(C1)); - angularError = 0.0f; - - if (active) - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12); - m_K.col2.Set(k12, k22); - - b2Vec2 C; - C.x = C1; - C.y = C2; - - impulse = m_K.Solve(-C); - } - else - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - - float32 impulse1; - if (k11 != 0.0f) - { - impulse1 = - C1 / k11; - } - else - { - impulse1 = 0.0f; - } - - impulse.x = impulse1; - impulse.y = 0.0f; - } - - b2Vec2 P = impulse.x * m_perp + impulse.y * m_axis; - float32 L1 = impulse.x * m_s1 + impulse.y * m_a1; - float32 L2 = impulse.x * m_s2 + impulse.y * m_a2; - - c1 -= m_invMassA * P; - a1 -= m_invIA * L1; - c2 += m_invMassB * P; - a2 += m_invIB * L2; - - // TODO_ERIN remove need for this. - b1->m_sweep.c = c1; - b1->m_sweep.a = a1; - b2->m_sweep.c = c2; - b2->m_sweep.a = a2; - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - return linearError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2LineJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2LineJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2LineJoint::GetReactionForce(float32 inv_dt) const -{ - return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.y) * m_axis); -} - -float32 b2LineJoint::GetReactionTorque(float32 inv_dt) const -{ - B2_NOT_USED(inv_dt); - return 0.0f; -} - -float32 b2LineJoint::GetJointTranslation() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); - b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - float32 translation = b2Dot(d, axis); - return translation; -} - -float32 b2LineJoint::GetJointSpeed() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - - float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); - return speed; -} - -bool b2LineJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2LineJoint::EnableLimit(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = flag; -} - -float32 b2LineJoint::GetLowerLimit() const -{ - return m_lowerTranslation; -} - -float32 b2LineJoint::GetUpperLimit() const -{ - return m_upperTranslation; -} - -void b2LineJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerTranslation = lower; - m_upperTranslation = upper; -} - -bool b2LineJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2LineJoint::EnableMotor(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableMotor = flag; -} - -void b2LineJoint::SetMotorSpeed(float32 speed) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_motorSpeed = speed; -} - -void b2LineJoint::SetMaxMotorForce(float32 force) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_maxMotorForce = force; -} - -float32 b2LineJoint::GetMotorForce() const -{ - return m_motorImpulse; -} - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.h deleted file mode 100644 index 3f9be4cc3..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2LineJoint.h +++ /dev/null @@ -1,171 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_LINE_JOINT_H -#define B2_LINE_JOINT_H - -#include - -/// Line joint definition. This requires defining a line of -/// motion using an axis and an anchor point. The definition uses local -/// anchor points and a local axis so that the initial configuration -/// can violate the constraint slightly. The joint translation is zero -/// when the local anchor points coincide in world space. Using local -/// anchors and a local axis helps when saving and loading a game. -struct b2LineJointDef : public b2JointDef -{ - b2LineJointDef() - { - type = e_lineJoint; - localAnchorA.SetZero(); - localAnchorB.SetZero(); - localAxisA.Set(1.0f, 0.0f); - enableLimit = false; - lowerTranslation = 0.0f; - upperTranslation = 0.0f; - enableMotor = false; - maxMotorForce = 0.0f; - motorSpeed = 0.0f; - } - - /// Initialize the bodies, anchors, axis, and reference angle using the world - /// anchor and world axis. - void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The local translation axis in body1. - b2Vec2 localAxisA; - - /// Enable/disable the joint limit. - bool enableLimit; - - /// The lower translation limit, usually in meters. - float32 lowerTranslation; - - /// The upper translation limit, usually in meters. - float32 upperTranslation; - - /// Enable/disable the joint motor. - bool enableMotor; - - /// The maximum motor torque, usually in N-m. - float32 maxMotorForce; - - /// The desired motor speed in radians per second. - float32 motorSpeed; -}; - -/// A line joint. This joint provides two degrees of freedom: translation -/// along an axis fixed in body1 and rotation in the plane. You can use a -/// joint limit to restrict the range of motion and a joint motor to drive -/// the motion or to model joint friction. -class b2LineJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Get the current joint translation, usually in meters. - float32 GetJointTranslation() const; - - /// Get the current joint translation speed, usually in meters per second. - float32 GetJointSpeed() const; - - /// Is the joint limit enabled? - bool IsLimitEnabled() const; - - /// Enable/disable the joint limit. - void EnableLimit(bool flag); - - /// Get the lower joint limit, usually in meters. - float32 GetLowerLimit() const; - - /// Get the upper joint limit, usually in meters. - float32 GetUpperLimit() const; - - /// Set the joint limits, usually in meters. - void SetLimits(float32 lower, float32 upper); - - /// Is the joint motor enabled? - bool IsMotorEnabled() const; - - /// Enable/disable the joint motor. - void EnableMotor(bool flag); - - /// Set the motor speed, usually in meters per second. - void SetMotorSpeed(float32 speed); - - /// Get the motor speed, usually in meters per second. - float32 GetMotorSpeed() const; - - /// Set/Get the maximum motor force, usually in N. - void SetMaxMotorForce(float32 force); - float32 GetMaxMotorForce() const; - - /// Get the current motor force, usually in N. - float32 GetMotorForce() const; - -protected: - - friend class b2Joint; - b2LineJoint(const b2LineJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_localXAxis1; - b2Vec2 m_localYAxis1; - - b2Vec2 m_axis, m_perp; - float32 m_s1, m_s2; - float32 m_a1, m_a2; - - b2Mat22 m_K; - b2Vec2 m_impulse; - - float32 m_motorMass; // effective mass for motor/limit translational constraint. - float32 m_motorImpulse; - - float32 m_lowerTranslation; - float32 m_upperTranslation; - float32 m_maxMotorForce; - float32 m_motorSpeed; - - bool m_enableLimit; - bool m_enableMotor; - b2LimitState m_limitState; -}; - -inline float32 b2LineJoint::GetMotorSpeed() const -{ - return m_motorSpeed; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.cpp deleted file mode 100644 index 3e6269082..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// p = attached point, m = mouse point -// C = p - m -// Cdot = v -// = v + cross(w, r) -// J = [I r_skew] -// Identity used: -// w k % (rx i + ry j) = w * (-ry i + rx j) - -b2MouseJoint::b2MouseJoint(const b2MouseJointDef* def) -: b2Joint(def) -{ - b2Assert(def->target.IsValid()); - b2Assert(b2IsValid(def->maxForce) && def->maxForce >= 0.0f); - b2Assert(b2IsValid(def->frequencyHz) && def->frequencyHz >= 0.0f); - b2Assert(b2IsValid(def->dampingRatio) && def->dampingRatio >= 0.0f); - - m_target = def->target; - m_localAnchor = b2MulT(m_bodyB->GetTransform(), m_target); - - m_maxForce = def->maxForce; - m_impulse.SetZero(); - - m_frequencyHz = def->frequencyHz; - m_dampingRatio = def->dampingRatio; - - m_beta = 0.0f; - m_gamma = 0.0f; -} - -void b2MouseJoint::SetTarget(const b2Vec2& target) -{ - if (m_bodyB->IsAwake() == false) - { - m_bodyB->SetAwake(true); - } - m_target = target; -} - -const b2Vec2& b2MouseJoint::GetTarget() const -{ - return m_target; -} - -void b2MouseJoint::SetMaxForce(float32 force) -{ - m_maxForce = force; -} - -float32 b2MouseJoint::GetMaxForce() const -{ - return m_maxForce; -} - -void b2MouseJoint::SetFrequency(float32 hz) -{ - m_frequencyHz = hz; -} - -float32 b2MouseJoint::GetFrequency() const -{ - return m_frequencyHz; -} - -void b2MouseJoint::SetDampingRatio(float32 ratio) -{ - m_dampingRatio = ratio; -} - -float32 b2MouseJoint::GetDampingRatio() const -{ - return m_dampingRatio; -} - -void b2MouseJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b = m_bodyB; - - float32 mass = b->GetMass(); - - // Frequency - float32 omega = 2.0f * b2_pi * m_frequencyHz; - - // Damping coefficient - float32 d = 2.0f * mass * m_dampingRatio * omega; - - // Spring stiffness - float32 k = mass * (omega * omega); - - // magic formulas - // gamma has units of inverse mass. - // beta has units of inverse time. - b2Assert(d + step.dt * k > b2_epsilon); - m_gamma = step.dt * (d + step.dt * k); - if (m_gamma != 0.0f) - { - m_gamma = 1.0f / m_gamma; - } - m_beta = step.dt * k * m_gamma; - - // Compute the effective mass matrix. - b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); - - // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)] - // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y] - // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] - float32 invMass = b->m_invMass; - float32 invI = b->m_invI; - - b2Mat22 K1; - K1.col1.x = invMass; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass; - - b2Mat22 K2; - K2.col1.x = invI * r.y * r.y; K2.col2.x = -invI * r.x * r.y; - K2.col1.y = -invI * r.x * r.y; K2.col2.y = invI * r.x * r.x; - - b2Mat22 K = K1 + K2; - K.col1.x += m_gamma; - K.col2.y += m_gamma; - - m_mass = K.GetInverse(); - - m_C = b->m_sweep.c + r - m_target; - - // Cheat with some damping - b->m_angularVelocity *= 0.98f; - - // Warm starting. - m_impulse *= step.dtRatio; - b->m_linearVelocity += invMass * m_impulse; - b->m_angularVelocity += invI * b2Cross(r, m_impulse); -} - -void b2MouseJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b = m_bodyB; - - b2Vec2 r = b2Mul(b->GetTransform().R, m_localAnchor - b->GetLocalCenter()); - - // Cdot = v + cross(w, r) - b2Vec2 Cdot = b->m_linearVelocity + b2Cross(b->m_angularVelocity, r); - b2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_beta * m_C + m_gamma * m_impulse)); - - b2Vec2 oldImpulse = m_impulse; - m_impulse += impulse; - float32 maxImpulse = step.dt * m_maxForce; - if (m_impulse.LengthSquared() > maxImpulse * maxImpulse) - { - m_impulse *= maxImpulse / m_impulse.Length(); - } - impulse = m_impulse - oldImpulse; - - b->m_linearVelocity += b->m_invMass * impulse; - b->m_angularVelocity += b->m_invI * b2Cross(r, impulse); -} - -b2Vec2 b2MouseJoint::GetAnchorA() const -{ - return m_target; -} - -b2Vec2 b2MouseJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor); -} - -b2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const -{ - return inv_dt * m_impulse; -} - -float32 b2MouseJoint::GetReactionTorque(float32 inv_dt) const -{ - return inv_dt * 0.0f; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.h deleted file mode 100644 index 1f8256f7e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2MouseJoint.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_MOUSE_JOINT_H -#define B2_MOUSE_JOINT_H - -#include - -/// Mouse joint definition. This requires a world target point, -/// tuning parameters, and the time step. -struct b2MouseJointDef : public b2JointDef -{ - b2MouseJointDef() - { - type = e_mouseJoint; - target.Set(0.0f, 0.0f); - maxForce = 0.0f; - frequencyHz = 5.0f; - dampingRatio = 0.7f; - } - - /// The initial world target point. This is assumed - /// to coincide with the body anchor initially. - b2Vec2 target; - - /// The maximum constraint force that can be exerted - /// to move the candidate body. Usually you will express - /// as some multiple of the weight (multiplier * mass * gravity). - float32 maxForce; - - /// The response speed. - float32 frequencyHz; - - /// The damping ratio. 0 = no damping, 1 = critical damping. - float32 dampingRatio; -}; - -/// A mouse joint is used to make a point on a body track a -/// specified world point. This a soft constraint with a maximum -/// force. This allows the constraint to stretch and without -/// applying huge forces. -/// NOTE: this joint is not documented in the manual because it was -/// developed to be used in the testbed. If you want to learn how to -/// use the mouse joint, look at the testbed. -class b2MouseJoint : public b2Joint -{ -public: - - /// Implements b2Joint. - b2Vec2 GetAnchorA() const; - - /// Implements b2Joint. - b2Vec2 GetAnchorB() const; - - /// Implements b2Joint. - b2Vec2 GetReactionForce(float32 inv_dt) const; - - /// Implements b2Joint. - float32 GetReactionTorque(float32 inv_dt) const; - - /// Use this to update the target point. - void SetTarget(const b2Vec2& target); - const b2Vec2& GetTarget() const; - - /// Set/get the maximum force in Newtons. - void SetMaxForce(float32 force); - float32 GetMaxForce() const; - - /// Set/get the frequency in Hertz. - void SetFrequency(float32 hz); - float32 GetFrequency() const; - - /// Set/get the damping ratio (dimensionless). - void SetDampingRatio(float32 ratio); - float32 GetDampingRatio() const; - -protected: - friend class b2Joint; - - b2MouseJoint(const b2MouseJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte) { B2_NOT_USED(baumgarte); return true; } - - b2Vec2 m_localAnchor; - b2Vec2 m_target; - b2Vec2 m_impulse; - - b2Mat22 m_mass; // effective mass for point-to-point constraint. - b2Vec2 m_C; // position error - float32 m_maxForce; - float32 m_frequencyHz; - float32 m_dampingRatio; - float32 m_beta; - float32 m_gamma; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp deleted file mode 100644 index 66b28d4bc..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp +++ /dev/null @@ -1,587 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Linear constraint (point-to-line) -// d = p2 - p1 = x2 + r2 - x1 - r1 -// C = dot(perp, d) -// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1)) -// = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2) -// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] -// -// Angular constraint -// C = a2 - a1 + a_initial -// Cdot = w2 - w1 -// J = [0 0 -1 0 0 1] -// -// K = J * invM * JT -// -// J = [-a -s1 a s2] -// [0 -1 0 1] -// a = perp -// s1 = cross(d + r1, a) = cross(p2 - x1, a) -// s2 = cross(r2, a) = cross(p2 - x2, a) - - -// Motor/Limit linear constraint -// C = dot(ax1, d) -// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) -// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] - -// Block Solver -// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even -// when the mass has poor distribution (leading to large torques about the joint anchor points). -// -// The Jacobian has 3 rows: -// J = [-uT -s1 uT s2] // linear -// [0 -1 0 1] // angular -// [-vT -a1 vT a2] // limit -// -// u = perp -// v = axis -// s1 = cross(d + r1, u), s2 = cross(r2, u) -// a1 = cross(d + r1, v), a2 = cross(r2, v) - -// M * (v2 - v1) = JT * df -// J * v2 = bias -// -// v2 = v1 + invM * JT * df -// J * (v1 + invM * JT * df) = bias -// K * df = bias - J * v1 = -Cdot -// K = J * invM * JT -// Cdot = J * v1 - bias -// -// Now solve for f2. -// df = f2 - f1 -// K * (f2 - f1) = -Cdot -// f2 = invK * (-Cdot) + f1 -// -// Clamp accumulated limit impulse. -// lower: f2(3) = max(f2(3), 0) -// upper: f2(3) = min(f2(3), 0) -// -// Solve for correct f2(1:2) -// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 -// = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) -// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + K(1:2,1:2) * f1(1:2) -// f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) -// -// Now compute impulse to be applied: -// df = f2 - f1 - -void b2PrismaticJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor, const b2Vec2& axis) -{ - bodyA = b1; - bodyB = b2; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); - localAxis1 = bodyA->GetLocalVector(axis); - referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); -} - -b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_localXAxis1 = def->localAxis1; - m_localYAxis1 = b2Cross(1.0f, m_localXAxis1); - m_refAngle = def->referenceAngle; - - m_impulse.SetZero(); - m_motorMass = 0.0; - m_motorImpulse = 0.0f; - - m_lowerTranslation = def->lowerTranslation; - m_upperTranslation = def->upperTranslation; - m_maxMotorForce = def->maxMotorForce; - m_motorSpeed = def->motorSpeed; - m_enableLimit = def->enableLimit; - m_enableMotor = def->enableMotor; - m_limitState = e_inactiveLimit; - - m_axis.SetZero(); - m_perp.SetZero(); -} - -void b2PrismaticJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - m_localCenterA = b1->GetLocalCenter(); - m_localCenterB = b2->GetLocalCenter(); - - b2Transform xf1 = b1->GetTransform(); - b2Transform xf2 = b2->GetTransform(); - - // Compute the effective masses. - b2Vec2 r1 = b2Mul(xf1.R, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(xf2.R, m_localAnchor2 - m_localCenterB); - b2Vec2 d = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - - m_invMassA = b1->m_invMass; - m_invIA = b1->m_invI; - m_invMassB = b2->m_invMass; - m_invIB = b2->m_invI; - - // Compute motor Jacobian and effective mass. - { - m_axis = b2Mul(xf1.R, m_localXAxis1); - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - m_motorMass = m_invMassA + m_invMassB + m_invIA * m_a1 * m_a1 + m_invIB * m_a2 * m_a2; - if (m_motorMass > b2_epsilon) - { - m_motorMass = 1.0f / m_motorMass; - } - } - - // Prismatic constraint. - { - m_perp = b2Mul(xf1.R, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = i1 + i2; - float32 k23 = i1 * m_a1 + i2 * m_a2; - float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12, k13); - m_K.col2.Set(k12, k22, k23); - m_K.col3.Set(k13, k23, k33); - } - - // Compute motor and limit terms. - if (m_enableLimit) - { - float32 jointTranslation = b2Dot(m_axis, d); - if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) - { - m_limitState = e_equalLimits; - } - else if (jointTranslation <= m_lowerTranslation) - { - if (m_limitState != e_atLowerLimit) - { - m_limitState = e_atLowerLimit; - m_impulse.z = 0.0f; - } - } - else if (jointTranslation >= m_upperTranslation) - { - if (m_limitState != e_atUpperLimit) - { - m_limitState = e_atUpperLimit; - m_impulse.z = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - m_impulse.z = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - m_impulse.z = 0.0f; - } - - if (m_enableMotor == false) - { - m_motorImpulse = 0.0f; - } - - if (step.warmStarting) - { - // Account for variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; - - b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis; - float32 L1 = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1; - float32 L2 = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2; - - b1->m_linearVelocity -= m_invMassA * P; - b1->m_angularVelocity -= m_invIA * L1; - - b2->m_linearVelocity += m_invMassB * P; - b2->m_angularVelocity += m_invIB * L2; - } - else - { - m_impulse.SetZero(); - m_motorImpulse = 0.0f; - } -} - -void b2PrismaticJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; - - // Solve linear motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 Cdot = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - float32 impulse = m_motorMass * (m_motorSpeed - Cdot); - float32 oldImpulse = m_motorImpulse; - float32 maxImpulse = step.dt * m_maxMotorForce; - m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = m_motorImpulse - oldImpulse; - - b2Vec2 P = impulse * m_axis; - float32 L1 = impulse * m_a1; - float32 L2 = impulse * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - b2Vec2 Cdot1; - Cdot1.x = b2Dot(m_perp, v2 - v1) + m_s2 * w2 - m_s1 * w1; - Cdot1.y = w2 - w1; - - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - // Solve prismatic and limit constraint in block form. - float32 Cdot2; - Cdot2 = b2Dot(m_axis, v2 - v1) + m_a2 * w2 - m_a1 * w1; - b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); - - b2Vec3 f1 = m_impulse; - b2Vec3 df = m_K.Solve33(-Cdot); - m_impulse += df; - - if (m_limitState == e_atLowerLimit) - { - m_impulse.z = b2Max(m_impulse.z, 0.0f); - } - else if (m_limitState == e_atUpperLimit) - { - m_impulse.z = b2Min(m_impulse.z, 0.0f); - } - - // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) - b2Vec2 b = -Cdot1 - (m_impulse.z - f1.z) * b2Vec2(m_K.col3.x, m_K.col3.y); - b2Vec2 f2r = m_K.Solve22(b) + b2Vec2(f1.x, f1.y); - m_impulse.x = f2r.x; - m_impulse.y = f2r.y; - - df = m_impulse - f1; - - b2Vec2 P = df.x * m_perp + df.z * m_axis; - float32 L1 = df.x * m_s1 + df.y + df.z * m_a1; - float32 L2 = df.x * m_s2 + df.y + df.z * m_a2; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - else - { - // Limit is inactive, just solve the prismatic constraint in block form. - b2Vec2 df = m_K.Solve22(-Cdot1); - m_impulse.x += df.x; - m_impulse.y += df.y; - - b2Vec2 P = df.x * m_perp; - float32 L1 = df.x * m_s1 + df.y; - float32 L2 = df.x * m_s2 + df.y; - - v1 -= m_invMassA * P; - w1 -= m_invIA * L1; - - v2 += m_invMassB * P; - w2 += m_invIB * L2; - } - - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; -} - -bool b2PrismaticJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 c1 = b1->m_sweep.c; - float32 a1 = b1->m_sweep.a; - - b2Vec2 c2 = b2->m_sweep.c; - float32 a2 = b2->m_sweep.a; - - // Solve linear limit constraint. - float32 linearError = 0.0f, angularError = 0.0f; - bool active = false; - float32 C2 = 0.0f; - - b2Mat22 R1(a1), R2(a2); - - b2Vec2 r1 = b2Mul(R1, m_localAnchor1 - m_localCenterA); - b2Vec2 r2 = b2Mul(R2, m_localAnchor2 - m_localCenterB); - b2Vec2 d = c2 + r2 - c1 - r1; - - if (m_enableLimit) - { - m_axis = b2Mul(R1, m_localXAxis1); - - m_a1 = b2Cross(d + r1, m_axis); - m_a2 = b2Cross(r2, m_axis); - - float32 translation = b2Dot(m_axis, d); - if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) - { - // Prevent large angular corrections - C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); - linearError = b2Abs(translation); - active = true; - } - else if (translation <= m_lowerTranslation) - { - // Prevent large linear corrections and allow some slop. - C2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - linearError = m_lowerTranslation - translation; - active = true; - } - else if (translation >= m_upperTranslation) - { - // Prevent large linear corrections and allow some slop. - C2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection); - linearError = translation - m_upperTranslation; - active = true; - } - } - - m_perp = b2Mul(R1, m_localYAxis1); - - m_s1 = b2Cross(d + r1, m_perp); - m_s2 = b2Cross(r2, m_perp); - - b2Vec3 impulse; - b2Vec2 C1; - C1.x = b2Dot(m_perp, d); - C1.y = a2 - a1 - m_refAngle; - - linearError = b2Max(linearError, b2Abs(C1.x)); - angularError = b2Abs(C1.y); - - if (active) - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k13 = i1 * m_s1 * m_a1 + i2 * m_s2 * m_a2; - float32 k22 = i1 + i2; - float32 k23 = i1 * m_a1 + i2 * m_a2; - float32 k33 = m1 + m2 + i1 * m_a1 * m_a1 + i2 * m_a2 * m_a2; - - m_K.col1.Set(k11, k12, k13); - m_K.col2.Set(k12, k22, k23); - m_K.col3.Set(k13, k23, k33); - - b2Vec3 C; - C.x = C1.x; - C.y = C1.y; - C.z = C2; - - impulse = m_K.Solve33(-C); - } - else - { - float32 m1 = m_invMassA, m2 = m_invMassB; - float32 i1 = m_invIA, i2 = m_invIB; - - float32 k11 = m1 + m2 + i1 * m_s1 * m_s1 + i2 * m_s2 * m_s2; - float32 k12 = i1 * m_s1 + i2 * m_s2; - float32 k22 = i1 + i2; - - m_K.col1.Set(k11, k12, 0.0f); - m_K.col2.Set(k12, k22, 0.0f); - - b2Vec2 impulse1 = m_K.Solve22(-C1); - impulse.x = impulse1.x; - impulse.y = impulse1.y; - impulse.z = 0.0f; - } - - b2Vec2 P = impulse.x * m_perp + impulse.z * m_axis; - float32 L1 = impulse.x * m_s1 + impulse.y + impulse.z * m_a1; - float32 L2 = impulse.x * m_s2 + impulse.y + impulse.z * m_a2; - - c1 -= m_invMassA * P; - a1 -= m_invIA * L1; - c2 += m_invMassB * P; - a2 += m_invIB * L2; - - // TODO_ERIN remove need for this. - b1->m_sweep.c = c1; - b1->m_sweep.a = a1; - b2->m_sweep.c = c2; - b2->m_sweep.a = a2; - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - - return linearError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2PrismaticJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2PrismaticJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2PrismaticJoint::GetReactionForce(float32 inv_dt) const -{ - return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis); -} - -float32 b2PrismaticJoint::GetReactionTorque(float32 inv_dt) const -{ - return inv_dt * m_impulse.y; -} - -float32 b2PrismaticJoint::GetJointTranslation() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 p1 = b1->GetWorldPoint(m_localAnchor1); - b2Vec2 p2 = b2->GetWorldPoint(m_localAnchor2); - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - float32 translation = b2Dot(d, axis); - return translation; -} - -float32 b2PrismaticJoint::GetJointSpeed() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - b2Vec2 d = p2 - p1; - b2Vec2 axis = b1->GetWorldVector(m_localXAxis1); - - b2Vec2 v1 = b1->m_linearVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - float32 w2 = b2->m_angularVelocity; - - float32 speed = b2Dot(d, b2Cross(w1, axis)) + b2Dot(axis, v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1)); - return speed; -} - -bool b2PrismaticJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2PrismaticJoint::EnableLimit(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = flag; -} - -float32 b2PrismaticJoint::GetLowerLimit() const -{ - return m_lowerTranslation; -} - -float32 b2PrismaticJoint::GetUpperLimit() const -{ - return m_upperTranslation; -} - -void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerTranslation = lower; - m_upperTranslation = upper; -} - -bool b2PrismaticJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2PrismaticJoint::EnableMotor(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableMotor = flag; -} - -void b2PrismaticJoint::SetMotorSpeed(float32 speed) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_motorSpeed = speed; -} - -void b2PrismaticJoint::SetMaxMotorForce(float32 force) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_maxMotorForce = force; -} - -float32 b2PrismaticJoint::GetMotorForce() const -{ - return m_motorImpulse; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.h deleted file mode 100644 index 9b2996349..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PrismaticJoint.h +++ /dev/null @@ -1,176 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_PRISMATIC_JOINT_H -#define B2_PRISMATIC_JOINT_H - -#include - -/// Prismatic joint definition. This requires defining a line of -/// motion using an axis and an anchor point. The definition uses local -/// anchor points and a local axis so that the initial configuration -/// can violate the constraint slightly. The joint translation is zero -/// when the local anchor points coincide in world space. Using local -/// anchors and a local axis helps when saving and loading a game. -/// @warning at least one body should by dynamic with a non-fixed rotation. -struct b2PrismaticJointDef : public b2JointDef -{ - b2PrismaticJointDef() - { - type = e_prismaticJoint; - localAnchorA.SetZero(); - localAnchorB.SetZero(); - localAxis1.Set(1.0f, 0.0f); - referenceAngle = 0.0f; - enableLimit = false; - lowerTranslation = 0.0f; - upperTranslation = 0.0f; - enableMotor = false; - maxMotorForce = 0.0f; - motorSpeed = 0.0f; - } - - /// Initialize the bodies, anchors, axis, and reference angle using the world - /// anchor and world axis. - void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The local translation axis in body1. - b2Vec2 localAxis1; - - /// The constrained angle between the bodies: body2_angle - body1_angle. - float32 referenceAngle; - - /// Enable/disable the joint limit. - bool enableLimit; - - /// The lower translation limit, usually in meters. - float32 lowerTranslation; - - /// The upper translation limit, usually in meters. - float32 upperTranslation; - - /// Enable/disable the joint motor. - bool enableMotor; - - /// The maximum motor torque, usually in N-m. - float32 maxMotorForce; - - /// The desired motor speed in radians per second. - float32 motorSpeed; -}; - -/// A prismatic joint. This joint provides one degree of freedom: translation -/// along an axis fixed in body1. Relative rotation is prevented. You can -/// use a joint limit to restrict the range of motion and a joint motor to -/// drive the motion or to model joint friction. -class b2PrismaticJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Get the current joint translation, usually in meters. - float32 GetJointTranslation() const; - - /// Get the current joint translation speed, usually in meters per second. - float32 GetJointSpeed() const; - - /// Is the joint limit enabled? - bool IsLimitEnabled() const; - - /// Enable/disable the joint limit. - void EnableLimit(bool flag); - - /// Get the lower joint limit, usually in meters. - float32 GetLowerLimit() const; - - /// Get the upper joint limit, usually in meters. - float32 GetUpperLimit() const; - - /// Set the joint limits, usually in meters. - void SetLimits(float32 lower, float32 upper); - - /// Is the joint motor enabled? - bool IsMotorEnabled() const; - - /// Enable/disable the joint motor. - void EnableMotor(bool flag); - - /// Set the motor speed, usually in meters per second. - void SetMotorSpeed(float32 speed); - - /// Get the motor speed, usually in meters per second. - float32 GetMotorSpeed() const; - - /// Set the maximum motor force, usually in N. - void SetMaxMotorForce(float32 force); - - /// Get the current motor force, usually in N. - float32 GetMotorForce() const; - -protected: - friend class b2Joint; - friend class b2GearJoint; - b2PrismaticJoint(const b2PrismaticJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - b2Vec2 m_localXAxis1; - b2Vec2 m_localYAxis1; - float32 m_refAngle; - - b2Vec2 m_axis, m_perp; - float32 m_s1, m_s2; - float32 m_a1, m_a2; - - b2Mat33 m_K; - b2Vec3 m_impulse; - - float32 m_motorMass; // effective mass for motor/limit translational constraint. - float32 m_motorImpulse; - - float32 m_lowerTranslation; - float32 m_upperTranslation; - float32 m_maxMotorForce; - float32 m_motorSpeed; - - bool m_enableLimit; - bool m_enableMotor; - b2LimitState m_limitState; -}; - -inline float32 b2PrismaticJoint::GetMotorSpeed() const -{ - return m_motorSpeed; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.cpp deleted file mode 100644 index f8a5fd6ad..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* -* Copyright (c) 2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Pulley: -// length1 = norm(p1 - s1) -// length2 = norm(p2 - s2) -// C0 = (length1 + ratio * length2)_initial -// C = C0 - (length1 + ratio * length2) >= 0 -// u1 = (p1 - s1) / norm(p1 - s1) -// u2 = (p2 - s2) / norm(p2 - s2) -// Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) -// J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] -// K = J * invM * JT -// = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2) -// -// Limit: -// C = maxLength - length -// u = (p - s) / norm(p - s) -// Cdot = -dot(u, v + cross(w, r)) -// K = invMass + invI * cross(r, u)^2 -// 0 <= impulse - -void b2PulleyJointDef::Initialize(b2Body* b1, b2Body* b2, - const b2Vec2& ga1, const b2Vec2& ga2, - const b2Vec2& anchor1, const b2Vec2& anchor2, - float32 r) -{ - bodyA = b1; - bodyB = b2; - groundAnchorA = ga1; - groundAnchorB = ga2; - localAnchorA = bodyA->GetLocalPoint(anchor1); - localAnchorB = bodyB->GetLocalPoint(anchor2); - b2Vec2 d1 = anchor1 - ga1; - lengthA = d1.Length(); - b2Vec2 d2 = anchor2 - ga2; - lengthB = d2.Length(); - ratio = r; - b2Assert(ratio > b2_epsilon); - float32 C = lengthA + ratio * lengthB; - maxLengthA = C - ratio * b2_minPulleyLength; - maxLengthB = (C - b2_minPulleyLength) / ratio; -} - -b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) -: b2Joint(def) -{ - m_groundAnchor1 = def->groundAnchorA; - m_groundAnchor2 = def->groundAnchorB; - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - - b2Assert(def->ratio != 0.0f); - m_ratio = def->ratio; - - m_constant = def->lengthA + m_ratio * def->lengthB; - - m_maxLength1 = b2Min(def->maxLengthA, m_constant - m_ratio * b2_minPulleyLength); - m_maxLength2 = b2Min(def->maxLengthB, (m_constant - b2_minPulleyLength) / m_ratio); - - m_impulse = 0.0f; - m_limitImpulse1 = 0.0f; - m_limitImpulse2 = 0.0f; -} - -void b2PulleyJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - - b2Vec2 s1 = m_groundAnchor1; - b2Vec2 s2 = m_groundAnchor2; - - // Get the pulley axes. - m_u1 = p1 - s1; - m_u2 = p2 - s2; - - float32 length1 = m_u1.Length(); - float32 length2 = m_u2.Length(); - - if (length1 > b2_linearSlop) - { - m_u1 *= 1.0f / length1; - } - else - { - m_u1.SetZero(); - } - - if (length2 > b2_linearSlop) - { - m_u2 *= 1.0f / length2; - } - else - { - m_u2.SetZero(); - } - - float32 C = m_constant - length1 - m_ratio * length2; - if (C > 0.0f) - { - m_state = e_inactiveLimit; - m_impulse = 0.0f; - } - else - { - m_state = e_atUpperLimit; - } - - if (length1 < m_maxLength1) - { - m_limitState1 = e_inactiveLimit; - m_limitImpulse1 = 0.0f; - } - else - { - m_limitState1 = e_atUpperLimit; - } - - if (length2 < m_maxLength2) - { - m_limitState2 = e_inactiveLimit; - m_limitImpulse2 = 0.0f; - } - else - { - m_limitState2 = e_atUpperLimit; - } - - // Compute effective mass. - float32 cr1u1 = b2Cross(r1, m_u1); - float32 cr2u2 = b2Cross(r2, m_u2); - - m_limitMass1 = b1->m_invMass + b1->m_invI * cr1u1 * cr1u1; - m_limitMass2 = b2->m_invMass + b2->m_invI * cr2u2 * cr2u2; - m_pulleyMass = m_limitMass1 + m_ratio * m_ratio * m_limitMass2; - b2Assert(m_limitMass1 > b2_epsilon); - b2Assert(m_limitMass2 > b2_epsilon); - b2Assert(m_pulleyMass > b2_epsilon); - m_limitMass1 = 1.0f / m_limitMass1; - m_limitMass2 = 1.0f / m_limitMass2; - m_pulleyMass = 1.0f / m_pulleyMass; - - if (step.warmStarting) - { - // Scale impulses to support variable time steps. - m_impulse *= step.dtRatio; - m_limitImpulse1 *= step.dtRatio; - m_limitImpulse2 *= step.dtRatio; - - // Warm starting. - b2Vec2 P1 = -(m_impulse + m_limitImpulse1) * m_u1; - b2Vec2 P2 = (-m_ratio * m_impulse - m_limitImpulse2) * m_u2; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); - } - else - { - m_impulse = 0.0f; - m_limitImpulse1 = 0.0f; - m_limitImpulse2 = 0.0f; - } -} - -void b2PulleyJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - B2_NOT_USED(step); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - if (m_state == e_atUpperLimit) - { - b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); - - float32 Cdot = -b2Dot(m_u1, v1) - m_ratio * b2Dot(m_u2, v2); - float32 impulse = m_pulleyMass * (-Cdot); - float32 oldImpulse = m_impulse; - m_impulse = b2Max(0.0f, m_impulse + impulse); - impulse = m_impulse - oldImpulse; - - b2Vec2 P1 = -impulse * m_u1; - b2Vec2 P2 = -m_ratio * impulse * m_u2; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); - } - - if (m_limitState1 == e_atUpperLimit) - { - b2Vec2 v1 = b1->m_linearVelocity + b2Cross(b1->m_angularVelocity, r1); - - float32 Cdot = -b2Dot(m_u1, v1); - float32 impulse = -m_limitMass1 * Cdot; - float32 oldImpulse = m_limitImpulse1; - m_limitImpulse1 = b2Max(0.0f, m_limitImpulse1 + impulse); - impulse = m_limitImpulse1 - oldImpulse; - - b2Vec2 P1 = -impulse * m_u1; - b1->m_linearVelocity += b1->m_invMass * P1; - b1->m_angularVelocity += b1->m_invI * b2Cross(r1, P1); - } - - if (m_limitState2 == e_atUpperLimit) - { - b2Vec2 v2 = b2->m_linearVelocity + b2Cross(b2->m_angularVelocity, r2); - - float32 Cdot = -b2Dot(m_u2, v2); - float32 impulse = -m_limitMass2 * Cdot; - float32 oldImpulse = m_limitImpulse2; - m_limitImpulse2 = b2Max(0.0f, m_limitImpulse2 + impulse); - impulse = m_limitImpulse2 - oldImpulse; - - b2Vec2 P2 = -impulse * m_u2; - b2->m_linearVelocity += b2->m_invMass * P2; - b2->m_angularVelocity += b2->m_invI * b2Cross(r2, P2); - } -} - -bool b2PulleyJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 s1 = m_groundAnchor1; - b2Vec2 s2 = m_groundAnchor2; - - float32 linearError = 0.0f; - - if (m_state == e_atUpperLimit) - { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 p1 = b1->m_sweep.c + r1; - b2Vec2 p2 = b2->m_sweep.c + r2; - - // Get the pulley axes. - m_u1 = p1 - s1; - m_u2 = p2 - s2; - - float32 length1 = m_u1.Length(); - float32 length2 = m_u2.Length(); - - if (length1 > b2_linearSlop) - { - m_u1 *= 1.0f / length1; - } - else - { - m_u1.SetZero(); - } - - if (length2 > b2_linearSlop) - { - m_u2 *= 1.0f / length2; - } - else - { - m_u2.SetZero(); - } - - float32 C = m_constant - length1 - m_ratio * length2; - linearError = b2Max(linearError, -C); - - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_pulleyMass * C; - - b2Vec2 P1 = -impulse * m_u1; - b2Vec2 P2 = -m_ratio * impulse * m_u2; - - b1->m_sweep.c += b1->m_invMass * P1; - b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); - b2->m_sweep.c += b2->m_invMass * P2; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - } - - if (m_limitState1 == e_atUpperLimit) - { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 p1 = b1->m_sweep.c + r1; - - m_u1 = p1 - s1; - float32 length1 = m_u1.Length(); - - if (length1 > b2_linearSlop) - { - m_u1 *= 1.0f / length1; - } - else - { - m_u1.SetZero(); - } - - float32 C = m_maxLength1 - length1; - linearError = b2Max(linearError, -C); - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_limitMass1 * C; - - b2Vec2 P1 = -impulse * m_u1; - b1->m_sweep.c += b1->m_invMass * P1; - b1->m_sweep.a += b1->m_invI * b2Cross(r1, P1); - - b1->SynchronizeTransform(); - } - - if (m_limitState2 == e_atUpperLimit) - { - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - b2Vec2 p2 = b2->m_sweep.c + r2; - - m_u2 = p2 - s2; - float32 length2 = m_u2.Length(); - - if (length2 > b2_linearSlop) - { - m_u2 *= 1.0f / length2; - } - else - { - m_u2.SetZero(); - } - - float32 C = m_maxLength2 - length2; - linearError = b2Max(linearError, -C); - C = b2Clamp(C + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); - float32 impulse = -m_limitMass2 * C; - - b2Vec2 P2 = -impulse * m_u2; - b2->m_sweep.c += b2->m_invMass * P2; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, P2); - - b2->SynchronizeTransform(); - } - - return linearError < b2_linearSlop; -} - -b2Vec2 b2PulleyJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2PulleyJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const -{ - b2Vec2 P = m_impulse * m_u2; - return inv_dt * P; -} - -float32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const -{ - B2_NOT_USED(inv_dt); - return 0.0f; -} - -b2Vec2 b2PulleyJoint::GetGroundAnchorA() const -{ - return m_groundAnchor1; -} - -b2Vec2 b2PulleyJoint::GetGroundAnchorB() const -{ - return m_groundAnchor2; -} - -float32 b2PulleyJoint::GetLength1() const -{ - b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchor1); - b2Vec2 s = m_groundAnchor1; - b2Vec2 d = p - s; - return d.Length(); -} - -float32 b2PulleyJoint::GetLength2() const -{ - b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchor2); - b2Vec2 s = m_groundAnchor2; - b2Vec2 d = p - s; - return d.Length(); -} - -float32 b2PulleyJoint::GetRatio() const -{ - return m_ratio; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.h deleted file mode 100644 index 326ee3502..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2PulleyJoint.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_PULLEY_JOINT_H -#define B2_PULLEY_JOINT_H - -#include - -const float32 b2_minPulleyLength = 2.0f; - -/// Pulley joint definition. This requires two ground anchors, -/// two dynamic body anchor points, max lengths for each side, -/// and a pulley ratio. -struct b2PulleyJointDef : public b2JointDef -{ - b2PulleyJointDef() - { - type = e_pulleyJoint; - groundAnchorA.Set(-1.0f, 1.0f); - groundAnchorB.Set(1.0f, 1.0f); - localAnchorA.Set(-1.0f, 0.0f); - localAnchorB.Set(1.0f, 0.0f); - lengthA = 0.0f; - maxLengthA = 0.0f; - lengthB = 0.0f; - maxLengthB = 0.0f; - ratio = 1.0f; - collideConnected = true; - } - - /// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. - void Initialize(b2Body* bodyA, b2Body* bodyB, - const b2Vec2& groundAnchorA, const b2Vec2& groundAnchorB, - const b2Vec2& anchorA, const b2Vec2& anchorB, - float32 ratio); - - /// The first ground anchor in world coordinates. This point never moves. - b2Vec2 groundAnchorA; - - /// The second ground anchor in world coordinates. This point never moves. - b2Vec2 groundAnchorB; - - /// The local anchor point relative to bodyA's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to bodyB's origin. - b2Vec2 localAnchorB; - - /// The a reference length for the segment attached to bodyA. - float32 lengthA; - - /// The maximum length of the segment attached to bodyA. - float32 maxLengthA; - - /// The a reference length for the segment attached to bodyB. - float32 lengthB; - - /// The maximum length of the segment attached to bodyB. - float32 maxLengthB; - - /// The pulley ratio, used to simulate a block-and-tackle. - float32 ratio; -}; - -/// The pulley joint is connected to two bodies and two fixed ground points. -/// The pulley supports a ratio such that: -/// length1 + ratio * length2 <= constant -/// Yes, the force transmitted is scaled by the ratio. -/// The pulley also enforces a maximum length limit on both sides. This is -/// useful to prevent one side of the pulley hitting the top. -class b2PulleyJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Get the first ground anchor. - b2Vec2 GetGroundAnchorA() const; - - /// Get the second ground anchor. - b2Vec2 GetGroundAnchorB() const; - - /// Get the current length of the segment attached to body1. - float32 GetLength1() const; - - /// Get the current length of the segment attached to body2. - float32 GetLength2() const; - - /// Get the pulley ratio. - float32 GetRatio() const; - -protected: - - friend class b2Joint; - b2PulleyJoint(const b2PulleyJointDef* data); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_groundAnchor1; - b2Vec2 m_groundAnchor2; - b2Vec2 m_localAnchor1; - b2Vec2 m_localAnchor2; - - b2Vec2 m_u1; - b2Vec2 m_u2; - - float32 m_constant; - float32 m_ratio; - - float32 m_maxLength1; - float32 m_maxLength2; - - // Effective masses - float32 m_pulleyMass; - float32 m_limitMass1; - float32 m_limitMass2; - - // Impulses for accumulation/warm starting. - float32 m_impulse; - float32 m_limitImpulse1; - float32 m_limitImpulse2; - - b2LimitState m_state; - b2LimitState m_limitState1; - b2LimitState m_limitState2; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp deleted file mode 100644 index b7096ab2b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp +++ /dev/null @@ -1,479 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Point-to-point constraint -// C = p2 - p1 -// Cdot = v2 - v1 -// = v2 + cross(w2, r2) - v1 - cross(w1, r1) -// J = [-I -r1_skew I r2_skew ] -// Identity used: -// w k % (rx i + ry j) = w * (-ry i + rx j) - -// Motor constraint -// Cdot = w2 - w1 -// J = [0 0 -1 0 0 1] -// K = invI1 + invI2 - -void b2RevoluteJointDef::Initialize(b2Body* b1, b2Body* b2, const b2Vec2& anchor) -{ - bodyA = b1; - bodyB = b2; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); - referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); -} - -b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) -: b2Joint(def) -{ - m_localAnchor1 = def->localAnchorA; - m_localAnchor2 = def->localAnchorB; - m_referenceAngle = def->referenceAngle; - - m_impulse.SetZero(); - m_motorImpulse = 0.0f; - - m_lowerAngle = def->lowerAngle; - m_upperAngle = def->upperAngle; - m_maxMotorTorque = def->maxMotorTorque; - m_motorSpeed = def->motorSpeed; - m_enableLimit = def->enableLimit; - m_enableMotor = def->enableMotor; - m_limitState = e_inactiveLimit; -} - -void b2RevoluteJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - if (m_enableMotor || m_enableLimit) - { - // You cannot create a rotation limit between bodies that - // both have fixed rotation. - b2Assert(b1->m_invI > 0.0f || b2->m_invI > 0.0f); - } - - // Compute the effective mass matrix. - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - - // Matlab - // K = [ m1+r1y^2*i1+m2+r2y^2*i2, -r1y*i1*r1x-r2y*i2*r2x, -r1y*i1-r2y*i2] - // [ -r1y*i1*r1x-r2y*i2*r2x, m1+r1x^2*i1+m2+r2x^2*i2, r1x*i1+r2x*i2] - // [ -r1y*i1-r2y*i2, r1x*i1+r2x*i2, i1+i2] - - float32 m1 = b1->m_invMass, m2 = b2->m_invMass; - float32 i1 = b1->m_invI, i2 = b2->m_invI; - - m_mass.col1.x = m1 + m2 + r1.y * r1.y * i1 + r2.y * r2.y * i2; - m_mass.col2.x = -r1.y * r1.x * i1 - r2.y * r2.x * i2; - m_mass.col3.x = -r1.y * i1 - r2.y * i2; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = m1 + m2 + r1.x * r1.x * i1 + r2.x * r2.x * i2; - m_mass.col3.y = r1.x * i1 + r2.x * i2; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = i1 + i2; - - m_motorMass = i1 + i2; - if (m_motorMass > 0.0f) - { - m_motorMass = 1.0f / m_motorMass; - } - - if (m_enableMotor == false) - { - m_motorImpulse = 0.0f; - } - - if (m_enableLimit) - { - float32 jointAngle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; - if (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop) - { - m_limitState = e_equalLimits; - } - else if (jointAngle <= m_lowerAngle) - { - if (m_limitState != e_atLowerLimit) - { - m_impulse.z = 0.0f; - } - m_limitState = e_atLowerLimit; - } - else if (jointAngle >= m_upperAngle) - { - if (m_limitState != e_atUpperLimit) - { - m_impulse.z = 0.0f; - } - m_limitState = e_atUpperLimit; - } - else - { - m_limitState = e_inactiveLimit; - m_impulse.z = 0.0f; - } - } - else - { - m_limitState = e_inactiveLimit; - } - - if (step.warmStarting) - { - // Scale impulses to support a variable time step. - m_impulse *= step.dtRatio; - m_motorImpulse *= step.dtRatio; - - b2Vec2 P(m_impulse.x, m_impulse.y); - - b1->m_linearVelocity -= m1 * P; - b1->m_angularVelocity -= i1 * (b2Cross(r1, P) + m_motorImpulse + m_impulse.z); - - b2->m_linearVelocity += m2 * P; - b2->m_angularVelocity += i2 * (b2Cross(r2, P) + m_motorImpulse + m_impulse.z); - } - else - { - m_impulse.SetZero(); - m_motorImpulse = 0.0f; - } -} - -void b2RevoluteJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - b2Vec2 v1 = b1->m_linearVelocity; - float32 w1 = b1->m_angularVelocity; - b2Vec2 v2 = b2->m_linearVelocity; - float32 w2 = b2->m_angularVelocity; - - float32 m1 = b1->m_invMass, m2 = b2->m_invMass; - float32 i1 = b1->m_invI, i2 = b2->m_invI; - - // Solve motor constraint. - if (m_enableMotor && m_limitState != e_equalLimits) - { - float32 Cdot = w2 - w1 - m_motorSpeed; - float32 impulse = m_motorMass * (-Cdot); - float32 oldImpulse = m_motorImpulse; - float32 maxImpulse = step.dt * m_maxMotorTorque; - m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = m_motorImpulse - oldImpulse; - - w1 -= i1 * impulse; - w2 += i2 * impulse; - } - - // Solve limit constraint. - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 Cdot1 = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); - float32 Cdot2 = w2 - w1; - b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); - - b2Vec3 impulse = m_mass.Solve33(-Cdot); - - if (m_limitState == e_equalLimits) - { - m_impulse += impulse; - } - else if (m_limitState == e_atLowerLimit) - { - float32 newImpulse = m_impulse.z + impulse.z; - if (newImpulse < 0.0f) - { - b2Vec2 reduced = m_mass.Solve22(-Cdot1); - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -m_impulse.z; - m_impulse.x += reduced.x; - m_impulse.y += reduced.y; - m_impulse.z = 0.0f; - } - } - else if (m_limitState == e_atUpperLimit) - { - float32 newImpulse = m_impulse.z + impulse.z; - if (newImpulse > 0.0f) - { - b2Vec2 reduced = m_mass.Solve22(-Cdot1); - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -m_impulse.z; - m_impulse.x += reduced.x; - m_impulse.y += reduced.y; - m_impulse.z = 0.0f; - } - } - - b2Vec2 P(impulse.x, impulse.y); - - v1 -= m1 * P; - w1 -= i1 * (b2Cross(r1, P) + impulse.z); - - v2 += m2 * P; - w2 += i2 * (b2Cross(r2, P) + impulse.z); - } - else - { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 Cdot = v2 + b2Cross(w2, r2) - v1 - b2Cross(w1, r1); - b2Vec2 impulse = m_mass.Solve22(-Cdot); - - m_impulse.x += impulse.x; - m_impulse.y += impulse.y; - - v1 -= m1 * impulse; - w1 -= i1 * b2Cross(r1, impulse); - - v2 += m2 * impulse; - w2 += i2 * b2Cross(r2, impulse); - } - - b1->m_linearVelocity = v1; - b1->m_angularVelocity = w1; - b2->m_linearVelocity = v2; - b2->m_angularVelocity = w2; -} - -bool b2RevoluteJoint::SolvePositionConstraints(float32 baumgarte) -{ - // TODO_ERIN block solve with limit. - - B2_NOT_USED(baumgarte); - - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - - float32 angularError = 0.0f; - float32 positionError = 0.0f; - - // Solve angular limit constraint. - if (m_enableLimit && m_limitState != e_inactiveLimit) - { - float32 angle = b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; - float32 limitImpulse = 0.0f; - - if (m_limitState == e_equalLimits) - { - // Prevent large angular corrections - float32 C = b2Clamp(angle - m_lowerAngle, -b2_maxAngularCorrection, b2_maxAngularCorrection); - limitImpulse = -m_motorMass * C; - angularError = b2Abs(C); - } - else if (m_limitState == e_atLowerLimit) - { - float32 C = angle - m_lowerAngle; - angularError = -C; - - // Prevent large angular corrections and allow some slop. - C = b2Clamp(C + b2_angularSlop, -b2_maxAngularCorrection, 0.0f); - limitImpulse = -m_motorMass * C; - } - else if (m_limitState == e_atUpperLimit) - { - float32 C = angle - m_upperAngle; - angularError = C; - - // Prevent large angular corrections and allow some slop. - C = b2Clamp(C - b2_angularSlop, 0.0f, b2_maxAngularCorrection); - limitImpulse = -m_motorMass * C; - } - - b1->m_sweep.a -= b1->m_invI * limitImpulse; - b2->m_sweep.a += b2->m_invI * limitImpulse; - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - } - - // Solve point-to-point constraint. - { - b2Vec2 r1 = b2Mul(b1->GetTransform().R, m_localAnchor1 - b1->GetLocalCenter()); - b2Vec2 r2 = b2Mul(b2->GetTransform().R, m_localAnchor2 - b2->GetLocalCenter()); - - b2Vec2 C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - positionError = C.Length(); - - float32 invMass1 = b1->m_invMass, invMass2 = b2->m_invMass; - float32 invI1 = b1->m_invI, invI2 = b2->m_invI; - - // Handle large detachment. - const float32 k_allowedStretch = 10.0f * b2_linearSlop; - if (C.LengthSquared() > k_allowedStretch * k_allowedStretch) - { - // Use a particle solution (no rotation). - b2Vec2 u = C; u.Normalize(); - float32 m = invMass1 + invMass2; - if (m > 0.0f) - { - m = 1.0f / m; - } - b2Vec2 impulse = m * (-C); - const float32 k_beta = 0.5f; - b1->m_sweep.c -= k_beta * invMass1 * impulse; - b2->m_sweep.c += k_beta * invMass2 * impulse; - - C = b2->m_sweep.c + r2 - b1->m_sweep.c - r1; - } - - b2Mat22 K1; - K1.col1.x = invMass1 + invMass2; K1.col2.x = 0.0f; - K1.col1.y = 0.0f; K1.col2.y = invMass1 + invMass2; - - b2Mat22 K2; - K2.col1.x = invI1 * r1.y * r1.y; K2.col2.x = -invI1 * r1.x * r1.y; - K2.col1.y = -invI1 * r1.x * r1.y; K2.col2.y = invI1 * r1.x * r1.x; - - b2Mat22 K3; - K3.col1.x = invI2 * r2.y * r2.y; K3.col2.x = -invI2 * r2.x * r2.y; - K3.col1.y = -invI2 * r2.x * r2.y; K3.col2.y = invI2 * r2.x * r2.x; - - b2Mat22 K = K1 + K2 + K3; - b2Vec2 impulse = K.Solve(-C); - - b1->m_sweep.c -= b1->m_invMass * impulse; - b1->m_sweep.a -= b1->m_invI * b2Cross(r1, impulse); - - b2->m_sweep.c += b2->m_invMass * impulse; - b2->m_sweep.a += b2->m_invI * b2Cross(r2, impulse); - - b1->SynchronizeTransform(); - b2->SynchronizeTransform(); - } - - return positionError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2RevoluteJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchor1); -} - -b2Vec2 b2RevoluteJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchor2); -} - -b2Vec2 b2RevoluteJoint::GetReactionForce(float32 inv_dt) const -{ - b2Vec2 P(m_impulse.x, m_impulse.y); - return inv_dt * P; -} - -float32 b2RevoluteJoint::GetReactionTorque(float32 inv_dt) const -{ - return inv_dt * m_impulse.z; -} - -float32 b2RevoluteJoint::GetJointAngle() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - return b2->m_sweep.a - b1->m_sweep.a - m_referenceAngle; -} - -float32 b2RevoluteJoint::GetJointSpeed() const -{ - b2Body* b1 = m_bodyA; - b2Body* b2 = m_bodyB; - return b2->m_angularVelocity - b1->m_angularVelocity; -} - -bool b2RevoluteJoint::IsMotorEnabled() const -{ - return m_enableMotor; -} - -void b2RevoluteJoint::EnableMotor(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableMotor = flag; -} - -float32 b2RevoluteJoint::GetMotorTorque() const -{ - return m_motorImpulse; -} - -void b2RevoluteJoint::SetMotorSpeed(float32 speed) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_motorSpeed = speed; -} - -void b2RevoluteJoint::SetMaxMotorTorque(float32 torque) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_maxMotorTorque = torque; -} - -bool b2RevoluteJoint::IsLimitEnabled() const -{ - return m_enableLimit; -} - -void b2RevoluteJoint::EnableLimit(bool flag) -{ - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_enableLimit = flag; -} - -float32 b2RevoluteJoint::GetLowerLimit() const -{ - return m_lowerAngle; -} - -float32 b2RevoluteJoint::GetUpperLimit() const -{ - return m_upperAngle; -} - -void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) -{ - b2Assert(lower <= upper); - m_bodyA->SetAwake(true); - m_bodyB->SetAwake(true); - m_lowerAngle = lower; - m_upperAngle = upper; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.h deleted file mode 100644 index 10e36f131..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2RevoluteJoint.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_REVOLUTE_JOINT_H -#define B2_REVOLUTE_JOINT_H - -#include - -/// Revolute joint definition. This requires defining an -/// anchor point where the bodies are joined. The definition -/// uses local anchor points so that the initial configuration -/// can violate the constraint slightly. You also need to -/// specify the initial relative angle for joint limits. This -/// helps when saving and loading a game. -/// The local anchor points are measured from the body's origin -/// rather than the center of mass because: -/// 1. you might not know where the center of mass will be. -/// 2. if you add/remove shapes from a body and recompute the mass, -/// the joints will be broken. -struct b2RevoluteJointDef : public b2JointDef -{ - b2RevoluteJointDef() - { - type = e_revoluteJoint; - localAnchorA.Set(0.0f, 0.0f); - localAnchorB.Set(0.0f, 0.0f); - referenceAngle = 0.0f; - lowerAngle = 0.0f; - upperAngle = 0.0f; - maxMotorTorque = 0.0f; - motorSpeed = 0.0f; - enableLimit = false; - enableMotor = false; - } - - /// Initialize the bodies, anchors, and reference angle using a world - /// anchor point. - void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The body2 angle minus body1 angle in the reference state (radians). - float32 referenceAngle; - - /// A flag to enable joint limits. - bool enableLimit; - - /// The lower angle for the joint limit (radians). - float32 lowerAngle; - - /// The upper angle for the joint limit (radians). - float32 upperAngle; - - /// A flag to enable the joint motor. - bool enableMotor; - - /// The desired motor speed. Usually in radians per second. - float32 motorSpeed; - - /// The maximum motor torque used to achieve the desired motor speed. - /// Usually in N-m. - float32 maxMotorTorque; -}; - -/// A revolute joint constrains two bodies to share a common point while they -/// are free to rotate about the point. The relative rotation about the shared -/// point is the joint angle. You can limit the relative rotation with -/// a joint limit that specifies a lower and upper angle. You can use a motor -/// to drive the relative rotation about the shared point. A maximum motor torque -/// is provided so that infinite forces are not generated. -class b2RevoluteJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - - /// Get the current joint angle in radians. - float32 GetJointAngle() const; - - /// Get the current joint angle speed in radians per second. - float32 GetJointSpeed() const; - - /// Is the joint limit enabled? - bool IsLimitEnabled() const; - - /// Enable/disable the joint limit. - void EnableLimit(bool flag); - - /// Get the lower joint limit in radians. - float32 GetLowerLimit() const; - - /// Get the upper joint limit in radians. - float32 GetUpperLimit() const; - - /// Set the joint limits in radians. - void SetLimits(float32 lower, float32 upper); - - /// Is the joint motor enabled? - bool IsMotorEnabled() const; - - /// Enable/disable the joint motor. - void EnableMotor(bool flag); - - /// Set the motor speed in radians per second. - void SetMotorSpeed(float32 speed); - - /// Get the motor speed in radians per second. - float32 GetMotorSpeed() const; - - /// Set the maximum motor torque, usually in N-m. - void SetMaxMotorTorque(float32 torque); - - /// Get the current motor torque, usually in N-m. - float32 GetMotorTorque() const; - -protected: - - friend class b2Joint; - friend class b2GearJoint; - - b2RevoluteJoint(const b2RevoluteJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchor1; // relative - b2Vec2 m_localAnchor2; - b2Vec3 m_impulse; - float32 m_motorImpulse; - - b2Mat33 m_mass; // effective mass for point-to-point constraint. - float32 m_motorMass; // effective mass for motor/limit angular constraint. - - bool m_enableMotor; - float32 m_maxMotorTorque; - float32 m_motorSpeed; - - bool m_enableLimit; - float32 m_referenceAngle; - float32 m_lowerAngle; - float32 m_upperAngle; - b2LimitState m_limitState; -}; - -inline float32 b2RevoluteJoint::GetMotorSpeed() const -{ - return m_motorSpeed; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.cpp deleted file mode 100644 index 2f1abe13e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include - -// Point-to-point constraint -// C = p2 - p1 -// Cdot = v2 - v1 -// = v2 + cross(w2, r2) - v1 - cross(w1, r1) -// J = [-I -r1_skew I r2_skew ] -// Identity used: -// w k % (rx i + ry j) = w * (-ry i + rx j) - -// Angle constraint -// C = angle2 - angle1 - referenceAngle -// Cdot = w2 - w1 -// J = [0 0 -1 0 0 1] -// K = invI1 + invI2 - -void b2WeldJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) -{ - bodyA = bA; - bodyB = bB; - localAnchorA = bodyA->GetLocalPoint(anchor); - localAnchorB = bodyB->GetLocalPoint(anchor); - referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); -} - -b2WeldJoint::b2WeldJoint(const b2WeldJointDef* def) -: b2Joint(def) -{ - m_localAnchorA = def->localAnchorA; - m_localAnchorB = def->localAnchorB; - m_referenceAngle = def->referenceAngle; - - m_impulse.SetZero(); -} - -void b2WeldJoint::InitVelocityConstraints(const b2TimeStep& step) -{ - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; - - // Compute the effective mass matrix. - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - m_mass.col3.x = -rA.y * iA - rB.y * iB; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - m_mass.col3.y = rA.x * iA + rB.x * iB; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = iA + iB; - - if (step.warmStarting) - { - // Scale impulses to support a variable time step. - m_impulse *= step.dtRatio; - - b2Vec2 P(m_impulse.x, m_impulse.y); - - bA->m_linearVelocity -= mA * P; - bA->m_angularVelocity -= iA * (b2Cross(rA, P) + m_impulse.z); - - bB->m_linearVelocity += mB * P; - bB->m_angularVelocity += iB * (b2Cross(rB, P) + m_impulse.z); - } - else - { - m_impulse.SetZero(); - } -} - -void b2WeldJoint::SolveVelocityConstraints(const b2TimeStep& step) -{ - B2_NOT_USED(step); - - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; - - b2Vec2 vA = bA->m_linearVelocity; - float32 wA = bA->m_angularVelocity; - b2Vec2 vB = bB->m_linearVelocity; - float32 wB = bB->m_angularVelocity; - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - // Solve point-to-point constraint - b2Vec2 Cdot1 = vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA); - float32 Cdot2 = wB - wA; - b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); - - b2Vec3 impulse = m_mass.Solve33(-Cdot); - m_impulse += impulse; - - b2Vec2 P(impulse.x, impulse.y); - - vA -= mA * P; - wA -= iA * (b2Cross(rA, P) + impulse.z); - - vB += mB * P; - wB += iB * (b2Cross(rB, P) + impulse.z); - - bA->m_linearVelocity = vA; - bA->m_angularVelocity = wA; - bB->m_linearVelocity = vB; - bB->m_angularVelocity = wB; -} - -bool b2WeldJoint::SolvePositionConstraints(float32 baumgarte) -{ - B2_NOT_USED(baumgarte); - - b2Body* bA = m_bodyA; - b2Body* bB = m_bodyB; - - float32 mA = bA->m_invMass, mB = bB->m_invMass; - float32 iA = bA->m_invI, iB = bB->m_invI; - - b2Vec2 rA = b2Mul(bA->GetTransform().R, m_localAnchorA - bA->GetLocalCenter()); - b2Vec2 rB = b2Mul(bB->GetTransform().R, m_localAnchorB - bB->GetLocalCenter()); - - b2Vec2 C1 = bB->m_sweep.c + rB - bA->m_sweep.c - rA; - float32 C2 = bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; - - // Handle large detachment. - const float32 k_allowedStretch = 10.0f * b2_linearSlop; - float32 positionError = C1.Length(); - float32 angularError = b2Abs(C2); - if (positionError > k_allowedStretch) - { - iA *= 1.0f; - iB *= 1.0f; - } - - m_mass.col1.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - m_mass.col2.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - m_mass.col3.x = -rA.y * iA - rB.y * iB; - m_mass.col1.y = m_mass.col2.x; - m_mass.col2.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - m_mass.col3.y = rA.x * iA + rB.x * iB; - m_mass.col1.z = m_mass.col3.x; - m_mass.col2.z = m_mass.col3.y; - m_mass.col3.z = iA + iB; - - b2Vec3 C(C1.x, C1.y, C2); - - b2Vec3 impulse = m_mass.Solve33(-C); - - b2Vec2 P(impulse.x, impulse.y); - - bA->m_sweep.c -= mA * P; - bA->m_sweep.a -= iA * (b2Cross(rA, P) + impulse.z); - - bB->m_sweep.c += mB * P; - bB->m_sweep.a += iB * (b2Cross(rB, P) + impulse.z); - - bA->SynchronizeTransform(); - bB->SynchronizeTransform(); - - return positionError <= b2_linearSlop && angularError <= b2_angularSlop; -} - -b2Vec2 b2WeldJoint::GetAnchorA() const -{ - return m_bodyA->GetWorldPoint(m_localAnchorA); -} - -b2Vec2 b2WeldJoint::GetAnchorB() const -{ - return m_bodyB->GetWorldPoint(m_localAnchorB); -} - -b2Vec2 b2WeldJoint::GetReactionForce(float32 inv_dt) const -{ - b2Vec2 P(m_impulse.x, m_impulse.y); - return inv_dt * P; -} - -float32 b2WeldJoint::GetReactionTorque(float32 inv_dt) const -{ - return inv_dt * m_impulse.z; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.h deleted file mode 100644 index 04921942b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/b2WeldJoint.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_WELD_JOINT_H -#define B2_WELD_JOINT_H - -#include - -/// Weld joint definition. You need to specify local anchor points -/// where they are attached and the relative body angle. The position -/// of the anchor points is important for computing the reaction torque. -struct b2WeldJointDef : public b2JointDef -{ - b2WeldJointDef() - { - type = e_weldJoint; - localAnchorA.Set(0.0f, 0.0f); - localAnchorB.Set(0.0f, 0.0f); - referenceAngle = 0.0f; - } - - /// Initialize the bodies, anchors, and reference angle using a world - /// anchor point. - void Initialize(b2Body* body1, b2Body* body2, const b2Vec2& anchor); - - /// The local anchor point relative to body1's origin. - b2Vec2 localAnchorA; - - /// The local anchor point relative to body2's origin. - b2Vec2 localAnchorB; - - /// The body2 angle minus body1 angle in the reference state (radians). - float32 referenceAngle; -}; - -/// A weld joint essentially glues two bodies together. A weld joint may -/// distort somewhat because the island constraint solver is approximate. -class b2WeldJoint : public b2Joint -{ -public: - b2Vec2 GetAnchorA() const; - b2Vec2 GetAnchorB() const; - - b2Vec2 GetReactionForce(float32 inv_dt) const; - float32 GetReactionTorque(float32 inv_dt) const; - -protected: - - friend class b2Joint; - - b2WeldJoint(const b2WeldJointDef* def); - - void InitVelocityConstraints(const b2TimeStep& step); - void SolveVelocityConstraints(const b2TimeStep& step); - - bool SolvePositionConstraints(float32 baumgarte); - - b2Vec2 m_localAnchorA; - b2Vec2 m_localAnchorB; - float32 m_referenceAngle; - - b2Vec3 m_impulse; - - b2Mat33 m_mass; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.cpp deleted file mode 100644 index 44cb72149..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.cpp +++ /dev/null @@ -1,473 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -b2Body::b2Body(const b2BodyDef* bd, b2World* world) -{ - b2Assert(bd->position.IsValid()); - b2Assert(bd->linearVelocity.IsValid()); - b2Assert(b2IsValid(bd->angle)); - b2Assert(b2IsValid(bd->angularVelocity)); - b2Assert(b2IsValid(bd->inertiaScale) && bd->inertiaScale >= 0.0f); - b2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f); - b2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f); - - m_flags = 0; - - if (bd->bullet) - { - m_flags |= e_bulletFlag; - } - if (bd->fixedRotation) - { - m_flags |= e_fixedRotationFlag; - } - if (bd->allowSleep) - { - m_flags |= e_autoSleepFlag; - } - if (bd->awake) - { - m_flags |= e_awakeFlag; - } - if (bd->active) - { - m_flags |= e_activeFlag; - } - - m_world = world; - - m_xf.position = bd->position; - m_xf.R.Set(bd->angle); - - m_sweep.localCenter.SetZero(); - m_sweep.a0 = m_sweep.a = bd->angle; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - m_jointList = NULL; - m_contactList = NULL; - m_prev = NULL; - m_next = NULL; - - m_linearVelocity = bd->linearVelocity; - m_angularVelocity = bd->angularVelocity; - - m_linearDamping = bd->linearDamping; - m_angularDamping = bd->angularDamping; - - m_force.SetZero(); - m_torque = 0.0f; - - m_sleepTime = 0.0f; - - m_type = bd->type; - - if (m_type == b2_dynamicBody) - { - m_mass = 1.0f; - m_invMass = 1.0f; - } - else - { - m_mass = 0.0f; - m_invMass = 0.0f; - } - - m_I = 0.0f; - m_invI = 0.0f; - - m_userData = bd->userData; - - m_fixtureList = NULL; - m_fixtureCount = 0; -} - -b2Body::~b2Body() -{ - // shapes and joints are destroyed in b2World::Destroy -} - -void b2Body::SetType(b2BodyType type) -{ - if (m_type == type) - { - return; - } - - m_type = type; - - ResetMassData(); - - if (m_type == b2_staticBody) - { - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - } - - SetAwake(true); - - m_force.SetZero(); - m_torque = 0.0f; - - // Since the body type changed, we need to flag contacts for filtering. - for (b2ContactEdge* ce = m_contactList; ce; ce = ce->next) - { - ce->contact->FlagForFiltering(); - } -} - -b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def) -{ - b2Assert(m_world->IsLocked() == false); - if (m_world->IsLocked() == true) - { - return NULL; - } - - b2BlockAllocator* allocator = &m_world->m_blockAllocator; - - void* memory = allocator->Allocate(sizeof(b2Fixture)); - b2Fixture* fixture = new (memory) b2Fixture; - fixture->Create(allocator, this, def); - - if (m_flags & e_activeFlag) - { - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - fixture->CreateProxy(broadPhase, m_xf); - } - - fixture->m_next = m_fixtureList; - m_fixtureList = fixture; - ++m_fixtureCount; - - fixture->m_body = this; - - // Adjust mass properties if needed. - if (fixture->m_density > 0.0f) - { - ResetMassData(); - } - - // Let the world know we have a new fixture. This will cause new contacts - // to be created at the beginning of the next time step. - m_world->m_flags |= b2World::e_newFixture; - - return fixture; -} - -b2Fixture* b2Body::CreateFixture(const b2Shape* shape, float32 density) -{ - b2FixtureDef def; - def.shape = shape; - def.density = density; - - return CreateFixture(&def); -} - -void b2Body::DestroyFixture(b2Fixture* fixture) -{ - b2Assert(m_world->IsLocked() == false); - if (m_world->IsLocked() == true) - { - return; - } - - b2Assert(fixture->m_body == this); - - // Remove the fixture from this body's singly linked list. - b2Assert(m_fixtureCount > 0); - b2Fixture** node = &m_fixtureList; - bool found = false; - while (*node != NULL) - { - if (*node == fixture) - { - *node = fixture->m_next; - found = true; - break; - } - - node = &(*node)->m_next; - } - - // You tried to remove a shape that is not attached to this body. - b2Assert(found); - - // Destroy any contacts associated with the fixture. - b2ContactEdge* edge = m_contactList; - while (edge) - { - b2Contact* c = edge->contact; - edge = edge->next; - - b2Fixture* fixtureA = c->GetFixtureA(); - b2Fixture* fixtureB = c->GetFixtureB(); - - if (fixture == fixtureA || fixture == fixtureB) - { - // This destroys the contact and removes it from - // this body's contact list. - m_world->m_contactManager.Destroy(c); - } - } - - b2BlockAllocator* allocator = &m_world->m_blockAllocator; - - if (m_flags & e_activeFlag) - { - b2Assert(fixture->m_proxyId != b2BroadPhase::e_nullProxy); - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - fixture->DestroyProxy(broadPhase); - } - else - { - b2Assert(fixture->m_proxyId == b2BroadPhase::e_nullProxy); - } - - fixture->Destroy(allocator); - fixture->m_body = NULL; - fixture->m_next = NULL; - fixture->~b2Fixture(); - allocator->Free(fixture, sizeof(b2Fixture)); - - --m_fixtureCount; - - // Reset the mass data. - ResetMassData(); -} - -void b2Body::ResetMassData() -{ - // Compute mass data from shapes. Each shape has its own density. - m_mass = 0.0f; - m_invMass = 0.0f; - m_I = 0.0f; - m_invI = 0.0f; - m_sweep.localCenter.SetZero(); - - // Static and kinematic bodies have zero mass. - if (m_type == b2_staticBody || m_type == b2_kinematicBody) - { - m_sweep.c0 = m_sweep.c = m_xf.position; - return; - } - - b2Assert(m_type == b2_dynamicBody); - - // Accumulate mass over all fixtures. - b2Vec2 center = b2Vec2_zero; - for (b2Fixture* f = m_fixtureList; f; f = f->m_next) - { - if (f->m_density == 0.0f) - { - continue; - } - - b2MassData massData; - f->GetMassData(&massData); - m_mass += massData.mass; - center += massData.mass * massData.center; - m_I += massData.I; - } - - // Compute center of mass. - if (m_mass > 0.0f) - { - m_invMass = 1.0f / m_mass; - center *= m_invMass; - } - else - { - // Force all dynamic bodies to have a positive mass. - m_mass = 1.0f; - m_invMass = 1.0f; - } - - if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) - { - // Center the inertia about the center of mass. - m_I -= m_mass * b2Dot(center, center); - b2Assert(m_I > 0.0f); - m_invI = 1.0f / m_I; - - } - else - { - m_I = 0.0f; - m_invI = 0.0f; - } - - // Move center of mass. - b2Vec2 oldCenter = m_sweep.c; - m_sweep.localCenter = center; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - // Update center of mass velocity. - m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); -} - -void b2Body::SetMassData(const b2MassData* massData) -{ - b2Assert(m_world->IsLocked() == false); - if (m_world->IsLocked() == true) - { - return; - } - - if (m_type != b2_dynamicBody) - { - return; - } - - m_invMass = 0.0f; - m_I = 0.0f; - m_invI = 0.0f; - - m_mass = massData->mass; - if (m_mass <= 0.0f) - { - m_mass = 1.0f; - } - - m_invMass = 1.0f / m_mass; - - if (massData->I > 0.0f && (m_flags & b2Body::e_fixedRotationFlag) == 0) - { - m_I = massData->I - m_mass * b2Dot(massData->center, massData->center); - b2Assert(m_I > 0.0f); - m_invI = 1.0f / m_I; - } - - // Move center of mass. - b2Vec2 oldCenter = m_sweep.c; - m_sweep.localCenter = massData->center; - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - - // Update center of mass velocity. - m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); -} - -bool b2Body::ShouldCollide(const b2Body* other) const -{ - // At least one body should be dynamic. - if (m_type != b2_dynamicBody && other->m_type != b2_dynamicBody) - { - return false; - } - - // Does a joint prevent collision? - for (b2JointEdge* jn = m_jointList; jn; jn = jn->next) - { - if (jn->other == other) - { - if (jn->joint->m_collideConnected == false) - { - return false; - } - } - } - - return true; -} - -void b2Body::SetTransform(const b2Vec2& position, float32 angle) -{ - b2Assert(m_world->IsLocked() == false); - if (m_world->IsLocked() == true) - { - return; - } - - m_xf.R.Set(angle); - m_xf.position = position; - - m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); - m_sweep.a0 = m_sweep.a = angle; - - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - for (b2Fixture* f = m_fixtureList; f; f = f->m_next) - { - f->Synchronize(broadPhase, m_xf, m_xf); - } - - m_world->m_contactManager.FindNewContacts(); -} - -void b2Body::SynchronizeFixtures() -{ - b2Transform xf1; - xf1.R.Set(m_sweep.a0); - xf1.position = m_sweep.c0 - b2Mul(xf1.R, m_sweep.localCenter); - - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - for (b2Fixture* f = m_fixtureList; f; f = f->m_next) - { - f->Synchronize(broadPhase, xf1, m_xf); - } -} - -void b2Body::SetActive(bool flag) -{ - if (flag == IsActive()) - { - return; - } - - if (flag) - { - m_flags |= e_activeFlag; - - // Create all proxies. - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - for (b2Fixture* f = m_fixtureList; f; f = f->m_next) - { - f->CreateProxy(broadPhase, m_xf); - } - - // Contacts are created the next time step. - } - else - { - m_flags &= ~e_activeFlag; - - // Destroy all proxies. - b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; - for (b2Fixture* f = m_fixtureList; f; f = f->m_next) - { - f->DestroyProxy(broadPhase); - } - - // Destroy the attached contacts. - b2ContactEdge* ce = m_contactList; - while (ce) - { - b2ContactEdge* ce0 = ce; - ce = ce->next; - m_world->m_contactManager.Destroy(ce0->contact); - } - m_contactList = NULL; - } -} - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.h deleted file mode 100644 index 2107ddb3a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Body.h +++ /dev/null @@ -1,803 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_BODY_H -#define B2_BODY_H - -#include -#include -#include - -class b2Fixture; -class b2Joint; -class b2Contact; -class b2Controller; -class b2World; -struct b2FixtureDef; -struct b2JointEdge; -struct b2ContactEdge; - -/// The body type. -/// static: zero mass, zero velocity, may be manually moved -/// kinematic: zero mass, non-zero velocity set by user, moved by solver -/// dynamic: positive mass, non-zero velocity determined by forces, moved by solver -enum b2BodyType -{ - b2_staticBody = 0, - b2_kinematicBody, - b2_dynamicBody, -}; - -/// A body definition holds all the data needed to construct a rigid body. -/// You can safely re-use body definitions. Shapes are added to a body after construction. -struct b2BodyDef -{ - /// This constructor sets the body definition default values. - b2BodyDef() - { - userData = NULL; - position.Set(0.0f, 0.0f); - angle = 0.0f; - linearVelocity.Set(0.0f, 0.0f); - angularVelocity = 0.0f; - linearDamping = 0.0f; - angularDamping = 0.0f; - allowSleep = true; - awake = true; - fixedRotation = false; - bullet = false; - type = b2_staticBody; - active = true; - inertiaScale = 1.0f; - } - - /// The body type: static, kinematic, or dynamic. - /// Note: if a dynamic body would have zero mass, the mass is set to one. - b2BodyType type; - - /// The world position of the body. Avoid creating bodies at the origin - /// since this can lead to many overlapping shapes. - b2Vec2 position; - - /// The world angle of the body in radians. - float32 angle; - - /// The linear velocity of the body's origin in world co-ordinates. - b2Vec2 linearVelocity; - - /// The angular velocity of the body. - float32 angularVelocity; - - /// Linear damping is use to reduce the linear velocity. The damping parameter - /// can be larger than 1.0f but the damping effect becomes sensitive to the - /// time step when the damping parameter is large. - float32 linearDamping; - - /// Angular damping is use to reduce the angular velocity. The damping parameter - /// can be larger than 1.0f but the damping effect becomes sensitive to the - /// time step when the damping parameter is large. - float32 angularDamping; - - /// Set this flag to false if this body should never fall asleep. Note that - /// this increases CPU usage. - bool allowSleep; - - /// Is this body initially awake or sleeping? - bool awake; - - /// Should this body be prevented from rotating? Useful for characters. - bool fixedRotation; - - /// Is this a fast moving body that should be prevented from tunneling through - /// other moving bodies? Note that all bodies are prevented from tunneling through - /// kinematic and static bodies. This setting is only considered on dynamic bodies. - /// @warning You should use this flag sparingly since it increases processing time. - bool bullet; - - /// Does this body start out active? - bool active; - - /// Use this to store application specific body data. - void* userData; - - /// Experimental: scales the inertia tensor. - float32 inertiaScale; -}; - -/// A rigid body. These are created via b2World::CreateBody. -class b2Body -{ -public: - /// Creates a fixture and attach it to this body. Use this function if you need - /// to set some fixture parameters, like friction. Otherwise you can create the - /// fixture directly from a shape. - /// If the density is non-zero, this function automatically updates the mass of the body. - /// Contacts are not created until the next time step. - /// @param def the fixture definition. - /// @warning This function is locked during callbacks. - b2Fixture* CreateFixture(const b2FixtureDef* def); - - /// Creates a fixture from a shape and attach it to this body. - /// This is a convenience function. Use b2FixtureDef if you need to set parameters - /// like friction, restitution, user data, or filtering. - /// If the density is non-zero, this function automatically updates the mass of the body. - /// @param shape the shape to be cloned. - /// @param density the shape density (set to zero for static bodies). - /// @warning This function is locked during callbacks. - b2Fixture* CreateFixture(const b2Shape* shape, float32 density); - - /// Destroy a fixture. This removes the fixture from the broad-phase and - /// destroys all contacts associated with this fixture. This will - /// automatically adjust the mass of the body if the body is dynamic and the - /// fixture has positive density. - /// All fixtures attached to a body are implicitly destroyed when the body is destroyed. - /// @param fixture the fixture to be removed. - /// @warning This function is locked during callbacks. - void DestroyFixture(b2Fixture* fixture); - - /// Set the position of the body's origin and rotation. - /// This breaks any contacts and wakes the other bodies. - /// Manipulating a body's transform may cause non-physical behavior. - /// @param position the world position of the body's local origin. - /// @param angle the world rotation in radians. - void SetTransform(const b2Vec2& position, float32 angle); - - /// Get the body transform for the body's origin. - /// @return the world transform of the body's origin. - const b2Transform& GetTransform() const; - - /// Get the world body origin position. - /// @return the world position of the body's origin. - const b2Vec2& GetPosition() const; - - /// Get the angle in radians. - /// @return the current world rotation angle in radians. - float32 GetAngle() const; - - /// Get the world position of the center of mass. - const b2Vec2& GetWorldCenter() const; - - /// Get the local position of the center of mass. - const b2Vec2& GetLocalCenter() const; - - /// Set the linear velocity of the center of mass. - /// @param v the new linear velocity of the center of mass. - void SetLinearVelocity(const b2Vec2& v); - - /// Get the linear velocity of the center of mass. - /// @return the linear velocity of the center of mass. - b2Vec2 GetLinearVelocity() const; - - /// Set the angular velocity. - /// @param omega the new angular velocity in radians/second. - void SetAngularVelocity(float32 omega); - - /// Get the angular velocity. - /// @return the angular velocity in radians/second. - float32 GetAngularVelocity() const; - - /// Apply a force at a world point. If the force is not - /// applied at the center of mass, it will generate a torque and - /// affect the angular velocity. This wakes up the body. - /// @param force the world force vector, usually in Newtons (N). - /// @param point the world position of the point of application. - void ApplyForce(const b2Vec2& force, const b2Vec2& point); - - /// Apply a torque. This affects the angular velocity - /// without affecting the linear velocity of the center of mass. - /// This wakes up the body. - /// @param torque about the z-axis (out of the screen), usually in N-m. - void ApplyTorque(float32 torque); - - /// Apply an impulse at a point. This immediately modifies the velocity. - /// It also modifies the angular velocity if the point of application - /// is not at the center of mass. This wakes up the body. - /// @param impulse the world impulse vector, usually in N-seconds or kg-m/s. - /// @param point the world position of the point of application. - void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point); - - /// Apply an angular impulse. - /// @param impulse the angular impulse in units of kg*m*m/s - void ApplyAngularImpulse(float32 impulse); - - /// Get the total mass of the body. - /// @return the mass, usually in kilograms (kg). - float32 GetMass() const; - - /// Get the rotational inertia of the body about the local origin. - /// @return the rotational inertia, usually in kg-m^2. - float32 GetInertia() const; - - /// Get the mass data of the body. - /// @return a struct containing the mass, inertia and center of the body. - void GetMassData(b2MassData* data) const; - - /// Set the mass properties to override the mass properties of the fixtures. - /// Note that this changes the center of mass position. - /// Note that creating or destroying fixtures can also alter the mass. - /// This function has no effect if the body isn't dynamic. - /// @param massData the mass properties. - void SetMassData(const b2MassData* data); - - /// This resets the mass properties to the sum of the mass properties of the fixtures. - /// This normally does not need to be called unless you called SetMassData to override - /// the mass and you later want to reset the mass. - void ResetMassData(); - - /// Get the world coordinates of a point given the local coordinates. - /// @param localPoint a point on the body measured relative the the body's origin. - /// @return the same point expressed in world coordinates. - b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const; - - /// Get the world coordinates of a vector given the local coordinates. - /// @param localVector a vector fixed in the body. - /// @return the same vector expressed in world coordinates. - b2Vec2 GetWorldVector(const b2Vec2& localVector) const; - - /// Gets a local point relative to the body's origin given a world point. - /// @param a point in world coordinates. - /// @return the corresponding local point relative to the body's origin. - b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const; - - /// Gets a local vector given a world vector. - /// @param a vector in world coordinates. - /// @return the corresponding local vector. - b2Vec2 GetLocalVector(const b2Vec2& worldVector) const; - - /// Get the world linear velocity of a world point attached to this body. - /// @param a point in world coordinates. - /// @return the world velocity of a point. - b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const; - - /// Get the world velocity of a local point. - /// @param a point in local coordinates. - /// @return the world velocity of a point. - b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const; - - /// Get the linear damping of the body. - float32 GetLinearDamping() const; - - /// Set the linear damping of the body. - void SetLinearDamping(float32 linearDamping); - - /// Get the angular damping of the body. - float32 GetAngularDamping() const; - - /// Set the angular damping of the body. - void SetAngularDamping(float32 angularDamping); - - /// Set the type of this body. This may alter the mass and velocity. - void SetType(b2BodyType type); - - /// Get the type of this body. - b2BodyType GetType() const; - - /// Should this body be treated like a bullet for continuous collision detection? - void SetBullet(bool flag); - - /// Is this body treated like a bullet for continuous collision detection? - bool IsBullet() const; - - /// You can disable sleeping on this body. If you disable sleeping, the - /// body will be woken. - void SetSleepingAllowed(bool flag); - - /// Is this body allowed to sleep - bool IsSleepingAllowed() const; - - /// Set the sleep state of the body. A sleeping body has very - /// low CPU cost. - /// @param flag set to true to put body to sleep, false to wake it. - void SetAwake(bool flag); - - /// Get the sleeping state of this body. - /// @return true if the body is sleeping. - bool IsAwake() const; - - /// Set the active state of the body. An inactive body is not - /// simulated and cannot be collided with or woken up. - /// If you pass a flag of true, all fixtures will be added to the - /// broad-phase. - /// If you pass a flag of false, all fixtures will be removed from - /// the broad-phase and all contacts will be destroyed. - /// Fixtures and joints are otherwise unaffected. You may continue - /// to create/destroy fixtures and joints on inactive bodies. - /// Fixtures on an inactive body are implicitly inactive and will - /// not participate in collisions, ray-casts, or queries. - /// Joints connected to an inactive body are implicitly inactive. - /// An inactive body is still owned by a b2World object and remains - /// in the body list. - void SetActive(bool flag); - - /// Get the active state of the body. - bool IsActive() const; - - /// Set this body to have fixed rotation. This causes the mass - /// to be reset. - void SetFixedRotation(bool flag); - - /// Does this body have fixed rotation? - bool IsFixedRotation() const; - - /// Get the list of all fixtures attached to this body. - b2Fixture* GetFixtureList(); - const b2Fixture* GetFixtureList() const; - - /// Get the list of all joints attached to this body. - b2JointEdge* GetJointList(); - const b2JointEdge* GetJointList() const; - - /// Get the list of all contacts attached to this body. - /// @warning this list changes during the time step and you may - /// miss some collisions if you don't use b2ContactListener. - b2ContactEdge* GetContactList(); - const b2ContactEdge* GetContactList() const; - - /// Get the next body in the world's body list. - b2Body* GetNext(); - const b2Body* GetNext() const; - - /// Get the user data pointer that was provided in the body definition. - void* GetUserData() const; - - /// Set the user data. Use this to store your application specific data. - void SetUserData(void* data); - - /// Get the parent world of this body. - b2World* GetWorld(); - const b2World* GetWorld() const; - -private: - - friend class b2World; - friend class b2Island; - friend class b2ContactManager; - friend class b2ContactSolver; - friend class b2TOISolver; - - friend class b2DistanceJoint; - friend class b2GearJoint; - friend class b2LineJoint; - friend class b2MouseJoint; - friend class b2PrismaticJoint; - friend class b2PulleyJoint; - friend class b2RevoluteJoint; - friend class b2WeldJoint; - friend class b2FrictionJoint; - - // m_flags - enum - { - e_islandFlag = 0x0001, - e_awakeFlag = 0x0002, - e_autoSleepFlag = 0x0004, - e_bulletFlag = 0x0008, - e_fixedRotationFlag = 0x0010, - e_activeFlag = 0x0020, - e_toiFlag = 0x0040, - }; - - b2Body(const b2BodyDef* bd, b2World* world); - ~b2Body(); - - void SynchronizeFixtures(); - void SynchronizeTransform(); - - // This is used to prevent connected bodies from colliding. - // It may lie, depending on the collideConnected flag. - bool ShouldCollide(const b2Body* other) const; - - void Advance(float32 t); - - b2BodyType m_type; - - uint16 m_flags; - - int32 m_islandIndex; - - b2Transform m_xf; // the body origin transform - b2Sweep m_sweep; // the swept motion for CCD - - b2Vec2 m_linearVelocity; - float32 m_angularVelocity; - - b2Vec2 m_force; - float32 m_torque; - - b2World* m_world; - b2Body* m_prev; - b2Body* m_next; - - b2Fixture* m_fixtureList; - int32 m_fixtureCount; - - b2JointEdge* m_jointList; - b2ContactEdge* m_contactList; - - float32 m_mass, m_invMass; - - // Rotational inertia about the center of mass. - float32 m_I, m_invI; - - float32 m_linearDamping; - float32 m_angularDamping; - - float32 m_sleepTime; - - void* m_userData; -}; - -inline b2BodyType b2Body::GetType() const -{ - return m_type; -} - -inline const b2Transform& b2Body::GetTransform() const -{ - return m_xf; -} - -inline const b2Vec2& b2Body::GetPosition() const -{ - return m_xf.position; -} - -inline float32 b2Body::GetAngle() const -{ - return m_sweep.a; -} - -inline const b2Vec2& b2Body::GetWorldCenter() const -{ - return m_sweep.c; -} - -inline const b2Vec2& b2Body::GetLocalCenter() const -{ - return m_sweep.localCenter; -} - -inline void b2Body::SetLinearVelocity(const b2Vec2& v) -{ - if (m_type == b2_staticBody) - { - return; - } - - if (b2Dot(v,v) > 0.0f) - { - SetAwake(true); - } - - m_linearVelocity = v; -} - -inline b2Vec2 b2Body::GetLinearVelocity() const -{ - return m_linearVelocity; -} - -inline void b2Body::SetAngularVelocity(float32 w) -{ - if (m_type == b2_staticBody) - { - return; - } - - if (w * w > 0.0f) - { - SetAwake(true); - } - - m_angularVelocity = w; -} - -inline float32 b2Body::GetAngularVelocity() const -{ - return m_angularVelocity; -} - -inline float32 b2Body::GetMass() const -{ - return m_mass; -} - -inline float32 b2Body::GetInertia() const -{ - return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); -} - -inline void b2Body::GetMassData(b2MassData* data) const -{ - data->mass = m_mass; - data->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); - data->center = m_sweep.localCenter; -} - -inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const -{ - return b2Mul(m_xf, localPoint); -} - -inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const -{ - return b2Mul(m_xf.R, localVector); -} - -inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const -{ - return b2MulT(m_xf, worldPoint); -} - -inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const -{ - return b2MulT(m_xf.R, worldVector); -} - -inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const -{ - return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c); -} - -inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const -{ - return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint)); -} - -inline float32 b2Body::GetLinearDamping() const -{ - return m_linearDamping; -} - -inline void b2Body::SetLinearDamping(float32 linearDamping) -{ - m_linearDamping = linearDamping; -} - -inline float32 b2Body::GetAngularDamping() const -{ - return m_angularDamping; -} - -inline void b2Body::SetAngularDamping(float32 angularDamping) -{ - m_angularDamping = angularDamping; -} - -inline void b2Body::SetBullet(bool flag) -{ - if (flag) - { - m_flags |= e_bulletFlag; - } - else - { - m_flags &= ~e_bulletFlag; - } -} - -inline bool b2Body::IsBullet() const -{ - return (m_flags & e_bulletFlag) == e_bulletFlag; -} - -inline void b2Body::SetAwake(bool flag) -{ - if (flag) - { - if ((m_flags & e_awakeFlag) == 0) - { - m_flags |= e_awakeFlag; - m_sleepTime = 0.0f; - } - } - else - { - m_flags &= ~e_awakeFlag; - m_sleepTime = 0.0f; - m_linearVelocity.SetZero(); - m_angularVelocity = 0.0f; - m_force.SetZero(); - m_torque = 0.0f; - } -} - -inline bool b2Body::IsAwake() const -{ - return (m_flags & e_awakeFlag) == e_awakeFlag; -} - -inline bool b2Body::IsActive() const -{ - return (m_flags & e_activeFlag) == e_activeFlag; -} - -inline void b2Body::SetFixedRotation(bool flag) -{ - if (flag) - { - m_flags |= e_fixedRotationFlag; - } - else - { - m_flags &= ~e_fixedRotationFlag; - } - - ResetMassData(); -} - -inline bool b2Body::IsFixedRotation() const -{ - return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag; -} - -inline void b2Body::SetSleepingAllowed(bool flag) -{ - if (flag) - { - m_flags |= e_autoSleepFlag; - } - else - { - m_flags &= ~e_autoSleepFlag; - SetAwake(true); - } -} - -inline bool b2Body::IsSleepingAllowed() const -{ - return (m_flags & e_autoSleepFlag) == e_autoSleepFlag; -} - -inline b2Fixture* b2Body::GetFixtureList() -{ - return m_fixtureList; -} - -inline const b2Fixture* b2Body::GetFixtureList() const -{ - return m_fixtureList; -} - -inline b2JointEdge* b2Body::GetJointList() -{ - return m_jointList; -} - -inline const b2JointEdge* b2Body::GetJointList() const -{ - return m_jointList; -} - -inline b2ContactEdge* b2Body::GetContactList() -{ - return m_contactList; -} - -inline const b2ContactEdge* b2Body::GetContactList() const -{ - return m_contactList; -} - -inline b2Body* b2Body::GetNext() -{ - return m_next; -} - -inline const b2Body* b2Body::GetNext() const -{ - return m_next; -} - -inline void b2Body::SetUserData(void* data) -{ - m_userData = data; -} - -inline void* b2Body::GetUserData() const -{ - return m_userData; -} - -inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point) -{ - if (m_type != b2_dynamicBody) - { - return; - } - - if (IsAwake() == false) - { - SetAwake(true); - } - - m_force += force; - m_torque += b2Cross(point - m_sweep.c, force); -} - -inline void b2Body::ApplyTorque(float32 torque) -{ - if (m_type != b2_dynamicBody) - { - return; - } - - if (IsAwake() == false) - { - SetAwake(true); - } - - m_torque += torque; -} - -inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point) -{ - if (m_type != b2_dynamicBody) - { - return; - } - - if (IsAwake() == false) - { - SetAwake(true); - } - m_linearVelocity += m_invMass * impulse; - m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); -} - -inline void b2Body::ApplyAngularImpulse(float32 impulse) -{ - if (m_type != b2_dynamicBody) - { - return; - } - - if (IsAwake() == false) - { - SetAwake(true); - } - m_angularVelocity += m_invI * impulse; -} - -inline void b2Body::SynchronizeTransform() -{ - m_xf.R.Set(m_sweep.a); - m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter); -} - -inline void b2Body::Advance(float32 t) -{ - // Advance to the new safe time. - m_sweep.Advance(t); - m_sweep.c = m_sweep.c0; - m_sweep.a = m_sweep.a0; - SynchronizeTransform(); -} - -inline b2World* b2Body::GetWorld() -{ - return m_world; -} - -inline const b2World* b2Body::GetWorld() const -{ - return m_world; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.cpp deleted file mode 100644 index ff4f946ad..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include - -b2ContactFilter b2_defaultFilter; -b2ContactListener b2_defaultListener; - -b2ContactManager::b2ContactManager() -{ - m_contactList = NULL; - m_contactCount = 0; - m_contactFilter = &b2_defaultFilter; - m_contactListener = &b2_defaultListener; - m_allocator = NULL; -} - -void b2ContactManager::Destroy(b2Contact* c) -{ - b2Fixture* fixtureA = c->GetFixtureA(); - b2Fixture* fixtureB = c->GetFixtureB(); - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - - if (m_contactListener && c->IsTouching()) - { - m_contactListener->EndContact(c); - } - - // Remove from the world. - if (c->m_prev) - { - c->m_prev->m_next = c->m_next; - } - - if (c->m_next) - { - c->m_next->m_prev = c->m_prev; - } - - if (c == m_contactList) - { - m_contactList = c->m_next; - } - - // Remove from body 1 - if (c->m_nodeA.prev) - { - c->m_nodeA.prev->next = c->m_nodeA.next; - } - - if (c->m_nodeA.next) - { - c->m_nodeA.next->prev = c->m_nodeA.prev; - } - - if (&c->m_nodeA == bodyA->m_contactList) - { - bodyA->m_contactList = c->m_nodeA.next; - } - - // Remove from body 2 - if (c->m_nodeB.prev) - { - c->m_nodeB.prev->next = c->m_nodeB.next; - } - - if (c->m_nodeB.next) - { - c->m_nodeB.next->prev = c->m_nodeB.prev; - } - - if (&c->m_nodeB == bodyB->m_contactList) - { - bodyB->m_contactList = c->m_nodeB.next; - } - - // Call the factory. - b2Contact::Destroy(c, m_allocator); - --m_contactCount; -} - -// This is the top level collision call for the time step. Here -// all the narrow phase collision is processed for the world -// contact list. -void b2ContactManager::Collide() -{ - // Update awake contacts. - b2Contact* c = m_contactList; - while (c) - { - b2Fixture* fixtureA = c->GetFixtureA(); - b2Fixture* fixtureB = c->GetFixtureB(); - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - - if (bodyA->IsAwake() == false && bodyB->IsAwake() == false) - { - c = c->GetNext(); - continue; - } - - // Is this contact flagged for filtering? - if (c->m_flags & b2Contact::e_filterFlag) - { - // Should these bodies collide? - if (bodyB->ShouldCollide(bodyA) == false) - { - b2Contact* cNuke = c; - c = cNuke->GetNext(); - Destroy(cNuke); - continue; - } - - // Check user filtering. - if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) - { - b2Contact* cNuke = c; - c = cNuke->GetNext(); - Destroy(cNuke); - continue; - } - - // Clear the filtering flag. - c->m_flags &= ~b2Contact::e_filterFlag; - } - - int32 proxyIdA = fixtureA->m_proxyId; - int32 proxyIdB = fixtureB->m_proxyId; - bool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB); - - // Here we destroy contacts that cease to overlap in the broad-phase. - if (overlap == false) - { - b2Contact* cNuke = c; - c = cNuke->GetNext(); - Destroy(cNuke); - continue; - } - - // The contact persists. - c->Update(m_contactListener); - c = c->GetNext(); - } -} - -void b2ContactManager::FindNewContacts() -{ - m_broadPhase.UpdatePairs(this); -} - -void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) -{ - b2Fixture* fixtureA = (b2Fixture*)proxyUserDataA; - b2Fixture* fixtureB = (b2Fixture*)proxyUserDataB; - - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - - // Are the fixtures on the same body? - if (bodyA == bodyB) - { - return; - } - - // Does a contact already exist? - b2ContactEdge* edge = bodyB->GetContactList(); - while (edge) - { - if (edge->other == bodyA) - { - b2Fixture* fA = edge->contact->GetFixtureA(); - b2Fixture* fB = edge->contact->GetFixtureB(); - if (fA == fixtureA && fB == fixtureB) - { - // A contact already exists. - return; - } - - if (fA == fixtureB && fB == fixtureA) - { - // A contact already exists. - return; - } - } - - edge = edge->next; - } - - // Does a joint override collision? Is at least one body dynamic? - if (bodyB->ShouldCollide(bodyA) == false) - { - return; - } - - // Check user filtering. - if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) - { - return; - } - - // Call the factory. - b2Contact* c = b2Contact::Create(fixtureA, fixtureB, m_allocator); - - // Contact creation may swap fixtures. - fixtureA = c->GetFixtureA(); - fixtureB = c->GetFixtureB(); - bodyA = fixtureA->GetBody(); - bodyB = fixtureB->GetBody(); - - // Insert into the world. - c->m_prev = NULL; - c->m_next = m_contactList; - if (m_contactList != NULL) - { - m_contactList->m_prev = c; - } - m_contactList = c; - - // Connect to island graph. - - // Connect to body A - c->m_nodeA.contact = c; - c->m_nodeA.other = bodyB; - - c->m_nodeA.prev = NULL; - c->m_nodeA.next = bodyA->m_contactList; - if (bodyA->m_contactList != NULL) - { - bodyA->m_contactList->prev = &c->m_nodeA; - } - bodyA->m_contactList = &c->m_nodeA; - - // Connect to body B - c->m_nodeB.contact = c; - c->m_nodeB.other = bodyA; - - c->m_nodeB.prev = NULL; - c->m_nodeB.next = bodyB->m_contactList; - if (bodyB->m_contactList != NULL) - { - bodyB->m_contactList->prev = &c->m_nodeB; - } - bodyB->m_contactList = &c->m_nodeB; - - ++m_contactCount; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.h deleted file mode 100644 index d22bd258e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2ContactManager.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONTACT_MANAGER_H -#define B2_CONTACT_MANAGER_H - -#include - -class b2Contact; -class b2ContactFilter; -class b2ContactListener; -class b2BlockAllocator; - -// Delegate of b2World. -class b2ContactManager -{ -public: - b2ContactManager(); - - // Broad-phase callback. - void AddPair(void* proxyUserDataA, void* proxyUserDataB); - - void FindNewContacts(); - - void Destroy(b2Contact* c); - - void Collide(); - - b2BroadPhase m_broadPhase; - b2Contact* m_contactList; - int32 m_contactCount; - b2ContactFilter* m_contactFilter; - b2ContactListener* m_contactListener; - b2BlockAllocator* m_allocator; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.cpp deleted file mode 100644 index a8ea0d5a6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include -#include - - -b2Fixture::b2Fixture() -{ - m_userData = NULL; - m_body = NULL; - m_next = NULL; - m_proxyId = b2BroadPhase::e_nullProxy; - m_shape = NULL; - m_density = 0.0f; -} - -b2Fixture::~b2Fixture() -{ - b2Assert(m_shape == NULL); - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); -} - -void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def) -{ - m_userData = def->userData; - m_friction = def->friction; - m_restitution = def->restitution; - - m_body = body; - m_next = NULL; - - m_filter = def->filter; - - m_isSensor = def->isSensor; - - m_shape = def->shape->Clone(allocator); - - m_density = def->density; -} - -void b2Fixture::Destroy(b2BlockAllocator* allocator) -{ - // The proxy must be destroyed before calling this. - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); - - // Free the child shape. - switch (m_shape->m_type) - { - case b2Shape::e_circle: - { - b2CircleShape* s = (b2CircleShape*)m_shape; - s->~b2CircleShape(); - allocator->Free(s, sizeof(b2CircleShape)); - } - break; - - case b2Shape::e_polygon: - { - b2PolygonShape* s = (b2PolygonShape*)m_shape; - s->~b2PolygonShape(); - allocator->Free(s, sizeof(b2PolygonShape)); - } - break; - - default: - b2Assert(false); - break; - } - - m_shape = NULL; -} - -void b2Fixture::CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf) -{ - b2Assert(m_proxyId == b2BroadPhase::e_nullProxy); - - // Create proxy in the broad-phase. - m_shape->ComputeAABB(&m_aabb, xf); - m_proxyId = broadPhase->CreateProxy(m_aabb, this); -} - -void b2Fixture::DestroyProxy(b2BroadPhase* broadPhase) -{ - if (m_proxyId == b2BroadPhase::e_nullProxy) - { - return; - } - - // Destroy proxy in the broad-phase. - broadPhase->DestroyProxy(m_proxyId); - m_proxyId = b2BroadPhase::e_nullProxy; -} - -void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2) -{ - if (m_proxyId == b2BroadPhase::e_nullProxy) - { - return; - } - - // Compute an AABB that covers the swept shape (may miss some rotation effect). - b2AABB aabb1, aabb2; - m_shape->ComputeAABB(&aabb1, transform1); - m_shape->ComputeAABB(&aabb2, transform2); - - m_aabb.Combine(aabb1, aabb2); - - b2Vec2 displacement = transform2.position - transform1.position; - - broadPhase->MoveProxy(m_proxyId, m_aabb, displacement); -} - -void b2Fixture::SetFilterData(const b2Filter& filter) -{ - m_filter = filter; - - if (m_body == NULL) - { - return; - } - - // Flag associated contacts for filtering. - b2ContactEdge* edge = m_body->GetContactList(); - while (edge) - { - b2Contact* contact = edge->contact; - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - if (fixtureA == this || fixtureB == this) - { - contact->FlagForFiltering(); - } - - edge = edge->next; - } -} - -void b2Fixture::SetSensor(bool sensor) -{ - m_isSensor = sensor; -} - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.h deleted file mode 100644 index ea565e189..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Fixture.h +++ /dev/null @@ -1,327 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_FIXTURE_H -#define B2_FIXTURE_H - -#include -#include -#include - -class b2BlockAllocator; -class b2Body; -class b2BroadPhase; - -/// This holds contact filtering data. -struct b2Filter -{ - /// The collision category bits. Normally you would just set one bit. - uint16 categoryBits; - - /// The collision mask bits. This states the categories that this - /// shape would accept for collision. - uint16 maskBits; - - /// Collision groups allow a certain group of objects to never collide (negative) - /// or always collide (positive). Zero means no collision group. Non-zero group - /// filtering always wins against the mask bits. - int16 groupIndex; -}; - -/// A fixture definition is used to create a fixture. This class defines an -/// abstract fixture definition. You can reuse fixture definitions safely. -struct b2FixtureDef -{ - /// The constructor sets the default fixture definition values. - b2FixtureDef() - { - shape = NULL; - userData = NULL; - friction = 0.2f; - restitution = 0.0f; - density = 0.0f; - filter.categoryBits = 0x0001; - filter.maskBits = 0xFFFF; - filter.groupIndex = 0; - isSensor = false; - } - - virtual ~b2FixtureDef() {} - - /// The shape, this must be set. The shape will be cloned, so you - /// can create the shape on the stack. - const b2Shape* shape; - - /// Use this to store application specific fixture data. - void* userData; - - /// The friction coefficient, usually in the range [0,1]. - float32 friction; - - /// The restitution (elasticity) usually in the range [0,1]. - float32 restitution; - - /// The density, usually in kg/m^2. - float32 density; - - /// A sensor shape collects contact information but never generates a collision - /// response. - bool isSensor; - - /// Contact filtering data. - b2Filter filter; -}; - - -/// A fixture is used to attach a shape to a body for collision detection. A fixture -/// inherits its transform from its parent. Fixtures hold additional non-geometric data -/// such as friction, collision filters, etc. -/// Fixtures are created via b2Body::CreateFixture. -/// @warning you cannot reuse fixtures. -class b2Fixture -{ -public: - /// Get the type of the child shape. You can use this to down cast to the concrete shape. - /// @return the shape type. - b2Shape::Type GetType() const; - - /// Get the child shape. You can modify the child shape, however you should not change the - /// number of vertices because this will crash some collision caching mechanisms. - /// Manipulating the shape may lead to non-physical behavior. - b2Shape* GetShape(); - const b2Shape* GetShape() const; - - /// Set if this fixture is a sensor. - void SetSensor(bool sensor); - - /// Is this fixture a sensor (non-solid)? - /// @return the true if the shape is a sensor. - bool IsSensor() const; - - /// Set the contact filtering data. This will not update contacts until the next time - /// step when either parent body is active and awake. - void SetFilterData(const b2Filter& filter); - - /// Get the contact filtering data. - const b2Filter& GetFilterData() const; - - /// Get the parent body of this fixture. This is NULL if the fixture is not attached. - /// @return the parent body. - b2Body* GetBody(); - const b2Body* GetBody() const; - - /// Get the next fixture in the parent body's fixture list. - /// @return the next shape. - b2Fixture* GetNext(); - const b2Fixture* GetNext() const; - - /// Get the user data that was assigned in the fixture definition. Use this to - /// store your application specific data. - void* GetUserData() const; - - /// Set the user data. Use this to store your application specific data. - void SetUserData(void* data); - - /// Test a point for containment in this fixture. - /// @param xf the shape world transform. - /// @param p a point in world coordinates. - bool TestPoint(const b2Vec2& p) const; - - /// Cast a ray against this shape. - /// @param output the ray-cast results. - /// @param input the ray-cast input parameters. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; - - /// Get the mass data for this fixture. The mass data is based on the density and - /// the shape. The rotational inertia is about the shape's origin. This operation - /// may be expensive. - void GetMassData(b2MassData* massData) const; - - /// Set the density of this fixture. This will _not_ automatically adjust the mass - /// of the body. You must call b2Body::ResetMassData to update the body's mass. - void SetDensity(float32 density); - - /// Get the density of this fixture. - float32 GetDensity() const; - - /// Get the coefficient of friction. - float32 GetFriction() const; - - /// Set the coefficient of friction. - void SetFriction(float32 friction); - - /// Get the coefficient of restitution. - float32 GetRestitution() const; - - /// Set the coefficient of restitution. - void SetRestitution(float32 restitution); - - /// Get the fixture's AABB. This AABB may be enlarge and/or stale. - /// If you need a more accurate AABB, compute it using the shape and - /// the body transform. - const b2AABB& GetAABB() const; - -protected: - - friend class b2Body; - friend class b2World; - friend class b2Contact; - friend class b2ContactManager; - - b2Fixture(); - ~b2Fixture(); - - // We need separation create/destroy functions from the constructor/destructor because - // the destructor cannot access the allocator (no destructor arguments allowed by C++). - void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def); - void Destroy(b2BlockAllocator* allocator); - - // These support body activation/deactivation. - void CreateProxy(b2BroadPhase* broadPhase, const b2Transform& xf); - void DestroyProxy(b2BroadPhase* broadPhase); - - void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); - - b2AABB m_aabb; - - float32 m_density; - - b2Fixture* m_next; - b2Body* m_body; - - b2Shape* m_shape; - - float32 m_friction; - float32 m_restitution; - - int32 m_proxyId; - b2Filter m_filter; - - bool m_isSensor; - - void* m_userData; -}; - -inline b2Shape::Type b2Fixture::GetType() const -{ - return m_shape->GetType(); -} - -inline b2Shape* b2Fixture::GetShape() -{ - return m_shape; -} - -inline const b2Shape* b2Fixture::GetShape() const -{ - return m_shape; -} - -inline bool b2Fixture::IsSensor() const -{ - return m_isSensor; -} - -inline const b2Filter& b2Fixture::GetFilterData() const -{ - return m_filter; -} - -inline void* b2Fixture::GetUserData() const -{ - return m_userData; -} - -inline void b2Fixture::SetUserData(void* data) -{ - m_userData = data; -} - -inline b2Body* b2Fixture::GetBody() -{ - return m_body; -} - -inline const b2Body* b2Fixture::GetBody() const -{ - return m_body; -} - -inline b2Fixture* b2Fixture::GetNext() -{ - return m_next; -} - -inline const b2Fixture* b2Fixture::GetNext() const -{ - return m_next; -} - -inline void b2Fixture::SetDensity(float32 density) -{ - b2Assert(b2IsValid(density) && density >= 0.0f); - m_density = density; -} - -inline float32 b2Fixture::GetDensity() const -{ - return m_density; -} - -inline float32 b2Fixture::GetFriction() const -{ - return m_friction; -} - -inline void b2Fixture::SetFriction(float32 friction) -{ - m_friction = friction; -} - -inline float32 b2Fixture::GetRestitution() const -{ - return m_restitution; -} - -inline void b2Fixture::SetRestitution(float32 restitution) -{ - m_restitution = restitution; -} - -inline bool b2Fixture::TestPoint(const b2Vec2& p) const -{ - return m_shape->TestPoint(m_body->GetTransform(), p); -} - -inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const -{ - return m_shape->RayCast(output, input, m_body->GetTransform()); -} - -inline void b2Fixture::GetMassData(b2MassData* massData) const -{ - m_shape->ComputeMass(massData, m_density); -} - -inline const b2AABB& b2Fixture::GetAABB() const -{ - return m_aabb; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.cpp deleted file mode 100644 index f7875077a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -/* -Position Correction Notes -========================= -I tried the several algorithms for position correction of the 2D revolute joint. -I looked at these systems: -- simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s. -- suspension bridge with 30 1m long planks of length 1m. -- multi-link chain with 30 1m long links. - -Here are the algorithms: - -Baumgarte - A fraction of the position error is added to the velocity error. There is no -separate position solver. - -Pseudo Velocities - After the velocity solver and position integration, -the position error, Jacobian, and effective mass are recomputed. Then -the velocity constraints are solved with pseudo velocities and a fraction -of the position error is added to the pseudo velocity error. The pseudo -velocities are initialized to zero and there is no warm-starting. After -the position solver, the pseudo velocities are added to the positions. -This is also called the First Order World method or the Position LCP method. - -Modified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the -position error is re-computed for each constraint and the positions are updated -after the constraint is solved. The radius vectors (aka Jacobians) are -re-computed too (otherwise the algorithm has horrible instability). The pseudo -velocity states are not needed because they are effectively zero at the beginning -of each iteration. Since we have the current position error, we allow the -iterations to terminate early if the error becomes smaller than b2_linearSlop. - -Full NGS or just NGS - Like Modified NGS except the effective mass are re-computed -each time a constraint is solved. - -Here are the results: -Baumgarte - this is the cheapest algorithm but it has some stability problems, -especially with the bridge. The chain links separate easily close to the root -and they jitter as they struggle to pull together. This is one of the most common -methods in the field. The big drawback is that the position correction artificially -affects the momentum, thus leading to instabilities and false bounce. I used a -bias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller -factor makes joints and contacts more spongy. - -Pseudo Velocities - the is more stable than the Baumgarte method. The bridge is -stable. However, joints still separate with large angular velocities. Drag the -simple pendulum in a circle quickly and the joint will separate. The chain separates -easily and does not recover. I used a bias factor of 0.2. A larger value lead to -the bridge collapsing when a heavy cube drops on it. - -Modified NGS - this algorithm is better in some ways than Baumgarte and Pseudo -Velocities, but in other ways it is worse. The bridge and chain are much more -stable, but the simple pendulum goes unstable at high angular velocities. - -Full NGS - stable in all tests. The joints display good stiffness. The bridge -still sags, but this is better than infinite forces. - -Recommendations -Pseudo Velocities are not really worthwhile because the bridge and chain cannot -recover from joint separation. In other cases the benefit over Baumgarte is small. - -Modified NGS is not a robust method for the revolute joint due to the violent -instability seen in the simple pendulum. Perhaps it is viable with other constraint -types, especially scalar constraints where the effective mass is a scalar. - -This leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities -and is very fast. I don't think we can escape Baumgarte, especially in highly -demanding cases where high constraint fidelity is not needed. - -Full NGS is robust and easy on the eyes. I recommend this as an option for -higher fidelity simulation and certainly for suspension bridges and long chains. -Full NGS might be a good choice for ragdolls, especially motorized ragdolls where -joint separation can be problematic. The number of NGS iterations can be reduced -for better performance without harming robustness much. - -Each joint in a can be handled differently in the position solver. So I recommend -a system where the user can select the algorithm on a per joint basis. I would -probably default to the slower Full NGS and let the user select the faster -Baumgarte method in performance critical scenarios. -*/ - -/* -Cache Performance - -The Box2D solvers are dominated by cache misses. Data structures are designed -to increase the number of cache hits. Much of misses are due to random access -to body data. The constraint structures are iterated over linearly, which leads -to few cache misses. - -The bodies are not accessed during iteration. Instead read only data, such as -the mass values are stored with the constraints. The mutable data are the constraint -impulses and the bodies velocities/positions. The impulses are held inside the -constraint structures. The body velocities/positions are held in compact, temporary -arrays to increase the number of cache hits. Linear and angular velocity are -stored in a single array since multiple arrays lead to multiple misses. -*/ - -/* -2D Rotation - -R = [cos(theta) -sin(theta)] - [sin(theta) cos(theta) ] - -thetaDot = omega - -Let q1 = cos(theta), q2 = sin(theta). -R = [q1 -q2] - [q2 q1] - -q1Dot = -thetaDot * q2 -q2Dot = thetaDot * q1 - -q1_new = q1_old - dt * w * q2 -q2_new = q2_old + dt * w * q1 -then normalize. - -This might be faster than computing sin+cos. -However, we can compute sin+cos of the same angle fast. -*/ - -b2Island::b2Island( - int32 bodyCapacity, - int32 contactCapacity, - int32 jointCapacity, - b2StackAllocator* allocator, - b2ContactListener* listener) -{ - m_bodyCapacity = bodyCapacity; - m_contactCapacity = contactCapacity; - m_jointCapacity = jointCapacity; - m_bodyCount = 0; - m_contactCount = 0; - m_jointCount = 0; - - m_allocator = allocator; - m_listener = listener; - - m_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*)); - m_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity * sizeof(b2Contact*)); - m_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*)); - - m_velocities = (b2Velocity*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Velocity)); - m_positions = (b2Position*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Position)); -} - -b2Island::~b2Island() -{ - // Warning: the order should reverse the constructor order. - m_allocator->Free(m_positions); - m_allocator->Free(m_velocities); - m_allocator->Free(m_joints); - m_allocator->Free(m_contacts); - m_allocator->Free(m_bodies); -} - -void b2Island::Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) -{ - // Integrate velocities and apply damping. - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - // Integrate velocities. - b->m_linearVelocity += step.dt * (gravity + b->m_invMass * b->m_force); - b->m_angularVelocity += step.dt * b->m_invI * b->m_torque; - - // Apply damping. - // ODE: dv/dt + c * v = 0 - // Solution: v(t) = v0 * exp(-c * t) - // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) - // v2 = exp(-c * dt) * v1 - // Taylor expansion: - // v2 = (1.0f - c * dt) * v1 - b->m_linearVelocity *= b2Clamp(1.0f - step.dt * b->m_linearDamping, 0.0f, 1.0f); - b->m_angularVelocity *= b2Clamp(1.0f - step.dt * b->m_angularDamping, 0.0f, 1.0f); - } - - // Partition contacts so that contacts with static bodies are solved last. - int32 i1 = -1; - for (int32 i2 = 0; i2 < m_contactCount; ++i2) - { - b2Fixture* fixtureA = m_contacts[i2]->GetFixtureA(); - b2Fixture* fixtureB = m_contacts[i2]->GetFixtureB(); - b2Body* bodyA = fixtureA->GetBody(); - b2Body* bodyB = fixtureB->GetBody(); - bool nonStatic = bodyA->GetType() != b2_staticBody && bodyB->GetType() != b2_staticBody; - if (nonStatic) - { - ++i1; - b2Swap(m_contacts[i1], m_contacts[i2]); - } - } - - // Initialize velocity constraints. - b2ContactSolver contactSolver(m_contacts, m_contactCount, m_allocator, step.dtRatio); - contactSolver.WarmStart(); - for (int32 i = 0; i < m_jointCount; ++i) - { - m_joints[i]->InitVelocityConstraints(step); - } - - // Solve velocity constraints. - for (int32 i = 0; i < step.velocityIterations; ++i) - { - for (int32 j = 0; j < m_jointCount; ++j) - { - m_joints[j]->SolveVelocityConstraints(step); - } - - contactSolver.SolveVelocityConstraints(); - } - - // Post-solve (store impulses for warm starting). - contactSolver.StoreImpulses(); - - // Integrate positions. - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - - if (b->GetType() == b2_staticBody) - { - continue; - } - - // Check for large velocities. - b2Vec2 translation = step.dt * b->m_linearVelocity; - if (b2Dot(translation, translation) > b2_maxTranslationSquared) - { - float32 ratio = b2_maxTranslation / translation.Length(); - b->m_linearVelocity *= ratio; - } - - float32 rotation = step.dt * b->m_angularVelocity; - if (rotation * rotation > b2_maxRotationSquared) - { - float32 ratio = b2_maxRotation / b2Abs(rotation); - b->m_angularVelocity *= ratio; - } - - // Store positions for continuous collision. - b->m_sweep.c0 = b->m_sweep.c; - b->m_sweep.a0 = b->m_sweep.a; - - // Integrate - b->m_sweep.c += step.dt * b->m_linearVelocity; - b->m_sweep.a += step.dt * b->m_angularVelocity; - - // Compute new transform - b->SynchronizeTransform(); - - // Note: shapes are synchronized later. - } - - // Iterate over constraints. - for (int32 i = 0; i < step.positionIterations; ++i) - { - bool contactsOkay = contactSolver.SolvePositionConstraints(b2_contactBaumgarte); - - bool jointsOkay = true; - for (int32 i = 0; i < m_jointCount; ++i) - { - bool jointOkay = m_joints[i]->SolvePositionConstraints(b2_contactBaumgarte); - jointsOkay = jointsOkay && jointOkay; - } - - if (contactsOkay && jointsOkay) - { - // Exit early if the position errors are small. - break; - } - } - - Report(contactSolver.m_constraints); - - if (allowSleep) - { - float32 minSleepTime = b2_maxFloat; - - const float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance; - const float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance; - - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - if (b->GetType() == b2_staticBody) - { - continue; - } - - if ((b->m_flags & b2Body::e_autoSleepFlag) == 0) - { - b->m_sleepTime = 0.0f; - minSleepTime = 0.0f; - } - - if ((b->m_flags & b2Body::e_autoSleepFlag) == 0 || - b->m_angularVelocity * b->m_angularVelocity > angTolSqr || - b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) - { - b->m_sleepTime = 0.0f; - minSleepTime = 0.0f; - } - else - { - b->m_sleepTime += step.dt; - minSleepTime = b2Min(minSleepTime, b->m_sleepTime); - } - } - - if (minSleepTime >= b2_timeToSleep) - { - for (int32 i = 0; i < m_bodyCount; ++i) - { - b2Body* b = m_bodies[i]; - b->SetAwake(false); - } - } - } -} - -void b2Island::Report(const b2ContactConstraint* constraints) -{ - if (m_listener == NULL) - { - return; - } - - for (int32 i = 0; i < m_contactCount; ++i) - { - b2Contact* c = m_contacts[i]; - - const b2ContactConstraint* cc = constraints + i; - - b2ContactImpulse impulse; - for (int32 j = 0; j < cc->pointCount; ++j) - { - impulse.normalImpulses[j] = cc->points[j].normalImpulse; - impulse.tangentImpulses[j] = cc->points[j].tangentImpulse; - } - - m_listener->PostSolve(c, &impulse); - } -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.h deleted file mode 100644 index ff8f1f68c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2Island.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_ISLAND_H -#define B2_ISLAND_H - -#include -#include -#include - -class b2Contact; -class b2Joint; -class b2StackAllocator; -class b2ContactListener; -struct b2ContactConstraint; - -/// This is an internal structure. -struct b2Position -{ - b2Vec2 x; - float32 a; -}; - -/// This is an internal structure. -struct b2Velocity -{ - b2Vec2 v; - float32 w; -}; - -/// This is an internal class. -class b2Island -{ -public: - b2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, - b2StackAllocator* allocator, b2ContactListener* listener); - ~b2Island(); - - void Clear() - { - m_bodyCount = 0; - m_contactCount = 0; - m_jointCount = 0; - } - - void Solve(const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); - - void Add(b2Body* body) - { - b2Assert(m_bodyCount < m_bodyCapacity); - body->m_islandIndex = m_bodyCount; - m_bodies[m_bodyCount++] = body; - } - - void Add(b2Contact* contact) - { - b2Assert(m_contactCount < m_contactCapacity); - m_contacts[m_contactCount++] = contact; - } - - void Add(b2Joint* joint) - { - b2Assert(m_jointCount < m_jointCapacity); - m_joints[m_jointCount++] = joint; - } - - void Report(const b2ContactConstraint* constraints); - - b2StackAllocator* m_allocator; - b2ContactListener* m_listener; - - b2Body** m_bodies; - b2Contact** m_contacts; - b2Joint** m_joints; - - b2Position* m_positions; - b2Velocity* m_velocities; - - int32 m_bodyCount; - int32 m_jointCount; - int32 m_contactCount; - - int32 m_bodyCapacity; - int32 m_contactCapacity; - int32 m_jointCapacity; - - int32 m_positionIterationCount; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2TimeStep.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2TimeStep.h deleted file mode 100644 index 48e2941f3..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2TimeStep.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_TIME_STEP_H -#define B2_TIME_STEP_H - -#include - -/// This is an internal structure. -struct b2TimeStep -{ - float32 dt; // time step - float32 inv_dt; // inverse time step (0 if dt == 0). - float32 dtRatio; // dt * inv_dt0 - int32 velocityIterations; - int32 positionIterations; - bool warmStarting; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.cpp deleted file mode 100644 index acd69e7f1..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.cpp +++ /dev/null @@ -1,1077 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -b2World::b2World(const b2Vec2& gravity, bool doSleep) -{ - m_destructionListener = NULL; - m_debugDraw = NULL; - - m_bodyList = NULL; - m_jointList = NULL; - - m_bodyCount = 0; - m_jointCount = 0; - - m_warmStarting = true; - m_continuousPhysics = true; - - m_allowSleep = doSleep; - m_gravity = gravity; - - m_flags = e_clearForces; - - m_inv_dt0 = 0.0f; - - m_contactManager.m_allocator = &m_blockAllocator; -} - -b2World::~b2World() -{ -} - -void b2World::SetDestructionListener(b2DestructionListener* listener) -{ - m_destructionListener = listener; -} - -void b2World::SetContactFilter(b2ContactFilter* filter) -{ - m_contactManager.m_contactFilter = filter; -} - -void b2World::SetContactListener(b2ContactListener* listener) -{ - m_contactManager.m_contactListener = listener; -} - -void b2World::SetDebugDraw(b2DebugDraw* debugDraw) -{ - m_debugDraw = debugDraw; -} - -b2Body* b2World::CreateBody(const b2BodyDef* def) -{ - b2Assert(IsLocked() == false); - if (IsLocked()) - { - return NULL; - } - - void* mem = m_blockAllocator.Allocate(sizeof(b2Body)); - b2Body* b = new (mem) b2Body(def, this); - - // Add to world doubly linked list. - b->m_prev = NULL; - b->m_next = m_bodyList; - if (m_bodyList) - { - m_bodyList->m_prev = b; - } - m_bodyList = b; - ++m_bodyCount; - - return b; -} - -void b2World::DestroyBody(b2Body* b) -{ - b2Assert(m_bodyCount > 0); - b2Assert(IsLocked() == false); - if (IsLocked()) - { - return; - } - - // Delete the attached joints. - b2JointEdge* je = b->m_jointList; - while (je) - { - b2JointEdge* je0 = je; - je = je->next; - - if (m_destructionListener) - { - m_destructionListener->SayGoodbye(je0->joint); - } - - DestroyJoint(je0->joint); - } - b->m_jointList = NULL; - - // Delete the attached contacts. - b2ContactEdge* ce = b->m_contactList; - while (ce) - { - b2ContactEdge* ce0 = ce; - ce = ce->next; - m_contactManager.Destroy(ce0->contact); - } - b->m_contactList = NULL; - - // Delete the attached fixtures. This destroys broad-phase proxies. - b2Fixture* f = b->m_fixtureList; - while (f) - { - b2Fixture* f0 = f; - f = f->m_next; - - if (m_destructionListener) - { - m_destructionListener->SayGoodbye(f0); - } - - f0->DestroyProxy(&m_contactManager.m_broadPhase); - f0->Destroy(&m_blockAllocator); - f0->~b2Fixture(); - m_blockAllocator.Free(f0, sizeof(b2Fixture)); - } - b->m_fixtureList = NULL; - b->m_fixtureCount = 0; - - // Remove world body list. - if (b->m_prev) - { - b->m_prev->m_next = b->m_next; - } - - if (b->m_next) - { - b->m_next->m_prev = b->m_prev; - } - - if (b == m_bodyList) - { - m_bodyList = b->m_next; - } - - --m_bodyCount; - b->~b2Body(); - m_blockAllocator.Free(b, sizeof(b2Body)); -} - -b2Joint* b2World::CreateJoint(const b2JointDef* def) -{ - b2Assert(IsLocked() == false); - if (IsLocked()) - { - return NULL; - } - - b2Joint* j = b2Joint::Create(def, &m_blockAllocator); - - // Connect to the world list. - j->m_prev = NULL; - j->m_next = m_jointList; - if (m_jointList) - { - m_jointList->m_prev = j; - } - m_jointList = j; - ++m_jointCount; - - // Connect to the bodies' doubly linked lists. - j->m_edgeA.joint = j; - j->m_edgeA.other = j->m_bodyB; - j->m_edgeA.prev = NULL; - j->m_edgeA.next = j->m_bodyA->m_jointList; - if (j->m_bodyA->m_jointList) j->m_bodyA->m_jointList->prev = &j->m_edgeA; - j->m_bodyA->m_jointList = &j->m_edgeA; - - j->m_edgeB.joint = j; - j->m_edgeB.other = j->m_bodyA; - j->m_edgeB.prev = NULL; - j->m_edgeB.next = j->m_bodyB->m_jointList; - if (j->m_bodyB->m_jointList) j->m_bodyB->m_jointList->prev = &j->m_edgeB; - j->m_bodyB->m_jointList = &j->m_edgeB; - - b2Body* bodyA = def->bodyA; - b2Body* bodyB = def->bodyB; - - // If the joint prevents collisions, then flag any contacts for filtering. - if (def->collideConnected == false) - { - b2ContactEdge* edge = bodyB->GetContactList(); - while (edge) - { - if (edge->other == bodyA) - { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge->contact->FlagForFiltering(); - } - - edge = edge->next; - } - } - - // Note: creating a joint doesn't wake the bodies. - - return j; -} - -void b2World::DestroyJoint(b2Joint* j) -{ - b2Assert(IsLocked() == false); - if (IsLocked()) - { - return; - } - - bool collideConnected = j->m_collideConnected; - - // Remove from the doubly linked list. - if (j->m_prev) - { - j->m_prev->m_next = j->m_next; - } - - if (j->m_next) - { - j->m_next->m_prev = j->m_prev; - } - - if (j == m_jointList) - { - m_jointList = j->m_next; - } - - // Disconnect from island graph. - b2Body* bodyA = j->m_bodyA; - b2Body* bodyB = j->m_bodyB; - - // Wake up connected bodies. - bodyA->SetAwake(true); - bodyB->SetAwake(true); - - // Remove from body 1. - if (j->m_edgeA.prev) - { - j->m_edgeA.prev->next = j->m_edgeA.next; - } - - if (j->m_edgeA.next) - { - j->m_edgeA.next->prev = j->m_edgeA.prev; - } - - if (&j->m_edgeA == bodyA->m_jointList) - { - bodyA->m_jointList = j->m_edgeA.next; - } - - j->m_edgeA.prev = NULL; - j->m_edgeA.next = NULL; - - // Remove from body 2 - if (j->m_edgeB.prev) - { - j->m_edgeB.prev->next = j->m_edgeB.next; - } - - if (j->m_edgeB.next) - { - j->m_edgeB.next->prev = j->m_edgeB.prev; - } - - if (&j->m_edgeB == bodyB->m_jointList) - { - bodyB->m_jointList = j->m_edgeB.next; - } - - j->m_edgeB.prev = NULL; - j->m_edgeB.next = NULL; - - b2Joint::Destroy(j, &m_blockAllocator); - - b2Assert(m_jointCount > 0); - --m_jointCount; - - // If the joint prevents collisions, then flag any contacts for filtering. - if (collideConnected == false) - { - b2ContactEdge* edge = bodyB->GetContactList(); - while (edge) - { - if (edge->other == bodyA) - { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge->contact->FlagForFiltering(); - } - - edge = edge->next; - } - } -} - -// Find islands, integrate and solve constraints, solve position constraints -void b2World::Solve(const b2TimeStep& step) -{ - // Size the island for the worst case. - b2Island island(m_bodyCount, - m_contactManager.m_contactCount, - m_jointCount, - &m_stackAllocator, - m_contactManager.m_contactListener); - - // Clear all the island flags. - for (b2Body* b = m_bodyList; b; b = b->m_next) - { - b->m_flags &= ~b2Body::e_islandFlag; - } - for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) - { - c->m_flags &= ~b2Contact::e_islandFlag; - } - for (b2Joint* j = m_jointList; j; j = j->m_next) - { - j->m_islandFlag = false; - } - - // Build and simulate all awake islands. - int32 stackSize = m_bodyCount; - b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); - for (b2Body* seed = m_bodyList; seed; seed = seed->m_next) - { - if (seed->m_flags & b2Body::e_islandFlag) - { - continue; - } - - if (seed->IsAwake() == false || seed->IsActive() == false) - { - continue; - } - - // The seed can be dynamic or kinematic. - if (seed->GetType() == b2_staticBody) - { - continue; - } - - // Reset island and stack. - island.Clear(); - int32 stackCount = 0; - stack[stackCount++] = seed; - seed->m_flags |= b2Body::e_islandFlag; - - // Perform a depth first search (DFS) on the constraint graph. - while (stackCount > 0) - { - // Grab the next body off the stack and add it to the island. - b2Body* b = stack[--stackCount]; - b2Assert(b->IsActive() == true); - island.Add(b); - - // Make sure the body is awake. - b->SetAwake(true); - - // To keep islands as small as possible, we don't - // propagate islands across static bodies. - if (b->GetType() == b2_staticBody) - { - continue; - } - - // Search all contacts connected to this body. - for (b2ContactEdge* ce = b->m_contactList; ce; ce = ce->next) - { - b2Contact* contact = ce->contact; - - // Has this contact already been added to an island? - if (contact->m_flags & b2Contact::e_islandFlag) - { - continue; - } - - // Is this contact solid and touching? - if (contact->IsEnabled() == false || - contact->IsTouching() == false) - { - continue; - } - - // Skip sensors. - bool sensorA = contact->m_fixtureA->m_isSensor; - bool sensorB = contact->m_fixtureB->m_isSensor; - if (sensorA || sensorB) - { - continue; - } - - island.Add(contact); - contact->m_flags |= b2Contact::e_islandFlag; - - b2Body* other = ce->other; - - // Was the other body already added to this island? - if (other->m_flags & b2Body::e_islandFlag) - { - continue; - } - - b2Assert(stackCount < stackSize); - stack[stackCount++] = other; - other->m_flags |= b2Body::e_islandFlag; - } - - // Search all joints connect to this body. - for (b2JointEdge* je = b->m_jointList; je; je = je->next) - { - if (je->joint->m_islandFlag == true) - { - continue; - } - - b2Body* other = je->other; - - // Don't simulate joints connected to inactive bodies. - if (other->IsActive() == false) - { - continue; - } - - island.Add(je->joint); - je->joint->m_islandFlag = true; - - if (other->m_flags & b2Body::e_islandFlag) - { - continue; - } - - b2Assert(stackCount < stackSize); - stack[stackCount++] = other; - other->m_flags |= b2Body::e_islandFlag; - } - } - - island.Solve(step, m_gravity, m_allowSleep); - - // Post solve cleanup. - for (int32 i = 0; i < island.m_bodyCount; ++i) - { - // Allow static bodies to participate in other islands. - b2Body* b = island.m_bodies[i]; - if (b->GetType() == b2_staticBody) - { - b->m_flags &= ~b2Body::e_islandFlag; - } - } - } - - m_stackAllocator.Free(stack); - - // Synchronize fixtures, check for out of range bodies. - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - // If a body was not in an island then it did not move. - if ((b->m_flags & b2Body::e_islandFlag) == 0) - { - continue; - } - - if (b->GetType() == b2_staticBody) - { - continue; - } - - // Update fixtures (for broad-phase). - b->SynchronizeFixtures(); - } - - // Look for new contacts. - m_contactManager.FindNewContacts(); -} - -// Advance a dynamic body to its first time of contact -// and adjust the position to ensure clearance. -void b2World::SolveTOI(b2Body* body) -{ - // Find the minimum contact. - b2Contact* toiContact = NULL; - float32 toi = 1.0f; - b2Body* toiOther = NULL; - bool found; - int32 count; - int32 iter = 0; - - bool bullet = body->IsBullet(); - - // Iterate until all contacts agree on the minimum TOI. We have - // to iterate because the TOI algorithm may skip some intermediate - // collisions when objects rotate through each other. - do - { - count = 0; - found = false; - for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) - { - if (ce->contact == toiContact) - { - continue; - } - - b2Body* other = ce->other; - b2BodyType type = other->GetType(); - - // Only bullets perform TOI with dynamic bodies. - if (bullet == true) - { - // Bullets only perform TOI with bodies that have their TOI resolved. - if ((other->m_flags & b2Body::e_toiFlag) == 0) - { - continue; - } - - // No repeated hits on non-static bodies - if (type != b2_staticBody && (ce->contact->m_flags & b2Contact::e_bulletHitFlag) != 0) - { - continue; - } - } - else if (type == b2_dynamicBody) - { - continue; - } - - // Check for a disabled contact. - b2Contact* contact = ce->contact; - if (contact->IsEnabled() == false) - { - continue; - } - - // Prevent infinite looping. - if (contact->m_toiCount > 10) - { - continue; - } - - b2Fixture* fixtureA = contact->m_fixtureA; - b2Fixture* fixtureB = contact->m_fixtureB; - - // Cull sensors. - if (fixtureA->IsSensor() || fixtureB->IsSensor()) - { - continue; - } - - b2Body* bodyA = fixtureA->m_body; - b2Body* bodyB = fixtureB->m_body; - - // Compute the time of impact in interval [0, minTOI] - b2TOIInput input; - input.proxyA.Set(fixtureA->GetShape()); - input.proxyB.Set(fixtureB->GetShape()); - input.sweepA = bodyA->m_sweep; - input.sweepB = bodyB->m_sweep; - input.tMax = toi; - - b2TOIOutput output; - b2TimeOfImpact(&output, &input); - - if (output.state == b2TOIOutput::e_touching && output.t < toi) - { - toiContact = contact; - toi = output.t; - toiOther = other; - found = true; - } - - ++count; - } - - ++iter; - } while (found && count > 1 && iter < 50); - - if (toiContact == NULL) - { - body->Advance(1.0f); - return; - } - - b2Sweep backup = body->m_sweep; - body->Advance(toi); - toiContact->Update(m_contactManager.m_contactListener); - if (toiContact->IsEnabled() == false) - { - // Contact disabled. Backup and recurse. - body->m_sweep = backup; - SolveTOI(body); - } - - ++toiContact->m_toiCount; - - // Update all the valid contacts on this body and build a contact island. - b2Contact* contacts[b2_maxTOIContacts]; - count = 0; - for (b2ContactEdge* ce = body->m_contactList; ce && count < b2_maxTOIContacts; ce = ce->next) - { - b2Body* other = ce->other; - b2BodyType type = other->GetType(); - - // Only perform correction with static bodies, so the - // body won't get pushed out of the world. - if (type == b2_dynamicBody) - { - continue; - } - - // Check for a disabled contact. - b2Contact* contact = ce->contact; - if (contact->IsEnabled() == false) - { - continue; - } - - b2Fixture* fixtureA = contact->m_fixtureA; - b2Fixture* fixtureB = contact->m_fixtureB; - - // Cull sensors. - if (fixtureA->IsSensor() || fixtureB->IsSensor()) - { - continue; - } - - // The contact likely has some new contact points. The listener - // gives the user a chance to disable the contact. - if (contact != toiContact) - { - contact->Update(m_contactManager.m_contactListener); - } - - // Did the user disable the contact? - if (contact->IsEnabled() == false) - { - // Skip this contact. - continue; - } - - if (contact->IsTouching() == false) - { - continue; - } - - contacts[count] = contact; - ++count; - } - - // Reduce the TOI body's overlap with the contact island. - b2TOISolver solver(&m_stackAllocator); - solver.Initialize(contacts, count, body); - - const float32 k_toiBaumgarte = 0.75f; - bool solved = false; - for (int32 i = 0; i < 20; ++i) - { - bool contactsOkay = solver.Solve(k_toiBaumgarte); - if (contactsOkay) - { - solved = true; - break; - } - } - - if (toiOther->GetType() != b2_staticBody) - { - toiContact->m_flags |= b2Contact::e_bulletHitFlag; - } -} - -// Sequentially solve TOIs for each body. We bring each -// body to the time of contact and perform some position correction. -// Time is not conserved. -void b2World::SolveTOI() -{ - // Prepare all contacts. - for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) - { - // Enable the contact - c->m_flags |= b2Contact::e_enabledFlag; - - // Set the number of TOI events for this contact to zero. - c->m_toiCount = 0; - } - - // Initialize the TOI flag. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - // Kinematic, and static bodies will not be affected by the TOI event. - // If a body was not in an island then it did not move. - if ((body->m_flags & b2Body::e_islandFlag) == 0 || body->GetType() == b2_kinematicBody || body->GetType() == b2_staticBody) - { - body->m_flags |= b2Body::e_toiFlag; - } - else - { - body->m_flags &= ~b2Body::e_toiFlag; - } - } - - // Collide non-bullets. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - if (body->m_flags & b2Body::e_toiFlag) - { - continue; - } - - if (body->IsBullet() == true) - { - continue; - } - - SolveTOI(body); - - body->m_flags |= b2Body::e_toiFlag; - } - - // Collide bullets. - for (b2Body* body = m_bodyList; body; body = body->m_next) - { - if (body->m_flags & b2Body::e_toiFlag) - { - continue; - } - - if (body->IsBullet() == false) - { - continue; - } - - SolveTOI(body); - - body->m_flags |= b2Body::e_toiFlag; - } -} - -void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations) -{ - // If new fixtures were added, we need to find the new contacts. - if (m_flags & e_newFixture) - { - m_contactManager.FindNewContacts(); - m_flags &= ~e_newFixture; - } - - m_flags |= e_locked; - - b2TimeStep step; - step.dt = dt; - step.velocityIterations = velocityIterations; - step.positionIterations = positionIterations; - if (dt > 0.0f) - { - step.inv_dt = 1.0f / dt; - } - else - { - step.inv_dt = 0.0f; - } - - step.dtRatio = m_inv_dt0 * dt; - - step.warmStarting = m_warmStarting; - - // Update contacts. This is where some contacts are destroyed. - m_contactManager.Collide(); - - // Integrate velocities, solve velocity constraints, and integrate positions. - if (step.dt > 0.0f) - { - Solve(step); - } - - // Handle TOI events. - if (m_continuousPhysics && step.dt > 0.0f) - { - SolveTOI(); - } - - if (step.dt > 0.0f) - { - m_inv_dt0 = step.inv_dt; - } - - if (m_flags & e_clearForces) - { - ClearForces(); - } - - m_flags &= ~e_locked; -} - -void b2World::ClearForces() -{ - for (b2Body* body = m_bodyList; body; body = body->GetNext()) - { - body->m_force.SetZero(); - body->m_torque = 0.0f; - } -} - -struct b2WorldQueryWrapper -{ - bool QueryCallback(int32 proxyId) - { - b2Fixture* fixture = (b2Fixture*)broadPhase->GetUserData(proxyId); - return callback->ReportFixture(fixture); - } - - const b2BroadPhase* broadPhase; - b2QueryCallback* callback; -}; - -void b2World::QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const -{ - b2WorldQueryWrapper wrapper; - wrapper.broadPhase = &m_contactManager.m_broadPhase; - wrapper.callback = callback; - m_contactManager.m_broadPhase.Query(&wrapper, aabb); -} - -struct b2WorldRayCastWrapper -{ - float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) - { - void* userData = broadPhase->GetUserData(proxyId); - b2Fixture* fixture = (b2Fixture*)userData; - b2RayCastOutput output; - bool hit = fixture->RayCast(&output, input); - - if (hit) - { - float32 fraction = output.fraction; - b2Vec2 point = (1.0f - fraction) * input.p1 + fraction * input.p2; - return callback->ReportFixture(fixture, point, output.normal, fraction); - } - - return input.maxFraction; - } - - const b2BroadPhase* broadPhase; - b2RayCastCallback* callback; -}; - -void b2World::RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const -{ - b2WorldRayCastWrapper wrapper; - wrapper.broadPhase = &m_contactManager.m_broadPhase; - wrapper.callback = callback; - b2RayCastInput input; - input.maxFraction = 1.0f; - input.p1 = point1; - input.p2 = point2; - m_contactManager.m_broadPhase.RayCast(&wrapper, input); -} - -void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color& color) -{ - switch (fixture->GetType()) - { - case b2Shape::e_circle: - { - b2CircleShape* circle = (b2CircleShape*)fixture->GetShape(); - - b2Vec2 center = b2Mul(xf, circle->m_p); - float32 radius = circle->m_radius; - b2Vec2 axis = xf.R.col1; - - m_debugDraw->DrawSolidCircle(center, radius, axis, color); - } - break; - - case b2Shape::e_polygon: - { - b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); - int32 vertexCount = poly->m_vertexCount; - b2Assert(vertexCount <= b2_maxPolygonVertices); - b2Vec2 vertices[b2_maxPolygonVertices]; - - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, poly->m_vertices[i]); - } - - m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); - } - break; - } -} - -void b2World::DrawJoint(b2Joint* joint) -{ - b2Body* bodyA = joint->GetBodyA(); - b2Body* bodyB = joint->GetBodyB(); - const b2Transform& xf1 = bodyA->GetTransform(); - const b2Transform& xf2 = bodyB->GetTransform(); - b2Vec2 x1 = xf1.position; - b2Vec2 x2 = xf2.position; - b2Vec2 p1 = joint->GetAnchorA(); - b2Vec2 p2 = joint->GetAnchorB(); - - b2Color color(0.5f, 0.8f, 0.8f); - - switch (joint->GetType()) - { - case e_distanceJoint: - m_debugDraw->DrawSegment(p1, p2, color); - break; - - case e_pulleyJoint: - { - b2PulleyJoint* pulley = (b2PulleyJoint*)joint; - b2Vec2 s1 = pulley->GetGroundAnchorA(); - b2Vec2 s2 = pulley->GetGroundAnchorB(); - m_debugDraw->DrawSegment(s1, p1, color); - m_debugDraw->DrawSegment(s2, p2, color); - m_debugDraw->DrawSegment(s1, s2, color); - } - break; - - case e_mouseJoint: - // don't draw this - break; - - default: - m_debugDraw->DrawSegment(x1, p1, color); - m_debugDraw->DrawSegment(p1, p2, color); - m_debugDraw->DrawSegment(x2, p2, color); - } -} - -void b2World::DrawDebugData() -{ - if (m_debugDraw == NULL) - { - return; - } - - uint32 flags = m_debugDraw->GetFlags(); - - if (flags & b2DebugDraw::e_shapeBit) - { - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - const b2Transform& xf = b->GetTransform(); - for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) - { - if (b->IsActive() == false) - { - DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.3f)); - } - else if (b->GetType() == b2_staticBody) - { - DrawShape(f, xf, b2Color(0.5f, 0.9f, 0.5f)); - } - else if (b->GetType() == b2_kinematicBody) - { - DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.9f)); - } - else if (b->IsAwake() == false) - { - DrawShape(f, xf, b2Color(0.6f, 0.6f, 0.6f)); - } - else - { - DrawShape(f, xf, b2Color(0.9f, 0.7f, 0.7f)); - } - } - } - } - - if (flags & b2DebugDraw::e_jointBit) - { - for (b2Joint* j = m_jointList; j; j = j->GetNext()) - { - DrawJoint(j); - } - } - - if (flags & b2DebugDraw::e_pairBit) - { - b2Color color(0.3f, 0.9f, 0.9f); - for (b2Contact* c = m_contactManager.m_contactList; c; c = c->GetNext()) - { - b2Fixture* fixtureA = c->GetFixtureA(); - b2Fixture* fixtureB = c->GetFixtureB(); - - b2Vec2 cA = fixtureA->GetAABB().GetCenter(); - b2Vec2 cB = fixtureB->GetAABB().GetCenter(); - - m_debugDraw->DrawSegment(cA, cB, color); - } - } - - if (flags & b2DebugDraw::e_aabbBit) - { - b2Color color(0.9f, 0.3f, 0.9f); - b2BroadPhase* bp = &m_contactManager.m_broadPhase; - - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - if (b->IsActive() == false) - { - continue; - } - - for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) - { - b2AABB aabb = bp->GetFatAABB(f->m_proxyId); - b2Vec2 vs[4]; - vs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y); - vs[1].Set(aabb.upperBound.x, aabb.lowerBound.y); - vs[2].Set(aabb.upperBound.x, aabb.upperBound.y); - vs[3].Set(aabb.lowerBound.x, aabb.upperBound.y); - - m_debugDraw->DrawPolygon(vs, 4, color); - } - } - } - - if (flags & b2DebugDraw::e_centerOfMassBit) - { - for (b2Body* b = m_bodyList; b; b = b->GetNext()) - { - b2Transform xf = b->GetTransform(); - xf.position = b->GetWorldCenter(); - m_debugDraw->DrawTransform(xf); - } - } -} - -int32 b2World::GetProxyCount() const -{ - return m_contactManager.m_broadPhase.GetProxyCount(); -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.h deleted file mode 100644 index 1c57b159e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2World.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_WORLD_H -#define B2_WORLD_H - -#include -#include -#include -#include -#include - -struct b2AABB; -struct b2BodyDef; -struct b2JointDef; -struct b2TimeStep; -class b2Body; -class b2Fixture; -class b2Joint; - -/// The world class manages all physics entities, dynamic simulation, -/// and asynchronous queries. The world also contains efficient memory -/// management facilities. -class b2World -{ -public: - /// Construct a world object. - /// @param gravity the world gravity vector. - /// @param doSleep improve performance by not simulating inactive bodies. - b2World(const b2Vec2& gravity, bool doSleep); - - /// Destruct the world. All physics entities are destroyed and all heap memory is released. - ~b2World(); - - /// Register a destruction listener. The listener is owned by you and must - /// remain in scope. - void SetDestructionListener(b2DestructionListener* listener); - - /// Register a contact filter to provide specific control over collision. - /// Otherwise the default filter is used (b2_defaultFilter). The listener is - /// owned by you and must remain in scope. - void SetContactFilter(b2ContactFilter* filter); - - /// Register a contact event listener. The listener is owned by you and must - /// remain in scope. - void SetContactListener(b2ContactListener* listener); - - /// Register a routine for debug drawing. The debug draw functions are called - /// inside with b2World::DrawDebugData method. The debug draw object is owned - /// by you and must remain in scope. - void SetDebugDraw(b2DebugDraw* debugDraw); - - /// Create a rigid body given a definition. No reference to the definition - /// is retained. - /// @warning This function is locked during callbacks. - b2Body* CreateBody(const b2BodyDef* def); - - /// Destroy a rigid body given a definition. No reference to the definition - /// is retained. This function is locked during callbacks. - /// @warning This automatically deletes all associated shapes and joints. - /// @warning This function is locked during callbacks. - void DestroyBody(b2Body* body); - - /// Create a joint to constrain bodies together. No reference to the definition - /// is retained. This may cause the connected bodies to cease colliding. - /// @warning This function is locked during callbacks. - b2Joint* CreateJoint(const b2JointDef* def); - - /// Destroy a joint. This may cause the connected bodies to begin colliding. - /// @warning This function is locked during callbacks. - void DestroyJoint(b2Joint* joint); - - /// Take a time step. This performs collision detection, integration, - /// and constraint solution. - /// @param timeStep the amount of time to simulate, this should not vary. - /// @param velocityIterations for the velocity constraint solver. - /// @param positionIterations for the position constraint solver. - void Step( float32 timeStep, - int32 velocityIterations, - int32 positionIterations); - - /// Call this after you are done with time steps to clear the forces. You normally - /// call this after each call to Step, unless you are performing sub-steps. By default, - /// forces will be automatically cleared, so you don't need to call this function. - /// @see SetAutoClearForces - void ClearForces(); - - /// Call this to draw shapes and other debug draw data. - void DrawDebugData(); - - /// Query the world for all fixtures that potentially overlap the - /// provided AABB. - /// @param callback a user implemented callback class. - /// @param aabb the query box. - void QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const; - - /// Ray-cast the world for all fixtures in the path of the ray. Your callback - /// controls whether you get the closest point, any point, or n-points. - /// The ray-cast ignores shapes that contain the starting point. - /// @param callback a user implemented callback class. - /// @param point1 the ray starting point - /// @param point2 the ray ending point - void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const; - - /// Get the world body list. With the returned body, use b2Body::GetNext to get - /// the next body in the world list. A NULL body indicates the end of the list. - /// @return the head of the world body list. - b2Body* GetBodyList(); - - /// Get the world joint list. With the returned joint, use b2Joint::GetNext to get - /// the next joint in the world list. A NULL joint indicates the end of the list. - /// @return the head of the world joint list. - b2Joint* GetJointList(); - - /// Get the world contact list. With the returned contact, use b2Contact::GetNext to get - /// the next contact in the world list. A NULL contact indicates the end of the list. - /// @return the head of the world contact list. - /// @warning contacts are - b2Contact* GetContactList(); - - /// Enable/disable warm starting. For testing. - void SetWarmStarting(bool flag) { m_warmStarting = flag; } - - /// Enable/disable continuous physics. For testing. - void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } - - /// Get the number of broad-phase proxies. - int32 GetProxyCount() const; - - /// Get the number of bodies. - int32 GetBodyCount() const; - - /// Get the number of joints. - int32 GetJointCount() const; - - /// Get the number of contacts (each may have 0 or more contact points). - int32 GetContactCount() const; - - /// Change the global gravity vector. - void SetGravity(const b2Vec2& gravity); - - /// Get the global gravity vector. - b2Vec2 GetGravity() const; - - /// Is the world locked (in the middle of a time step). - bool IsLocked() const; - - /// Set flag to control automatic clearing of forces after each time step. - void SetAutoClearForces(bool flag); - - /// Get the flag that controls automatic clearing of forces after each time step. - bool GetAutoClearForces() const; - -private: - - // m_flags - enum - { - e_newFixture = 0x0001, - e_locked = 0x0002, - e_clearForces = 0x0004, - }; - - friend class b2Body; - friend class b2ContactManager; - friend class b2Controller; - - void Solve(const b2TimeStep& step); - void SolveTOI(); - void SolveTOI(b2Body* body); - - void DrawJoint(b2Joint* joint); - void DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color); - - b2BlockAllocator m_blockAllocator; - b2StackAllocator m_stackAllocator; - - int32 m_flags; - - b2ContactManager m_contactManager; - - b2Body* m_bodyList; - b2Joint* m_jointList; - - int32 m_bodyCount; - int32 m_jointCount; - - b2Vec2 m_gravity; - bool m_allowSleep; - - b2Body* m_groundBody; - - b2DestructionListener* m_destructionListener; - b2DebugDraw* m_debugDraw; - - // This is used to compute the time step ratio to - // support a variable time step. - float32 m_inv_dt0; - - // This is for debugging the solver. - bool m_warmStarting; - - // This is for debugging the solver. - bool m_continuousPhysics; -}; - -inline b2Body* b2World::GetBodyList() -{ - return m_bodyList; -} - -inline b2Joint* b2World::GetJointList() -{ - return m_jointList; -} - -inline b2Contact* b2World::GetContactList() -{ - return m_contactManager.m_contactList; -} - -inline int32 b2World::GetBodyCount() const -{ - return m_bodyCount; -} - -inline int32 b2World::GetJointCount() const -{ - return m_jointCount; -} - -inline int32 b2World::GetContactCount() const -{ - return m_contactManager.m_contactCount; -} - -inline void b2World::SetGravity(const b2Vec2& gravity) -{ - m_gravity = gravity; -} - -inline b2Vec2 b2World::GetGravity() const -{ - return m_gravity; -} - -inline bool b2World::IsLocked() const -{ - return (m_flags & e_locked) == e_locked; -} - -inline void b2World::SetAutoClearForces(bool flag) -{ - if (flag) - { - m_flags |= e_clearForces; - } - else - { - m_flags &= ~e_clearForces; - } -} - -/// Get the flag that controls automatic clearing of forces after each time step. -inline bool b2World::GetAutoClearForces() const -{ - return (m_flags & e_clearForces) == e_clearForces; -} - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.cpp deleted file mode 100644 index 4cd44688d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include - -// Return true if contact calculations should be performed between these two shapes. -// If you implement your own collision filter you may want to build from this implementation. -bool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) -{ - const b2Filter& filterA = fixtureA->GetFilterData(); - const b2Filter& filterB = fixtureB->GetFilterData(); - - if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) - { - return filterA.groupIndex > 0; - } - - bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; - return collide; -} - -b2DebugDraw::b2DebugDraw() -{ - m_drawFlags = 0; -} - -void b2DebugDraw::SetFlags(uint32 flags) -{ - m_drawFlags = flags; -} - -uint32 b2DebugDraw::GetFlags() const -{ - return m_drawFlags; -} - -void b2DebugDraw::AppendFlags(uint32 flags) -{ - m_drawFlags |= flags; -} - -void b2DebugDraw::ClearFlags(uint32 flags) -{ - m_drawFlags &= ~flags; -} - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.h deleted file mode 100644 index 81c1438e5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/b2WorldCallbacks.h +++ /dev/null @@ -1,218 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_WORLD_CALLBACKS_H -#define B2_WORLD_CALLBACKS_H - -#include - -struct b2Vec2; -struct b2Transform; -class b2Fixture; -class b2Body; -class b2Joint; -class b2Contact; -struct b2ContactPoint; -struct b2ContactResult; -struct b2Manifold; - -/// Joints and fixtures are destroyed when their associated -/// body is destroyed. Implement this listener so that you -/// may nullify references to these joints and shapes. -class b2DestructionListener -{ -public: - virtual ~b2DestructionListener() {} - - /// Called when any joint is about to be destroyed due - /// to the destruction of one of its attached bodies. - virtual void SayGoodbye(b2Joint* joint) = 0; - - /// Called when any fixture is about to be destroyed due - /// to the destruction of its parent body. - virtual void SayGoodbye(b2Fixture* fixture) = 0; -}; - -/// Implement this class to provide collision filtering. In other words, you can implement -/// this class if you want finer control over contact creation. -class b2ContactFilter -{ -public: - virtual ~b2ContactFilter() {} - - /// Return true if contact calculations should be performed between these two shapes. - /// @warning for performance reasons this is only called when the AABBs begin to overlap. - virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); -}; - -/// Contact impulses for reporting. Impulses are used instead of forces because -/// sub-step forces may approach infinity for rigid body collisions. These -/// match up one-to-one with the contact points in b2Manifold. -struct b2ContactImpulse -{ - float32 normalImpulses[b2_maxManifoldPoints]; - float32 tangentImpulses[b2_maxManifoldPoints]; -}; - -/// Implement this class to get contact information. You can use these results for -/// things like sounds and game logic. You can also get contact results by -/// traversing the contact lists after the time step. However, you might miss -/// some contacts because continuous physics leads to sub-stepping. -/// Additionally you may receive multiple callbacks for the same contact in a -/// single time step. -/// You should strive to make your callbacks efficient because there may be -/// many callbacks per time step. -/// @warning You cannot create/destroy Box2D entities inside these callbacks. -class b2ContactListener -{ -public: - virtual ~b2ContactListener() {} - - /// Called when two fixtures begin to touch. - virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } - - /// Called when two fixtures cease to touch. - virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } - - /// This is called after a contact is updated. This allows you to inspect a - /// contact before it goes to the solver. If you are careful, you can modify the - /// contact manifold (e.g. disable contact). - /// A copy of the old manifold is provided so that you can detect changes. - /// Note: this is called only for awake bodies. - /// Note: this is called even when the number of contact points is zero. - /// Note: this is not called for sensors. - /// Note: if you set the number of contact points to zero, you will not - /// get an EndContact callback. However, you may get a BeginContact callback - /// the next step. - virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - B2_NOT_USED(contact); - B2_NOT_USED(oldManifold); - } - - /// This lets you inspect a contact after the solver is finished. This is useful - /// for inspecting impulses. - /// Note: the contact manifold does not include time of impact impulses, which can be - /// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly - /// in a separate data structure. - /// Note: this is only called for contacts that are touching, solid, and awake. - virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - B2_NOT_USED(contact); - B2_NOT_USED(impulse); - } -}; - -/// Callback class for AABB queries. -/// See b2World::Query -class b2QueryCallback -{ -public: - virtual ~b2QueryCallback() {} - - /// Called for each fixture found in the query AABB. - /// @return false to terminate the query. - virtual bool ReportFixture(b2Fixture* fixture) = 0; -}; - -/// Callback class for ray casts. -/// See b2World::RayCast -class b2RayCastCallback -{ -public: - virtual ~b2RayCastCallback() {} - - /// Called for each fixture found in the query. You control how the ray cast - /// proceeds by returning a float: - /// return -1: ignore this fixture and continue - /// return 0: terminate the ray cast - /// return fraction: clip the ray to this point - /// return 1: don't clip the ray and continue - /// @param fixture the fixture hit by the ray - /// @param point the point of initial intersection - /// @param normal the normal vector at the point of intersection - /// @return -1 to filter, 0 to terminate, fraction to clip the ray for - /// closest hit, 1 to continue - virtual float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) = 0; -}; - -/// Color for debug drawing. Each value has the range [0,1]. -struct b2Color -{ - b2Color() {} - b2Color(float32 r, float32 g, float32 b) : r(r), g(g), b(b) {} - void Set(float32 ri, float32 gi, float32 bi) { r = ri; g = gi; b = bi; } - float32 r, g, b; -}; - -/// Implement and register this class with a b2World to provide debug drawing of physics -/// entities in your game. -class b2DebugDraw -{ -public: - b2DebugDraw(); - - virtual ~b2DebugDraw() {} - - enum - { - e_shapeBit = 0x0001, ///< draw shapes - e_jointBit = 0x0002, ///< draw joint connections - e_aabbBit = 0x0004, ///< draw axis aligned bounding boxes - e_pairBit = 0x0008, ///< draw broad-phase pairs - e_centerOfMassBit = 0x0010, ///< draw center of mass frame - }; - - /// Set the drawing flags. - void SetFlags(uint32 flags); - - /// Get the drawing flags. - uint32 GetFlags() const; - - /// Append flags to the current flags. - void AppendFlags(uint32 flags); - - /// Clear flags from the current flags. - void ClearFlags(uint32 flags); - - /// Draw a closed polygon provided in CCW order. - virtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; - - /// Draw a solid closed polygon provided in CCW order. - virtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; - - /// Draw a circle. - virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) = 0; - - /// Draw a solid circle. - virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0; - - /// Draw a line segment. - virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0; - - /// Draw a transform. Choose your own length scale. - /// @param xf a transform. - virtual void DrawTransform(const b2Transform& xf) = 0; - -protected: - uint32 m_drawFlags; -}; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Build/Readme.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/Build/Readme.txt deleted file mode 100644 index f28e90b3b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Build/Readme.txt +++ /dev/null @@ -1 +0,0 @@ -You should use CMake to target this directory for build files. \ No newline at end of file diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Building.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/Building.txt deleted file mode 100644 index e29040349..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Building.txt +++ /dev/null @@ -1,21 +0,0 @@ -Box2D uses CMake to describe the build in a platform independent manner. - -First download and install cmake from cmake.org - -For Microsoft Visual Studio: -- Run the cmake-gui -- Set the source directory to the path of Box2D on your PC (the folder that contains this file). -- Set the build directory to be the path of Box2D/Build on your PC. -- Press the Configure button and select your version of Visual Studio. -- You may have to press the Configure button again. -- Press the Generate button. -- Open Box2D/Build/Box2D.sln. -- Set the Testbed or HelloWorld as your startup project. -- Press F5 or Ctrl-F5 to run. - -For Unix platforms, say the following on a terminal: (Replace $BOX2DPATH with the directory where this file is located.) - cd $BOX2DPATH/Build - cmake -DBOX2D_INSTALL=ON -DBOX2D_BUILD_SHARED=ON .. - make - make install -You might want to add -DCMAKE_INSTALL_PREFIX=/opt/Box2D or similar to the cmake call to change the installation location. make install might need sudo. diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/CMakeLists.txt deleted file mode 100644 index a8ad5507e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -cmake_minimum_required(VERSION 2.4) - -project(Box2D) - -if(UNIX) - set(BOX2D_INSTALL_BY_DEFAULT ON) -else(UNIX) - set(BOX2D_INSTALL_BY_DEFAULT OFF) -endif(UNIX) - -option(BOX2D_INSTALL "Install Box2D libs, includes, and CMake scripts" ${BOX2D_INSTALL_BY_DEFAULT}) -option(BOX2D_INSTALL_DOC "Install Box2D documentation" OFF) -option(BOX2D_BUILD_SHARED "Build Box2D shared libraries" OFF) -option(BOX2D_BUILD_STATIC "Build Box2D static libraries" ON) -option(BOX2D_BUILD_EXAMPLES "Build Box2D examples" ON) - -set(BOX2D_VERSION 2.1.0) - -# The Box2D library. -add_subdirectory(Box2D) - - -if(BOX2D_BUILD_EXAMPLES) - # HelloWorld console example. - add_subdirectory(HelloWorld) - - # Testbed and dependencies. - find_package(OpenGL REQUIRED) - add_subdirectory(freeglut) - add_subdirectory(glui) - add_subdirectory(Testbed) -endif(BOX2D_BUILD_EXAMPLES) - -if(BOX2D_INSTALL_DOC) - install(DIRECTORY Documentation DESTINATION share/doc/Box2D PATTERN ".svn" EXCLUDE) -endif(BOX2D_INSTALL_DOC) \ No newline at end of file diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/CMakeLists.txt deleted file mode 100644 index 484935ab8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Hello World examples -include_directories (${Box2D_SOURCE_DIR}) -add_executable(HelloWorld HelloWorld.cpp) -target_link_libraries (HelloWorld Box2D) diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/HelloWorld.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/HelloWorld.cpp deleted file mode 100644 index a7f92d683..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/HelloWorld/HelloWorld.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include - -#include - -// This is a simple example of building and running a simulation -// using Box2D. Here we create a large ground box and a small dynamic -// box. -// There are no graphics for this example. Box2D is meant to be used -// with your rendering engine in your game engine. -int main(int argc, char** argv) -{ - B2_NOT_USED(argc); - B2_NOT_USED(argv); - - // Define the gravity vector. - b2Vec2 gravity(0.0f, -10.0f); - - // Do we want to let bodies sleep? - bool doSleep = true; - - // Construct a world object, which will hold and simulate the rigid bodies. - b2World world(gravity, doSleep); - - // Define the ground body. - b2BodyDef groundBodyDef; - groundBodyDef.position.Set(0.0f, -10.0f); - - // Call the body factory which allocates memory for the ground body - // from a pool and creates the ground box shape (also from a pool). - // The body is also added to the world. - b2Body* groundBody = world.CreateBody(&groundBodyDef); - - // Define the ground box shape. - b2PolygonShape groundBox; - - // The extents are the half-widths of the box. - groundBox.SetAsBox(50.0f, 10.0f); - - // Add the ground fixture to the ground body. - groundBody->CreateFixture(&groundBox, 0.0f); - - // Define the dynamic body. We set its position and call the body factory. - b2BodyDef bodyDef; - bodyDef.type = b2_dynamicBody; - bodyDef.position.Set(0.0f, 4.0f); - b2Body* body = world.CreateBody(&bodyDef); - - // Define another box shape for our dynamic body. - b2PolygonShape dynamicBox; - dynamicBox.SetAsBox(1.0f, 1.0f); - - // Define the dynamic body fixture. - b2FixtureDef fixtureDef; - fixtureDef.shape = &dynamicBox; - - // Set the box density to be non-zero, so it will be dynamic. - fixtureDef.density = 1.0f; - - // Override the default friction. - fixtureDef.friction = 0.3f; - - // Add the shape to the body. - body->CreateFixture(&fixtureDef); - - // Prepare for simulation. Typically we use a time step of 1/60 of a - // second (60Hz) and 10 iterations. This provides a high quality simulation - // in most game scenarios. - float32 timeStep = 1.0f / 60.0f; - int32 velocityIterations = 6; - int32 positionIterations = 2; - - // This is our little game loop. - for (int32 i = 0; i < 60; ++i) - { - // Instruct the world to perform a single step of simulation. - // It is generally best to keep the time step and iterations fixed. - world.Step(timeStep, velocityIterations, positionIterations); - - // Clear applied body forces. We didn't apply any forces, but you - // should know about this function. - world.ClearForces(); - - // Now print the position and angle of the body. - b2Vec2 position = body->GetPosition(); - float32 angle = body->GetAngle(); - - printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle); - } - - // When the world destructor is called, all bodies and joints are freed. This can - // create orphaned pointers, so be careful about your world management. - - return 0; -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/License.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/License.txt deleted file mode 100644 index 8688346f6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/License.txt +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software -in a product, an acknowledgment in the product documentation would be -appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Readme.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/Readme.txt deleted file mode 100644 index 868276369..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -Box2D Version 2.1 - -Welcome to Box2D! - -Box2D is a 2D physics engine for games. - -For help with Box2D, please visit http://www.box2d.org. There is a forum there where you may post your questions. - -Please see Building.txt to learn how to build Box2D and run the testbed. - -To run the demos, set "Testbed" as your startup project and press F5. Some test bed commands are: -- 'r' to reset the current test -- SPACE to launch a bomb -- arrow keys to pan -- 'x' and 'z' to zoom in/out -- use the mouse to click and drag objects - -Erin Catto -http://www.box2d.org diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/CMakeLists.txt deleted file mode 100644 index 16d601b65..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/CMakeLists.txt +++ /dev/null @@ -1,81 +0,0 @@ -# Some flags for Freeglut and GLUI. -add_definitions( -DFREEGLUT_EXPORTS -DFREEGLUT_STATIC -D_CRT_SECURE_NO_WARNINGS ) - -# Define the framework files. -set(Testbed_Framework_SRCS - Framework/Main.cpp - Framework/Render.cpp - Framework/Render.h - Framework/Test.cpp - Framework/Test.h -) - -#define the test files. -set(Testbed_Tests_SRCS - Tests/TestEntries.cpp - Tests/ApplyForce.h - Tests/BodyTypes.h - Tests/Breakable.h - Tests/Bridge.h - Tests/Cantilever.h - Tests/Chain.h - Tests/CharacterCollision.h - Tests/CollisionFiltering.h - Tests/CollisionProcessing.h - Tests/CompoundShapes.h - Tests/Confined.h - Tests/ContinuousTest.h - Tests/DistanceTest.h - Tests/Dominos.h - Tests/DynamicTreeTest.h - Tests/EdgeShapes.h - Tests/Gears.h - Tests/LineJoint.h - Tests/OneSidedPlatform.h - Tests/PolyCollision.h - Tests/PolyShapes.h - Tests/Prismatic.h - Tests/Pulleys.h - Tests/Pyramid.h - Tests/RayCast.h - Tests/Revolute.h - Tests/SensorTest.h - Tests/ShapeEditing.h - Tests/SliderCrank.h - Tests/SphereStack.h - Tests/TheoJansen.h - Tests/TimeOfImpact.h - Tests/VaryingFriction.h - Tests/VaryingRestitution.h - Tests/VerticalStack.h - Tests/Web.h -) - -# These are used to create visual studio folders. -source_group(Framework FILES ${Testbed_Framework_SRCS}) -source_group(Tests FILES ${Testbed_Tests_SRCS}) - -include_directories ( - ${OPENGL_INCLUDE_DIR} - ${Box2D_SOURCE_DIR} -) - -if(APPLE) - # We are not using the Apple's framework version, but X11's - include_directories( /usr/X11/include ) - link_directories( /usr/X11/lib ) - set (OPENGL_LIBRARIES GL GLU GLUT X11) -endif(APPLE) - -add_executable(Testbed - ${Testbed_Framework_SRCS} - ${Testbed_Tests_SRCS} -) - -target_link_libraries ( - Testbed - Box2D - freeglut_static - glui - ${OPENGL_LIBRARIES} -) diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Main.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Main.cpp deleted file mode 100644 index 95f6c66a1..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Main.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "Render.h" -#include "Test.h" -#include "glui/GL/glui.h" - -#include - -namespace -{ - int32 testIndex = 0; - int32 testSelection = 0; - int32 testCount = 0; - TestEntry* entry; - Test* test; - Settings settings; - int32 width = 640; - int32 height = 480; - int32 framePeriod = 16; - int32 mainWindow; - float settingsHz = 60.0; - GLUI *glui; - float32 viewZoom = 1.0f; - b2Vec2 viewCenter(0.0f, 20.0f); - int tx, ty, tw, th; - bool rMouseDown; - b2Vec2 lastp; -} - -void Resize(int32 w, int32 h) -{ - width = w; - height = h; - - GLUI_Master.get_viewport_area(&tx, &ty, &tw, &th); - glViewport(tx, ty, tw, th); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - float32 ratio = float32(tw) / float32(th); - - b2Vec2 extents(ratio * 25.0f, 25.0f); - extents *= viewZoom; - - b2Vec2 lower = viewCenter - extents; - b2Vec2 upper = viewCenter + extents; - - // L/R/B/T - gluOrtho2D(lower.x, upper.x, lower.y, upper.y); -} - -b2Vec2 ConvertScreenToWorld(int32 x, int32 y) -{ - float32 u = x / float32(tw); - float32 v = (th - y) / float32(th); - - float32 ratio = float32(tw) / float32(th); - b2Vec2 extents(ratio * 25.0f, 25.0f); - extents *= viewZoom; - - b2Vec2 lower = viewCenter - extents; - b2Vec2 upper = viewCenter + extents; - - b2Vec2 p; - p.x = (1.0f - u) * lower.x + u * upper.x; - p.y = (1.0f - v) * lower.y + v * upper.y; - return p; -} - -// This is used to control the frame rate (60Hz). -void Timer(int) -{ - glutSetWindow(mainWindow); - glutPostRedisplay(); - glutTimerFunc(framePeriod, Timer, 0); -} - -void SimulationLoop() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - test->SetTextLine(30); - settings.hz = settingsHz; - test->Step(&settings); - - test->DrawTitle(5, 15, entry->name); - - glutSwapBuffers(); - - if (testSelection != testIndex) - { - testIndex = testSelection; - delete test; - entry = g_testEntries + testIndex; - test = entry->createFcn(); - viewZoom = 1.0f; - viewCenter.Set(0.0f, 20.0f); - Resize(width, height); - } -} - -void Keyboard(unsigned char key, int x, int y) -{ - B2_NOT_USED(x); - B2_NOT_USED(y); - - switch (key) - { - case 27: - exit(0); - break; - - // Press 'z' to zoom out. - case 'z': - viewZoom = b2Min(1.1f * viewZoom, 20.0f); - Resize(width, height); - break; - - // Press 'x' to zoom in. - case 'x': - viewZoom = b2Max(0.9f * viewZoom, 0.02f); - Resize(width, height); - break; - - // Press 'r' to reset. - case 'r': - delete test; - test = entry->createFcn(); - break; - - // Press space to launch a bomb. - case ' ': - if (test) - { - test->LaunchBomb(); - } - break; - - case 'p': - settings.pause = !settings.pause; - break; - - // Press [ to prev test. - case '[': - --testSelection; - if (testSelection < 0) - { - testSelection = testCount - 1; - } - glui->sync_live(); - break; - - // Press ] to next test. - case ']': - ++testSelection; - if (testSelection == testCount) - { - testSelection = 0; - } - glui->sync_live(); - break; - - default: - if (test) - { - test->Keyboard(key); - } - } -} - -void KeyboardSpecial(int key, int x, int y) -{ - B2_NOT_USED(x); - B2_NOT_USED(y); - - switch (key) - { - case GLUT_ACTIVE_SHIFT: - // Press left to pan left. - case GLUT_KEY_LEFT: - viewCenter.x -= 0.5f; - Resize(width, height); - break; - - // Press right to pan right. - case GLUT_KEY_RIGHT: - viewCenter.x += 0.5f; - Resize(width, height); - break; - - // Press down to pan down. - case GLUT_KEY_DOWN: - viewCenter.y -= 0.5f; - Resize(width, height); - break; - - // Press up to pan up. - case GLUT_KEY_UP: - viewCenter.y += 0.5f; - Resize(width, height); - break; - - // Press home to reset the view. - case GLUT_KEY_HOME: - viewZoom = 1.0f; - viewCenter.Set(0.0f, 20.0f); - Resize(width, height); - break; - } -} - -void Mouse(int32 button, int32 state, int32 x, int32 y) -{ - // Use the mouse to move things around. - if (button == GLUT_LEFT_BUTTON) - { - int mod = glutGetModifiers(); - b2Vec2 p = ConvertScreenToWorld(x, y); - if (state == GLUT_DOWN) - { - b2Vec2 p = ConvertScreenToWorld(x, y); - if (mod == GLUT_ACTIVE_SHIFT) - { - test->ShiftMouseDown(p); - } - else - { - test->MouseDown(p); - } - } - - if (state == GLUT_UP) - { - test->MouseUp(p); - } - } - else if (button == GLUT_RIGHT_BUTTON) - { - if (state == GLUT_DOWN) - { - lastp = ConvertScreenToWorld(x, y); - rMouseDown = true; - } - - if (state == GLUT_UP) - { - rMouseDown = false; - } - } -} - -void MouseMotion(int32 x, int32 y) -{ - b2Vec2 p = ConvertScreenToWorld(x, y); - test->MouseMove(p); - - if (rMouseDown) - { - b2Vec2 diff = p - lastp; - viewCenter.x -= diff.x; - viewCenter.y -= diff.y; - Resize(width, height); - lastp = ConvertScreenToWorld(x, y); - } -} - -void MouseWheel(int wheel, int direction, int x, int y) -{ - B2_NOT_USED(wheel); - B2_NOT_USED(x); - B2_NOT_USED(y); - if (direction > 0) - { - viewZoom /= 1.1f; - } - else - { - viewZoom *= 1.1f; - } - Resize(width, height); -} - -void Restart(int) -{ - delete test; - entry = g_testEntries + testIndex; - test = entry->createFcn(); - Resize(width, height); -} - -void Pause(int) -{ - settings.pause = !settings.pause; -} - -void SingleStep(int) -{ - settings.pause = 1; - settings.singleStep = 1; -} - -int main(int argc, char** argv) -{ - testCount = 0; - while (g_testEntries[testCount].createFcn != NULL) - { - ++testCount; - } - - testIndex = b2Clamp(testIndex, 0, testCount-1); - testSelection = testIndex; - - entry = g_testEntries + testIndex; - test = entry->createFcn(); - - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); - glutInitWindowSize(width, height); - char title[32]; - sprintf(title, "Box2D Version %d.%d.%d", b2_version.major, b2_version.minor, b2_version.revision); - mainWindow = glutCreateWindow(title); - //glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); - - glutDisplayFunc(SimulationLoop); - GLUI_Master.set_glutReshapeFunc(Resize); - GLUI_Master.set_glutKeyboardFunc(Keyboard); - GLUI_Master.set_glutSpecialFunc(KeyboardSpecial); - GLUI_Master.set_glutMouseFunc(Mouse); -#ifdef FREEGLUT - glutMouseWheelFunc(MouseWheel); -#endif - glutMotionFunc(MouseMotion); - - glui = GLUI_Master.create_glui_subwindow( mainWindow, - GLUI_SUBWINDOW_RIGHT ); - - glui->add_statictext("Tests"); - GLUI_Listbox* testList = - glui->add_listbox("", &testSelection); - - glui->add_separator(); - - GLUI_Spinner* velocityIterationSpinner = - glui->add_spinner("Vel Iters", GLUI_SPINNER_INT, &settings.velocityIterations); - velocityIterationSpinner->set_int_limits(1, 500); - - GLUI_Spinner* positionIterationSpinner = - glui->add_spinner("Pos Iters", GLUI_SPINNER_INT, &settings.positionIterations); - positionIterationSpinner->set_int_limits(0, 100); - - GLUI_Spinner* hertzSpinner = - glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &settingsHz); - - hertzSpinner->set_float_limits(5.0f, 200.0f); - - glui->add_checkbox("Warm Starting", &settings.enableWarmStarting); - glui->add_checkbox("Time of Impact", &settings.enableContinuous); - - //glui->add_separator(); - - GLUI_Panel* drawPanel = glui->add_panel("Draw"); - glui->add_checkbox_to_panel(drawPanel, "Shapes", &settings.drawShapes); - glui->add_checkbox_to_panel(drawPanel, "Joints", &settings.drawJoints); - glui->add_checkbox_to_panel(drawPanel, "AABBs", &settings.drawAABBs); - glui->add_checkbox_to_panel(drawPanel, "Pairs", &settings.drawPairs); - glui->add_checkbox_to_panel(drawPanel, "Contact Points", &settings.drawContactPoints); - glui->add_checkbox_to_panel(drawPanel, "Contact Normals", &settings.drawContactNormals); - glui->add_checkbox_to_panel(drawPanel, "Contact Forces", &settings.drawContactForces); - glui->add_checkbox_to_panel(drawPanel, "Friction Forces", &settings.drawFrictionForces); - glui->add_checkbox_to_panel(drawPanel, "Center of Masses", &settings.drawCOMs); - glui->add_checkbox_to_panel(drawPanel, "Statistics", &settings.drawStats); - - int32 testCount = 0; - TestEntry* e = g_testEntries; - while (e->createFcn) - { - testList->add_item(testCount, e->name); - ++testCount; - ++e; - } - - glui->add_button("Pause", 0, Pause); - glui->add_button("Single Step", 0, SingleStep); - glui->add_button("Restart", 0, Restart); - - glui->add_button("Quit", 0,(GLUI_Update_CB)exit); - glui->set_main_gfx_window( mainWindow ); - - // Use a timer to control the frame rate. - glutTimerFunc(framePeriod, Timer, 0); - - glutMainLoop(); - - return 0; -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.cpp deleted file mode 100644 index efd27d8f8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "Render.h" - -#include "freeglut/GL/glut.h" - -#include -#include - -#include - -void DebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) -{ - glColor3f(color.r, color.g, color.b); - glBegin(GL_LINE_LOOP); - for (int32 i = 0; i < vertexCount; ++i) - { - glVertex2f(vertices[i].x, vertices[i].y); - } - glEnd(); -} - -void DebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) -{ - glEnable(GL_BLEND); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4f(0.5f * color.r, 0.5f * color.g, 0.5f * color.b, 0.5f); - glBegin(GL_TRIANGLE_FAN); - for (int32 i = 0; i < vertexCount; ++i) - { - glVertex2f(vertices[i].x, vertices[i].y); - } - glEnd(); - glDisable(GL_BLEND); - - glColor4f(color.r, color.g, color.b, 1.0f); - glBegin(GL_LINE_LOOP); - for (int32 i = 0; i < vertexCount; ++i) - { - glVertex2f(vertices[i].x, vertices[i].y); - } - glEnd(); -} - -void DebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) -{ - const float32 k_segments = 16.0f; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - glColor3f(color.r, color.g, color.b); - glBegin(GL_LINE_LOOP); - for (int32 i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertex2f(v.x, v.y); - theta += k_increment; - } - glEnd(); -} - -void DebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) -{ - const float32 k_segments = 16.0f; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - glEnable(GL_BLEND); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4f(0.5f * color.r, 0.5f * color.g, 0.5f * color.b, 0.5f); - glBegin(GL_TRIANGLE_FAN); - for (int32 i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertex2f(v.x, v.y); - theta += k_increment; - } - glEnd(); - glDisable(GL_BLEND); - - theta = 0.0f; - glColor4f(color.r, color.g, color.b, 1.0f); - glBegin(GL_LINE_LOOP); - for (int32 i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertex2f(v.x, v.y); - theta += k_increment; - } - glEnd(); - - b2Vec2 p = center + radius * axis; - glBegin(GL_LINES); - glVertex2f(center.x, center.y); - glVertex2f(p.x, p.y); - glEnd(); -} - -void DebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) -{ - glColor3f(color.r, color.g, color.b); - glBegin(GL_LINES); - glVertex2f(p1.x, p1.y); - glVertex2f(p2.x, p2.y); - glEnd(); -} - -void DebugDraw::DrawTransform(const b2Transform& xf) -{ - b2Vec2 p1 = xf.position, p2; - const float32 k_axisScale = 0.4f; - glBegin(GL_LINES); - - glColor3f(1.0f, 0.0f, 0.0f); - glVertex2f(p1.x, p1.y); - p2 = p1 + k_axisScale * xf.R.col1; - glVertex2f(p2.x, p2.y); - - glColor3f(0.0f, 1.0f, 0.0f); - glVertex2f(p1.x, p1.y); - p2 = p1 + k_axisScale * xf.R.col2; - glVertex2f(p2.x, p2.y); - - glEnd(); -} - -void DebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color) -{ - glPointSize(size); - glBegin(GL_POINTS); - glColor3f(color.r, color.g, color.b); - glVertex2f(p.x, p.y); - glEnd(); - glPointSize(1.0f); -} - -void DebugDraw::DrawString(int x, int y, const char *string, ...) -{ - char buffer[128]; - - va_list arg; - va_start(arg, string); - vsprintf(buffer, string, arg); - va_end(arg); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - int w = glutGet(GLUT_WINDOW_WIDTH); - int h = glutGet(GLUT_WINDOW_HEIGHT); - gluOrtho2D(0, w, h, 0); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glColor3f(0.9f, 0.6f, 0.6f); - glRasterPos2i(x, y); - int32 length = (int32)strlen(buffer); - for (int32 i = 0; i < length; ++i) - { - glutBitmapCharacter(GLUT_BITMAP_8_BY_13, buffer[i]); - } - - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); -} - -void DebugDraw::DrawAABB(b2AABB* aabb, const b2Color& c) -{ - glColor3f(c.r, c.g, c.b); - glBegin(GL_LINE_LOOP); - glVertex2f(aabb->lowerBound.x, aabb->lowerBound.y); - glVertex2f(aabb->upperBound.x, aabb->lowerBound.y); - glVertex2f(aabb->upperBound.x, aabb->upperBound.y); - glVertex2f(aabb->lowerBound.x, aabb->upperBound.y); - glEnd(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.h deleted file mode 100644 index 77bd10e8a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Render.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef RENDER_H -#define RENDER_H - -#include - -struct b2AABB; - -// This class implements debug drawing callbacks that are invoked -// inside b2World::Step. -class DebugDraw : public b2DebugDraw -{ -public: - void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); - - void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); - - void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color); - - void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color); - - void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color); - - void DrawTransform(const b2Transform& xf); - - void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color); - - void DrawString(int x, int y, const char* string, ...); - - void DrawAABB(b2AABB* aabb, const b2Color& color); -}; - - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.cpp deleted file mode 100644 index 0f30f9520..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.cpp +++ /dev/null @@ -1,398 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "Test.h" -#include "Render.h" - -#include "freeglut/GL/glut.h" - -#include - -void DestructionListener::SayGoodbye(b2Joint* joint) -{ - if (test->m_mouseJoint == joint) - { - test->m_mouseJoint = NULL; - } - else - { - test->JointDestroyed(joint); - } -} - -Test::Test() -{ - b2Vec2 gravity; - gravity.Set(0.0f, -10.0f); - bool doSleep = true; - m_world = new b2World(gravity, doSleep); - m_bomb = NULL; - m_textLine = 30; - m_mouseJoint = NULL; - m_pointCount = 0; - - m_destructionListener.test = this; - m_world->SetDestructionListener(&m_destructionListener); - m_world->SetContactListener(this); - m_world->SetDebugDraw(&m_debugDraw); - - m_bombSpawning = false; - - m_stepCount = 0; - - b2BodyDef bodyDef; - m_groundBody = m_world->CreateBody(&bodyDef); -} - -Test::~Test() -{ - // By deleting the world, we delete the bomb, mouse joint, etc. - delete m_world; - m_world = NULL; -} - -void Test::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) -{ - const b2Manifold* manifold = contact->GetManifold(); - - if (manifold->pointCount == 0) - { - return; - } - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints]; - b2GetPointStates(state1, state2, oldManifold, manifold); - - b2WorldManifold worldManifold; - contact->GetWorldManifold(&worldManifold); - - for (int32 i = 0; i < manifold->pointCount && m_pointCount < k_maxContactPoints; ++i) - { - ContactPoint* cp = m_points + m_pointCount; - cp->fixtureA = fixtureA; - cp->fixtureB = fixtureB; - cp->position = worldManifold.points[i]; - cp->normal = worldManifold.normal; - cp->state = state2[i]; - ++m_pointCount; - } -} - -void Test::DrawTitle(int x, int y, const char *string) -{ - m_debugDraw.DrawString(x, y, string); -} - -class QueryCallback : public b2QueryCallback -{ -public: - QueryCallback(const b2Vec2& point) - { - m_point = point; - m_fixture = NULL; - } - - bool ReportFixture(b2Fixture* fixture) - { - b2Body* body = fixture->GetBody(); - if (body->GetType() == b2_dynamicBody) - { - bool inside = fixture->TestPoint(m_point); - if (inside) - { - m_fixture = fixture; - - // We are done, terminate the query. - return false; - } - } - - // Continue the query. - return true; - } - - b2Vec2 m_point; - b2Fixture* m_fixture; -}; - -void Test::MouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != NULL) - { - return; - } - - // Make a small box. - b2AABB aabb; - b2Vec2 d; - d.Set(0.001f, 0.001f); - aabb.lowerBound = p - d; - aabb.upperBound = p + d; - - // Query the world for overlapping shapes. - QueryCallback callback(p); - m_world->QueryAABB(&callback, aabb); - - if (callback.m_fixture) - { - b2Body* body = callback.m_fixture->GetBody(); - b2MouseJointDef md; - md.bodyA = m_groundBody; - md.bodyB = body; - md.target = p; - md.maxForce = 1000.0f * body->GetMass(); - m_mouseJoint = (b2MouseJoint*)m_world->CreateJoint(&md); - body->SetAwake(true); - } -} - -void Test::SpawnBomb(const b2Vec2& worldPt) -{ - m_bombSpawnPoint = worldPt; - m_bombSpawning = true; -} - -void Test::CompleteBombSpawn(const b2Vec2& p) -{ - if (m_bombSpawning == false) - { - return; - } - - const float multiplier = 30.0f; - b2Vec2 vel = m_bombSpawnPoint - p; - vel *= multiplier; - LaunchBomb(m_bombSpawnPoint,vel); - m_bombSpawning = false; -} - -void Test::ShiftMouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != NULL) - { - return; - } - - SpawnBomb(p); -} - -void Test::MouseUp(const b2Vec2& p) -{ - if (m_mouseJoint) - { - m_world->DestroyJoint(m_mouseJoint); - m_mouseJoint = NULL; - } - - if (m_bombSpawning) - { - CompleteBombSpawn(p); - } -} - -void Test::MouseMove(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint) - { - m_mouseJoint->SetTarget(p); - } -} - -void Test::LaunchBomb() -{ - b2Vec2 p(RandomFloat(-15.0f, 15.0f), 30.0f); - b2Vec2 v = -5.0f * p; - LaunchBomb(p, v); -} - -void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) -{ - if (m_bomb) - { - m_world->DestroyBody(m_bomb); - m_bomb = NULL; - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = position; - bd.bullet = true; - m_bomb = m_world->CreateBody(&bd); - m_bomb->SetLinearVelocity(velocity); - - b2CircleShape circle; - circle.m_radius = 0.3f; - - b2FixtureDef fd; - fd.shape = &circle; - fd.density = 20.0f; - fd.restitution = 0.0f; - - b2Vec2 minV = position - b2Vec2(0.3f,0.3f); - b2Vec2 maxV = position + b2Vec2(0.3f,0.3f); - - b2AABB aabb; - aabb.lowerBound = minV; - aabb.upperBound = maxV; - - m_bomb->CreateFixture(&fd); -} - -void Test::Step(Settings* settings) -{ - float32 timeStep = settings->hz > 0.0f ? 1.0f / settings->hz : float32(0.0f); - - if (settings->pause) - { - if (settings->singleStep) - { - settings->singleStep = 0; - } - else - { - timeStep = 0.0f; - } - - m_debugDraw.DrawString(5, m_textLine, "****PAUSED****"); - m_textLine += 15; - } - - uint32 flags = 0; - flags += settings->drawShapes * b2DebugDraw::e_shapeBit; - flags += settings->drawJoints * b2DebugDraw::e_jointBit; - flags += settings->drawAABBs * b2DebugDraw::e_aabbBit; - flags += settings->drawPairs * b2DebugDraw::e_pairBit; - flags += settings->drawCOMs * b2DebugDraw::e_centerOfMassBit; - m_debugDraw.SetFlags(flags); - - m_world->SetWarmStarting(settings->enableWarmStarting > 0); - m_world->SetContinuousPhysics(settings->enableContinuous > 0); - - m_pointCount = 0; - - m_world->Step(timeStep, settings->velocityIterations, settings->positionIterations); - - m_world->DrawDebugData(); - - if (timeStep > 0.0f) - { - ++m_stepCount; - } - - if (settings->drawStats) - { - m_debugDraw.DrawString(5, m_textLine, "bodies/contacts/joints/proxies = %d/%d/%d", - m_world->GetBodyCount(), m_world->GetContactCount(), m_world->GetJointCount(), m_world->GetProxyCount()); - m_textLine += 15; - } - - if (m_mouseJoint) - { - b2Vec2 p1 = m_mouseJoint->GetAnchorB(); - b2Vec2 p2 = m_mouseJoint->GetTarget(); - - glPointSize(4.0f); - glColor3f(0.0f, 1.0f, 0.0f); - glBegin(GL_POINTS); - glVertex2f(p1.x, p1.y); - glVertex2f(p2.x, p2.y); - glEnd(); - glPointSize(1.0f); - - glColor3f(0.8f, 0.8f, 0.8f); - glBegin(GL_LINES); - glVertex2f(p1.x, p1.y); - glVertex2f(p2.x, p2.y); - glEnd(); - } - - if (m_bombSpawning) - { - glPointSize(4.0f); - glColor3f(0.0f, 0.0f, 1.0f); - glBegin(GL_POINTS); - glColor3f(0.0f, 0.0f, 1.0f); - glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); - glEnd(); - - glColor3f(0.8f, 0.8f, 0.8f); - glBegin(GL_LINES); - glVertex2f(m_mouseWorld.x, m_mouseWorld.y); - glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); - glEnd(); - } - - if (settings->drawContactPoints) - { - //const float32 k_impulseScale = 0.1f; - const float32 k_axisScale = 0.3f; - - for (int32 i = 0; i < m_pointCount; ++i) - { - ContactPoint* point = m_points + i; - - if (point->state == b2_addState) - { - // Add - m_debugDraw.DrawPoint(point->position, 10.0f, b2Color(0.3f, 0.95f, 0.3f)); - } - else if (point->state == b2_persistState) - { - // Persist - m_debugDraw.DrawPoint(point->position, 5.0f, b2Color(0.3f, 0.3f, 0.95f)); - } - - if (settings->drawContactNormals == 1) - { - b2Vec2 p1 = point->position; - b2Vec2 p2 = p1 + k_axisScale * point->normal; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.9f)); - } - else if (settings->drawContactForces == 1) - { - //b2Vec2 p1 = point->position; - //b2Vec2 p2 = p1 + k_forceScale * point->normalForce * point->normal; - //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - - if (settings->drawFrictionForces == 1) - { - //b2Vec2 tangent = b2Cross(point->normal, 1.0f); - //b2Vec2 p1 = point->position; - //b2Vec2 p2 = p1 + k_forceScale * point->tangentForce * tangent; - //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - } - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.h deleted file mode 100644 index dfdc54005..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Framework/Test.h +++ /dev/null @@ -1,186 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TEST_H -#define TEST_H - -#include -#include "Render.h" - -#include - -class Test; -struct Settings; - -typedef Test* TestCreateFcn(); - -#define RAND_LIMIT 32767 - -/// Random number in range [-1,1] -inline float32 RandomFloat() -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = 2.0f * r - 1.0f; - return r; -} - -/// Random floating point number in range [lo, hi] -inline float32 RandomFloat(float32 lo, float32 hi) -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = (hi - lo) * r + lo; - return r; -} - -/// Test settings. Some can be controlled in the GUI. -struct Settings -{ - Settings() : - hz(60.0f), - velocityIterations(8), - positionIterations(3), - drawStats(0), - drawShapes(1), - drawJoints(1), - drawAABBs(0), - drawPairs(0), - drawContactPoints(0), - drawContactNormals(0), - drawContactForces(0), - drawFrictionForces(0), - drawCOMs(0), - enableWarmStarting(1), - enableContinuous(1), - pause(0), - singleStep(0) - {} - - float32 hz; - int32 velocityIterations; - int32 positionIterations; - int32 drawShapes; - int32 drawJoints; - int32 drawAABBs; - int32 drawPairs; - int32 drawContactPoints; - int32 drawContactNormals; - int32 drawContactForces; - int32 drawFrictionForces; - int32 drawCOMs; - int32 drawStats; - int32 enableWarmStarting; - int32 enableContinuous; - int32 pause; - int32 singleStep; -}; - -struct TestEntry -{ - const char *name; - TestCreateFcn *createFcn; -}; - -extern TestEntry g_testEntries[]; -// This is called when a joint in the world is implicitly destroyed -// because an attached body is destroyed. This gives us a chance to -// nullify the mouse joint. -class DestructionListener : public b2DestructionListener -{ -public: - void SayGoodbye(b2Fixture* fixture) { B2_NOT_USED(fixture); } - void SayGoodbye(b2Joint* joint); - - Test* test; -}; - -const int32 k_maxContactPoints = 2048; - -struct ContactPoint -{ - b2Fixture* fixtureA; - b2Fixture* fixtureB; - b2Vec2 normal; - b2Vec2 position; - b2PointState state; -}; - -class Test : public b2ContactListener -{ -public: - - Test(); - virtual ~Test(); - - void SetTextLine(int32 line) { m_textLine = line; } - void DrawTitle(int x, int y, const char *string); - virtual void Step(Settings* settings); - virtual void Keyboard(unsigned char key) { B2_NOT_USED(key); } - void ShiftMouseDown(const b2Vec2& p); - virtual void MouseDown(const b2Vec2& p); - virtual void MouseUp(const b2Vec2& p); - void MouseMove(const b2Vec2& p); - void LaunchBomb(); - void LaunchBomb(const b2Vec2& position, const b2Vec2& velocity); - - void SpawnBomb(const b2Vec2& worldPt); - void CompleteBombSpawn(const b2Vec2& p); - - // Let derived tests know that a joint was destroyed. - virtual void JointDestroyed(b2Joint* joint) { B2_NOT_USED(joint); } - - // Callbacks for derived classes. - virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); - virtual void PostSolve(const b2Contact* contact, const b2ContactImpulse* impulse) - { - B2_NOT_USED(contact); - B2_NOT_USED(impulse); - } - -protected: - friend class DestructionListener; - friend class BoundaryListener; - friend class ContactListener; - - b2Body* m_groundBody; - b2AABB m_worldAABB; - ContactPoint m_points[k_maxContactPoints]; - int32 m_pointCount; - DestructionListener m_destructionListener; - DebugDraw m_debugDraw; - int32 m_textLine; - b2World* m_world; - b2Body* m_bomb; - b2MouseJoint* m_mouseJoint; - b2Vec2 m_bombSpawnPoint; - bool m_bombSpawning; - b2Vec2 m_mouseWorld; - int32 m_stepCount; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ApplyForce.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ApplyForce.h deleted file mode 100644 index 874525782..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ApplyForce.h +++ /dev/null @@ -1,187 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef APPLY_FORCE_H -#define APPLY_FORCE_H - -class ApplyForce : public Test -{ -public: - ApplyForce() - { - m_world->SetGravity(b2Vec2(0.0f, 0.0f)); - - const float32 k_restitution = 0.4f; - - b2Body* ground; - { - b2BodyDef bd; - bd.position.Set(0.0f, 20.0f); - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - - b2FixtureDef sd; - sd.shape = &shape; - sd.density = 0.0f; - sd.restitution = k_restitution; - - // Left vertical - shape.SetAsEdge(b2Vec2(-20.0f, -20.0f), b2Vec2(-20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Right vertical - shape.SetAsEdge(b2Vec2(20.0f, -20.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Top horizontal - shape.SetAsEdge(b2Vec2(-20.0f, 20.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&sd); - - // Bottom horizontal - shape.SetAsEdge(b2Vec2(-20.0f, -20.0f), b2Vec2(20.0f, -20.0f)); - ground->CreateFixture(&sd); - } - - { - b2Transform xf1; - xf1.R.Set(0.3524f * b2_pi); - xf1.position = b2Mul(xf1.R, b2Vec2(1.0f, 0.0f)); - - b2Vec2 vertices[3]; - vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - - b2PolygonShape poly1; - poly1.Set(vertices, 3); - - b2FixtureDef sd1; - sd1.shape = &poly1; - sd1.density = 4.0f; - - b2Transform xf2; - xf2.R.Set(-0.3524f * b2_pi); - xf2.position = b2Mul(xf2.R, b2Vec2(-1.0f, 0.0f)); - - vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - - b2PolygonShape poly2; - poly2.Set(vertices, 3); - - b2FixtureDef sd2; - sd2.shape = &poly2; - sd2.density = 2.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.angularDamping = 5.0f; - bd.linearDamping = 0.1f; - - bd.position.Set(0.0f, 2.0); - bd.angle = b2_pi; - bd.allowSleep = false; - m_body = m_world->CreateBody(&bd); - m_body->CreateFixture(&sd1); - m_body->CreateFixture(&sd2); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.3f; - - for (int i = 0; i < 10; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(0.0f, 5.0f + 1.54f * i); - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - - float32 gravity = 10.0f; - float32 I = body->GetInertia(); - float32 mass = body->GetMass(); - - // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) - float32 radius = b2Sqrt(2.0f * I / mass); - - b2FrictionJointDef jd; - jd.localAnchorA.SetZero(); - jd.localAnchorB.SetZero(); - jd.bodyA = ground; - jd.bodyB = body; - jd.collideConnected = true; - jd.maxForce = mass * gravity; - jd.maxTorque = mass * radius * gravity; - - m_world->CreateJoint(&jd); - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'w': - { - b2Vec2 f = m_body->GetWorldVector(b2Vec2(0.0f, -200.0f)); - b2Vec2 p = m_body->GetWorldPoint(b2Vec2(0.0f, 2.0f)); - m_body->ApplyForce(f, p); - } - break; - - case 'a': - { - m_body->ApplyTorque(50.0f); - } - break; - - case 'd': - { - m_body->ApplyTorque(-50.0f); - } - break; - } - } - - static Test* Create() - { - return new ApplyForce; - } - - b2Body* m_body; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/BodyTypes.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/BodyTypes.h deleted file mode 100644 index 7e49c7758..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/BodyTypes.h +++ /dev/null @@ -1,166 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BODY_TYPES_H -#define BODY_TYPES_H - -class BodyTypes : public Test -{ -public: - BodyTypes() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - - b2FixtureDef fd; - fd.shape = &shape; - - ground->CreateFixture(&fd); - } - - // Define attachment - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 3.0f); - m_attachment = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 2.0f); - m_attachment->CreateFixture(&shape, 2.0f); - } - - // Define platform - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-4.0f, 5.0f); - m_platform = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 4.0f, b2Vec2(4.0f, 0.0f), 0.5f * b2_pi); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.6f; - fd.density = 2.0f; - m_platform->CreateFixture(&fd); - - b2RevoluteJointDef rjd; - rjd.Initialize(m_attachment, m_platform, b2Vec2(0.0f, 5.0f)); - rjd.maxMotorTorque = 50.0f; - rjd.enableMotor = true; - m_world->CreateJoint(&rjd); - - b2PrismaticJointDef pjd; - pjd.Initialize(ground, m_platform, b2Vec2(0.0f, 5.0f), b2Vec2(1.0f, 0.0f)); - - pjd.maxMotorForce = 1000.0f; - pjd.enableMotor = true; - pjd.lowerTranslation = -10.0f; - pjd.upperTranslation = 10.0f; - pjd.enableLimit = true; - - (b2PrismaticJoint*)m_world->CreateJoint(&pjd); - - m_speed = 3.0f; - } - - // Create a payload - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 8.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.75f, 0.75f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.friction = 0.6f; - fd.density = 2.0f; - - body->CreateFixture(&fd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'd': - m_platform->SetType(b2_dynamicBody); - break; - - case 's': - m_platform->SetType(b2_staticBody); - break; - - case 'k': - m_platform->SetType(b2_kinematicBody); - m_platform->SetLinearVelocity(b2Vec2(-m_speed, 0.0f)); - m_platform->SetAngularVelocity(0.0f); - break; - } - } - - void Step(Settings* settings) - { - // Drive the kinematic body. - if (m_platform->GetType() == b2_kinematicBody) - { - b2Vec2 p = m_platform->GetTransform().position; - b2Vec2 v = m_platform->GetLinearVelocity(); - - if ((p.x < -10.0f && v.x < 0.0f) || - (p.x > 10.0f && v.x > 0.0f)) - { - v.x = -v.x; - m_platform->SetLinearVelocity(v); - } - } - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (d) dynamic, (s) static, (k) kinematic"); - m_textLine += 15; - } - - static Test* Create() - { - return new BodyTypes; - } - - b2Body* m_attachment; - b2Body* m_platform; - float32 m_speed; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Breakable.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Breakable.h deleted file mode 100644 index 7d2af7885..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Breakable.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BREAKABLE_TEST_H -#define BREAKABLE_TEST_H - -// This is used to test sensor shapes. -class Breakable : public Test -{ -public: - - enum - { - e_count = 7 - }; - - Breakable() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Breakable dynamic body - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 40.0f); - bd.angle = 0.25f * b2_pi; - m_body1 = m_world->CreateBody(&bd); - - m_shape1.SetAsBox(0.5f, 0.5f, b2Vec2(-0.5f, 0.0f), 0.0f); - m_piece1 = m_body1->CreateFixture(&m_shape1, 1.0f); - - m_shape2.SetAsBox(0.5f, 0.5f, b2Vec2(0.5f, 0.0f), 0.0f); - m_piece2 = m_body1->CreateFixture(&m_shape2, 1.0f); - } - - m_break = false; - m_broke = false; - } - - void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - if (m_broke) - { - // The body already broke. - return; - } - - // Should the body break? - int32 count = contact->GetManifold()->pointCount; - - float32 maxImpulse = 0.0f; - for (int32 i = 0; i < count; ++i) - { - maxImpulse = b2Max(maxImpulse, impulse->normalImpulses[i]); - } - - if (maxImpulse > 40.0f) - { - // Flag the body for breaking. - m_break = true; - } - } - - void Break() - { - // Create two bodies from one. - b2Body* body1 = m_piece1->GetBody(); - b2Vec2 center = body1->GetWorldCenter(); - - body1->DestroyFixture(m_piece2); - m_piece2 = NULL; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = body1->GetPosition(); - bd.angle = body1->GetAngle(); - - b2Body* body2 = m_world->CreateBody(&bd); - m_piece2 = body2->CreateFixture(&m_shape2, 1.0f); - - // Compute consistent velocities for new bodies based on - // cached velocity. - b2Vec2 center1 = body1->GetWorldCenter(); - b2Vec2 center2 = body2->GetWorldCenter(); - - b2Vec2 velocity1 = m_velocity + b2Cross(m_angularVelocity, center1 - center); - b2Vec2 velocity2 = m_velocity + b2Cross(m_angularVelocity, center2 - center); - - body1->SetAngularVelocity(m_angularVelocity); - body1->SetLinearVelocity(velocity1); - - body2->SetAngularVelocity(m_angularVelocity); - body2->SetLinearVelocity(velocity2); - } - - void Step(Settings* settings) - { - if (m_break) - { - Break(); - m_broke = true; - m_break = false; - } - - // Cache velocities to improve movement on breakage. - if (m_broke == false) - { - m_velocity = m_body1->GetLinearVelocity(); - m_angularVelocity = m_body1->GetAngularVelocity(); - } - - Test::Step(settings); - } - - static Test* Create() - { - return new Breakable; - } - - b2Body* m_body1; - b2Vec2 m_velocity; - float32 m_angularVelocity; - b2PolygonShape m_shape1; - b2PolygonShape m_shape2; - b2Fixture* m_piece1; - b2Fixture* m_piece2; - - bool m_broke; - bool m_break; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Bridge.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Bridge.h deleted file mode 100644 index 7418b1e82..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Bridge.h +++ /dev/null @@ -1,132 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BRIDGE_H -#define BRIDGE_H - -class Bridge : public Test -{ -public: - - enum - { - e_count = 30, - }; - - Bridge() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.2f; - - b2RevoluteJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - if (i == (e_count >> 1)) - { - m_middle = body; - } - prevBody = body; - } - - b2Vec2 anchor(-15.0f + 1.0f * e_count, 5.0f); - jd.Initialize(prevBody, ground, anchor); - m_world->CreateJoint(&jd); - } - - for (int32 i = 0; i < 2; ++i) - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - - b2PolygonShape shape; - shape.Set(vertices, 3); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-8.0f + 8.0f * i, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - - for (int32 i = 0; i < 3; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 6.0f * i, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - static Test* Create() - { - return new Bridge; - } - - b2Body* m_middle; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Cantilever.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Cantilever.h deleted file mode 100644 index 1e5a887d6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Cantilever.h +++ /dev/null @@ -1,212 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CANTILEVER_H -#define CANTILEVER_H - -class Cantilever : public Test -{ -public: - - enum - { - e_count = 8, - }; - - Cantilever() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-14.5f + 1.0f * i, 15.0f); - bd.inertiaScale = 10.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(-15.0f + 1.0f * i, 15.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-4.5f + 1.0f * i, 5.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - if (i > 0) - { - b2Vec2 anchor(-5.0f + 1.0f * i, 5.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - } - - prevBody = body; - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - - b2WeldJointDef jd; - - b2Body* prevBody = ground; - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(5.5f + 1.0f * i, 10.0f); - bd.inertiaScale = 10.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - if (i > 0) - { - b2Vec2 anchor(5.0f + 1.0f * i, 10.0f); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - } - - prevBody = body; - } - } - - for (int32 i = 0; i < 2; ++i) - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - - b2PolygonShape shape; - shape.Set(vertices, 3); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-8.0f + 8.0f * i, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - - for (int32 i = 0; i < 2; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 6.0f * i, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - static Test* Create() - { - return new Cantilever; - } - - b2Body* m_middle; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Chain.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Chain.h deleted file mode 100644 index 5c331bf57..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Chain.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CHAIN_H -#define CHAIN_H - -class Chain : public Test -{ -public: - Chain() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.6f, 0.125f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.2f; - - b2RevoluteJointDef jd; - jd.collideConnected = false; - - const float32 y = 25.0f; - b2Body* prevBody = ground; - for (int32 i = 0; i < 30; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.5f + i, y); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - - b2Vec2 anchor(float32(i), y); - jd.Initialize(prevBody, body, anchor); - m_world->CreateJoint(&jd); - - prevBody = body; - } - } - } - - static Test* Create() - { - return new Chain; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CharacterCollision.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CharacterCollision.h deleted file mode 100644 index 430c4228b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CharacterCollision.h +++ /dev/null @@ -1,175 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CHARACTER_COLLISION_H -#define CHARACTER_COLLISION_H - -/// This is a test of typical character collision scenarios. This does not -/// show how you should implement a character in your application. - -class CharacterCollision : public Test -{ -public: - CharacterCollision() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Collinear edges - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.m_radius = 0.0f; - shape.SetAsEdge(b2Vec2(-8.0f, 1.0f), b2Vec2(-6.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsEdge(b2Vec2(-6.0f, 1.0f), b2Vec2(-4.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsEdge(b2Vec2(-4.0f, 1.0f), b2Vec2(-2.0f, 1.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Square tiles - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(1.0f, 1.0f, b2Vec2(4.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsBox(1.0f, 1.0f, b2Vec2(6.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsBox(1.0f, 1.0f, b2Vec2(8.0f, 3.0f), 0.0f); - ground->CreateFixture(&shape, 0.0f); - } - - // Square made from edges notice how the edges are shrunk to account - // for the polygon radius. This makes it so the square character does - // not get snagged. However, ray casts can now go through the cracks. - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - float32 d = 2.0f * b2_polygonRadius; - shape.SetAsEdge(b2Vec2(-1.0f + d, 3.0f), b2Vec2(1.0f - d, 3.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsEdge(b2Vec2(1.0f, 3.0f + d), b2Vec2(1.0f, 5.0f - d)); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsEdge(b2Vec2(1.0f - d, 5.0f), b2Vec2(-1.0f + d, 5.0f)); - ground->CreateFixture(&shape, 0.0f); - shape.SetAsEdge(b2Vec2(-1.0f, 5.0f - d), b2Vec2(-1.0f, 3.0f + d)); - ground->CreateFixture(&shape, 0.0f); - } - - // Square character - { - b2BodyDef bd; - bd.position.Set(-3.0f, 5.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Hexagon character - { - b2BodyDef bd; - bd.position.Set(-5.0f, 5.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - float32 angle = 0.0f; - float32 delta = b2_pi / 3.0f; - b2Vec2 vertices[6]; - for (int32 i = 0; i < 6; ++i) - { - vertices[i].Set(0.5f * cosf(angle), 0.5f * sinf(angle)); - angle += delta; - } - - b2PolygonShape shape; - shape.Set(vertices, 6); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - - // Circle character - { - b2BodyDef bd; - bd.position.Set(3.0f, 5.0f); - bd.type = b2_dynamicBody; - bd.fixedRotation = true; - bd.allowSleep = false; - - b2Body* body = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - body->CreateFixture(&fd); - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "This tests various character collision shapes"); - m_textLine += 15; - } - - static Test* Create() - { - return new CharacterCollision; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionFiltering.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionFiltering.h deleted file mode 100644 index 001dff479..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionFiltering.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COLLISION_FILTERING_H -#define COLLISION_FILTERING_H - -// This is a test of collision filtering. -// There is a triangle, a box, and a circle. -// There are 6 shapes. 3 large and 3 small. -// The 3 small ones always collide. -// The 3 large ones never collide. -// The boxes don't collide with triangles (except if both are small). -const int16 k_smallGroup = 1; -const int16 k_largeGroup = -1; - -const uint16 k_defaultCategory = 0x0001; -const uint16 k_triangleCategory = 0x0002; -const uint16 k_boxCategory = 0x0004; -const uint16 k_circleCategory = 0x0008; - -const uint16 k_triangleMask = 0xFFFF; -const uint16 k_boxMask = 0xFFFF ^ k_triangleCategory; -const uint16 k_circleMask = 0xFFFF; - -class CollisionFiltering : public Test -{ -public: - CollisionFiltering() - { - // Ground body - { - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2FixtureDef sd; - sd.shape = &shape; - sd.friction = 0.3f; - - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&sd); - } - - // Small triangle - b2Vec2 vertices[3]; - vertices[0].Set(-1.0f, 0.0f); - vertices[1].Set(1.0f, 0.0f); - vertices[2].Set(0.0f, 2.0f); - b2PolygonShape polygon; - polygon.Set(vertices, 3); - - b2FixtureDef triangleShapeDef; - triangleShapeDef.shape = &polygon; - triangleShapeDef.density = 1.0f; - - triangleShapeDef.filter.groupIndex = k_smallGroup; - triangleShapeDef.filter.categoryBits = k_triangleCategory; - triangleShapeDef.filter.maskBits = k_triangleMask; - - b2BodyDef triangleBodyDef; - triangleBodyDef.type = b2_dynamicBody; - triangleBodyDef.position.Set(-5.0f, 2.0f); - - b2Body* body1 = m_world->CreateBody(&triangleBodyDef); - body1->CreateFixture(&triangleShapeDef); - - // Large triangle (recycle definitions) - vertices[0] *= 2.0f; - vertices[1] *= 2.0f; - vertices[2] *= 2.0f; - polygon.Set(vertices, 3); - triangleShapeDef.filter.groupIndex = k_largeGroup; - triangleBodyDef.position.Set(-5.0f, 6.0f); - triangleBodyDef.fixedRotation = true; // look at me! - - b2Body* body2 = m_world->CreateBody(&triangleBodyDef); - body2->CreateFixture(&triangleShapeDef); - - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-5.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape p; - p.SetAsBox(0.5f, 1.0f); - body->CreateFixture(&p, 1.0f); - - b2PrismaticJointDef jd; - jd.bodyA = body2; - jd.bodyB = body; - jd.enableLimit = true; - jd.localAnchorA.Set(0.0f, 4.0f); - jd.localAnchorB.SetZero(); - jd.localAxis1.Set(0.0f, 1.0f); - jd.lowerTranslation = -1.0f; - jd.upperTranslation = 1.0f; - - m_world->CreateJoint(&jd); - } - - // Small box - polygon.SetAsBox(1.0f, 0.5f); - b2FixtureDef boxShapeDef; - boxShapeDef.shape = &polygon; - boxShapeDef.density = 1.0f; - boxShapeDef.restitution = 0.1f; - - boxShapeDef.filter.groupIndex = k_smallGroup; - boxShapeDef.filter.categoryBits = k_boxCategory; - boxShapeDef.filter.maskBits = k_boxMask; - - b2BodyDef boxBodyDef; - boxBodyDef.type = b2_dynamicBody; - boxBodyDef.position.Set(0.0f, 2.0f); - - b2Body* body3 = m_world->CreateBody(&boxBodyDef); - body3->CreateFixture(&boxShapeDef); - - // Large box (recycle definitions) - polygon.SetAsBox(2.0f, 1.0f); - boxShapeDef.filter.groupIndex = k_largeGroup; - boxBodyDef.position.Set(0.0f, 6.0f); - - b2Body* body4 = m_world->CreateBody(&boxBodyDef); - body4->CreateFixture(&boxShapeDef); - - // Small circle - b2CircleShape circle; - circle.m_radius = 1.0f; - - b2FixtureDef circleShapeDef; - circleShapeDef.shape = &circle; - circleShapeDef.density = 1.0f; - - circleShapeDef.filter.groupIndex = k_smallGroup; - circleShapeDef.filter.categoryBits = k_circleCategory; - circleShapeDef.filter.maskBits = k_circleMask; - - b2BodyDef circleBodyDef; - circleBodyDef.type = b2_dynamicBody; - circleBodyDef.position.Set(5.0f, 2.0f); - - b2Body* body5 = m_world->CreateBody(&circleBodyDef); - body5->CreateFixture(&circleShapeDef); - - // Large circle - circle.m_radius *= 2.0f; - circleShapeDef.filter.groupIndex = k_largeGroup; - circleBodyDef.position.Set(5.0f, 6.0f); - - b2Body* body6 = m_world->CreateBody(&circleBodyDef); - body6->CreateFixture(&circleShapeDef); - } - static Test* Create() - { - return new CollisionFiltering; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionProcessing.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionProcessing.h deleted file mode 100644 index 4cfab7234..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CollisionProcessing.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COLLISION_PROCESSING_H -#define COLLISION_PROCESSING_H - -#include - -// This test shows collision processing and tests -// deferred body destruction. -class CollisionProcessing : public Test -{ -public: - CollisionProcessing() - { - // Ground body - { - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-50.0f, 0.0f), b2Vec2(50.0f, 0.0f)); - - b2FixtureDef sd; - sd.shape = &shape;; - - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&sd); - } - - float32 xLo = -5.0f, xHi = 5.0f; - float32 yLo = 2.0f, yHi = 35.0f; - - // Small triangle - b2Vec2 vertices[3]; - vertices[0].Set(-1.0f, 0.0f); - vertices[1].Set(1.0f, 0.0f); - vertices[2].Set(0.0f, 2.0f); - - b2PolygonShape polygon; - polygon.Set(vertices, 3); - - b2FixtureDef triangleShapeDef; - triangleShapeDef.shape = &polygon; - triangleShapeDef.density = 1.0f; - - b2BodyDef triangleBodyDef; - triangleBodyDef.type = b2_dynamicBody; - triangleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body1 = m_world->CreateBody(&triangleBodyDef); - body1->CreateFixture(&triangleShapeDef); - - // Large triangle (recycle definitions) - vertices[0] *= 2.0f; - vertices[1] *= 2.0f; - vertices[2] *= 2.0f; - polygon.Set(vertices, 3); - - triangleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body2 = m_world->CreateBody(&triangleBodyDef); - body2->CreateFixture(&triangleShapeDef); - - // Small box - polygon.SetAsBox(1.0f, 0.5f); - - b2FixtureDef boxShapeDef; - boxShapeDef.shape = &polygon; - boxShapeDef.density = 1.0f; - - b2BodyDef boxBodyDef; - boxBodyDef.type = b2_dynamicBody; - boxBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body3 = m_world->CreateBody(&boxBodyDef); - body3->CreateFixture(&boxShapeDef); - - // Large box (recycle definitions) - polygon.SetAsBox(2.0f, 1.0f); - boxBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body4 = m_world->CreateBody(&boxBodyDef); - body4->CreateFixture(&boxShapeDef); - - // Small circle - b2CircleShape circle; - circle.m_radius = 1.0f; - - b2FixtureDef circleShapeDef; - circleShapeDef.shape = &circle; - circleShapeDef.density = 1.0f; - - b2BodyDef circleBodyDef; - circleBodyDef.type = b2_dynamicBody; - circleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body5 = m_world->CreateBody(&circleBodyDef); - body5->CreateFixture(&circleShapeDef); - - // Large circle - circle.m_radius *= 2.0f; - circleBodyDef.position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); - - b2Body* body6 = m_world->CreateBody(&circleBodyDef); - body6->CreateFixture(&circleShapeDef); - } - - void Step(Settings* settings) - { - Test::Step(settings); - - // We are going to destroy some bodies according to contact - // points. We must buffer the bodies that should be destroyed - // because they may belong to multiple contact points. - const int32 k_maxNuke = 6; - b2Body* nuke[k_maxNuke]; - int32 nukeCount = 0; - - // Traverse the contact results. Destroy bodies that - // are touching heavier bodies. - for (int32 i = 0; i < m_pointCount; ++i) - { - ContactPoint* point = m_points + i; - - b2Body* body1 = point->fixtureA->GetBody(); - b2Body* body2 = point->fixtureB->GetBody(); - float32 mass1 = body1->GetMass(); - float32 mass2 = body2->GetMass(); - - if (mass1 > 0.0f && mass2 > 0.0f) - { - if (mass2 > mass1) - { - nuke[nukeCount++] = body1; - } - else - { - nuke[nukeCount++] = body2; - } - - if (nukeCount == k_maxNuke) - { - break; - } - } - } - - // Sort the nuke array to group duplicates. - std::sort(nuke, nuke + nukeCount); - - // Destroy the bodies, skipping duplicates. - int32 i = 0; - while (i < nukeCount) - { - b2Body* b = nuke[i++]; - while (i < nukeCount && nuke[i] == b) - { - ++i; - } - - if (b != m_bomb) - { - m_world->DestroyBody(b); - } - } - } - - static Test* Create() - { - return new CollisionProcessing; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CompoundShapes.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CompoundShapes.h deleted file mode 100644 index 2f01eb84a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/CompoundShapes.h +++ /dev/null @@ -1,150 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef COMPOUND_SHAPES_H -#define COMPOUND_SHAPES_H - -// TODO_ERIN test joints on compounds. -class CompoundShapes : public Test -{ -public: - CompoundShapes() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, 0.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(50.0f, 0.0f), b2Vec2(-50.0f, 0.0f)); - - body->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape circle1; - circle1.m_radius = 0.5f; - circle1.m_p.Set(-0.5f, 0.5f); - - b2CircleShape circle2; - circle2.m_radius = 0.5f; - circle2.m_p.Set(0.5f, 0.5f); - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x + 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&circle1, 2.0f); - body->CreateFixture(&circle2, 0.0f); - } - } - - { - b2PolygonShape polygon1; - polygon1.SetAsBox(0.25f, 0.5f); - - b2PolygonShape polygon2; - polygon2.SetAsBox(0.25f, 0.5f, b2Vec2(0.0f, -0.5f), 0.5f * b2_pi); - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x - 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&polygon1, 2.0f); - body->CreateFixture(&polygon2, 2.0f); - } - } - - { - b2Transform xf1; - xf1.R.Set(0.3524f * b2_pi); - xf1.position = b2Mul(xf1.R, b2Vec2(1.0f, 0.0f)); - - b2Vec2 vertices[3]; - - b2PolygonShape triangle1; - vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - triangle1.Set(vertices, 3); - - b2Transform xf2; - xf2.R.Set(-0.3524f * b2_pi); - xf2.position = b2Mul(xf2.R, b2Vec2(-1.0f, 0.0f)); - - b2PolygonShape triangle2; - vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - triangle2.Set(vertices, 3); - - for (int32 i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(x, 2.05f + 2.5f * i); - bd.angle = 0.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&triangle1, 2.0f); - body->CreateFixture(&triangle2, 2.0f); - } - } - - { - b2PolygonShape bottom; - bottom.SetAsBox( 1.5f, 0.15f ); - - b2PolygonShape left; - left.SetAsBox(0.15f, 2.7f, b2Vec2(-1.45f, 2.35f), 0.2f); - - b2PolygonShape right; - right.SetAsBox(0.15f, 2.7f, b2Vec2(1.45f, 2.35f), -0.2f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set( 0.0f, 2.0f ); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&bottom, 4.0f); - body->CreateFixture(&left, 4.0f); - body->CreateFixture(&right, 4.0f); - } - } - - static Test* Create() - { - return new CompoundShapes; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Confined.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Confined.h deleted file mode 100644 index 4086e2843..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Confined.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONFINED_H -#define CONFINED_H - -class Confined : public Test -{ -public: - - enum - { - e_columnCount = 0, - e_rowCount = 0 - }; - - Confined() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - - // Floor - shape.SetAsEdge(b2Vec2(-10.0f, 0.0f), b2Vec2(10.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Left wall - shape.SetAsEdge(b2Vec2(-10.0f, 0.0f), b2Vec2(-10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Right wall - shape.SetAsEdge(b2Vec2(10.0f, 0.0f), b2Vec2(10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - - // Roof - shape.SetAsEdge(b2Vec2(-10.0f, 20.0f), b2Vec2(10.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - float32 radius = 0.5f; - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = radius; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.1f; - - for (int32 j = 0; j < e_columnCount; ++j) - { - for (int i = 0; i < e_rowCount; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + (2.1f * j + 1.0f + 0.01f * i) * radius, (2.0f * i + 1.0f) * radius); - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - } - } - - m_world->SetGravity(b2Vec2(0.0f, 0.0f)); - } - - void CreateCircle() - { - float32 radius = 2.0f; - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = radius; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.0f; - - b2Vec2 p(RandomFloat(), 3.0f + RandomFloat()); - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = p; - //bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - - body->CreateFixture(&fd); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'c': - CreateCircle(); - break; - } - } - - void Step(Settings* settings) - { - bool sleeping = true; - for (b2Body* b = m_world->GetBodyList(); b; b = b->GetNext()) - { - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - if (b->IsAwake()) - { - sleeping = false; - } - } - - if (m_stepCount == 180) - { - m_stepCount += 0; - } - - //if (sleeping) - //{ - // CreateCircle(); - //} - - Test::Step(settings); - - for (b2Body* b = m_world->GetBodyList(); b; b = b->GetNext()) - { - if (b->GetType() != b2_dynamicBody) - { - continue; - } - - b2Vec2 p = b->GetPosition(); - if (p.x <= -10.0f || 10.0f <= p.x || p.y <= 0.0f || 20.0f <= p.y) - { - p.x += 0.0; - } - } - - m_debugDraw.DrawString(5, m_textLine, "Press 'c' to create a circle."); - m_textLine += 15; - } - - static Test* Create() - { - return new Confined; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ContinuousTest.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ContinuousTest.h deleted file mode 100644 index e360ff330..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ContinuousTest.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef CONTINUOUS_TEST_H -#define CONTINUOUS_TEST_H - -class ContinuousTest : public Test -{ -public: - - ContinuousTest() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, 0.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - - shape.SetAsEdge(b2Vec2(-10.0f, 0.0f), b2Vec2(10.0f, 0.0f)); - body->CreateFixture(&shape, 0.0f); - - shape.SetAsBox(0.2f, 1.0f, b2Vec2(0.5f, 1.0f), 0.0f); - body->CreateFixture(&shape, 0.0f); - } - -#if 1 - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 20.0f); - //bd.angle = 0.1f; - - b2PolygonShape shape; - shape.SetAsBox(2.0f, 0.1f); - - m_body = m_world->CreateBody(&bd); - m_body->CreateFixture(&shape, 1.0f); - - m_angularVelocity = RandomFloat(-50.0f, 50.0f); - m_angularVelocity = 33.468121f; - m_body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - m_body->SetAngularVelocity(m_angularVelocity); - } -#else - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 0.5f); - b2Body* body = m_world->CreateBody(&bd); - - b2CircleShape shape; - shape.m_p.SetZero(); - shape.m_radius = 0.5f; - body->CreateFixture(&shape, 1.0f); - - //bd.bullet = true; - bd.position.Set(0.0f, 10.0f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - } -#endif - } - - void Launch() - { - m_body->SetTransform(b2Vec2(0.0f, 20.0f), 0.0f); - m_angularVelocity = RandomFloat(-50.0f, 50.0f); - m_body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - m_body->SetAngularVelocity(m_angularVelocity); - } - - void Step(Settings* settings) - { - if (m_stepCount == 12) - { - m_stepCount += 0; - } - - Test::Step(settings); - - extern int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; - - if (b2_gjkCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "gjk calls = %d, ave gjk iters = %3.1f, max gjk iters = %d", - b2_gjkCalls, b2_gjkIters / float32(b2_gjkCalls), b2_gjkMaxIters); - m_textLine += 15; - } - - extern int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; - extern int32 b2_toiRootIters, b2_toiMaxRootIters; - extern int32 b2_toiMaxOptIters; - - if (b2_toiCalls > 0) - { - m_debugDraw.DrawString(5, m_textLine, "toi calls = %d, ave toi iters = %3.1f, max toi iters = %d", - b2_toiCalls, b2_toiIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += 15; - - m_debugDraw.DrawString(5, m_textLine, "ave toi root iters = %3.1f, max toi root iters = %d", - b2_toiRootIters / float32(b2_toiCalls), b2_toiMaxRootIters); - m_textLine += 15; - - m_debugDraw.DrawString(5, m_textLine, "max toi opt iters = %d", b2_toiMaxOptIters); - m_textLine += 15; - } - - if (m_stepCount % 60 == 0) - { - Launch(); - } - } - - static Test* Create() - { - return new ContinuousTest; - } - - b2Body* m_body; - float32 m_angularVelocity; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DistanceTest.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DistanceTest.h deleted file mode 100644 index 0900472d5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DistanceTest.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DISTANCE_TEST_H -#define DISTANCE_TEST_H - -class DistanceTest : public Test -{ -public: - DistanceTest() - { - { - m_transformA.SetIdentity(); - m_transformA.position.Set(0.0f, -0.2f); - m_polygonA.SetAsBox(10.0f, 0.2f); - } - - { - m_positionB.Set(12.017401f, 0.13678508f); - m_angleB = -0.0109265f; - m_transformB.Set(m_positionB, m_angleB); - - m_polygonB.SetAsBox(2.0f, 0.1f); - } - } - - static Test* Create() - { - return new DistanceTest; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - b2DistanceInput input; - input.proxyA.Set(&m_polygonA); - input.proxyB.Set(&m_polygonB); - input.transformA = m_transformA; - input.transformB = m_transformB; - input.useRadii = true; - b2SimplexCache cache; - cache.count = 0; - b2DistanceOutput output; - b2Distance(&output, &cache, &input); - - m_debugDraw.DrawString(5, m_textLine, "distance = %g", output.distance); - m_textLine += 15; - - m_debugDraw.DrawString(5, m_textLine, "iterations = %d", output.iterations); - m_textLine += 15; - - { - b2Color color(0.9f, 0.9f, 0.9f); - b2Vec2 v[b2_maxPolygonVertices]; - for (int32 i = 0; i < m_polygonA.m_vertexCount; ++i) - { - v[i] = b2Mul(m_transformA, m_polygonA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonA.m_vertexCount, color); - - for (int32 i = 0; i < m_polygonB.m_vertexCount; ++i) - { - v[i] = b2Mul(m_transformB, m_polygonB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonB.m_vertexCount, color); - } - - b2Vec2 x1 = output.pointA; - b2Vec2 x2 = output.pointB; - - b2Color c1(1.0f, 0.0f, 0.0f); - m_debugDraw.DrawPoint(x1, 4.0f, c1); - - b2Color c2(1.0f, 1.0f, 0.0f); - m_debugDraw.DrawPoint(x2, 4.0f, c2); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_positionB.x -= 0.1f; - break; - - case 'd': - m_positionB.x += 0.1f; - break; - - case 's': - m_positionB.y -= 0.1f; - break; - - case 'w': - m_positionB.y += 0.1f; - break; - - case 'q': - m_angleB += 0.1f * b2_pi; - break; - - case 'e': - m_angleB -= 0.1f * b2_pi; - break; - } - - m_transformB.Set(m_positionB, m_angleB); - } - - b2Vec2 m_positionB; - float32 m_angleB; - - b2Transform m_transformA; - b2Transform m_transformB; - b2PolygonShape m_polygonA; - b2PolygonShape m_polygonB; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Dominos.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Dominos.h deleted file mode 100644 index b71ef60f9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Dominos.h +++ /dev/null @@ -1,222 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DOMINOS_H -#define DOMINOS_H - -class Dominos : public Test -{ -public: - - Dominos() - { - b2Body* b1; - { - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2BodyDef bd; - b1 = m_world->CreateBody(&bd); - b1->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(6.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-1.5f, 10.0f); - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.1f, 1.0f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.friction = 0.1f; - - for (int i = 0; i < 10; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-6.0f + 1.0f * i, 11.25f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&fd); - } - } - - { - b2PolygonShape shape; - shape.SetAsBox(7.0f, 0.25f, b2Vec2_zero, 0.3f); - - b2BodyDef bd; - bd.position.Set(1.0f, 6.0f); - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - b2Body* b2; - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.5f); - - b2BodyDef bd; - bd.position.Set(-7.0f, 4.0f); - b2 = m_world->CreateBody(&bd); - b2->CreateFixture(&shape, 0.0f); - } - - b2Body* b3; - { - b2PolygonShape shape; - shape.SetAsBox(6.0f, 0.125f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-0.9f, 1.0f); - bd.angle = -0.15f; - - b3 = m_world->CreateBody(&bd); - b3->CreateFixture(&shape, 10.0f); - } - - b2RevoluteJointDef jd; - b2Vec2 anchor; - - anchor.Set(-2.0f, 1.0f); - jd.Initialize(b1, b3, anchor); - jd.collideConnected = true; - m_world->CreateJoint(&jd); - - b2Body* b4; - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 0.25f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f, 15.0f); - b4 = m_world->CreateBody(&bd); - b4->CreateFixture(&shape, 10.0f); - } - - anchor.Set(-7.0f, 15.0f); - jd.Initialize(b2, b4, anchor); - m_world->CreateJoint(&jd); - - b2Body* b5; - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(6.5f, 3.0f); - b5 = m_world->CreateBody(&bd); - - b2PolygonShape shape; - b2FixtureDef fd; - - fd.shape = &shape; - fd.density = 10.0f; - fd.friction = 0.1f; - - shape.SetAsBox(1.0f, 0.1f, b2Vec2(0.0f, -0.9f), 0.0f); - b5->CreateFixture(&fd); - - shape.SetAsBox(0.1f, 1.0f, b2Vec2(-0.9f, 0.0f), 0.0f); - b5->CreateFixture(&fd); - - shape.SetAsBox(0.1f, 1.0f, b2Vec2(0.9f, 0.0f), 0.0f); - b5->CreateFixture(&fd); - } - - anchor.Set(6.0f, 2.0f); - jd.Initialize(b1, b5, anchor); - m_world->CreateJoint(&jd); - - b2Body* b6; - { - b2PolygonShape shape; - shape.SetAsBox(1.0f, 0.1f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(6.5f, 4.1f); - b6 = m_world->CreateBody(&bd); - b6->CreateFixture(&shape, 30.0f); - } - - anchor.Set(7.5f, 4.0f); - jd.Initialize(b5, b6, anchor); - m_world->CreateJoint(&jd); - - b2Body* b7; - { - b2PolygonShape shape; - shape.SetAsBox(0.1f, 1.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(7.4f, 1.0f); - - b7 = m_world->CreateBody(&bd); - b7->CreateFixture(&shape, 10.0f); - } - - b2DistanceJointDef djd; - djd.bodyA = b3; - djd.bodyB = b7; - djd.localAnchorA.Set(6.0f, 0.0f); - djd.localAnchorB.Set(0.0f, -1.0f); - b2Vec2 d = djd.bodyB->GetWorldPoint(djd.localAnchorB) - djd.bodyA->GetWorldPoint(djd.localAnchorA); - djd.length = d.Length(); - m_world->CreateJoint(&djd); - - { - float32 radius = 0.2f; - - b2CircleShape shape; - shape.m_radius = radius; - - for (int32 i = 0; i < 4; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(5.9f + 2.0f * radius * i, 2.4f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 10.0f); - } - } - } - - static Test* Create() - { - return new Dominos; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DynamicTreeTest.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DynamicTreeTest.h deleted file mode 100644 index aa867c384..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/DynamicTreeTest.h +++ /dev/null @@ -1,358 +0,0 @@ -/* -* Copyright (c) 2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DYNAMIC_TREE_TEST_H -#define DYNAMIC_TREE_TEST_H - -class DynamicTreeTest : public Test -{ -public: - - enum - { - e_actorCount = 128, - }; - - DynamicTreeTest() - { - m_worldExtent = 15.0f; - m_proxyExtent = 0.5f; - - srand(888); - - for (int32 i = 0; i < e_actorCount; ++i) - { - Actor* actor = m_actors + i; - GetRandomAABB(&actor->aabb); - actor->proxyId = m_tree.CreateProxy(actor->aabb, actor); - } - - m_stepCount = 0; - - float32 h = m_worldExtent; - m_queryAABB.lowerBound.Set(-3.0f, -4.0f + h); - m_queryAABB.upperBound.Set(5.0f, 6.0f + h); - - m_rayCastInput.p1.Set(-5.0, 5.0f + h); - m_rayCastInput.p2.Set(7.0f, -4.0f + h); - //m_rayCastInput.p1.Set(0.0f, 2.0f + h); - //m_rayCastInput.p2.Set(0.0f, -2.0f + h); - m_rayCastInput.maxFraction = 1.0f; - - m_automated = false; - } - - static Test* Create() - { - return new DynamicTreeTest; - } - - void Step(Settings* settings) - { - B2_NOT_USED(settings); - - m_rayActor = NULL; - for (int32 i = 0; i < e_actorCount; ++i) - { - m_actors[i].fraction = 1.0f; - m_actors[i].overlap = false; - } - - if (m_automated == true) - { - int32 actionCount = b2Max(1, e_actorCount >> 2); - - for (int32 i = 0; i < actionCount; ++i) - { - Action(); - } - } - - Query(); - RayCast(); - - for (int32 i = 0; i < e_actorCount; ++i) - { - Actor* actor = m_actors + i; - if (actor->proxyId == b2_nullNode) - continue; - - b2Color c(0.9f, 0.9f, 0.9f); - if (actor == m_rayActor && actor->overlap) - { - c.Set(0.9f, 0.6f, 0.6f); - } - else if (actor == m_rayActor) - { - c.Set(0.6f, 0.9f, 0.6f); - } - else if (actor->overlap) - { - c.Set(0.6f, 0.6f, 0.9f); - } - - m_debugDraw.DrawAABB(&actor->aabb, c); - } - - b2Color c(0.7f, 0.7f, 0.7f); - m_debugDraw.DrawAABB(&m_queryAABB, c); - - m_debugDraw.DrawSegment(m_rayCastInput.p1, m_rayCastInput.p2, c); - - b2Color c1(0.2f, 0.9f, 0.2f); - b2Color c2(0.9f, 0.2f, 0.2f); - m_debugDraw.DrawPoint(m_rayCastInput.p1, 6.0f, c1); - m_debugDraw.DrawPoint(m_rayCastInput.p2, 6.0f, c2); - - if (m_rayActor) - { - b2Color cr(0.2f, 0.2f, 0.9f); - b2Vec2 p = m_rayCastInput.p1 + m_rayActor->fraction * (m_rayCastInput.p2 - m_rayCastInput.p1); - m_debugDraw.DrawPoint(p, 6.0f, cr); - } - - ++m_stepCount; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_automated = !m_automated; - break; - - case 'c': - CreateProxy(); - break; - - case 'd': - DestroyProxy(); - break; - - case 'm': - MoveProxy(); - break; - } - } - - bool QueryCallback(int32 proxyId) - { - Actor* actor = (Actor*)m_tree.GetUserData(proxyId); - actor->overlap = b2TestOverlap(m_queryAABB, actor->aabb); - return true; - } - - float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) - { - Actor* actor = (Actor*)m_tree.GetUserData(proxyId); - - b2RayCastOutput output; - bool hit = actor->aabb.RayCast(&output, input); - - if (hit) - { - m_rayCastOutput = output; - m_rayActor = actor; - m_rayActor->fraction = output.fraction; - return output.fraction; - } - - return input.maxFraction; - } - -private: - - struct Actor - { - b2AABB aabb; - float32 fraction; - bool overlap; - int32 proxyId; - }; - - void GetRandomAABB(b2AABB* aabb) - { - b2Vec2 w; w.Set(2.0f * m_proxyExtent, 2.0f * m_proxyExtent); - //aabb->lowerBound.x = -m_proxyExtent; - //aabb->lowerBound.y = -m_proxyExtent + m_worldExtent; - aabb->lowerBound.x = RandomFloat(-m_worldExtent, m_worldExtent); - aabb->lowerBound.y = RandomFloat(0.0f, 2.0f * m_worldExtent); - aabb->upperBound = aabb->lowerBound + w; - } - - void MoveAABB(b2AABB* aabb) - { - b2Vec2 d; - d.x = RandomFloat(-0.5f, 0.5f); - d.y = RandomFloat(-0.5f, 0.5f); - //d.x = 2.0f; - //d.y = 0.0f; - aabb->lowerBound += d; - aabb->upperBound += d; - - b2Vec2 c0 = 0.5f * (aabb->lowerBound + aabb->upperBound); - b2Vec2 min; min.Set(-m_worldExtent, 0.0f); - b2Vec2 max; max.Set(m_worldExtent, 2.0f * m_worldExtent); - b2Vec2 c = b2Clamp(c0, min, max); - - aabb->lowerBound += c - c0; - aabb->upperBound += c - c0; - } - - void CreateProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId == b2_nullNode) - { - GetRandomAABB(&actor->aabb); - actor->proxyId = m_tree.CreateProxy(actor->aabb, actor); - return; - } - } - } - - void DestroyProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId != b2_nullNode) - { - m_tree.DestroyProxy(actor->proxyId); - actor->proxyId = b2_nullNode; - return; - } - } - } - - void MoveProxy() - { - for (int32 i = 0; i < e_actorCount; ++i) - { - int32 j = rand() % e_actorCount; - Actor* actor = m_actors + j; - if (actor->proxyId == b2_nullNode) - { - continue; - } - - b2AABB aabb0 = actor->aabb; - MoveAABB(&actor->aabb); - b2Vec2 displacement = actor->aabb.GetCenter() - aabb0.GetCenter(); - m_tree.MoveProxy(actor->proxyId, actor->aabb, displacement); - return; - } - } - - void Action() - { - int32 choice = rand() % 20; - - switch (choice) - { - case 0: - CreateProxy(); - break; - - case 1: - DestroyProxy(); - break; - - default: - MoveProxy(); - } - } - - void Query() - { - m_tree.Query(this, m_queryAABB); - - for (int32 i = 0; i < e_actorCount; ++i) - { - if (m_actors[i].proxyId == b2_nullNode) - { - continue; - } - - bool overlap = b2TestOverlap(m_queryAABB, m_actors[i].aabb); - B2_NOT_USED(overlap); - b2Assert(overlap == m_actors[i].overlap); - } - } - - void RayCast() - { - m_rayActor = NULL; - - b2RayCastInput input = m_rayCastInput; - - // Ray cast against the dynamic tree. - m_tree.RayCast(this, input); - - // Brute force ray cast. - Actor* bruteActor = NULL; - b2RayCastOutput bruteOutput; - for (int32 i = 0; i < e_actorCount; ++i) - { - if (m_actors[i].proxyId == b2_nullNode) - { - continue; - } - - b2RayCastOutput output; - bool hit = m_actors[i].aabb.RayCast(&output, input); - if (hit) - { - bruteActor = m_actors + i; - bruteOutput = output; - input.maxFraction = output.fraction; - } - } - - if (bruteActor != NULL) - { - b2Assert(bruteOutput.fraction == m_rayCastOutput.fraction); - } - } - - float32 m_worldExtent; - float32 m_proxyExtent; - - b2DynamicTree m_tree; - b2AABB m_queryAABB; - b2RayCastInput m_rayCastInput; - b2RayCastOutput m_rayCastOutput; - Actor* m_rayActor; - Actor m_actors[e_actorCount]; - int32 m_stepCount; - bool m_automated; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/EdgeShapes.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/EdgeShapes.h deleted file mode 100644 index c1cce3886..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/EdgeShapes.h +++ /dev/null @@ -1,256 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef EDGE_SHAPES_H -#define EDGE_SHAPES_H - -class EdgeShapesCallback : public b2RayCastCallback -{ -public: - EdgeShapesCallback() - { - m_fixture = NULL; - } - - float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) - { - m_fixture = fixture; - m_point = point; - m_normal = normal; - - return fraction; - } - - b2Fixture* m_fixture; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -class EdgeShapes : public Test -{ -public: - - enum - { - e_maxBodies = 256, - }; - - EdgeShapes() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - float32 x1 = -20.0f; - float32 y1 = 2.0f * cosf(x1 / 10.0f * b2_pi); - for (int32 i = 0; i < 80; ++i) - { - float32 x2 = x1 + 0.5f; - float32 y2 = 2.0f * cosf(x2 / 10.0f * b2_pi); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(x1, y1), b2Vec2(x2, y2)); - ground->CreateFixture(&shape, 0.0f); - - x1 = x2; - y1 = y2; - } - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + sqrtf(2.0f)); - float32 s = sqrtf(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - - m_angle = 0.0f; - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - - float32 x = RandomFloat(-10.0f, 10.0f); - float32 y = RandomFloat(10.0f, 20.0f); - bd.position.Set(x, y); - bd.angle = RandomFloat(-b2_pi, b2_pi); - bd.type = b2_dynamicBody; - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.friction = 0.3f; - fd.density = 20.0f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.friction = 0.3f; - fd.density = 20.0f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < e_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - Create(key - '1'); - break; - - case 'd': - DestroyBody(); - break; - } - } - - void Step(Settings* settings) - { - bool advanceRay = settings->pause == 0 || settings->singleStep; - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff"); - m_textLine += 15; - - float32 L = 25.0f; - b2Vec2 point1(0.0f, 10.0f); - b2Vec2 d(L * cosf(m_angle), -L * b2Abs(sinf(m_angle))); - b2Vec2 point2 = point1 + d; - - EdgeShapesCallback callback; - - m_world->RayCast(&callback, point1, point2); - - if (callback.m_fixture) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - - if (advanceRay) - { - m_angle += 0.25f * b2_pi / 180.0f; - } - } - - static Test* Create() - { - return new EdgeShapes; - } - - int32 m_bodyIndex; - b2Body* m_bodies[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; - - float32 m_angle; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Gears.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Gears.h deleted file mode 100644 index f857ac848..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Gears.h +++ /dev/null @@ -1,148 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef GEARS_H -#define GEARS_H - -class Gears : public Test -{ -public: - Gears() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(50.0f, 0.0f), b2Vec2(-50.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape circle1; - circle1.m_radius = 1.0f; - - b2CircleShape circle2; - circle2.m_radius = 2.0f; - - b2PolygonShape box; - box.SetAsBox(0.5f, 5.0f); - - b2BodyDef bd1; - bd1.type = b2_dynamicBody; - bd1.position.Set(-3.0f, 12.0f); - b2Body* body1 = m_world->CreateBody(&bd1); - body1->CreateFixture(&circle1, 5.0f); - - b2RevoluteJointDef jd1; - jd1.bodyA = ground; - jd1.bodyB = body1; - jd1.localAnchorA = ground->GetLocalPoint(bd1.position); - jd1.localAnchorB = body1->GetLocalPoint(bd1.position); - jd1.referenceAngle = body1->GetAngle() - ground->GetAngle(); - m_joint1 = (b2RevoluteJoint*)m_world->CreateJoint(&jd1); - - b2BodyDef bd2; - bd2.type = b2_dynamicBody; - bd2.position.Set(0.0f, 12.0f); - b2Body* body2 = m_world->CreateBody(&bd2); - body2->CreateFixture(&circle2, 5.0f); - - b2RevoluteJointDef jd2; - jd2.Initialize(ground, body2, bd2.position); - m_joint2 = (b2RevoluteJoint*)m_world->CreateJoint(&jd2); - - b2BodyDef bd3; - bd3.type = b2_dynamicBody; - bd3.position.Set(2.5f, 12.0f); - b2Body* body3 = m_world->CreateBody(&bd3); - body3->CreateFixture(&box, 5.0f); - - b2PrismaticJointDef jd3; - jd3.Initialize(ground, body3, bd3.position, b2Vec2(0.0f, 1.0f)); - jd3.lowerTranslation = -5.0f; - jd3.upperTranslation = 5.0f; - jd3.enableLimit = true; - - m_joint3 = (b2PrismaticJoint*)m_world->CreateJoint(&jd3); - - b2GearJointDef jd4; - jd4.bodyA = body1; - jd4.bodyB = body2; - jd4.joint1 = m_joint1; - jd4.joint2 = m_joint2; - jd4.ratio = circle2.m_radius / circle1.m_radius; - m_joint4 = (b2GearJoint*)m_world->CreateJoint(&jd4); - - b2GearJointDef jd5; - jd5.bodyA = body2; - jd5.bodyB = body3; - jd5.joint1 = m_joint2; - jd5.joint2 = m_joint3; - jd5.ratio = -1.0f / circle2.m_radius; - m_joint5 = (b2GearJoint*)m_world->CreateJoint(&jd5); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 0: - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - float32 ratio, value; - - ratio = m_joint4->GetRatio(); - value = m_joint1->GetJointAngle() + ratio * m_joint2->GetJointAngle(); - m_debugDraw.DrawString(5, m_textLine, "theta1 + %4.2f * theta2 = %4.2f", (float) ratio, (float) value); - m_textLine += 15; - - ratio = m_joint5->GetRatio(); - value = m_joint2->GetJointAngle() + ratio * m_joint3->GetJointTranslation(); - m_debugDraw.DrawString(5, m_textLine, "theta2 + %4.2f * delta = %4.2f", (float) ratio, (float) value); - m_textLine += 15; - } - - static Test* Create() - { - return new Gears; - } - - b2RevoluteJoint* m_joint1; - b2RevoluteJoint* m_joint2; - b2PrismaticJoint* m_joint3; - b2GearJoint* m_joint4; - b2GearJoint* m_joint5; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/LineJoint.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/LineJoint.h deleted file mode 100644 index 88a26ab66..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/LineJoint.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef LINE_JOINT_H -#define LINE_JOINT_H - -// A line joint with a limit and friction. -class LineJoint : public Test -{ -public: - LineJoint() - { - b2Body* ground = NULL; - { - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 2.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 7.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - - b2LineJointDef jd; - b2Vec2 axis(2.0f, 1.0f); - axis.Normalize(); - jd.Initialize(ground, body, b2Vec2(0.0f, 8.5f), axis); - jd.motorSpeed = 0.0f; - jd.maxMotorForce = 100.0f; - jd.enableMotor = true; - jd.lowerTranslation = -4.0f; - jd.upperTranslation = 4.0f; - jd.enableLimit = true; - m_world->CreateJoint(&jd); - } - } - - static Test* Create() - { - return new LineJoint; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/OneSidedPlatform.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/OneSidedPlatform.h deleted file mode 100644 index fe926beea..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/OneSidedPlatform.h +++ /dev/null @@ -1,127 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef ONE_SIDED_PLATFORM_H -#define ONE_SIDED_PLATFORM_H - -class OneSidedPlatform : public Test -{ -public: - - enum State - { - e_unknown, - e_above, - e_below, - }; - - OneSidedPlatform() - { - // Ground - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Platform - { - b2BodyDef bd; - bd.position.Set(0.0f, 10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(3.0f, 0.5f); - m_platform = body->CreateFixture(&shape, 0.0f); - - m_bottom = 10.0f - 0.5f; - m_top = 10.0f + 0.5f; - } - - // Actor - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 12.0f); - b2Body* body = m_world->CreateBody(&bd); - - m_radius = 0.5f; - b2CircleShape shape; - shape.m_radius = m_radius; - m_character = body->CreateFixture(&shape, 20.0f); - - body->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); - - m_state = e_unknown; - } - } - - void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) - { - Test::PreSolve(contact, oldManifold); - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA != m_platform && fixtureA != m_character) - { - return; - } - - if (fixtureB != m_character && fixtureB != m_character) - { - return; - } - - b2Vec2 position = m_character->GetBody()->GetPosition(); - - if (position.y < m_top + m_radius - 3.0f * b2_linearSlop) - { - contact->SetEnabled(false); - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (c) create a shape, (d) destroy a shape."); - m_textLine += 15; - } - - static Test* Create() - { - return new OneSidedPlatform; - } - - float32 m_radius, m_top, m_bottom; - State m_state; - b2Fixture* m_platform; - b2Fixture* m_character; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyCollision.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyCollision.h deleted file mode 100644 index 84fd1f48d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyCollision.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef POLYCOLLISION_H -#define POLYCOLLISION_H - -class PolyCollision : public Test -{ -public: - PolyCollision() - { - { - m_polygonA.SetAsEdge(b2Vec2(20.0f, 0.0f), b2Vec2(20.0f, 20.0f)); - m_transformA.Set(b2Vec2(0.0f, 0.0f), 0.0f); - } - - { - m_polygonB.SetAsBox(0.5f, 0.5f); - m_positionB.Set(19.345284f, 1.5632932f); - m_angleB = 1.9160721f; - m_transformB.Set(m_positionB, m_angleB); - } - } - - static Test* Create() - { - return new PolyCollision; - } - - void Step(Settings* settings) - { - B2_NOT_USED(settings); - - b2Manifold manifold; - b2CollidePolygons(&manifold, &m_polygonA, m_transformA, &m_polygonB, m_transformB); - - b2WorldManifold worldManifold; - worldManifold.Initialize(&manifold, m_transformA, m_polygonA.m_radius, m_transformB, m_polygonB.m_radius); - - m_debugDraw.DrawString(5, m_textLine, "point count = %d", manifold.pointCount); - m_textLine += 15; - - { - b2Color color(0.9f, 0.9f, 0.9f); - b2Vec2 v[b2_maxPolygonVertices]; - for (int32 i = 0; i < m_polygonA.m_vertexCount; ++i) - { - v[i] = b2Mul(m_transformA, m_polygonA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonA.m_vertexCount, color); - - for (int32 i = 0; i < m_polygonB.m_vertexCount; ++i) - { - v[i] = b2Mul(m_transformB, m_polygonB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(v, m_polygonB.m_vertexCount, color); - } - - for (int32 i = 0; i < manifold.pointCount; ++i) - { - m_debugDraw.DrawPoint(worldManifold.points[i], 4.0f, b2Color(0.9f, 0.3f, 0.3f)); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_positionB.x -= 0.1f; - break; - - case 'd': - m_positionB.x += 0.1f; - break; - - case 's': - m_positionB.y -= 0.1f; - break; - - case 'w': - m_positionB.y += 0.1f; - break; - - case 'q': - m_angleB += 0.1f * b2_pi; - break; - - case 'e': - m_angleB -= 0.1f * b2_pi; - break; - } - - m_transformB.Set(m_positionB, m_angleB); - } - - b2PolygonShape m_polygonA; - b2PolygonShape m_polygonB; - - b2Transform m_transformA; - b2Transform m_transformB; - - b2Vec2 m_positionB; - float32 m_angleB; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyShapes.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyShapes.h deleted file mode 100644 index efdfd5b3f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/PolyShapes.h +++ /dev/null @@ -1,299 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef POLY_SHAPES_H -#define POLY_SHAPES_H - -/// This tests stacking. It also shows how to use b2World::Query -/// and b2TestOverlap. - -const int32 k_maxBodies = 256; - -/// This callback is called by b2World::QueryAABB. We find all the fixtures -/// that overlap an AABB. Of those, we use b2TestOverlap to determine which fixtures -/// overlap a circle. Up to 4 overlapped fixtures will be highlighted with a yellow border. -class PolyShapesCallback : public b2QueryCallback -{ -public: - - enum - { - e_maxCount = 4 - }; - - PolyShapesCallback() - { - m_count = 0; - } - - void DrawFixture(b2Fixture* fixture) - { - b2Color color(0.95f, 0.95f, 0.6f); - const b2Transform& xf = fixture->GetBody()->GetTransform(); - - switch (fixture->GetType()) - { - case b2Shape::e_circle: - { - b2CircleShape* circle = (b2CircleShape*)fixture->GetShape(); - - b2Vec2 center = b2Mul(xf, circle->m_p); - float32 radius = circle->m_radius; - - m_debugDraw->DrawCircle(center, radius, color); - } - break; - - case b2Shape::e_polygon: - { - b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); - int32 vertexCount = poly->m_vertexCount; - b2Assert(vertexCount <= b2_maxPolygonVertices); - b2Vec2 vertices[b2_maxPolygonVertices]; - - for (int32 i = 0; i < vertexCount; ++i) - { - vertices[i] = b2Mul(xf, poly->m_vertices[i]); - } - - m_debugDraw->DrawPolygon(vertices, vertexCount, color); - } - break; - } - } - - /// Called for each fixture found in the query AABB. - /// @return false to terminate the query. - bool ReportFixture(b2Fixture* fixture) - { - if (m_count == e_maxCount) - { - return false; - } - - b2Body* body = fixture->GetBody(); - b2Shape* shape = fixture->GetShape(); - - bool overlap = b2TestOverlap(shape, &m_circle, body->GetTransform(), m_transform); - - if (overlap) - { - DrawFixture(fixture); - ++m_count; - } - - return true; - } - - b2CircleShape m_circle; - b2Transform m_transform; - b2DebugDraw* m_debugDraw; - int32 m_count; -}; - -class PolyShapes : public Test -{ -public: - PolyShapes() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + sqrtf(2.0f)); - float32 s = sqrtf(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - float32 x = RandomFloat(-2.0f, 2.0f); - bd.position.Set(x, 10.0f); - bd.angle = RandomFloat(-b2_pi, b2_pi); - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.density = 1.0f; - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.density = 1.0f; - fd.friction = 0.3f; - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % k_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < k_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - Create(key - '1'); - break; - - case 'a': - for (int32 i = 0; i < k_maxBodies; i += 2) - { - if (m_bodies[i]) - { - bool active = m_bodies[i]->IsActive(); - m_bodies[i]->SetActive(!active); - } - } - break; - - case 'd': - DestroyBody(); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - PolyShapesCallback callback; - callback.m_circle.m_radius = 2.0f; - callback.m_circle.m_p.Set(0.0f, 2.1f); - callback.m_transform.SetIdentity(); - callback.m_debugDraw = &m_debugDraw; - - b2AABB aabb; - callback.m_circle.ComputeAABB(&aabb, callback.m_transform); - - m_world->QueryAABB(&callback, aabb); - - b2Color color(0.4f, 0.7f, 0.8f); - m_debugDraw.DrawCircle(callback.m_circle.m_p, callback.m_circle.m_radius, color); - - m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff"); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Press 'a' to (de)activate some bodies"); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Press 'd' to destroy a body"); - m_textLine += 15; - } - - static Test* Create() - { - return new PolyShapes; - } - - int32 m_bodyIndex; - b2Body* m_bodies[k_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Prismatic.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Prismatic.h deleted file mode 100644 index 9872001a5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Prismatic.h +++ /dev/null @@ -1,113 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PRISMATIC_H -#define PRISMATIC_H - -class Prismatic : public Test -{ -public: - Prismatic() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(2.0f, 0.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f, 10.0f); - bd.angle = 0.5f * b2_pi; - bd.allowSleep = false; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - b2PrismaticJointDef pjd; - - // Bouncy limit - b2Vec2 axis(2.0f, 1.0f); - axis.Normalize(); - pjd.Initialize(ground, body, b2Vec2(0.0f, 0.0f), axis); - - // Non-bouncy limit - //pjd.Initialize(ground, body, b2Vec2(-10.0f, 10.0f), b2Vec2(1.0f, 0.0f)); - - pjd.motorSpeed = 10.0f; - pjd.maxMotorForce = 10000.0f; - pjd.enableMotor = true; - pjd.lowerTranslation = 0.0f; - pjd.upperTranslation = 20.0f; - pjd.enableLimit = true; - - m_joint = (b2PrismaticJoint*)m_world->CreateJoint(&pjd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'l': - m_joint->EnableLimit(!m_joint->IsLimitEnabled()); - break; - - case 'm': - m_joint->EnableMotor(!m_joint->IsMotorEnabled()); - break; - - case 's': - m_joint->SetMotorSpeed(-m_joint->GetMotorSpeed()); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (l) limits, (m) motors, (s) speed"); - m_textLine += 15; - float32 force = m_joint->GetMotorForce(); - m_debugDraw.DrawString(5, m_textLine, "Motor Force = %4.0f", (float) force); - m_textLine += 15; - } - - static Test* Create() - { - return new Prismatic; - } - - b2PrismaticJoint* m_joint; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pulleys.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pulleys.h deleted file mode 100644 index aba8f9627..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pulleys.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PULLEYS_H -#define PULLEYS_H - -class Pulleys : public Test -{ -public: - Pulleys() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - float32 a = 2.0f; - float32 b = 4.0f; - float32 y = 16.0f; - float32 L = 12.0f; - - b2PolygonShape shape; - shape.SetAsBox(a, b); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(-10.0f, y); - b2Body* body1 = m_world->CreateBody(&bd); - body1->CreateFixture(&shape, 5.0f); - - bd.position.Set(10.0f, y); - b2Body* body2 = m_world->CreateBody(&bd); - body2->CreateFixture(&shape, 5.0f); - - b2PulleyJointDef pulleyDef; - b2Vec2 anchor1(-10.0f, y + b); - b2Vec2 anchor2(10.0f, y + b); - b2Vec2 groundAnchor1(-10.0f, y + b + L); - b2Vec2 groundAnchor2(10.0f, y + b + L); - pulleyDef.Initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 2.0f); - - m_joint1 = (b2PulleyJoint*)m_world->CreateJoint(&pulleyDef); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 0: - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - float32 ratio = m_joint1->GetRatio(); - float32 L = m_joint1->GetLength1() + ratio * m_joint1->GetLength2(); - m_debugDraw.DrawString(5, m_textLine, "L1 + %4.2f * L2 = %4.2f", (float) ratio, (float) L); - m_textLine += 15; - } - - static Test* Create() - { - return new Pulleys; - } - - b2PulleyJoint* m_joint1; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pyramid.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pyramid.h deleted file mode 100644 index c114fd9ef..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Pyramid.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PYRAMID_H -#define PYRAMID_H - -class Pyramid : public Test -{ -public: - enum - { - e_count = 20, - }; - - Pyramid() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - float32 a = 0.5f; - b2PolygonShape shape; - shape.SetAsBox(a, a); - - b2Vec2 x(-7.0f, 0.75f); - b2Vec2 y; - b2Vec2 deltaX(0.5625f, 1.25f); - b2Vec2 deltaY(1.125f, 0.0f); - - for (int32 i = 0; i < e_count; ++i) - { - y = x; - - for (int32 j = i; j < e_count; ++j) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = y; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - y += deltaY; - } - - x += deltaX; - } - } - } - - //void Step(Settings* settings) - //{ - // // We need higher accuracy for the pyramid. - // int32 velocityIterations = settings->velocityIterations; - // int32 positionIterations = settings->positionIterations; - // settings->velocityIterations = b2Max(8, velocityIterations); - // settings->positionIterations = b2Max(1, positionIterations); - // Test::Step(settings); - // settings->velocityIterations = velocityIterations; - // settings->positionIterations = positionIterations; - //} - - static Test* Create() - { - return new Pyramid; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/RayCast.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/RayCast.h deleted file mode 100644 index 5afd1f7a7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/RayCast.h +++ /dev/null @@ -1,448 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef RAY_CAST_H -#define RAY_CAST_H - -// This test demonstrates how to use the world ray-cast feature. -// NOTE: we are intentionally filtering one of the polygons, therefore -// the ray will always miss one type of polygon. - -// This callback finds the closest hit. Polygon 0 is filtered. -class RayCastClosestCallback : public b2RayCastCallback -{ -public: - RayCastClosestCallback() - { - m_hit = false; - } - - float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // filter - return -1.0f; - } - } - - m_hit = true; - m_point = point; - m_normal = normal; - return fraction; - } - - bool m_hit; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -// This callback finds any hit. Polygon 0 is filtered. -class RayCastAnyCallback : public b2RayCastCallback -{ -public: - RayCastAnyCallback() - { - m_hit = false; - } - - float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // filter - return -1.0f; - } - } - - m_hit = true; - m_point = point; - m_normal = normal; - return 0.0f; - } - - bool m_hit; - b2Vec2 m_point; - b2Vec2 m_normal; -}; - -// This ray cast collects multiple hits along the ray. Polygon 0 is filtered. -class RayCastMultipleCallback : public b2RayCastCallback -{ -public: - enum - { - e_maxCount = 3 - }; - - RayCastMultipleCallback() - { - m_count = 0; - } - - float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, - const b2Vec2& normal, float32 fraction) - { - b2Body* body = fixture->GetBody(); - int32 index = 0; - void* userData = body->GetUserData(); - if (userData) - { - int32 index = *(int32*)userData; - if (index == 0) - { - // filter - return -1.0f; - } - } - - b2Assert(m_count < e_maxCount); - - m_points[m_count] = point; - m_normals[m_count] = normal; - ++m_count; - - if (m_count == e_maxCount) - { - return 0.0f; - } - - return 1.0f; - } - - b2Vec2 m_points[e_maxCount]; - b2Vec2 m_normals[e_maxCount]; - int32 m_count; -}; - - -class RayCast : public Test -{ -public: - - enum - { - e_maxBodies = 256, - }; - - enum Mode - { - e_closest, - e_any, - e_multiple - }; - - RayCast() - { - // Ground body - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.5f, 0.0f); - vertices[1].Set(0.5f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[0].Set(vertices, 3); - } - - { - b2Vec2 vertices[3]; - vertices[0].Set(-0.1f, 0.0f); - vertices[1].Set(0.1f, 0.0f); - vertices[2].Set(0.0f, 1.5f); - m_polygons[1].Set(vertices, 3); - } - - { - float32 w = 1.0f; - float32 b = w / (2.0f + sqrtf(2.0f)); - float32 s = sqrtf(2.0f) * b; - - b2Vec2 vertices[8]; - vertices[0].Set(0.5f * s, 0.0f); - vertices[1].Set(0.5f * w, b); - vertices[2].Set(0.5f * w, b + s); - vertices[3].Set(0.5f * s, w); - vertices[4].Set(-0.5f * s, w); - vertices[5].Set(-0.5f * w, b + s); - vertices[6].Set(-0.5f * w, b); - vertices[7].Set(-0.5f * s, 0.0f); - - m_polygons[2].Set(vertices, 8); - } - - { - m_polygons[3].SetAsBox(0.5f, 0.5f); - } - - { - m_circle.m_radius = 0.5f; - } - - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - - m_angle = 0.0f; - - m_mode = e_closest; - } - - void Create(int32 index) - { - if (m_bodies[m_bodyIndex] != NULL) - { - m_world->DestroyBody(m_bodies[m_bodyIndex]); - m_bodies[m_bodyIndex] = NULL; - } - - b2BodyDef bd; - - float32 x = RandomFloat(-10.0f, 10.0f); - float32 y = RandomFloat(0.0f, 20.0f); - bd.position.Set(x, y); - bd.angle = RandomFloat(-b2_pi, b2_pi); - - m_userData[m_bodyIndex] = index; - bd.userData = m_userData + m_bodyIndex; - - if (index == 4) - { - bd.angularDamping = 0.02f; - } - - m_bodies[m_bodyIndex] = m_world->CreateBody(&bd); - - if (index < 4) - { - b2FixtureDef fd; - fd.shape = m_polygons + index; - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - else - { - b2FixtureDef fd; - fd.shape = &m_circle; - fd.friction = 0.3f; - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } - - void DestroyBody() - { - for (int32 i = 0; i < e_maxBodies; ++i) - { - if (m_bodies[i] != NULL) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - return; - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case '1': - case '2': - case '3': - case '4': - case '5': - Create(key - '1'); - break; - - case 'd': - DestroyBody(); - break; - - case 'm': - if (m_mode == e_closest) - { - m_mode = e_any; - } - else if (m_mode == e_any) - { - m_mode = e_multiple; - } - else if (m_mode = e_multiple) - { - m_mode = e_closest; - } - } - } - - void Step(Settings* settings) - { - bool advanceRay = settings->pause == 0 || settings->singleStep; - - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff, m to change the mode"); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Mode = %d", m_mode); - m_textLine += 15; - - float32 L = 11.0f; - b2Vec2 point1(0.0f, 10.0f); - b2Vec2 d(L * cosf(m_angle), L * sinf(m_angle)); - b2Vec2 point2 = point1 + d; - - if (m_mode == e_closest) - { - RayCastClosestCallback callback; - m_world->RayCast(&callback, point1, point2); - - if (callback.m_hit) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - } - else if (m_mode == e_any) - { - RayCastAnyCallback callback; - m_world->RayCast(&callback, point1, point2); - - if (callback.m_hit) - { - m_debugDraw.DrawPoint(callback.m_point, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, callback.m_point, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = callback.m_point + 0.5f * callback.m_normal; - m_debugDraw.DrawSegment(callback.m_point, head, b2Color(0.9f, 0.9f, 0.4f)); - } - else - { - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - } - } - else if (m_mode == e_multiple) - { - RayCastMultipleCallback callback; - m_world->RayCast(&callback, point1, point2); - m_debugDraw.DrawSegment(point1, point2, b2Color(0.8f, 0.8f, 0.8f)); - - for (int32 i = 0; i < callback.m_count; ++i) - { - b2Vec2 p = callback.m_points[i]; - b2Vec2 n = callback.m_normals[i]; - m_debugDraw.DrawPoint(p, 5.0f, b2Color(0.4f, 0.9f, 0.4f)); - m_debugDraw.DrawSegment(point1, p, b2Color(0.8f, 0.8f, 0.8f)); - b2Vec2 head = p + 0.5f * n; - m_debugDraw.DrawSegment(p, head, b2Color(0.9f, 0.9f, 0.4f)); - } - } - - if (advanceRay) - { - m_angle += 0.25f * b2_pi / 180.0f; - } - -#if 0 - // This case was failing. - { - b2Vec2 vertices[4]; - //vertices[0].Set(-22.875f, -3.0f); - //vertices[1].Set(22.875f, -3.0f); - //vertices[2].Set(22.875f, 3.0f); - //vertices[3].Set(-22.875f, 3.0f); - - b2PolygonShape shape; - //shape.Set(vertices, 4); - shape.SetAsBox(22.875f, 3.0f); - - b2RayCastInput input; - input.p1.Set(10.2725f,1.71372f); - input.p2.Set(10.2353f,2.21807f); - //input.maxFraction = 0.567623f; - input.maxFraction = 0.56762173f; - - b2Transform xf; - xf.SetIdentity(); - xf.position.Set(23.0f, 5.0f); - - b2RayCastOutput output; - bool hit; - hit = shape.RayCast(&output, input, xf); - hit = false; - - b2Color color(1.0f, 1.0f, 1.0f); - b2Vec2 vs[4]; - for (int32 i = 0; i < 4; ++i) - { - vs[i] = b2Mul(xf, shape.m_vertices[i]); - } - - m_debugDraw.DrawPolygon(vs, 4, color); - m_debugDraw.DrawSegment(input.p1, input.p2, color); - } -#endif - } - - static Test* Create() - { - return new RayCast; - } - - int32 m_bodyIndex; - b2Body* m_bodies[e_maxBodies]; - int32 m_userData[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; - - float32 m_angle; - - Mode m_mode; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Revolute.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Revolute.h deleted file mode 100644 index 4c02c1a19..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Revolute.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef REVOLUTE_H -#define REVOLUTE_H - -class Revolute : public Test -{ -public: - Revolute() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape shape; - shape.m_radius = 0.5f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - b2RevoluteJointDef rjd; - - bd.position.Set(0.0f, 20.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 5.0f); - - float32 w = 100.0f; - body->SetAngularVelocity(w); - body->SetLinearVelocity(b2Vec2(-8.0f * w, 0.0f)); - - rjd.Initialize(ground, body, b2Vec2(0.0f, 12.0f)); - rjd.motorSpeed = 1.0f * b2_pi; - rjd.maxMotorTorque = 10000.0f; - rjd.enableMotor = false; - rjd.lowerAngle = -0.25f * b2_pi; - rjd.upperAngle = 0.5f * b2_pi; - rjd.enableLimit = true; - rjd.collideConnected = true; - - m_joint = (b2RevoluteJoint*)m_world->CreateJoint(&rjd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'l': - m_joint->EnableLimit(m_joint->IsLimitEnabled()); - break; - - case 's': - m_joint->EnableMotor(false); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (l) limits, (a) left, (s) off, (d) right"); - m_textLine += 15; - //float32 torque1 = m_joint1->GetMotorTorque(); - //m_debugDraw.DrawString(5, m_textLine, "Motor Torque = %4.0f, %4.0f : Motor Force = %4.0f", (float) torque1, (float) torque2, (float) force3); - //m_textLine += 15; - } - - static Test* Create() - { - return new Revolute; - } - - b2RevoluteJoint* m_joint; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SensorTest.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SensorTest.h deleted file mode 100644 index 0b448e30f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SensorTest.h +++ /dev/null @@ -1,188 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SENSOR_TEST_H -#define SENSOR_TEST_H - -// This is used to test sensor shapes. -class SensorTest : public Test -{ -public: - - enum - { - e_count = 7 - }; - - SensorTest() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - { - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - -#if 0 - { - b2FixtureDef sd; - sd.SetAsBox(10.0f, 2.0f, b2Vec2(0.0f, 20.0f), 0.0f); - sd.isSensor = true; - m_sensor = ground->CreateFixture(&sd); - } -#else - { - b2CircleShape shape; - shape.m_radius = 5.0f; - shape.m_p.Set(0.0f, 10.0f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.isSensor = true; - m_sensor = ground->CreateFixture(&fd); - } -#endif - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + 3.0f * i, 20.0f); - bd.userData = m_touching + i; - - m_touching[i] = false; - m_bodies[i] = m_world->CreateBody(&bd); - - m_bodies[i]->CreateFixture(&shape, 1.0f); - } - } - } - - // Implement contact listener. - void BeginContact(b2Contact* contact) - { - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA == m_sensor) - { - void* userData = fixtureB->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = true; - } - } - - if (fixtureB == m_sensor) - { - void* userData = fixtureA->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = true; - } - } - } - - // Implement contact listener. - void EndContact(b2Contact* contact) - { - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - if (fixtureA == m_sensor) - { - void* userData = fixtureB->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = false; - } - } - - if (fixtureB == m_sensor) - { - void* userData = fixtureA->GetBody()->GetUserData(); - if (userData) - { - bool* touching = (bool*)userData; - *touching = false; - } - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - // Traverse the contact results. Apply a force on shapes - // that overlap the sensor. - for (int32 i = 0; i < e_count; ++i) - { - if (m_touching[i] == false) - { - continue; - } - - b2Body* body = m_bodies[i]; - b2Body* ground = m_sensor->GetBody(); - - b2CircleShape* circle = (b2CircleShape*)m_sensor->GetShape(); - b2Vec2 center = ground->GetWorldPoint(circle->m_p); - - b2Vec2 position = body->GetPosition(); - - b2Vec2 d = center - position; - if (d.LengthSquared() < FLT_EPSILON * FLT_EPSILON) - { - continue; - } - - d.Normalize(); - b2Vec2 F = 100.0f * d; - body->ApplyForce(F, position); - } - } - - static Test* Create() - { - return new SensorTest; - } - - b2Fixture* m_sensor; - b2Body* m_bodies[e_count]; - bool m_touching[e_count]; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ShapeEditing.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ShapeEditing.h deleted file mode 100644 index 788ae4d3e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/ShapeEditing.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -* Copyright (c) 2008-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SHAPE_EDITING_H -#define SHAPE_EDITING_H - -class ShapeEditing : public Test -{ -public: - - ShapeEditing() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 10.0f); - m_body = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsBox(4.0f, 4.0f, b2Vec2(0.0f, 0.0f), 0.0f); - m_fixture1 = m_body->CreateFixture(&shape, 10.0f); - - m_fixture2 = NULL; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'c': - if (m_fixture2 == NULL) - { - b2CircleShape shape; - shape.m_radius = 3.0f; - shape.m_p.Set(0.5f, -4.0f); - m_fixture2 = m_body->CreateFixture(&shape, 10.0f); - m_body->SetAwake(true); - } - break; - - case 'd': - if (m_fixture2 != NULL) - { - m_body->DestroyFixture(m_fixture2); - m_fixture2 = NULL; - m_body->SetAwake(true); - } - break; - } - } - - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (c) create a shape, (d) destroy a shape."); - m_textLine += 15; - } - - static Test* Create() - { - return new ShapeEditing; - } - - b2Body* m_body; - b2Fixture* m_fixture1; - b2Fixture* m_fixture2; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SliderCrank.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SliderCrank.h deleted file mode 100644 index 54e95a8b8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SliderCrank.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SLIDER_CRANK_H -#define SLIDER_CRANK_H - -// A motor driven slider crank with joint friction. - -class SliderCrank : public Test -{ -public: - SliderCrank() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2Body* prevBody = ground; - - // Define crank. - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 2.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 7.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 5.0f)); - rjd.motorSpeed = 1.0f * b2_pi; - rjd.maxMotorTorque = 10000.0f; - rjd.enableMotor = true; - m_joint1 = (b2RevoluteJoint*)m_world->CreateJoint(&rjd); - - prevBody = body; - } - - // Define follower. - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 4.0f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 13.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 9.0f)); - rjd.enableMotor = false; - m_world->CreateJoint(&rjd); - - prevBody = body; - } - - // Define piston - { - b2PolygonShape shape; - shape.SetAsBox(1.5f, 1.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 17.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - - b2RevoluteJointDef rjd; - rjd.Initialize(prevBody, body, b2Vec2(0.0f, 17.0f)); - m_world->CreateJoint(&rjd); - - b2PrismaticJointDef pjd; - pjd.Initialize(ground, body, b2Vec2(0.0f, 17.0f), b2Vec2(0.0f, 1.0f)); - - pjd.maxMotorForce = 1000.0f; - pjd.enableMotor = true; - - m_joint2 = (b2PrismaticJoint*)m_world->CreateJoint(&pjd); - } - - // Create a payload - { - b2PolygonShape shape; - shape.SetAsBox(1.5f, 1.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0f, 23.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 2.0f); - } - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'f': - m_joint2->EnableMotor(!m_joint2->IsMotorEnabled()); - m_joint2->GetBodyB()->SetAwake(true); - break; - - case 'm': - m_joint1->EnableMotor(!m_joint1->IsMotorEnabled()); - m_joint1->GetBodyB()->SetAwake(true); - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Keys: (f) toggle friction, (m) toggle motor"); - m_textLine += 15; - float32 torque = m_joint1->GetMotorTorque(); - m_debugDraw.DrawString(5, m_textLine, "Motor Torque = %5.0f", (float) torque); - m_textLine += 15; - } - - static Test* Create() - { - return new SliderCrank; - } - - b2RevoluteJoint* m_joint1; - b2PrismaticJoint* m_joint2; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SphereStack.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SphereStack.h deleted file mode 100644 index cec860026..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/SphereStack.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SPHERE_STACK_H -#define SPHERE_STACK_H - -class SphereStack : public Test -{ -public: - - enum - { - e_count = 10 - }; - - SphereStack() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - for (int32 i = 0; i < e_count; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(0.0, 4.0f + 3.0f * i); - - m_bodies[i] = m_world->CreateBody(&bd); - - m_bodies[i]->CreateFixture(&shape, 1.0f); - - //m_bodies[i]->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - } - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - - //for (int32 i = 0; i < e_count; ++i) - //{ - // printf("%g ", m_bodies[i]->GetWorldCenter().y); - //} - - //for (int32 i = 0; i < e_count; ++i) - //{ - // printf("%g ", m_bodies[i]->GetLinearVelocity().y); - //} - - //printf("\n"); - } - - static Test* Create() - { - return new SphereStack; - } - - b2Body* m_bodies[e_count]; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TestEntries.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TestEntries.cpp deleted file mode 100644 index ee5f0f16c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TestEntries.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "../Framework/Test.h" -#include "../Framework/Render.h" -#include "../../freeglut/GL/glut.h" -#include - -#include "ApplyForce.h" -#include "BodyTypes.h" -#include "Breakable.h" -#include "Bridge.h" -#include "Cantilever.h" -#include "ContinuousTest.h" -#include "Chain.h" -#include "CharacterCollision.h" -#include "CollisionFiltering.h" -#include "CollisionProcessing.h" -#include "CompoundShapes.h" -#include "Confined.h" -#include "DistanceTest.h" -#include "Dominos.h" -#include "DynamicTreeTest.h" -#include "EdgeShapes.h" -#include "Gears.h" -#include "LineJoint.h" -#include "OneSidedPlatform.h" -#include "PolyCollision.h" -#include "PolyShapes.h" -#include "Prismatic.h" -#include "Pulleys.h" -#include "Pyramid.h" -#include "RayCast.h" -#include "Revolute.h" -#include "SensorTest.h" -#include "ShapeEditing.h" -#include "SliderCrank.h" -#include "SphereStack.h" -#include "TheoJansen.h" -#include "TimeOfImpact.h" -#include "VaryingFriction.h" -#include "VaryingRestitution.h" -#include "VerticalStack.h" -#include "Web.h" - -TestEntry g_testEntries[] = -{ - {"Time of Impact", TimeOfImpact::Create}, - {"Ray-Cast", RayCast::Create}, - {"One-Sided Platform", OneSidedPlatform::Create}, - {"Confined", Confined::Create}, - {"Vertical Stack", VerticalStack::Create}, - {"Pyramid", Pyramid::Create}, - {"Varying Restitution", VaryingRestitution::Create}, - {"Theo Jansen's Walker", TheoJansen::Create}, - {"Body Types", BodyTypes::Create}, - {"Character Collision", CharacterCollision::Create}, - {"Prismatic", Prismatic::Create}, - {"Edge Shapes", EdgeShapes::Create}, - {"Continuous Test", ContinuousTest::Create}, - {"PolyCollision", PolyCollision::Create}, - {"Polygon Shapes", PolyShapes::Create}, - {"Apply Force", ApplyForce::Create}, - {"Cantilever", Cantilever::Create}, - {"SphereStack", SphereStack::Create}, - {"Bridge", Bridge::Create}, - {"Breakable", Breakable::Create}, - {"Chain", Chain::Create}, - {"Collision Filtering", CollisionFiltering::Create}, - {"Collision Processing", CollisionProcessing::Create}, - {"Compound Shapes", CompoundShapes::Create}, - {"Distance Test", DistanceTest::Create}, - {"Dominos", Dominos::Create}, - {"Dynamic Tree", DynamicTreeTest::Create}, - {"Gears", Gears::Create}, - {"Line Joint", LineJoint::Create}, - {"Pulleys", Pulleys::Create}, - {"Revolute", Revolute::Create}, - {"Sensor Test", SensorTest::Create}, - {"Shape Editing", ShapeEditing::Create}, - {"Slider Crank", SliderCrank::Create}, - {"Varying Friction", VaryingFriction::Create}, - {"Web", Web::Create}, - {NULL, NULL} -}; - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TheoJansen.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TheoJansen.h deleted file mode 100644 index 419e9838e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TheoJansen.h +++ /dev/null @@ -1,263 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -// Inspired by a contribution by roman_m -// Dimensions scooped from APE (http://www.cove.org/ape/index.htm) - -#ifndef THEO_JANSEN_H -#define THEO_JANSEN_H - -class TheoJansen : public Test -{ -public: - - void CreateLeg(float32 s, const b2Vec2& wheelAnchor) - { - b2Vec2 p1(5.4f * s, -6.1f); - b2Vec2 p2(7.2f * s, -1.2f); - b2Vec2 p3(4.3f * s, -1.9f); - b2Vec2 p4(3.1f * s, 0.8f); - b2Vec2 p5(6.0f * s, 1.5f); - b2Vec2 p6(2.5f * s, 3.7f); - - b2FixtureDef fd1, fd2; - fd1.filter.groupIndex = -1; - fd2.filter.groupIndex = -1; - fd1.density = 1.0f; - fd2.density = 1.0f; - - b2PolygonShape poly1, poly2; - - if (s > 0.0f) - { - b2Vec2 vertices[3]; - - vertices[0] = p1; - vertices[1] = p2; - vertices[2] = p3; - poly1.Set(vertices, 3); - - vertices[0] = b2Vec2_zero; - vertices[1] = p5 - p4; - vertices[2] = p6 - p4; - poly2.Set(vertices, 3); - } - else - { - b2Vec2 vertices[3]; - - vertices[0] = p1; - vertices[1] = p3; - vertices[2] = p2; - poly1.Set(vertices, 3); - - vertices[0] = b2Vec2_zero; - vertices[1] = p6 - p4; - vertices[2] = p5 - p4; - poly2.Set(vertices, 3); - } - - fd1.shape = &poly1; - fd2.shape = &poly2; - - b2BodyDef bd1, bd2; - bd1.type = b2_dynamicBody; - bd2.type = b2_dynamicBody; - bd1.position = m_offset; - bd2.position = p4 + m_offset; - - bd1.angularDamping = 10.0f; - bd2.angularDamping = 10.0f; - - b2Body* body1 = m_world->CreateBody(&bd1); - b2Body* body2 = m_world->CreateBody(&bd2); - - body1->CreateFixture(&fd1); - body2->CreateFixture(&fd2); - - b2DistanceJointDef djd; - - // Using a soft distance constraint can reduce some jitter. - // It also makes the structure seem a bit more fluid by - // acting like a suspension system. - djd.dampingRatio = 0.5f; - djd.frequencyHz = 10.0f; - - djd.Initialize(body1, body2, p2 + m_offset, p5 + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset); - m_world->CreateJoint(&djd); - - djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset); - m_world->CreateJoint(&djd); - - b2RevoluteJointDef rjd; - - rjd.Initialize(body2, m_chassis, p4 + m_offset); - m_world->CreateJoint(&rjd); - } - - TheoJansen() - { - m_offset.Set(0.0f, 8.0f); - m_motorSpeed = 2.0f; - m_motorOn = true; - b2Vec2 pivot(0.0f, 0.8f); - - // Ground - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-50.0f, 0.0f), b2Vec2(50.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.SetAsEdge(b2Vec2(-50.0f, 0.0f), b2Vec2(-50.0f, 10.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.SetAsEdge(b2Vec2(50.0f, 0.0f), b2Vec2(50.0f, 10.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - // Balls - for (int32 i = 0; i < 40; ++i) - { - b2CircleShape shape; - shape.m_radius = 0.25f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-40.0f + 2.0f * i, 0.5f); - - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&shape, 1.0f); - } - - // Chassis - { - b2PolygonShape shape; - shape.SetAsBox(2.5f, 1.0f); - - b2FixtureDef sd; - sd.density = 1.0f; - sd.shape = &shape; - sd.filter.groupIndex = -1; - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = pivot + m_offset; - m_chassis = m_world->CreateBody(&bd); - m_chassis->CreateFixture(&sd); - } - - { - b2CircleShape shape; - shape.m_radius = 1.6f; - - b2FixtureDef sd; - sd.density = 1.0f; - sd.shape = &shape; - sd.filter.groupIndex = -1; - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = pivot + m_offset; - m_wheel = m_world->CreateBody(&bd); - m_wheel->CreateFixture(&sd); - } - - { - b2RevoluteJointDef jd; - jd.Initialize(m_wheel, m_chassis, pivot + m_offset); - jd.collideConnected = false; - jd.motorSpeed = m_motorSpeed; - jd.maxMotorTorque = 400.0f; - jd.enableMotor = m_motorOn; - m_motorJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - } - - b2Vec2 wheelAnchor; - - wheelAnchor = pivot + b2Vec2(0.0f, -0.8f); - - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - - m_wheel->SetTransform(m_wheel->GetPosition(), 120.0f * b2_pi / 180.0f); - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - - m_wheel->SetTransform(m_wheel->GetPosition(), -120.0f * b2_pi / 180.0f); - CreateLeg(-1.0f, wheelAnchor); - CreateLeg(1.0f, wheelAnchor); - } - - void Step(Settings* settings) - { - m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d, toggle motor = m"); - m_textLine += 15; - - Test::Step(settings); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_motorJoint->SetMotorSpeed(-m_motorSpeed); - break; - - case 's': - m_motorJoint->SetMotorSpeed(0.0f); - break; - - case 'd': - m_motorJoint->SetMotorSpeed(m_motorSpeed); - break; - - case 'm': - m_motorJoint->EnableMotor(!m_motorJoint->IsMotorEnabled()); - break; - } - } - - static Test* Create() - { - return new TheoJansen; - } - - b2Vec2 m_offset; - b2Body* m_chassis; - b2Body* m_wheel; - b2RevoluteJoint* m_motorJoint; - bool m_motorOn; - float32 m_motorSpeed; -}; - -#endif // THEO_JANSEN_H - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TimeOfImpact.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TimeOfImpact.h deleted file mode 100644 index 2bf05fe5a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/TimeOfImpact.h +++ /dev/null @@ -1,138 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef TIME_OF_IMPACT_H -#define TIME_OF_IMPACT_H - -class TimeOfImpact : public Test -{ -public: - TimeOfImpact() - { - m_shapeA.SetAsBox(25.0f, 5.0f); - m_shapeB.SetAsBox(2.5f, 2.5f); - } - - static Test* Create() - { - return new TimeOfImpact; - } - - void Step(Settings* settings) - { - Test::Step(settings); - - b2Sweep sweepA; - sweepA.c0.Set(24.0f, -60.0f); - sweepA.a0 = 2.95f; - sweepA.c = sweepA.c0; - sweepA.a = sweepA.a0; - sweepA.localCenter.SetZero(); - - b2Sweep sweepB; - sweepB.c0.Set(53.474274f, -50.252514f); - sweepB.a0 = 513.36676f; // - 162.0f * b2_pi; - sweepB.c.Set(54.595478f, -51.083473f); - sweepB.a = 513.62781f; // - 162.0f * b2_pi; - sweepB.localCenter.SetZero(); - - //sweepB.a0 -= 300.0f * b2_pi; - //sweepB.a -= 300.0f * b2_pi; - - b2TOIInput input; - input.proxyA.Set(&m_shapeA); - input.proxyB.Set(&m_shapeB); - input.sweepA = sweepA; - input.sweepB = sweepB; - input.tMax = 1.0f; - - b2TOIOutput output; - - b2TimeOfImpact(&output, &input); - - m_debugDraw.DrawString(5, m_textLine, "toi = %g", output.t); - m_textLine += 15; - - extern int32 b2_toiMaxIters, b2_toiMaxRootIters; - m_debugDraw.DrawString(5, m_textLine, "max toi iters = %d, max root iters = %d", b2_toiMaxIters, b2_toiMaxRootIters); - m_textLine += 15; - - b2Vec2 vertices[b2_maxPolygonVertices]; - - b2Transform transformA; - sweepA.GetTransform(&transformA, 0.0f); - for (int32 i = 0; i < m_shapeA.m_vertexCount; ++i) - { - vertices[i] = b2Mul(transformA, m_shapeA.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeA.m_vertexCount, b2Color(0.9f, 0.9f, 0.9f)); - - b2Transform transformB; - sweepB.GetTransform(&transformB, 0.0f); - - b2Vec2 localPoint(2.0f, -0.1f); - b2Vec2 rB = b2Mul(transformB, localPoint) - sweepB.c0; - float32 wB = sweepB.a - sweepB.a0; - b2Vec2 vB = sweepB.c - sweepB.c0; - b2Vec2 v = vB + b2Cross(wB, rB); - - for (int32 i = 0; i < m_shapeB.m_vertexCount; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_vertexCount, b2Color(0.5f, 0.9f, 0.5f)); - - sweepB.GetTransform(&transformB, output.t); - for (int32 i = 0; i < m_shapeB.m_vertexCount; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_vertexCount, b2Color(0.5f, 0.7f, 0.9f)); - - sweepB.GetTransform(&transformB, 1.0f); - for (int32 i = 0; i < m_shapeB.m_vertexCount; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_vertexCount, b2Color(0.9f, 0.5f, 0.5f)); - -#if 0 - for (float32 t = 0.0f; t < 1.0f; t += 0.1f) - { - sweepB.GetTransform(&transformB, t); - for (int32 i = 0; i < m_shapeB.m_vertexCount; ++i) - { - vertices[i] = b2Mul(transformB, m_shapeB.m_vertices[i]); - } - m_debugDraw.DrawPolygon(vertices, m_shapeB.m_vertexCount, b2Color(0.9f, 0.5f, 0.5f)); - } -#endif - } - - b2PolygonShape m_shapeA; - b2PolygonShape m_shapeB; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingFriction.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingFriction.h deleted file mode 100644 index 5fb91641d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingFriction.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VARYING_FRICTION_H -#define VARYING_FRICTION_H - -class VaryingFriction : public Test -{ -public: - - VaryingFriction() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-4.0f, 22.0f); - bd.angle = -0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.0f); - - b2BodyDef bd; - bd.position.Set(10.5f, 19.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(4.0f, 14.0f); - bd.angle = 0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.25f, 1.0f); - - b2BodyDef bd; - bd.position.Set(-10.5f, 11.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(13.0f, 0.25f); - - b2BodyDef bd; - bd.position.Set(-4.0f, 6.0f); - bd.angle = -0.25f; - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 25.0f; - - float friction[5] = {0.75f, 0.5f, 0.35f, 0.1f, 0.0f}; - - for (int i = 0; i < 5; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-15.0f + 4.0f * i, 28.0f); - b2Body* body = m_world->CreateBody(&bd); - - fd.friction = friction[i]; - body->CreateFixture(&fd); - } - } - } - - static Test* Create() - { - return new VaryingFriction; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingRestitution.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingRestitution.h deleted file mode 100644 index f98e787ab..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VaryingRestitution.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VARYING_RESTITUTION_H -#define VARYING_RESTITUTION_H - -class VaryingRestitution : public Test -{ -public: - - VaryingRestitution() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2CircleShape shape; - shape.m_radius = 1.0f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - - float32 restitution[7] = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; - - for (int32 i = 0; i < 7; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position.Set(-10.0f + 3.0f * i, 20.0f); - - b2Body* body = m_world->CreateBody(&bd); - - fd.restitution = restitution[i]; - body->CreateFixture(&fd); - } - } - } - - static Test* Create() - { - return new VaryingRestitution; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VerticalStack.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VerticalStack.h deleted file mode 100644 index dc46a0953..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/VerticalStack.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef VERTICAL_STACK_H -#define VERTICAL_STACK_H - -class VerticalStack : public Test -{ -public: - - enum - { - e_columnCount = 5, - e_rowCount = 16 - //e_columnCount = 1, - //e_rowCount = 1 - }; - - VerticalStack() - { - { - b2BodyDef bd; - b2Body* ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - - shape.SetAsEdge(b2Vec2(20.0f, 0.0f), b2Vec2(20.0f, 20.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - float32 xs[5] = {0.0f, -10.0f, -5.0f, 5.0f, 10.0f}; - - for (int32 j = 0; j < e_columnCount; ++j) - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 1.0f; - fd.friction = 0.3f; - - for (int i = 0; i < e_rowCount; ++i) - { - b2BodyDef bd; - bd.type = b2_dynamicBody; - - int32 n = j * e_rowCount + i; - b2Assert(n < e_rowCount * e_columnCount); - m_indices[n] = n; - bd.userData = m_indices + n; - - float32 x = 0.0f; - //float32 x = RandomFloat(-0.02f, 0.02f); - //float32 x = i % 2 == 0 ? -0.025f : 0.025f; - bd.position.Set(xs[j] + x, 0.752f + 1.54f * i); - b2Body* body = m_world->CreateBody(&bd); - - m_bodies[n] = body; - - body->CreateFixture(&fd); - } - } - - m_bullet = NULL; - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case ',': - if (m_bullet != NULL) - { - m_world->DestroyBody(m_bullet); - m_bullet = NULL; - } - - { - b2CircleShape shape; - shape.m_radius = 0.25f; - - b2FixtureDef fd; - fd.shape = &shape; - fd.density = 20.0f; - fd.restitution = 0.05f; - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.bullet = true; - bd.position.Set(-31.0f, 5.0f); - - m_bullet = m_world->CreateBody(&bd); - m_bullet->CreateFixture(&fd); - - m_bullet->SetLinearVelocity(b2Vec2(400.0f, 0.0f)); - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "Press: (,) to launch a bullet."); - m_textLine += 15; - - //if (m_stepCount == 300) - //{ - // if (m_bullet != NULL) - // { - // m_world->DestroyBody(m_bullet); - // m_bullet = NULL; - // } - - // { - // b2CircleShape shape; - // shape.m_radius = 0.25f; - - // b2FixtureDef fd; - // fd.shape = &shape; - // fd.density = 20.0f; - // fd.restitution = 0.05f; - - // b2BodyDef bd; - // bd.type = b2_dynamicBody; - // bd.bullet = true; - // bd.position.Set(-31.0f, 5.0f); - - // m_bullet = m_world->CreateBody(&bd); - // m_bullet->CreateFixture(&fd); - - // m_bullet->SetLinearVelocity(b2Vec2(400.0f, 0.0f)); - // } - //} - } - - static Test* Create() - { - return new VerticalStack; - } - - b2Body* m_bullet; - b2Body* m_bodies[e_rowCount * e_columnCount]; - int32 m_indices[e_rowCount * e_columnCount]; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Web.h b/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Web.h deleted file mode 100644 index ba10fa0dd..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/Testbed/Tests/Web.h +++ /dev/null @@ -1,216 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef WEB_H -#define WEB_H - -// This tests distance joints, body destruction, and joint destruction. -class Web : public Test -{ -public: - Web() - { - b2Body* ground = NULL; - { - b2BodyDef bd; - ground = m_world->CreateBody(&bd); - - b2PolygonShape shape; - shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); - ground->CreateFixture(&shape, 0.0f); - } - - { - b2PolygonShape shape; - shape.SetAsBox(0.5f, 0.5f); - - b2BodyDef bd; - bd.type = b2_dynamicBody; - - bd.position.Set(-5.0f, 5.0f); - m_bodies[0] = m_world->CreateBody(&bd); - m_bodies[0]->CreateFixture(&shape, 5.0f); - - bd.position.Set(5.0f, 5.0f); - m_bodies[1] = m_world->CreateBody(&bd); - m_bodies[1]->CreateFixture(&shape, 5.0f); - - bd.position.Set(5.0f, 15.0f); - m_bodies[2] = m_world->CreateBody(&bd); - m_bodies[2]->CreateFixture(&shape, 5.0f); - - bd.position.Set(-5.0f, 15.0f); - m_bodies[3] = m_world->CreateBody(&bd); - m_bodies[3]->CreateFixture(&shape, 5.0f); - - b2DistanceJointDef jd; - b2Vec2 p1, p2, d; - - jd.frequencyHz = 4.0f; - jd.dampingRatio = 0.5f; - - jd.bodyA = ground; - jd.bodyB = m_bodies[0]; - jd.localAnchorA.Set(-10.0f, 0.0f); - jd.localAnchorB.Set(-0.5f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[0] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[1]; - jd.localAnchorA.Set(10.0f, 0.0f); - jd.localAnchorB.Set(0.5f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[1] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[2]; - jd.localAnchorA.Set(10.0f, 20.0f); - jd.localAnchorB.Set(0.5f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[2] = m_world->CreateJoint(&jd); - - jd.bodyA = ground; - jd.bodyB = m_bodies[3]; - jd.localAnchorA.Set(-10.0f, 20.0f); - jd.localAnchorB.Set(-0.5f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[3] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[0]; - jd.bodyB = m_bodies[1]; - jd.localAnchorA.Set(0.5f, 0.0f); - jd.localAnchorB.Set(-0.5f, 0.0f);; - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[4] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[1]; - jd.bodyB = m_bodies[2]; - jd.localAnchorA.Set(0.0f, 0.5f); - jd.localAnchorB.Set(0.0f, -0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[5] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[2]; - jd.bodyB = m_bodies[3]; - jd.localAnchorA.Set(-0.5f, 0.0f); - jd.localAnchorB.Set(0.5f, 0.0f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[6] = m_world->CreateJoint(&jd); - - jd.bodyA = m_bodies[3]; - jd.bodyB = m_bodies[0]; - jd.localAnchorA.Set(0.0f, -0.5f); - jd.localAnchorB.Set(0.0f, 0.5f); - p1 = jd.bodyA->GetWorldPoint(jd.localAnchorA); - p2 = jd.bodyB->GetWorldPoint(jd.localAnchorB); - d = p2 - p1; - jd.length = d.Length(); - m_joints[7] = m_world->CreateJoint(&jd); - } - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'b': - for (int32 i = 0; i < 4; ++i) - { - if (m_bodies[i]) - { - m_world->DestroyBody(m_bodies[i]); - m_bodies[i] = NULL; - break; - } - } - break; - - case 'j': - for (int32 i = 0; i < 8; ++i) - { - if (m_joints[i]) - { - m_world->DestroyJoint(m_joints[i]); - m_joints[i] = NULL; - break; - } - } - break; - } - } - - void Step(Settings* settings) - { - Test::Step(settings); - m_debugDraw.DrawString(5, m_textLine, "This demonstrates a soft distance joint."); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Press: (b) to delete a body, (j) to delete a joint"); - m_textLine += 15; - } - - void JointDestroyed(b2Joint* joint) - { - for (int32 i = 0; i < 8; ++i) - { - if (m_joints[i] == joint) - { - m_joints[i] = NULL; - break; - } - } - } - - static Test* Create() - { - return new Web; - } - - b2Body* m_bodies[4]; - b2Joint* m_joints[8]; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/CMakeLists.txt deleted file mode 100644 index e2993087c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -add_definitions( -DFREEGLUT_EXPORTS -DFREEGLUT_STATIC -D_CRT_SECURE_NO_WARNINGS ) - -if(APPLE) - include_directories( /usr/X11/include ) -endif(APPLE) - -if(UNIX) - add_definitions( -D__unix__ -DHAVE_FCNTL_H -DHAVE_GETTIMEOFDAY ) -endif(UNIX) - -set(freeglut_SRCS - freeglut_callbacks.c - freeglut_callbacks.c - freeglut_cursor.c - freeglut_display.c - freeglut_ext.c - freeglut_font_data.c - freeglut_font.c - freeglut_gamemode.c - freeglut_geometry.c - freeglut_glutfont_definitions.c - freeglut_init.c - freeglut_input_devices.c - freeglut_internal.h - freeglut_joystick.c - freeglut_main.c - freeglut_menu.c - freeglut_misc.c - freeglut_overlay.c - freeglut_spaceball.c - freeglut_state.c - freeglut_stroke_mono_roman.c - freeglut_stroke_roman.c - freeglut_structure.c - freeglut_teapot_data.h - freeglut_teapot.c - freeglut_videoresize.c - freeglut_window.c - GL/freeglut.h - GL/freeglut_ext.h - GL/freeglut_std.h - GL/glut.h -) - -include_directories ( - ${OPENGL_INCLUDE_DIR} - . -) - -add_library(freeglut_static - ${freeglut_SRCS} -) diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/COPYING b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/COPYING deleted file mode 100644 index fc36ad990..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/COPYING +++ /dev/null @@ -1,27 +0,0 @@ - - Freeglut Copyright - ------------------ - - Freeglut code without an explicit copyright is covered by the following - copyright: - - Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies or substantial portions of the Software. - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the name of Pawel W. Olszta shall not be - used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from Pawel W. Olszta. diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut.h deleted file mode 100644 index 11becd8e2..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __FREEGLUT_H__ -#define __FREEGLUT_H__ - -/* - * freeglut.h - * - * The freeglut library include file - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "freeglut_std.h" -#include "freeglut_ext.h" - -/*** END OF FILE ***/ - -#endif /* __FREEGLUT_H__ */ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_ext.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_ext.h deleted file mode 100644 index 4028bc5ef..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_ext.h +++ /dev/null @@ -1,219 +0,0 @@ -#ifndef __FREEGLUT_EXT_H__ -#define __FREEGLUT_EXT_H__ - -/* - * freeglut_ext.h - * - * The non-GLUT-compatible extensions to the freeglut library include file - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 2 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifdef __cplusplus - extern "C" { -#endif - -/* - * Additional GLUT Key definitions for the Special key function - */ -#define GLUT_KEY_NUM_LOCK 0x006D -#define GLUT_KEY_BEGIN 0x006E -#define GLUT_KEY_DELETE 0x006F - -/* - * GLUT API Extension macro definitions -- behaviour when the user clicks on an "x" to close a window - */ -#define GLUT_ACTION_EXIT 0 -#define GLUT_ACTION_GLUTMAINLOOP_RETURNS 1 -#define GLUT_ACTION_CONTINUE_EXECUTION 2 - -/* - * Create a new rendering context when the user opens a new window? - */ -#define GLUT_CREATE_NEW_CONTEXT 0 -#define GLUT_USE_CURRENT_CONTEXT 1 - -/* - * Direct/Indirect rendering context options (has meaning only in Unix/X11) - */ -#define GLUT_FORCE_INDIRECT_CONTEXT 0 -#define GLUT_ALLOW_DIRECT_CONTEXT 1 -#define GLUT_TRY_DIRECT_CONTEXT 2 -#define GLUT_FORCE_DIRECT_CONTEXT 3 - -/* - * GLUT API Extension macro definitions -- the glutGet parameters - */ -#define GLUT_INIT_STATE 0x007C - -#define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9 - -#define GLUT_WINDOW_BORDER_WIDTH 0x01FA -#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB - -#define GLUT_VERSION 0x01FC - -#define GLUT_RENDERING_CONTEXT 0x01FD -#define GLUT_DIRECT_RENDERING 0x01FE - -#define GLUT_FULL_SCREEN 0x01FF - -/* - * New tokens for glutInitDisplayMode. - * Only one GLUT_AUXn bit may be used at a time. - * Value 0x0400 is defined in OpenGLUT. - */ -#define GLUT_AUX 0x1000 - -#define GLUT_AUX1 0x1000 -#define GLUT_AUX2 0x2000 -#define GLUT_AUX3 0x4000 -#define GLUT_AUX4 0x8000 - -/* - * Context-related flags, see freeglut_state.c - */ -#define GLUT_INIT_MAJOR_VERSION 0x0200 -#define GLUT_INIT_MINOR_VERSION 0x0201 -#define GLUT_INIT_FLAGS 0x0202 -#define GLUT_INIT_PROFILE 0x0203 - -/* - * Flags for glutInitContextFlags, see freeglut_init.c - */ -#define GLUT_DEBUG 0x0001 -#define GLUT_FORWARD_COMPATIBLE 0x0002 - - -/* - * Flags for glutInitContextProfile, see freeglut_init.c - */ -#define GLUT_CORE_PROFILE 0x0001 -#define GLUT_COMPATIBILITY_PROFILE 0x0002 - -/* - * Process loop function, see freeglut_main.c - */ -FGAPI void FGAPIENTRY glutMainLoopEvent( void ); -FGAPI void FGAPIENTRY glutLeaveMainLoop( void ); -FGAPI void FGAPIENTRY glutExit ( void ); - -/* - * Window management functions, see freeglut_window.c - */ -FGAPI void FGAPIENTRY glutFullScreenToggle( void ); - -/* - * Window-specific callback functions, see freeglut_callbacks.c - */ -FGAPI void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ); -FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ); -FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ); -/* A. Donev: Also a destruction callback for menus */ -FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ); - -/* - * State setting and retrieval functions, see freeglut_state.c - */ -FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ); -FGAPI int * FGAPIENTRY glutGetModeValues(GLenum mode, int * size); -/* A.Donev: User-data manipulation */ -FGAPI void* FGAPIENTRY glutGetWindowData( void ); -FGAPI void FGAPIENTRY glutSetWindowData(void* data); -FGAPI void* FGAPIENTRY glutGetMenuData( void ); -FGAPI void FGAPIENTRY glutSetMenuData(void* data); - -/* - * Font stuff, see freeglut_font.c - */ -FGAPI int FGAPIENTRY glutBitmapHeight( void* font ); -FGAPI GLfloat FGAPIENTRY glutStrokeHeight( void* font ); -FGAPI void FGAPIENTRY glutBitmapString( void* font, const unsigned char *string ); -FGAPI void FGAPIENTRY glutStrokeString( void* font, const unsigned char *string ); - -/* - * Geometry functions, see freeglut_geometry.c - */ -FGAPI void FGAPIENTRY glutWireRhombicDodecahedron( void ); -FGAPI void FGAPIENTRY glutSolidRhombicDodecahedron( void ); -FGAPI void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale ); -FGAPI void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale ); -FGAPI void FGAPIENTRY glutWireCylinder( GLdouble radius, GLdouble height, GLint slices, GLint stacks); -FGAPI void FGAPIENTRY glutSolidCylinder( GLdouble radius, GLdouble height, GLint slices, GLint stacks); - -/* - * Extension functions, see freeglut_ext.c - */ -typedef void (*GLUTproc)(); -FGAPI GLUTproc FGAPIENTRY glutGetProcAddress( const char *procName ); - -/* - * Joystick functions, see freeglut_joystick.c - */ -/* USE OF THESE FUNCTIONS IS DEPRECATED !!!!! */ -/* If you have a serious need for these functions in your application, please either - * contact the "freeglut" developer community at freeglut-developer@lists.sourceforge.net, - * switch to the OpenGLUT library, or else port your joystick functionality over to PLIB's - * "js" library. - */ -int glutJoystickGetNumAxes( int ident ); -int glutJoystickGetNumButtons( int ident ); -int glutJoystickNotWorking( int ident ); -float glutJoystickGetDeadBand( int ident, int axis ); -void glutJoystickSetDeadBand( int ident, int axis, float db ); -float glutJoystickGetSaturation( int ident, int axis ); -void glutJoystickSetSaturation( int ident, int axis, float st ); -void glutJoystickSetMinRange( int ident, float *axes ); -void glutJoystickSetMaxRange( int ident, float *axes ); -void glutJoystickSetCenter( int ident, float *axes ); -void glutJoystickGetMinRange( int ident, float *axes ); -void glutJoystickGetMaxRange( int ident, float *axes ); -void glutJoystickGetCenter( int ident, float *axes ); - -/* - * Initialization functions, see freeglut_init.c - */ -FGAPI void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion ); -FGAPI void FGAPIENTRY glutInitContextFlags( int flags ); -FGAPI void FGAPIENTRY glutInitContextProfile( int profile ); - -/* - * GLUT API macro definitions -- the display mode definitions - */ -#define GLUT_CAPTIONLESS 0x0400 -#define GLUT_BORDERLESS 0x0800 -#define GLUT_SRGB 0x1000 - -#ifdef __cplusplus - } -#endif - -/*** END OF FILE ***/ - -#endif /* __FREEGLUT_EXT_H__ */ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_std.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_std.h deleted file mode 100644 index 60a6659ba..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/freeglut_std.h +++ /dev/null @@ -1,633 +0,0 @@ -#ifndef __FREEGLUT_STD_H__ -#define __FREEGLUT_STD_H__ - -/* - * freeglut_std.h - * - * The GLUT-compatible part of the freeglut library include file - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 2 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifdef __cplusplus - extern "C" { -#endif - -/* - * Under windows, we have to differentiate between static and dynamic libraries - */ -#ifdef _WIN32 -/* #pragma may not be supported by some compilers. - * Discussion by FreeGLUT developers suggests that - * Visual C++ specific code involving pragmas may - * need to move to a separate header. 24th Dec 2003 - */ - -/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library - * pragmas or to 1 to exclude library pragmas. - * The default behavior depends on the compiler/platform. - */ -# ifndef FREEGLUT_LIB_PRAGMAS -# if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE) -# define FREEGLUT_LIB_PRAGMAS 1 -# else -# define FREEGLUT_LIB_PRAGMAS 0 -# endif -# endif - -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN 1 -# endif -# define NOMINMAX -# include - -/* Windows static library */ -# ifdef FREEGLUT_STATIC - -# define FGAPI -# define FGAPIENTRY - - /* Link with Win32 static freeglut lib */ -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib, "freeglut_static.lib") -# endif - -/* Windows shared library (DLL) */ -# else - -# define FGAPIENTRY __stdcall -# if defined(FREEGLUT_EXPORTS) -# define FGAPI __declspec(dllexport) -# else -# define FGAPI __declspec(dllimport) - - /* Link with Win32 shared freeglut lib */ -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib, "freeglut.lib") -# endif - -# endif - -# endif - -/* Drag in other Windows libraries as required by FreeGLUT */ -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib, "glu32.lib") /* link OpenGL Utility lib */ -# pragma comment (lib, "opengl32.lib") /* link Microsoft OpenGL lib */ -# pragma comment (lib, "gdi32.lib") /* link Windows GDI lib */ -# pragma comment (lib, "winmm.lib") /* link Windows MultiMedia lib */ -# pragma comment (lib, "user32.lib") /* link Windows user lib */ -# endif - -#else - -/* Non-Windows definition of FGAPI and FGAPIENTRY */ -# define FGAPI -# define FGAPIENTRY - -#endif - -/* - * The freeglut and GLUT API versions - */ -#define FREEGLUT 1 -#define GLUT_API_VERSION 4 -#define FREEGLUT_VERSION_2_0 1 -#define GLUT_XLIB_IMPLEMENTATION 13 - -/* - * Always include OpenGL and GLU headers - */ -#include -#include - -/* - * GLUT API macro definitions -- the special key codes: - */ -#define GLUT_KEY_F1 0x0001 -#define GLUT_KEY_F2 0x0002 -#define GLUT_KEY_F3 0x0003 -#define GLUT_KEY_F4 0x0004 -#define GLUT_KEY_F5 0x0005 -#define GLUT_KEY_F6 0x0006 -#define GLUT_KEY_F7 0x0007 -#define GLUT_KEY_F8 0x0008 -#define GLUT_KEY_F9 0x0009 -#define GLUT_KEY_F10 0x000A -#define GLUT_KEY_F11 0x000B -#define GLUT_KEY_F12 0x000C -#define GLUT_KEY_LEFT 0x0064 -#define GLUT_KEY_UP 0x0065 -#define GLUT_KEY_RIGHT 0x0066 -#define GLUT_KEY_DOWN 0x0067 -#define GLUT_KEY_PAGE_UP 0x0068 -#define GLUT_KEY_PAGE_DOWN 0x0069 -#define GLUT_KEY_HOME 0x006A -#define GLUT_KEY_END 0x006B -#define GLUT_KEY_INSERT 0x006C - -/* - * GLUT API macro definitions -- mouse state definitions - */ -#define GLUT_LEFT_BUTTON 0x0000 -#define GLUT_MIDDLE_BUTTON 0x0001 -#define GLUT_RIGHT_BUTTON 0x0002 -#define GLUT_DOWN 0x0000 -#define GLUT_UP 0x0001 -#define GLUT_LEFT 0x0000 -#define GLUT_ENTERED 0x0001 - -/* - * GLUT API macro definitions -- the display mode definitions - */ -#define GLUT_RGB 0x0000 -#define GLUT_RGBA 0x0000 -#define GLUT_INDEX 0x0001 -#define GLUT_SINGLE 0x0000 -#define GLUT_DOUBLE 0x0002 -#define GLUT_ACCUM 0x0004 -#define GLUT_ALPHA 0x0008 -#define GLUT_DEPTH 0x0010 -#define GLUT_STENCIL 0x0020 -#define GLUT_MULTISAMPLE 0x0080 -#define GLUT_STEREO 0x0100 -#define GLUT_LUMINANCE 0x0200 - -/* - * GLUT API macro definitions -- windows and menu related definitions - */ -#define GLUT_MENU_NOT_IN_USE 0x0000 -#define GLUT_MENU_IN_USE 0x0001 -#define GLUT_NOT_VISIBLE 0x0000 -#define GLUT_VISIBLE 0x0001 -#define GLUT_HIDDEN 0x0000 -#define GLUT_FULLY_RETAINED 0x0001 -#define GLUT_PARTIALLY_RETAINED 0x0002 -#define GLUT_FULLY_COVERED 0x0003 - -/* - * GLUT API macro definitions -- fonts definitions - * - * Steve Baker suggested to make it binary compatible with GLUT: - */ -#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__) -# define GLUT_STROKE_ROMAN ((void *)0x0000) -# define GLUT_STROKE_MONO_ROMAN ((void *)0x0001) -# define GLUT_BITMAP_9_BY_15 ((void *)0x0002) -# define GLUT_BITMAP_8_BY_13 ((void *)0x0003) -# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *)0x0004) -# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *)0x0005) -# define GLUT_BITMAP_HELVETICA_10 ((void *)0x0006) -# define GLUT_BITMAP_HELVETICA_12 ((void *)0x0007) -# define GLUT_BITMAP_HELVETICA_18 ((void *)0x0008) -#else - /* - * I don't really know if it's a good idea... But here it goes: - */ - extern void* glutStrokeRoman; - extern void* glutStrokeMonoRoman; - extern void* glutBitmap9By15; - extern void* glutBitmap8By13; - extern void* glutBitmapTimesRoman10; - extern void* glutBitmapTimesRoman24; - extern void* glutBitmapHelvetica10; - extern void* glutBitmapHelvetica12; - extern void* glutBitmapHelvetica18; - - /* - * Those pointers will be used by following definitions: - */ -# define GLUT_STROKE_ROMAN ((void *) &glutStrokeRoman) -# define GLUT_STROKE_MONO_ROMAN ((void *) &glutStrokeMonoRoman) -# define GLUT_BITMAP_9_BY_15 ((void *) &glutBitmap9By15) -# define GLUT_BITMAP_8_BY_13 ((void *) &glutBitmap8By13) -# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *) &glutBitmapTimesRoman10) -# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *) &glutBitmapTimesRoman24) -# define GLUT_BITMAP_HELVETICA_10 ((void *) &glutBitmapHelvetica10) -# define GLUT_BITMAP_HELVETICA_12 ((void *) &glutBitmapHelvetica12) -# define GLUT_BITMAP_HELVETICA_18 ((void *) &glutBitmapHelvetica18) -#endif - -/* - * GLUT API macro definitions -- the glutGet parameters - */ -#define GLUT_WINDOW_X 0x0064 -#define GLUT_WINDOW_Y 0x0065 -#define GLUT_WINDOW_WIDTH 0x0066 -#define GLUT_WINDOW_HEIGHT 0x0067 -#define GLUT_WINDOW_BUFFER_SIZE 0x0068 -#define GLUT_WINDOW_STENCIL_SIZE 0x0069 -#define GLUT_WINDOW_DEPTH_SIZE 0x006A -#define GLUT_WINDOW_RED_SIZE 0x006B -#define GLUT_WINDOW_GREEN_SIZE 0x006C -#define GLUT_WINDOW_BLUE_SIZE 0x006D -#define GLUT_WINDOW_ALPHA_SIZE 0x006E -#define GLUT_WINDOW_ACCUM_RED_SIZE 0x006F -#define GLUT_WINDOW_ACCUM_GREEN_SIZE 0x0070 -#define GLUT_WINDOW_ACCUM_BLUE_SIZE 0x0071 -#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 0x0072 -#define GLUT_WINDOW_DOUBLEBUFFER 0x0073 -#define GLUT_WINDOW_RGBA 0x0074 -#define GLUT_WINDOW_PARENT 0x0075 -#define GLUT_WINDOW_NUM_CHILDREN 0x0076 -#define GLUT_WINDOW_COLORMAP_SIZE 0x0077 -#define GLUT_WINDOW_NUM_SAMPLES 0x0078 -#define GLUT_WINDOW_STEREO 0x0079 -#define GLUT_WINDOW_CURSOR 0x007A - -#define GLUT_SCREEN_WIDTH 0x00C8 -#define GLUT_SCREEN_HEIGHT 0x00C9 -#define GLUT_SCREEN_WIDTH_MM 0x00CA -#define GLUT_SCREEN_HEIGHT_MM 0x00CB -#define GLUT_MENU_NUM_ITEMS 0x012C -#define GLUT_DISPLAY_MODE_POSSIBLE 0x0190 -#define GLUT_INIT_WINDOW_X 0x01F4 -#define GLUT_INIT_WINDOW_Y 0x01F5 -#define GLUT_INIT_WINDOW_WIDTH 0x01F6 -#define GLUT_INIT_WINDOW_HEIGHT 0x01F7 -#define GLUT_INIT_DISPLAY_MODE 0x01F8 -#define GLUT_ELAPSED_TIME 0x02BC -#define GLUT_WINDOW_FORMAT_ID 0x007B - -/* - * GLUT API macro definitions -- the glutDeviceGet parameters - */ -#define GLUT_HAS_KEYBOARD 0x0258 -#define GLUT_HAS_MOUSE 0x0259 -#define GLUT_HAS_SPACEBALL 0x025A -#define GLUT_HAS_DIAL_AND_BUTTON_BOX 0x025B -#define GLUT_HAS_TABLET 0x025C -#define GLUT_NUM_MOUSE_BUTTONS 0x025D -#define GLUT_NUM_SPACEBALL_BUTTONS 0x025E -#define GLUT_NUM_BUTTON_BOX_BUTTONS 0x025F -#define GLUT_NUM_DIALS 0x0260 -#define GLUT_NUM_TABLET_BUTTONS 0x0261 -#define GLUT_DEVICE_IGNORE_KEY_REPEAT 0x0262 -#define GLUT_DEVICE_KEY_REPEAT 0x0263 -#define GLUT_HAS_JOYSTICK 0x0264 -#define GLUT_OWNS_JOYSTICK 0x0265 -#define GLUT_JOYSTICK_BUTTONS 0x0266 -#define GLUT_JOYSTICK_AXES 0x0267 -#define GLUT_JOYSTICK_POLL_RATE 0x0268 - -/* - * GLUT API macro definitions -- the glutLayerGet parameters - */ -#define GLUT_OVERLAY_POSSIBLE 0x0320 -#define GLUT_LAYER_IN_USE 0x0321 -#define GLUT_HAS_OVERLAY 0x0322 -#define GLUT_TRANSPARENT_INDEX 0x0323 -#define GLUT_NORMAL_DAMAGED 0x0324 -#define GLUT_OVERLAY_DAMAGED 0x0325 - -/* - * GLUT API macro definitions -- the glutVideoResizeGet parameters - */ -#define GLUT_VIDEO_RESIZE_POSSIBLE 0x0384 -#define GLUT_VIDEO_RESIZE_IN_USE 0x0385 -#define GLUT_VIDEO_RESIZE_X_DELTA 0x0386 -#define GLUT_VIDEO_RESIZE_Y_DELTA 0x0387 -#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 0x0388 -#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 0x0389 -#define GLUT_VIDEO_RESIZE_X 0x038A -#define GLUT_VIDEO_RESIZE_Y 0x038B -#define GLUT_VIDEO_RESIZE_WIDTH 0x038C -#define GLUT_VIDEO_RESIZE_HEIGHT 0x038D - -/* - * GLUT API macro definitions -- the glutUseLayer parameters - */ -#define GLUT_NORMAL 0x0000 -#define GLUT_OVERLAY 0x0001 - -/* - * GLUT API macro definitions -- the glutGetModifiers parameters - */ -#define GLUT_ACTIVE_SHIFT 0x0001 -#define GLUT_ACTIVE_CTRL 0x0002 -#define GLUT_ACTIVE_ALT 0x0004 - -/* - * GLUT API macro definitions -- the glutSetCursor parameters - */ -#define GLUT_CURSOR_RIGHT_ARROW 0x0000 -#define GLUT_CURSOR_LEFT_ARROW 0x0001 -#define GLUT_CURSOR_INFO 0x0002 -#define GLUT_CURSOR_DESTROY 0x0003 -#define GLUT_CURSOR_HELP 0x0004 -#define GLUT_CURSOR_CYCLE 0x0005 -#define GLUT_CURSOR_SPRAY 0x0006 -#define GLUT_CURSOR_WAIT 0x0007 -#define GLUT_CURSOR_TEXT 0x0008 -#define GLUT_CURSOR_CROSSHAIR 0x0009 -#define GLUT_CURSOR_UP_DOWN 0x000A -#define GLUT_CURSOR_LEFT_RIGHT 0x000B -#define GLUT_CURSOR_TOP_SIDE 0x000C -#define GLUT_CURSOR_BOTTOM_SIDE 0x000D -#define GLUT_CURSOR_LEFT_SIDE 0x000E -#define GLUT_CURSOR_RIGHT_SIDE 0x000F -#define GLUT_CURSOR_TOP_LEFT_CORNER 0x0010 -#define GLUT_CURSOR_TOP_RIGHT_CORNER 0x0011 -#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 0x0012 -#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 0x0013 -#define GLUT_CURSOR_INHERIT 0x0064 -#define GLUT_CURSOR_NONE 0x0065 -#define GLUT_CURSOR_FULL_CROSSHAIR 0x0066 - -/* - * GLUT API macro definitions -- RGB color component specification definitions - */ -#define GLUT_RED 0x0000 -#define GLUT_GREEN 0x0001 -#define GLUT_BLUE 0x0002 - -/* - * GLUT API macro definitions -- additional keyboard and joystick definitions - */ -#define GLUT_KEY_REPEAT_OFF 0x0000 -#define GLUT_KEY_REPEAT_ON 0x0001 -#define GLUT_KEY_REPEAT_DEFAULT 0x0002 - -#define GLUT_JOYSTICK_BUTTON_A 0x0001 -#define GLUT_JOYSTICK_BUTTON_B 0x0002 -#define GLUT_JOYSTICK_BUTTON_C 0x0004 -#define GLUT_JOYSTICK_BUTTON_D 0x0008 - -/* - * GLUT API macro definitions -- game mode definitions - */ -#define GLUT_GAME_MODE_ACTIVE 0x0000 -#define GLUT_GAME_MODE_POSSIBLE 0x0001 -#define GLUT_GAME_MODE_WIDTH 0x0002 -#define GLUT_GAME_MODE_HEIGHT 0x0003 -#define GLUT_GAME_MODE_PIXEL_DEPTH 0x0004 -#define GLUT_GAME_MODE_REFRESH_RATE 0x0005 -#define GLUT_GAME_MODE_DISPLAY_CHANGED 0x0006 - -/* - * Initialization functions, see fglut_init.c - */ -FGAPI void FGAPIENTRY glutInit( int* pargc, char** argv ); -FGAPI void FGAPIENTRY glutInitWindowPosition( int x, int y ); -FGAPI void FGAPIENTRY glutInitWindowSize( int width, int height ); -FGAPI void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ); -FGAPI void FGAPIENTRY glutInitDisplayString( const char* displayMode ); - -/* - * Process loop function, see freeglut_main.c - */ -FGAPI void FGAPIENTRY glutMainLoop( void ); - -/* - * Window management functions, see freeglut_window.c - */ -FGAPI int FGAPIENTRY glutCreateWindow( const char* title ); -FGAPI int FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height ); -FGAPI void FGAPIENTRY glutDestroyWindow( int window ); -FGAPI void FGAPIENTRY glutSetWindow( int window ); -FGAPI int FGAPIENTRY glutGetWindow( void ); -FGAPI void FGAPIENTRY glutSetWindowTitle( const char* title ); -FGAPI void FGAPIENTRY glutSetIconTitle( const char* title ); -FGAPI void FGAPIENTRY glutReshapeWindow( int width, int height ); -FGAPI void FGAPIENTRY glutPositionWindow( int x, int y ); -FGAPI void FGAPIENTRY glutShowWindow( void ); -FGAPI void FGAPIENTRY glutHideWindow( void ); -FGAPI void FGAPIENTRY glutIconifyWindow( void ); -FGAPI void FGAPIENTRY glutPushWindow( void ); -FGAPI void FGAPIENTRY glutPopWindow( void ); -FGAPI void FGAPIENTRY glutFullScreen( void ); - -/* - * Display-connected functions, see freeglut_display.c - */ -FGAPI void FGAPIENTRY glutPostWindowRedisplay( int window ); -FGAPI void FGAPIENTRY glutPostRedisplay( void ); -FGAPI void FGAPIENTRY glutSwapBuffers( void ); - -/* - * Mouse cursor functions, see freeglut_cursor.c - */ -FGAPI void FGAPIENTRY glutWarpPointer( int x, int y ); -FGAPI void FGAPIENTRY glutSetCursor( int cursor ); - -/* - * Overlay stuff, see freeglut_overlay.c - */ -FGAPI void FGAPIENTRY glutEstablishOverlay( void ); -FGAPI void FGAPIENTRY glutRemoveOverlay( void ); -FGAPI void FGAPIENTRY glutUseLayer( GLenum layer ); -FGAPI void FGAPIENTRY glutPostOverlayRedisplay( void ); -FGAPI void FGAPIENTRY glutPostWindowOverlayRedisplay( int window ); -FGAPI void FGAPIENTRY glutShowOverlay( void ); -FGAPI void FGAPIENTRY glutHideOverlay( void ); - -/* - * Menu stuff, see freeglut_menu.c - */ -FGAPI int FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) ); -FGAPI void FGAPIENTRY glutDestroyMenu( int menu ); -FGAPI int FGAPIENTRY glutGetMenu( void ); -FGAPI void FGAPIENTRY glutSetMenu( int menu ); -FGAPI void FGAPIENTRY glutAddMenuEntry( const char* label, int value ); -FGAPI void FGAPIENTRY glutAddSubMenu( const char* label, int subMenu ); -FGAPI void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value ); -FGAPI void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value ); -FGAPI void FGAPIENTRY glutRemoveMenuItem( int item ); -FGAPI void FGAPIENTRY glutAttachMenu( int button ); -FGAPI void FGAPIENTRY glutDetachMenu( int button ); - -/* - * Global callback functions, see freeglut_callbacks.c - */ -FGAPI void FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value ); -FGAPI void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ); - -/* - * Window-specific callback functions, see freeglut_callbacks.c - */ -FGAPI void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) ); -FGAPI void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ); -FGAPI void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ); -FGAPI void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ); -FGAPI void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ); -FGAPI void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutEntryFunc( void (* callback)( int ) ); - -FGAPI void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) ); -FGAPI void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ); -FGAPI void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval ); -FGAPI void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ); -FGAPI void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ); -FGAPI void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) ); -FGAPI void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) ); - -FGAPI void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ); -FGAPI void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ); -FGAPI void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) ); -FGAPI void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) ); - -/* - * State setting and retrieval functions, see freeglut_state.c - */ -FGAPI int FGAPIENTRY glutGet( GLenum query ); -FGAPI int FGAPIENTRY glutDeviceGet( GLenum query ); -FGAPI int FGAPIENTRY glutGetModifiers( void ); -FGAPI int FGAPIENTRY glutLayerGet( GLenum query ); - -/* - * Font stuff, see freeglut_font.c - */ -FGAPI void FGAPIENTRY glutBitmapCharacter( void* font, int character ); -FGAPI int FGAPIENTRY glutBitmapWidth( void* font, int character ); -FGAPI void FGAPIENTRY glutStrokeCharacter( void* font, int character ); -FGAPI int FGAPIENTRY glutStrokeWidth( void* font, int character ); -FGAPI int FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string ); -FGAPI int FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string ); - -/* - * Geometry functions, see freeglut_geometry.c - */ -FGAPI void FGAPIENTRY glutWireCube( GLdouble size ); -FGAPI void FGAPIENTRY glutSolidCube( GLdouble size ); -FGAPI void FGAPIENTRY glutWireSphere( GLdouble radius, GLint slices, GLint stacks ); -FGAPI void FGAPIENTRY glutSolidSphere( GLdouble radius, GLint slices, GLint stacks ); -FGAPI void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks ); -FGAPI void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks ); - -FGAPI void FGAPIENTRY glutWireTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings ); -FGAPI void FGAPIENTRY glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings ); -FGAPI void FGAPIENTRY glutWireDodecahedron( void ); -FGAPI void FGAPIENTRY glutSolidDodecahedron( void ); -FGAPI void FGAPIENTRY glutWireOctahedron( void ); -FGAPI void FGAPIENTRY glutSolidOctahedron( void ); -FGAPI void FGAPIENTRY glutWireTetrahedron( void ); -FGAPI void FGAPIENTRY glutSolidTetrahedron( void ); -FGAPI void FGAPIENTRY glutWireIcosahedron( void ); -FGAPI void FGAPIENTRY glutSolidIcosahedron( void ); - -/* - * Teapot rendering functions, found in freeglut_teapot.c - */ -FGAPI void FGAPIENTRY glutWireTeapot( GLdouble size ); -FGAPI void FGAPIENTRY glutSolidTeapot( GLdouble size ); - -/* - * Game mode functions, see freeglut_gamemode.c - */ -FGAPI void FGAPIENTRY glutGameModeString( const char* string ); -FGAPI int FGAPIENTRY glutEnterGameMode( void ); -FGAPI void FGAPIENTRY glutLeaveGameMode( void ); -FGAPI int FGAPIENTRY glutGameModeGet( GLenum query ); - -/* - * Video resize functions, see freeglut_videoresize.c - */ -FGAPI int FGAPIENTRY glutVideoResizeGet( GLenum query ); -FGAPI void FGAPIENTRY glutSetupVideoResizing( void ); -FGAPI void FGAPIENTRY glutStopVideoResizing( void ); -FGAPI void FGAPIENTRY glutVideoResize( int x, int y, int width, int height ); -FGAPI void FGAPIENTRY glutVideoPan( int x, int y, int width, int height ); - -/* - * Colormap functions, see freeglut_misc.c - */ -FGAPI void FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue ); -FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component ); -FGAPI void FGAPIENTRY glutCopyColormap( int window ); - -/* - * Misc keyboard and joystick functions, see freeglut_misc.c - */ -FGAPI void FGAPIENTRY glutIgnoreKeyRepeat( int ignore ); -FGAPI void FGAPIENTRY glutSetKeyRepeat( int repeatMode ); -FGAPI void FGAPIENTRY glutForceJoystickFunc( void ); - -/* - * Misc functions, see freeglut_misc.c - */ -FGAPI int FGAPIENTRY glutExtensionSupported( const char* extension ); -FGAPI void FGAPIENTRY glutReportErrors( void ); - -/* Comment from glut.h of classic GLUT: - - Win32 has an annoying issue where there are multiple C run-time - libraries (CRTs). If the executable is linked with a different CRT - from the GLUT DLL, the GLUT DLL will not share the same CRT static - data seen by the executable. In particular, atexit callbacks registered - in the executable will not be called if GLUT calls its (different) - exit routine). GLUT is typically built with the - "/MD" option (the CRT with multithreading DLL support), but the Visual - C++ linker default is "/ML" (the single threaded CRT). - - One workaround to this issue is requiring users to always link with - the same CRT as GLUT is compiled with. That requires users supply a - non-standard option. GLUT 3.7 has its own built-in workaround where - the executable's "exit" function pointer is covertly passed to GLUT. - GLUT then calls the executable's exit function pointer to ensure that - any "atexit" calls registered by the application are called if GLUT - needs to exit. - - Note that the __glut*WithExit routines should NEVER be called directly. - To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ - -/* to get the prototype for exit() */ -#include - -#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__) -FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); -FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); -FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int)); -#ifndef FREEGLUT_BUILDING_LIB -#if defined(__GNUC__) -#define FGUNUSED __attribute__((unused)) -#else -#define FGUNUSED -#endif -static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } -#define glutInit glutInit_ATEXIT_HACK -static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } -#define glutCreateWindow glutCreateWindow_ATEXIT_HACK -static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); } -#define glutCreateMenu glutCreateMenu_ATEXIT_HACK -#endif -#endif - -#ifdef __cplusplus - } -#endif - -/*** END OF FILE ***/ - -#endif /* __FREEGLUT_STD_H__ */ - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/glut.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/glut.h deleted file mode 100644 index 18adbaa2f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/GL/glut.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __GLUT_H__ -#define __GLUT_H__ - -/* - * glut.h - * - * The freeglut library include file - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -// The Box2D testbed uses the full version of freeglut. -#include "freeglut.h" -//#include "freeglut_std.h" - -/*** END OF FILE ***/ - -#endif /* __GLUT_H__ */ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_callbacks.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_callbacks.c deleted file mode 100644 index 4915e19bc..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_callbacks.c +++ /dev/null @@ -1,367 +0,0 @@ -/* - * freeglut_callbacks.c - * - * The callbacks setting methods. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 3 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * All of the callbacks setting methods can be generalized to this: - */ -#define SET_CALLBACK(a) \ -do \ -{ \ - if( fgStructure.CurrentWindow == NULL ) \ - return; \ - SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); \ -} while( 0 ) - -/* - * Sets the Display callback for the current window - */ -void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" ); - if( !callback ) - fgError( "Fatal error in program. NULL display callback not " - "permitted in GLUT 3.0+ or freeglut 2.0.1+" ); - SET_CALLBACK( Display ); -} - -/* - * Sets the Reshape callback for the current window - */ -void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" ); - SET_CALLBACK( Reshape ); -} - -/* - * Sets the Keyboard callback for the current window - */ -void FGAPIENTRY glutKeyboardFunc( void (* callback) - ( unsigned char, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardFunc" ); - SET_CALLBACK( Keyboard ); -} - -/* - * Sets the Special callback for the current window - */ -void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialFunc" ); - SET_CALLBACK( Special ); -} - -/* - * Sets the global idle callback - */ -void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIdleFunc" ); - fgState.IdleCallback = callback; -} - -/* - * Sets the Timer callback for the current window - */ -void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ), - int timerID ) -{ - SFG_Timer *timer, *node; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTimerFunc" ); - - if( (timer = fgState.FreeTimers.Last) ) - { - fgListRemove( &fgState.FreeTimers, &timer->Node ); - } - else - { - if( ! (timer = malloc(sizeof(SFG_Timer))) ) - fgError( "Fatal error: " - "Memory allocation failure in glutTimerFunc()" ); - } - - timer->Callback = callback; - timer->ID = timerID; - timer->TriggerTime = fgElapsedTime() + timeOut; - - for( node = fgState.Timers.First; node; node = node->Node.Next ) - { - if( node->TriggerTime > timer->TriggerTime ) - break; - } - - fgListInsert( &fgState.Timers, &node->Node, &timer->Node ); -} - -/* - * Sets the Visibility callback for the current window. - */ -static void fghVisibility( int status ) -{ - int glut_status = GLUT_VISIBLE; - - FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Visibility Callback" ); - freeglut_return_if_fail( fgStructure.CurrentWindow ); - - if( ( GLUT_HIDDEN == status ) || ( GLUT_FULLY_COVERED == status ) ) - glut_status = GLUT_NOT_VISIBLE; - INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( glut_status ) ); -} - -void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutVisibilityFunc" ); - SET_CALLBACK( Visibility ); - - if( callback ) - glutWindowStatusFunc( fghVisibility ); - else - glutWindowStatusFunc( NULL ); -} - -/* - * Sets the keyboard key release callback for the current window - */ -void FGAPIENTRY glutKeyboardUpFunc( void (* callback) - ( unsigned char, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardUpFunc" ); - SET_CALLBACK( KeyboardUp ); -} - -/* - * Sets the special key release callback for the current window - */ -void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialUpFunc" ); - SET_CALLBACK( SpecialUp ); -} - -/* - * Sets the joystick callback and polling rate for the current window - */ -void FGAPIENTRY glutJoystickFunc( void (* callback) - ( unsigned int, int, int, int ), - int pollInterval ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" ); - fgInitialiseJoysticks (); - - SET_CALLBACK( Joystick ); - fgStructure.CurrentWindow->State.JoystickPollRate = pollInterval; - - fgStructure.CurrentWindow->State.JoystickLastPoll = - fgElapsedTime() - fgStructure.CurrentWindow->State.JoystickPollRate; - - if( fgStructure.CurrentWindow->State.JoystickLastPoll < 0 ) - fgStructure.CurrentWindow->State.JoystickLastPoll = 0; -} - -/* - * Sets the mouse callback for the current window - */ -void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseFunc" ); - SET_CALLBACK( Mouse ); -} - -/* - * Sets the mouse wheel callback for the current window - */ -void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseWheelFunc" ); - SET_CALLBACK( MouseWheel ); -} - -/* - * Sets the mouse motion callback for the current window (one or more buttons - * are pressed) - */ -void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMotionFunc" ); - SET_CALLBACK( Motion ); -} - -/* - * Sets the passive mouse motion callback for the current window (no mouse - * buttons are pressed) - */ -void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPassiveMotionFunc" ); - SET_CALLBACK( Passive ); -} - -/* - * Window mouse entry/leave callback - */ -void FGAPIENTRY glutEntryFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEntryFunc" ); - SET_CALLBACK( Entry ); -} - -/* - * Window destruction callbacks - */ -void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCloseFunc" ); - SET_CALLBACK( Destroy ); -} - -void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWMCloseFunc" ); - glutCloseFunc( callback ); -} - -/* A. Donev: Destruction callback for menus */ -void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" ); - if( fgStructure.CurrentMenu ) - fgStructure.CurrentMenu->Destroy = callback; -} - -/* - * Deprecated version of glutMenuStatusFunc callback setting method - */ -void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" ); - fgState.MenuStateCallback = callback; -} - -/* - * Sets the global menu status callback for the current window - */ -void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" ); - fgState.MenuStatusCallback = callback; -} - -/* - * Sets the overlay display callback for the current window - */ -void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutOverlayDisplayFunc" ); - SET_CALLBACK( OverlayDisplay ); -} - -/* - * Sets the window status callback for the current window - */ -void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWindowStatusFunc" ); - SET_CALLBACK( WindowStatus ); -} - -/* - * Sets the spaceball motion callback for the current window - */ -void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballMotionFunc" ); - fgInitialiseSpaceball(); - - SET_CALLBACK( SpaceMotion ); -} - -/* - * Sets the spaceball rotate callback for the current window - */ -void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballRotateFunc" ); - fgInitialiseSpaceball(); - - SET_CALLBACK( SpaceRotation ); -} - -/* - * Sets the spaceball button callback for the current window - */ -void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballButtonFunc" ); - fgInitialiseSpaceball(); - - SET_CALLBACK( SpaceButton ); -} - -/* - * Sets the button box callback for the current window - */ -void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutButtonBoxFunc" ); - SET_CALLBACK( ButtonBox ); -} - -/* - * Sets the dials box callback for the current window - */ -void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDialsFunc" ); - SET_CALLBACK( Dials ); -} - -/* - * Sets the tablet motion callback for the current window - */ -void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletMotionFunc" ); - SET_CALLBACK( TabletMotion ); -} - -/* - * Sets the tablet buttons callback for the current window - */ -void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletButtonFunc" ); - SET_CALLBACK( TabletButton ); -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_cursor.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_cursor.c deleted file mode 100644 index 0d48e9941..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_cursor.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * freeglut_cursor.c - * - * The mouse cursor related stuff. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 - #include -#endif - -/* - * TODO BEFORE THE STABLE RELEASE: - * glutSetCursor() -- Win32 mappings are incomplete. - * - * It would be good to use custom mouse cursor shapes, and introduce - * an option to display them using glBitmap() and/or texture mapping, - * apart from the windowing system version. - */ - -/* -- PRIVATE FUNCTIONS --------------------------------------------------- */ - -#if TARGET_HOST_POSIX_X11 -/* - * A factory method for an empty cursor - */ -static Cursor getEmptyCursor( void ) -{ - static Cursor cursorNone = None; - if( cursorNone == None ) { - char cursorNoneBits[ 32 ]; - XColor dontCare; - Pixmap cursorNonePixmap; - memset( cursorNoneBits, 0, sizeof( cursorNoneBits ) ); - memset( &dontCare, 0, sizeof( dontCare ) ); - cursorNonePixmap = XCreateBitmapFromData ( fgDisplay.Display, - fgDisplay.RootWindow, - cursorNoneBits, 16, 16 ); - if( cursorNonePixmap != None ) { - cursorNone = XCreatePixmapCursor( fgDisplay.Display, - cursorNonePixmap, cursorNonePixmap, - &dontCare, &dontCare, 0, 0 ); - XFreePixmap( fgDisplay.Display, cursorNonePixmap ); - } - } - return cursorNone; -} - -typedef struct tag_cursorCacheEntry cursorCacheEntry; -struct tag_cursorCacheEntry { - unsigned int cursorShape; /* an XC_foo value */ - Cursor cachedCursor; /* None if the corresponding cursor has - not been created yet */ -}; - -/* - * Note: The arrangement of the table below depends on the fact that - * the "normal" GLUT_CURSOR_* values start a 0 and are consecutive. - */ -static cursorCacheEntry cursorCache[] = { - { XC_arrow, None }, /* GLUT_CURSOR_RIGHT_ARROW */ - { XC_top_left_arrow, None }, /* GLUT_CURSOR_LEFT_ARROW */ - { XC_hand1, None }, /* GLUT_CURSOR_INFO */ - { XC_pirate, None }, /* GLUT_CURSOR_DESTROY */ - { XC_question_arrow, None }, /* GLUT_CURSOR_HELP */ - { XC_exchange, None }, /* GLUT_CURSOR_CYCLE */ - { XC_spraycan, None }, /* GLUT_CURSOR_SPRAY */ - { XC_watch, None }, /* GLUT_CURSOR_WAIT */ - { XC_xterm, None }, /* GLUT_CURSOR_TEXT */ - { XC_crosshair, None }, /* GLUT_CURSOR_CROSSHAIR */ - { XC_sb_v_double_arrow, None }, /* GLUT_CURSOR_UP_DOWN */ - { XC_sb_h_double_arrow, None }, /* GLUT_CURSOR_LEFT_RIGHT */ - { XC_top_side, None }, /* GLUT_CURSOR_TOP_SIDE */ - { XC_bottom_side, None }, /* GLUT_CURSOR_BOTTOM_SIDE */ - { XC_left_side, None }, /* GLUT_CURSOR_LEFT_SIDE */ - { XC_right_side, None }, /* GLUT_CURSOR_RIGHT_SIDE */ - { XC_top_left_corner, None }, /* GLUT_CURSOR_TOP_LEFT_CORNER */ - { XC_top_right_corner, None }, /* GLUT_CURSOR_TOP_RIGHT_CORNER */ - { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */ - { XC_bottom_left_corner, None } /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */ -}; -#endif - -/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */ - -/* - * Set the cursor image to be used for the current window - */ -void fgSetCursor ( SFG_Window *window, int cursorID ) -{ -#if TARGET_HOST_POSIX_X11 - { - Cursor cursor; - /* - * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows - * for this, but if there is a system that easily supports a full- - * window (or full-screen) crosshair, we might consider it. - */ - int cursorIDToUse = - ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID; - - if( ( cursorIDToUse >= 0 ) && - ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) { - cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ]; - if( entry->cachedCursor == None ) { - entry->cachedCursor = - XCreateFontCursor( fgDisplay.Display, entry->cursorShape ); - } - cursor = entry->cachedCursor; - } else { - switch( cursorIDToUse ) - { - case GLUT_CURSOR_NONE: - cursor = getEmptyCursor( ); - break; - - case GLUT_CURSOR_INHERIT: - cursor = None; - break; - - default: - fgError( "Unknown cursor type: %d", cursorIDToUse ); - return; - } - } - - if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) { - XUndefineCursor( fgDisplay.Display, window->Window.Handle ); - } else if ( cursor != None ) { - XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor ); - } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) { - fgError( "Failed to create cursor" ); - } - } - -#elif TARGET_HOST_MS_WINDOWS - - /* - * Joe Krahn is re-writing the following code. - */ - /* Set the cursor AND change it for this window class. */ -#if !defined(__MINGW64__) && _MSC_VER <= 1200 -# define MAP_CURSOR(a,b) \ - case a: \ - SetCursor( LoadCursor( NULL, b ) ); \ - SetClassLong( window->Window.Handle, \ - GCL_HCURSOR, \ - ( LONG )LoadCursor( NULL, b ) ); \ - break; - /* Nuke the cursor AND change it for this window class. */ -# define ZAP_CURSOR(a,b) \ - case a: \ - SetCursor( NULL ); \ - SetClassLong( window->Window.Handle, \ - GCL_HCURSOR, ( LONG )NULL ); \ - break; -#else -# define MAP_CURSOR(a,b) \ - case a: \ - SetCursor( LoadCursor( NULL, b ) ); \ - SetClassLongPtr( window->Window.Handle, \ - GCLP_HCURSOR, \ - ( LONG )( LONG_PTR )LoadCursor( NULL, b ) ); \ - break; - /* Nuke the cursor AND change it for this window class. */ -# define ZAP_CURSOR(a,b) \ - case a: \ - SetCursor( NULL ); \ - SetClassLongPtr( window->Window.Handle, \ - GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL ); \ - break; -#endif - - switch( cursorID ) - { - MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, IDC_ARROW ); - MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, IDC_ARROW ); - MAP_CURSOR( GLUT_CURSOR_INFO, IDC_HELP ); - MAP_CURSOR( GLUT_CURSOR_DESTROY, IDC_CROSS ); - MAP_CURSOR( GLUT_CURSOR_HELP, IDC_HELP ); - MAP_CURSOR( GLUT_CURSOR_CYCLE, IDC_SIZEALL ); - MAP_CURSOR( GLUT_CURSOR_SPRAY, IDC_CROSS ); - MAP_CURSOR( GLUT_CURSOR_WAIT, IDC_WAIT ); - MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_IBEAM ); - MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS ); - MAP_CURSOR( GLUT_CURSOR_UP_DOWN, IDC_SIZENS ); - MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT, IDC_SIZEWE ); - MAP_CURSOR( GLUT_CURSOR_TOP_SIDE, IDC_ARROW ); /* XXX ToDo */ - MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE, IDC_ARROW ); /* XXX ToDo */ - MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE, IDC_ARROW ); /* XXX ToDo */ - MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE, IDC_ARROW ); /* XXX ToDo */ - MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER, IDC_SIZENWSE ); - MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER, IDC_SIZENESW ); - MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER, IDC_SIZENWSE ); - MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER, IDC_SIZENESW ); - MAP_CURSOR( GLUT_CURSOR_INHERIT, IDC_ARROW ); /* XXX ToDo */ - ZAP_CURSOR( GLUT_CURSOR_NONE, NULL ); - MAP_CURSOR( GLUT_CURSOR_FULL_CROSSHAIR, IDC_CROSS ); /* XXX ToDo */ - - default: - fgError( "Unknown cursor type: %d", cursorID ); - break; - } -#endif - - window->State.Cursor = cursorID; -} - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Set the cursor image to be used for the current window - */ -void FGAPIENTRY glutSetCursor( int cursorID ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" ); - - fgSetCursor ( fgStructure.CurrentWindow, cursorID ); -} - -/* - * Moves the mouse pointer to given window coordinates - */ -void FGAPIENTRY glutWarpPointer( int x, int y ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" ); - -#if TARGET_HOST_POSIX_X11 - - XWarpPointer( - fgDisplay.Display, - None, - fgStructure.CurrentWindow->Window.Handle, - 0, 0, 0, 0, - x, y - ); - /* Make the warp visible immediately. */ - XFlush( fgDisplay.Display ); - -#elif TARGET_HOST_MS_WINDOWS - - { - POINT coords; - coords.x = x; - coords.y = y; - - /* ClientToScreen() translates {coords} for us. */ - ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords ); - SetCursorPos( coords.x, coords.y ); - } - -#endif -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_display.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_display.c deleted file mode 100644 index 601375b3b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_display.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * freeglut_display.c - * - * Display message posting, context buffer swapping. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 3 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Marks the current window to have the redisplay performed when possible... - */ -void FGAPIENTRY glutPostRedisplay( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostRedisplay" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPostRedisplay" ); - fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; -} - -/* - * Swaps the buffers for the current window (if any) - */ -void FGAPIENTRY glutSwapBuffers( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSwapBuffers" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSwapBuffers" ); - - /* - * "glXSwapBuffers" already performs an implicit call to "glFlush". What - * about "SwapBuffers"? - */ - glFlush( ); - if( ! fgStructure.CurrentWindow->Window.DoubleBuffered ) - return; - -#if TARGET_HOST_POSIX_X11 - glXSwapBuffers( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); -#elif TARGET_HOST_MS_WINDOWS - SwapBuffers( fgStructure.CurrentWindow->Window.Device ); -#endif - - /* GLUT_FPS env var support */ - if( fgState.FPSInterval ) - { - GLint t = glutGet( GLUT_ELAPSED_TIME ); - fgState.SwapCount++; - if( fgState.SwapTime == 0 ) - fgState.SwapTime = t; - else if( t - fgState.SwapTime > fgState.FPSInterval ) - { - float time = 0.001f * ( t - fgState.SwapTime ); - float fps = ( float )fgState.SwapCount / time; - fprintf( stderr, - "freeglut: %d frames in %.2f seconds = %.2f FPS\n", - fgState.SwapCount, time, fps ); - fgState.SwapTime = t; - fgState.SwapCount = 0; - } - } -} - -/* - * Mark appropriate window to be displayed - */ -void FGAPIENTRY glutPostWindowRedisplay( int windowID ) -{ - SFG_Window* window; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostWindowRedisplay" ); - window = fgWindowByID( windowID ); - freeglut_return_if_fail( window ); - window->State.Redisplay = GL_TRUE; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_ext.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_ext.c deleted file mode 100644 index 972ae7830..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_ext.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * freeglut_ext.c - * - * Functions related to OpenGL extensions. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 9 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#define GLX_GLXEXT_PROTOTYPES -#include -#include "freeglut_internal.h" - -static GLUTproc fghGetGLUTProcAddress( const char* procName ) -{ - /* optimization: quick initial check */ - if( strncmp( procName, "glut", 4 ) != 0 ) - return NULL; - -#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x; - CHECK_NAME(glutInit); - CHECK_NAME(glutInitDisplayMode); - CHECK_NAME(glutInitDisplayString); - CHECK_NAME(glutInitWindowPosition); - CHECK_NAME(glutInitWindowSize); - CHECK_NAME(glutMainLoop); - CHECK_NAME(glutExit); - CHECK_NAME(glutCreateWindow); - CHECK_NAME(glutCreateSubWindow); - CHECK_NAME(glutDestroyWindow); - CHECK_NAME(glutPostRedisplay); - CHECK_NAME(glutPostWindowRedisplay); - CHECK_NAME(glutSwapBuffers); - CHECK_NAME(glutGetWindow); - CHECK_NAME(glutSetWindow); - CHECK_NAME(glutSetWindowTitle); - CHECK_NAME(glutSetIconTitle); - CHECK_NAME(glutPositionWindow); - CHECK_NAME(glutReshapeWindow); - CHECK_NAME(glutPopWindow); - CHECK_NAME(glutPushWindow); - CHECK_NAME(glutIconifyWindow); - CHECK_NAME(glutShowWindow); - CHECK_NAME(glutHideWindow); - CHECK_NAME(glutFullScreen); - CHECK_NAME(glutSetCursor); - CHECK_NAME(glutWarpPointer); - CHECK_NAME(glutEstablishOverlay); - CHECK_NAME(glutRemoveOverlay); - CHECK_NAME(glutUseLayer); - CHECK_NAME(glutPostOverlayRedisplay); - CHECK_NAME(glutPostWindowOverlayRedisplay); - CHECK_NAME(glutShowOverlay); - CHECK_NAME(glutHideOverlay); - CHECK_NAME(glutCreateMenu); - CHECK_NAME(glutDestroyMenu); - CHECK_NAME(glutGetMenu); - CHECK_NAME(glutSetMenu); - CHECK_NAME(glutAddMenuEntry); - CHECK_NAME(glutAddSubMenu); - CHECK_NAME(glutChangeToMenuEntry); - CHECK_NAME(glutChangeToSubMenu); - CHECK_NAME(glutRemoveMenuItem); - CHECK_NAME(glutAttachMenu); - CHECK_NAME(glutDetachMenu); - CHECK_NAME(glutDisplayFunc); - CHECK_NAME(glutReshapeFunc); - CHECK_NAME(glutKeyboardFunc); - CHECK_NAME(glutMouseFunc); - CHECK_NAME(glutMotionFunc); - CHECK_NAME(glutPassiveMotionFunc); - CHECK_NAME(glutEntryFunc); - CHECK_NAME(glutVisibilityFunc); - CHECK_NAME(glutIdleFunc); - CHECK_NAME(glutTimerFunc); - CHECK_NAME(glutMenuStateFunc); - CHECK_NAME(glutSpecialFunc); - CHECK_NAME(glutSpaceballMotionFunc); - CHECK_NAME(glutSpaceballRotateFunc); - CHECK_NAME(glutSpaceballButtonFunc); - CHECK_NAME(glutButtonBoxFunc); - CHECK_NAME(glutDialsFunc); - CHECK_NAME(glutTabletMotionFunc); - CHECK_NAME(glutTabletButtonFunc); - CHECK_NAME(glutMenuStatusFunc); - CHECK_NAME(glutOverlayDisplayFunc); - CHECK_NAME(glutWindowStatusFunc); - CHECK_NAME(glutKeyboardUpFunc); - CHECK_NAME(glutSpecialUpFunc); -#if !defined(_WIN32_WCE) - CHECK_NAME(glutJoystickFunc); -#endif /* !defined(_WIN32_WCE) */ - CHECK_NAME(glutSetColor); - CHECK_NAME(glutGetColor); - CHECK_NAME(glutCopyColormap); - CHECK_NAME(glutGet); - CHECK_NAME(glutDeviceGet); - CHECK_NAME(glutExtensionSupported); - CHECK_NAME(glutGetModifiers); - CHECK_NAME(glutLayerGet); - CHECK_NAME(glutBitmapCharacter); - CHECK_NAME(glutBitmapWidth); - CHECK_NAME(glutStrokeCharacter); - CHECK_NAME(glutStrokeWidth); - CHECK_NAME(glutBitmapLength); - CHECK_NAME(glutStrokeLength); - CHECK_NAME(glutWireSphere); - CHECK_NAME(glutSolidSphere); - CHECK_NAME(glutWireCone); - CHECK_NAME(glutSolidCone); - CHECK_NAME(glutWireCube); - CHECK_NAME(glutSolidCube); - CHECK_NAME(glutWireTorus); - CHECK_NAME(glutSolidTorus); - CHECK_NAME(glutWireDodecahedron); - CHECK_NAME(glutSolidDodecahedron); - CHECK_NAME(glutWireTeapot); - CHECK_NAME(glutSolidTeapot); - CHECK_NAME(glutWireOctahedron); - CHECK_NAME(glutSolidOctahedron); - CHECK_NAME(glutWireTetrahedron); - CHECK_NAME(glutSolidTetrahedron); - CHECK_NAME(glutWireIcosahedron); - CHECK_NAME(glutSolidIcosahedron); - CHECK_NAME(glutVideoResizeGet); - CHECK_NAME(glutSetupVideoResizing); - CHECK_NAME(glutStopVideoResizing); - CHECK_NAME(glutVideoResize); - CHECK_NAME(glutVideoPan); - CHECK_NAME(glutReportErrors); - CHECK_NAME(glutIgnoreKeyRepeat); - CHECK_NAME(glutSetKeyRepeat); -#if !defined(_WIN32_WCE) - CHECK_NAME(glutForceJoystickFunc); - CHECK_NAME(glutGameModeString); - CHECK_NAME(glutEnterGameMode); - CHECK_NAME(glutLeaveGameMode); - CHECK_NAME(glutGameModeGet); -#endif /* !defined(_WIN32_WCE) */ - /* freeglut extensions */ - CHECK_NAME(glutMainLoopEvent); - CHECK_NAME(glutLeaveMainLoop); - CHECK_NAME(glutCloseFunc); - CHECK_NAME(glutWMCloseFunc); - CHECK_NAME(glutMenuDestroyFunc); - CHECK_NAME(glutFullScreenToggle); - CHECK_NAME(glutSetOption); - CHECK_NAME(glutGetModeValues); - CHECK_NAME(glutSetWindowData); - CHECK_NAME(glutGetWindowData); - CHECK_NAME(glutSetMenuData); - CHECK_NAME(glutGetMenuData); - CHECK_NAME(glutBitmapHeight); - CHECK_NAME(glutStrokeHeight); - CHECK_NAME(glutBitmapString); - CHECK_NAME(glutStrokeString); - CHECK_NAME(glutWireRhombicDodecahedron); - CHECK_NAME(glutSolidRhombicDodecahedron); - CHECK_NAME(glutWireSierpinskiSponge); - CHECK_NAME(glutSolidSierpinskiSponge); - CHECK_NAME(glutWireCylinder); - CHECK_NAME(glutSolidCylinder); - CHECK_NAME(glutGetProcAddress); - CHECK_NAME(glutMouseWheelFunc); - CHECK_NAME(glutJoystickGetNumAxes); - CHECK_NAME(glutJoystickGetNumButtons); - CHECK_NAME(glutJoystickNotWorking); - CHECK_NAME(glutJoystickGetDeadBand); - CHECK_NAME(glutJoystickSetDeadBand); - CHECK_NAME(glutJoystickGetSaturation); - CHECK_NAME(glutJoystickSetSaturation); - CHECK_NAME(glutJoystickSetMinRange); - CHECK_NAME(glutJoystickSetMaxRange); - CHECK_NAME(glutJoystickSetCenter); - CHECK_NAME(glutJoystickGetMinRange); - CHECK_NAME(glutJoystickGetMaxRange); - CHECK_NAME(glutJoystickGetCenter); - CHECK_NAME(glutInitContextVersion); - CHECK_NAME(glutInitContextFlags); - CHECK_NAME(glutInitContextProfile); -#undef CHECK_NAME - - return NULL; -} - - -SFG_Proc fghGetProcAddress( const char *procName ) -{ -#if TARGET_HOST_MS_WINDOWS - return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName ); -#elif TARGET_HOST_POSIX_X11 && defined( GLX_ARB_get_proc_address ) - return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName ); -#else - return NULL; -#endif -} - - -GLUTproc FGAPIENTRY -glutGetProcAddress( const char *procName ) -{ - GLUTproc p; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" ); - - /* Try GLUT functions first, then core GL functions */ - p = fghGetGLUTProcAddress( procName ); - return ( p != NULL ) ? p : fghGetProcAddress( procName ); -} diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font.c deleted file mode 100644 index e956d5b05..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font.c +++ /dev/null @@ -1,384 +0,0 @@ -/* - * freeglut_font.c - * - * Bitmap and stroke fonts displaying. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * Test things out ... - */ - -/* -- IMPORT DECLARATIONS -------------------------------------------------- */ - -/* - * These are the font faces defined in freeglut_font_data.c file: - */ -extern SFG_Font fgFontFixed8x13; -extern SFG_Font fgFontFixed9x15; -extern SFG_Font fgFontHelvetica10; -extern SFG_Font fgFontHelvetica12; -extern SFG_Font fgFontHelvetica18; -extern SFG_Font fgFontTimesRoman10; -extern SFG_Font fgFontTimesRoman24; -extern SFG_StrokeFont fgStrokeRoman; -extern SFG_StrokeFont fgStrokeMonoRoman; - - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -/* - * Matches a font ID with a SFG_Font structure pointer. - * This was changed to match the GLUT header style. - */ -static SFG_Font* fghFontByID( void* font ) -{ - if( font == GLUT_BITMAP_8_BY_13 ) - return &fgFontFixed8x13; - if( font == GLUT_BITMAP_9_BY_15 ) - return &fgFontFixed9x15; - if( font == GLUT_BITMAP_HELVETICA_10 ) - return &fgFontHelvetica10; - if( font == GLUT_BITMAP_HELVETICA_12 ) - return &fgFontHelvetica12; - if( font == GLUT_BITMAP_HELVETICA_18 ) - return &fgFontHelvetica18; - if( font == GLUT_BITMAP_TIMES_ROMAN_10 ) - return &fgFontTimesRoman10; - if( font == GLUT_BITMAP_TIMES_ROMAN_24 ) - return &fgFontTimesRoman24; - - fgWarning( "font 0x%08x not found", font ); - return 0; -} - -/* - * Matches a font ID with a SFG_StrokeFont structure pointer. - * This was changed to match the GLUT header style. - */ -static SFG_StrokeFont* fghStrokeByID( void* font ) -{ - if( font == GLUT_STROKE_ROMAN ) - return &fgStrokeRoman; - if( font == GLUT_STROKE_MONO_ROMAN ) - return &fgStrokeMonoRoman; - - fgWarning( "stroke font 0x%08x not found", font ); - return 0; -} - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Draw a bitmap character - */ -void FGAPIENTRY glutBitmapCharacter( void* fontID, int character ) -{ - const GLubyte* face; - SFG_Font* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapCharacter" ); - font = fghFontByID( fontID ); - freeglut_return_if_fail( ( character >= 1 )&&( character < 256 ) ); - freeglut_return_if_fail( font ); - - /* - * Find the character we want to draw (???) - */ - face = font->Characters[ character ]; - - glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); - glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); - glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - glBitmap( - face[ 0 ], font->Height, /* The bitmap's width and height */ - font->xorig, font->yorig, /* The origin in the font glyph */ - ( float )( face[ 0 ] ), 0.0, /* The raster advance -- inc. x,y */ - ( face + 1 ) /* The packed bitmap data... */ - ); - glPopClientAttrib( ); -} - -void FGAPIENTRY glutBitmapString( void* fontID, const unsigned char *string ) -{ - unsigned char c; - float x = 0.0f ; - SFG_Font* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapString" ); - font = fghFontByID( fontID ); - freeglut_return_if_fail( font ); - if ( !string || ! *string ) - return; - - glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT ); - glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_FALSE ); - glPixelStorei( GL_UNPACK_LSB_FIRST, GL_FALSE ); - glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); - glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - - /* - * Step through the string, drawing each character. - * A newline will simply translate the next character's insertion - * point back to the start of the line and down one line. - */ - while( ( c = *string++) ) - if( c == '\n' ) - { - glBitmap ( 0, 0, 0, 0, -x, (float) -font->Height, NULL ); - x = 0.0f; - } - else /* Not an EOL, draw the bitmap character */ - { - const GLubyte* face = font->Characters[ c ]; - - glBitmap( - face[ 0 ], font->Height, /* Bitmap's width and height */ - font->xorig, font->yorig, /* The origin in the font glyph */ - ( float )( face[ 0 ] ), 0.0, /* The raster advance; inc. x,y */ - ( face + 1 ) /* The packed bitmap data... */ - ); - - x += ( float )( face[ 0 ] ); - } - - glPopClientAttrib( ); -} - -/* - * Returns the width in pixels of a font's character - */ -int FGAPIENTRY glutBitmapWidth( void* fontID, int character ) -{ - SFG_Font* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapWidth" ); - font = fghFontByID( fontID ); - freeglut_return_val_if_fail( character > 0 && character < 256, 0 ); - freeglut_return_val_if_fail( font, 0 ); - return *( font->Characters[ character ] ); -} - -/* - * Return the width of a string drawn using a bitmap font - */ -int FGAPIENTRY glutBitmapLength( void* fontID, const unsigned char* string ) -{ - unsigned char c; - int length = 0, this_line_length = 0; - SFG_Font* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapLength" ); - font = fghFontByID( fontID ); - freeglut_return_val_if_fail( font, 0 ); - if ( !string || ! *string ) - return 0; - - while( ( c = *string++) ) - { - if( c != '\n' )/* Not an EOL, increment length of line */ - this_line_length += *( font->Characters[ c ]); - else /* EOL; reset the length of this line */ - { - if( length < this_line_length ) - length = this_line_length; - this_line_length = 0; - } - } - if ( length < this_line_length ) - length = this_line_length; - - return length; -} - -/* - * Returns the height of a bitmap font - */ -int FGAPIENTRY glutBitmapHeight( void* fontID ) -{ - SFG_Font* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapHeight" ); - font = fghFontByID( fontID ); - freeglut_return_val_if_fail( font, 0 ); - return font->Height; -} - -/* - * Draw a stroke character - */ -void FGAPIENTRY glutStrokeCharacter( void* fontID, int character ) -{ - const SFG_StrokeChar *schar; - const SFG_StrokeStrip *strip; - int i, j; - SFG_StrokeFont* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeCharacter" ); - font = fghStrokeByID( fontID ); - freeglut_return_if_fail( character >= 0 ); - freeglut_return_if_fail( character < font->Quantity ); - freeglut_return_if_fail( font ); - - schar = font->Characters[ character ]; - freeglut_return_if_fail( schar ); - strip = schar->Strips; - - for( i = 0; i < schar->Number; i++, strip++ ) - { - glBegin( GL_LINE_STRIP ); - for( j = 0; j < strip->Number; j++ ) - glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y ); - glEnd( ); - glBegin( GL_POINTS ); - for( j = 0; j < strip->Number; j++ ) - glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y ); - glEnd( ); - } - glTranslatef( schar->Right, 0.0, 0.0 ); -} - -void FGAPIENTRY glutStrokeString( void* fontID, const unsigned char *string ) -{ - unsigned char c; - int i, j; - float length = 0.0; - SFG_StrokeFont* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeString" ); - font = fghStrokeByID( fontID ); - freeglut_return_if_fail( font ); - if ( !string || ! *string ) - return; - - /* - * Step through the string, drawing each character. - * A newline will simply translate the next character's insertion - * point back to the start of the line and down one line. - */ - while( ( c = *string++) ) - if( c < font->Quantity ) - { - if( c == '\n' ) - { - glTranslatef ( -length, -( float )( font->Height ), 0.0 ); - length = 0.0; - } - else /* Not an EOL, draw the bitmap character */ - { - const SFG_StrokeChar *schar = font->Characters[ c ]; - if( schar ) - { - const SFG_StrokeStrip *strip = schar->Strips; - - for( i = 0; i < schar->Number; i++, strip++ ) - { - glBegin( GL_LINE_STRIP ); - for( j = 0; j < strip->Number; j++ ) - glVertex2f( strip->Vertices[ j ].X, - strip->Vertices[ j ].Y); - - glEnd( ); - } - - length += schar->Right; - glTranslatef( schar->Right, 0.0, 0.0 ); - } - } - } -} - -/* - * Return the width in pixels of a stroke character - */ -int FGAPIENTRY glutStrokeWidth( void* fontID, int character ) -{ - const SFG_StrokeChar *schar; - SFG_StrokeFont* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeWidth" ); - font = fghStrokeByID( fontID ); - freeglut_return_val_if_fail( ( character >= 0 ) && - ( character < font->Quantity ), - 0 - ); - freeglut_return_val_if_fail( font, 0 ); - schar = font->Characters[ character ]; - freeglut_return_val_if_fail( schar, 0 ); - - return ( int )( schar->Right + 0.5 ); -} - -/* - * Return the width of a string drawn using a stroke font - */ -int FGAPIENTRY glutStrokeLength( void* fontID, const unsigned char* string ) -{ - unsigned char c; - float length = 0.0; - float this_line_length = 0.0; - SFG_StrokeFont* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeLength" ); - font = fghStrokeByID( fontID ); - freeglut_return_val_if_fail( font, 0 ); - if ( !string || ! *string ) - return 0; - - while( ( c = *string++) ) - if( c < font->Quantity ) - { - if( c == '\n' ) /* EOL; reset the length of this line */ - { - if( length < this_line_length ) - length = this_line_length; - this_line_length = 0.0; - } - else /* Not an EOL, increment the length of this line */ - { - const SFG_StrokeChar *schar = font->Characters[ c ]; - if( schar ) - this_line_length += schar->Right; - } - } - if( length < this_line_length ) - length = this_line_length; - return( int )( length + 0.5 ); -} - -/* - * Returns the height of a stroke font - */ -GLfloat FGAPIENTRY glutStrokeHeight( void* fontID ) -{ - SFG_StrokeFont* font; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeHeight" ); - font = fghStrokeByID( fontID ); - freeglut_return_val_if_fail( font, 0.0 ); - return font->Height; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font_data.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font_data.c deleted file mode 100644 index 35dfc797d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_font_data.c +++ /dev/null @@ -1,2020 +0,0 @@ -/* - \file og_font_data.c - \brief Bitmapped font data for OpenGLUT fonts. -*/ - -/* - * This file has been automatically generated by the - * genfonts utility. - * - * The legal status of this file is a bit vague. The font glyphs - * themselves come from XFree86 v4.3.0 (as of this writing), and as - * part of the X server may be subject to the XFree86 copyrights. - * The original freeglut fonts were extracted by a utility written - * by Pawel W. Olszta (see below) and the generated fonts contained - * his copyright exclusively. Steve Baker asserts that Pawel - * assigned intellectual property rights to Steve Baker. Steve - * Baker also asserts that fonts cannot be copyrighted. He has - * neither stripped the copyright from the freeglut fonts nor - * formally retitled anything in his name. Since that time, the - * OpenGLUT project has branched from freeglut, and has made - * necessary modifications to Pawel's ``genfonts'' utility. - * To that extent, OpenGLUT may have some title to this file. - * What is fairly clear is that the font data is licensed under - * the XFree86 license (which is variously termed ``XFree'' and - * ``MIT'' by the freeglut project). It is believed that all - * title holders wish this file to be as useful as possible, and - * that either the ``XFree'' or ``MIT'' license works. - * - * Portions copyright (c) 2004, the OpenGLUT project contributors. - * OpenGLUT branched from freeglut in February, 2004. - * - * Copyright (c) 1999-2000 by Pawel W. Olszta - * Written by Pawel W. Olszta, - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Sotware. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * The following bitmapped fonts are defined in this file: - * - * 1. fgFontFixed8x13 - * -misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1 - * 2. fgFontFixed9x15 - * -misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1 - * 3. fgFontHelvetica10 - * -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1 - * 4. fgFontHelvetica12 - * -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1 - * 5. fgFontHelvetica18 - * -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1 - * 6. fgFontTimesRoman10 - * -adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1 - * 7. fgFontTimesRoman24 - * -adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1 - */ - -static const GLubyte Fixed8x13_Character_000[] = { 8, 0, 0, 0,170, 0,130, 0,130, 0,130, 0,170, 0, 0}; -static const GLubyte Fixed8x13_Character_001[] = { 8, 0, 0, 0, 0, 16, 56,124,254,124, 56, 16, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_002[] = { 8, 0,170, 85,170, 85,170, 85,170, 85,170, 85,170, 85,170}; -static const GLubyte Fixed8x13_Character_003[] = { 8, 0, 0, 0, 4, 4, 4, 4,174,160,224,160,160, 0, 0}; -static const GLubyte Fixed8x13_Character_004[] = { 8, 0, 0, 0, 8, 8, 12, 8,142,128,192,128,224, 0, 0}; -static const GLubyte Fixed8x13_Character_005[] = { 8, 0, 0, 0, 10, 10, 12, 10,108,128,128,128, 96, 0, 0}; -static const GLubyte Fixed8x13_Character_006[] = { 8, 0, 0, 0, 8, 8, 12, 8,238,128,128,128,128, 0, 0}; -static const GLubyte Fixed8x13_Character_007[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 24, 36, 36, 24, 0, 0}; -static const GLubyte Fixed8x13_Character_008[] = { 8, 0, 0, 0, 0,124, 0, 16, 16,124, 16, 16, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_009[] = { 8, 0, 0, 0, 14, 8, 8, 8,168,160,160,160,192, 0, 0}; -static const GLubyte Fixed8x13_Character_010[] = { 8, 0, 0, 0, 4, 4, 4, 4, 46, 80, 80,136,136, 0, 0}; -static const GLubyte Fixed8x13_Character_011[] = { 8, 0, 0, 0, 0, 0, 0, 0,240, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_012[] = { 8, 0, 16, 16, 16, 16, 16, 16,240, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_013[] = { 8, 0, 16, 16, 16, 16, 16, 16, 31, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_014[] = { 8, 0, 0, 0, 0, 0, 0, 0, 31, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_015[] = { 8, 0, 16, 16, 16, 16, 16, 16,255, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_016[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255}; -static const GLubyte Fixed8x13_Character_017[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_018[] = { 8, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_019[] = { 8, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_020[] = { 8, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_021[] = { 8, 0, 16, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_022[] = { 8, 0, 16, 16, 16, 16, 16, 16,240, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_023[] = { 8, 0, 0, 0, 0, 0, 0, 0,255, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_024[] = { 8, 0, 16, 16, 16, 16, 16, 16,255, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_025[] = { 8, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; -static const GLubyte Fixed8x13_Character_026[] = { 8, 0, 0, 0,254, 0, 14, 48,192, 48, 14, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_027[] = { 8, 0, 0, 0,254, 0,224, 24, 6, 24,224, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_028[] = { 8, 0, 0, 0, 68, 68, 68, 68, 68,254, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_029[] = { 8, 0, 0, 0, 32, 32,126, 16, 8,126, 4, 4, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_030[] = { 8, 0, 0, 0,220, 98, 32, 32, 32,112, 32, 34, 28, 0, 0}; -static const GLubyte Fixed8x13_Character_031[] = { 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_032[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_033[] = { 8, 0, 0, 0, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_034[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 0, 0}; -static const GLubyte Fixed8x13_Character_035[] = { 8, 0, 0, 0, 0, 36, 36,126, 36,126, 36, 36, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_036[] = { 8, 0, 0, 0, 16,120, 20, 20, 56, 80, 80, 60, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_037[] = { 8, 0, 0, 0, 68, 42, 36, 16, 8, 8, 36, 82, 34, 0, 0}; -static const GLubyte Fixed8x13_Character_038[] = { 8, 0, 0, 0, 58, 68, 74, 48, 72, 72, 48, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_039[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 56, 0, 0}; -static const GLubyte Fixed8x13_Character_040[] = { 8, 0, 0, 0, 4, 8, 8, 16, 16, 16, 8, 8, 4, 0, 0}; -static const GLubyte Fixed8x13_Character_041[] = { 8, 0, 0, 0, 32, 16, 16, 8, 8, 8, 16, 16, 32, 0, 0}; -static const GLubyte Fixed8x13_Character_042[] = { 8, 0, 0, 0, 0, 0, 36, 24,126, 24, 36, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_043[] = { 8, 0, 0, 0, 0, 0, 16, 16,124, 16, 16, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_044[] = { 8, 0, 0, 64, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_045[] = { 8, 0, 0, 0, 0, 0, 0, 0,126, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_046[] = { 8, 0, 0, 16, 56, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_047[] = { 8, 0, 0, 0,128,128, 64, 32, 16, 8, 4, 2, 2, 0, 0}; -static const GLubyte Fixed8x13_Character_048[] = { 8, 0, 0, 0, 24, 36, 66, 66, 66, 66, 66, 36, 24, 0, 0}; -static const GLubyte Fixed8x13_Character_049[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16, 80, 48, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_050[] = { 8, 0, 0, 0,126, 64, 32, 24, 4, 2, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_051[] = { 8, 0, 0, 0, 60, 66, 2, 2, 28, 8, 4, 2,126, 0, 0}; -static const GLubyte Fixed8x13_Character_052[] = { 8, 0, 0, 0, 4, 4,126, 68, 68, 36, 20, 12, 4, 0, 0}; -static const GLubyte Fixed8x13_Character_053[] = { 8, 0, 0, 0, 60, 66, 2, 2, 98, 92, 64, 64,126, 0, 0}; -static const GLubyte Fixed8x13_Character_054[] = { 8, 0, 0, 0, 60, 66, 66, 98, 92, 64, 64, 32, 28, 0, 0}; -static const GLubyte Fixed8x13_Character_055[] = { 8, 0, 0, 0, 32, 32, 16, 16, 8, 8, 4, 2,126, 0, 0}; -static const GLubyte Fixed8x13_Character_056[] = { 8, 0, 0, 0, 60, 66, 66, 66, 60, 66, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_057[] = { 8, 0, 0, 0, 56, 4, 2, 2, 58, 70, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_058[] = { 8, 0, 0, 16, 56, 16, 0, 0, 16, 56, 16, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_059[] = { 8, 0, 0, 64, 48, 56, 0, 0, 16, 56, 16, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_060[] = { 8, 0, 0, 0, 2, 4, 8, 16, 32, 16, 8, 4, 2, 0, 0}; -static const GLubyte Fixed8x13_Character_061[] = { 8, 0, 0, 0, 0, 0,126, 0, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_062[] = { 8, 0, 0, 0, 64, 32, 16, 8, 4, 8, 16, 32, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_063[] = { 8, 0, 0, 0, 8, 0, 8, 8, 4, 2, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_064[] = { 8, 0, 0, 0, 60, 64, 74, 86, 82, 78, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_065[] = { 8, 0, 0, 0, 66, 66, 66,126, 66, 66, 66, 36, 24, 0, 0}; -static const GLubyte Fixed8x13_Character_066[] = { 8, 0, 0, 0,252, 66, 66, 66,124, 66, 66, 66,252, 0, 0}; -static const GLubyte Fixed8x13_Character_067[] = { 8, 0, 0, 0, 60, 66, 64, 64, 64, 64, 64, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_068[] = { 8, 0, 0, 0,252, 66, 66, 66, 66, 66, 66, 66,252, 0, 0}; -static const GLubyte Fixed8x13_Character_069[] = { 8, 0, 0, 0,126, 64, 64, 64,120, 64, 64, 64,126, 0, 0}; -static const GLubyte Fixed8x13_Character_070[] = { 8, 0, 0, 0, 64, 64, 64, 64,120, 64, 64, 64,126, 0, 0}; -static const GLubyte Fixed8x13_Character_071[] = { 8, 0, 0, 0, 58, 70, 66, 78, 64, 64, 64, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_072[] = { 8, 0, 0, 0, 66, 66, 66, 66,126, 66, 66, 66, 66, 0, 0}; -static const GLubyte Fixed8x13_Character_073[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16, 16, 16,124, 0, 0}; -static const GLubyte Fixed8x13_Character_074[] = { 8, 0, 0, 0, 56, 68, 4, 4, 4, 4, 4, 4, 31, 0, 0}; -static const GLubyte Fixed8x13_Character_075[] = { 8, 0, 0, 0, 66, 68, 72, 80, 96, 80, 72, 68, 66, 0, 0}; -static const GLubyte Fixed8x13_Character_076[] = { 8, 0, 0, 0,126, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_077[] = { 8, 0, 0, 0,130,130,130,146,146,170,198,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_078[] = { 8, 0, 0, 0, 66, 66, 66, 70, 74, 82, 98, 66, 66, 0, 0}; -static const GLubyte Fixed8x13_Character_079[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_080[] = { 8, 0, 0, 0, 64, 64, 64, 64,124, 66, 66, 66,124, 0, 0}; -static const GLubyte Fixed8x13_Character_081[] = { 8, 0, 0, 2, 60, 74, 82, 66, 66, 66, 66, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_082[] = { 8, 0, 0, 0, 66, 68, 72, 80,124, 66, 66, 66,124, 0, 0}; -static const GLubyte Fixed8x13_Character_083[] = { 8, 0, 0, 0, 60, 66, 2, 2, 60, 64, 64, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_084[] = { 8, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16,254, 0, 0}; -static const GLubyte Fixed8x13_Character_085[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0}; -static const GLubyte Fixed8x13_Character_086[] = { 8, 0, 0, 0, 16, 40, 40, 40, 68, 68, 68,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_087[] = { 8, 0, 0, 0, 68,170,146,146,146,130,130,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_088[] = { 8, 0, 0, 0,130,130, 68, 40, 16, 40, 68,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_089[] = { 8, 0, 0, 0, 16, 16, 16, 16, 16, 40, 68,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_090[] = { 8, 0, 0, 0,126, 64, 64, 32, 16, 8, 4, 2,126, 0, 0}; -static const GLubyte Fixed8x13_Character_091[] = { 8, 0, 0, 0, 60, 32, 32, 32, 32, 32, 32, 32, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_092[] = { 8, 0, 0, 0, 2, 2, 4, 8, 16, 32, 64,128,128, 0, 0}; -static const GLubyte Fixed8x13_Character_093[] = { 8, 0, 0, 0,120, 8, 8, 8, 8, 8, 8, 8,120, 0, 0}; -static const GLubyte Fixed8x13_Character_094[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 40, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_095[] = { 8, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_096[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 56, 0, 0}; -static const GLubyte Fixed8x13_Character_097[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_098[] = { 8, 0, 0, 0, 92, 98, 66, 66, 98, 92, 64, 64, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_099[] = { 8, 0, 0, 0, 60, 66, 64, 64, 66, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_100[] = { 8, 0, 0, 0, 58, 70, 66, 66, 70, 58, 2, 2, 2, 0, 0}; -static const GLubyte Fixed8x13_Character_101[] = { 8, 0, 0, 0, 60, 66, 64,126, 66, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_102[] = { 8, 0, 0, 0, 32, 32, 32, 32,124, 32, 32, 34, 28, 0, 0}; -static const GLubyte Fixed8x13_Character_103[] = { 8, 0, 60, 66, 60, 64, 56, 68, 68, 58, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_104[] = { 8, 0, 0, 0, 66, 66, 66, 66, 98, 92, 64, 64, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_105[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 48, 0, 16, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_106[] = { 8, 0, 56, 68, 68, 4, 4, 4, 4, 12, 0, 4, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_107[] = { 8, 0, 0, 0, 66, 68, 72,112, 72, 68, 64, 64, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_108[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16, 16, 16, 48, 0, 0}; -static const GLubyte Fixed8x13_Character_109[] = { 8, 0, 0, 0,130,146,146,146,146,236, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_110[] = { 8, 0, 0, 0, 66, 66, 66, 66, 98, 92, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_111[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_112[] = { 8, 0, 64, 64, 64, 92, 98, 66, 98, 92, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_113[] = { 8, 0, 2, 2, 2, 58, 70, 66, 70, 58, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_114[] = { 8, 0, 0, 0, 32, 32, 32, 32, 34, 92, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_115[] = { 8, 0, 0, 0, 60, 66, 12, 48, 66, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_116[] = { 8, 0, 0, 0, 28, 34, 32, 32, 32,124, 32, 32, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_117[] = { 8, 0, 0, 0, 58, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_118[] = { 8, 0, 0, 0, 16, 40, 40, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_119[] = { 8, 0, 0, 0, 68,170,146,146,130,130, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_120[] = { 8, 0, 0, 0, 66, 36, 24, 24, 36, 66, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_121[] = { 8, 0, 60, 66, 2, 58, 70, 66, 66, 66, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_122[] = { 8, 0, 0, 0,126, 32, 16, 8, 4,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_123[] = { 8, 0, 0, 0, 14, 16, 16, 8, 48, 8, 16, 16, 14, 0, 0}; -static const GLubyte Fixed8x13_Character_124[] = { 8, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_125[] = { 8, 0, 0, 0,112, 8, 8, 16, 12, 16, 8, 8,112, 0, 0}; -static const GLubyte Fixed8x13_Character_126[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 84, 36, 0, 0}; -static const GLubyte Fixed8x13_Character_127[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_128[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_129[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_130[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_131[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_132[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_133[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_134[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_135[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_136[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_137[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_138[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_139[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_140[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_141[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_142[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_143[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_144[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_145[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_146[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_147[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_148[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_149[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_150[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_151[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_152[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_153[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_154[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_155[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_156[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_157[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_158[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_159[] = { 9, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_160[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_161[] = { 8, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 0, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_162[] = { 8, 0, 0, 0, 0, 16, 56, 84, 80, 80, 84, 56, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_163[] = { 8, 0, 0, 0,220, 98, 32, 32, 32,112, 32, 34, 28, 0, 0}; -static const GLubyte Fixed8x13_Character_164[] = { 8, 0, 0, 0, 0, 66, 60, 36, 36, 60, 66, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_165[] = { 8, 0, 0, 0, 16, 16,124, 16,124, 40, 68,130,130, 0, 0}; -static const GLubyte Fixed8x13_Character_166[] = { 8, 0, 0, 0, 16, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_167[] = { 8, 0, 0, 0, 24, 36, 4, 24, 36, 36, 24, 32, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_168[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 0, 0}; -static const GLubyte Fixed8x13_Character_169[] = { 8, 0, 0, 0, 0, 56, 68,146,170,162,170,146, 68, 56, 0}; -static const GLubyte Fixed8x13_Character_170[] = { 8, 0, 0, 0, 0, 0,124, 0, 60, 68, 60, 4, 56, 0, 0}; -static const GLubyte Fixed8x13_Character_171[] = { 8, 0, 0, 0, 0, 18, 36, 72,144, 72, 36, 18, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_172[] = { 8, 0, 0, 0, 0, 2, 2, 2,126, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_173[] = { 8, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_174[] = { 8, 0, 0, 0, 0, 56, 68,170,178,170,170,146, 68, 56, 0}; -static const GLubyte Fixed8x13_Character_175[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 0}; -static const GLubyte Fixed8x13_Character_176[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 24, 36, 36, 24, 0, 0}; -static const GLubyte Fixed8x13_Character_177[] = { 8, 0, 0, 0, 0,124, 0, 16, 16,124, 16, 16, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_178[] = { 8, 0, 0, 0, 0, 0, 0, 0,120, 64, 48, 8, 72, 48, 0}; -static const GLubyte Fixed8x13_Character_179[] = { 8, 0, 0, 0, 0, 0, 0, 0, 48, 72, 8, 16, 72, 48, 0}; -static const GLubyte Fixed8x13_Character_180[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_181[] = { 8, 0, 0, 64, 90,102, 66, 66, 66, 66, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_182[] = { 8, 0, 0, 0, 20, 20, 20, 20, 52,116,116,116, 62, 0, 0}; -static const GLubyte Fixed8x13_Character_183[] = { 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_184[] = { 8, 0, 24, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_185[] = { 8, 0, 0, 0, 0, 0, 0, 0,112, 32, 32, 32, 96, 32, 0}; -static const GLubyte Fixed8x13_Character_186[] = { 8, 0, 0, 0, 0, 0, 0,120, 0, 48, 72, 72, 48, 0, 0}; -static const GLubyte Fixed8x13_Character_187[] = { 8, 0, 0, 0, 0,144, 72, 36, 18, 36, 72,144, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_188[] = { 8, 0, 0, 0, 6, 26, 18, 10,230, 66, 64, 64,192, 64, 0}; -static const GLubyte Fixed8x13_Character_189[] = { 8, 0, 0, 0, 30, 16, 12, 2,242, 76, 64, 64,192, 64, 0}; -static const GLubyte Fixed8x13_Character_190[] = { 8, 0, 0, 0, 6, 26, 18, 10,102,146, 16, 32,144, 96, 0}; -static const GLubyte Fixed8x13_Character_191[] = { 8, 0, 0, 0, 60, 66, 66, 64, 32, 16, 16, 0, 16, 0, 0}; -static const GLubyte Fixed8x13_Character_192[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 0, 8, 16, 0}; -static const GLubyte Fixed8x13_Character_193[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_194[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_195[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 0, 76, 50, 0}; -static const GLubyte Fixed8x13_Character_196[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_197[] = { 8, 0, 0, 0, 66, 66,126, 66, 66, 36, 24, 24, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_198[] = { 8, 0, 0, 0,158,144,144,240,156,144,144,144,110, 0, 0}; -static const GLubyte Fixed8x13_Character_199[] = { 8, 0, 16, 8, 60, 66, 64, 64, 64, 64, 64, 66, 60, 0, 0}; -static const GLubyte Fixed8x13_Character_200[] = { 8, 0, 0, 0,126, 64, 64,120, 64, 64,126, 0, 8, 16, 0}; -static const GLubyte Fixed8x13_Character_201[] = { 8, 0, 0, 0,126, 64, 64,120, 64, 64,126, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_202[] = { 8, 0, 0, 0,126, 64, 64,120, 64, 64,126, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_203[] = { 8, 0, 0, 0,126, 64, 64,120, 64, 64,126, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_204[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16,124, 0, 16, 32, 0}; -static const GLubyte Fixed8x13_Character_205[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16,124, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_206[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16,124, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_207[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 16,124, 0, 40, 40, 0}; -static const GLubyte Fixed8x13_Character_208[] = { 8, 0, 0, 0,120, 68, 66, 66,226, 66, 66, 68,120, 0, 0}; -static const GLubyte Fixed8x13_Character_209[] = { 8, 0, 0, 0,130,134,138,146,162,194,130, 0,152,100, 0}; -static const GLubyte Fixed8x13_Character_210[] = { 8, 0, 0, 0,124,130,130,130,130,130,124, 0, 16, 32, 0}; -static const GLubyte Fixed8x13_Character_211[] = { 8, 0, 0, 0,124,130,130,130,130,130,124, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_212[] = { 8, 0, 0, 0,124,130,130,130,130,130,124, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_213[] = { 8, 0, 0, 0,124,130,130,130,130,130,124, 0,152,100, 0}; -static const GLubyte Fixed8x13_Character_214[] = { 8, 0, 0, 0,124,130,130,130,130,130,124, 0, 40, 40, 0}; -static const GLubyte Fixed8x13_Character_215[] = { 8, 0, 0, 0, 0, 66, 36, 24, 24, 36, 66, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_216[] = { 8, 0, 0, 64, 60, 98, 82, 82, 82, 74, 74, 70, 60, 2, 0}; -static const GLubyte Fixed8x13_Character_217[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 0, 8, 16, 0}; -static const GLubyte Fixed8x13_Character_218[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_219[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_220[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_221[] = { 8, 0, 0, 0, 16, 16, 16, 16, 40, 68, 68, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_222[] = { 8, 0, 0, 0, 64, 64, 64,124, 66, 66, 66,124, 64, 0, 0}; -static const GLubyte Fixed8x13_Character_223[] = { 8, 0, 0, 0, 92, 66, 66, 76, 80, 72, 68, 68, 56, 0, 0}; -static const GLubyte Fixed8x13_Character_224[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 8, 16, 0}; -static const GLubyte Fixed8x13_Character_225[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 8, 4, 0}; -static const GLubyte Fixed8x13_Character_226[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_227[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 76, 50, 0}; -static const GLubyte Fixed8x13_Character_228[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_229[] = { 8, 0, 0, 0, 58, 70, 66, 62, 2, 60, 0, 24, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_230[] = { 8, 0, 0, 0,108,146,144,124, 18,108, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_231[] = { 8, 0, 16, 8, 60, 66, 64, 64, 66, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_232[] = { 8, 0, 0, 0, 60, 66, 64,126, 66, 60, 0, 0, 8, 16, 0}; -static const GLubyte Fixed8x13_Character_233[] = { 8, 0, 0, 0, 60, 66, 64,126, 66, 60, 0, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_234[] = { 8, 0, 0, 0, 60, 66, 64,126, 66, 60, 0, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_235[] = { 8, 0, 0, 0, 60, 66, 64,126, 66, 60, 0, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_236[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 48, 0, 0, 16, 32, 0}; -static const GLubyte Fixed8x13_Character_237[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 48, 0, 0, 32, 16, 0}; -static const GLubyte Fixed8x13_Character_238[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 48, 0, 0, 72, 48, 0}; -static const GLubyte Fixed8x13_Character_239[] = { 8, 0, 0, 0,124, 16, 16, 16, 16, 48, 0, 0, 40, 40, 0}; -static const GLubyte Fixed8x13_Character_240[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 4, 40, 24, 36, 0}; -static const GLubyte Fixed8x13_Character_241[] = { 8, 0, 0, 0, 66, 66, 66, 66, 98, 92, 0, 0, 76, 50, 0}; -static const GLubyte Fixed8x13_Character_242[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 16, 32, 0}; -static const GLubyte Fixed8x13_Character_243[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_244[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_245[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 76, 50, 0}; -static const GLubyte Fixed8x13_Character_246[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 60, 0, 0, 36, 36, 0}; -static const GLubyte Fixed8x13_Character_247[] = { 8, 0, 0, 0, 0, 16, 16, 0,124, 0, 16, 16, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_248[] = { 8, 0, 0, 64, 60, 98, 82, 74, 70, 60, 2, 0, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_249[] = { 8, 0, 0, 0, 58, 68, 68, 68, 68, 68, 0, 0, 16, 32, 0}; -static const GLubyte Fixed8x13_Character_250[] = { 8, 0, 0, 0, 58, 68, 68, 68, 68, 68, 0, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_251[] = { 8, 0, 0, 0, 58, 68, 68, 68, 68, 68, 0, 0, 36, 24, 0}; -static const GLubyte Fixed8x13_Character_252[] = { 8, 0, 0, 0, 58, 68, 68, 68, 68, 68, 0, 0, 40, 40, 0}; -static const GLubyte Fixed8x13_Character_253[] = { 8, 0, 60, 66, 2, 58, 70, 66, 66, 66, 0, 0, 16, 8, 0}; -static const GLubyte Fixed8x13_Character_254[] = { 8, 0, 64, 64, 92, 98, 66, 66, 98, 92, 64, 64, 0, 0, 0}; -static const GLubyte Fixed8x13_Character_255[] = { 8, 0, 60, 66, 2, 58, 70, 66, 66, 66, 0, 0, 36, 36, 0}; - -/* The font characters mapping: */ -static const GLubyte* Fixed8x13_Character_Map[] = {Fixed8x13_Character_000,Fixed8x13_Character_001,Fixed8x13_Character_002,Fixed8x13_Character_003,Fixed8x13_Character_004,Fixed8x13_Character_005,Fixed8x13_Character_006,Fixed8x13_Character_007,Fixed8x13_Character_008,Fixed8x13_Character_009,Fixed8x13_Character_010,Fixed8x13_Character_011,Fixed8x13_Character_012,Fixed8x13_Character_013,Fixed8x13_Character_014,Fixed8x13_Character_015, - Fixed8x13_Character_016,Fixed8x13_Character_017,Fixed8x13_Character_018,Fixed8x13_Character_019,Fixed8x13_Character_020,Fixed8x13_Character_021,Fixed8x13_Character_022,Fixed8x13_Character_023,Fixed8x13_Character_024,Fixed8x13_Character_025,Fixed8x13_Character_026,Fixed8x13_Character_027,Fixed8x13_Character_028,Fixed8x13_Character_029,Fixed8x13_Character_030,Fixed8x13_Character_031, - Fixed8x13_Character_032,Fixed8x13_Character_033,Fixed8x13_Character_034,Fixed8x13_Character_035,Fixed8x13_Character_036,Fixed8x13_Character_037,Fixed8x13_Character_038,Fixed8x13_Character_039,Fixed8x13_Character_040,Fixed8x13_Character_041,Fixed8x13_Character_042,Fixed8x13_Character_043,Fixed8x13_Character_044,Fixed8x13_Character_045,Fixed8x13_Character_046,Fixed8x13_Character_047, - Fixed8x13_Character_048,Fixed8x13_Character_049,Fixed8x13_Character_050,Fixed8x13_Character_051,Fixed8x13_Character_052,Fixed8x13_Character_053,Fixed8x13_Character_054,Fixed8x13_Character_055,Fixed8x13_Character_056,Fixed8x13_Character_057,Fixed8x13_Character_058,Fixed8x13_Character_059,Fixed8x13_Character_060,Fixed8x13_Character_061,Fixed8x13_Character_062,Fixed8x13_Character_063, - Fixed8x13_Character_064,Fixed8x13_Character_065,Fixed8x13_Character_066,Fixed8x13_Character_067,Fixed8x13_Character_068,Fixed8x13_Character_069,Fixed8x13_Character_070,Fixed8x13_Character_071,Fixed8x13_Character_072,Fixed8x13_Character_073,Fixed8x13_Character_074,Fixed8x13_Character_075,Fixed8x13_Character_076,Fixed8x13_Character_077,Fixed8x13_Character_078,Fixed8x13_Character_079, - Fixed8x13_Character_080,Fixed8x13_Character_081,Fixed8x13_Character_082,Fixed8x13_Character_083,Fixed8x13_Character_084,Fixed8x13_Character_085,Fixed8x13_Character_086,Fixed8x13_Character_087,Fixed8x13_Character_088,Fixed8x13_Character_089,Fixed8x13_Character_090,Fixed8x13_Character_091,Fixed8x13_Character_092,Fixed8x13_Character_093,Fixed8x13_Character_094,Fixed8x13_Character_095, - Fixed8x13_Character_096,Fixed8x13_Character_097,Fixed8x13_Character_098,Fixed8x13_Character_099,Fixed8x13_Character_100,Fixed8x13_Character_101,Fixed8x13_Character_102,Fixed8x13_Character_103,Fixed8x13_Character_104,Fixed8x13_Character_105,Fixed8x13_Character_106,Fixed8x13_Character_107,Fixed8x13_Character_108,Fixed8x13_Character_109,Fixed8x13_Character_110,Fixed8x13_Character_111, - Fixed8x13_Character_112,Fixed8x13_Character_113,Fixed8x13_Character_114,Fixed8x13_Character_115,Fixed8x13_Character_116,Fixed8x13_Character_117,Fixed8x13_Character_118,Fixed8x13_Character_119,Fixed8x13_Character_120,Fixed8x13_Character_121,Fixed8x13_Character_122,Fixed8x13_Character_123,Fixed8x13_Character_124,Fixed8x13_Character_125,Fixed8x13_Character_126,Fixed8x13_Character_032, - Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032, - Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032, - Fixed8x13_Character_160,Fixed8x13_Character_161,Fixed8x13_Character_162,Fixed8x13_Character_163,Fixed8x13_Character_164,Fixed8x13_Character_165,Fixed8x13_Character_166,Fixed8x13_Character_167,Fixed8x13_Character_168,Fixed8x13_Character_169,Fixed8x13_Character_170,Fixed8x13_Character_171,Fixed8x13_Character_172,Fixed8x13_Character_173,Fixed8x13_Character_174,Fixed8x13_Character_175, - Fixed8x13_Character_176,Fixed8x13_Character_177,Fixed8x13_Character_178,Fixed8x13_Character_179,Fixed8x13_Character_180,Fixed8x13_Character_181,Fixed8x13_Character_182,Fixed8x13_Character_183,Fixed8x13_Character_184,Fixed8x13_Character_185,Fixed8x13_Character_186,Fixed8x13_Character_187,Fixed8x13_Character_188,Fixed8x13_Character_189,Fixed8x13_Character_190,Fixed8x13_Character_191, - Fixed8x13_Character_192,Fixed8x13_Character_193,Fixed8x13_Character_194,Fixed8x13_Character_195,Fixed8x13_Character_196,Fixed8x13_Character_197,Fixed8x13_Character_198,Fixed8x13_Character_199,Fixed8x13_Character_200,Fixed8x13_Character_201,Fixed8x13_Character_202,Fixed8x13_Character_203,Fixed8x13_Character_204,Fixed8x13_Character_205,Fixed8x13_Character_206,Fixed8x13_Character_207, - Fixed8x13_Character_208,Fixed8x13_Character_209,Fixed8x13_Character_210,Fixed8x13_Character_211,Fixed8x13_Character_212,Fixed8x13_Character_213,Fixed8x13_Character_214,Fixed8x13_Character_215,Fixed8x13_Character_216,Fixed8x13_Character_217,Fixed8x13_Character_218,Fixed8x13_Character_219,Fixed8x13_Character_220,Fixed8x13_Character_221,Fixed8x13_Character_222,Fixed8x13_Character_223, - Fixed8x13_Character_224,Fixed8x13_Character_225,Fixed8x13_Character_226,Fixed8x13_Character_227,Fixed8x13_Character_228,Fixed8x13_Character_229,Fixed8x13_Character_230,Fixed8x13_Character_231,Fixed8x13_Character_232,Fixed8x13_Character_233,Fixed8x13_Character_234,Fixed8x13_Character_235,Fixed8x13_Character_236,Fixed8x13_Character_237,Fixed8x13_Character_238,Fixed8x13_Character_239, - Fixed8x13_Character_240,Fixed8x13_Character_241,Fixed8x13_Character_242,Fixed8x13_Character_243,Fixed8x13_Character_244,Fixed8x13_Character_245,Fixed8x13_Character_246,Fixed8x13_Character_247,Fixed8x13_Character_248,Fixed8x13_Character_249,Fixed8x13_Character_250,Fixed8x13_Character_251,Fixed8x13_Character_252,Fixed8x13_Character_253,Fixed8x13_Character_254,Fixed8x13_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontFixed8x13 = { "-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1", 256, 14, Fixed8x13_Character_Map, 0, 3 }; - -static const GLubyte Fixed9x15_Character_000[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_001[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 28, 0, 62, 0,127, 0,255,128,127, 0, 62, 0, 28, 0, 8, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_002[] = { 9, 0, 0,170,128, 85, 0,170,128, 85, 0,170,128, 85, 0,170,128, 85, 0,170,128, 85, 0,170,128, 85, 0,170,128, 85, 0,170,128}; -static const GLubyte Fixed9x15_Character_003[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 4, 0, 31, 0, 0, 0, 72, 0, 72, 0,120, 0, 72, 0, 72, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_004[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 14, 0, 72, 0, 79, 0, 64, 0,112, 0, 64, 0,120, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_005[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 14, 0, 9, 0, 14, 0, 0, 0, 56, 0, 64, 0, 64, 0, 64, 0, 56, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_006[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 14, 0, 8, 0, 15, 0, 0, 0,120, 0, 64, 0, 64, 0, 64, 0, 64, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_007[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 18, 0, 18, 0, 12, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_008[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 8, 0, 8, 0, 8, 0,127, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_009[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 68, 0, 76, 0, 84, 0,100, 0, 68, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_010[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 4, 0, 31, 0, 0, 0, 16, 0, 40, 0, 40, 0, 68, 0, 68, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_011[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_012[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_013[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_014[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_015[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,255,128, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_016[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,128}; -static const GLubyte Fixed9x15_Character_017[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,128, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_018[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_019[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_020[] = { 9, 0, 0,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_021[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 15,128, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_022[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,248, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_023[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,128, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_024[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_025[] = { 9, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_026[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 3, 0, 28, 0, 96, 0, 28, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_027[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 96, 0, 28, 0, 3, 0, 28, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_028[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 34, 0, 34, 0, 34, 0, 34, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_029[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0,127, 0, 8, 0,127, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_030[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 81, 0, 48, 0, 16, 0, 16, 0,124, 0, 16, 0, 16, 0, 17, 0, 14, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_031[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_032[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_033[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_034[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_035[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 36, 0,126, 0, 36, 0, 36, 0,126, 0, 36, 0, 36, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_036[] = { 9, 0, 0, 0, 0, 0, 0, 8, 0, 62, 0, 73, 0, 9, 0, 9, 0, 10, 0, 28, 0, 40, 0, 72, 0, 73, 0, 62, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_037[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 37, 0, 37, 0, 18, 0, 8, 0, 8, 0, 36, 0, 82, 0, 82, 0, 33, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_038[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 74, 0, 68, 0, 74, 0, 49, 0, 48, 0, 72, 0, 72, 0, 72, 0, 48, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_039[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 4, 0, 6, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_040[] = { 9, 0, 0, 0, 0, 0, 0, 4, 0, 8, 0, 8, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 8, 0, 8, 0, 4, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_041[] = { 9, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 8, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 8, 0, 16, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_042[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 73, 0, 42, 0, 28, 0, 42, 0, 73, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_043[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0,127, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_044[] = { 9, 0, 0, 8, 0, 4, 0, 4, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_045[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_046[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_047[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 32, 0, 32, 0, 16, 0, 8, 0, 8, 0, 4, 0, 2, 0, 2, 0, 1, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_048[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_049[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 72, 0, 40, 0, 24, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_050[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 64, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_051[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 1, 0, 1, 0, 1, 0, 14, 0, 4, 0, 2, 0, 1, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_052[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0,127, 0, 66, 0, 34, 0, 18, 0, 10, 0, 6, 0, 2, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_053[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 1, 0, 1, 0, 1, 0, 97, 0, 94, 0, 64, 0, 64, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_054[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 64, 0, 64, 0, 32, 0, 30, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_055[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 16, 0, 16, 0, 8, 0, 4, 0, 2, 0, 1, 0, 1, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_056[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 65, 0, 65, 0, 34, 0, 28, 0, 34, 0, 65, 0, 34, 0, 28, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_057[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 2, 0, 1, 0, 1, 0, 61, 0, 67, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_058[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_059[] = { 9, 0, 0, 8, 0, 4, 0, 4, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_060[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 0, 8, 0, 16, 0, 32, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_061[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_062[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0, 2, 0, 4, 0, 8, 0, 16, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_063[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 8, 0, 4, 0, 2, 0, 1, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_064[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0, 77, 0, 83, 0, 81, 0, 79, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_065[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 65, 0, 34, 0, 20, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_066[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 33, 0, 33, 0, 33, 0, 33, 0,126, 0, 33, 0, 33, 0, 33, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_067[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_068[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0, 33, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_069[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0, 32, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_070[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0, 32, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_071[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 71, 0, 64, 0, 64, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_072[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_073[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_074[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 66, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 15,128, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_075[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 66, 0, 68, 0, 72, 0, 80, 0,112, 0, 72, 0, 68, 0, 66, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_076[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_077[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 73, 0, 73, 0, 85, 0, 85, 0, 99, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_078[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 67, 0, 69, 0, 73, 0, 81, 0, 97, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_079[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_080[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0,126, 0, 65, 0, 65, 0, 65, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_081[] = { 9, 0, 0, 0, 0, 3, 0, 4, 0, 62, 0, 73, 0, 81, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_082[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 66, 0, 68, 0, 72, 0,126, 0, 65, 0, 65, 0, 65, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_083[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 1, 0, 6, 0, 56, 0, 64, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_084[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_085[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_086[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 20, 0, 20, 0, 20, 0, 34, 0, 34, 0, 34, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_087[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 85, 0, 73, 0, 73, 0, 73, 0, 73, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_088[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 34, 0, 20, 0, 8, 0, 8, 0, 20, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_089[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 20, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_090[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 64, 0, 64, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0, 1, 0,127, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_091[] = { 9, 0, 0, 0, 0, 0, 0, 30, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 30, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_092[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 0, 4, 0, 8, 0, 8, 0, 16, 0, 32, 0, 32, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_093[] = { 9, 0, 0, 0, 0, 0, 0, 60, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 60, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_094[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 34, 0, 20, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_095[] = { 9, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_096[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 8, 0, 16, 0, 48, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_097[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_098[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 97, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_099[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 64, 0, 64, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_100[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 65, 0, 65, 0, 67, 0, 61, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_101[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0,127, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_102[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 0,124, 0, 16, 0, 16, 0, 17, 0, 17, 0, 14, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_103[] = { 9, 0, 0, 62, 0, 65, 0, 65, 0, 62, 0, 64, 0, 60, 0, 66, 0, 66, 0, 66, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_104[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_105[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_106[] = { 9, 0, 0, 60, 0, 66, 0, 66, 0, 66, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_107[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 70, 0, 88, 0, 96, 0, 88, 0, 70, 0, 65, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_108[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_109[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 73, 0, 73, 0, 73, 0, 73, 0, 73, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_110[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_111[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_112[] = { 9, 0, 0, 64, 0, 64, 0, 64, 0, 94, 0, 97, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_113[] = { 9, 0, 0, 1, 0, 1, 0, 1, 0, 61, 0, 67, 0, 65, 0, 65, 0, 65, 0, 67, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_114[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 33, 0, 49, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_115[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 1, 0, 62, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_116[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 17, 0, 16, 0, 16, 0, 16, 0, 16, 0,126, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_117[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_118[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 20, 0, 20, 0, 34, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_119[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 85, 0, 73, 0, 73, 0, 73, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_120[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 34, 0, 20, 0, 8, 0, 20, 0, 34, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_121[] = { 9, 0, 0, 60, 0, 66, 0, 2, 0, 58, 0, 70, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_122[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_123[] = { 9, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 8, 0, 8, 0, 4, 0, 24, 0, 24, 0, 4, 0, 8, 0, 8, 0, 8, 0, 7, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_124[] = { 9, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_125[] = { 9, 0, 0, 0, 0, 0, 0,112, 0, 8, 0, 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 16, 0, 8, 0, 8, 0, 8, 0,112, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_126[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 73, 0, 49, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_127[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_128[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_129[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_130[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_131[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_132[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_133[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_134[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_135[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_136[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_137[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_138[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_139[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_140[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_141[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_142[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_143[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_144[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_145[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_146[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_147[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_148[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_149[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_150[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_151[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_152[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_153[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_154[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_155[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_156[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_157[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_158[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_159[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0, 65, 0, 64, 0, 1, 0,109, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_160[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_161[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_162[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 60, 0, 82, 0, 80, 0, 72, 0, 74, 0, 60, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_163[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 81, 0, 48, 0, 16, 0, 16, 0,124, 0, 16, 0, 16, 0, 17, 0, 14, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_164[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 62, 0, 34, 0, 34, 0, 62, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_165[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 62, 0, 8, 0, 62, 0, 20, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_166[] = { 9, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_167[] = { 9, 0, 0, 0, 0, 0, 0, 24, 0, 36, 0, 4, 0, 24, 0, 36, 0, 36, 0, 36, 0, 24, 0, 32, 0, 36, 0, 24, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_168[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_169[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 66, 0,153, 0,165, 0,161, 0,165, 0,153, 0, 66, 0, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_170[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 60, 0, 72, 0, 56, 0, 72, 0, 48, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_171[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 18, 0, 36, 0, 72, 0, 72, 0, 36, 0, 18, 0, 9, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_172[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_173[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_174[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 66, 0,165, 0,169, 0,185, 0,165, 0,185, 0, 66, 0, 60, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_175[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_176[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 18, 0, 18, 0, 12, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_177[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 8, 0, 8, 0, 8, 0,127, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_178[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 64, 0, 48, 0, 8, 0, 72, 0, 48, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_179[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 72, 0, 8, 0, 16, 0, 72, 0, 48, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_180[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 4, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_181[] = { 9, 0, 0, 0, 0, 64, 0, 64, 0, 93, 0, 99, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_182[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 61, 0, 69, 0, 69, 0, 69, 0, 63, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_183[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_184[] = { 9, 0, 0, 24, 0, 36, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_185[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 32, 0, 32, 0, 32, 0, 96, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_186[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 56, 0, 68, 0, 68, 0, 56, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_187[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 36, 0, 18, 0, 9, 0, 9, 0, 18, 0, 36, 0, 72, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_188[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 13, 0, 9, 0, 5, 0,115, 0, 33, 0, 32, 0, 32, 0, 96, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_189[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 8, 0, 6, 0, 1, 0,121, 0, 38, 0, 32, 0, 32, 0, 96, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_190[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 13, 0, 9, 0, 5, 0, 51, 0, 73, 0, 8, 0, 16, 0, 72, 0, 48, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_191[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 64, 0, 32, 0, 16, 0, 8, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_192[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 8, 0, 16, 0, 32, 0}; -static const GLubyte Fixed9x15_Character_193[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_194[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 34, 0, 20, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_195[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 78, 0, 49, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_196[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_197[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 34, 0, 20, 0, 28, 0, 34, 0, 28, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_198[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 72, 0, 72, 0, 72, 0,126, 0, 72, 0, 72, 0, 72, 0, 72, 0, 55, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_199[] = { 9, 0, 0, 24, 0, 36, 0, 12, 0, 62, 0, 65, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_200[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0,127, 0, 0, 0, 8, 0, 16, 0, 32, 0}; -static const GLubyte Fixed9x15_Character_201[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0,127, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_202[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0,127, 0, 0, 0, 34, 0, 20, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_203[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 32, 0, 32, 0, 32, 0, 60, 0, 32, 0, 32, 0,127, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_204[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 62, 0, 0, 0, 8, 0, 16, 0, 32, 0}; -static const GLubyte Fixed9x15_Character_205[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 62, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_206[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 62, 0, 0, 0, 34, 0, 20, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_207[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 62, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_208[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 33, 0, 33, 0, 33, 0, 33, 0,225, 0, 33, 0, 33, 0, 33, 0,124, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_209[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 67, 0, 69, 0, 73, 0, 73, 0, 81, 0, 97, 0, 65, 0, 0, 0, 78, 0, 49, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_210[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 16, 0, 32, 0}; -static const GLubyte Fixed9x15_Character_211[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_212[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 20, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_213[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 78, 0, 49, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_214[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_215[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 34, 0, 20, 0, 8, 0, 20, 0, 34, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_216[] = { 9, 0, 0, 0, 0, 0, 0, 64, 0, 62, 0, 97, 0, 81, 0, 81, 0, 73, 0, 73, 0, 69, 0, 69, 0, 67, 0, 62, 0, 1, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_217[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 8, 0, 16, 0, 32, 0}; -static const GLubyte Fixed9x15_Character_218[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_219[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 34, 0, 20, 0, 8, 0}; -static const GLubyte Fixed9x15_Character_220[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 34, 0, 34, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_221[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 20, 0, 34, 0, 65, 0, 65, 0, 0, 0, 8, 0, 4, 0, 2, 0}; -static const GLubyte Fixed9x15_Character_222[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 64, 0,126, 0, 65, 0, 65, 0, 65, 0,126, 0, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_223[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 34, 0, 34, 0, 34, 0, 36, 0,104, 0, 36, 0, 34, 0, 34, 0, 28, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_224[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 4, 0, 8, 0, 16, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_225[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 8, 0, 4, 0, 2, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_226[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 34, 0, 20, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_227[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 38, 0, 25, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_228[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 34, 0, 34, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_229[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 67, 0, 65, 0, 63, 0, 1, 0, 1, 0, 62, 0, 0, 0, 12, 0, 18, 0, 12, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_230[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 73, 0, 72, 0, 62, 0, 9, 0, 73, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_231[] = { 9, 0, 0, 24, 0, 36, 0, 12, 0, 62, 0, 65, 0, 64, 0, 64, 0, 64, 0, 65, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_232[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0,127, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 16, 0, 32, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_233[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0,127, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 4, 0, 2, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_234[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0,127, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 20, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_235[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 64, 0, 64, 0,127, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 34, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_236[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 8, 0, 16, 0, 32, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_237[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 16, 0, 8, 0, 4, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_238[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 68, 0, 40, 0, 16, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_239[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 56, 0, 0, 0, 36, 0, 36, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_240[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 4, 0, 40, 0, 24, 0, 36, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_241[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 97, 0, 94, 0, 0, 0, 78, 0, 49, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_242[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 16, 0, 32, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_243[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 8, 0, 4, 0, 2, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_244[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 20, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_245[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 78, 0, 49, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_246[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 62, 0, 0, 0, 34, 0, 34, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_247[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 28, 0, 8, 0, 0, 0,127, 0, 0, 0, 8, 0, 28, 0, 8, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_248[] = { 9, 0, 0, 0, 0, 0, 0, 64, 0, 62, 0, 81, 0, 81, 0, 73, 0, 69, 0, 69, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_249[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 8, 0, 16, 0, 32, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_250[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 8, 0, 4, 0, 2, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_251[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 34, 0, 20, 0, 8, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_252[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 36, 0, 36, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_253[] = { 9, 0, 0, 60, 0, 66, 0, 2, 0, 58, 0, 70, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 16, 0, 8, 0, 4, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_254[] = { 9, 0, 0, 64, 0, 64, 0, 64, 0, 94, 0, 97, 0, 65, 0, 65, 0, 97, 0, 94, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Fixed9x15_Character_255[] = { 9, 0, 0, 60, 0, 66, 0, 2, 0, 58, 0, 70, 0, 66, 0, 66, 0, 66, 0, 66, 0, 66, 0, 0, 0, 36, 0, 36, 0, 0, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* Fixed9x15_Character_Map[] = {Fixed9x15_Character_000,Fixed9x15_Character_001,Fixed9x15_Character_002,Fixed9x15_Character_003,Fixed9x15_Character_004,Fixed9x15_Character_005,Fixed9x15_Character_006,Fixed9x15_Character_007,Fixed9x15_Character_008,Fixed9x15_Character_009,Fixed9x15_Character_010,Fixed9x15_Character_011,Fixed9x15_Character_012,Fixed9x15_Character_013,Fixed9x15_Character_014,Fixed9x15_Character_015, - Fixed9x15_Character_016,Fixed9x15_Character_017,Fixed9x15_Character_018,Fixed9x15_Character_019,Fixed9x15_Character_020,Fixed9x15_Character_021,Fixed9x15_Character_022,Fixed9x15_Character_023,Fixed9x15_Character_024,Fixed9x15_Character_025,Fixed9x15_Character_026,Fixed9x15_Character_027,Fixed9x15_Character_028,Fixed9x15_Character_029,Fixed9x15_Character_030,Fixed9x15_Character_031, - Fixed9x15_Character_032,Fixed9x15_Character_033,Fixed9x15_Character_034,Fixed9x15_Character_035,Fixed9x15_Character_036,Fixed9x15_Character_037,Fixed9x15_Character_038,Fixed9x15_Character_039,Fixed9x15_Character_040,Fixed9x15_Character_041,Fixed9x15_Character_042,Fixed9x15_Character_043,Fixed9x15_Character_044,Fixed9x15_Character_045,Fixed9x15_Character_046,Fixed9x15_Character_047, - Fixed9x15_Character_048,Fixed9x15_Character_049,Fixed9x15_Character_050,Fixed9x15_Character_051,Fixed9x15_Character_052,Fixed9x15_Character_053,Fixed9x15_Character_054,Fixed9x15_Character_055,Fixed9x15_Character_056,Fixed9x15_Character_057,Fixed9x15_Character_058,Fixed9x15_Character_059,Fixed9x15_Character_060,Fixed9x15_Character_061,Fixed9x15_Character_062,Fixed9x15_Character_063, - Fixed9x15_Character_064,Fixed9x15_Character_065,Fixed9x15_Character_066,Fixed9x15_Character_067,Fixed9x15_Character_068,Fixed9x15_Character_069,Fixed9x15_Character_070,Fixed9x15_Character_071,Fixed9x15_Character_072,Fixed9x15_Character_073,Fixed9x15_Character_074,Fixed9x15_Character_075,Fixed9x15_Character_076,Fixed9x15_Character_077,Fixed9x15_Character_078,Fixed9x15_Character_079, - Fixed9x15_Character_080,Fixed9x15_Character_081,Fixed9x15_Character_082,Fixed9x15_Character_083,Fixed9x15_Character_084,Fixed9x15_Character_085,Fixed9x15_Character_086,Fixed9x15_Character_087,Fixed9x15_Character_088,Fixed9x15_Character_089,Fixed9x15_Character_090,Fixed9x15_Character_091,Fixed9x15_Character_092,Fixed9x15_Character_093,Fixed9x15_Character_094,Fixed9x15_Character_095, - Fixed9x15_Character_096,Fixed9x15_Character_097,Fixed9x15_Character_098,Fixed9x15_Character_099,Fixed9x15_Character_100,Fixed9x15_Character_101,Fixed9x15_Character_102,Fixed9x15_Character_103,Fixed9x15_Character_104,Fixed9x15_Character_105,Fixed9x15_Character_106,Fixed9x15_Character_107,Fixed9x15_Character_108,Fixed9x15_Character_109,Fixed9x15_Character_110,Fixed9x15_Character_111, - Fixed9x15_Character_112,Fixed9x15_Character_113,Fixed9x15_Character_114,Fixed9x15_Character_115,Fixed9x15_Character_116,Fixed9x15_Character_117,Fixed9x15_Character_118,Fixed9x15_Character_119,Fixed9x15_Character_120,Fixed9x15_Character_121,Fixed9x15_Character_122,Fixed9x15_Character_123,Fixed9x15_Character_124,Fixed9x15_Character_125,Fixed9x15_Character_126,Fixed9x15_Character_032, - Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032, - Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032, - Fixed9x15_Character_160,Fixed9x15_Character_161,Fixed9x15_Character_162,Fixed9x15_Character_163,Fixed9x15_Character_164,Fixed9x15_Character_165,Fixed9x15_Character_166,Fixed9x15_Character_167,Fixed9x15_Character_168,Fixed9x15_Character_169,Fixed9x15_Character_170,Fixed9x15_Character_171,Fixed9x15_Character_172,Fixed9x15_Character_173,Fixed9x15_Character_174,Fixed9x15_Character_175, - Fixed9x15_Character_176,Fixed9x15_Character_177,Fixed9x15_Character_178,Fixed9x15_Character_179,Fixed9x15_Character_180,Fixed9x15_Character_181,Fixed9x15_Character_182,Fixed9x15_Character_183,Fixed9x15_Character_184,Fixed9x15_Character_185,Fixed9x15_Character_186,Fixed9x15_Character_187,Fixed9x15_Character_188,Fixed9x15_Character_189,Fixed9x15_Character_190,Fixed9x15_Character_191, - Fixed9x15_Character_192,Fixed9x15_Character_193,Fixed9x15_Character_194,Fixed9x15_Character_195,Fixed9x15_Character_196,Fixed9x15_Character_197,Fixed9x15_Character_198,Fixed9x15_Character_199,Fixed9x15_Character_200,Fixed9x15_Character_201,Fixed9x15_Character_202,Fixed9x15_Character_203,Fixed9x15_Character_204,Fixed9x15_Character_205,Fixed9x15_Character_206,Fixed9x15_Character_207, - Fixed9x15_Character_208,Fixed9x15_Character_209,Fixed9x15_Character_210,Fixed9x15_Character_211,Fixed9x15_Character_212,Fixed9x15_Character_213,Fixed9x15_Character_214,Fixed9x15_Character_215,Fixed9x15_Character_216,Fixed9x15_Character_217,Fixed9x15_Character_218,Fixed9x15_Character_219,Fixed9x15_Character_220,Fixed9x15_Character_221,Fixed9x15_Character_222,Fixed9x15_Character_223, - Fixed9x15_Character_224,Fixed9x15_Character_225,Fixed9x15_Character_226,Fixed9x15_Character_227,Fixed9x15_Character_228,Fixed9x15_Character_229,Fixed9x15_Character_230,Fixed9x15_Character_231,Fixed9x15_Character_232,Fixed9x15_Character_233,Fixed9x15_Character_234,Fixed9x15_Character_235,Fixed9x15_Character_236,Fixed9x15_Character_237,Fixed9x15_Character_238,Fixed9x15_Character_239, - Fixed9x15_Character_240,Fixed9x15_Character_241,Fixed9x15_Character_242,Fixed9x15_Character_243,Fixed9x15_Character_244,Fixed9x15_Character_245,Fixed9x15_Character_246,Fixed9x15_Character_247,Fixed9x15_Character_248,Fixed9x15_Character_249,Fixed9x15_Character_250,Fixed9x15_Character_251,Fixed9x15_Character_252,Fixed9x15_Character_253,Fixed9x15_Character_254,Fixed9x15_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontFixed9x15 = { "-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1", 256, 16, Fixed9x15_Character_Map, 0, 4 }; - -static const GLubyte Helvetica10_Character_000[] = { 8, 0, 0, 0, 84, 0, 68, 0, 68, 0, 84, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_001[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_002[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_003[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_004[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_005[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_006[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_007[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_008[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_009[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_010[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_011[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_012[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_013[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_014[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_015[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_016[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_017[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_018[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_019[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_020[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_021[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_022[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_023[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_024[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_025[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_026[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_027[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_028[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_029[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_030[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_031[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_032[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_033[] = { 3, 0, 0, 0, 64, 0, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_034[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 0, 0, 0}; -static const GLubyte Helvetica10_Character_035[] = { 6, 0, 0, 0, 80, 80,248, 40,124, 40, 40, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_036[] = { 6, 0, 0, 32,112,168, 40,112,160,168,112, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_037[] = { 9, 0, 0, 0, 0, 0, 0, 38, 0, 41, 0, 22, 0, 16, 0, 8, 0,104, 0,148, 0,100, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_038[] = { 8, 0, 0, 0, 50, 76, 76, 82, 48, 40, 40, 16, 0, 0, 0}; -static const GLubyte Helvetica10_Character_039[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_040[] = { 4, 0, 32, 64, 64,128,128,128,128, 64, 64, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_041[] = { 4, 0, 64, 32, 32, 16, 16, 16, 16, 32, 32, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_042[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0,160, 64,160, 0, 0, 0}; -static const GLubyte Helvetica10_Character_043[] = { 6, 0, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_044[] = { 3, 0,128, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_045[] = { 7, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_046[] = { 3, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_047[] = { 3, 0, 0, 0,128,128, 64, 64, 64, 64, 32, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_048[] = { 6, 0, 0, 0,112,136,136,136,136,136,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_049[] = { 6, 0, 0, 0, 32, 32, 32, 32, 32, 32, 96, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_050[] = { 6, 0, 0, 0,248,128, 64, 48, 8, 8,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_051[] = { 6, 0, 0, 0,112,136, 8, 8, 48, 8,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_052[] = { 6, 0, 0, 0, 16, 16,248,144, 80, 80, 48, 16, 0, 0, 0}; -static const GLubyte Helvetica10_Character_053[] = { 6, 0, 0, 0,112,136, 8, 8,240,128,128,248, 0, 0, 0}; -static const GLubyte Helvetica10_Character_054[] = { 6, 0, 0, 0,112,136,136,200,176,128,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_055[] = { 6, 0, 0, 0, 64, 64, 32, 32, 16, 16, 8,248, 0, 0, 0}; -static const GLubyte Helvetica10_Character_056[] = { 6, 0, 0, 0,112,136,136,136,112,136,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_057[] = { 6, 0, 0, 0,112,136, 8,104,152,136,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_058[] = { 3, 0, 0, 0, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_059[] = { 3, 0,128, 64, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_060[] = { 6, 0, 0, 0, 0, 16, 32, 64, 32, 16, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_061[] = { 5, 0, 0, 0, 0, 0,240, 0,240, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_062[] = { 6, 0, 0, 0, 0, 64, 32, 16, 32, 64, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_063[] = { 6, 0, 0, 0, 32, 0, 32, 32, 16, 8, 72, 48, 0, 0, 0}; -static const GLubyte Helvetica10_Character_064[] = { 11, 0, 0, 62, 0, 64, 0,155, 0,164,128,164,128,162, 64,146, 64, 77, 64, 32,128, 31, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_065[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 0, 0}; -static const GLubyte Helvetica10_Character_066[] = { 7, 0, 0, 0,120, 68, 68, 68,120, 68, 68,120, 0, 0, 0}; -static const GLubyte Helvetica10_Character_067[] = { 8, 0, 0, 0, 60, 66, 64, 64, 64, 64, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica10_Character_068[] = { 8, 0, 0, 0,120, 68, 66, 66, 66, 66, 68,120, 0, 0, 0}; -static const GLubyte Helvetica10_Character_069[] = { 7, 0, 0, 0,124, 64, 64, 64,124, 64, 64,124, 0, 0, 0}; -static const GLubyte Helvetica10_Character_070[] = { 6, 0, 0, 0, 64, 64, 64, 64,120, 64, 64,124, 0, 0, 0}; -static const GLubyte Helvetica10_Character_071[] = { 8, 0, 0, 0, 58, 70, 66, 70, 64, 64, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica10_Character_072[] = { 8, 0, 0, 0, 66, 66, 66, 66,126, 66, 66, 66, 0, 0, 0}; -static const GLubyte Helvetica10_Character_073[] = { 3, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_074[] = { 5, 0, 0, 0, 96,144, 16, 16, 16, 16, 16, 16, 0, 0, 0}; -static const GLubyte Helvetica10_Character_075[] = { 7, 0, 0, 0, 68, 68, 72, 72,112, 80, 72, 68, 0, 0, 0}; -static const GLubyte Helvetica10_Character_076[] = { 6, 0, 0, 0,120, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_077[] = { 9, 0, 0, 0, 0, 0, 0, 73, 0, 73, 0, 73, 0, 85, 0, 85, 0, 99, 0, 99, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_078[] = { 8, 0, 0, 0, 70, 70, 74, 74, 82, 82, 98, 98, 0, 0, 0}; -static const GLubyte Helvetica10_Character_079[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica10_Character_080[] = { 7, 0, 0, 0, 64, 64, 64, 64,120, 68, 68,120, 0, 0, 0}; -static const GLubyte Helvetica10_Character_081[] = { 8, 0, 0, 1, 62, 70, 74, 66, 66, 66, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica10_Character_082[] = { 7, 0, 0, 0, 68, 68, 68, 68,120, 68, 68,120, 0, 0, 0}; -static const GLubyte Helvetica10_Character_083[] = { 7, 0, 0, 0, 56, 68, 68, 4, 56, 64, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica10_Character_084[] = { 5, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32,248, 0, 0, 0}; -static const GLubyte Helvetica10_Character_085[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 0, 0, 0}; -static const GLubyte Helvetica10_Character_086[] = { 7, 0, 0, 0, 16, 40, 40, 68, 68, 68,130,130, 0, 0, 0}; -static const GLubyte Helvetica10_Character_087[] = { 9, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 34, 0, 85, 0, 73, 0, 73, 0,136,128,136,128, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_088[] = { 7, 0, 0, 0, 68, 68, 40, 40, 16, 40, 68, 68, 0, 0, 0}; -static const GLubyte Helvetica10_Character_089[] = { 7, 0, 0, 0, 16, 16, 16, 40, 40, 68, 68,130, 0, 0, 0}; -static const GLubyte Helvetica10_Character_090[] = { 7, 0, 0, 0,124, 64, 32, 16, 16, 8, 4,124, 0, 0, 0}; -static const GLubyte Helvetica10_Character_091[] = { 3, 0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 96, 0, 0, 0}; -static const GLubyte Helvetica10_Character_092[] = { 3, 0, 0, 0, 32, 32, 64, 64, 64, 64,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_093[] = { 3, 0,192, 64, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0}; -static const GLubyte Helvetica10_Character_094[] = { 6, 0, 0, 0, 0, 0, 0,136, 80, 80, 32, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_095[] = { 6, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_096[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_097[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_098[] = { 6, 0, 0, 0,176,200,136,136,200,176,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_099[] = { 5, 0, 0, 0, 96,144,128,128,144, 96, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_100[] = { 6, 0, 0, 0,104,152,136,136,152,104, 8, 8, 0, 0, 0}; -static const GLubyte Helvetica10_Character_101[] = { 5, 0, 0, 0, 96,144,128,240,144, 96, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_102[] = { 4, 0, 0, 0, 64, 64, 64, 64, 64,224, 64, 48, 0, 0, 0}; -static const GLubyte Helvetica10_Character_103[] = { 6, 0,112, 8,104,152,136,136,152,104, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_104[] = { 6, 0, 0, 0,136,136,136,136,200,176,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_105[] = { 2, 0, 0, 0,128,128,128,128,128,128, 0,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_106[] = { 2, 0, 0,128,128,128,128,128,128,128, 0,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_107[] = { 5, 0, 0, 0,144,144,160,192,160,144,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_108[] = { 2, 0, 0, 0,128,128,128,128,128,128,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_109[] = { 8, 0, 0, 0,146,146,146,146,146,236, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_110[] = { 6, 0, 0, 0,136,136,136,136,200,176, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_111[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_112[] = { 6, 0,128,128,176,200,136,136,200,176, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_113[] = { 6, 0, 8, 8,104,152,136,136,152,104, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_114[] = { 4, 0, 0, 0,128,128,128,128,192,160, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_115[] = { 5, 0, 0, 0, 96,144, 16, 96,144, 96, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_116[] = { 4, 0, 0, 0, 96, 64, 64, 64, 64,224, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_117[] = { 5, 0, 0, 0,112,144,144,144,144,144, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_118[] = { 6, 0, 0, 0, 32, 32, 80, 80,136,136, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_119[] = { 8, 0, 0, 0, 40, 40, 84, 84,146,146, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_120[] = { 6, 0, 0, 0,136,136, 80, 32, 80,136, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_121[] = { 5, 0,128, 64, 64, 96,160,160,144,144, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_122[] = { 5, 0, 0, 0,240,128, 64, 32, 16,240, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_123[] = { 3, 0, 32, 64, 64, 64, 64,128, 64, 64, 64, 32, 0, 0, 0}; -static const GLubyte Helvetica10_Character_124[] = { 3, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_125[] = { 3, 0,128, 64, 64, 64, 64, 32, 64, 64, 64,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_126[] = { 7, 0, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_127[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_128[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_129[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_130[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_131[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_132[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_133[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_134[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_135[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_136[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_137[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_138[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_139[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_140[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_141[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_142[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_143[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_144[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_145[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_146[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_147[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_148[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_149[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_150[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_151[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_152[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_153[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_154[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_155[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_156[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_157[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_158[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_159[] = { 13, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_160[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_161[] = { 3, 0, 64, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_162[] = { 6, 0, 0, 64,112,168,160,160,168,112, 16, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_163[] = { 6, 0, 0, 0,176, 72, 64, 64,224, 64, 72, 48, 0, 0, 0}; -static const GLubyte Helvetica10_Character_164[] = { 5, 0, 0, 0, 0,144, 96,144,144, 96,144, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_165[] = { 6, 0, 0, 0, 32,248, 32,248, 80, 80,136,136, 0, 0, 0}; -static const GLubyte Helvetica10_Character_166[] = { 3, 0, 64, 64, 64, 64, 0, 0, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_167[] = { 6, 0,112,136, 24,112,200,152,112,192,136,112, 0, 0, 0}; -static const GLubyte Helvetica10_Character_168[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0}; -static const GLubyte Helvetica10_Character_169[] = { 9, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 77, 0, 81, 0, 77, 0, 34, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_170[] = { 4, 0, 0, 0, 0, 0, 0,224, 0,160, 32,224, 0, 0, 0}; -static const GLubyte Helvetica10_Character_171[] = { 6, 0, 0, 0, 40, 80,160, 80, 40, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_172[] = { 7, 0, 0, 0, 0, 0, 4, 4,124, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_173[] = { 4, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_174[] = { 9, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 85, 0, 89, 0, 93, 0, 34, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_175[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0}; -static const GLubyte Helvetica10_Character_176[] = { 4, 0, 0, 0, 0, 0, 0, 96,144,144, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_177[] = { 6, 0, 0, 0,248, 0, 32, 32,248, 32, 32, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_178[] = { 3, 0, 0, 0, 0, 0, 0,224, 64,160, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_179[] = { 3, 0, 0, 0, 0, 0, 0,192, 32, 64,224, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_180[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_181[] = { 5, 0,128,128,240,144,144,144,144,144, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_182[] = { 6, 0, 40, 40, 40, 40, 40,104,232,232,232,124, 0, 0, 0}; -static const GLubyte Helvetica10_Character_183[] = { 3, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_184[] = { 3, 0,192, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_185[] = { 3, 0, 0, 0, 0, 0, 0, 64, 64,192, 64, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_186[] = { 4, 0, 0, 0, 0, 0, 0,224, 0,224,160,224, 0, 0, 0}; -static const GLubyte Helvetica10_Character_187[] = { 6, 0, 0, 0,160, 80, 40, 80,160, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_188[] = { 9, 0, 0, 0, 0, 0, 0, 33, 0, 23,128, 19, 0, 9, 0, 72, 0, 68, 0,196, 0, 66, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_189[] = { 9, 0, 0, 0, 0, 0, 0, 39, 0, 18, 0, 21, 0, 11, 0, 72, 0, 68, 0,196, 0, 66, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_190[] = { 9, 0, 0, 0, 0, 0, 0, 33, 0, 23,128, 19, 0, 9, 0,200, 0, 36, 0, 68, 0,226, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_191[] = { 6, 0, 48, 72, 64, 32, 16, 16, 0, 16, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_192[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 16, 32}; -static const GLubyte Helvetica10_Character_193[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 16, 8}; -static const GLubyte Helvetica10_Character_194[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 40, 16}; -static const GLubyte Helvetica10_Character_195[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 40, 20}; -static const GLubyte Helvetica10_Character_196[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 40, 0}; -static const GLubyte Helvetica10_Character_197[] = { 7, 0, 0, 0,130,130,124, 68, 40, 40, 16, 16, 16, 40, 16}; -static const GLubyte Helvetica10_Character_198[] = { 10, 0, 0, 0, 0, 0, 0,143,128,136, 0,120, 0, 72, 0, 47,128, 40, 0, 24, 0, 31,128, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_199[] = { 8, 0, 24, 8, 60, 66, 64, 64, 64, 64, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica10_Character_200[] = { 7, 0, 0, 0,124, 64, 64, 64,124, 64, 64,124, 0, 16, 32}; -static const GLubyte Helvetica10_Character_201[] = { 7, 0, 0, 0,124, 64, 64, 64,124, 64, 64,124, 0, 16, 8}; -static const GLubyte Helvetica10_Character_202[] = { 7, 0, 0, 0,124, 64, 64,124, 64, 64, 64,124, 0, 40, 16}; -static const GLubyte Helvetica10_Character_203[] = { 7, 0, 0, 0,124, 64, 64, 64,124, 64, 64,124, 0, 40, 0}; -static const GLubyte Helvetica10_Character_204[] = { 3, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64,128}; -static const GLubyte Helvetica10_Character_205[] = { 3, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 32}; -static const GLubyte Helvetica10_Character_206[] = { 3, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0,160, 64}; -static const GLubyte Helvetica10_Character_207[] = { 3, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0,160, 0}; -static const GLubyte Helvetica10_Character_208[] = { 8, 0, 0, 0,120, 68, 66, 66,242, 66, 68,120, 0, 0, 0}; -static const GLubyte Helvetica10_Character_209[] = { 8, 0, 0, 0, 70, 70, 74, 74, 82, 82, 98, 98, 0, 40, 20}; -static const GLubyte Helvetica10_Character_210[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 8, 16}; -static const GLubyte Helvetica10_Character_211[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 8, 4}; -static const GLubyte Helvetica10_Character_212[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 20, 8}; -static const GLubyte Helvetica10_Character_213[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 40, 20}; -static const GLubyte Helvetica10_Character_214[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 60, 0, 36, 0}; -static const GLubyte Helvetica10_Character_215[] = { 6, 0, 0, 0, 0,136, 80, 32, 80,136, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_216[] = { 8, 0, 0, 64, 60, 98, 82, 82, 74, 74, 70, 60, 2, 0, 0}; -static const GLubyte Helvetica10_Character_217[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 0, 8, 16}; -static const GLubyte Helvetica10_Character_218[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 0, 16, 8}; -static const GLubyte Helvetica10_Character_219[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 0, 20, 8}; -static const GLubyte Helvetica10_Character_220[] = { 8, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 0, 36, 0}; -static const GLubyte Helvetica10_Character_221[] = { 7, 0, 0, 0, 16, 16, 16, 40, 40, 68, 68,130, 0, 16, 8}; -static const GLubyte Helvetica10_Character_222[] = { 7, 0, 0, 0, 64, 64,120, 68, 68,120, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica10_Character_223[] = { 5, 0, 0, 0,160,144,144,144,160,144,144, 96, 0, 0, 0}; -static const GLubyte Helvetica10_Character_224[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0, 32, 64, 0, 0}; -static const GLubyte Helvetica10_Character_225[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0, 32, 16, 0, 0}; -static const GLubyte Helvetica10_Character_226[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0, 80, 32, 0, 0}; -static const GLubyte Helvetica10_Character_227[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0,160, 80, 0, 0}; -static const GLubyte Helvetica10_Character_228[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 0, 80, 0, 0, 0}; -static const GLubyte Helvetica10_Character_229[] = { 5, 0, 0, 0,104,144,144,112, 16,224, 32, 80, 32, 0, 0}; -static const GLubyte Helvetica10_Character_230[] = { 8, 0, 0, 0,108,146,144,126, 18,236, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_231[] = { 5, 0, 96, 32, 96,144,128,128,144, 96, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_232[] = { 5, 0, 0, 0, 96,144,128,240,144, 96, 0, 32, 64, 0, 0}; -static const GLubyte Helvetica10_Character_233[] = { 5, 0, 0, 0, 96,144,128,240,144, 96, 0, 64, 32, 0, 0}; -static const GLubyte Helvetica10_Character_234[] = { 5, 0, 0, 0, 96,144,128,240,144, 96, 0, 80, 32, 0, 0}; -static const GLubyte Helvetica10_Character_235[] = { 5, 0, 0, 0, 96,144,128,240,144, 96, 0, 80, 0, 0, 0}; -static const GLubyte Helvetica10_Character_236[] = { 2, 0, 0, 0,128,128,128,128,128,128, 0,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_237[] = { 2, 0, 0, 0,128,128,128,128,128,128, 0,128, 64, 0, 0}; -static const GLubyte Helvetica10_Character_238[] = { 2, 0, 0, 0,128,128,128,128,128,128, 0, 64,128, 0, 0}; -static const GLubyte Helvetica10_Character_239[] = { 2, 0, 0, 0, 64, 64, 64, 64, 64, 64, 0,160, 0, 0, 0}; -static const GLubyte Helvetica10_Character_240[] = { 6, 0, 0, 0,112,136,136,136,136,120,144, 96, 80, 0, 0}; -static const GLubyte Helvetica10_Character_241[] = { 5, 0, 0, 0,144,144,144,144,144,224, 0,160, 80, 0, 0}; -static const GLubyte Helvetica10_Character_242[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 32, 64, 0, 0}; -static const GLubyte Helvetica10_Character_243[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 32, 16, 0, 0}; -static const GLubyte Helvetica10_Character_244[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 80, 32, 0, 0}; -static const GLubyte Helvetica10_Character_245[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 80, 40, 0, 0}; -static const GLubyte Helvetica10_Character_246[] = { 6, 0, 0, 0,112,136,136,136,136,112, 0, 80, 0, 0, 0}; -static const GLubyte Helvetica10_Character_247[] = { 6, 0, 0, 0, 0, 32, 0,248, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_248[] = { 6, 0, 0, 0,112,136,200,168,152,116, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica10_Character_249[] = { 5, 0, 0, 0,112,144,144,144,144,144, 0, 32, 64, 0, 0}; -static const GLubyte Helvetica10_Character_250[] = { 5, 0, 0, 0,112,144,144,144,144,144, 0, 64, 32, 0, 0}; -static const GLubyte Helvetica10_Character_251[] = { 5, 0, 0, 0,112,144,144,144,144,144, 0, 80, 32, 0, 0}; -static const GLubyte Helvetica10_Character_252[] = { 5, 0, 0, 0,112,144,144,144,144,144, 0, 80, 0, 0, 0}; -static const GLubyte Helvetica10_Character_253[] = { 5, 0,128, 64, 64, 96,160,160,144,144, 0, 32, 16, 0, 0}; -static const GLubyte Helvetica10_Character_254[] = { 6, 0,128,128,176,200,136,136,200,176,128,128, 0, 0, 0}; -static const GLubyte Helvetica10_Character_255[] = { 5, 0,128, 64, 64, 96,160,160,144,144, 0, 80, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* Helvetica10_Character_Map[] = {Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032, - Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032, - Helvetica10_Character_032,Helvetica10_Character_033,Helvetica10_Character_034,Helvetica10_Character_035,Helvetica10_Character_036,Helvetica10_Character_037,Helvetica10_Character_038,Helvetica10_Character_039,Helvetica10_Character_040,Helvetica10_Character_041,Helvetica10_Character_042,Helvetica10_Character_043,Helvetica10_Character_044,Helvetica10_Character_045,Helvetica10_Character_046,Helvetica10_Character_047, - Helvetica10_Character_048,Helvetica10_Character_049,Helvetica10_Character_050,Helvetica10_Character_051,Helvetica10_Character_052,Helvetica10_Character_053,Helvetica10_Character_054,Helvetica10_Character_055,Helvetica10_Character_056,Helvetica10_Character_057,Helvetica10_Character_058,Helvetica10_Character_059,Helvetica10_Character_060,Helvetica10_Character_061,Helvetica10_Character_062,Helvetica10_Character_063, - Helvetica10_Character_064,Helvetica10_Character_065,Helvetica10_Character_066,Helvetica10_Character_067,Helvetica10_Character_068,Helvetica10_Character_069,Helvetica10_Character_070,Helvetica10_Character_071,Helvetica10_Character_072,Helvetica10_Character_073,Helvetica10_Character_074,Helvetica10_Character_075,Helvetica10_Character_076,Helvetica10_Character_077,Helvetica10_Character_078,Helvetica10_Character_079, - Helvetica10_Character_080,Helvetica10_Character_081,Helvetica10_Character_082,Helvetica10_Character_083,Helvetica10_Character_084,Helvetica10_Character_085,Helvetica10_Character_086,Helvetica10_Character_087,Helvetica10_Character_088,Helvetica10_Character_089,Helvetica10_Character_090,Helvetica10_Character_091,Helvetica10_Character_092,Helvetica10_Character_093,Helvetica10_Character_094,Helvetica10_Character_095, - Helvetica10_Character_096,Helvetica10_Character_097,Helvetica10_Character_098,Helvetica10_Character_099,Helvetica10_Character_100,Helvetica10_Character_101,Helvetica10_Character_102,Helvetica10_Character_103,Helvetica10_Character_104,Helvetica10_Character_105,Helvetica10_Character_106,Helvetica10_Character_107,Helvetica10_Character_108,Helvetica10_Character_109,Helvetica10_Character_110,Helvetica10_Character_111, - Helvetica10_Character_112,Helvetica10_Character_113,Helvetica10_Character_114,Helvetica10_Character_115,Helvetica10_Character_116,Helvetica10_Character_117,Helvetica10_Character_118,Helvetica10_Character_119,Helvetica10_Character_120,Helvetica10_Character_121,Helvetica10_Character_122,Helvetica10_Character_123,Helvetica10_Character_124,Helvetica10_Character_125,Helvetica10_Character_126,Helvetica10_Character_032, - Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032, - Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032, - Helvetica10_Character_160,Helvetica10_Character_161,Helvetica10_Character_162,Helvetica10_Character_163,Helvetica10_Character_164,Helvetica10_Character_165,Helvetica10_Character_166,Helvetica10_Character_167,Helvetica10_Character_168,Helvetica10_Character_169,Helvetica10_Character_170,Helvetica10_Character_171,Helvetica10_Character_172,Helvetica10_Character_173,Helvetica10_Character_174,Helvetica10_Character_175, - Helvetica10_Character_176,Helvetica10_Character_177,Helvetica10_Character_178,Helvetica10_Character_179,Helvetica10_Character_180,Helvetica10_Character_181,Helvetica10_Character_182,Helvetica10_Character_183,Helvetica10_Character_184,Helvetica10_Character_185,Helvetica10_Character_186,Helvetica10_Character_187,Helvetica10_Character_188,Helvetica10_Character_189,Helvetica10_Character_190,Helvetica10_Character_191, - Helvetica10_Character_192,Helvetica10_Character_193,Helvetica10_Character_194,Helvetica10_Character_195,Helvetica10_Character_196,Helvetica10_Character_197,Helvetica10_Character_198,Helvetica10_Character_199,Helvetica10_Character_200,Helvetica10_Character_201,Helvetica10_Character_202,Helvetica10_Character_203,Helvetica10_Character_204,Helvetica10_Character_205,Helvetica10_Character_206,Helvetica10_Character_207, - Helvetica10_Character_208,Helvetica10_Character_209,Helvetica10_Character_210,Helvetica10_Character_211,Helvetica10_Character_212,Helvetica10_Character_213,Helvetica10_Character_214,Helvetica10_Character_215,Helvetica10_Character_216,Helvetica10_Character_217,Helvetica10_Character_218,Helvetica10_Character_219,Helvetica10_Character_220,Helvetica10_Character_221,Helvetica10_Character_222,Helvetica10_Character_223, - Helvetica10_Character_224,Helvetica10_Character_225,Helvetica10_Character_226,Helvetica10_Character_227,Helvetica10_Character_228,Helvetica10_Character_229,Helvetica10_Character_230,Helvetica10_Character_231,Helvetica10_Character_232,Helvetica10_Character_233,Helvetica10_Character_234,Helvetica10_Character_235,Helvetica10_Character_236,Helvetica10_Character_237,Helvetica10_Character_238,Helvetica10_Character_239, - Helvetica10_Character_240,Helvetica10_Character_241,Helvetica10_Character_242,Helvetica10_Character_243,Helvetica10_Character_244,Helvetica10_Character_245,Helvetica10_Character_246,Helvetica10_Character_247,Helvetica10_Character_248,Helvetica10_Character_249,Helvetica10_Character_250,Helvetica10_Character_251,Helvetica10_Character_252,Helvetica10_Character_253,Helvetica10_Character_254,Helvetica10_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontHelvetica10 = { "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1", 256, 14, Helvetica10_Character_Map, 0, 3 }; - -static const GLubyte Helvetica12_Character_000[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_001[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_002[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_003[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_004[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_005[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_006[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_007[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_008[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_009[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_010[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_011[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_012[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_013[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_014[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_015[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_016[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_017[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_018[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_019[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_020[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_021[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_022[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_023[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_024[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_025[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_026[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_027[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_028[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_029[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_030[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_031[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_032[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_033[] = { 3, 0, 0, 0, 0, 64, 0, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_034[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 0, 0, 0}; -static const GLubyte Helvetica12_Character_035[] = { 7, 0, 0, 0, 0, 80, 80, 80,252, 40,252, 40, 40, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_036[] = { 7, 0, 0, 0, 16, 56, 84, 84, 20, 56, 80, 84, 56, 16, 0, 0, 0}; -static const GLubyte Helvetica12_Character_037[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 17,128, 10, 64, 10, 64, 9,128, 4, 0, 52, 0, 74, 0, 74, 0, 49, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_038[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 70, 0, 66, 0, 69, 0, 40, 0, 24, 0, 36, 0, 36, 0, 24, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_039[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 96, 0, 0, 0}; -static const GLubyte Helvetica12_Character_040[] = { 4, 0, 16, 32, 32, 64, 64, 64, 64, 64, 64, 32, 32, 16, 0, 0, 0}; -static const GLubyte Helvetica12_Character_041[] = { 4, 0,128, 64, 64, 32, 32, 32, 32, 32, 32, 64, 64,128, 0, 0, 0}; -static const GLubyte Helvetica12_Character_042[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 32, 80, 0, 0, 0}; -static const GLubyte Helvetica12_Character_043[] = { 7, 0, 0, 0, 0, 0, 16, 16,124, 16, 16, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_044[] = { 4, 0, 0, 64, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_045[] = { 8, 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_046[] = { 3, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_047[] = { 4, 0, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 16, 16, 0, 0, 0}; -static const GLubyte Helvetica12_Character_048[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 68, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_049[] = { 7, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16,112, 16, 0, 0, 0}; -static const GLubyte Helvetica12_Character_050[] = { 7, 0, 0, 0, 0,124, 64, 64, 32, 16, 8, 4, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_051[] = { 7, 0, 0, 0, 0, 56, 68, 68, 4, 4, 24, 4, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_052[] = { 7, 0, 0, 0, 0, 8, 8,252,136, 72, 40, 40, 24, 8, 0, 0, 0}; -static const GLubyte Helvetica12_Character_053[] = { 7, 0, 0, 0, 0, 56, 68, 68, 4, 4,120, 64, 64,124, 0, 0, 0}; -static const GLubyte Helvetica12_Character_054[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68,100, 88, 64, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_055[] = { 7, 0, 0, 0, 0, 32, 32, 16, 16, 16, 8, 8, 4,124, 0, 0, 0}; -static const GLubyte Helvetica12_Character_056[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 56, 68, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_057[] = { 7, 0, 0, 0, 0, 56, 68, 4, 4, 60, 68, 68, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_058[] = { 3, 0, 0, 0, 0, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_059[] = { 3, 0, 0,128, 64, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_060[] = { 7, 0, 0, 0, 0, 0, 12, 48,192, 48, 12, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_061[] = { 7, 0, 0, 0, 0, 0, 0,124, 0,124, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_062[] = { 7, 0, 0, 0, 0, 0, 96, 24, 6, 24, 96, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_063[] = { 7, 0, 0, 0, 0, 16, 0, 16, 16, 8, 8, 68, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_064[] = { 12, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 77,128, 83, 64, 81, 32, 81, 32, 73, 32, 38,160, 48, 64, 15,128, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_065[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 20, 0, 8, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_066[] = { 8, 0, 0, 0, 0,124, 66, 66, 66,124, 66, 66, 66,124, 0, 0, 0}; -static const GLubyte Helvetica12_Character_067[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 33, 0, 30, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_068[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 66, 0, 65, 0, 65, 0, 65, 0, 65, 0, 65, 0, 66, 0,124, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_069[] = { 8, 0, 0, 0, 0,126, 64, 64, 64,126, 64, 64, 64,126, 0, 0, 0}; -static const GLubyte Helvetica12_Character_070[] = { 8, 0, 0, 0, 0, 64, 64, 64, 64,124, 64, 64, 64,126, 0, 0, 0}; -static const GLubyte Helvetica12_Character_071[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 35, 0, 65, 0, 65, 0, 71, 0, 64, 0, 64, 0, 33, 0, 30, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_072[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 65, 0,127, 0, 65, 0, 65, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_073[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_074[] = { 7, 0, 0, 0, 0, 56, 68, 68, 4, 4, 4, 4, 4, 4, 0, 0, 0}; -static const GLubyte Helvetica12_Character_075[] = { 8, 0, 0, 0, 0, 65, 66, 68, 72,112, 80, 72, 68, 66, 0, 0, 0}; -static const GLubyte Helvetica12_Character_076[] = { 7, 0, 0, 0, 0,124, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_077[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 68, 64, 68, 64, 74, 64, 74, 64, 81, 64, 81, 64, 96,192, 96,192, 64, 64, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_078[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 67, 0, 69, 0, 69, 0, 73, 0, 81, 0, 81, 0, 97, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_079[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_080[] = { 8, 0, 0, 0, 0, 64, 64, 64, 64,124, 66, 66, 66,124, 0, 0, 0}; -static const GLubyte Helvetica12_Character_081[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30,128, 33, 0, 66,128, 68,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_082[] = { 8, 0, 0, 0, 0, 66, 66, 66, 68,124, 66, 66, 66,124, 0, 0, 0}; -static const GLubyte Helvetica12_Character_083[] = { 8, 0, 0, 0, 0, 60, 66, 66, 2, 12, 48, 64, 66, 60, 0, 0, 0}; -static const GLubyte Helvetica12_Character_084[] = { 7, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16,254, 0, 0, 0}; -static const GLubyte Helvetica12_Character_085[] = { 8, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0, 0}; -static const GLubyte Helvetica12_Character_086[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 20, 0, 20, 0, 34, 0, 34, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_087[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 42,128, 42,128, 36,128, 68, 64, 68, 64, 68, 64, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_088[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 34, 0, 34, 0, 20, 0, 8, 0, 20, 0, 34, 0, 34, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_089[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 20, 0, 34, 0, 34, 0, 65, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_090[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 64, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0, 1, 0,127, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_091[] = { 3, 0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 96, 0, 0, 0}; -static const GLubyte Helvetica12_Character_092[] = { 4, 0, 0, 0, 0, 16, 16, 32, 32, 32, 64, 64,128,128, 0, 0, 0}; -static const GLubyte Helvetica12_Character_093[] = { 3, 0,192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0}; -static const GLubyte Helvetica12_Character_094[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 80, 32, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_095[] = { 7, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_096[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_097[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_098[] = { 7, 0, 0, 0, 0, 88,100, 68, 68, 68,100, 88, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_099[] = { 7, 0, 0, 0, 0, 56, 68, 64, 64, 64, 68, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_100[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 76, 52, 4, 4, 0, 0, 0}; -static const GLubyte Helvetica12_Character_101[] = { 7, 0, 0, 0, 0, 56, 68, 64,124, 68, 68, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_102[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64,224, 64, 48, 0, 0, 0}; -static const GLubyte Helvetica12_Character_103[] = { 7, 0, 56, 68, 4, 52, 76, 68, 68, 68, 76, 52, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_104[] = { 7, 0, 0, 0, 0, 68, 68, 68, 68, 68,100, 88, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_105[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_106[] = { 3, 0,128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_107[] = { 6, 0, 0, 0, 0, 68, 72, 80, 96, 96, 80, 72, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_108[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_109[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 73, 0, 73, 0, 73, 0, 73, 0,109, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_110[] = { 7, 0, 0, 0, 0, 68, 68, 68, 68, 68,100, 88, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_111[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_112[] = { 7, 0, 64, 64, 64, 88,100, 68, 68, 68,100, 88, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_113[] = { 7, 0, 4, 4, 4, 52, 76, 68, 68, 68, 76, 52, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_114[] = { 4, 0, 0, 0, 0, 64, 64, 64, 64, 64, 96, 80, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_115[] = { 6, 0, 0, 0, 0, 48, 72, 8, 48, 64, 72, 48, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_116[] = { 3, 0, 0, 0, 0, 96, 64, 64, 64, 64, 64,224, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_117[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_118[] = { 7, 0, 0, 0, 0, 16, 16, 40, 40, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_119[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 85, 0, 73, 0, 73, 0,136,128,136,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_120[] = { 6, 0, 0, 0, 0,132,132, 72, 48, 48, 72,132, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_121[] = { 7, 0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_122[] = { 6, 0, 0, 0, 0,120, 64, 32, 32, 16, 8,120, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_123[] = { 4, 0, 48, 64, 64, 64, 64, 64,128, 64, 64, 64, 64, 48, 0, 0, 0}; -static const GLubyte Helvetica12_Character_124[] = { 3, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_125[] = { 4, 0,192, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32,192, 0, 0, 0}; -static const GLubyte Helvetica12_Character_126[] = { 7, 0, 0, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_127[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_128[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_129[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_130[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_131[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_132[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_133[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_134[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_135[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_136[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_137[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_138[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_139[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_140[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_141[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_142[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_143[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_144[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_145[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_146[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_147[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_148[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_149[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_150[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_151[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_152[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_153[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_154[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_155[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_156[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_157[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_158[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_159[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 65, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_160[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_161[] = { 3, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_162[] = { 7, 0, 0, 0, 32, 56,100, 80, 80, 80, 84, 56, 8, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_163[] = { 7, 0, 0, 0, 0, 88, 36, 16, 16,120, 32, 32, 36, 24, 0, 0, 0}; -static const GLubyte Helvetica12_Character_164[] = { 7, 0, 0, 0, 0, 0,132,120, 72, 72,120,132, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_165[] = { 7, 0, 0, 0, 0, 16, 16,124, 16,124, 16, 40, 68, 68, 0, 0, 0}; -static const GLubyte Helvetica12_Character_166[] = { 3, 0, 0, 64, 64, 64, 64, 0, 0, 0, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_167[] = { 6, 0,112,136, 8, 48, 72,136,136,144, 96,128,136,112, 0, 0, 0}; -static const GLubyte Helvetica12_Character_168[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0}; -static const GLubyte Helvetica12_Character_169[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32,128, 78, 64, 81, 64, 80, 64, 81, 64, 78, 64, 32,128, 31, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_170[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 80, 16,112, 0, 0, 0}; -static const GLubyte Helvetica12_Character_171[] = { 7, 0, 0, 0, 0, 0, 20, 40, 80, 40, 20, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_172[] = { 8, 0, 0, 0, 0, 0, 0, 2, 2, 2,126, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_173[] = { 5, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_174[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32,128, 74, 64, 74, 64, 76, 64, 74, 64, 78, 64, 32,128, 31, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_175[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0}; -static const GLubyte Helvetica12_Character_176[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 96,144,144, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_177[] = { 7, 0, 0, 0, 0,124, 0, 16, 16,124, 16, 16, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_178[] = { 4, 0, 0, 0, 0, 0, 0, 0,240, 64, 32,144, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_179[] = { 4, 0, 0, 0, 0, 0, 0, 0,192, 32, 64, 32,224, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_180[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 0, 0}; -static const GLubyte Helvetica12_Character_181[] = { 7, 0, 64, 64, 64,116, 76, 68, 68, 68, 68, 68, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_182[] = { 7, 0, 40, 40, 40, 40, 40, 40,104,232,232,232,104, 60, 0, 0, 0}; -static const GLubyte Helvetica12_Character_183[] = { 3, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_184[] = { 3, 0,192, 32, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_185[] = { 4, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 96, 32, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_186[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,112, 0,112, 80,112, 0, 0, 0}; -static const GLubyte Helvetica12_Character_187[] = { 7, 0, 0, 0, 0, 0, 80, 40, 20, 40, 80, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_188[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 39,128, 21, 0, 19, 0, 73, 0, 68, 0, 68, 0,194, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_189[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 71,128, 34, 0, 17, 0, 20,128, 75, 0, 72, 0, 68, 0,194, 0, 65, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_190[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 23,128, 21, 0, 11, 0,201, 0, 36, 0, 68, 0, 34, 0,225, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_191[] = { 7, 0, 56, 68, 68, 32, 32, 16, 16, 0, 16, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_192[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 0, 0, 8, 0, 16, 0}; -static const GLubyte Helvetica12_Character_193[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 0, 0, 8, 0, 4, 0}; -static const GLubyte Helvetica12_Character_194[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 0, 0, 20, 0, 8, 0}; -static const GLubyte Helvetica12_Character_195[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 0, 0, 20, 0, 10, 0}; -static const GLubyte Helvetica12_Character_196[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 0, 0, 20, 0, 0, 0}; -static const GLubyte Helvetica12_Character_197[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 65, 0, 65, 0, 62, 0, 34, 0, 34, 0, 20, 0, 8, 0, 8, 0, 8, 0, 20, 0, 8, 0}; -static const GLubyte Helvetica12_Character_198[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 71,192, 68, 0, 68, 0, 60, 0, 39,192, 36, 0, 20, 0, 20, 0, 15,192, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_199[] = { 9, 0, 0, 24, 0, 4, 0, 4, 0, 30, 0, 33, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 33, 0, 30, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_200[] = { 8, 0, 0, 0, 0,126, 64, 64, 64,126, 64, 64, 64,126, 0, 8, 16}; -static const GLubyte Helvetica12_Character_201[] = { 8, 0, 0, 0, 0,126, 64, 64, 64,126, 64, 64, 64,126, 0, 8, 4}; -static const GLubyte Helvetica12_Character_202[] = { 8, 0, 0, 0, 0,126, 64, 64, 64,126, 64, 64, 64,126, 0, 20, 8}; -static const GLubyte Helvetica12_Character_203[] = { 8, 0, 0, 0, 0,126, 64, 64, 64,126, 64, 64, 64,126, 0, 20, 0}; -static const GLubyte Helvetica12_Character_204[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64,128}; -static const GLubyte Helvetica12_Character_205[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 32}; -static const GLubyte Helvetica12_Character_206[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,160, 64}; -static const GLubyte Helvetica12_Character_207[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,160, 0}; -static const GLubyte Helvetica12_Character_208[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 66, 0, 65, 0, 65, 0,241, 0, 65, 0, 65, 0, 66, 0,124, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_209[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 67, 0, 69, 0, 69, 0, 73, 0, 81, 0, 81, 0, 97, 0, 65, 0, 0, 0, 20, 0, 10, 0}; -static const GLubyte Helvetica12_Character_210[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 4, 0, 8, 0}; -static const GLubyte Helvetica12_Character_211[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 4, 0, 2, 0}; -static const GLubyte Helvetica12_Character_212[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 10, 0, 4, 0}; -static const GLubyte Helvetica12_Character_213[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 20, 0, 10, 0}; -static const GLubyte Helvetica12_Character_214[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 64,128, 64,128, 64,128, 64,128, 64,128, 33, 0, 30, 0, 0, 0, 18, 0, 0, 0}; -static const GLubyte Helvetica12_Character_215[] = { 7, 0, 0, 0, 0, 0, 68, 40, 16, 40, 68, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_216[] = { 10, 0, 0, 0, 0, 0, 0,128, 0, 94, 0, 33, 0, 80,128, 72,128, 68,128, 68,128, 66,128, 33, 0, 30,128, 0, 64, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_217[] = { 8, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 8, 16}; -static const GLubyte Helvetica12_Character_218[] = { 8, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 8, 4}; -static const GLubyte Helvetica12_Character_219[] = { 8, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 20, 8}; -static const GLubyte Helvetica12_Character_220[] = { 8, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 0, 36, 0}; -static const GLubyte Helvetica12_Character_221[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 8, 0, 8, 0, 20, 0, 34, 0, 34, 0, 65, 0, 65, 0, 0, 0, 8, 0, 4, 0}; -static const GLubyte Helvetica12_Character_222[] = { 8, 0, 0, 0, 0, 64, 64,124, 66, 66, 66,124, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_223[] = { 7, 0, 0, 0, 0, 88, 68, 68, 68, 88, 68, 68, 68, 56, 0, 0, 0}; -static const GLubyte Helvetica12_Character_224[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 8, 16, 0, 0}; -static const GLubyte Helvetica12_Character_225[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 16, 8, 0, 0}; -static const GLubyte Helvetica12_Character_226[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 40, 16, 0, 0}; -static const GLubyte Helvetica12_Character_227[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 40, 20, 0, 0}; -static const GLubyte Helvetica12_Character_228[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 0, 40, 0, 0, 0}; -static const GLubyte Helvetica12_Character_229[] = { 7, 0, 0, 0, 0, 58, 68, 68, 60, 4, 68, 56, 24, 36, 24, 0, 0}; -static const GLubyte Helvetica12_Character_230[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 59,128, 68, 64, 68, 0, 63,192, 4, 64, 68, 64, 59,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_231[] = { 7, 0, 48, 8, 16, 56, 68, 64, 64, 64, 68, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_232[] = { 7, 0, 0, 0, 0, 56, 68, 64,124, 68, 68, 56, 0, 16, 32, 0, 0}; -static const GLubyte Helvetica12_Character_233[] = { 7, 0, 0, 0, 0, 56, 68, 64,124, 68, 68, 56, 0, 16, 8, 0, 0}; -static const GLubyte Helvetica12_Character_234[] = { 7, 0, 0, 0, 0, 56, 68, 64,124, 68, 68, 56, 0, 40, 16, 0, 0}; -static const GLubyte Helvetica12_Character_235[] = { 7, 0, 0, 0, 0, 56, 68, 64,124, 68, 68, 56, 0, 40, 0, 0, 0}; -static const GLubyte Helvetica12_Character_236[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 0, 64,128, 0, 0}; -static const GLubyte Helvetica12_Character_237[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 0, 64, 32, 0, 0}; -static const GLubyte Helvetica12_Character_238[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 0,160, 64, 0, 0}; -static const GLubyte Helvetica12_Character_239[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 0,160, 0, 0, 0}; -static const GLubyte Helvetica12_Character_240[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 60, 4, 40, 24, 52, 0, 0}; -static const GLubyte Helvetica12_Character_241[] = { 7, 0, 0, 0, 0, 68, 68, 68, 68, 68,100, 88, 0, 40, 20, 0, 0}; -static const GLubyte Helvetica12_Character_242[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 16, 32, 0, 0}; -static const GLubyte Helvetica12_Character_243[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 16, 8, 0, 0}; -static const GLubyte Helvetica12_Character_244[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 40, 16, 0, 0}; -static const GLubyte Helvetica12_Character_245[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 40, 20, 0, 0}; -static const GLubyte Helvetica12_Character_246[] = { 7, 0, 0, 0, 0, 56, 68, 68, 68, 68, 68, 56, 0, 40, 0, 0, 0}; -static const GLubyte Helvetica12_Character_247[] = { 7, 0, 0, 0, 0, 0, 16, 0,124, 0, 16, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_248[] = { 7, 0, 0, 0, 0,184, 68,100, 84, 76, 68, 58, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica12_Character_249[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 68, 68, 0, 16, 32, 0, 0}; -static const GLubyte Helvetica12_Character_250[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 68, 68, 0, 16, 8, 0, 0}; -static const GLubyte Helvetica12_Character_251[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 68, 68, 0, 40, 16, 0, 0}; -static const GLubyte Helvetica12_Character_252[] = { 7, 0, 0, 0, 0, 52, 76, 68, 68, 68, 68, 68, 0, 40, 0, 0, 0}; -static const GLubyte Helvetica12_Character_253[] = { 7, 0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68, 0, 16, 8, 0, 0}; -static const GLubyte Helvetica12_Character_254[] = { 7, 0, 64, 64, 64, 88,100, 68, 68, 68,100, 88, 64, 64, 0, 0, 0}; -static const GLubyte Helvetica12_Character_255[] = { 7, 0, 96, 16, 16, 16, 24, 40, 40, 36, 68, 68, 0, 40, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* Helvetica12_Character_Map[] = {Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032, - Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032, - Helvetica12_Character_032,Helvetica12_Character_033,Helvetica12_Character_034,Helvetica12_Character_035,Helvetica12_Character_036,Helvetica12_Character_037,Helvetica12_Character_038,Helvetica12_Character_039,Helvetica12_Character_040,Helvetica12_Character_041,Helvetica12_Character_042,Helvetica12_Character_043,Helvetica12_Character_044,Helvetica12_Character_045,Helvetica12_Character_046,Helvetica12_Character_047, - Helvetica12_Character_048,Helvetica12_Character_049,Helvetica12_Character_050,Helvetica12_Character_051,Helvetica12_Character_052,Helvetica12_Character_053,Helvetica12_Character_054,Helvetica12_Character_055,Helvetica12_Character_056,Helvetica12_Character_057,Helvetica12_Character_058,Helvetica12_Character_059,Helvetica12_Character_060,Helvetica12_Character_061,Helvetica12_Character_062,Helvetica12_Character_063, - Helvetica12_Character_064,Helvetica12_Character_065,Helvetica12_Character_066,Helvetica12_Character_067,Helvetica12_Character_068,Helvetica12_Character_069,Helvetica12_Character_070,Helvetica12_Character_071,Helvetica12_Character_072,Helvetica12_Character_073,Helvetica12_Character_074,Helvetica12_Character_075,Helvetica12_Character_076,Helvetica12_Character_077,Helvetica12_Character_078,Helvetica12_Character_079, - Helvetica12_Character_080,Helvetica12_Character_081,Helvetica12_Character_082,Helvetica12_Character_083,Helvetica12_Character_084,Helvetica12_Character_085,Helvetica12_Character_086,Helvetica12_Character_087,Helvetica12_Character_088,Helvetica12_Character_089,Helvetica12_Character_090,Helvetica12_Character_091,Helvetica12_Character_092,Helvetica12_Character_093,Helvetica12_Character_094,Helvetica12_Character_095, - Helvetica12_Character_096,Helvetica12_Character_097,Helvetica12_Character_098,Helvetica12_Character_099,Helvetica12_Character_100,Helvetica12_Character_101,Helvetica12_Character_102,Helvetica12_Character_103,Helvetica12_Character_104,Helvetica12_Character_105,Helvetica12_Character_106,Helvetica12_Character_107,Helvetica12_Character_108,Helvetica12_Character_109,Helvetica12_Character_110,Helvetica12_Character_111, - Helvetica12_Character_112,Helvetica12_Character_113,Helvetica12_Character_114,Helvetica12_Character_115,Helvetica12_Character_116,Helvetica12_Character_117,Helvetica12_Character_118,Helvetica12_Character_119,Helvetica12_Character_120,Helvetica12_Character_121,Helvetica12_Character_122,Helvetica12_Character_123,Helvetica12_Character_124,Helvetica12_Character_125,Helvetica12_Character_126,Helvetica12_Character_032, - Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032, - Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032, - Helvetica12_Character_160,Helvetica12_Character_161,Helvetica12_Character_162,Helvetica12_Character_163,Helvetica12_Character_164,Helvetica12_Character_165,Helvetica12_Character_166,Helvetica12_Character_167,Helvetica12_Character_168,Helvetica12_Character_169,Helvetica12_Character_170,Helvetica12_Character_171,Helvetica12_Character_172,Helvetica12_Character_173,Helvetica12_Character_174,Helvetica12_Character_175, - Helvetica12_Character_176,Helvetica12_Character_177,Helvetica12_Character_178,Helvetica12_Character_179,Helvetica12_Character_180,Helvetica12_Character_181,Helvetica12_Character_182,Helvetica12_Character_183,Helvetica12_Character_184,Helvetica12_Character_185,Helvetica12_Character_186,Helvetica12_Character_187,Helvetica12_Character_188,Helvetica12_Character_189,Helvetica12_Character_190,Helvetica12_Character_191, - Helvetica12_Character_192,Helvetica12_Character_193,Helvetica12_Character_194,Helvetica12_Character_195,Helvetica12_Character_196,Helvetica12_Character_197,Helvetica12_Character_198,Helvetica12_Character_199,Helvetica12_Character_200,Helvetica12_Character_201,Helvetica12_Character_202,Helvetica12_Character_203,Helvetica12_Character_204,Helvetica12_Character_205,Helvetica12_Character_206,Helvetica12_Character_207, - Helvetica12_Character_208,Helvetica12_Character_209,Helvetica12_Character_210,Helvetica12_Character_211,Helvetica12_Character_212,Helvetica12_Character_213,Helvetica12_Character_214,Helvetica12_Character_215,Helvetica12_Character_216,Helvetica12_Character_217,Helvetica12_Character_218,Helvetica12_Character_219,Helvetica12_Character_220,Helvetica12_Character_221,Helvetica12_Character_222,Helvetica12_Character_223, - Helvetica12_Character_224,Helvetica12_Character_225,Helvetica12_Character_226,Helvetica12_Character_227,Helvetica12_Character_228,Helvetica12_Character_229,Helvetica12_Character_230,Helvetica12_Character_231,Helvetica12_Character_232,Helvetica12_Character_233,Helvetica12_Character_234,Helvetica12_Character_235,Helvetica12_Character_236,Helvetica12_Character_237,Helvetica12_Character_238,Helvetica12_Character_239, - Helvetica12_Character_240,Helvetica12_Character_241,Helvetica12_Character_242,Helvetica12_Character_243,Helvetica12_Character_244,Helvetica12_Character_245,Helvetica12_Character_246,Helvetica12_Character_247,Helvetica12_Character_248,Helvetica12_Character_249,Helvetica12_Character_250,Helvetica12_Character_251,Helvetica12_Character_252,Helvetica12_Character_253,Helvetica12_Character_254,Helvetica12_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontHelvetica12 = { "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", 256, 16, Helvetica12_Character_Map, 0, 4 }; - -static const GLubyte Helvetica18_Character_000[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 64, 16, 0, 0, 64, 16, 0, 0, 64, 16, 0, 0, 64, 16, 0, 0, 64, 16, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_001[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_002[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_003[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_004[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_005[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_006[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_007[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_008[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_009[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_010[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_011[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_012[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_013[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_014[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_015[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_016[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_017[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_018[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_019[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_020[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_021[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_022[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_023[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_024[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_025[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_026[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_027[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_028[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_029[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_030[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_031[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_032[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_033[] = { 6, 0, 0, 0, 0, 0, 48, 48, 0, 0, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_034[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,144,216,216,216, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_035[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 36, 0, 36, 0,255,128,255,128, 18, 0, 18, 0, 18, 0,127,192,127,192, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_036[] = { 10, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 31, 0, 63,128,117,192,100,192, 4,192, 7,128, 31, 0, 60, 0,116, 0,100, 0,101,128, 63,128, 31, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_037[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 60, 12,126, 6,102, 6,102, 3,126, 3, 60, 1,128, 61,128,126,192,102,192,102, 96,126, 96, 60, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_038[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 56, 63,112,115,224, 97,192, 97,224, 99, 96,119, 96, 62, 0, 30, 0, 51, 0, 51, 0, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_039[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 32, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_040[] = { 6, 0, 8, 24, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 24, 8, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_041[] = { 6, 0, 64, 96, 48, 48, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 48, 48, 96, 64, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_042[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 56, 56,124, 16, 16, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_043[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 12, 0, 12, 0,127,128,127,128, 12, 0, 12, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_044[] = { 5, 0, 0, 64, 32, 32, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_045[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_046[] = { 5, 0, 0, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_047[] = { 5, 0, 0, 0, 0, 0,192,192, 64, 64, 96, 96, 32, 32, 48, 48, 16, 16, 24, 24, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_048[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 0, 51, 0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 51, 0, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_049[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 62, 0, 62, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_050[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,128, 96, 0,112, 0, 56, 0, 28, 0, 14, 0, 7, 0, 3,128, 1,128, 97,128,127, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_051[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 0, 99,128, 97,128, 1,128, 3,128, 15, 0, 14, 0, 3, 0, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_052[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,128, 1,128, 1,128,127,192,127,192, 97,128, 49,128, 25,128, 25,128, 13,128, 7,128, 3,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_053[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0,127, 0, 99,128, 97,128, 1,128, 1,128, 99,128,127, 0,126, 0, 96, 0, 96, 0,127, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_054[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 0,113,128, 97,128, 97,128, 97,128,127, 0,110, 0, 96, 0, 96, 0, 49,128, 63,128, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_055[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 48, 0, 24, 0, 24, 0, 24, 0, 12, 0, 12, 0, 6, 0, 6, 0, 3, 0, 1,128,127,128,127,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_056[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 0,115,128, 97,128, 97,128, 51, 0, 63, 0, 51, 0, 97,128, 97,128,115,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_057[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0,127, 0, 99, 0, 1,128, 1,128, 29,128, 63,128, 97,128, 97,128, 97,128, 99,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_058[] = { 5, 0, 0, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_059[] = { 5, 0, 0, 64, 32, 32, 96, 96, 0, 0, 0, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_060[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,128, 7,128, 30, 0, 56, 0, 96, 0, 56, 0, 30, 0, 7,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_061[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 63,128, 0, 0, 0, 0, 63,128, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_062[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0,120, 0, 30, 0, 7, 0, 1,128, 7, 0, 30, 0,120, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_063[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 24, 0, 24, 0, 28, 0, 14, 0, 7, 0, 99, 0, 99, 0,127, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_064[] = { 18, 0, 0, 0, 0, 0, 0, 3,240, 0, 15,248, 0, 28, 0, 0, 56, 0, 0, 51,184, 0,103,252, 0,102,102, 0,102, 51, 0,102, 51, 0,102, 49,128, 99, 25,128, 51,185,128, 49,217,128, 24, 3, 0, 14, 7, 0, 7,254, 0, 1,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_065[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_066[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,224, 96,112, 96, 48, 96, 48, 96,112,127,224,127,192, 96,192, 96, 96, 96, 96, 96,224,127,192,127,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_067[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 0, 96, 0, 96, 0, 96, 0, 96, 0,112, 0, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_068[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_069[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,192, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_070[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_071[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,216, 31,248, 56, 56, 48, 24,112, 24, 96,248, 96,248, 96, 0, 96, 0,112, 24, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_072[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,127,240,127,240, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_073[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_074[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 0,115,128, 97,128, 97,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_075[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 56, 96,112, 96,224, 97,192, 99,128,103, 0,126, 0,124, 0,110, 0,103, 0, 99,128, 97,192, 96,224, 96,112, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_076[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_077[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,134, 97,134, 99,198, 98, 70,102,102,102,102,108, 54,108, 54,120, 30,120, 30,112, 14,112, 14, 96, 6, 96, 6, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_078[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,120, 48,120, 48,112, 48, 96, 48, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_079[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_080[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_081[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 7,216, 31,240, 56,120, 48,216,112,220, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_082[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96,192, 96,192,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_083[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31,128, 63,224,112,112, 96, 48, 0, 48, 0,112, 1,224, 15,128, 62, 0,112, 0, 96, 48,112,112, 63,224, 15,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_084[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0,127,224,127,224, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_085[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_086[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 7,128, 7,128, 12,192, 12,192, 12,192, 24, 96, 24, 96, 24, 96, 48, 48, 48, 48, 48, 48, 96, 24, 96, 24, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_087[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 12, 12, 0, 14, 28, 0, 26, 22, 0, 27, 54, 0, 27, 54, 0, 51, 51, 0, 51, 51, 0, 49, 35, 0, 49,227, 0, 97,225,128, 96,193,128, 96,193,128, 96,193,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_088[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48,112,112, 48, 96, 56,224, 24,192, 13,128, 7, 0, 7, 0, 13,128, 24,192, 56,224, 48, 96,112,112, 96, 48, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_089[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_090[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,224,127,224, 96, 0, 48, 0, 24, 0, 12, 0, 14, 0, 6, 0, 3, 0, 1,128, 0,192, 0, 96,127,224,127,224, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_091[] = { 5, 0,120,120, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,120,120, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_092[] = { 5, 0, 0, 0, 0, 0, 24, 24, 16, 16, 48, 48, 32, 32, 96, 96, 64, 64,192,192, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_093[] = { 5, 0,240,240, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,240,240, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_094[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 99, 0, 54, 0, 28, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_095[] = { 10, 0, 0,255,192,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_096[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 64, 64, 32, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_097[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_098[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111, 0, 96, 0, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_099[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96, 0, 96, 0, 96, 0, 96, 0, 49,128, 63,128, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_100[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192, 0,192, 0,192, 0,192, 0,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_101[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63,128,113,128, 96, 0, 96, 0,127,128, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_102[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 60, 28, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_103[] = { 11, 0, 0, 14, 0, 63,128, 49,128, 0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 48,192, 63,192, 30,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_104[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103, 0, 96, 0, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_105[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_106[] = { 4, 0,192,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_107[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,128, 99, 0,103, 0,102, 0,108, 0,124, 0,120, 0,108, 0,102, 0, 99, 0, 96, 0, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_108[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_109[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24,115,152,111,120,102, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_110[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_111[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_112[] = { 11, 0, 0, 96, 0, 96, 0, 96, 0, 96, 0,111, 0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_113[] = { 11, 0, 0, 0,192, 0,192, 0,192, 0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_114[] = { 6, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96,112,108,108, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_115[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,126, 0, 99, 0, 3, 0, 31, 0,126, 0, 96, 0, 99, 0, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_116[] = { 6, 0, 0, 0, 0, 0, 24, 56, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 48, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_117[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_118[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 30, 0, 18, 0, 51, 0, 51, 0, 51, 0, 97,128, 97,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_119[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,192, 12,192, 28,224, 20,160, 52,176, 51, 48, 51, 48, 99, 24, 99, 24, 99, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_120[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,128,115,128, 51, 0, 30, 0, 12, 0, 12, 0, 30, 0, 51, 0,115,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_121[] = { 10, 0, 0, 56, 0, 56, 0, 12, 0, 12, 0, 12, 0, 12, 0, 30, 0, 18, 0, 51, 0, 51, 0, 51, 0, 97,128, 97,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_122[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0,127, 0, 96, 0, 48, 0, 24, 0, 12, 0, 6, 0, 3, 0,127, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_123[] = { 6, 0, 12, 24, 48, 48, 48, 48, 48, 48, 96,192, 96, 48, 48, 48, 48, 48, 24, 12, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_124[] = { 4, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_125[] = { 6, 0,192, 96, 48, 48, 48, 48, 48, 48, 24, 12, 24, 48, 48, 48, 48, 48, 96,192, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_126[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 0, 63, 0, 25,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_127[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_128[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_129[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_130[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_131[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_132[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_133[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_134[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_135[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_136[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_137[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_138[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_139[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_140[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_141[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_142[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_143[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_144[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_145[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_146[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_147[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_148[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_149[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_150[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_151[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_152[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_153[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_154[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_155[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_156[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_157[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_158[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_159[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 85, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_160[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_161[] = { 6, 0, 48, 48, 48, 48, 48, 48, 48, 48, 16, 16, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_162[] = { 10, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 31, 0, 63,128, 53,128,100, 0,100, 0,100, 0,100, 0, 53,128, 63,128, 31, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_163[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,223, 0,255,128, 96,128, 48, 0, 24, 0, 24, 0,126, 0, 48, 0, 96, 0, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_164[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,128,127,128, 51, 0, 51, 0, 51, 0,127,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_165[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 12, 0, 12, 0,127,128, 12, 0,127,128, 30, 0, 51, 0, 51, 0, 51, 0, 97,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_166[] = { 4, 0, 0, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_167[] = { 10, 0, 0, 30, 0, 63, 0, 97,128, 97,128, 3,128, 7, 0, 31, 0, 57,128,113,128, 97,128, 99,128, 55, 0, 62, 0,120, 0, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_168[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,216, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_169[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 24, 48, 32, 8, 35,136, 68, 68, 72, 4, 72, 4, 72, 4, 68, 68, 35,136, 32, 8, 24, 48, 7,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_170[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 52,108, 36, 28,100, 56, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_171[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 27, 0, 54, 0,108, 0,108, 0, 54, 0, 27, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_172[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0,192, 0,192,127,192,127,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_173[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_174[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 24, 48, 32, 8, 36, 40, 68, 68, 68,132, 71,196, 68, 36, 68, 36, 39,200, 32, 8, 24, 48, 7,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_175[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_176[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,108, 68,108, 56, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_177[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,128, 0, 0, 12, 0, 12, 0, 12, 0,127,128,127,128, 12, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_178[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,248, 96, 48, 24,152,248,112, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_179[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,248,152, 48, 48,152,248,112, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_180[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 96, 48, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_181[] = { 10, 0, 0, 96, 0, 96, 0, 96, 0, 96, 0,109,128,127,128,115,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_182[] = { 10, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 25, 0, 57, 0,121, 0,121, 0,121, 0,121, 0, 57, 0, 31,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_183[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_184[] = { 5, 0,240,216, 24,112, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_185[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48,112,112, 48, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_186[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 56,108, 68, 68,108, 56, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_187[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0,108, 0, 54, 0, 27, 0, 27, 0, 54, 0,108, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_188[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 12,252, 6,216, 6,120, 51, 56, 49, 24, 49,136, 48,192, 48,192,112, 96,112, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_189[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,124, 24,124, 12, 48, 6, 24, 6, 12, 51, 76, 49,124, 49,184, 48,192, 48,192,112, 96,112, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_190[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 12,252, 6,216, 6,120,115, 56,249, 24,153,136, 48,192, 48,192,152, 96,248, 48,112, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_191[] = { 10, 0, 0, 62, 0,127, 0, 99, 0, 99, 0,112, 0, 56, 0, 28, 0, 12, 0, 12, 0, 12, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_192[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 6, 0, 12, 0, 24, 0}; -static const GLubyte Helvetica18_Character_193[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 6, 0, 3, 0, 1,128}; -static const GLubyte Helvetica18_Character_194[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 25,128, 15, 0, 6, 0}; -static const GLubyte Helvetica18_Character_195[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 19, 0, 22,128, 12,128}; -static const GLubyte Helvetica18_Character_196[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 0, 0, 25,128, 25,128, 0, 0}; -static const GLubyte Helvetica18_Character_197[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15, 0, 15, 0, 6, 0, 6, 0, 15, 0, 25,128, 25,128, 15, 0}; -static const GLubyte Helvetica18_Character_198[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,255,128, 96,255,128, 48,192, 0, 48,192, 0, 63,192, 0, 31,192, 0, 24,255, 0, 24,255, 0, 12,192, 0, 12,192, 0, 6,192, 0, 6,192, 0, 3,255,128, 3,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_199[] = { 14, 0, 0, 15, 0, 13,128, 1,128, 7, 0, 7,192, 31,240, 56, 56, 48, 24,112, 0, 96, 0, 96, 0, 96, 0, 96, 0,112, 0, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_200[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,192, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 6, 0, 12, 0, 24, 0}; -static const GLubyte Helvetica18_Character_201[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,192, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 6, 0, 3, 0, 1,128}; -static const GLubyte Helvetica18_Character_202[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,192, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 25,128, 15, 0, 6, 0}; -static const GLubyte Helvetica18_Character_203[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,192, 96, 0, 96, 0, 96, 0, 96, 0,127,128,127,128, 96, 0, 96, 0, 96, 0, 96, 0,127,192,127,192, 0, 0, 25,128, 25,128, 0, 0}; -static const GLubyte Helvetica18_Character_204[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 96,192}; -static const GLubyte Helvetica18_Character_205[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 24, 12}; -static const GLubyte Helvetica18_Character_206[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0,204,120, 48}; -static const GLubyte Helvetica18_Character_207[] = { 6, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0,204,204, 0}; -static const GLubyte Helvetica18_Character_208[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48,252, 48,252, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_209[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,108, 48,120, 48,112, 48,112, 48, 0, 0, 9,128, 11, 64, 6, 64}; -static const GLubyte Helvetica18_Character_210[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 1,128, 3, 0, 6, 0}; -static const GLubyte Helvetica18_Character_211[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 1,128, 0,192, 0, 96}; -static const GLubyte Helvetica18_Character_212[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 6, 96, 3,192, 1,128}; -static const GLubyte Helvetica18_Character_213[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 4,192, 5,160, 3, 32}; -static const GLubyte Helvetica18_Character_214[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240, 7,192, 0, 0, 6,192, 6,192, 0, 0}; -static const GLubyte Helvetica18_Character_215[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,192, 97,128, 51, 0, 30, 0, 12, 0, 30, 0, 51, 0, 97,128,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_216[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199,192,255,240,120, 56, 56, 24,108, 28,110, 12,103, 12, 99,140, 97,204,112,220, 48,120, 56, 56, 31,252, 7,204, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_217[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 3, 0, 6, 0, 12, 0}; -static const GLubyte Helvetica18_Character_218[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 6, 0, 3, 0, 1,128}; -static const GLubyte Helvetica18_Character_219[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 12,192, 7,128, 3, 0}; -static const GLubyte Helvetica18_Character_220[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 0, 0, 12,192, 12,192, 0, 0}; -static const GLubyte Helvetica18_Character_221[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24, 0, 0, 3, 0, 1,128, 0,192}; -static const GLubyte Helvetica18_Character_222[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 96, 0, 96, 0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_223[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0,111, 0, 99, 0, 99, 0, 99, 0, 99, 0,110, 0,110, 0, 99, 0, 99, 0, 99, 0, 99, 0, 62, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_224[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 12, 0, 24, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_225[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 24, 0, 12, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_226[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 51, 0, 30, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_227[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 38, 0, 45, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_228[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 0, 0, 54, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_229[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0,119, 0, 99, 0, 99, 0,115, 0, 63, 0, 7, 0, 99, 0,119, 0, 62, 0, 28, 0, 54, 0, 54, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_230[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,240,119,252, 99,140, 99, 0,115, 0, 63,252, 7, 12, 99, 12,119,248, 62,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_231[] = { 10, 0, 0, 60, 0, 54, 0, 6, 0, 28, 0, 31, 0, 63,128, 49,128, 96, 0, 96, 0, 96, 0, 96, 0, 49,128, 63,128, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_232[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63,128,113,128, 96, 0, 96, 0,127,128, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 12, 0, 24, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_233[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63,128,113,128, 96, 0, 96, 0,127,128, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_234[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63,128,113,128, 96, 0, 96, 0,127,128, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 51, 0, 30, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_235[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63,128,113,128, 96, 0, 96, 0,127,128, 97,128, 97,128, 63, 0, 30, 0, 0, 0, 27, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_236[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 48, 96,192, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_237[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0,192, 96, 48, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_238[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0,144,240, 96, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_239[] = { 4, 0, 0, 0, 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0,216,216, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_240[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 38, 0, 28, 0, 27, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_241[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103, 0, 0, 0, 38, 0, 45, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_242[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 6, 0, 12, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_243[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_244[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 25,128, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_245[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 19, 0, 22,128, 12,128, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_246[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31, 0, 0, 0, 27, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_247[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0,127,128,127,128, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_248[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206, 0,127,128, 49,128,120,192,108,192,102,192, 99,192, 49,128, 63,192, 14, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_249[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 6, 0, 12, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_250[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_251[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 51, 0, 30, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_252[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 0, 0, 51, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_253[] = { 10, 0, 0, 56, 0, 56, 0, 12, 0, 12, 0, 12, 0, 12, 0, 30, 0, 18, 0, 51, 0, 51, 0, 51, 0, 97,128, 97,128, 97,128, 0, 0, 12, 0, 6, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_254[] = { 11, 0, 0, 96, 0, 96, 0, 96, 0, 96, 0,111, 0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111, 0, 96, 0, 96, 0, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte Helvetica18_Character_255[] = { 10, 0, 0, 56, 0, 56, 0, 12, 0, 12, 0, 12, 0, 12, 0, 30, 0, 18, 0, 51, 0, 51, 0, 51, 0, 97,128, 97,128, 97,128, 0, 0, 51, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* Helvetica18_Character_Map[] = {Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032, - Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032, - Helvetica18_Character_032,Helvetica18_Character_033,Helvetica18_Character_034,Helvetica18_Character_035,Helvetica18_Character_036,Helvetica18_Character_037,Helvetica18_Character_038,Helvetica18_Character_039,Helvetica18_Character_040,Helvetica18_Character_041,Helvetica18_Character_042,Helvetica18_Character_043,Helvetica18_Character_044,Helvetica18_Character_045,Helvetica18_Character_046,Helvetica18_Character_047, - Helvetica18_Character_048,Helvetica18_Character_049,Helvetica18_Character_050,Helvetica18_Character_051,Helvetica18_Character_052,Helvetica18_Character_053,Helvetica18_Character_054,Helvetica18_Character_055,Helvetica18_Character_056,Helvetica18_Character_057,Helvetica18_Character_058,Helvetica18_Character_059,Helvetica18_Character_060,Helvetica18_Character_061,Helvetica18_Character_062,Helvetica18_Character_063, - Helvetica18_Character_064,Helvetica18_Character_065,Helvetica18_Character_066,Helvetica18_Character_067,Helvetica18_Character_068,Helvetica18_Character_069,Helvetica18_Character_070,Helvetica18_Character_071,Helvetica18_Character_072,Helvetica18_Character_073,Helvetica18_Character_074,Helvetica18_Character_075,Helvetica18_Character_076,Helvetica18_Character_077,Helvetica18_Character_078,Helvetica18_Character_079, - Helvetica18_Character_080,Helvetica18_Character_081,Helvetica18_Character_082,Helvetica18_Character_083,Helvetica18_Character_084,Helvetica18_Character_085,Helvetica18_Character_086,Helvetica18_Character_087,Helvetica18_Character_088,Helvetica18_Character_089,Helvetica18_Character_090,Helvetica18_Character_091,Helvetica18_Character_092,Helvetica18_Character_093,Helvetica18_Character_094,Helvetica18_Character_095, - Helvetica18_Character_096,Helvetica18_Character_097,Helvetica18_Character_098,Helvetica18_Character_099,Helvetica18_Character_100,Helvetica18_Character_101,Helvetica18_Character_102,Helvetica18_Character_103,Helvetica18_Character_104,Helvetica18_Character_105,Helvetica18_Character_106,Helvetica18_Character_107,Helvetica18_Character_108,Helvetica18_Character_109,Helvetica18_Character_110,Helvetica18_Character_111, - Helvetica18_Character_112,Helvetica18_Character_113,Helvetica18_Character_114,Helvetica18_Character_115,Helvetica18_Character_116,Helvetica18_Character_117,Helvetica18_Character_118,Helvetica18_Character_119,Helvetica18_Character_120,Helvetica18_Character_121,Helvetica18_Character_122,Helvetica18_Character_123,Helvetica18_Character_124,Helvetica18_Character_125,Helvetica18_Character_126,Helvetica18_Character_032, - Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032, - Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032, - Helvetica18_Character_160,Helvetica18_Character_161,Helvetica18_Character_162,Helvetica18_Character_163,Helvetica18_Character_164,Helvetica18_Character_165,Helvetica18_Character_166,Helvetica18_Character_167,Helvetica18_Character_168,Helvetica18_Character_169,Helvetica18_Character_170,Helvetica18_Character_171,Helvetica18_Character_172,Helvetica18_Character_173,Helvetica18_Character_174,Helvetica18_Character_175, - Helvetica18_Character_176,Helvetica18_Character_177,Helvetica18_Character_178,Helvetica18_Character_179,Helvetica18_Character_180,Helvetica18_Character_181,Helvetica18_Character_182,Helvetica18_Character_183,Helvetica18_Character_184,Helvetica18_Character_185,Helvetica18_Character_186,Helvetica18_Character_187,Helvetica18_Character_188,Helvetica18_Character_189,Helvetica18_Character_190,Helvetica18_Character_191, - Helvetica18_Character_192,Helvetica18_Character_193,Helvetica18_Character_194,Helvetica18_Character_195,Helvetica18_Character_196,Helvetica18_Character_197,Helvetica18_Character_198,Helvetica18_Character_199,Helvetica18_Character_200,Helvetica18_Character_201,Helvetica18_Character_202,Helvetica18_Character_203,Helvetica18_Character_204,Helvetica18_Character_205,Helvetica18_Character_206,Helvetica18_Character_207, - Helvetica18_Character_208,Helvetica18_Character_209,Helvetica18_Character_210,Helvetica18_Character_211,Helvetica18_Character_212,Helvetica18_Character_213,Helvetica18_Character_214,Helvetica18_Character_215,Helvetica18_Character_216,Helvetica18_Character_217,Helvetica18_Character_218,Helvetica18_Character_219,Helvetica18_Character_220,Helvetica18_Character_221,Helvetica18_Character_222,Helvetica18_Character_223, - Helvetica18_Character_224,Helvetica18_Character_225,Helvetica18_Character_226,Helvetica18_Character_227,Helvetica18_Character_228,Helvetica18_Character_229,Helvetica18_Character_230,Helvetica18_Character_231,Helvetica18_Character_232,Helvetica18_Character_233,Helvetica18_Character_234,Helvetica18_Character_235,Helvetica18_Character_236,Helvetica18_Character_237,Helvetica18_Character_238,Helvetica18_Character_239, - Helvetica18_Character_240,Helvetica18_Character_241,Helvetica18_Character_242,Helvetica18_Character_243,Helvetica18_Character_244,Helvetica18_Character_245,Helvetica18_Character_246,Helvetica18_Character_247,Helvetica18_Character_248,Helvetica18_Character_249,Helvetica18_Character_250,Helvetica18_Character_251,Helvetica18_Character_252,Helvetica18_Character_253,Helvetica18_Character_254,Helvetica18_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontHelvetica18 = { "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1", 256, 23, Helvetica18_Character_Map, 0, 5 }; - -static const GLubyte TimesRoman10_Character_000[] = { 8, 0, 0, 0, 0,170, 0,130, 0,130, 0,170, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_001[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_002[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_003[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_004[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_005[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_006[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_007[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_008[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_009[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_010[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_011[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_012[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_013[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_014[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_015[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_016[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_017[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_018[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_019[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_020[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_021[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_022[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_023[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_024[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_025[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_026[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_027[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_028[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_029[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_030[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_031[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_032[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_033[] = { 3, 0, 0, 0, 0, 64, 0, 64, 64, 64, 64, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_034[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_035[] = { 5, 0, 0, 0, 0, 80, 80,248, 80,248, 80, 80, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_036[] = { 5, 0, 0, 0, 32,224,144, 16, 96,128,144,112, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_037[] = { 8, 0, 0, 0, 0, 68, 42, 42, 86,168,164,126, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_038[] = { 8, 0, 0, 0, 0,118,141,152,116,110, 80, 48, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_039[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,192, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_040[] = { 4, 0, 0, 32, 64, 64,128,128,128, 64, 64, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_041[] = { 4, 0, 0,128, 64, 64, 32, 32, 32, 64, 64,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_042[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,160, 64,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_043[] = { 6, 0, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_044[] = { 3, 0, 0, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_045[] = { 7, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_046[] = { 3, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_047[] = { 3, 0, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_048[] = { 5, 0, 0, 0, 0, 96,144,144,144,144,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_049[] = { 5, 0, 0, 0, 0,112, 32, 32, 32, 32, 96, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_050[] = { 5, 0, 0, 0, 0,240, 64, 32, 32, 16,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_051[] = { 5, 0, 0, 0, 0,224, 16, 16, 96, 16,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_052[] = { 5, 0, 0, 0, 0, 16, 16,248,144, 80, 48, 16, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_053[] = { 5, 0, 0, 0, 0,224,144, 16, 16,224, 64,112, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_054[] = { 5, 0, 0, 0, 0, 96,144,144,144,224, 64, 48, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_055[] = { 5, 0, 0, 0, 0, 64, 64, 64, 32, 32,144,240, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_056[] = { 5, 0, 0, 0, 0, 96,144,144, 96,144,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_057[] = { 5, 0, 0, 0, 0,192, 32,112,144,144,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_058[] = { 3, 0, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_059[] = { 3, 0, 0, 64, 64, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_060[] = { 5, 0, 0, 0, 0, 16, 32, 64, 32, 16, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_061[] = { 6, 0, 0, 0, 0, 0,248, 0,248, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_062[] = { 5, 0, 0, 0, 0,128, 64, 32, 64,128, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_063[] = { 4, 0, 0, 0, 0, 64, 0, 64, 64, 32,160,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_064[] = { 9, 0, 0, 0, 0, 62, 0, 64, 0,146, 0,173, 0,165, 0,165, 0,157, 0, 66, 0, 60, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_065[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_066[] = { 6, 0, 0, 0, 0,240, 72, 72,112, 72, 72,240, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_067[] = { 7, 0, 0, 0, 0,120,196,128,128,128,196,124, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_068[] = { 7, 0, 0, 0, 0,248, 76, 68, 68, 68, 76,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_069[] = { 6, 0, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_070[] = { 6, 0, 0, 0, 0,224, 64, 64,112, 64, 72,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_071[] = { 7, 0, 0, 0, 0,120,196,132,156,128,196,124, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_072[] = { 8, 0, 0, 0, 0,238, 68, 68,124, 68, 68,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_073[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_074[] = { 4, 0, 0, 0, 0,192,160, 32, 32, 32, 32,112, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_075[] = { 7, 0, 0, 0, 0,236, 72, 80, 96, 80, 72,236, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_076[] = { 6, 0, 0, 0, 0,248, 72, 64, 64, 64, 64,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_077[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0,235,128, 73, 0, 85, 0, 85, 0, 99, 0, 99, 0,227,128, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_078[] = { 8, 0, 0, 0, 0,228, 76, 76, 84, 84,100,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_079[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_080[] = { 6, 0, 0, 0, 0,224, 64, 64,112, 72, 72,240, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_081[] = { 7, 0, 0, 12, 24,112,204,132,132,132,204,120, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_082[] = { 7, 0, 0, 0, 0,236, 72, 80,112, 72, 72,240, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_083[] = { 5, 0, 0, 0, 0,224,144, 16, 96,192,144,112, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_084[] = { 6, 0, 0, 0, 0,112, 32, 32, 32, 32,168,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_085[] = { 8, 0, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_086[] = { 8, 0, 0, 0, 0, 16, 16, 40, 40,108, 68,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_087[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 85, 0, 85, 0,201,128,136,128,221,192, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_088[] = { 8, 0, 0, 0, 0,238, 68, 40, 16, 40, 68,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_089[] = { 8, 0, 0, 0, 0, 56, 16, 16, 40, 40, 68,238, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_090[] = { 6, 0, 0, 0, 0,248,136, 64, 32, 16,136,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_091[] = { 3, 0, 0,192,128,128,128,128,128,128,128,192, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_092[] = { 3, 0, 0, 0, 0, 32, 32, 64, 64, 64,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_093[] = { 3, 0, 0,192, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_094[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_095[] = { 5, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_096[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 0, 0}; -static const GLubyte TimesRoman10_Character_097[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_098[] = { 5, 0, 0, 0, 0,224,144,144,144,224,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_099[] = { 4, 0, 0, 0, 0, 96,128,128,128, 96, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_100[] = { 5, 0, 0, 0, 0,104,144,144,144,112, 16, 48, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_101[] = { 4, 0, 0, 0, 0, 96,128,192,160, 96, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_102[] = { 4, 0, 0, 0, 0,224, 64, 64, 64,224, 64, 48, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_103[] = { 5, 0, 0,224,144, 96, 64,160,160,112, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_104[] = { 5, 0, 0, 0, 0,216,144,144,144,224,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_105[] = { 3, 0, 0, 0, 0, 64, 64, 64, 64,192, 0, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_106[] = { 3, 0, 0,128, 64, 64, 64, 64, 64,192, 0, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_107[] = { 5, 0, 0, 0, 0,152,144,224,160,144,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_108[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,192, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_109[] = { 8, 0, 0, 0, 0,219,146,146,146,236, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_110[] = { 5, 0, 0, 0, 0,216,144,144,144,224, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_111[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_112[] = { 5, 0, 0,192,128,224,144,144,144,224, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_113[] = { 5, 0, 0, 56, 16,112,144,144,144,112, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_114[] = { 4, 0, 0, 0, 0,224, 64, 64, 96,160, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_115[] = { 4, 0, 0, 0, 0,224, 32, 96,128,224, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_116[] = { 4, 0, 0, 0, 0, 48, 64, 64, 64,224, 64, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_117[] = { 5, 0, 0, 0, 0,104,144,144,144,144, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_118[] = { 5, 0, 0, 0, 0, 32, 96, 80,144,216, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_119[] = { 8, 0, 0, 0, 0, 40,108, 84,146,219, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_120[] = { 6, 0, 0, 0, 0,216, 80, 32, 80,216, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_121[] = { 5, 0, 0,128,128, 64, 96,160,144,184, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_122[] = { 5, 0, 0, 0, 0,240,144, 64, 32,240, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_123[] = { 4, 0, 0, 32, 64, 64, 64,128, 64, 64, 64, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_124[] = { 2, 0, 0,128,128,128,128,128,128,128,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_125[] = { 4, 0, 0,128, 64, 64, 64, 32, 64, 64, 64,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_126[] = { 7, 0, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_127[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_128[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_129[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_130[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_131[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_132[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_133[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_134[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_135[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_136[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_137[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_138[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_139[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_140[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_141[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_142[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_143[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_144[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_145[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_146[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_147[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_148[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_149[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_150[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_151[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_152[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_153[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_154[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_155[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_156[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_157[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_158[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_159[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0,170, 0, 0, 0,130, 0, 0, 0,130, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_160[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_161[] = { 3, 0, 0, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_162[] = { 5, 0, 0, 0,128,224,144,128,144,112, 16, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_163[] = { 5, 0, 0, 0, 0,240,200, 64,224, 64, 80, 48, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_164[] = { 5, 0, 0, 0, 0, 0,136,112, 80, 80,112,136, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_165[] = { 5, 0, 0, 0, 0,112, 32,248, 32,216, 80,136, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_166[] = { 2, 0, 0, 0, 0,128,128,128, 0,128,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_167[] = { 5, 0, 0, 0,224,144, 32, 80,144,160, 64,144,112, 0, 0}; -static const GLubyte TimesRoman10_Character_168[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_169[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 77, 0, 81, 0, 77, 0, 34, 0, 28, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_170[] = { 4, 0, 0, 0, 0, 0, 0,224, 0,160, 32,192, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_171[] = { 5, 0, 0, 0, 0, 0, 80,160,160, 80, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_172[] = { 7, 0, 0, 0, 0, 0, 4, 4,124, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_173[] = { 4, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_174[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 85, 0, 89, 0, 93, 0, 34, 0, 28, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_175[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_176[] = { 4, 0, 0, 0, 0, 0, 0, 0, 96,144,144, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_177[] = { 6, 0, 0, 0, 0,248, 0, 32, 32,248, 32, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_178[] = { 3, 0, 0, 0, 0, 0, 0, 0,224, 64,160, 96, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_179[] = { 3, 0, 0, 0, 0, 0, 0, 0,192, 32, 64,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_180[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_181[] = { 5, 0, 0,128,128,232,144,144,144,144, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_182[] = { 6, 0, 0, 40, 40, 40, 40,104,232,232,232,124, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_183[] = { 2, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_184[] = { 4, 0,192, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_185[] = { 3, 0, 0, 0, 0, 0, 0, 0,224, 64,192, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_186[] = { 4, 0, 0, 0, 0, 0, 0,224, 0, 64,160, 64, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_187[] = { 5, 0, 0, 0, 0, 0,160, 80, 80,160, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_188[] = { 8, 0, 0, 0, 0, 68, 62, 44,244, 72,200, 68, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_189[] = { 8, 0, 0, 0, 0, 78, 36, 42,246, 72,200, 68, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_190[] = { 8, 0, 0, 0, 0, 68, 62, 44,212, 40, 72,228, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_191[] = { 4, 0, 0,224,160,128, 64, 64, 0, 64, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_192[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 16, 32}; -static const GLubyte TimesRoman10_Character_193[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 16, 8}; -static const GLubyte TimesRoman10_Character_194[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 40, 16}; -static const GLubyte TimesRoman10_Character_195[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 40, 20}; -static const GLubyte TimesRoman10_Character_196[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 40, 0}; -static const GLubyte TimesRoman10_Character_197[] = { 8, 0, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 16, 40, 16}; -static const GLubyte TimesRoman10_Character_198[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 73, 0,120, 0, 46, 0, 40, 0, 57, 0, 31, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_199[] = { 7, 0, 96, 16, 32,120,196,128,128,128,196,124, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_200[] = { 6, 0, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 32, 64}; -static const GLubyte TimesRoman10_Character_201[] = { 6, 0, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 32, 16}; -static const GLubyte TimesRoman10_Character_202[] = { 6, 0, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 80, 32}; -static const GLubyte TimesRoman10_Character_203[] = { 6, 0, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 80, 0}; -static const GLubyte TimesRoman10_Character_204[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0, 64,128}; -static const GLubyte TimesRoman10_Character_205[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0, 64, 32}; -static const GLubyte TimesRoman10_Character_206[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0,160, 64}; -static const GLubyte TimesRoman10_Character_207[] = { 4, 0, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0,160, 0}; -static const GLubyte TimesRoman10_Character_208[] = { 7, 0, 0, 0, 0,248, 76, 68,228, 68, 76,248, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_209[] = { 8, 0, 0, 0, 0,228, 76, 76, 84, 84,100,238, 0, 80, 40}; -static const GLubyte TimesRoman10_Character_210[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 32, 64}; -static const GLubyte TimesRoman10_Character_211[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 16, 8}; -static const GLubyte TimesRoman10_Character_212[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 80, 32}; -static const GLubyte TimesRoman10_Character_213[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 80, 40}; -static const GLubyte TimesRoman10_Character_214[] = { 7, 0, 0, 0, 0,120,204,132,132,132,204,120, 0, 80, 0}; -static const GLubyte TimesRoman10_Character_215[] = { 6, 0, 0, 0, 0,136, 80, 32, 80,136, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_216[] = { 8, 0, 0, 0,128,124,102, 82, 82, 74,102, 62, 1, 0, 0}; -static const GLubyte TimesRoman10_Character_217[] = { 8, 0, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 16, 32}; -static const GLubyte TimesRoman10_Character_218[] = { 8, 0, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 16, 8}; -static const GLubyte TimesRoman10_Character_219[] = { 8, 0, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 40, 16}; -static const GLubyte TimesRoman10_Character_220[] = { 8, 0, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 40, 0}; -static const GLubyte TimesRoman10_Character_221[] = { 8, 0, 0, 0, 0, 56, 16, 16, 40, 40, 68,238, 0, 16, 8}; -static const GLubyte TimesRoman10_Character_222[] = { 6, 0, 0, 0, 0,224, 64,112, 72,112, 64,224, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_223[] = { 5, 0, 0, 0, 0,224, 80, 80, 96, 80, 80, 32, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_224[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0, 64,128, 0, 0}; -static const GLubyte TimesRoman10_Character_225[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0, 64, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_226[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0,160, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_227[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0,160, 80, 0, 0}; -static const GLubyte TimesRoman10_Character_228[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 0,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_229[] = { 4, 0, 0, 0, 0,224,160, 96, 32,192, 64,160, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_230[] = { 6, 0, 0, 0, 0,216,160,112, 40,216, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_231[] = { 4, 0,192, 32, 64, 96,128,128,128, 96, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_232[] = { 4, 0, 0, 0, 0, 96,128,192,160, 96, 0, 64,128, 0, 0}; -static const GLubyte TimesRoman10_Character_233[] = { 4, 0, 0, 0, 0, 96,128,192,160, 96, 0, 64, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_234[] = { 4, 0, 0, 0, 0, 96,128,192,160, 96, 0,160, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_235[] = { 4, 0, 0, 0, 0, 96,128,192,160, 96, 0,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_236[] = { 4, 0, 0, 0, 0,224, 64, 64, 64,192, 0, 64,128, 0, 0}; -static const GLubyte TimesRoman10_Character_237[] = { 4, 0, 0, 0, 0,224, 64, 64, 64,192, 0, 64, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_238[] = { 4, 0, 0, 0, 0,224, 64, 64, 64,192, 0,160, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_239[] = { 4, 0, 0, 0, 0,224, 64, 64, 64,192, 0,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_240[] = { 5, 0, 0, 0, 0, 96,144,144,144,112,160,112, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_241[] = { 5, 0, 0, 0, 0,216,144,144,144,224, 0,160, 80, 0, 0}; -static const GLubyte TimesRoman10_Character_242[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0, 32, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_243[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0, 64, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_244[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0,160, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_245[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0,160, 80, 0, 0}; -static const GLubyte TimesRoman10_Character_246[] = { 5, 0, 0, 0, 0, 96,144,144,144, 96, 0,160, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_247[] = { 6, 0, 0, 0, 0, 32, 0,248, 0, 32, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_248[] = { 5, 0, 0, 0, 0,224,144,144,144,112, 8, 0, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_249[] = { 5, 0, 0, 0, 0,104,144,144,144,144, 0, 32, 64, 0, 0}; -static const GLubyte TimesRoman10_Character_250[] = { 5, 0, 0, 0, 0,104,144,144,144,144, 0, 64, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_251[] = { 5, 0, 0, 0, 0,104,144,144,144,144, 0, 80, 32, 0, 0}; -static const GLubyte TimesRoman10_Character_252[] = { 5, 0, 0, 0, 0,104,144,144,144,144, 0, 80, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_253[] = { 5, 0, 0,128,192, 64, 96,160,144,184, 0, 32, 16, 0, 0}; -static const GLubyte TimesRoman10_Character_254[] = { 5, 0, 0,192,128,224,144,144,144,224,128,128, 0, 0, 0}; -static const GLubyte TimesRoman10_Character_255[] = { 5, 0, 0,128,192, 64, 96,160,144,184, 0,160, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* TimesRoman10_Character_Map[] = {TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032, - TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032, - TimesRoman10_Character_032,TimesRoman10_Character_033,TimesRoman10_Character_034,TimesRoman10_Character_035,TimesRoman10_Character_036,TimesRoman10_Character_037,TimesRoman10_Character_038,TimesRoman10_Character_039,TimesRoman10_Character_040,TimesRoman10_Character_041,TimesRoman10_Character_042,TimesRoman10_Character_043,TimesRoman10_Character_044,TimesRoman10_Character_045,TimesRoman10_Character_046,TimesRoman10_Character_047, - TimesRoman10_Character_048,TimesRoman10_Character_049,TimesRoman10_Character_050,TimesRoman10_Character_051,TimesRoman10_Character_052,TimesRoman10_Character_053,TimesRoman10_Character_054,TimesRoman10_Character_055,TimesRoman10_Character_056,TimesRoman10_Character_057,TimesRoman10_Character_058,TimesRoman10_Character_059,TimesRoman10_Character_060,TimesRoman10_Character_061,TimesRoman10_Character_062,TimesRoman10_Character_063, - TimesRoman10_Character_064,TimesRoman10_Character_065,TimesRoman10_Character_066,TimesRoman10_Character_067,TimesRoman10_Character_068,TimesRoman10_Character_069,TimesRoman10_Character_070,TimesRoman10_Character_071,TimesRoman10_Character_072,TimesRoman10_Character_073,TimesRoman10_Character_074,TimesRoman10_Character_075,TimesRoman10_Character_076,TimesRoman10_Character_077,TimesRoman10_Character_078,TimesRoman10_Character_079, - TimesRoman10_Character_080,TimesRoman10_Character_081,TimesRoman10_Character_082,TimesRoman10_Character_083,TimesRoman10_Character_084,TimesRoman10_Character_085,TimesRoman10_Character_086,TimesRoman10_Character_087,TimesRoman10_Character_088,TimesRoman10_Character_089,TimesRoman10_Character_090,TimesRoman10_Character_091,TimesRoman10_Character_092,TimesRoman10_Character_093,TimesRoman10_Character_094,TimesRoman10_Character_095, - TimesRoman10_Character_096,TimesRoman10_Character_097,TimesRoman10_Character_098,TimesRoman10_Character_099,TimesRoman10_Character_100,TimesRoman10_Character_101,TimesRoman10_Character_102,TimesRoman10_Character_103,TimesRoman10_Character_104,TimesRoman10_Character_105,TimesRoman10_Character_106,TimesRoman10_Character_107,TimesRoman10_Character_108,TimesRoman10_Character_109,TimesRoman10_Character_110,TimesRoman10_Character_111, - TimesRoman10_Character_112,TimesRoman10_Character_113,TimesRoman10_Character_114,TimesRoman10_Character_115,TimesRoman10_Character_116,TimesRoman10_Character_117,TimesRoman10_Character_118,TimesRoman10_Character_119,TimesRoman10_Character_120,TimesRoman10_Character_121,TimesRoman10_Character_122,TimesRoman10_Character_123,TimesRoman10_Character_124,TimesRoman10_Character_125,TimesRoman10_Character_126,TimesRoman10_Character_032, - TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032, - TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032, - TimesRoman10_Character_160,TimesRoman10_Character_161,TimesRoman10_Character_162,TimesRoman10_Character_163,TimesRoman10_Character_164,TimesRoman10_Character_165,TimesRoman10_Character_166,TimesRoman10_Character_167,TimesRoman10_Character_168,TimesRoman10_Character_169,TimesRoman10_Character_170,TimesRoman10_Character_171,TimesRoman10_Character_172,TimesRoman10_Character_173,TimesRoman10_Character_174,TimesRoman10_Character_175, - TimesRoman10_Character_176,TimesRoman10_Character_177,TimesRoman10_Character_178,TimesRoman10_Character_179,TimesRoman10_Character_180,TimesRoman10_Character_181,TimesRoman10_Character_182,TimesRoman10_Character_183,TimesRoman10_Character_184,TimesRoman10_Character_185,TimesRoman10_Character_186,TimesRoman10_Character_187,TimesRoman10_Character_188,TimesRoman10_Character_189,TimesRoman10_Character_190,TimesRoman10_Character_191, - TimesRoman10_Character_192,TimesRoman10_Character_193,TimesRoman10_Character_194,TimesRoman10_Character_195,TimesRoman10_Character_196,TimesRoman10_Character_197,TimesRoman10_Character_198,TimesRoman10_Character_199,TimesRoman10_Character_200,TimesRoman10_Character_201,TimesRoman10_Character_202,TimesRoman10_Character_203,TimesRoman10_Character_204,TimesRoman10_Character_205,TimesRoman10_Character_206,TimesRoman10_Character_207, - TimesRoman10_Character_208,TimesRoman10_Character_209,TimesRoman10_Character_210,TimesRoman10_Character_211,TimesRoman10_Character_212,TimesRoman10_Character_213,TimesRoman10_Character_214,TimesRoman10_Character_215,TimesRoman10_Character_216,TimesRoman10_Character_217,TimesRoman10_Character_218,TimesRoman10_Character_219,TimesRoman10_Character_220,TimesRoman10_Character_221,TimesRoman10_Character_222,TimesRoman10_Character_223, - TimesRoman10_Character_224,TimesRoman10_Character_225,TimesRoman10_Character_226,TimesRoman10_Character_227,TimesRoman10_Character_228,TimesRoman10_Character_229,TimesRoman10_Character_230,TimesRoman10_Character_231,TimesRoman10_Character_232,TimesRoman10_Character_233,TimesRoman10_Character_234,TimesRoman10_Character_235,TimesRoman10_Character_236,TimesRoman10_Character_237,TimesRoman10_Character_238,TimesRoman10_Character_239, - TimesRoman10_Character_240,TimesRoman10_Character_241,TimesRoman10_Character_242,TimesRoman10_Character_243,TimesRoman10_Character_244,TimesRoman10_Character_245,TimesRoman10_Character_246,TimesRoman10_Character_247,TimesRoman10_Character_248,TimesRoman10_Character_249,TimesRoman10_Character_250,TimesRoman10_Character_251,TimesRoman10_Character_252,TimesRoman10_Character_253,TimesRoman10_Character_254,TimesRoman10_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontTimesRoman10 = { "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1", 256, 14, TimesRoman10_Character_Map, 0, 4 }; - -static const GLubyte TimesRoman24_Character_000[] = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_001[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_002[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_003[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_004[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_005[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_006[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_007[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_008[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_009[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_010[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_011[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_012[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_013[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_014[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_015[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_016[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_017[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_018[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_019[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_020[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_021[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_022[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_023[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_024[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_025[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_026[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_027[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_028[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_029[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_030[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_031[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_032[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_033[] = { 8, 0, 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_034[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0,102, 0,102, 0,102, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_035[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 0, 17, 0,127,224,127,224, 8,128, 8,128, 8,128, 63,240, 63,240, 4, 64, 4, 64, 4, 64, 4, 64, 4, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_036[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 63, 0,229,192,196,192,132, 96,132, 96, 4, 96, 4,224, 7,192, 7,128, 30, 0, 60, 0,116, 0,100, 0,100, 32,100, 96, 52,224, 31,128, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_037[] = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 30, 0, 12, 57, 0, 6, 48,128, 2, 48, 64, 3, 48, 64, 1,152, 64, 0,140,192, 0,199,128, 60, 96, 0,114, 32, 0, 97, 48, 0, 96,152, 0, 96,136, 0, 48,140, 0, 25,254, 0, 15, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_038[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 0, 63,191, 0,112,240,128, 96, 96, 0, 96,224, 0, 96,208, 0, 49,144, 0, 27,136, 0, 15, 12, 0, 7, 31, 0, 7,128, 0, 14,192, 0, 12, 96, 0, 12, 32, 0, 12, 32, 0, 6, 96, 0, 3,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_039[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 12, 4, 28, 24, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_040[] = { 8, 0, 0, 2, 4, 8, 24, 16, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 16, 24, 8, 4, 2, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_041[] = { 8, 0, 0, 64, 32, 16, 24, 8, 12, 12, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 8, 24, 16, 32, 64, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_042[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 7, 0, 50, 96, 58,224, 7, 0, 58,224, 50, 96, 7, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_043[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,127,248,127,248, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_044[] = { 7, 0, 0, 0, 0, 48, 24, 8, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_045[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,248,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_046[] = { 6, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_047[] = { 7, 0, 0, 0, 0,192,192,192, 64, 96, 96, 32, 48, 48, 16, 24, 24, 8, 12, 12, 4, 6, 6, 6, 6, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_048[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 25,128, 48,192, 48,192,112,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 48,192, 25,128, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_049[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,192, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 30, 0, 6, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_050[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,192,127,224, 48, 32, 24, 0, 12, 0, 6, 0, 2, 0, 3, 0, 1,128, 1,128, 0,192, 0,192, 64,192, 64,192, 33,192, 63,128, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_051[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,115, 0, 97,128, 0,128, 0,192, 0,192, 0,192, 1,192, 3,128, 15, 0, 6, 0, 3, 0, 65,128, 65,128, 35,128, 63, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_052[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,128, 1,128, 1,128, 1,128,127,224,127,224, 97,128, 33,128, 49,128, 17,128, 25,128, 9,128, 13,128, 5,128, 3,128, 3,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_053[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,113,192, 96,192, 0, 96, 0, 96, 0, 96, 0, 96, 0,224, 1,192, 7,192, 63, 0, 60, 0, 48, 0, 16, 0, 16, 0, 15,192, 15,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_054[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 61,192, 48,192,112, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,192,121,192,119, 0, 48, 0, 56, 0, 24, 0, 12, 0, 7, 0, 1,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_055[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 6, 0, 6, 0, 6, 0, 2, 0, 3, 0, 3, 0, 1, 0, 1,128, 1,128, 0,128, 0,192, 64,192, 96, 96,127,224, 63,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_056[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192,112,192, 96, 96, 96, 96, 96, 96, 32,224, 48,192, 27,128, 15, 0, 15, 0, 25,128, 48,192, 48,192, 48,192, 25,128, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_057[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 14, 0, 3, 0, 1,128, 1,192, 0,192, 14,192, 57,224, 48,224, 96, 96, 96, 96, 96, 96, 96, 96, 96,224, 48,192, 59,192, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_058[] = { 6, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_059[] = { 7, 0, 0, 0, 0, 48, 24, 8, 56, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_060[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0,224, 3,128, 14, 0, 56, 0, 96, 0, 56, 0, 14, 0, 3,128, 0,224, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_061[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,248,127,248, 0, 0, 0, 0,127,248,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_062[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 56, 0, 14, 0, 3,128, 0,224, 0, 48, 0,224, 3,128, 14, 0, 56, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_063[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 4, 0, 4, 0, 4, 0, 6, 0, 6, 0, 3, 0, 3,128, 1,192, 48,192, 48,192, 32,192, 49,128, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_064[] = { 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 3,131, 0, 6, 0, 0, 12, 0, 0, 24,119,128, 24,222,192, 49,142, 96, 49,134, 32, 49,134, 48, 49,134, 16, 49,131, 16, 48,195, 16, 48,227, 16, 56,127, 16, 24, 59, 48, 28, 0, 32, 14, 0, 96, 7, 0,192, 3,195,128, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_065[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_066[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,240, 24, 60, 24, 12, 24, 6, 24, 6, 24, 6, 24, 12, 24, 28, 31,240, 24, 32, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_067[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 15, 28, 28, 4, 48, 2, 48, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 48, 2, 48, 2, 28, 6, 14, 30, 3,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_068[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,224, 0, 24, 56, 0, 24, 28, 0, 24, 6, 0, 24, 6, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 6, 0, 24, 6, 0, 24, 28, 0, 24, 56, 0,127,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_069[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_070[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 16, 24, 16, 31,240, 24, 16, 24, 16, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_071[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 15, 28, 0, 28, 14, 0, 48, 6, 0, 48, 6, 0, 96, 6, 0, 96, 6, 0, 96, 31,128, 96, 0, 0, 96, 0, 0, 96, 0, 0, 96, 0, 0, 48, 2, 0, 48, 2, 0, 28, 6, 0, 14, 30, 0, 3,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_072[] = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 15,192, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 31,255, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0,126, 15,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_073[] = { 8, 0, 0, 0, 0, 0, 0, 0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_074[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0,102, 0, 99, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 15,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_075[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 15,128, 24, 7, 0, 24, 14, 0, 24, 28, 0, 24, 56, 0, 24,112, 0, 24,224, 0, 25,192, 0, 31,128, 0, 31, 0, 0, 25,128, 0, 24,192, 0, 24, 96, 0, 24, 48, 0, 24, 24, 0, 24, 12, 0,126, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_076[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_077[] = { 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 16,252, 16, 48, 48, 16, 48, 48, 16,104, 48, 16,104, 48, 16,196, 48, 16,196, 48, 17,132, 48, 17,130, 48, 19, 2, 48, 19, 1, 48, 22, 1, 48, 22, 1, 48, 28, 0,176, 28, 0,176, 24, 0,112,120, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_078[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 6, 0, 16, 14, 0, 16, 14, 0, 16, 26, 0, 16, 50, 0, 16, 50, 0, 16, 98, 0, 16,194, 0, 16,194, 0, 17,130, 0, 19, 2, 0, 19, 2, 0, 22, 2, 0, 28, 2, 0, 28, 2, 0, 24, 2, 0,120, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_079[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_080[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_081[] = { 18, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 28, 0, 0, 56, 0, 0,112, 0, 0,224, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_082[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 15, 24, 14, 24, 28, 24, 56, 24, 48, 24, 96, 24,224, 25,192, 31,224, 24, 56, 24, 24, 24, 28, 24, 12, 24, 28, 24, 24, 24, 56,127,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_083[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0,120,192, 96, 96, 64, 48, 64, 48, 0, 48, 0,112, 1,224, 7,192, 15, 0, 60, 0,112, 0, 96, 32, 96, 32, 96, 96, 49,224, 15, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_084[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 65,130, 65,130, 97,134,127,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_085[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 24, 0, 12, 4, 0, 24, 4, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0,126, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_086[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,128, 0, 1,128, 0, 1,128, 0, 3,192, 0, 3, 64, 0, 3, 96, 0, 6, 32, 0, 6, 32, 0, 6, 48, 0, 12, 16, 0, 12, 24, 0, 24, 8, 0, 24, 8, 0, 24, 12, 0, 48, 4, 0, 48, 6, 0,252, 31,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_087[] = { 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,131, 0, 1,131, 0, 1,131,128, 3,135,128, 3, 70,128, 3, 70,192, 6, 70, 64, 6, 76, 64, 6, 76, 96, 12, 44, 96, 12, 44, 32, 24, 44, 32, 24, 24, 48, 24, 24, 16, 48, 24, 16, 48, 24, 24,252,126,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_088[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 15,192, 48, 3,128, 24, 7, 0, 8, 14, 0, 4, 12, 0, 6, 24, 0, 2, 56, 0, 1,112, 0, 0,224, 0, 0,192, 0, 1,192, 0, 3,160, 0, 3, 16, 0, 6, 8, 0, 14, 12, 0, 28, 6, 0,126, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_089[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 3,192, 3, 64, 6, 96, 6, 32, 12, 48, 28, 16, 24, 24, 56, 8, 48, 12,252, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_090[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252,112, 12, 56, 4, 24, 4, 28, 0, 12, 0, 14, 0, 7, 0, 3, 0, 3,128, 1,128, 1,192, 0,224, 64, 96, 64,112, 96, 56,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_091[] = { 8, 0, 0, 0, 62, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 62, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_092[] = { 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 4, 12, 12, 8, 24, 24, 16, 48, 48, 32, 96, 96, 64,192,192, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_093[] = { 8, 0, 0, 0,124, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,124, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_094[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 96,192, 32,128, 49,128, 17, 0, 27, 0, 10, 0, 14, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_095[] = { 13, 0, 0, 0, 0,255,248,255,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_096[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,112, 64, 96, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_097[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_098[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55, 0, 48, 0, 48, 0, 48, 0, 48, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_099[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 32,192, 49,192, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_100[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 96, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192, 0,192, 0,192, 0,192, 0,192, 1,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_101[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0,127,192, 96,192, 32,192, 49,128, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_102[] = { 7, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,254, 48, 48, 48, 22, 14, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_103[] = { 12, 0, 0, 0, 0, 31,128,120,224, 96, 48, 96, 16, 48, 48, 31,224, 63,128, 48, 0, 24, 0, 31, 0, 25,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_104[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192, 51,128, 48, 0, 48, 0, 48, 0, 48, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_105[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_106[] = { 6, 0, 0,192,224, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_107[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121,240, 48,224, 49,192, 51,128, 55, 0, 54, 0, 60, 0, 52, 0, 50, 0, 51, 0, 49,128, 51,224, 48, 0, 48, 0, 48, 0, 48, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_108[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_109[] = { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,241,224, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 56,241,192, 55,207,128,115,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_110[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_111[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_112[] = { 12, 0, 0, 0, 0,120, 0, 48, 0, 48, 0, 48, 0, 48, 0, 55, 0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_113[] = { 12, 0, 0, 0, 0, 1,224, 0,192, 0,192, 0,192, 0,192, 14,192, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_114[] = { 8, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 59, 55,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_115[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 99, 0, 65,128, 1,128, 3,128, 15, 0, 62, 0, 56, 0,112, 0, 97, 0, 51, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_116[] = { 7, 0, 0, 0, 0, 0, 0, 0, 28, 50, 48, 48, 48, 48, 48, 48, 48, 48, 48,254,112, 48, 16, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_117[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_118[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 14, 0, 14, 0, 26, 0, 25, 0, 25, 0, 49, 0, 48,128, 48,128, 96,128, 96,192,241,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_119[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 14, 56, 0, 14, 56, 0, 26, 40, 0, 26,100, 0, 25,100, 0, 49,100, 0, 48,194, 0, 48,194, 0, 96,194, 0, 96,195, 0,241,231,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_120[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,240, 48, 96, 16,192, 25,192, 13,128, 7, 0, 6, 0, 13, 0, 28,128, 24,192, 48, 96,120,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_121[] = { 11, 0, 0, 0, 0,224, 0,240, 0, 24, 0, 8, 0, 12, 0, 4, 0, 14, 0, 14, 0, 26, 0, 25, 0, 25, 0, 49, 0, 48,128, 48,128, 96,128, 96,192,241,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_122[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,128, 97,128, 48,128, 56, 0, 24, 0, 28, 0, 12, 0, 14, 0, 7, 0, 67, 0, 97,128,127,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_123[] = { 10, 0, 0, 0, 0, 3,128, 6, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 8, 0, 24, 0, 16, 0, 96, 0, 16, 0, 24, 0, 8, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 6, 0, 3,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_124[] = { 6, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_125[] = { 10, 0, 0, 0, 0,112, 0, 24, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 0, 6, 0, 2, 0, 1,128, 2, 0, 6, 0, 4, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 24, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_126[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,192, 99,224, 62, 48, 28, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_127[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_128[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_129[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_130[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_131[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_132[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_133[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_134[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_135[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_136[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_137[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_138[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_139[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_140[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_141[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_142[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_143[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_144[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_145[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_146[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_147[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_148[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_149[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_150[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_151[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_152[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_153[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_154[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_155[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_156[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_157[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_158[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_159[] = { 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 85, 85, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_160[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_161[] = { 8, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_162[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 31, 0, 63,128, 56, 64,104, 0,100, 0,100, 0,100, 0, 98, 0, 98, 0, 33,192, 49,192, 15,128, 0,128, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_163[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,192, 95, 96, 60, 32, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24, 0,126, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24,192, 12,192, 7,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_164[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 48,119,112, 63,224, 24,192, 48, 96, 48, 96, 48, 96, 48, 96, 24,192, 63,224,119,112, 96, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_165[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,192, 3, 0, 3, 0, 3, 0, 3, 0, 31,224, 3, 0, 31,224, 3, 0, 7,128, 12,128, 12,192, 24, 64, 24, 96, 48, 32,112, 48,248,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_166[] = { 6, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_167[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 25, 0, 24,128, 1,128, 3,128, 7, 0, 14, 0, 29, 0, 56,128, 48,192, 32,192, 33,192, 19,128, 15, 0, 14, 0, 28, 0, 24, 0, 17,128, 9,128, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_168[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,102, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_169[] = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 0, 14, 14, 0, 24, 3, 0, 48,225,128, 35,184,128, 98, 12,192, 70, 0, 64, 68, 0, 64, 68, 0, 64, 68, 0, 64, 70, 0, 64, 98, 12,192, 35,152,128, 48,241,128, 24, 3, 0, 14, 14, 0, 3,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_170[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0,118,204,204,124, 12,204,120, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_171[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 6, 96, 12,192, 25,128, 51, 0, 51, 0, 25,128, 12,192, 6, 96, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_172[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 24, 0, 24, 0, 24, 0, 24,127,248,127,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_173[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_174[] = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 0, 14, 14, 0, 24, 3, 0, 48, 1,128, 35,140,128, 97, 24,192, 65, 16, 64, 65, 32, 64, 65,240, 64, 65, 24, 64, 65, 8, 64, 97, 8,192, 33, 24,128, 51,241,128, 24, 3, 0, 14, 14, 0, 3,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_175[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126,126, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_176[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 34, 0, 65, 0, 65, 0, 65, 0, 34, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_177[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,248,127,248, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,127,248,127,248, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_178[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 68, 32, 48, 16, 8, 12,140, 76, 56, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_179[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,136,140, 12, 8, 48, 8,140, 76, 56, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_180[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 24, 14, 6, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_181[] = { 13, 0, 0, 0, 0, 32, 0,112, 0, 96, 0, 32, 0, 32, 0, 46,112, 63, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_182[] = { 11, 0, 0, 0, 0, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 4,128, 12,128, 28,128, 60,128, 60,128,124,128,124,128,124,128, 60,128, 60,128, 28,128, 15,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_183[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_184[] = { 8, 0, 60,102, 6, 30, 24, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_185[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 16, 16, 16, 16, 16, 16, 80, 48, 16, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_186[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 60,102,102,102,102,102, 60, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_187[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 51, 0, 25,128, 12,192, 6, 96, 6, 96, 12,192, 25,128, 51, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_188[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 2, 0, 8, 2, 0, 12,127,128, 4, 34, 0, 6, 50, 0, 3, 18, 0, 1, 10, 0,125,142, 0, 16,134, 0, 16,194, 0, 16, 96, 0, 16, 32, 0, 16, 48, 0, 16, 16, 0, 80, 24, 0, 48, 12, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_189[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 63, 0, 8, 17, 0, 12, 8, 0, 4, 12, 0, 6, 4, 0, 3, 2, 0, 1, 3, 0,125,163, 0, 16,147, 0, 16,206, 0, 16, 96, 0, 16, 32, 0, 16, 48, 0, 16, 16, 0, 80, 24, 0, 48, 12, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_190[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 2, 0, 8, 2, 0, 12,127,128, 4, 34, 0, 6, 50, 0, 3, 18, 0, 1, 10, 0,113,142, 0,136,134, 0,140,194, 0, 12, 96, 0, 8, 32, 0, 48, 48, 0, 8, 16, 0,140, 24, 0, 76, 12, 0, 56, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_191[] = { 11, 0, 0, 0, 0, 31, 0, 49,128, 96,128, 97,128, 97,128,112, 0, 56, 0, 24, 0, 28, 0, 12, 0, 12, 0, 4, 0, 4, 0, 0, 0, 0, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_192[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 0, 32, 0, 0,192, 0, 3,128, 0, 3, 0, 0}; -static const GLubyte TimesRoman24_Character_193[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 1, 0, 0, 0,192, 0, 0,112, 0, 0, 48, 0}; -static const GLubyte TimesRoman24_Character_194[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 8, 16, 0, 6, 96, 0, 3,192, 0, 1,128, 0}; -static const GLubyte TimesRoman24_Character_195[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 7, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 4,224, 0, 3,144, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_196[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 6, 48, 0, 6, 48, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_197[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 16, 6, 0, 16, 12, 0, 24, 12, 0, 8, 12, 0, 15,248, 0, 12, 24, 0, 4, 24, 0, 4, 48, 0, 6, 48, 0, 2, 48, 0, 2, 96, 0, 1, 96, 0, 1,192, 0, 1,192, 0, 0,128, 0, 1,192, 0, 2, 32, 0, 2, 32, 0, 1,192, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_198[] = { 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,255,240, 48, 96, 48, 16, 96, 16, 16, 96, 16, 24, 96, 0, 8, 96, 0, 15,224,128, 12, 96,128, 4,127,128, 4, 96,128, 6, 96,128, 2, 96, 0, 2, 96, 0, 1, 96, 32, 1, 96, 32, 1,224, 96, 3,255,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_199[] = { 16, 0, 0, 3,192, 6, 96, 0, 96, 1,224, 1,128, 0,128, 3,240, 15, 28, 28, 4, 48, 2, 48, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 48, 2, 48, 2, 28, 6, 14, 30, 3,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_200[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 0,128, 3, 0, 14, 0, 12, 0}; -static const GLubyte TimesRoman24_Character_201[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 2, 0, 1,128, 0,224, 0, 96}; -static const GLubyte TimesRoman24_Character_202[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 8, 16, 6, 96, 3,192, 1,128}; -static const GLubyte TimesRoman24_Character_203[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,252, 24, 12, 24, 4, 24, 4, 24, 0, 24, 0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24, 0, 24, 0, 24, 8, 24, 8, 24, 24,127,248, 0, 0, 0, 0, 12,192, 12,192, 0, 0}; -static const GLubyte TimesRoman24_Character_204[] = { 8, 0, 0, 0, 0, 0, 0, 0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126, 0, 4, 24,112, 96}; -static const GLubyte TimesRoman24_Character_205[] = { 8, 0, 0, 0, 0, 0, 0, 0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126, 0, 32, 24, 14, 6}; -static const GLubyte TimesRoman24_Character_206[] = { 8, 0, 0, 0, 0, 0, 0, 0, 63, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 63, 0, 64, 51, 30, 12}; -static const GLubyte TimesRoman24_Character_207[] = { 8, 0, 0, 0, 0, 0, 0, 0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126, 0, 0,102,102, 0}; -static const GLubyte TimesRoman24_Character_208[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,224, 0, 24, 56, 0, 24, 28, 0, 24, 6, 0, 24, 6, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0,255, 3, 0, 24, 3, 0, 24, 3, 0, 24, 3, 0, 24, 6, 0, 24, 6, 0, 24, 28, 0, 24, 56, 0,127,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_209[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 6, 0, 16, 14, 0, 16, 14, 0, 16, 26, 0, 16, 50, 0, 16, 50, 0, 16, 98, 0, 16,194, 0, 16,194, 0, 17,130, 0, 19, 2, 0, 19, 2, 0, 22, 2, 0, 28, 2, 0, 28, 2, 0, 24, 2, 0,120, 15,128, 0, 0, 0, 0, 0, 0, 2,112, 0, 1,200, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_210[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0, 32, 0, 0,192, 0, 3,128, 0, 3, 0, 0}; -static const GLubyte TimesRoman24_Character_211[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0,128, 0, 0, 96, 0, 0, 56, 0, 0, 24, 0}; -static const GLubyte TimesRoman24_Character_212[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 4, 8, 0, 3, 48, 0, 1,224, 0, 0,192, 0}; -static const GLubyte TimesRoman24_Character_213[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0, 0, 0, 2,112, 0, 1,200, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_214[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 28, 0, 28, 14, 0, 48, 3, 0, 48, 3, 0, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 96, 1,128, 48, 3, 0, 48, 3, 0, 28, 14, 0, 14, 28, 0, 3,240, 0, 0, 0, 0, 0, 0, 0, 3, 48, 0, 3, 48, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_215[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 16, 48, 48, 24, 96, 12,192, 7,128, 3, 0, 7,128, 12,192, 24, 96, 48, 48, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_216[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 19,240, 0, 14, 28, 0, 28, 14, 0, 52, 3, 0, 50, 3, 0, 97, 1,128, 97, 1,128, 96,129,128, 96,129,128, 96, 65,128, 96, 65,128, 96, 33,128, 48, 35, 0, 48, 19, 0, 28, 14, 0, 14, 28, 0, 3,242, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_217[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 24, 0, 12, 4, 0, 24, 4, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0,126, 15,128, 0, 0, 0, 0, 32, 0, 0,192, 0, 3,128, 0, 3, 0, 0}; -static const GLubyte TimesRoman24_Character_218[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 24, 0, 12, 4, 0, 24, 4, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0,126, 15,128, 0, 0, 0, 0,128, 0, 0, 96, 0, 0, 56, 0, 0, 24, 0}; -static const GLubyte TimesRoman24_Character_219[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 24, 0, 12, 4, 0, 24, 4, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0,126, 15,128, 0, 0, 0, 4, 8, 0, 3, 48, 0, 1,224, 0, 0,192, 0}; -static const GLubyte TimesRoman24_Character_220[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 24, 0, 12, 4, 0, 24, 4, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0, 24, 2, 0,126, 15,128, 0, 0, 0, 0, 0, 0, 3, 24, 0, 3, 24, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_221[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 1,128, 1,128, 1,128, 1,128, 1,128, 1,128, 3,192, 3, 64, 6, 96, 6, 32, 12, 48, 28, 16, 24, 24, 56, 8, 48, 12,252, 63, 0, 0, 1, 0, 0,192, 0,112, 0, 48}; -static const GLubyte TimesRoman24_Character_222[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0, 24, 0, 24, 0, 24, 0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56, 31,224, 24, 0, 24, 0, 24, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_223[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,128, 54, 64, 54, 96, 48, 96, 48, 96, 48,224, 48,192, 49,192, 51,128, 54, 0, 49,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_224[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 2, 0, 12, 0, 56, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_225[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 8, 0, 6, 0, 3,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_226[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 33, 0, 18, 0, 30, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_227[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 0, 0, 46, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_228[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 0, 0, 51, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_229[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128, 7,128, 1,128, 49,128, 51,128, 31, 0, 0, 0, 14, 0, 17, 0, 17, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_230[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,120,125,252, 99,194, 97,128, 97,128, 49,128, 29,128, 7,254, 1,134, 49,134, 51,204, 30,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_231[] = { 11, 0, 0, 30, 0, 51, 0, 3, 0, 15, 0, 12, 0, 4, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 32,192, 49,192, 15,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_232[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0,127,192, 96,192, 32,192, 49,128, 15, 0, 0, 0, 2, 0, 12, 0, 56, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_233[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0,127,192, 96,192, 32,192, 49,128, 15, 0, 0, 0, 8, 0, 6, 0, 3,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_234[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0,127,192, 96,192, 32,192, 49,128, 15, 0, 0, 0, 16,128, 9, 0, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_235[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 63,128, 56, 64,112, 0, 96, 0, 96, 0, 96, 0,127,192, 96,192, 32,192, 49,128, 15, 0, 0, 0, 0, 0, 25,128, 25,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_236[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 8, 48,224,192, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_237[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 64, 48, 28, 12, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_238[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0,132, 72,120, 48, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_239[] = { 6, 0, 0, 0, 0, 0, 0, 0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112, 0, 0,204,204, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_240[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,128, 99, 0, 30, 0, 15, 0, 56,192, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_241[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128, 0, 0, 0, 0, 19,128, 14, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_242[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 1, 0, 6, 0, 28, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_243[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 4, 0, 3, 0, 1,192, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_244[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 16,128, 9, 0, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_245[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 0, 0, 19,128, 14, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_246[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15, 0, 0, 0, 0, 0, 25,128, 25,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_247[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0,127,248,127,248, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_248[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0,111, 0, 57,192, 56,192,104, 96,108, 96,100, 96,102, 96, 98, 96, 99, 96, 49,192, 57,192, 15, 96, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_249[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 1, 0, 6, 0, 28, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_250[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 4, 0, 3, 0, 1,192, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_251[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 16,128, 9, 0, 15, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_252[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224, 0, 0, 0, 0, 25,128, 25,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_253[] = { 11, 0, 0, 0, 0,224, 0,240, 0, 24, 0, 8, 0, 12, 0, 4, 0, 14, 0, 14, 0, 26, 0, 25, 0, 25, 0, 49, 0, 48,128, 48,128, 96,128, 96,192,241,224, 0, 0, 8, 0, 6, 0, 3,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_254[] = { 12, 0, 0, 0, 0,120, 0, 48, 0, 48, 0, 48, 0, 48, 0, 55, 0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55, 0, 48, 0, 48, 0, 48, 0, 48, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static const GLubyte TimesRoman24_Character_255[] = { 11, 0, 0, 0, 0,224, 0,240, 0, 24, 0, 8, 0, 12, 0, 4, 0, 14, 0, 14, 0, 26, 0, 25, 0, 25, 0, 49, 0, 48,128, 48,128, 96,128, 96,192,241,224, 0, 0, 0, 0, 51, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/* The font characters mapping: */ -static const GLubyte* TimesRoman24_Character_Map[] = {TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032, - TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032, - TimesRoman24_Character_032,TimesRoman24_Character_033,TimesRoman24_Character_034,TimesRoman24_Character_035,TimesRoman24_Character_036,TimesRoman24_Character_037,TimesRoman24_Character_038,TimesRoman24_Character_039,TimesRoman24_Character_040,TimesRoman24_Character_041,TimesRoman24_Character_042,TimesRoman24_Character_043,TimesRoman24_Character_044,TimesRoman24_Character_045,TimesRoman24_Character_046,TimesRoman24_Character_047, - TimesRoman24_Character_048,TimesRoman24_Character_049,TimesRoman24_Character_050,TimesRoman24_Character_051,TimesRoman24_Character_052,TimesRoman24_Character_053,TimesRoman24_Character_054,TimesRoman24_Character_055,TimesRoman24_Character_056,TimesRoman24_Character_057,TimesRoman24_Character_058,TimesRoman24_Character_059,TimesRoman24_Character_060,TimesRoman24_Character_061,TimesRoman24_Character_062,TimesRoman24_Character_063, - TimesRoman24_Character_064,TimesRoman24_Character_065,TimesRoman24_Character_066,TimesRoman24_Character_067,TimesRoman24_Character_068,TimesRoman24_Character_069,TimesRoman24_Character_070,TimesRoman24_Character_071,TimesRoman24_Character_072,TimesRoman24_Character_073,TimesRoman24_Character_074,TimesRoman24_Character_075,TimesRoman24_Character_076,TimesRoman24_Character_077,TimesRoman24_Character_078,TimesRoman24_Character_079, - TimesRoman24_Character_080,TimesRoman24_Character_081,TimesRoman24_Character_082,TimesRoman24_Character_083,TimesRoman24_Character_084,TimesRoman24_Character_085,TimesRoman24_Character_086,TimesRoman24_Character_087,TimesRoman24_Character_088,TimesRoman24_Character_089,TimesRoman24_Character_090,TimesRoman24_Character_091,TimesRoman24_Character_092,TimesRoman24_Character_093,TimesRoman24_Character_094,TimesRoman24_Character_095, - TimesRoman24_Character_096,TimesRoman24_Character_097,TimesRoman24_Character_098,TimesRoman24_Character_099,TimesRoman24_Character_100,TimesRoman24_Character_101,TimesRoman24_Character_102,TimesRoman24_Character_103,TimesRoman24_Character_104,TimesRoman24_Character_105,TimesRoman24_Character_106,TimesRoman24_Character_107,TimesRoman24_Character_108,TimesRoman24_Character_109,TimesRoman24_Character_110,TimesRoman24_Character_111, - TimesRoman24_Character_112,TimesRoman24_Character_113,TimesRoman24_Character_114,TimesRoman24_Character_115,TimesRoman24_Character_116,TimesRoman24_Character_117,TimesRoman24_Character_118,TimesRoman24_Character_119,TimesRoman24_Character_120,TimesRoman24_Character_121,TimesRoman24_Character_122,TimesRoman24_Character_123,TimesRoman24_Character_124,TimesRoman24_Character_125,TimesRoman24_Character_126,TimesRoman24_Character_032, - TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032, - TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032, - TimesRoman24_Character_160,TimesRoman24_Character_161,TimesRoman24_Character_162,TimesRoman24_Character_163,TimesRoman24_Character_164,TimesRoman24_Character_165,TimesRoman24_Character_166,TimesRoman24_Character_167,TimesRoman24_Character_168,TimesRoman24_Character_169,TimesRoman24_Character_170,TimesRoman24_Character_171,TimesRoman24_Character_172,TimesRoman24_Character_173,TimesRoman24_Character_174,TimesRoman24_Character_175, - TimesRoman24_Character_176,TimesRoman24_Character_177,TimesRoman24_Character_178,TimesRoman24_Character_179,TimesRoman24_Character_180,TimesRoman24_Character_181,TimesRoman24_Character_182,TimesRoman24_Character_183,TimesRoman24_Character_184,TimesRoman24_Character_185,TimesRoman24_Character_186,TimesRoman24_Character_187,TimesRoman24_Character_188,TimesRoman24_Character_189,TimesRoman24_Character_190,TimesRoman24_Character_191, - TimesRoman24_Character_192,TimesRoman24_Character_193,TimesRoman24_Character_194,TimesRoman24_Character_195,TimesRoman24_Character_196,TimesRoman24_Character_197,TimesRoman24_Character_198,TimesRoman24_Character_199,TimesRoman24_Character_200,TimesRoman24_Character_201,TimesRoman24_Character_202,TimesRoman24_Character_203,TimesRoman24_Character_204,TimesRoman24_Character_205,TimesRoman24_Character_206,TimesRoman24_Character_207, - TimesRoman24_Character_208,TimesRoman24_Character_209,TimesRoman24_Character_210,TimesRoman24_Character_211,TimesRoman24_Character_212,TimesRoman24_Character_213,TimesRoman24_Character_214,TimesRoman24_Character_215,TimesRoman24_Character_216,TimesRoman24_Character_217,TimesRoman24_Character_218,TimesRoman24_Character_219,TimesRoman24_Character_220,TimesRoman24_Character_221,TimesRoman24_Character_222,TimesRoman24_Character_223, - TimesRoman24_Character_224,TimesRoman24_Character_225,TimesRoman24_Character_226,TimesRoman24_Character_227,TimesRoman24_Character_228,TimesRoman24_Character_229,TimesRoman24_Character_230,TimesRoman24_Character_231,TimesRoman24_Character_232,TimesRoman24_Character_233,TimesRoman24_Character_234,TimesRoman24_Character_235,TimesRoman24_Character_236,TimesRoman24_Character_237,TimesRoman24_Character_238,TimesRoman24_Character_239, - TimesRoman24_Character_240,TimesRoman24_Character_241,TimesRoman24_Character_242,TimesRoman24_Character_243,TimesRoman24_Character_244,TimesRoman24_Character_245,TimesRoman24_Character_246,TimesRoman24_Character_247,TimesRoman24_Character_248,TimesRoman24_Character_249,TimesRoman24_Character_250,TimesRoman24_Character_251,TimesRoman24_Character_252,TimesRoman24_Character_253,TimesRoman24_Character_254,TimesRoman24_Character_255,NULL}; - -/* The font structure: */ -const SFG_Font fgFontTimesRoman24 = { "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1", 256, 29, TimesRoman24_Character_Map, 0, 7 }; - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_gamemode.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_gamemode.c deleted file mode 100644 index 67159e160..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_gamemode.c +++ /dev/null @@ -1,594 +0,0 @@ -/* - * freeglut_gamemode.c - * - * The game mode handling code. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * glutGameModeString() -- missing - * glutEnterGameMode() -- X11 version - * glutLeaveGameMode() -- is that correct? - * glutGameModeGet() -- is that correct? - */ - - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -/* - * Remembers the current visual settings, so that - * we can change them and restore later... - */ -static void fghRememberState( void ) -{ -#if TARGET_HOST_POSIX_X11 - - /* - * This highly depends on the XFree86 extensions, - * not approved as X Consortium standards - */ -# ifdef X_XF86VidModeGetModeLine - - - /* - * Remember the current ViewPort location of the screen to be able to - * restore the ViewPort on LeaveGameMode(): - */ - if( !XF86VidModeGetViewPort( - fgDisplay.Display, - fgDisplay.Screen, - &fgDisplay.DisplayViewPortX, - &fgDisplay.DisplayViewPortY ) ) - fgWarning( "XF86VidModeGetViewPort failed" ); - - /* - * Remember the current pointer location before going fullscreen - * for restoring it later: - */ - { - Window junk_window; - unsigned int mask; - - XQueryPointer( - fgDisplay.Display, fgDisplay.RootWindow, - &junk_window, &junk_window, - &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY, - &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY, &mask - ); - } - - /* Query the current display settings: */ - fgDisplay.DisplayModeValid = - XF86VidModeGetModeLine( - fgDisplay.Display, - fgDisplay.Screen, - &fgDisplay.DisplayModeClock, - &fgDisplay.DisplayMode - ); - - if( !fgDisplay.DisplayModeValid ) - fgWarning( "XF86VidModeGetModeLine failed" ); - -# else - /* - * XXX warning fghRememberState: missing XFree86 video mode extensions, - * XXX game mode will not change screen resolution when activated - */ -# endif - -#elif TARGET_HOST_MS_WINDOWS - -/* DEVMODE devMode; */ - - /* Grab the current desktop settings... */ - -/* hack to get around my stupid cross-gcc headers */ -#define FREEGLUT_ENUM_CURRENT_SETTINGS -1 - - EnumDisplaySettings( NULL, FREEGLUT_ENUM_CURRENT_SETTINGS, - &fgDisplay.DisplayMode ); - - /* Make sure we will be restoring all settings needed */ - fgDisplay.DisplayMode.dmFields |= - DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - -#endif -} - -/* - * Restores the previously remembered visual settings - */ -static void fghRestoreState( void ) -{ -#if TARGET_HOST_POSIX_X11 - -# ifdef X_XF86VidModeGetAllModeLines - /* Restore the remembered pointer position: */ - XWarpPointer( - fgDisplay.Display, None, fgDisplay.RootWindow, 0, 0, 0, 0, - fgDisplay.DisplayPointerX, fgDisplay.DisplayPointerY - ); - - /* - * This highly depends on the XFree86 extensions, - * not approved as X Consortium standards - */ - - if( fgDisplay.DisplayModeValid ) - { - XF86VidModeModeInfo** displayModes; - int i, displayModesCount; - - if( !XF86VidModeGetAllModeLines( - fgDisplay.Display, - fgDisplay.Screen, - &displayModesCount, - &displayModes ) ) - { - fgWarning( "XF86VidModeGetAllModeLines failed" ); - return; - } - - - /* - * Check every of the modes looking for one that matches our demands. - * If we find one, switch to it and restore the remembered viewport. - */ - for( i = 0; i < displayModesCount; i++ ) - { - if(displayModes[ i ]->hdisplay == fgDisplay.DisplayMode.hdisplay && - displayModes[ i ]->vdisplay == fgDisplay.DisplayMode.vdisplay && - displayModes[ i ]->dotclock == fgDisplay.DisplayModeClock ) - { - if( !XF86VidModeSwitchToMode( - fgDisplay.Display, - fgDisplay.Screen, - displayModes[ i ] ) ) - { - fgWarning( "XF86VidModeSwitchToMode failed" ); - break; - } - - if( !XF86VidModeSetViewPort( - fgDisplay.Display, - fgDisplay.Screen, - fgDisplay.DisplayViewPortX, - fgDisplay.DisplayViewPortY ) ) - fgWarning( "XF86VidModeSetViewPort failed" ); - - - /* - * For the case this would be the last X11 call the application - * calls exit() we've to flush the X11 output queue to have the - * commands sent to the X server before the application exits. - */ - XFlush( fgDisplay.Display ); - - break; - } - } - XFree( displayModes ); - } - -# else - /* - * XXX warning fghRestoreState: missing XFree86 video mode extensions, - * XXX game mode will not change screen resolution when activated - */ -# endif - -#elif TARGET_HOST_MS_WINDOWS - - /* Restore the previously rememebered desktop display settings */ - ChangeDisplaySettings( &fgDisplay.DisplayMode, 0 ); - -#endif -} - -#if TARGET_HOST_POSIX_X11 -#ifdef X_XF86VidModeGetAllModeLines - -/* - * Checks a single display mode settings against user's preferences. - */ -static GLboolean fghCheckDisplayMode( int width, int height, int depth, int refresh ) -{ - /* The desired values should be stored in fgState structure... */ - return ( width == fgState.GameModeSize.X ) && - ( height == fgState.GameModeSize.Y ) && - ( depth == fgState.GameModeDepth ) && - ( refresh == fgState.GameModeRefresh ); -} - -/* - * Checks all display modes settings against user's preferences. - * Returns the mode number found or -1 if none could be found. - */ -static int fghCheckDisplayModes( GLboolean exactMatch, int displayModesCount, XF86VidModeModeInfo** displayModes ) -{ - int i; - for( i = 0; i < displayModesCount; i++ ) - { - /* Compute the displays refresh rate, dotclock comes in kHz. */ - int refresh = ( displayModes[ i ]->dotclock * 1000 ) / - ( displayModes[ i ]->htotal * displayModes[ i ]->vtotal ); - - if( fghCheckDisplayMode( displayModes[ i ]->hdisplay, - displayModes[ i ]->vdisplay, - fgState.GameModeDepth, - ( exactMatch ? refresh : fgState.GameModeRefresh ) ) ) { - return i; - } - } - return -1; -} - -#endif -#endif - -/* - * Changes the current display mode to match user's settings - */ -static GLboolean fghChangeDisplayMode( GLboolean haveToTest ) -{ - GLboolean success = GL_FALSE; -#if TARGET_HOST_POSIX_X11 - - /* - * This highly depends on the XFree86 extensions, - * not approved as X Consortium standards - */ -# ifdef X_XF86VidModeGetAllModeLines - - /* - * This is also used by applcations which check modes by calling - * glutGameModeGet(GLUT_GAME_MODE_POSSIBLE), so allow the check: - */ - if( haveToTest || fgDisplay.DisplayModeValid ) - { - XF86VidModeModeInfo** displayModes; - int i, displayModesCount; - - if( !XF86VidModeGetAllModeLines( - fgDisplay.Display, - fgDisplay.Screen, - &displayModesCount, - &displayModes ) ) - { - fgWarning( "XF86VidModeGetAllModeLines failed" ); - return success; - } - - - /* - * Check every of the modes looking for one that matches our demands, - * ignoring the refresh rate if no exact match could be found. - */ - i = fghCheckDisplayModes( GL_TRUE, displayModesCount, displayModes ); - if( i < 0 ) { - i = fghCheckDisplayModes( GL_FALSE, displayModesCount, displayModes ); - } - success = ( i < 0 ) ? GL_FALSE : GL_TRUE; - - if( !haveToTest && success ) { - if( !XF86VidModeSwitchToMode( - fgDisplay.Display, - fgDisplay.Screen, - displayModes[ i ] ) ) - fgWarning( "XF86VidModeSwitchToMode failed" ); - } - - XFree( displayModes ); - } - -# else - - /* - * XXX warning fghChangeDisplayMode: missing XFree86 video mode extensions, - * XXX game mode will not change screen resolution when activated - */ - success = GL_TRUE; - -# endif - -#elif TARGET_HOST_MS_WINDOWS - - DEVMODE devMode; - char *fggmstr = NULL; - - success = GL_FALSE; - - EnumDisplaySettings( NULL, -1, &devMode ); - devMode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - - devMode.dmPelsWidth = fgState.GameModeSize.X; - devMode.dmPelsHeight = fgState.GameModeSize.Y; - devMode.dmBitsPerPel = fgState.GameModeDepth; - devMode.dmDisplayFrequency = fgState.GameModeRefresh; - devMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - - switch ( ChangeDisplaySettingsEx(NULL, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) ) - { - case DISP_CHANGE_SUCCESSFUL: - success = GL_TRUE; - - /* update vars in case if windows switched to proper mode */ - EnumDisplaySettings( NULL, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode ); - fgState.GameModeSize.X = devMode.dmPelsWidth; - fgState.GameModeSize.Y = devMode.dmPelsHeight; - fgState.GameModeDepth = devMode.dmBitsPerPel; - fgState.GameModeRefresh = devMode.dmDisplayFrequency; - break; - case DISP_CHANGE_RESTART: - fggmstr = "The computer must be restarted for the graphics mode to work."; - break; - case DISP_CHANGE_BADFLAGS: - fggmstr = "An invalid set of flags was passed in."; - break; - case DISP_CHANGE_BADPARAM: - fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags."; - break; - case DISP_CHANGE_FAILED: - fggmstr = "The display driver failed the specified graphics mode."; - break; - case DISP_CHANGE_BADMODE: - fggmstr = "The graphics mode is not supported."; - break; - default: - fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible,MSDN does not mention any other error */ - break; - } - - if ( !success ) - fgWarning(fggmstr); /* I'd rather get info whats going on in my program than wonder about */ - /* magic happenings behind my back, its lib for devels at last ;) */ -#endif - - return success; -} - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Sets the game mode display string - */ -void FGAPIENTRY glutGameModeString( const char* string ) -{ - int width = 640, height = 480, depth = 16, refresh = 72; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeString" ); - - /* - * This one seems a bit easier than glutInitDisplayString. The bad thing - * about it that I was unable to find the game mode string definition, so - * that I assumed it is: "[width]x[height]:[depth]@[refresh rate]", which - * appears in all GLUT game mode programs I have seen to date. - */ - if( sscanf( string, "%ix%i:%i@%i", &width, &height, &depth, &refresh ) != - 4 ) - if( sscanf( string, "%ix%i:%i", &width, &height, &depth ) != 3 ) - if( sscanf( string, "%ix%i@%i", &width, &height, &refresh ) != 3 ) - if( sscanf( string, "%ix%i", &width, &height ) != 2 ) - if( sscanf( string, ":%i@%i", &depth, &refresh ) != 2 ) - if( sscanf( string, ":%i", &depth ) != 1 ) - if( sscanf( string, "@%i", &refresh ) != 1 ) - fgWarning( - "unable to parse game mode string `%s'", - string - ); - - /* Hopefully it worked, and if not, we still have the default values */ - fgState.GameModeSize.X = width; - fgState.GameModeSize.Y = height; - fgState.GameModeDepth = depth; - fgState.GameModeRefresh = refresh; -} - -/* - * Enters the game mode - */ -int FGAPIENTRY glutEnterGameMode( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEnterGameMode" ); - - if( fgStructure.GameModeWindow ) - fgAddToWindowDestroyList( fgStructure.GameModeWindow ); - else - fghRememberState( ); - - if( ! fghChangeDisplayMode( GL_FALSE ) ) - { - fgWarning( "failed to change screen settings" ); - return 0; - } - - fgStructure.GameModeWindow = fgCreateWindow( - NULL, "FREEGLUT", GL_TRUE, 0, 0, - GL_TRUE, fgState.GameModeSize.X, fgState.GameModeSize.Y, - GL_TRUE, GL_FALSE - ); - - fgStructure.GameModeWindow->State.Width = fgState.GameModeSize.X; - fgStructure.GameModeWindow->State.Height = fgState.GameModeSize.Y; - fgStructure.GameModeWindow->State.NeedToResize = GL_TRUE; - -#if TARGET_HOST_POSIX_X11 - - /* - * Sync needed to avoid a real race, the Xserver must have really created - * the window before we can grab the pointer into it: - */ - XSync( fgDisplay.Display, False ); - - /* - * Grab the pointer to confine it into the window after the calls to - * XWrapPointer() which ensure that the pointer really enters the window. - * - * We also need to wait here until XGrabPointer() returns GrabSuccess, - * otherwise the new window is not viewable yet and if the next function - * (XSetInputFocus) is called with a not yet viewable window, it will exit - * the application which we have to aviod, so wait until it's viewable: - */ - while( GrabSuccess != XGrabPointer( - fgDisplay.Display, fgStructure.GameModeWindow->Window.Handle, - TRUE, - ButtonPressMask | ButtonReleaseMask | ButtonMotionMask - | PointerMotionMask, - GrabModeAsync, GrabModeAsync, - fgStructure.GameModeWindow->Window.Handle, None, CurrentTime) ) - usleep( 100 ); - - /* - * Change input focus to the new window. This will exit the application - * if the new window is not viewable yet, see the XGrabPointer loop above. - */ - XSetInputFocus( - fgDisplay.Display, - fgStructure.GameModeWindow->Window.Handle, - RevertToNone, - CurrentTime - ); - - /* Move the Pointer to the middle of the fullscreen window */ - XWarpPointer( - fgDisplay.Display, - None, - fgDisplay.RootWindow, - 0, 0, 0, 0, - fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2 - ); - -# ifdef X_XF86VidModeSetViewPort - - if( fgDisplay.DisplayModeValid ) - { - int x, y; - Window child; - - /* Change to viewport to the window topleft edge: */ - if( !XF86VidModeSetViewPort( fgDisplay.Display, fgDisplay.Screen, 0, 0 ) ) - fgWarning( "XF86VidModeSetViewPort failed" ); - - /* - * Final window repositioning: It could be avoided using an undecorated - * window using override_redirect, but this * would possily require - * more changes and investigation. - */ - - /* Get the current postion of the drawable area on screen */ - XTranslateCoordinates( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - fgDisplay.RootWindow, - 0, 0, &x, &y, - &child - ); - - /* Move the decorataions out of the topleft corner of the display */ - XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, - -x, -y); - } - -#endif - - /* Grab the keyboard, too */ - XGrabKeyboard( - fgDisplay.Display, - fgStructure.GameModeWindow->Window.Handle, - FALSE, - GrabModeAsync, GrabModeAsync, - CurrentTime - ); - -#endif - - return fgStructure.GameModeWindow->ID; -} - -/* - * Leaves the game mode - */ -void FGAPIENTRY glutLeaveGameMode( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveGameMode" ); - - freeglut_return_if_fail( fgStructure.GameModeWindow ); - - fgAddToWindowDestroyList( fgStructure.GameModeWindow ); - fgStructure.GameModeWindow = NULL; - -#if TARGET_HOST_POSIX_X11 - - XUngrabPointer( fgDisplay.Display, CurrentTime ); - XUngrabKeyboard( fgDisplay.Display, CurrentTime ); - -#endif - - fghRestoreState(); -} - -/* - * Returns information concerning the freeglut game mode - */ -int FGAPIENTRY glutGameModeGet( GLenum eWhat ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeGet" ); - - switch( eWhat ) - { - case GLUT_GAME_MODE_ACTIVE: - return !!fgStructure.GameModeWindow; - - case GLUT_GAME_MODE_POSSIBLE: - return fghChangeDisplayMode( GL_TRUE ); - - case GLUT_GAME_MODE_WIDTH: - return fgState.GameModeSize.X; - - case GLUT_GAME_MODE_HEIGHT: - return fgState.GameModeSize.Y; - - case GLUT_GAME_MODE_PIXEL_DEPTH: - return fgState.GameModeDepth; - - case GLUT_GAME_MODE_REFRESH_RATE: - return fgState.GameModeRefresh; - - case GLUT_GAME_MODE_DISPLAY_CHANGED: - /* - * This is true if the game mode has been activated successfully.. - */ - return !!fgStructure.GameModeWindow; - } - - fgWarning( "Unknown gamemode get: %d", eWhat ); - return -1; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_geometry.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_geometry.c deleted file mode 100644 index 0b1779357..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_geometry.c +++ /dev/null @@ -1,1215 +0,0 @@ -/* - * freeglut_geometry.c - * - * Freeglut geometry rendering methods. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 3 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * Following functions have been contributed by Andreas Umbach. - * - * glutWireCube() -- looks OK - * glutSolidCube() -- OK - * - * Those functions have been implemented by John Fay. - * - * glutWireTorus() -- looks OK - * glutSolidTorus() -- looks OK - * glutWireDodecahedron() -- looks OK - * glutSolidDodecahedron() -- looks OK - * glutWireOctahedron() -- looks OK - * glutSolidOctahedron() -- looks OK - * glutWireTetrahedron() -- looks OK - * glutSolidTetrahedron() -- looks OK - * glutWireIcosahedron() -- looks OK - * glutSolidIcosahedron() -- looks OK - * - * The Following functions have been updated by Nigel Stewart, based - * on FreeGLUT 2.0.0 implementations: - * - * glutWireSphere() -- looks OK - * glutSolidSphere() -- looks OK - * glutWireCone() -- looks OK - * glutSolidCone() -- looks OK - */ - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Draws a wireframed cube. Code contributed by Andreas Umbach - */ -void FGAPIENTRY glutWireCube( GLdouble dSize ) -{ - double size = dSize * 0.5; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCube" ); - -# define V(a,b,c) glVertex3d( a size, b size, c size ); -# define N(a,b,c) glNormal3d( a, b, c ); - - /* PWO: I dared to convert the code to use macros... */ - glBegin( GL_LINE_LOOP ); N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); glEnd(); - glBegin( GL_LINE_LOOP ); N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); glEnd(); - glBegin( GL_LINE_LOOP ); N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); glEnd(); - glBegin( GL_LINE_LOOP ); N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); glEnd(); - glBegin( GL_LINE_LOOP ); N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); glEnd(); - glBegin( GL_LINE_LOOP ); N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd(); - -# undef V -# undef N -} - -/* - * Draws a solid cube. Code contributed by Andreas Umbach - */ -void FGAPIENTRY glutSolidCube( GLdouble dSize ) -{ - double size = dSize * 0.5; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCube" ); - -# define V(a,b,c) glVertex3d( a size, b size, c size ); -# define N(a,b,c) glNormal3d( a, b, c ); - - /* PWO: Again, I dared to convert the code to use macros... */ - glBegin( GL_QUADS ); - N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); - N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); - N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); - N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); - N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); - N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); - glEnd(); - -# undef V -# undef N -} - -/* - * Compute lookup table of cos and sin values forming a cirle - * - * Notes: - * It is the responsibility of the caller to free these tables - * The size of the table is (n+1) to form a connected loop - * The last entry is exactly the same as the first - * The sign of n can be flipped to get the reverse loop - */ - -static void fghCircleTable(double **sint,double **cost,const int n) -{ - int i; - - /* Table size, the sign of n flips the circle direction */ - - const int size = abs(n); - - /* Determine the angle between samples */ - - const double angle = 2*M_PI/(double)( ( n == 0 ) ? 1 : n ); - - /* Allocate memory for n samples, plus duplicate of first entry at the end */ - - *sint = (double *) calloc(sizeof(double), size+1); - *cost = (double *) calloc(sizeof(double), size+1); - - /* Bail out if memory allocation fails, fgError never returns */ - - if (!(*sint) || !(*cost)) - { - free(*sint); - free(*cost); - fgError("Failed to allocate memory in fghCircleTable"); - } - - /* Compute cos and sin around the circle */ - - (*sint)[0] = 0.0; - (*cost)[0] = 1.0; - - for (i=1; i0)?1:0]; - r0 = 0.0; - r1 = sint2[(stacks>0)?1:0]; - - glBegin(GL_TRIANGLE_FAN); - - glNormal3d(0,0,1); - glVertex3d(0,0,radius); - - for (j=slices; j>=0; j--) - { - glNormal3d(cost1[j]*r1, sint1[j]*r1, z1 ); - glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius); - } - - glEnd(); - - /* Cover each stack with a quad strip, except the top and bottom stacks */ - - for( i=1; i 0 ) ? stacks : 1 ); - const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); - - /* Scaling factors for vertex normals */ - - const double cosn = ( height / sqrt ( height * height + base * base )); - const double sinn = ( base / sqrt ( height * height + base * base )); - - /* Pre-computed circle */ - - double *sint,*cost; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCone" ); - - fghCircleTable(&sint,&cost,-slices); - - /* Cover the circular base with a triangle fan... */ - - z0 = 0.0; - z1 = zStep; - - r0 = base; - r1 = r0 - rStep; - - glBegin(GL_TRIANGLE_FAN); - - glNormal3d(0.0,0.0,-1.0); - glVertex3d(0.0,0.0, z0 ); - - for (j=0; j<=slices; j++) - glVertex3d(cost[j]*r0, sint[j]*r0, z0); - - glEnd(); - - /* Cover each stack with a quad strip, except the top stack */ - - for( i=0; i 0 ) ? stacks : 1 ); - const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); - - /* Scaling factors for vertex normals */ - - const double cosn = ( height / sqrt ( height * height + base * base )); - const double sinn = ( base / sqrt ( height * height + base * base )); - - /* Pre-computed circle */ - - double *sint,*cost; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCone" ); - - fghCircleTable(&sint,&cost,-slices); - - /* Draw the stacks... */ - - for (i=0; i 0 ) ? stacks : 1 ); - - /* Pre-computed circle */ - - double *sint,*cost; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCylinder" ); - - fghCircleTable(&sint,&cost,-slices); - - /* Cover the base and top */ - - glBegin(GL_TRIANGLE_FAN); - glNormal3d(0.0, 0.0, -1.0 ); - glVertex3d(0.0, 0.0, 0.0 ); - for (j=0; j<=slices; j++) - glVertex3d(cost[j]*radius, sint[j]*radius, 0.0); - glEnd(); - - glBegin(GL_TRIANGLE_FAN); - glNormal3d(0.0, 0.0, 1.0 ); - glVertex3d(0.0, 0.0, height); - for (j=slices; j>=0; j--) - glVertex3d(cost[j]*radius, sint[j]*radius, height); - glEnd(); - - /* Do the stacks */ - - z0 = 0.0; - z1 = zStep; - - for (i=1; i<=stacks; i++) - { - if (i==stacks) - z1 = height; - - glBegin(GL_QUAD_STRIP); - for (j=0; j<=slices; j++ ) - { - glNormal3d(cost[j], sint[j], 0.0 ); - glVertex3d(cost[j]*radius, sint[j]*radius, z0 ); - glVertex3d(cost[j]*radius, sint[j]*radius, z1 ); - } - glEnd(); - - z0 = z1; z1 += zStep; - } - - /* Release sin and cos tables */ - - free(sint); - free(cost); -} - -/* - * Draws a wire cylinder - */ -void FGAPIENTRY glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks) -{ - int i,j; - - /* Step in z and radius as stacks are drawn. */ - - double z = 0.0; - const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); - - /* Pre-computed circle */ - - double *sint,*cost; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCylinder" ); - - fghCircleTable(&sint,&cost,-slices); - - /* Draw the stacks... */ - - for (i=0; i<=stacks; i++) - { - if (i==stacks) - z = height; - - glBegin(GL_LINE_LOOP); - - for( j=0; j 0 ) - { - GLdouble local_offset[3] ; /* Use a local variable to avoid buildup of roundoff errors */ - num_levels -- ; - scale /= 2.0 ; - for ( i = 0 ; i < NUM_TETR_FACES ; i++ ) - { - local_offset[0] = offset[0] + scale * tet_r[i][0] ; - local_offset[1] = offset[1] + scale * tet_r[i][1] ; - local_offset[2] = offset[2] + scale * tet_r[i][2] ; - glutWireSierpinskiSponge ( num_levels, local_offset, scale ) ; - } - } -} - -void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale ) -{ - int i, j ; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidSierpinskiSponge" ); - - if ( num_levels == 0 ) - { - glBegin ( GL_TRIANGLES ) ; - - for ( i = 0 ; i < NUM_TETR_FACES ; i++ ) - { - glNormal3d ( -tet_r[i][0], -tet_r[i][1], -tet_r[i][2] ) ; - for ( j = 0; j < 3; j++ ) - { - double x = offset[0] + scale * tet_r[tet_i[i][j]][0] ; - double y = offset[1] + scale * tet_r[tet_i[i][j]][1] ; - double z = offset[2] + scale * tet_r[tet_i[i][j]][2] ; - glVertex3d ( x, y, z ) ; - } - } - - glEnd () ; - } - else if ( num_levels > 0 ) - { - GLdouble local_offset[3] ; /* Use a local variable to avoid buildup of roundoff errors */ - num_levels -- ; - scale /= 2.0 ; - for ( i = 0 ; i < NUM_TETR_FACES ; i++ ) - { - local_offset[0] = offset[0] + scale * tet_r[i][0] ; - local_offset[1] = offset[1] + scale * tet_r[i][1] ; - local_offset[2] = offset[2] + scale * tet_r[i][2] ; - glutSolidSierpinskiSponge ( num_levels, local_offset, scale ) ; - } - } -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_glutfont_definitions.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_glutfont_definitions.c deleted file mode 100644 index 454ecb738..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_glutfont_definitions.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * freeglut_glutfont_definitions.c - * - * Bitmap and stroke fonts displaying. - * - * Copyright (c) 2003 Stephen J. Baker (whether he wants it or not). - * All Rights Reserved. - * Written by John F. Fay , who releases the - * copyright over to the "freeglut" project lead. - * Creation date: Mon July 21 2003 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * This file is necessary for the *nix version of "freeglut" because the - * original GLUT defined its font variables in rather an unusual way. - * Publicly, in "glut.h", they were defined as "void *". Privately, - * in one of the source code files, they were defined as pointers to a - * structure. Most compilers and linkers are satisfied with the "void *" - * and don't go any farther, but some of them balked. In particular, - * when compiling with "freeglut" and then trying to run using the GLUT - * ".so" library, some of them would give an error. So we are having to - * create this file to define the variables as pointers to an unusual - * structure to match GLUT. - */ - -/* - * freeglut_internal.h uses some GL types, but including the GL header portably - * is a bit tricky, so we include freeglut_std.h here, which contains the - * necessary machinery. But this poses another problem, caused by the ugly - * original defintion of the font constants in "classic" GLUT: They are defined - * as void* externally, so we move them temporarily out of the way by AN EXTREME - * CPP HACK. - */ - -#define glutStrokeRoman glutStrokeRomanIGNOREME -#define glutStrokeMonoRoman glutStrokeMonoRomanIGNOREME -#define glutBitmap9By15 glutBitmap9By15IGNOREME -#define glutBitmap8By13 glutBitmap8By13IGNOREME -#define glutBitmapTimesRoman10 glutBitmapTimesRoman10IGNOREME -#define glutBitmapTimesRoman24 glutBitmapTimesRoman24IGNOREME -#define glutBitmapHelvetica10 glutBitmapHelvetica10IGNOREME -#define glutBitmapHelvetica12 glutBitmapHelvetica12IGNOREME -#define glutBitmapHelvetica18 glutBitmapHelvetica18IGNOREME - -#include - -#undef glutStrokeRoman -#undef glutStrokeMonoRoman -#undef glutBitmap9By15 -#undef glutBitmap8By13 -#undef glutBitmapTimesRoman10 -#undef glutBitmapTimesRoman24 -#undef glutBitmapHelvetica10 -#undef glutBitmapHelvetica12 -#undef glutBitmapHelvetica18 - -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 - -struct freeglutStrokeFont -{ - const char *name ; - int num_chars ; - void *ch ; - float top ; - float bottom ; -}; - -struct freeglutBitmapFont -{ - const char *name ; - const int num_chars ; - const int first ; - const void *ch ; -}; - - -struct freeglutStrokeFont glutStrokeRoman ; -struct freeglutStrokeFont glutStrokeMonoRoman ; - -struct freeglutBitmapFont glutBitmap9By15 ; -struct freeglutBitmapFont glutBitmap8By13 ; -struct freeglutBitmapFont glutBitmapTimesRoman10 ; -struct freeglutBitmapFont glutBitmapTimesRoman24 ; -struct freeglutBitmapFont glutBitmapHelvetica10 ; -struct freeglutBitmapFont glutBitmapHelvetica12 ; -struct freeglutBitmapFont glutBitmapHelvetica18 ; - -#endif - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_init.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_init.c deleted file mode 100644 index 7893f058a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_init.c +++ /dev/null @@ -1,1166 +0,0 @@ -/* - * freeglut_init.c - * - * Various freeglut initialization functions. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 2 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#define FREEGLUT_BUILDING_LIB -#include -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 -#include /* LONG_MAX */ -#endif - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * fgDeinitialize() -- Win32's OK, X11 needs the OS-specific - * deinitialization done - * glutInitDisplayString() -- display mode string parsing - * - * Wouldn't it be cool to use gettext() for error messages? I just love - * bash saying "nie znaleziono pliku" instead of "file not found" :) - * Is gettext easily portable? - */ - -/* -- GLOBAL VARIABLES ----------------------------------------------------- */ - -/* - * A structure pointed by g_pDisplay holds all information - * regarding the display, screen, root window etc. - */ -SFG_Display fgDisplay; - -/* - * The settings for the current freeglut session - */ -SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */ - { 300, 300, GL_TRUE }, /* Size */ - GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH, /* DisplayMode */ - GL_FALSE, /* Initialised */ - GLUT_TRY_DIRECT_CONTEXT, /* DirectContext */ - GL_FALSE, /* ForceIconic */ - GL_FALSE, /* UseCurrentContext */ - GL_FALSE, /* GLDebugSwitch */ - GL_FALSE, /* XSyncSwitch */ - GLUT_KEY_REPEAT_ON, /* KeyRepeat */ - INVALID_MODIFIERS, /* Modifiers */ - 0, /* FPSInterval */ - 0, /* SwapCount */ - 0, /* SwapTime */ - 0, /* Time */ - { NULL, NULL }, /* Timers */ - { NULL, NULL }, /* FreeTimers */ - NULL, /* IdleCallback */ - 0, /* ActiveMenus */ - NULL, /* MenuStateCallback */ - NULL, /* MenuStatusCallback */ - { 640, 480, GL_TRUE }, /* GameModeSize */ - 16, /* GameModeDepth */ - 72, /* GameModeRefresh */ - GLUT_ACTION_EXIT, /* ActionOnWindowClose */ - GLUT_EXEC_STATE_INIT, /* ExecState */ - NULL, /* ProgramName */ - GL_FALSE, /* JoysticksInitialised */ - GL_FALSE, /* InputDevsInitialised */ - 1, /* AuxiliaryBufferNumber */ - 4, /* SampleNumber */ - 1, /* MajorVersion */ - 0, /* MajorVersion */ - 0, /* ContextFlags */ - 0 /* ContextProfile */ -}; - - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -#if TARGET_HOST_POSIX_X11 - -/* Return the atom associated with "name". */ -static Atom fghGetAtom(const char * name) -{ - return XInternAtom(fgDisplay.Display, name, False); -} - -/* - * Check if "property" is set on "window". The property's values are returned - * through "data". If the property is set and is of type "type", return the - * number of elements in "data". Return zero otherwise. In both cases, use - * "Xfree()" to free "data". - */ -static int fghGetWindowProperty(Window window, - Atom property, - Atom type, - unsigned char ** data) -{ - /* - * Caller always has to use "Xfree()" to free "data", since - * "XGetWindowProperty() always allocates one extra byte in prop_return - * [i.e. "data"] (even if the property is zero length) [..]". - */ - - int status; /* Returned by "XGetWindowProperty". */ - - Atom type_returned; - int temp_format; /* Not used. */ - unsigned long number_of_elements; - unsigned long temp_bytes_after; /* Not used. */ - - - status = XGetWindowProperty(fgDisplay.Display, - window, - property, - 0, - LONG_MAX, - False, - type, - &type_returned, - &temp_format, - &number_of_elements, - &temp_bytes_after, - data); - - FREEGLUT_INTERNAL_ERROR_EXIT(status == Success, - "XGetWindowProperty failled", - "fghGetWindowProperty"); - - if (type_returned != type) - { - number_of_elements = 0; - } - - return number_of_elements; -} - -/* Check if the window manager is NET WM compliant. */ -static int fghNetWMSupported(void) -{ - Atom wm_check; - Window ** window_ptr_1; - - int number_of_windows; - int net_wm_supported; - - - net_wm_supported = 0; - - wm_check = fghGetAtom("_NET_SUPPORTING_WM_CHECK"); - window_ptr_1 = malloc(sizeof(Window *)); - - /* - * Check that the window manager has set this property on the root window. - * The property must be the ID of a child window. - */ - number_of_windows = fghGetWindowProperty(fgDisplay.RootWindow, - wm_check, - XA_WINDOW, - (unsigned char **) window_ptr_1); - if (number_of_windows == 1) - { - Window ** window_ptr_2; - - window_ptr_2 = malloc(sizeof(Window *)); - - /* Check that the window has the same property set to the same value. */ - number_of_windows = fghGetWindowProperty(**window_ptr_1, - wm_check, - XA_WINDOW, - (unsigned char **) window_ptr_2); - if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2)) - { - /* NET WM compliant */ - net_wm_supported = 1; - } - - XFree(*window_ptr_2); - free(window_ptr_2); - } - - XFree(*window_ptr_1); - free(window_ptr_1); - - return net_wm_supported; -} - -/* Check if "hint" is present in "property" for "window". */ -int fgHintPresent(Window window, Atom property, Atom hint) -{ - Atom ** atoms_ptr; - int number_of_atoms; - int supported; - int i; - - supported = 0; - - atoms_ptr = malloc(sizeof(Atom *)); - number_of_atoms = fghGetWindowProperty(window, - property, - XA_ATOM, - (unsigned char **) atoms_ptr); - for (i = 0; i < number_of_atoms; i++) - { - if ((*atoms_ptr)[i] == hint) - { - supported = 1; - break; - } - } - - return supported; -} - -#endif /* TARGET_HOST_POSIX_X11 */ - - -/* - * A call to this function should initialize all the display stuff... - */ -static void fghInitialize( const char* displayName ) -{ -#if TARGET_HOST_POSIX_X11 - fgDisplay.Display = XOpenDisplay( displayName ); - - if( fgDisplay.Display == NULL ) - fgError( "failed to open display '%s'", XDisplayName( displayName ) ); - - if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) ) - fgError( "OpenGL GLX extension not supported by display '%s'", - XDisplayName( displayName ) ); - - fgDisplay.Screen = DefaultScreen( fgDisplay.Display ); - fgDisplay.RootWindow = RootWindow( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.ScreenWidth = DisplayWidth( - fgDisplay.Display, - fgDisplay.Screen - ); - fgDisplay.ScreenHeight = DisplayHeight( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.ScreenWidthMM = DisplayWidthMM( - fgDisplay.Display, - fgDisplay.Screen - ); - fgDisplay.ScreenHeightMM = DisplayHeightMM( - fgDisplay.Display, - fgDisplay.Screen - ); - - fgDisplay.Connection = ConnectionNumber( fgDisplay.Display ); - - /* Create the window deletion atom */ - fgDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW"); - - /* Create the state and full screen atoms */ - fgDisplay.State = None; - fgDisplay.StateFullScreen = None; - - if (fghNetWMSupported()) - { - const Atom supported = fghGetAtom("_NET_SUPPORTED"); - const Atom state = fghGetAtom("_NET_WM_STATE"); - - /* Check if the state hint is supported. */ - if (fgHintPresent(fgDisplay.RootWindow, supported, state)) - { - const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN"); - - fgDisplay.State = state; - - /* Check if the window manager supports full screen. */ - /** Check "_NET_WM_ALLOWED_ACTIONS" on our window instead? **/ - if (fgHintPresent(fgDisplay.RootWindow, supported, full_screen)) - { - fgDisplay.StateFullScreen = full_screen; - } - } - } - -#elif TARGET_HOST_MS_WINDOWS - - WNDCLASS wc; - ATOM atom; - - /* What we need to do is to initialize the fgDisplay global structure here. */ - fgDisplay.Instance = GetModuleHandle( NULL ); - - atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc ); - - if( atom == 0 ) - { - ZeroMemory( &wc, sizeof(WNDCLASS) ); - - /* - * Each of the windows should have its own device context, and we - * want redraw events during Vertical and Horizontal Resizes by - * the user. - * - * XXX Old code had "| CS_DBCLCKS" commented out. Plans for the - * XXX future? Dead-end idea? - */ - wc.lpfnWndProc = fgWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = fgDisplay.Instance; - wc.hIcon = LoadIcon( fgDisplay.Instance, _T("GLUT_ICON") ); - -#if defined(_WIN32_WCE) - wc.style = CS_HREDRAW | CS_VREDRAW; -#else - wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; - if (!wc.hIcon) - wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); -#endif - - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.lpszClassName = _T("FREEGLUT"); - - /* Register the window class */ - atom = RegisterClass( &wc ); - FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fghInitialize" ); - } - - /* The screen dimensions can be obtained via GetSystemMetrics() calls */ - fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN ); - fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN ); - - { - HWND desktop = GetDesktopWindow( ); - HDC context = GetDC( desktop ); - - fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE ); - fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE ); - - ReleaseDC( desktop, context ); - } - - /* Set the timer granularity to 1 ms */ - timeBeginPeriod ( 1 ); - -#endif - - fgState.Initialised = GL_TRUE; - - /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */ - fgInitialiseInputDevices(); -} - -/* - * Perform the freeglut deinitialization... - */ -void fgDeinitialize( void ) -{ - SFG_Timer *timer; - - if( !fgState.Initialised ) - { - fgWarning( "fgDeinitialize(): " - "no valid initialization has been performed" ); - return; - } - - /* If there was a menu created, destroy the rendering context */ - if( fgStructure.MenuContext ) - { -#if TARGET_HOST_POSIX_X11 - /* Note that the MVisualInfo is not owned by the MenuContext! */ - glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext ); -#endif - free( fgStructure.MenuContext ); - fgStructure.MenuContext = NULL; - } - - fgDestroyStructure( ); - - while( ( timer = fgState.Timers.First) ) - { - fgListRemove( &fgState.Timers, &timer->Node ); - free( timer ); - } - - while( ( timer = fgState.FreeTimers.First) ) - { - fgListRemove( &fgState.FreeTimers, &timer->Node ); - free( timer ); - } - -#if !defined(_WIN32_WCE) - if ( fgState.JoysticksInitialised ) - fgJoystickClose( ); - - if ( fgState.InputDevsInitialised ) - fgInputDeviceClose( ); -#endif /* !defined(_WIN32_WCE) */ - fgState.JoysticksInitialised = GL_FALSE; - fgState.InputDevsInitialised = GL_FALSE; - - fgState.MajorVersion = 1; - fgState.MinorVersion = 0; - fgState.ContextFlags = 0; - fgState.ContextProfile = 0; - - fgState.Initialised = GL_FALSE; - - fgState.Position.X = -1; - fgState.Position.Y = -1; - fgState.Position.Use = GL_FALSE; - - fgState.Size.X = 300; - fgState.Size.Y = 300; - fgState.Size.Use = GL_TRUE; - - fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH; - - fgState.DirectContext = GLUT_TRY_DIRECT_CONTEXT; - fgState.ForceIconic = GL_FALSE; - fgState.UseCurrentContext = GL_FALSE; - fgState.GLDebugSwitch = GL_FALSE; - fgState.XSyncSwitch = GL_FALSE; - fgState.ActionOnWindowClose = GLUT_ACTION_EXIT; - fgState.ExecState = GLUT_EXEC_STATE_INIT; - - fgState.KeyRepeat = GLUT_KEY_REPEAT_ON; - fgState.Modifiers = INVALID_MODIFIERS; - - fgState.GameModeSize.X = 640; - fgState.GameModeSize.Y = 480; - fgState.GameModeDepth = 16; - fgState.GameModeRefresh = 72; - - fgListInit( &fgState.Timers ); - fgListInit( &fgState.FreeTimers ); - - fgState.IdleCallback = NULL; - fgState.MenuStateCallback = ( FGCBMenuState )NULL; - fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL; - - fgState.SwapCount = 0; - fgState.SwapTime = 0; - fgState.FPSInterval = 0; - - if( fgState.ProgramName ) - { - free( fgState.ProgramName ); - fgState.ProgramName = NULL; - } - -#if TARGET_HOST_POSIX_X11 - - /* - * Make sure all X-client data we have created will be destroyed on - * display closing - */ - XSetCloseDownMode( fgDisplay.Display, DestroyAll ); - - /* - * Close the display connection, destroying all windows we have - * created so far - */ - XCloseDisplay( fgDisplay.Display ); - -#elif TARGET_HOST_MS_WINDOWS - - /* Reset the timer granularity */ - timeEndPeriod ( 1 ); - -#endif - - fgState.Initialised = GL_FALSE; -} - -/* - * Everything inside the following #ifndef is copied from the X sources. - */ - -#if TARGET_HOST_MS_WINDOWS - -/* - -Copyright 1985, 1986, 1987,1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -*/ - -#define NoValue 0x0000 -#define XValue 0x0001 -#define YValue 0x0002 -#define WidthValue 0x0004 -#define HeightValue 0x0008 -#define AllValues 0x000F -#define XNegative 0x0010 -#define YNegative 0x0020 - -/* - * XParseGeometry parses strings of the form - * "=x{+-}{+-}", where - * width, height, xoffset, and yoffset are unsigned integers. - * Example: "=80x24+300-49" - * The equal sign is optional. - * It returns a bitmask that indicates which of the four values - * were actually found in the string. For each value found, - * the corresponding argument is updated; for each value - * not found, the corresponding argument is left unchanged. - */ - -static int -ReadInteger(char *string, char **NextString) -{ - register int Result = 0; - int Sign = 1; - - if (*string == '+') - string++; - else if (*string == '-') - { - string++; - Sign = -1; - } - for (; (*string >= '0') && (*string <= '9'); string++) - { - Result = (Result * 10) + (*string - '0'); - } - *NextString = string; - if (Sign >= 0) - return Result; - else - return -Result; -} - -static int XParseGeometry ( - const char *string, - int *x, - int *y, - unsigned int *width, /* RETURN */ - unsigned int *height) /* RETURN */ -{ - int mask = NoValue; - register char *strind; - unsigned int tempWidth = 0, tempHeight = 0; - int tempX = 0, tempY = 0; - char *nextCharacter; - - if ( (string == NULL) || (*string == '\0')) - return mask; - if (*string == '=') - string++; /* ignore possible '=' at beg of geometry spec */ - - strind = (char *)string; - if (*strind != '+' && *strind != '-' && *strind != 'x') { - tempWidth = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= WidthValue; - } - - if (*strind == 'x' || *strind == 'X') { - strind++; - tempHeight = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= HeightValue; - } - - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempX = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= XNegative; - } - else - { - strind++; - tempX = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - } - mask |= XValue; - if ((*strind == '+') || (*strind == '-')) { - if (*strind == '-') { - strind++; - tempY = -ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - mask |= YNegative; - } - else - { - strind++; - tempY = ReadInteger(strind, &nextCharacter); - if (strind == nextCharacter) - return 0; - strind = nextCharacter; - } - mask |= YValue; - } - } - - /* If strind isn't at the end of the string the it's an invalid - geometry specification. */ - - if (*strind != '\0') return 0; - - if (mask & XValue) - *x = tempX; - if (mask & YValue) - *y = tempY; - if (mask & WidthValue) - *width = tempWidth; - if (mask & HeightValue) - *height = tempHeight; - return mask; -} -#endif - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Perform initialization. This usually happens on the program startup - * and restarting after glutMainLoop termination... - */ -void FGAPIENTRY glutInit( int* pargc, char** argv ) -{ - char* displayName = NULL; - char* geometry = NULL; - int i, j, argc = *pargc; - - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) - size_t sLen; -#if HAVE_ERRNO - errno_t err; -#endif -#endif - - if( fgState.Initialised ) - fgError( "illegal glutInit() reinitialization attempt" ); - - if (pargc && *pargc && argv && *argv && **argv) - { - fgState.ProgramName = strdup (*argv); - - if( !fgState.ProgramName ) - fgError ("Could not allocate space for the program's name."); - } - - fgCreateStructure( ); - - /* Get start time */ - fgState.Time = fgSystemTime(); - - /* check if GLUT_FPS env var is set */ -#ifndef _WIN32_WCE - { - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) && HAVE_ERRNO - char* fps = NULL; - err = _dupenv_s( &fps, &sLen, "GLUT_FPS" ); - if (err) - fgError("Error getting GLUT_FPS environment variable"); -#else - const char *fps = getenv( "GLUT_FPS" ); -#endif - if( fps ) - { - int interval; - sscanf( fps, "%d", &interval ); - - if( interval <= 0 ) - fgState.FPSInterval = 5000; /* 5000 millisecond default */ - else - fgState.FPSInterval = interval; - } - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) && HAVE_ERRNO - free ( fps ); fps = NULL; /* dupenv_s allocates a string that we must free */ -#endif - } - - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) && HAVE_ERRNO - err = _dupenv_s( &displayName, &sLen, "DISPLAY" ); - if (err) - fgError("Error getting DISPLAY environment variable"); -#else - displayName = getenv( "DISPLAY" ); -#endif - - for( i = 1; i < argc; i++ ) - { - if( strcmp( argv[ i ], "-display" ) == 0 ) - { - if( ++i >= argc ) - fgError( "-display parameter must be followed by display name" ); - - displayName = argv[ i ]; - - argv[ i - 1 ] = NULL; - argv[ i ] = NULL; - ( *pargc ) -= 2; - } - else if( strcmp( argv[ i ], "-geometry" ) == 0 ) - { - if( ++i >= argc ) - fgError( "-geometry parameter must be followed by window " - "geometry settings" ); - - geometry = argv[ i ]; - - argv[ i - 1 ] = NULL; - argv[ i ] = NULL; - ( *pargc ) -= 2; - } - else if( strcmp( argv[ i ], "-direct" ) == 0) - { - if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT ) - fgError( "parameters ambiguity, -direct and -indirect " - "cannot be both specified" ); - - fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT; - argv[ i ] = NULL; - ( *pargc )--; - } - else if( strcmp( argv[ i ], "-indirect" ) == 0 ) - { - if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT ) - fgError( "parameters ambiguity, -direct and -indirect " - "cannot be both specified" ); - - fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT; - argv[ i ] = NULL; - (*pargc)--; - } - else if( strcmp( argv[ i ], "-iconic" ) == 0 ) - { - fgState.ForceIconic = GL_TRUE; - argv[ i ] = NULL; - ( *pargc )--; - } - else if( strcmp( argv[ i ], "-gldebug" ) == 0 ) - { - fgState.GLDebugSwitch = GL_TRUE; - argv[ i ] = NULL; - ( *pargc )--; - } - else if( strcmp( argv[ i ], "-sync" ) == 0 ) - { - fgState.XSyncSwitch = GL_TRUE; - argv[ i ] = NULL; - ( *pargc )--; - } - } - - /* Compact {argv}. */ - for( i = j = 1; i < *pargc; i++, j++ ) - { - /* Guaranteed to end because there are "*pargc" arguments left */ - while ( argv[ j ] == NULL ) - j++; - if ( i != j ) - argv[ i ] = argv[ j ]; - } - -#endif /* _WIN32_WCE */ - - /* - * Have the display created now. If there wasn't a "-display" - * in the program arguments, we will use the DISPLAY environment - * variable for opening the X display (see code above): - */ - fghInitialize( displayName ); - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) && HAVE_ERRNO - free ( displayName ); displayName = NULL; /* dupenv_s allocates a string that we must free */ -#endif - - /* - * Geometry parsing deffered until here because we may need the screen - * size. - */ - - if (geometry ) - { - unsigned int parsedWidth, parsedHeight; - int mask = XParseGeometry( geometry, - &fgState.Position.X, &fgState.Position.Y, - &parsedWidth, &parsedHeight ); - /* TODO: Check for overflow? */ - fgState.Size.X = parsedWidth; - fgState.Size.Y = parsedHeight; - - if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) ) - fgState.Size.Use = GL_TRUE; - - if( mask & XNegative ) - fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X; - - if( mask & YNegative ) - fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y; - - if( (mask & (XValue|YValue)) == (XValue|YValue) ) - fgState.Position.Use = GL_TRUE; - } -} - -#if TARGET_HOST_MS_WINDOWS -void (__cdecl *__glutExitFunc)( int return_value ) = NULL; - -void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - glutInit(pargc, argv); -} -#endif - -/* - * Undoes all the "glutInit" stuff - */ -void FGAPIENTRY glutExit ( void ) -{ - fgDeinitialize (); -} - -/* - * Sets the default initial window position for new windows - */ -void FGAPIENTRY glutInitWindowPosition( int x, int y ) -{ - fgState.Position.X = x; - fgState.Position.Y = y; - - if( ( x >= 0 ) && ( y >= 0 ) ) - fgState.Position.Use = GL_TRUE; - else - fgState.Position.Use = GL_FALSE; -} - -/* - * Sets the default initial window size for new windows - */ -void FGAPIENTRY glutInitWindowSize( int width, int height ) -{ - fgState.Size.X = width; - fgState.Size.Y = height; - - if( ( width > 0 ) && ( height > 0 ) ) - fgState.Size.Use = GL_TRUE; - else - fgState.Size.Use = GL_FALSE; -} - -/* - * Sets the default display mode for all new windows - */ -void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ) -{ - /* We will make use of this value when creating a new OpenGL context... */ - fgState.DisplayMode = displayMode; -} - - -/* -- INIT DISPLAY STRING PARSING ------------------------------------------ */ - -static char* Tokens[] = -{ - "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", - "green", "index", "num", "red", "rgba", "rgb", "luminance", "stencil", - "single", "stereo", "samples", "slow", "win32pdf", "win32pfd", "xvisual", - "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor", - "xtruecolor", "xdirectcolor", - "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour", - "xtruecolour", "xdirectcolour", "borderless", "aux" -}; -#define NUM_TOKENS (sizeof(Tokens) / sizeof(*Tokens)) - -void FGAPIENTRY glutInitDisplayString( const char* displayMode ) -{ - int glut_state_flag = 0 ; - /* - * Unpack a lot of options from a character string. The options are - * delimited by blanks or tabs. - */ - char *token ; - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) - char *next_token = NULL; -#endif - size_t len = strlen ( displayMode ); - char *buffer = (char *)malloc ( (len+1) * sizeof(char) ); - memcpy ( buffer, displayMode, len ); - buffer[len] = '\0'; - - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) - token = strtok_s ( buffer, " \t", &next_token ); -#else - token = strtok ( buffer, " \t" ); -#endif - while ( token ) - { - /* Process this token */ - int i ; - - /* Temporary fix: Ignore any length specifications and at least - * process the basic token - * TODO: Fix this permanently - */ - size_t cleanlength = strcspn ( token, "=<>~!" ); - - for ( i = 0; i < NUM_TOKENS; i++ ) - { - if ( strncmp ( token, Tokens[i], cleanlength ) == 0 ) break ; - } - - switch ( i ) - { - case 0 : /* "alpha": Alpha color buffer precision in bits */ - glut_state_flag |= GLUT_ALPHA ; /* Somebody fix this for me! */ - break ; - - case 1 : /* "acca": Red, green, blue, and alpha accumulation buffer - precision in bits */ - break ; - - case 2 : /* "acc": Red, green, and blue accumulation buffer precision - in bits with zero bits alpha */ - glut_state_flag |= GLUT_ACCUM ; /* Somebody fix this for me! */ - break ; - - case 3 : /* "blue": Blue color buffer precision in bits */ - break ; - - case 4 : /* "buffer": Number of bits in the color index color buffer - */ - break ; - - case 5 : /* "conformant": Boolean indicating if the frame buffer - configuration is conformant or not */ - break ; - - case 6 : /* "depth": Number of bits of precsion in the depth buffer */ - glut_state_flag |= GLUT_DEPTH ; /* Somebody fix this for me! */ - break ; - - case 7 : /* "double": Boolean indicating if the color buffer is - double buffered */ - glut_state_flag |= GLUT_DOUBLE ; - break ; - - case 8 : /* "green": Green color buffer precision in bits */ - break ; - - case 9 : /* "index": Boolean if the color model is color index or not - */ - glut_state_flag |= GLUT_INDEX ; - break ; - - case 10 : /* "num": A special capability name indicating where the - value represents the Nth frame buffer configuration - matching the description string */ - break ; - - case 11 : /* "red": Red color buffer precision in bits */ - break ; - - case 12 : /* "rgba": Number of bits of red, green, blue, and alpha in - the RGBA color buffer */ - glut_state_flag |= GLUT_RGBA ; /* Somebody fix this for me! */ - break ; - - case 13 : /* "rgb": Number of bits of red, green, and blue in the - RGBA color buffer with zero bits alpha */ - glut_state_flag |= GLUT_RGB ; /* Somebody fix this for me! */ - break ; - - case 14 : /* "luminance": Number of bits of red in the RGBA and zero - bits of green, blue (alpha not specified) of color buffer - precision */ - glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */ - break ; - - case 15 : /* "stencil": Number of bits in the stencil buffer */ - glut_state_flag |= GLUT_STENCIL; /* Somebody fix this for me! */ - break ; - - case 16 : /* "single": Boolean indicate the color buffer is single - buffered */ - glut_state_flag |= GLUT_SINGLE ; - break ; - - case 17 : /* "stereo": Boolean indicating the color buffer supports - OpenGL-style stereo */ - glut_state_flag |= GLUT_STEREO ; - break ; - - case 18 : /* "samples": Indicates the number of multisamples to use - based on GLX's SGIS_multisample extension (for - antialiasing) */ - glut_state_flag |= GLUT_MULTISAMPLE ; /*Somebody fix this for me!*/ - break ; - - case 19 : /* "slow": Boolean indicating if the frame buffer - configuration is slow or not */ - break ; - - case 20 : /* "win32pdf": (incorrect spelling but was there before */ - case 21 : /* "win32pfd": matches the Win32 Pixel Format Descriptor by - number */ -#if TARGET_HOST_MS_WINDOWS -#endif - break ; - - case 22 : /* "xvisual": matches the X visual ID by number */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 23 : /* "xstaticgray": */ - case 29 : /* "xstaticgrey": boolean indicating if the frame buffer - configuration's X visual is of type StaticGray */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 24 : /* "xgrayscale": */ - case 30 : /* "xgreyscale": boolean indicating if the frame buffer - configuration's X visual is of type GrayScale */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 25 : /* "xstaticcolor": */ - case 31 : /* "xstaticcolour": boolean indicating if the frame buffer - configuration's X visual is of type StaticColor */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 26 : /* "xpseudocolor": */ - case 32 : /* "xpseudocolour": boolean indicating if the frame buffer - configuration's X visual is of type PseudoColor */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 27 : /* "xtruecolor": */ - case 33 : /* "xtruecolour": boolean indicating if the frame buffer - configuration's X visual is of type TrueColor */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 28 : /* "xdirectcolor": */ - case 34 : /* "xdirectcolour": boolean indicating if the frame buffer - configuration's X visual is of type DirectColor */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 35 : /* "borderless": windows should not have borders */ -#if TARGET_HOST_POSIX_X11 -#endif - break ; - - case 36 : /* "aux": some number of aux buffers */ - glut_state_flag |= GLUT_AUX; - break ; - - case 37 : /* Unrecognized */ - fgWarning ( "WARNING - Display string token not recognized: %s", - token ); - break ; - } - - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) - token = strtok_s ( NULL, " \t", &next_token ); -#else - token = strtok ( NULL, " \t" ); -#endif - } - - free ( buffer ); - - /* We will make use of this value when creating a new OpenGL context... */ - fgState.DisplayMode = glut_state_flag; -} - -/* -- SETTING OPENGL 3.0 CONTEXT CREATION PARAMETERS ---------------------- */ - -void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion ) -{ - /* We will make use of these valuse when creating a new OpenGL context... */ - fgState.MajorVersion = majorVersion; - fgState.MinorVersion = minorVersion; -} - - -void FGAPIENTRY glutInitContextFlags( int flags ) -{ - /* We will make use of this value when creating a new OpenGL context... */ - fgState.ContextFlags = flags; -} - -void FGAPIENTRY glutInitContextProfile( int profile ) -{ - /* We will make use of this value when creating a new OpenGL context... */ - fgState.ContextProfile = profile; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_input_devices.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_input_devices.c deleted file mode 100644 index 0e202fa65..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_input_devices.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - * freeglut_input_devices.c - * - * Handles miscellaneous input devices via direct serial-port access. - * Proper X11 XInput device support is not yet supported. - * Also lacks Mac support. - * - * Written by Joe Krahn 2005 - * - * Copyright (c) 2005 Stephen J. Baker. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA OR STEPHEN J. BAKER BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 -#if HAVE_ERRNO -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct { - int fd; - struct termios termio, termio_save; -} SERIALPORT; - -#elif TARGET_HOST_MS_WINDOWS -#include -#include -typedef struct { - HANDLE fh; - COMMTIMEOUTS timeouts_save; - DCB dcb_save; -} SERIALPORT; - -#endif - -/********************* Dialbox definitions ***********************/ - -#define DIAL_NUM_VALUATORS 8 - -/* dial parser state machine states */ -#define DIAL_NEW (-1) -#define DIAL_WHICH_DEVICE 0 -#define DIAL_VALUE_HIGH 1 -#define DIAL_VALUE_LOW 2 - -/* dial/button box commands */ -#define DIAL_INITIALIZE 0x20 -#define DIAL_SET_LEDS 0x75 -#define DIAL_SET_TEXT 0x61 -#define DIAL_SET_AUTO_DIALS 0x50 -#define DIAL_SET_AUTO_DELTA_DIALS 0x51 -#define DIAL_SET_FILTER 0x53 -#define DIAL_SET_BUTTONS_MOM_TYPE 0x71 -#define DIAL_SET_AUTO_MOM_BUTTONS 0x73 -#define DIAL_SET_ALL_LEDS 0x4b -#define DIAL_CLEAR_ALL_LEDS 0x4c - -/* dial/button box replies and events */ -#define DIAL_INITIALIZED 0x20 -#define DIAL_BASE 0x30 -#define DIAL_DELTA_BASE 0x40 -#define DIAL_PRESS_BASE 0xc0 -#define DIAL_RELEASE_BASE 0xe0 - -/* macros to determine reply type */ -#define IS_DIAL_EVENT(ch) (((ch)>=DIAL_BASE)&&((ch)=DIAL_PRESS_BASE)&&((ch)=DIAL_RELEASE_BASE)&&((ch)= 1400 ) && HAVE_ERRNO - char *dial_device=NULL; - size_t sLen; - errno_t err = _dupenv_s( &dial_device, &sLen, "GLUT_DIALS_SERIAL" ); - if (err) - fgError("Error getting GLUT_DIALS_SERIAL environment variable"); -#else - const char *dial_device=NULL; - dial_device = getenv ( "GLUT_DIALS_SERIAL" ); -#endif -#if TARGET_HOST_MS_WINDOWS - if (!dial_device){ - static char devname[256]; - DWORD size=sizeof(devname); - DWORD type = REG_SZ; - HKEY key; - if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\FreeGLUT",&key)==ERROR_SUCCESS) { - if (RegQueryValueExA(key,"DialboxSerialPort",NULL,&type,(LPBYTE)devname,&size)==ERROR_SUCCESS){ - dial_device=devname; - } - RegCloseKey(key); - } - } -#endif - if ( !dial_device ) return; - if ( !( dialbox_port = serial_open ( dial_device ) ) ) return; - /* will return true for VC8 (VC2005) and higher */ -#if TARGET_HOST_MS_WINDOWS && ( _MSC_VER >= 1400 ) && HAVE_ERRNO - free ( dial_device ); dial_device = NULL; /* dupenv_s allocates a string that we must free */ -#endif - serial_putchar(dialbox_port,DIAL_INITIALIZE); - glutTimerFunc ( 10, poll_dials, 0 ); - fgState.InputDevsInitialised = GL_TRUE; - } -} - -/* - * - */ -void fgInputDeviceClose( void ) -{ - if ( fgState.InputDevsInitialised ) - { - serial_close ( dialbox_port ); - dialbox_port = NULL; - fgState.InputDevsInitialised = GL_FALSE; - } -} - -/********************************************************************/ - -/* Check all windows for dialbox callbacks */ -static void fghcbEnumDialCallbacks ( SFG_Window *window, SFG_Enumerator *enumerator ) -{ - /* Built-in to INVOKE_WCB(): if window->Callbacks[CB_Dials] */ - INVOKE_WCB ( *window,Dials, ( ((int*)enumerator->data)[0], ((int*)enumerator->data)[1]) ); - fgEnumSubWindows ( window, fghcbEnumDialCallbacks, enumerator ); -} - -static void send_dial_event ( int num, int value ) -{ - SFG_Enumerator enumerator; - int data[2]; - data[0] = num; - data[1] = value; - enumerator.found = GL_FALSE; - enumerator.data = data; - fgEnumWindows ( fghcbEnumDialCallbacks, &enumerator ); -} - -/********************************************************************/ -static void poll_dials ( int id ) -{ - int data; - static int dial_state = DIAL_NEW; - static int dial_which; - static int dial_value; - static int dials[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - if ( !dialbox_port ) return; - - while ( (data=serial_getchar(dialbox_port)) != EOF ) - { - if ( ( dial_state > DIAL_WHICH_DEVICE ) || IS_DIAL_EVENT ( data ) ) - { - switch ( dial_state ) - { - case DIAL_WHICH_DEVICE: - dial_which = data - DIAL_BASE; - dial_state++; - break; - case DIAL_VALUE_HIGH: - dial_value = ( data << 8 ); - dial_state++; - break; - case DIAL_VALUE_LOW: - dial_value |= data; - if ( dial_value & 0x8000 ) dial_value -= 0x10000; - dials[dial_which] = dial_value; - send_dial_event ( dial_which + 1, dial_value * 360 / 256 ); - dial_state = DIAL_WHICH_DEVICE; - break; - default: - /* error: Impossible state value! */ - break; - } - } - else if ( data == DIAL_INITIALIZED ) - { - fgState.InputDevsInitialised = GL_TRUE; - dial_state = DIAL_WHICH_DEVICE; - serial_putchar(dialbox_port,DIAL_SET_AUTO_DIALS); - serial_putchar(dialbox_port,0xff); - serial_putchar(dialbox_port,0xff); - } - else /* Unknown data; try flushing. */ - serial_flush(dialbox_port); - } - - glutTimerFunc ( 2, poll_dials, 0 ); -} - - -/******** OS Specific Serial I/O routines *******/ -#if TARGET_HOST_POSIX_X11 /* ==> Linux/BSD/UNIX POSIX serial I/O */ -static SERIALPORT *serial_open ( const char *device ) -{ - int fd; - struct termios termio; - SERIALPORT *port; - - fd = open(device, O_RDWR | O_NONBLOCK ); - if (fd <0) { - perror(device); - return NULL; - } - - port = malloc(sizeof(SERIALPORT)); - memset(port, 0, sizeof(SERIALPORT)); - port->fd = fd; - - /* save current port settings */ - tcgetattr(fd,&port->termio_save); - - memset(&termio, 0, sizeof(termio)); - termio.c_cflag = CS8 | CREAD | HUPCL ; - termio.c_iflag = IGNPAR | IGNBRK ; - termio.c_cc[VTIME] = 0; /* inter-character timer */ - termio.c_cc[VMIN] = 1; /* block read until 1 chars received, when blocking I/O */ - - cfsetispeed(&termio, B9600); - cfsetospeed(&termio, B9600); - tcsetattr(fd,TCSANOW,&termio); - - serial_flush(port); - return port; -} - -static void serial_close(SERIALPORT *port) -{ - if (port) - { - /* restore old port settings */ - tcsetattr(port->fd,TCSANOW,&port->termio_save); - close(port->fd); - free(port); - } -} - -static int serial_getchar(SERIALPORT *port) -{ - unsigned char ch; - if (!port) return EOF; - if (read(port->fd,&ch,1)) return ch; - return EOF; -} - -static int serial_putchar(SERIALPORT *port, unsigned char ch){ - if (!port) return 0; - return write(port->fd,&ch,1); -} - -static void serial_flush ( SERIALPORT *port ) -{ - tcflush ( port->fd, TCIOFLUSH ); -} - -#elif TARGET_HOST_MS_WINDOWS - -static SERIALPORT *serial_open(const char *device){ - HANDLE fh; - DCB dcb={sizeof(DCB)}; - COMMTIMEOUTS timeouts; - SERIALPORT *port; - - fh = CreateFile(device,GENERIC_READ|GENERIC_WRITE,0,NULL, - OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); - if (!fh) return NULL; - - port = malloc(sizeof(SERIALPORT)); - ZeroMemory(port, sizeof(SERIALPORT)); - port->fh = fh; - - /* save current port settings */ - GetCommState(fh,&port->dcb_save); - GetCommTimeouts(fh,&port->timeouts_save); - - dcb.DCBlength=sizeof(DCB); - BuildCommDCB("96,n,8,1",&dcb); - SetCommState(fh,&dcb); - - ZeroMemory(&timeouts,sizeof(timeouts)); - timeouts.ReadTotalTimeoutConstant=1; - timeouts.WriteTotalTimeoutConstant=1; - SetCommTimeouts(fh,&timeouts); - - serial_flush(port); - - return port; -} - -static void serial_close(SERIALPORT *port){ - if (port){ - /* restore old port settings */ - SetCommState(port->fh,&port->dcb_save); - SetCommTimeouts(port->fh,&port->timeouts_save); - CloseHandle(port->fh); - free(port); - } -} - -static int serial_getchar(SERIALPORT *port){ - DWORD n; - unsigned char ch; - if (!port) return EOF; - if (!ReadFile(port->fh,&ch,1,&n,NULL)) return EOF; - if (n==1) return ch; - return EOF; -} - -static int serial_putchar(SERIALPORT *port, unsigned char ch){ - DWORD n; - if (!port) return 0; - return WriteFile(port->fh,&ch,1,&n,NULL); -} - -static void serial_flush ( SERIALPORT *port ) -{ - FlushFileBuffers(port->fh); -} - -#endif diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_internal.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_internal.h deleted file mode 100644 index 8d80acb9c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_internal.h +++ /dev/null @@ -1,967 +0,0 @@ -/* - * freeglut_internal.h - * - * The freeglut library private include file. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 2 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef FREEGLUT_INTERNAL_H -#define FREEGLUT_INTERNAL_H - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -/* XXX Update these for each release! */ -#define VERSION_MAJOR 2 -#define VERSION_MINOR 6 -#define VERSION_PATCH 0 - -/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */ -/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined? - * XXX: If so, remove the first set of defined()'s below. - */ -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \ - || defined(_WIN32) || defined(_WIN32_WCE) \ - || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) ) -# define TARGET_HOST_MS_WINDOWS 1 - -#elif defined(__posix__) || defined(__unix__) || defined(__linux__) -# define TARGET_HOST_POSIX_X11 1 - -#elif defined(__APPLE__) -/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */ -# define TARGET_HOST_POSIX_X11 1 -/* # define TARGET_HOST_MAC_OSX 1 */ - -#else -# error "Unrecognized target host!" -*/ -#endif - -/* Detect both SunPro and gcc compilers on Sun Solaris */ -#if defined (__SVR4) && defined (__sun) -# define TARGET_HOST_SOLARIS 1 -#endif - -#ifndef TARGET_HOST_MS_WINDOWS -# define TARGET_HOST_MS_WINDOWS 0 -#endif - -#ifndef TARGET_HOST_POSIX_X11 -# define TARGET_HOST_POSIX_X11 0 -#endif - -#ifndef TARGET_HOST_MAC_OSX -# define TARGET_HOST_MAC_OSX 0 -#endif - -#ifndef TARGET_HOST_SOLARIS -# define TARGET_HOST_SOLARIS 0 -#endif - -/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */ - -#define FREEGLUT_MAX_MENUS 3 - -/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */ - -/* All Win32 headers depend on the huge Windows.h recursive include. - * Note: Let's use proper case for MS-Win headers. Even though it's - * not required due to case insensitivity, it's a good habit to keep - * because the cross-platform includes are case sensitive. - */ -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -# include -# include -# include -/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */ -# ifndef __CYGWIN__ -# include -# else -# define _TEXT(x) TEXT(x) -# define _T(x) TEXT(x) -# endif - -#elif TARGET_HOST_POSIX_X11 -# include -# include -# include -# include -# include -# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H -# include -# endif -/* If GLX is too old, we will fail during runtime when multisampling - is requested, but at least freeglut compiles. */ -# ifndef GLX_SAMPLE_BUFFERS -# define GLX_SAMPLE_BUFFERS 0x80A8 -# endif -# ifndef GLX_SAMPLES -# define GLX_SAMPLES 0x80A9 -# endif - -#endif - -/* These files should be available on every platform. */ -#include -#include -#include -#include - -/* These are included based on autoconf directives. */ -#if HAVE_SYS_TYPES_H -# include -#endif -#if HAVE_UNISTD_H -# include -#endif -#if TIME_WITH_SYS_TIME -# include -# include -#elif HAVE_SYS_TIME_H -# include -#else -# include -#endif - -/* -- AUTOCONF HACKS --------------------------------------------------------*/ - -/* XXX: Update autoconf to avoid these. - * XXX: Are non-POSIX platforms intended not to use autoconf? - * If so, perhaps there should be a config_guess.h for them. Alternatively, - * config guesses could be placed above, just after the config.h exclusion. - */ -#if defined(__FreeBSD__) || defined(__NetBSD__) -# define HAVE_USB_JS 1 -# if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000) -# define HAVE_USBHID_H 1 -# endif -#endif - -#if TARGET_HOST_MS_WINDOWS -# define HAVE_VPRINTF 1 -#endif - -#if !defined(HAVE_VPRINTF) && !defined(HAVE_DOPRNT) -/* XXX warning directive here? */ -# define HAVE_VPRINTF 1 -#endif - -/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */ -#if TARGET_HOST_MS_WINDOWS && !defined(ChangeDisplaySettingsEx) -LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID); -LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); -# ifdef UNICODE -# define ChangeDisplaySettingsEx ChangeDisplaySettingsExW -# else -# define ChangeDisplaySettingsEx ChangeDisplaySettingsExA -# endif -#endif - -#if defined(_MSC_VER) || defined(__WATCOMC__) -/* strdup() is non-standard, for all but POSIX-2001 */ -#define strdup _strdup -#endif - -/* M_PI is non-standard (defined by BSD, not ISO-C) */ -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif - -#ifndef TRUE -# define TRUE 1 -#endif - -#ifndef FALSE -# define FALSE 0 -#endif - -/* General defines */ - -#define INVALID_MODIFIERS 0xffffffff - -/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ - -/* Freeglut callbacks type definitions */ -typedef void (* FGCBDisplay )( void ); -typedef void (* FGCBReshape )( int, int ); -typedef void (* FGCBVisibility )( int ); -typedef void (* FGCBKeyboard )( unsigned char, int, int ); -typedef void (* FGCBSpecial )( int, int, int ); -typedef void (* FGCBMouse )( int, int, int, int ); -typedef void (* FGCBMouseWheel )( int, int, int, int ); -typedef void (* FGCBMotion )( int, int ); -typedef void (* FGCBPassive )( int, int ); -typedef void (* FGCBEntry )( int ); -typedef void (* FGCBWindowStatus )( int ); -typedef void (* FGCBSelect )( int, int, int ); -typedef void (* FGCBJoystick )( unsigned int, int, int, int ); -typedef void (* FGCBKeyboardUp )( unsigned char, int, int ); -typedef void (* FGCBSpecialUp )( int, int, int ); -typedef void (* FGCBOverlayDisplay)( void ); -typedef void (* FGCBSpaceMotion )( int, int, int ); -typedef void (* FGCBSpaceRotation )( int, int, int ); -typedef void (* FGCBSpaceButton )( int, int ); -typedef void (* FGCBDials )( int, int ); -typedef void (* FGCBButtonBox )( int, int ); -typedef void (* FGCBTabletMotion )( int, int ); -typedef void (* FGCBTabletButton )( int, int, int, int ); -typedef void (* FGCBDestroy )( void ); - -/* The global callbacks type definitions */ -typedef void (* FGCBIdle )( void ); -typedef void (* FGCBTimer )( int ); -typedef void (* FGCBMenuState )( int ); -typedef void (* FGCBMenuStatus )( int, int, int ); - -/* The callback used when creating/using menus */ -typedef void (* FGCBMenu )( int ); - - -/* A list structure */ -typedef struct tagSFG_List SFG_List; -struct tagSFG_List -{ - void *First; - void *Last; -}; - -/* A list node structure */ -typedef struct tagSFG_Node SFG_Node; -struct tagSFG_Node -{ - void *Next; - void *Prev; -}; - -/* A helper structure holding two ints and a boolean */ -typedef struct tagSFG_XYUse SFG_XYUse; -struct tagSFG_XYUse -{ - GLint X, Y; /* The two integers... */ - GLboolean Use; /* ...and a single boolean. */ -}; - -/* - * An enumeration containing the state of the GLUT execution: - * initializing, running, or stopping - */ -typedef enum -{ - GLUT_EXEC_STATE_INIT, - GLUT_EXEC_STATE_RUNNING, - GLUT_EXEC_STATE_STOP -} fgExecutionState ; - -/* This structure holds different freeglut settings */ -typedef struct tagSFG_State SFG_State; -struct tagSFG_State -{ - SFG_XYUse Position; /* The default windows' position */ - SFG_XYUse Size; /* The default windows' size */ - unsigned int DisplayMode; /* Display mode for new windows */ - - GLboolean Initialised; /* freeglut has been initialised */ - - int DirectContext; /* Direct rendering state */ - - GLboolean ForceIconic; /* New top windows are iconified */ - GLboolean UseCurrentContext; /* New windows share with current */ - - GLboolean GLDebugSwitch; /* OpenGL state debugging switch */ - GLboolean XSyncSwitch; /* X11 sync protocol switch */ - - int KeyRepeat; /* Global key repeat mode. */ - int Modifiers; /* Current ALT/SHIFT/CTRL state */ - - GLuint FPSInterval; /* Interval between FPS printfs */ - GLuint SwapCount; /* Count of glutSwapBuffer calls */ - GLuint SwapTime; /* Time of last SwapBuffers */ - - unsigned long Time; /* Time that glutInit was called */ - SFG_List Timers; /* The freeglut timer hooks */ - SFG_List FreeTimers; /* The unused timer hooks */ - - FGCBIdle IdleCallback; /* The global idle callback */ - - int ActiveMenus; /* Num. of currently active menus */ - FGCBMenuState MenuStateCallback; /* Menu callbacks are global */ - FGCBMenuStatus MenuStatusCallback; - - SFG_XYUse GameModeSize; /* Game mode screen's dimensions */ - int GameModeDepth; /* The pixel depth for game mode */ - int GameModeRefresh; /* The refresh rate for game mode */ - - int ActionOnWindowClose; /* Action when user closes window */ - - fgExecutionState ExecState; /* Used for GLUT termination */ - char *ProgramName; /* Name of the invoking program */ - GLboolean JoysticksInitialised; /* Only initialize if application calls for them */ - GLboolean InputDevsInitialised; /* Only initialize if application calls for them */ - - int AuxiliaryBufferNumber; /* Number of auxiliary buffers */ - int SampleNumber; /* Number of samples per pixel */ - - int MajorVersion; /* Major OpenGL context version */ - int MinorVersion; /* Minor OpenGL context version */ - int ContextFlags; /* OpenGL context flags */ - int ContextProfile; /* OpenGL context profile */ -}; - -/* The structure used by display initialization in freeglut_init.c */ -typedef struct tagSFG_Display SFG_Display; -struct tagSFG_Display -{ -#if TARGET_HOST_POSIX_X11 - Display* Display; /* The display we are being run in. */ - int Screen; /* The screen we are about to use. */ - Window RootWindow; /* The screen's root window. */ - int Connection; /* The display's connection number */ - Atom DeleteWindow; /* The window deletion atom */ - Atom State; /* The state atom */ - Atom StateFullScreen; /* The full screen atom */ - -#ifdef X_XF86VidModeGetModeLine - /* - * XF86VidMode may be compilable even if it fails at runtime. Therefore, - * the validity of the VidMode has to be tracked - */ - int DisplayModeValid; /* Flag that indicates runtime status*/ - XF86VidModeModeLine DisplayMode; /* Current screen's display settings */ - int DisplayModeClock; /* The display mode's refresh rate */ - int DisplayViewPortX; /* saved X location of the viewport */ - int DisplayViewPortY; /* saved Y location of the viewport */ - int DisplayPointerX; /* saved X location of the pointer */ - int DisplayPointerY; /* saved Y location of the pointer */ - -#endif /* X_XF86VidModeGetModeLine */ - -#elif TARGET_HOST_MS_WINDOWS - HINSTANCE Instance; /* The application's instance */ - DEVMODE DisplayMode; /* Desktop's display settings */ - -#endif - - int ScreenWidth; /* The screen's width in pixels */ - int ScreenHeight; /* The screen's height in pixels */ - int ScreenWidthMM; /* The screen's width in milimeters */ - int ScreenHeightMM; /* The screen's height in milimeters */ -}; - - -/* The user can create any number of timer hooks */ -typedef struct tagSFG_Timer SFG_Timer; -struct tagSFG_Timer -{ - SFG_Node Node; - int ID; /* The timer ID integer */ - FGCBTimer Callback; /* The timer callback */ - long TriggerTime; /* The timer trigger time */ -}; - -/* - * Make "freeglut" window handle and context types so that we don't need so - * much conditionally-compiled code later in the library. - */ -#if TARGET_HOST_POSIX_X11 - -typedef Window SFG_WindowHandleType ; -typedef GLXContext SFG_WindowContextType ; - -#elif TARGET_HOST_MS_WINDOWS - -typedef HWND SFG_WindowHandleType ; -typedef HGLRC SFG_WindowContextType ; - -#endif - -/* - * A window and its OpenGL context. The contents of this structure - * are highly dependant on the target operating system we aim at... - */ -typedef struct tagSFG_Context SFG_Context; -struct tagSFG_Context -{ - SFG_WindowHandleType Handle; /* The window's handle */ - SFG_WindowContextType Context; /* The window's OpenGL/WGL context */ - -#if TARGET_HOST_POSIX_X11 - GLXFBConfig* FBConfig; /* The window's FBConfig */ -#elif TARGET_HOST_MS_WINDOWS - HDC Device; /* The window's device context */ -#endif - - int DoubleBuffered; /* Treat the window as double-buffered */ -}; - -/* Window's state description. This structure should be kept portable. */ -typedef struct tagSFG_WindowState SFG_WindowState; -struct tagSFG_WindowState -{ - int Width; /* Window's width in pixels */ - int Height; /* The same about the height */ - int OldWidth; /* Window width from before a resize */ - int OldHeight; /* " height " " " " */ - - GLboolean Redisplay; /* Do we have to redisplay? */ - GLboolean Visible; /* Is the window visible now */ - - int Cursor; /* The currently selected cursor */ - - long JoystickPollRate; /* The joystick polling rate */ - long JoystickLastPoll; /* When the last poll happened */ - - int MouseX, MouseY; /* The most recent mouse position */ - - GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */ - GLboolean KeyRepeating; /* Currently in repeat mode */ - - GLboolean NeedToResize; /* Do we need to resize the window? */ - - GLboolean IsFullscreen; /* is the window fullscreen? */ -}; - - -/* - * A generic function pointer. We should really use the GLUTproc type - * defined in freeglut_ext.h, but if we include that header in this file - * a bunch of other stuff (font-related) blows up! - */ -typedef void (*SFG_Proc)(); - - -/* - * SET_WCB() is used as: - * - * SET_WCB( window, cbname, func ); - * - * ...where {window} is the freeglut window to set the callback, - * {cbname} is the window-specific callback to set, - * {func} is a function-pointer. - * - * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used, - * but this can cause warnings because the FETCH_WCB() macro type- - * casts its result, and a type-cast value shouldn't be an lvalue. - * - * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking - * and for no other reason. Since it's hidden in the macro, the - * ugliness is felt to be rather benign. - */ -#define SET_WCB(window,cbname,func) \ -do \ -{ \ - if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) ) \ - (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \ -} while( 0 ) - -/* - * FETCH_WCB() is used as: - * - * FETCH_WCB( window, cbname ); - * - * ...where {window} is the freeglut window to fetch the callback from, - * {cbname} is the window-specific callback to fetch. - * - * The result is correctly type-cast to the callback function pointer - * type. - */ -#define FETCH_WCB(window,cbname) \ - ((window).CallBacks[CB_ ## cbname]) - -/* - * INVOKE_WCB() is used as: - * - * INVOKE_WCB( window, cbname, ( arg_list ) ); - * - * ...where {window} is the freeglut window, - * {cbname} is the window-specific callback to be invoked, - * {(arg_list)} is the parameter list. - * - * The callback is invoked as: - * - * callback( arg_list ); - * - * ...so the parentheses are REQUIRED in the {arg_list}. - * - * NOTE that it does a sanity-check and also sets the - * current window. - * - */ -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */ -#define INVOKE_WCB(window,cbname,arg_list) \ -do \ -{ \ - if( FETCH_WCB( window, cbname ) ) \ - { \ - FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \ - fgSetWindow( &window ); \ - func arg_list; \ - } \ -} while( 0 ) -#else -#define INVOKE_WCB(window,cbname,arg_list) \ -do \ -{ \ - if( FETCH_WCB( window, cbname ) ) \ - { \ - fgSetWindow( &window ); \ - ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \ - } \ -} while( 0 ) -#endif - -/* - * The window callbacks the user can supply us with. Should be kept portable. - * - * This enumeration provides the freeglut CallBack numbers. - * The symbolic constants are indices into a window's array of - * function callbacks. The names are formed by splicing a common - * prefix onto the callback's base name. (This was originally - * done so that an early stage of development could live side-by- - * side with the old callback code. The old callback code used - * the bare callback's name as a structure member, so I used a - * prefix for the array index name.) - * - * XXX For consistancy, perhaps the prefix should match the - * XXX FETCH* and INVOKE* macro suffices. I.e., WCB_, rather than - * XXX CB_. - */ -enum -{ - CB_Display, - CB_Reshape, - CB_Keyboard, - CB_KeyboardUp, - CB_Special, - CB_SpecialUp, - CB_Mouse, - CB_MouseWheel, - CB_Motion, - CB_Passive, - CB_Entry, - CB_Visibility, - CB_WindowStatus, - CB_Joystick, - CB_Destroy, - - /* Presently ignored */ - CB_Select, - CB_OverlayDisplay, - CB_SpaceMotion, /* presently implemented only on UNIX/X11 */ - CB_SpaceRotation, /* presently implemented only on UNIX/X11 */ - CB_SpaceButton, /* presently implemented only on UNIX/X11 */ - CB_Dials, - CB_ButtonBox, - CB_TabletMotion, - CB_TabletButton, - - /* Always make this the LAST one */ - TOTAL_CALLBACKS -}; - - -/* This structure holds the OpenGL rendering context for all the menu windows */ -typedef struct tagSFG_MenuContext SFG_MenuContext; -struct tagSFG_MenuContext -{ - SFG_WindowContextType MContext; /* The menu window's WGL context */ -}; - -/* This structure describes a menu */ -typedef struct tagSFG_Window SFG_Window; -typedef struct tagSFG_MenuEntry SFG_MenuEntry; -typedef struct tagSFG_Menu SFG_Menu; -struct tagSFG_Menu -{ - SFG_Node Node; - void *UserData; /* User data passed back at callback */ - int ID; /* The global menu ID */ - SFG_List Entries; /* The menu entries list */ - FGCBMenu Callback; /* The menu callback */ - FGCBDestroy Destroy; /* Destruction callback */ - GLboolean IsActive; /* Is the menu selected? */ - int Width; /* Menu box width in pixels */ - int Height; /* Menu box height in pixels */ - int X, Y; /* Menu box raster position */ - - SFG_MenuEntry *ActiveEntry; /* Currently active entry in the menu */ - SFG_Window *Window; /* Window for menu */ - SFG_Window *ParentWindow; /* Window in which the menu is invoked */ -}; - -/* This is a menu entry */ -struct tagSFG_MenuEntry -{ - SFG_Node Node; - int ID; /* The menu entry ID (local) */ - int Ordinal; /* The menu's ordinal number */ - char* Text; /* The text to be displayed */ - SFG_Menu* SubMenu; /* Optional sub-menu tree */ - GLboolean IsActive; /* Is the entry highlighted? */ - int Width; /* Label's width in pixels */ -}; - -/* - * A window, making part of freeglut windows hierarchy. - * Should be kept portable. - * - * NOTE that ActiveMenu is set to menu itself if the window is a menu. - */ -struct tagSFG_Window -{ - SFG_Node Node; - int ID; /* Window's ID number */ - - SFG_Context Window; /* Window and OpenGL context */ - SFG_WindowState State; /* The window state */ - SFG_Proc CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */ - void *UserData ; /* For use by user */ - - SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */ - SFG_Menu* ActiveMenu; /* The window's active menu */ - - SFG_Window* Parent; /* The parent to this window */ - SFG_List Children; /* The subwindows d.l. list */ - - GLboolean IsMenu; /* Set to 1 if we are a menu */ -}; - - -/* A linked list structure of windows */ -typedef struct tagSFG_WindowList SFG_WindowList ; -struct tagSFG_WindowList -{ - SFG_Node node; - SFG_Window *window ; -}; - -/* This holds information about all the windows, menus etc. */ -typedef struct tagSFG_Structure SFG_Structure; -struct tagSFG_Structure -{ - SFG_List Windows; /* The global windows list */ - SFG_List Menus; /* The global menus list */ - SFG_List WindowsToDestroy; - - SFG_Window* CurrentWindow; /* The currently set window */ - SFG_Menu* CurrentMenu; /* Same, but menu... */ - - SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */ - - SFG_Window* GameModeWindow; /* The game mode window */ - - int WindowID; /* The new current window ID */ - int MenuID; /* The new current menu ID */ -}; - -/* - * This structure is used for the enumeration purposes. - * You can easily extend its functionalities by declaring - * a structure containing enumerator's contents and custom - * data, then casting its pointer to (SFG_Enumerator *). - */ -typedef struct tagSFG_Enumerator SFG_Enumerator; -struct tagSFG_Enumerator -{ - GLboolean found; /* Used to terminate search */ - void* data; /* Custom data pointer */ -}; -typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * ); - -/* The bitmap font structure */ -typedef struct tagSFG_Font SFG_Font; -struct tagSFG_Font -{ - char* Name; /* The source font name */ - int Quantity; /* Number of chars in font */ - int Height; /* Height of the characters */ - const GLubyte** Characters; /* The characters mapping */ - - float xorig, yorig; /* Relative origin of the character */ -}; - -/* The stroke font structures */ - -typedef struct tagSFG_StrokeVertex SFG_StrokeVertex; -struct tagSFG_StrokeVertex -{ - GLfloat X, Y; -}; - -typedef struct tagSFG_StrokeStrip SFG_StrokeStrip; -struct tagSFG_StrokeStrip -{ - int Number; - const SFG_StrokeVertex* Vertices; -}; - -typedef struct tagSFG_StrokeChar SFG_StrokeChar; -struct tagSFG_StrokeChar -{ - GLfloat Right; - int Number; - const SFG_StrokeStrip* Strips; -}; - -typedef struct tagSFG_StrokeFont SFG_StrokeFont; -struct tagSFG_StrokeFont -{ - char* Name; /* The source font name */ - int Quantity; /* Number of chars in font */ - GLfloat Height; /* Height of the characters */ - const SFG_StrokeChar** Characters; /* The characters mapping */ -}; - -/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */ - -/* Freeglut display related stuff (initialized once per session) */ -extern SFG_Display fgDisplay; - -/* Freeglut internal structure */ -extern SFG_Structure fgStructure; - -/* The current freeglut settings */ -extern SFG_State fgState; - - -/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */ - -/* - * A call to this function makes us sure that the Display and Structure - * subsystems have been properly initialized and are ready to be used - */ -#define FREEGLUT_EXIT_IF_NOT_INITIALISED( string ) \ - if ( ! fgState.Initialised ) \ - { \ - fgError ( " ERROR: Function <%s> called" \ - " without first calling 'glutInit'.", (string) ) ; \ - } - -#define FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED( string ) \ - if ( ! fgState.Initialised ) \ - { \ - fgError ( " ERROR: Internal <%s> function called" \ - " without first calling 'glutInit'.", (string) ) ; \ - } - -#define FREEGLUT_INTERNAL_ERROR_EXIT( cond, string, function ) \ - if ( ! ( cond ) ) \ - { \ - fgError ( " ERROR: Internal error <%s> in function %s", \ - (string), (function) ) ; \ - } - -/* - * Following definitions are somewhat similiar to GLib's, - * but do not generate any log messages: - */ -#define freeglut_return_if_fail( expr ) \ - if( !(expr) ) \ - return; -#define freeglut_return_val_if_fail( expr, val ) \ - if( !(expr) ) \ - return val ; - -/* - * A call to those macros assures us that there is a current - * window set, respectively: - */ -#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \ - if ( ! fgStructure.CurrentWindow ) \ - { \ - fgError ( " ERROR: Function <%s> called" \ - " with no current window defined.", (string) ) ; \ - } - -/* - * The deinitialize function gets called on glutMainLoop() end. It should clean up - * everything inside of the freeglut - */ -void fgDeinitialize( void ); - -/* - * Those two functions are used to create/destroy the freeglut internal - * structures. This actually happens when calling glutInit() and when - * quitting the glutMainLoop() (which actually happens, when all windows - * have been closed). - */ -void fgCreateStructure( void ); -void fgDestroyStructure( void ); - -/* A helper function to check if a display mode is possible to use */ -#if TARGET_HOST_POSIX_X11 -GLXFBConfig* fgChooseFBConfig( void ); -#endif - -/* The window procedure for Win32 events handling */ -#if TARGET_HOST_MS_WINDOWS -LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, - WPARAM wParam, LPARAM lParam ); -void fgNewWGLCreateContext( SFG_Window* window ); -GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, - unsigned char layer_type ); -#endif - -/* - * Window creation, opening, closing and destruction. - * Also CallBack clearing/initialization. - * Defined in freeglut_structure.c, freeglut_window.c. - */ -SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, - GLboolean positionUse, int x, int y, - GLboolean sizeUse, int w, int h, - GLboolean gameMode, GLboolean isMenu ); -void fgSetWindow ( SFG_Window *window ); -void fgOpenWindow( SFG_Window* window, const char* title, - GLboolean positionUse, int x, int y, - GLboolean sizeUse, int w, int h, - GLboolean gameMode, GLboolean isSubWindow ); -void fgCloseWindow( SFG_Window* window ); -void fgAddToWindowDestroyList ( SFG_Window* window ); -void fgCloseWindows (); -void fgDestroyWindow( SFG_Window* window ); - -/* Menu creation and destruction. Defined in freeglut_structure.c */ -SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ); -void fgDestroyMenu( SFG_Menu* menu ); - -/* Joystick device management functions, defined in freeglut_joystick.c */ -int fgJoystickDetect( void ); -void fgInitialiseJoysticks( void ); -void fgJoystickClose( void ); -void fgJoystickPollWindow( SFG_Window* window ); - -/* InputDevice Initialisation and Closure */ -int fgInputDeviceDetect( void ); -void fgInitialiseInputDevices( void ); -void fgInputDeviceClose( void ); - -/* spaceball device functions, defined in freeglut_spaceball.c */ -void fgInitialiseSpaceball( void ); -void fgSpaceballClose( void ); -void fgSpaceballSetWindow( SFG_Window *window ); - -int fgHasSpaceball( void ); -int fgSpaceballNumButtons( void ); - -#if TARGET_HOST_POSIX_X11 -int fgIsSpaceballXEvent( const XEvent *ev ); -void fgSpaceballHandleXEvent( const XEvent *ev ); -#endif - -/* Setting the cursor for a given window */ -void fgSetCursor ( SFG_Window *window, int cursorID ); - -/* - * Helper function to enumerate through all registered windows - * and one to enumerate all of a window's subwindows... - * - * The GFunc callback for those functions will be defined as: - * - * void enumCallback( gpointer window, gpointer enumerator ); - * - * where window is the enumerated (sub)window pointer (SFG_Window *), - * and userData is the a custom user-supplied pointer. Functions - * are defined and exported from freeglut_structure.c file. - */ -void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator ); -void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, - SFG_Enumerator* enumerator ); - -/* - * fgWindowByHandle returns a (SFG_Window *) value pointing to the - * first window in the queue matching the specified window handle. - * The function is defined in freeglut_structure.c file. - */ -SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow ); - -/* - * This function is similiar to the previous one, except it is - * looking for a specified (sub)window identifier. The function - * is defined in freeglut_structure.c file. - */ -SFG_Window* fgWindowByID( int windowID ); - -/* - * Looks up a menu given its ID. This is easier than fgWindowByXXX - * as all menus are placed in a single doubly linked list... - */ -SFG_Menu* fgMenuByID( int menuID ); - -/* - * The menu activation and deactivation the code. This is the meat - * of the menu user interface handling code... - */ -void fgUpdateMenuHighlight ( SFG_Menu *menu ); -GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed, - int mouse_x, int mouse_y ); -void fgDeactivateMenu( SFG_Window *window ); - -/* - * This function gets called just before the buffers swap, so that - * freeglut can display the pull-down menus via OpenGL. The function - * is defined in freeglut_menu.c file. - */ -void fgDisplayMenu( void ); - -/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */ -long fgElapsedTime( void ); - -/* System time in milliseconds */ -long unsigned fgSystemTime(void); - -/* List functions */ -void fgListInit(SFG_List *list); -void fgListAppend(SFG_List *list, SFG_Node *node); -void fgListRemove(SFG_List *list, SFG_Node *node); -int fgListLength(SFG_List *list); -void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node); - -/* Error Message functions */ -void fgError( const char *fmt, ... ); -void fgWarning( const char *fmt, ... ); - -/* - * Check if "hint" is present in "property" for "window". See freeglut_init.c - */ -#if TARGET_HOST_POSIX_X11 -int fgHintPresent(Window window, Atom property, Atom hint); -#endif - -SFG_Proc fghGetProcAddress( const char *procName ); - -#if TARGET_HOST_MS_WINDOWS -extern void (__cdecl *__glutExitFunc)( int return_value ); -#endif - -#endif /* FREEGLUT_INTERNAL_H */ - -/*** END OF FILE ***/ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_joystick.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_joystick.c deleted file mode 100644 index c00937769..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_joystick.c +++ /dev/null @@ -1,1801 +0,0 @@ -/* - * freeglut_joystick.c - * - * Joystick handling code - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Steve Baker, - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * FreeBSD port by Stephen Montgomery-Smith - * - * Redone by John Fay 2/4/04 with another look from the PLIB "js" library. - * Many thanks for Steve Baker for permission to pull from that library. - */ - -#include -#include "freeglut_internal.h" -#if HAVE_SYS_PARAM_H -# include -#endif - -/* - * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c" - * interspersed - */ - -/* XXX It might be better to poll the operating system for the numbers of buttons and - * XXX axes and then dynamically allocate the arrays. - */ -#define _JS_MAX_BUTTONS 32 - -#if TARGET_HOST_MACINTOSH -# define _JS_MAX_AXES 9 -# include -#endif - -#if TARGET_HOST_MAC_OSX -# define _JS_MAX_AXES 16 -# include -# include -# include -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -# define _JS_MAX_AXES 8 -# include -# include -# include - -#endif - -#if TARGET_HOST_POSIX_X11 -# define _JS_MAX_AXES 16 -# if HAVE_SYS_IOCTL_H -# include -# endif -# if HAVE_FCNTL_H -# include -# endif -# if HAVE_ERRNO -# include -# endif -# if defined(__FreeBSD__) || defined(__NetBSD__) -/* XXX The below hack is done until freeglut's autoconf is updated. */ -# define HAVE_USB_JS 1 - -# if defined(__FreeBSD__) -# include -# else -/* - * XXX NetBSD/amd64 systems may find that they have to steal the - * XXX /usr/include/machine/joystick.h from a NetBSD/i386 system. - * XXX I cannot comment whether that works for the interface, but - * XXX it lets you compile...(^& I do not think that we can do away - * XXX with this header. - */ -# include /* For analog joysticks */ -# endif -# define JS_DATA_TYPE joystick -# define JS_RETURN (sizeof(struct JS_DATA_TYPE)) -# endif - -# if defined(__linux__) -# include - -/* check the joystick driver version */ -# if defined(JS_VERSION) && JS_VERSION >= 0x010000 -# define JS_NEW -# endif -# else /* Not BSD or Linux */ -# ifndef JS_RETURN - - /* - * We'll put these values in and that should - * allow the code to at least compile when there is - * no support. The JS open routine should error out - * and shut off all the code downstream anyway and if - * the application doesn't use a joystick we'll be fine. - */ - - struct JS_DATA_TYPE - { - int buttons; - int x; - int y; - }; - -# define JS_RETURN (sizeof(struct JS_DATA_TYPE)) -# endif -# endif -#endif - -#define JS_TRUE 1 -#define JS_FALSE 0 - -/* BSD defines from "jsBSD.cxx" around lines 42-270 */ - -#if defined(__NetBSD__) || defined(__FreeBSD__) - -# ifdef HAVE_USB_JS -# if defined(__NetBSD__) -/* XXX The below hack is done until freeglut's autoconf is updated. */ -# define HAVE_USBHID_H 1 -# ifdef HAVE_USBHID_H -# include -# else -# include -# endif -# elif defined(__FreeBSD__) -# if __FreeBSD_version < 500000 -# include -# else -/* XXX The below hack is done until freeglut's autoconf is updated. */ -# define HAVE_USBHID_H 1 -# include -# endif -# endif -# include -# include - -/* Compatibility with older usb.h revisions */ -# if !defined(USB_MAX_DEVNAMES) && defined(MAXDEVNAMES) -# define USB_MAX_DEVNAMES MAXDEVNAMES -# endif -# endif - -static int hatmap_x[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 }; -static int hatmap_y[9] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 }; -struct os_specific_s { - char fname [128 ]; - int fd; - int is_analog; - /* The following structure members are specific to analog joysticks */ - struct joystick ajs; -# ifdef HAVE_USB_JS - /* The following structure members are specific to USB joysticks */ - struct hid_item *hids; - int hid_dlen; - int hid_offset; - char *hid_data_buf; - int axes_usage [ _JS_MAX_AXES ]; -# endif - /* We keep button and axes state ourselves, as they might not be updated - * on every read of a USB device - */ - int cache_buttons; - float cache_axes [ _JS_MAX_AXES ]; -}; - -/* Idents lower than USB_IDENT_OFFSET are for analog joysticks. */ -# define USB_IDENT_OFFSET 2 - -# define USBDEV "/dev/usb" -# define UHIDDEV "/dev/uhid" -# define AJSDEV "/dev/joy" - -# ifdef HAVE_USB_JS -/* - * fghJoystickFindUSBdev (and its helper, fghJoystickWalkUSBdev) try to locate - * the full name of a USB device. If /dev/usbN isn't readable, we punt and - * return the uhidN device name. We warn the user of this situation once. - */ -static char *fghJoystickWalkUSBdev(int f, char *dev, char *out, int outlen) -{ - struct usb_device_info di; - int i, a; - char *cp; - - for (a = 1; a < USB_MAX_DEVICES; a++) { - di.udi_addr = a; - if (ioctl(f, USB_DEVICEINFO, &di) != 0) - return NULL; - for (i = 0; i < USB_MAX_DEVNAMES; i++) - if (di.udi_devnames[i][0] && - strcmp(di.udi_devnames[i], dev) == 0) { - cp = calloc( 1, strlen(di.udi_vendor) + strlen(di.udi_product) + 2); - strcpy(cp, di.udi_vendor); - strcat(cp, " "); - strcat(cp, di.udi_product); - strncpy(out, cp, outlen - 1); - out[outlen - 1] = 0; - free( cp ); - return out; - } - } - return NULL; -} - -static int fghJoystickFindUSBdev(char *name, char *out, int outlen) -{ - int i, f; - char buf[50]; - char *cp; - static int protection_warned = 0; - - for (i = 0; i < 16; i++) { - snprintf(buf, sizeof(buf), "%s%d", USBDEV, i); - f = open(buf, O_RDONLY); - if (f >= 0) { - cp = fghJoystickWalkUSBdev(f, name, out, outlen); - close(f); - if (cp) - return 1; - } -#if HAVE_ERRNO - else if (errno == EACCES) { - if (!protection_warned) { - fgWarning ( "Can't open %s for read!", buf ); - protection_warned = 1; - } - } -#endif - } - return 0; -} - -static int fghJoystickInitializeHID(struct os_specific_s *os, - int *num_axes, int *num_buttons) -{ - int size, is_joystick; -# ifdef HAVE_USBHID_H - int report_id = 0; -# endif - struct hid_data *d; - struct hid_item h; - report_desc_t rd; - - if ( ( rd = hid_get_report_desc( os->fd ) ) == 0 ) - { -#if HAVE_ERRNO - fgWarning ( "error: %s: %s", os->fname, strerror( errno ) ); -#else - fgWarning ( "error: %s", os->fname ); -#endif - return FALSE; - } - - os->hids = NULL; - -# ifdef HAVE_USBHID_H - if( ioctl( os->fd, USB_GET_REPORT_ID, &report_id ) < 0) - { - /*** XXX {report_id} may not be the right variable? ***/ -#if HAVE_ERRNO - fgWarning ( "error: %s%d: %s", UHIDDEV, report_id, strerror( errno ) ); -#else - fgWarning ( "error: %s%d", UHIDDEV, report_id ); -#endif - return FALSE; - } - - size = hid_report_size( rd, hid_input, report_id ); -# else - size = hid_report_size( rd, 0, hid_input ); -# endif - os->hid_data_buf = calloc( 1, size ); - os->hid_dlen = size; - - is_joystick = 0; -# ifdef HAVE_USBHID_H - d = hid_start_parse( rd, 1 << hid_input, report_id ); -# else - d = hid_start_parse( rd, 1 << hid_input ); -# endif - while( hid_get_item( d, &h ) ) - { - int usage, page, interesting_hid; - - page = HID_PAGE( h.usage ); - usage = HID_USAGE( h.usage ); - - /* This test is somewhat too simplistic, but this is how MicroSoft - * does, so I guess it works for all joysticks/game pads. */ - is_joystick = is_joystick || - ( h.kind == hid_collection && - page == HUP_GENERIC_DESKTOP && - ( usage == HUG_JOYSTICK || usage == HUG_GAME_PAD ) ); - - if( h.kind != hid_input ) - continue; - - if( !is_joystick ) - continue; - - interesting_hid = TRUE; - if( page == HUP_GENERIC_DESKTOP ) - { - switch( usage ) - { - case HUG_X: - case HUG_RX: - case HUG_Y: - case HUG_RY: - case HUG_Z: - case HUG_RZ: - case HUG_SLIDER: - if( *num_axes < _JS_MAX_AXES ) - { - os->axes_usage[ *num_axes ] = usage; - ( *num_axes )++; - } - break; - case HUG_HAT_SWITCH: - /* Allocate two axes for a hat */ - if( *num_axes + 1 < _JS_MAX_AXES ) - { - os->axes_usage[ *num_axes ] = usage; - (*num_axes)++; - os->axes_usage[ *num_axes ] = usage; - (*num_axes)++; - } - break; - default: - interesting_hid = FALSE; - break; - } - } - else if( page == HUP_BUTTON ) - { - interesting_hid = ( usage > 0 ) && - ( usage <= _JS_MAX_BUTTONS ); - - if( interesting_hid && usage - 1 > *num_buttons ) - *num_buttons = usage - 1; - } - - if( interesting_hid ) - { - h.next = os->hids; - os->hids = calloc( 1, sizeof ( struct hid_item ) ); - *os->hids = h; - } - } - hid_end_parse( d ); - - return os->hids != NULL; -} -# endif -#endif - -/* - * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class. - * See "js.h" lines 80-178. - */ -typedef struct tagSFG_Joystick SFG_Joystick; -struct tagSFG_Joystick -{ -#if TARGET_HOST_MACINTOSH -#define ISP_NUM_AXIS 9 -#define ISP_NUM_NEEDS 41 - ISpElementReference isp_elem [ ISP_NUM_NEEDS ]; - ISpNeed isp_needs [ ISP_NUM_NEEDS ]; -#endif - -#if TARGET_HOST_MAC_OSX - IOHIDDeviceInterface ** hidDev; - IOHIDElementCookie buttonCookies[41]; - IOHIDElementCookie axisCookies[_JS_MAX_AXES]; - long minReport[_JS_MAX_AXES], - maxReport[_JS_MAX_AXES]; -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - JOYCAPS jsCaps; - JOYINFOEX js; - UINT js_id; -#endif - - -#if TARGET_HOST_POSIX_X11 -# if defined(__FreeBSD__) || defined(__NetBSD__) - struct os_specific_s *os; -# endif - -# ifdef JS_NEW - struct js_event js; - int tmp_buttons; - float tmp_axes [ _JS_MAX_AXES ]; -# else - struct JS_DATA_TYPE js; -# endif - - char fname [ 128 ]; - int fd; -#endif - - int id; - GLboolean error; - char name [ 128 ]; - int num_axes; - int num_buttons; - - float dead_band[ _JS_MAX_AXES ]; - float saturate [ _JS_MAX_AXES ]; - float center [ _JS_MAX_AXES ]; - float max [ _JS_MAX_AXES ]; - float min [ _JS_MAX_AXES ]; -}; - -/* - * Functions associated with the "jsJoystick" class in PLIB - */ -#if TARGET_HOST_MAC_OSX -#define K_NUM_DEVICES 32 -int numDevices; -io_object_t ioDevices[K_NUM_DEVICES]; - -static void fghJoystickFindDevices ( SFG_Joystick* joy, mach_port_t ); -static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick* joy, io_object_t ); - -static void fghJoystickEnumerateElements ( SFG_Joystick* joy, CFTypeRef element ); -/* callback for CFArrayApply */ -static void fghJoystickElementEnumerator ( SFG_Joystick* joy, void *element, void* vjs ); - -static void fghJoystickAddAxisElement ( SFG_Joystick* joy, CFDictionaryRef axis ); -static void fghJoystickAddButtonElement ( SFG_Joystick* joy, CFDictionaryRef button ); -static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat ); -#endif - - -/* - * The static joystick structure pointer - */ -#define MAX_NUM_JOYSTICKS 2 -static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ]; - - -/* - * Read the raw joystick data - */ -static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) -{ -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - MMRESULT status; -#else - int status; -#endif - -#if defined(__FreeBSD__) || defined(__NetBSD__) - int len; -#endif - - int i; - - /* Defaults */ - if( buttons ) - *buttons = 0; - - if( axes ) - for( i = 0; i < joy->num_axes; i++ ) - axes[ i ] = 1500.0f; - - if( joy->error ) - return; - -#if TARGET_HOST_MACINTOSH - if ( buttons ) - { - *buttons = 0; - - for ( i = 0; i < joy->num_buttons; i++ ) - { - UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i + isp_num_axis ], &state); - ISP_CHECK_ERR(err) - - *buttons |= state << i; - } - } - - if ( axes ) - { - for ( i = 0; i < joy->num_axes; i++ ) - { - UInt32 state; - int err = ISpElement_GetSimpleState ( isp_elem [ i ], &state ); - ISP_CHECK_ERR(err) - - axes [i] = (float) state; - } - } -#endif - -#if TARGET_HOST_MAC_OSX - if ( buttons != NULL ) - { - *buttons = 0; - - for ( i = 0; i < joy->num_buttons; i++ ) - { - IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, buttonCookies[i], &hidEvent ); - if ( hidEvent.value ) - *buttons |= 1 << i; - } - } - - if ( axes != NULL ) - { - for ( i = 0; i < joy->num_axes; i++ ) - { - IOHIDEventStruct hidEvent; - (*(joy->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent ); - axes[i] = hidEvent.value; - } - } -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - status = joyGetPosEx( joy->js_id, &joy->js ); - - if ( status != JOYERR_NOERROR ) - { - joy->error = GL_TRUE; - return; - } - - if ( buttons ) - *buttons = joy->js.dwButtons; - - if ( axes ) - { - /* - * WARNING - Fall through case clauses!! - */ - switch ( joy->num_axes ) - { - case 8: - /* Generate two POV axes from the POV hat angle. - * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in - * hundredths of a degree, or 0xFFFF when idle. - */ - if ( ( joy->js.dwPOV & 0xFFFF ) == 0xFFFF ) - { - axes [ 6 ] = 0.0; - axes [ 7 ] = 0.0; - } - else - { - /* This is the contentious bit: how to convert angle to X/Y. - * wk: I know of no define for PI that we could use here: - * SG_PI would pull in sg, M_PI is undefined for MSVC - * But the accuracy of the value of PI is very unimportant at - * this point. - */ - float s = (float) sin ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); - float c = (float) cos ( ( joy->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) ); - - /* Convert to coordinates on a square so that North-East - * is (1,1) not (.7,.7), etc. - * s and c cannot both be zero so we won't divide by zero. - */ - if ( fabs ( s ) < fabs ( c ) ) - { - axes [ 6 ] = ( c < 0.0 ) ? -s/c : s/c ; - axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f; - } - else - { - axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f; - axes [ 7 ] = ( s < 0.0 ) ? -c/s : c/s ; - } - } - - case 6: axes[5] = (float) joy->js.dwVpos; - case 5: axes[4] = (float) joy->js.dwUpos; - case 4: axes[3] = (float) joy->js.dwRpos; - case 3: axes[2] = (float) joy->js.dwZpos; - case 2: axes[1] = (float) joy->js.dwYpos; - case 1: axes[0] = (float) joy->js.dwXpos; - } - } -#endif - -#if TARGET_HOST_POSIX_X11 -# if defined(__FreeBSD__) || defined(__NetBSD__) - if ( joy->os->is_analog ) - { - int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) ); - if ( status != sizeof(joy->os->ajs) ) { - perror ( joy->os->fname ); - joy->error = GL_TRUE; - return; - } - if ( buttons != NULL ) - *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 ); - - if ( axes != NULL ) - { - axes[0] = (float) joy->os->ajs.x; - axes[1] = (float) joy->os->ajs.y; - } - - return; - } - -# ifdef HAVE_USB_JS - while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen ) - { - struct hid_item *h; - - for ( h = joy->os->hids; h; h = h->next ) - { - int d = hid_get_data ( joy->os->hid_data_buf, h ); - - int page = HID_PAGE ( h->usage ); - int usage = HID_USAGE ( h->usage ); - - if ( page == HUP_GENERIC_DESKTOP ) - { - int i; - for ( i = 0; i < joy->num_axes; i++ ) - if (joy->os->axes_usage[i] == usage) - { - if (usage == HUG_HAT_SWITCH) - { - if (d < 0 || d > 8) - d = 0; /* safety */ - joy->os->cache_axes[i] = (float)hatmap_x[d]; - joy->os->cache_axes[i + 1] = (float)hatmap_y[d]; - } - else - { - joy->os->cache_axes[i] = (float)d; - } - break; - } - } - else if (page == HUP_BUTTON) - { - if (usage > 0 && usage < _JS_MAX_BUTTONS + 1) - { - if (d) - joy->os->cache_buttons |= (1 << ( usage - 1 )); - else - joy->os->cache_buttons &= ~(1 << ( usage - 1 )); - } - } - } - } -#if HAVE_ERRNO - if ( len < 0 && errno != EAGAIN ) -#else - if ( len < 0 ) -#endif - { - perror( joy->os->fname ); - joy->error = 1; - } - if ( buttons != NULL ) *buttons = joy->os->cache_buttons; - if ( axes != NULL ) - memcpy ( axes, joy->os->cache_axes, sizeof(float) * joy->num_axes ); -# endif -# endif - -# ifdef JS_NEW - - while ( 1 ) - { - status = read ( joy->fd, &joy->js, sizeof(struct js_event) ); - - if ( status != sizeof( struct js_event ) ) - { -#if HAVE_ERRNO - if ( errno == EAGAIN ) - { - /* Use the old values */ - if ( buttons ) - *buttons = joy->tmp_buttons; - if ( axes ) - memcpy( axes, joy->tmp_axes, - sizeof( float ) * joy->num_axes ); - return; - } -#endif - - fgWarning ( "%s", joy->fname ); - joy->error = GL_TRUE; - return; - } - - switch ( joy->js.type & ~JS_EVENT_INIT ) - { - case JS_EVENT_BUTTON: - if( joy->js.value == 0 ) /* clear the flag */ - joy->tmp_buttons &= ~( 1 << joy->js.number ); - else - joy->tmp_buttons |= ( 1 << joy->js.number ); - break; - - case JS_EVENT_AXIS: - if ( joy->js.number < joy->num_axes ) - { - joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value; - - if( axes ) - memcpy( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); - } - break; - - default: - fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" ); - - /* use the old values */ - - if ( buttons != NULL ) *buttons = joy->tmp_buttons; - if ( axes != NULL ) - memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes ); - - return; - } - - if( buttons ) - *buttons = joy->tmp_buttons; - } -# else - - status = read( joy->fd, &joy->js, JS_RETURN ); - - if ( status != JS_RETURN ) - { - fgWarning( "%s", joy->fname ); - joy->error = GL_TRUE; - return; - } - - if ( buttons ) -# if defined( __FreeBSD__ ) || defined( __NetBSD__ ) - *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */ -# else - *buttons = joy->js.buttons; -# endif - - if ( axes ) - { - axes[ 0 ] = (float) joy->js.x; - axes[ 1 ] = (float) joy->js.y; - } -# endif -#endif -} - -/* - * Correct the joystick axis data - */ -static float fghJoystickFudgeAxis( SFG_Joystick* joy, float value, int axis ) -{ - if( value < joy->center[ axis ] ) - { - float xx = ( value - joy->center[ axis ] ) / ( joy->center[ axis ] - - joy->min[ axis ] ); - - if( xx < -joy->saturate[ axis ] ) - return -1.0f; - - if( xx > -joy->dead_band [ axis ] ) - return 0.0f; - - xx = ( xx + joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] - - joy->dead_band[ axis ] ); - - return ( xx < -1.0f ) ? -1.0f : xx; - } - else - { - float xx = ( value - joy->center [ axis ] ) / ( joy->max[ axis ] - - joy->center[ axis ] ); - - if( xx > joy->saturate[ axis ] ) - return 1.0f; - - if( xx < joy->dead_band[ axis ] ) - return 0.0f; - - xx = ( xx - joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] - - joy->dead_band[ axis ] ); - - return ( xx > 1.0f ) ? 1.0f : xx; - } -} - -/* - * Read the corrected joystick data - */ -static void fghJoystickRead( SFG_Joystick* joy, int* buttons, float* axes ) -{ - float raw_axes[ _JS_MAX_AXES ]; - int i; - - if( joy->error ) - { - if( buttons ) - *buttons = 0; - - if( axes ) - for ( i=0; inum_axes; i++ ) - axes[ i ] = 0.0f; - } - - fghJoystickRawRead( joy, buttons, raw_axes ); - - if( axes ) - for( i=0; inum_axes; i++ ) - axes[ i ] = fghJoystickFudgeAxis( joy, raw_axes[ i ], i ); -} - -/* - * Happy happy happy joy joy joy (happy new year toudi :D) - */ - - -#if TARGET_HOST_MAC_OSX -/** open the IOKit connection, enumerate all the HID devices, add their -interface references to the static array. We then use the array index -as the device number when we come to open() the joystick. */ -static int fghJoystickFindDevices ( SFG_Joystick *joy, mach_port_t masterPort ) -{ - CFMutableDictionaryRef hidMatch = NULL; - IOReturn rv = kIOReturnSuccess; - - io_iterator_t hidIterator; - io_object_t ioDev; - - /* build a dictionary matching HID devices */ - hidMatch = IOServiceMatching(kIOHIDDeviceKey); - - rv = IOServiceGetMatchingServices(masterPort, hidMatch, &hidIterator); - if (rv != kIOReturnSuccess || !hidIterator) { - fgWarning( "no joystick (HID) devices found" ); - return; - } - - /* iterate */ - while ((ioDev = IOIteratorNext(hidIterator))) { - /* filter out keyboard and mouse devices */ - CFDictionaryRef properties = getCFProperties(ioDev); - long usage, page; - - CFTypeRef refPage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsagePageKey)); - CFTypeRef refUsage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsageKey)); - CFNumberGetValue((CFNumberRef) refUsage, kCFNumberLongType, &usage); - CFNumberGetValue((CFNumberRef) refPage, kCFNumberLongType, &page); - - /* keep only joystick devices */ - if ( ( page == kHIDPage_GenericDesktop ) && ( - (usage == kHIDUsage_GD_Joystick) - || (usage == kHIDUsage_GD_GamePad) - || (usage == kHIDUsage_GD_MultiAxisController) - || (usage == kHIDUsage_GD_Hatswitch) /* last two necessary ? */ - /* add it to the array */ - ioDevices[numDevices++] = ioDev; - } - - IOObjectRelease(hidIterator); -} - -static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick *joy, io_object_t ioDev ) -{ - IOReturn rv; - CFMutableDictionaryRef cfProperties; - -#if 0 - /* comment copied from darwin/SDL_sysjoystick.c */ - /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also - * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties - */ - - io_registry_entry_t parent1, parent2; - - rv = IORegistryEntryGetParentEntry (ioDev, kIOServicePlane, &parent1); - if (rv != kIOReturnSuccess) { - fgWarning ( "error getting device entry parent"); - return NULL; - } - - rv = IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2); - if (rv != kIOReturnSuccess) { - fgWarning ( "error getting device entry parent 2"); - return NULL; - } -#endif - - rv = IORegistryEntryCreateCFProperties( ioDev /*parent2*/, - &cfProperties, kCFAllocatorDefault, kNilOptions); - if (rv != kIOReturnSuccess || !cfProperties) { - fgWarning ( "error getting device properties"); - return NULL; - } - - return cfProperties; -} - -static void fghJoystickElementEnumerator ( SFG_Joystick *joy, void *element, void* vjs ) -{ - if (CFGetTypeID((CFTypeRef) element) != CFDictionaryGetTypeID()) { - fgError ( "%s", "element enumerator passed non-dictionary value"); - return; - } - - static_cast(vjs)->parseElement ( (CFDictionaryRef) element ); -} - -/** element enumerator function : pass NULL for top-level*/ -static void fghJoystickEnumerateElements ( SFG_Joystick *joy, CFTypeRef element ) -{ - FREEGLUT_INTERNAL_ERROR_EXIT( (CFGetTypeID(element) == CFArrayGetTypeID(), - "Joystick element type mismatch", - "fghJoystickEnumerateElements" ); - - CFRange range = {0, CFArrayGetCount ((CFArrayRef)element)}; - CFArrayApplyFunction((CFArrayRef) element, range, - &fghJoystickElementEnumerator, joy ); -} - -static void fghJoystickAddAxisElement ( SFG_Joystick *joy, CFDictionaryRef axis ) -{ - long cookie, lmin, lmax; - int index = joy->num_axes++; - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementCookieKey) ), - kCFNumberLongType, &cookie); - - axisCookies[index] = (IOHIDElementCookie) cookie; - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMinKey) ), - kCFNumberLongType, &lmin); - - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMaxKey) ), - kCFNumberLongType, &lmax); - - joy->min[index] = lmin; - joy->max[index] = lmax; - joy->dead_band[index] = 0.0; - joy->saturate[index] = 1.0; - joy->center[index] = (lmax + lmin) * 0.5; -} - -static void fghJoystickAddButtonElement ( SFG_Joystick *joy, CFDictionaryRef button ) -{ - long cookie; - CFNumberGetValue ((CFNumberRef) - CFDictionaryGetValue ( button, CFSTR(kIOHIDElementCookieKey) ), - kCFNumberLongType, &cookie); - - joy->buttonCookies[num_buttons++] = (IOHIDElementCookie) cookie; - /* anything else for buttons? */ -} - -static void fghJoystickAddHatElement ( SFG_Joystick *joy, CFDictionaryRef button ) -{ - /* hatCookies[num_hats++] = (IOHIDElementCookie) cookie; */ - /* do we map hats to axes or buttons? */ -} -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) -/* Inspired by - http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp - */ -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib, "advapi32.lib") -# endif - -static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz ) -{ - char buffer [ 256 ]; - - char OEMKey [ 256 ]; - - HKEY hKey; - DWORD dwcb; - LONG lr; - - if ( joy->error ) - return 0; - - /* Open .. MediaResources\CurrentJoystickSettings */ - _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s", - REGSTR_PATH_JOYCONFIG, joy->jsCaps.szRegKey, - REGSTR_KEY_JOYCURR ); - - lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Get OEM Key name */ - dwcb = sizeof(OEMKey); - - /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */ - _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->js_id + 1, REGSTR_VAL_JOYOEMNAME ); - - lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb); - RegCloseKey ( hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Open OEM Key from ...MediaProperties */ - _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey ); - - lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - /* Get OEM Name */ - dwcb = buf_sz; - - lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf, - &dwcb ); - RegCloseKey ( hKey ); - - if ( lr != ERROR_SUCCESS ) return 0; - - return 1; -} -#endif - - -static void fghJoystickOpen( SFG_Joystick* joy ) -{ - int i = 0; -#if TARGET_HOST_MACINTOSH - OSStatus err; -#endif -#if TARGET_HOST_MAC_OSX - IOReturn rv; - SInt32 score; - IOCFPlugInInterface **plugin; - - HRESULT pluginResult; - - CFDictionaryRef props; - CFTypeRef topLevelElement; -#endif -#if TARGET_HOST_POSIX_X11 -# if defined( __FreeBSD__ ) || defined( __NetBSD__ ) - char *cp; -# endif -# ifdef JS_NEW - unsigned char u; -# else -# if defined( __linux__ ) || TARGET_HOST_SOLARIS - int counter = 0; -# endif -# endif -#endif - - /* Silence gcc, the correct #ifdefs would be too fragile... */ - (void)i; - - /* - * Default values (for no joystick -- each conditional will reset the - * error flag) - */ - joy->error = TRUE; - joy->num_axes = joy->num_buttons = 0; - joy->name[ 0 ] = '\0'; - -#if TARGET_HOST_MACINTOSH - /* XXX FIXME: get joystick name in Mac */ - - err = ISpStartup( ); - - if( err == noErr ) - { -#define ISP_CHECK_ERR(x) if( x != noErr ) { joy->error = GL_TRUE; return; } - - joy->error = GL_TRUE; - - /* initialize the needs structure */ - ISpNeed temp_isp_needs[ isp_num_needs ] = - { - { "\pX-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pY-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pZ-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pR-Axis", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pAxis 4", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pAxis 5", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pAxis 6", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pAxis 7", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - { "\pAxis 8", 128, 0, 0, kISpElementKind_Axis, kISpElementLabel_None, 0, 0, 0, 0 }, - - { "\pButton 0", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 1", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 2", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 3", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 4", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 5", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 6", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 7", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 8", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 9", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 10", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 11", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 12", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 13", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 14", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 15", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 16", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 17", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 18", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 19", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 20", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 21", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 22", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 23", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 24", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 25", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 26", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 27", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 28", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 29", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 30", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 }, - }; - - memcpy( joy->isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) ); - - - /* next two calls allow keyboard and mouse to emulate other input - * devices (gamepads, joysticks, etc) - */ - /* - err = ISpDevices_ActivateClass ( kISpDeviceClass_Keyboard ); - ISP_CHECK_ERR(err) - - - err = ISpDevices_ActivateClass ( kISpDeviceClass_Mouse ); - ISP_CHECK_ERR(err) - */ - - err = ISpElement_NewVirtualFromNeeds( joy->isp_num_needs, - joy->isp_needs, joy->isp_elem, - 0 ); - ISP_CHECK_ERR( err ) - - err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem, - 'freeglut', nil, 0, 128, 0 ); - ISP_CHECK_ERR( err ) - - joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis; - joy->num_axes = joy->isp_num_axis; - - for( i = 0; i < joy->num_axes; i++ ) - { - joy->dead_band[ i ] = 0; - joy->saturate [ i ] = 1; - joy->center [ i ] = kISpAxisMiddle; - joy->max [ i ] = kISpAxisMaximum; - joy->min [ i ] = kISpAxisMinimum; - } - - joy->error = GL_FALSE; - } - else - joy->num_buttons = joy->num_axes = 0; -#endif - -#if TARGET_HOST_MAC_OSX - if( joy->id >= numDevices ) - { - fgWarning( "device index out of range in fgJoystickOpen()" ); - return; - } - - /* create device interface */ - rv = IOCreatePlugInInterfaceForService( ioDevices[ joy->id ], - kIOHIDDeviceUserClientTypeID, - kIOCFPlugInInterfaceID, - &plugin, &score ); - - if( rv != kIOReturnSuccess ) - { - fgWarning( "error creating plugin for io device" ); - return; - } - - pluginResult = ( *plugin )->QueryInterface( - plugin, - CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), - &( LPVOID )joy->hidDev - ); - - if( pluginResult != S_OK ) - fgWarning ( "QI-ing IO plugin to HID Device interface failed" ); - - ( *plugin )->Release( plugin ); /* don't leak a ref */ - if( joy->hidDev == NULL ) - return; - - /* store the interface in this instance */ - rv = ( *( joy->hidDev ) )->open( joy->hidDev, 0 ); - if( rv != kIOReturnSuccess ) - { - fgWarning( "error opening device interface"); - return; - } - - props = getCFProperties( ioDevices[ joy->id ] ); - - /* recursively enumerate all the bits */ - CFTypeRef topLevelElement = - CFDictionaryGetValue( props, CFSTR( kIOHIDElementKey ) ); - enumerateElements( topLevelElement ); - - CFRelease( props ); -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - joy->js.dwFlags = JOY_RETURNALL; - joy->js.dwSize = sizeof( joy->js ); - - memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) ); - - joy->error = - ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) != - JOYERR_NOERROR ); - - if( joy->jsCaps.wNumAxes == 0 ) - { - joy->num_axes = 0; - joy->error = GL_TRUE; - } - else - { - /* Device name from jsCaps is often "Microsoft PC-joystick driver", - * at least for USB. Try to get the real name from the registry. - */ - if ( ! fghJoystickGetOEMProductName( joy, joy->name, - sizeof( joy->name ) ) ) - { - fgWarning( "JS: Failed to read joystick name from registry" ); - strncpy( joy->name, joy->jsCaps.szPname, sizeof( joy->name ) ); - } - - /* Windows joystick drivers may provide any combination of - * X,Y,Z,R,U,V,POV - not necessarily the first n of these. - */ - if( joy->jsCaps.wCaps & JOYCAPS_HASPOV ) - { - joy->num_axes = _JS_MAX_AXES; - joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0; /* POV Y */ - joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0; /* POV X */ - } - else - joy->num_axes = 6; - - joy->min[ 5 ] = ( float )joy->jsCaps.wVmin; - joy->max[ 5 ] = ( float )joy->jsCaps.wVmax; - joy->min[ 4 ] = ( float )joy->jsCaps.wUmin; - joy->max[ 4 ] = ( float )joy->jsCaps.wUmax; - joy->min[ 3 ] = ( float )joy->jsCaps.wRmin; - joy->max[ 3 ] = ( float )joy->jsCaps.wRmax; - joy->min[ 2 ] = ( float )joy->jsCaps.wZmin; - joy->max[ 2 ] = ( float )joy->jsCaps.wZmax; - joy->min[ 1 ] = ( float )joy->jsCaps.wYmin; - joy->max[ 1 ] = ( float )joy->jsCaps.wYmax; - joy->min[ 0 ] = ( float )joy->jsCaps.wXmin; - joy->max[ 0 ] = ( float )joy->jsCaps.wXmax; - } - - /* Guess all the rest judging on the axes extremals */ - for( i = 0; i < joy->num_axes; i++ ) - { - joy->center [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f; - joy->dead_band[ i ] = 0.0f; - joy->saturate [ i ] = 1.0f; - } -#endif - -#if TARGET_HOST_POSIX_X11 -#if defined( __FreeBSD__ ) || defined( __NetBSD__ ) - for( i = 0; i < _JS_MAX_AXES; i++ ) - joy->os->cache_axes[ i ] = 0.0f; - - joy->os->cache_buttons = 0; - - joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK); - -#if HAVE_ERRNO - if( joy->os->fd < 0 && errno == EACCES ) - fgWarning ( "%s exists but is not readable by you", joy->os->fname ); -#endif - - joy->error =( joy->os->fd < 0 ); - - if( joy->error ) - return; - - joy->num_axes = 0; - joy->num_buttons = 0; - if( joy->os->is_analog ) - { - FILE *joyfile; - char joyfname[ 1024 ]; - int noargs, in_no_axes; - - float axes [ _JS_MAX_AXES ]; - int buttons[ _JS_MAX_AXES ]; - - joy->num_axes = 2; - joy->num_buttons = 32; - - fghJoystickRawRead( joy, buttons, axes ); - joy->error = axes[ 0 ] < -1000000000.0f; - if( joy->error ) - return; - - snprintf( joyfname, sizeof(joyfname), "%s/.joy%drc", getenv( "HOME" ), joy->id ); - - joyfile = fopen( joyfname, "r" ); - joy->error =( joyfile == NULL ); - if( joy->error ) - return; - - noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes, - &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ], - &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] ); - joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES; - fclose( joyfile ); - if( joy->error ) - return; - - for( i = 0; i < _JS_MAX_AXES; i++ ) - { - joy->dead_band[ i ] = 0.0f; - joy->saturate [ i ] = 1.0f; - } - - return; /* End of analog code */ - } - -# ifdef HAVE_USB_JS - if( ! fghJoystickInitializeHID( joy->os, &joy->num_axes, - &joy->num_buttons ) ) - { - close( joy->os->fd ); - joy->error = GL_TRUE; - return; - } - - cp = strrchr( joy->os->fname, '/' ); - if( cp ) - { - if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) == - 0 ) - strcpy( joy->name, &cp[1] ); - } - - if( joy->num_axes > _JS_MAX_AXES ) - joy->num_axes = _JS_MAX_AXES; - - for( i = 0; i < _JS_MAX_AXES; i++ ) - { - /* We really should get this from the HID, but that data seems - * to be quite unreliable for analog-to-USB converters. Punt for - * now. - */ - if( joy->os->axes_usage[ i ] == HUG_HAT_SWITCH ) - { - joy->max [ i ] = 1.0f; - joy->center[ i ] = 0.0f; - joy->min [ i ] = -1.0f; - } - else - { - joy->max [ i ] = 255.0f; - joy->center[ i ] = 127.0f; - joy->min [ i ] = 0.0f; - } - - joy->dead_band[ i ] = 0.0f; - joy->saturate[ i ] = 1.0f; - } -# endif -#endif - -#if defined( __linux__ ) || TARGET_HOST_SOLARIS - /* Default for older Linux systems. */ - joy->num_axes = 2; - joy->num_buttons = 32; - -# ifdef JS_NEW - for( i = 0; i < _JS_MAX_AXES; i++ ) - joy->tmp_axes[ i ] = 0.0f; - - joy->tmp_buttons = 0; -# endif - - joy->fd = open( joy->fname, O_RDONLY ); - - joy->error =( joy->fd < 0 ); - - if( joy->error ) - return; - - /* Set the correct number of axes for the linux driver */ -# ifdef JS_NEW - /* Melchior Franz's fixes for big-endian Linuxes since writing - * to the upper byte of an uninitialized word doesn't work. - * 9 April 2003 - */ - ioctl( joy->fd, JSIOCGAXES, &u ); - joy->num_axes = u; - ioctl( joy->fd, JSIOCGBUTTONS, &u ); - joy->num_buttons = u; - ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name ); - fcntl( joy->fd, F_SETFL, O_NONBLOCK ); -# endif - - /* - * The Linux driver seems to return 512 for all axes - * when no stick is present - but there is a chance - * that could happen by accident - so it's gotta happen - * on both axes for at least 100 attempts. - * - * PWO: shouldn't be that done somehow wiser on the kernel level? - */ -# ifndef JS_NEW - counter = 0; - - do - { - fghJoystickRawRead( joy, NULL, joy->center ); - counter++; - } while( !joy->error && - counter < 100 && - joy->center[ 0 ] == 512.0f && - joy->center[ 1 ] == 512.0f ); - - if ( counter >= 100 ) - joy->error = GL_TRUE; -# endif - - for( i = 0; i < _JS_MAX_AXES; i++ ) - { -# ifdef JS_NEW - joy->max [ i ] = 32767.0f; - joy->center[ i ] = 0.0f; - joy->min [ i ] = -32767.0f; -# else - joy->max[ i ] = joy->center[ i ] * 2.0f; - joy->min[ i ] = 0.0f; -# endif - joy->dead_band[ i ] = 0.0f; - joy->saturate [ i ] = 1.0f; - } -#endif -#endif -} - -/* - * This function replaces the constructor method in the JS library. - */ -static void fghJoystickInit( int ident ) -{ - if( ident >= MAX_NUM_JOYSTICKS ) - fgError( "Too large a joystick number: %d", ident ); - - if( fgJoystick[ ident ] ) - fgError( "illegal attempt to initialize joystick device again" ); - - fgJoystick[ ident ] = - ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 ); - - /* Set defaults */ - fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0; - fgJoystick[ ident ]->error = GL_TRUE; - -#if TARGET_HOST_MACINTOSH - fgJoystick[ ident ]->id = ident; - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */ - fgJoystick[ ident ]->error = GL_FALSE; -#endif - -#if TARGET_HOST_MAC_OSX - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - fgJoystick[ ident ]->num_axes = 0; - fgJoystick[ ident ]->num_buttons = 0; - - if( numDevices < 0 ) - { - /* do first-time init (since we can't over-ride jsInit, hmm */ - numDevices = 0; - - mach_port_t masterPort; - IOReturn rv = IOMasterPort( bootstrap_port, &masterPort ); - if( rv != kIOReturnSuccess ) - { - fgWarning( "error getting master Mach port" ); - return; - } - fghJoystickFindDevices( masterPort ); - } - - if ( ident >= numDevices ) - { - fgJoystick[ ident ]->error = GL_TRUE; - return; - } - - /* get the name now too */ - CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] ); - CFTypeRef ref = CFDictionaryGetValue( properties, - CFSTR( kIOHIDProductKey ) ); - if (!ref) - ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) ); - - if( !ref || - !CFStringGetCString( ( CFStringRef )ref, name, 128, - CFStringGetSystemEncoding( ) ) ) - { - fgWarning( "error getting device name" ); - name[ 0 ] = '\0'; - } -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - switch( ident ) - { - case 0: - fgJoystick[ ident ]->js_id = JOYSTICKID1; - fgJoystick[ ident ]->error = GL_FALSE; - break; - case 1: - fgJoystick[ ident ]->js_id = JOYSTICKID2; - fgJoystick[ ident ]->error = GL_FALSE; - break; - default: - fgJoystick[ ident ]->num_axes = 0; - fgJoystick[ ident ]->error = GL_TRUE; - return; - } -#endif - -#if TARGET_HOST_POSIX_X11 -# if defined( __FreeBSD__ ) || defined( __NetBSD__ ) - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - - fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) ); - memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) ); - if( ident < USB_IDENT_OFFSET ) - fgJoystick[ ident ]->os->is_analog = 1; - if( fgJoystick[ ident ]->os->is_analog ) - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident ); - else - snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV, - ident - USB_IDENT_OFFSET ); -# elif defined( __linux__ ) - fgJoystick[ ident ]->id = ident; - fgJoystick[ ident ]->error = GL_FALSE; - - snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident ); - - if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 ) - snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); -# endif -#endif - - fghJoystickOpen( fgJoystick[ ident ] ); -} - -/* - * Try initializing all the joysticks (well, both of them) - */ -void fgInitialiseJoysticks ( void ) -{ - if( !fgState.JoysticksInitialised ) - { - int ident ; - for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) - fghJoystickInit( ident ); - - fgState.JoysticksInitialised = GL_TRUE; - } -} - -/* - * - */ -void fgJoystickClose( void ) -{ - int ident ; - for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) - { - if( fgJoystick[ ident ] ) - { - -#if TARGET_HOST_MACINTOSH - ISpSuspend( ); - ISpStop( ); - ISpShutdown( ); -#endif - -#if TARGET_HOST_MAC_OSX - ( *( fgJoystick[ ident ]->hidDev ) )-> - close( fgJoystick[ ident ]->hidDev ); -#endif - -#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - /* Do nothing special */ -#endif - -#if TARGET_HOST_POSIX_X11 -#if defined( __FreeBSD__ ) || defined( __NetBSD__ ) - if( fgJoystick[ident]->os ) - { - if( ! fgJoystick[ ident ]->error ) - close( fgJoystick[ ident ]->os->fd ); -#ifdef HAVE_USB_JS - if( fgJoystick[ ident ]->os->hids ) - free (fgJoystick[ ident ]->os->hids); - if( fgJoystick[ ident ]->os->hid_data_buf ) - free( fgJoystick[ ident ]->os->hid_data_buf ); -#endif - free( fgJoystick[ident]->os ); - } -#endif - - if( ! fgJoystick[ident]->error ) - close( fgJoystick[ ident ]->fd ); -#endif - - free( fgJoystick[ ident ] ); - fgJoystick[ ident ] = NULL; - /* show joystick has been deinitialized */ - } - } -} - -/* - * Polls the joystick and executes the joystick callback hooked to the - * window specified in the function's parameter: - */ -void fgJoystickPollWindow( SFG_Window* window ) -{ - float axes[ _JS_MAX_AXES ]; - int buttons; - int ident; - - freeglut_return_if_fail( window ); - freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) ); - - for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ ) - { - if( fgJoystick[ident] ) - { - fghJoystickRead( fgJoystick[ident], &buttons, axes ); - - if( !fgJoystick[ident]->error ) - INVOKE_WCB( *window, Joystick, - ( buttons, - (int) ( axes[ 0 ] * 1000.0f ), - (int) ( axes[ 1 ] * 1000.0f ), - (int) ( axes[ 2 ] * 1000.0f ) ) - ); - } - } -} - -/* - * Implementation for glutDeviceGet(GLUT_HAS_JOYSTICK) - */ -int fgJoystickDetect( void ) -{ - int ident; - - fgInitialiseJoysticks (); - - if ( !fgState.JoysticksInitialised ) - return 0; - - for( ident=0; identerror ) - return 1; - - return 0; -} - -/* - * Joystick information functions - */ -int glutJoystickGetNumAxes( int ident ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumAxes" ); - return fgJoystick[ ident ]->num_axes; -} -int glutJoystickGetNumButtons( int ident ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumButtons" ); - return fgJoystick[ ident ]->num_buttons; -} -int glutJoystickNotWorking( int ident ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickNotWorking" ); - return fgJoystick[ ident ]->error; -} - -float glutJoystickGetDeadBand( int ident, int axis ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetDeadBand" ); - return fgJoystick[ ident ]->dead_band [ axis ]; -} -void glutJoystickSetDeadBand( int ident, int axis, float db ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetDeadBand" ); - fgJoystick[ ident ]->dead_band[ axis ] = db; -} - -float glutJoystickGetSaturation( int ident, int axis ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetSaturation" ); - return fgJoystick[ ident ]->saturate[ axis ]; -} -void glutJoystickSetSaturation( int ident, int axis, float st ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetSaturation" ); - fgJoystick[ ident ]->saturate [ axis ] = st; -} - -void glutJoystickSetMinRange( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMinRange" ); - memcpy( fgJoystick[ ident ]->min, axes, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} -void glutJoystickSetMaxRange( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMaxRange" ); - memcpy( fgJoystick[ ident ]->max, axes, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} -void glutJoystickSetCenter( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetCenter" ); - memcpy( fgJoystick[ ident ]->center, axes, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} - -void glutJoystickGetMinRange( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMinRange" ); - memcpy( axes, fgJoystick[ ident ]->min, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} -void glutJoystickGetMaxRange( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMaxRange" ); - memcpy( axes, fgJoystick[ ident ]->max, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} -void glutJoystickGetCenter( int ident, float *axes ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetCenter" ); - memcpy( axes, fgJoystick[ ident ]->center, - fgJoystick[ ident ]->num_axes * sizeof( float ) ); -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_main.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_main.c deleted file mode 100644 index 0a4540299..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_main.c +++ /dev/null @@ -1,2296 +0,0 @@ -/* - * freeglut_main.c - * - * The windows message processing methods. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 3 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" -#if HAVE_ERRNO -# include -#endif -#include -#if HAVE_VPRINTF -# define VFPRINTF(s,f,a) vfprintf((s),(f),(a)) -#elif HAVE_DOPRNT -# define VFPRINTF(s,f,a) _doprnt((f),(a),(s)) -#else -# define VFPRINTF(s,f,a) -#endif - -#ifdef _WIN32_WCE - -typedef struct GXDisplayProperties GXDisplayProperties; -typedef struct GXKeyList GXKeyList; -#include - -typedef struct GXKeyList (*GXGETDEFAULTKEYS)(int); -typedef int (*GXOPENINPUT)(); - -GXGETDEFAULTKEYS GXGetDefaultKeys_ = NULL; -GXOPENINPUT GXOpenInput_ = NULL; - -struct GXKeyList gxKeyList; - -#endif /* _WIN32_WCE */ - -/* - * Try to get the maximum value allowed for ints, falling back to the minimum - * guaranteed by ISO C99 if there is no suitable header. - */ -#if HAVE_LIMITS_H -# include -#endif -#ifndef INT_MAX -# define INT_MAX 32767 -#endif - -#ifndef MIN -# define MIN(a,b) (((a)<(b)) ? (a) : (b)) -#endif - - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * There are some issues concerning window redrawing under X11, and maybe - * some events are not handled. The Win32 version lacks some more features, - * but seems acceptable for not demanding purposes. - * - * Need to investigate why the X11 version breaks out with an error when - * closing a window (using the window manager, not glutDestroyWindow)... - */ - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -/* - * Handle a window configuration change. When no reshape - * callback is hooked, the viewport size is updated to - * match the new window size. - */ -static void fghReshapeWindow ( SFG_Window *window, int width, int height ) -{ - SFG_Window *current_window = fgStructure.CurrentWindow; - - freeglut_return_if_fail( window != NULL ); - - -#if TARGET_HOST_POSIX_X11 - - XResizeWindow( fgDisplay.Display, window->Window.Handle, - width, height ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) - { - RECT winRect; - int x, y, w, h; - - /* - * For windowed mode, get the current position of the - * window and resize taking the size of the frame - * decorations into account. - */ - - /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ - GetWindowRect( window->Window.Handle, &winRect ); - x = winRect.left; - y = winRect.top; - w = width; - h = height; - - if ( window->Parent == NULL ) - { - if ( ! window->IsMenu && (window != fgStructure.GameModeWindow) ) - { - w += GetSystemMetrics( SM_CXSIZEFRAME ) * 2; - h += GetSystemMetrics( SM_CYSIZEFRAME ) * 2 + - GetSystemMetrics( SM_CYCAPTION ); - } - } - else - { - RECT parentRect; - GetWindowRect( window->Parent->Window.Handle, &parentRect ); - x -= parentRect.left + GetSystemMetrics( SM_CXSIZEFRAME ) * 2; - y -= parentRect.top + GetSystemMetrics( SM_CYSIZEFRAME ) * 2 + - GetSystemMetrics( SM_CYCAPTION ); - } - - /* - * SWP_NOACTIVATE Do not activate the window - * SWP_NOOWNERZORDER Do not change position in z-order - * SWP_NOSENDCHANGING Supress WM_WINDOWPOSCHANGING message - * SWP_NOZORDER Retains the current Z order (ignore 2nd param) - */ - - SetWindowPos( window->Window.Handle, - HWND_TOP, - x, y, w, h, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | - SWP_NOZORDER - ); - } -#endif - - /* - * XXX Should update {window->State.OldWidth, window->State.OldHeight} - * XXX to keep in lockstep with POSIX_X11 code. - */ - if( FETCH_WCB( *window, Reshape ) ) - INVOKE_WCB( *window, Reshape, ( width, height ) ); - else - { - fgSetWindow( window ); - glViewport( 0, 0, width, height ); - } - - /* - * Force a window redraw. In Windows at least this is only a partial - * solution: if the window is increasing in size in either dimension, - * the already-drawn part does not get drawn again and things look funny. - * But without this we get this bad behaviour whenever we resize the - * window. - */ - window->State.Redisplay = GL_TRUE; - - if( window->IsMenu ) - fgSetWindow( current_window ); -} - -/* - * Calls a window's redraw method. This is used when - * a redraw is forced by the incoming window messages. - */ -static void fghRedrawWindow ( SFG_Window *window ) -{ - SFG_Window *current_window = fgStructure.CurrentWindow; - - freeglut_return_if_fail( window ); - freeglut_return_if_fail( FETCH_WCB ( *window, Display ) ); - - window->State.Redisplay = GL_FALSE; - - freeglut_return_if_fail( window->State.Visible ); - - fgSetWindow( window ); - - if( window->State.NeedToResize ) - { - fghReshapeWindow( - window, - window->State.Width, - window->State.Height - ); - - window->State.NeedToResize = GL_FALSE; - } - - INVOKE_WCB( *window, Display, ( ) ); - - fgSetWindow( current_window ); -} - -/* - * A static helper function to execute display callback for a window - */ -static void fghcbDisplayWindow( SFG_Window *window, - SFG_Enumerator *enumerator ) -{ - if( window->State.Redisplay && - window->State.Visible ) - { - window->State.Redisplay = GL_FALSE; - -#if TARGET_HOST_POSIX_X11 - fghRedrawWindow ( window ) ; -#elif TARGET_HOST_MS_WINDOWS - RedrawWindow( - window->Window.Handle, NULL, NULL, - RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW - ); -#endif - } - - fgEnumSubWindows( window, fghcbDisplayWindow, enumerator ); -} - -/* - * Make all windows perform a display call - */ -static void fghDisplayAll( void ) -{ - SFG_Enumerator enumerator; - - enumerator.found = GL_FALSE; - enumerator.data = NULL; - - fgEnumWindows( fghcbDisplayWindow, &enumerator ); -} - -/* - * Window enumerator callback to check for the joystick polling code - */ -static void fghcbCheckJoystickPolls( SFG_Window *window, - SFG_Enumerator *enumerator ) -{ - long int checkTime = fgElapsedTime( ); - - if( window->State.JoystickLastPoll + window->State.JoystickPollRate <= - checkTime ) - { -#if !defined(_WIN32_WCE) - fgJoystickPollWindow( window ); -#endif /* !defined(_WIN32_WCE) */ - window->State.JoystickLastPoll = checkTime; - } - - fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator ); -} - -/* - * Check all windows for joystick polling - */ -static void fghCheckJoystickPolls( void ) -{ - SFG_Enumerator enumerator; - - enumerator.found = GL_FALSE; - enumerator.data = NULL; - - fgEnumWindows( fghcbCheckJoystickPolls, &enumerator ); -} - -/* - * Check the global timers - */ -static void fghCheckTimers( void ) -{ - long checkTime = fgElapsedTime( ); - - while( fgState.Timers.First ) - { - SFG_Timer *timer = fgState.Timers.First; - - if( timer->TriggerTime > checkTime ) - break; - - fgListRemove( &fgState.Timers, &timer->Node ); - fgListAppend( &fgState.FreeTimers, &timer->Node ); - - timer->Callback( timer->ID ); - } -} - - -/* Platform-dependent time in milliseconds, as an unsigned 32-bit integer. - * This value wraps every 49.7 days, but integer overflows cancel - * when subtracting an initial start time, unless the total time exceeds - * 32-bit, where the GLUT API return value is also overflowed. - */ -unsigned long fgSystemTime(void) { -#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY - struct timeval now; - gettimeofday( &now, NULL ); - return now.tv_usec/1000 + now.tv_sec*1000; -#elif TARGET_HOST_MS_WINDOWS -# if defined(_WIN32_WCE) - return GetTickCount(); -# else - return timeGetTime(); -# endif -#endif -} - -/* - * Elapsed Time - */ -long fgElapsedTime( void ) -{ - return (long) (fgSystemTime() - fgState.Time); -} - -/* - * Error Messages. - */ -void fgError( const char *fmt, ... ) -{ - va_list ap; - - va_start( ap, fmt ); - - fprintf( stderr, "freeglut "); - if( fgState.ProgramName ) - fprintf( stderr, "(%s): ", fgState.ProgramName ); - VFPRINTF( stderr, fmt, ap ); - fprintf( stderr, "\n" ); - - va_end( ap ); - - if ( fgState.Initialised ) - fgDeinitialize (); - - exit( 1 ); -} - -void fgWarning( const char *fmt, ... ) -{ - va_list ap; - - va_start( ap, fmt ); - - fprintf( stderr, "freeglut "); - if( fgState.ProgramName ) - fprintf( stderr, "(%s): ", fgState.ProgramName ); - VFPRINTF( stderr, fmt, ap ); - fprintf( stderr, "\n" ); - - va_end( ap ); -} - -/* - * Indicates whether Joystick events are being used by ANY window. - * - * The current mechanism is to walk all of the windows and ask if - * there is a joystick callback. We have a short-circuit early - * return if we find any joystick handler registered. - * - * The real way to do this is to make use of the glutTimer() API - * to more cleanly re-implement the joystick API. Then, this code - * and all other "joystick timer" code can be yanked. - * - */ -static void fghCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e) -{ - if( FETCH_WCB( *w, Joystick ) ) - { - e->found = GL_TRUE; - e->data = w; - } - fgEnumSubWindows( w, fghCheckJoystickCallback, e ); -} -static int fghHaveJoystick( void ) -{ - SFG_Enumerator enumerator; - - enumerator.found = GL_FALSE; - enumerator.data = NULL; - fgEnumWindows( fghCheckJoystickCallback, &enumerator ); - return !!enumerator.data; -} -static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e) -{ - if( w->State.Redisplay && w->State.Visible ) - { - e->found = GL_TRUE; - e->data = w; - } - fgEnumSubWindows( w, fghHavePendingRedisplaysCallback, e ); -} -static int fghHavePendingRedisplays (void) -{ - SFG_Enumerator enumerator; - - enumerator.found = GL_FALSE; - enumerator.data = NULL; - fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator ); - return !!enumerator.data; -} -/* - * Returns the number of GLUT ticks (milliseconds) till the next timer event. - */ -static long fghNextTimer( void ) -{ - long ret = INT_MAX; - SFG_Timer *timer = fgState.Timers.First; - - if( timer ) - ret = timer->TriggerTime - fgElapsedTime(); - if( ret < 0 ) - ret = 0; - - return ret; -} -/* - * Does the magic required to relinquish the CPU until something interesting - * happens. - */ -static void fghSleepForEvents( void ) -{ - long msec; - - if( fgState.IdleCallback || fghHavePendingRedisplays( ) ) - return; - - msec = fghNextTimer( ); - /* XXX Use GLUT timers for joysticks... */ - /* XXX Dumb; forces granularity to .01sec */ - if( fghHaveJoystick( ) && ( msec > 10 ) ) - msec = 10; - -#if TARGET_HOST_POSIX_X11 - /* - * Possibly due to aggressive use of XFlush() and friends, - * it is possible to have our socket drained but still have - * unprocessed events. (Or, this may just be normal with - * X, anyway?) We do non-trivial processing of X events - * after the event-reading loop, in any case, so we - * need to allow that we may have an empty socket but non- - * empty event queue. - */ - if( ! XPending( fgDisplay.Display ) ) - { - fd_set fdset; - int err; - int socket; - struct timeval wait; - - socket = ConnectionNumber( fgDisplay.Display ); - FD_ZERO( &fdset ); - FD_SET( socket, &fdset ); - wait.tv_sec = msec / 1000; - wait.tv_usec = (msec % 1000) * 1000; - err = select( socket+1, &fdset, NULL, NULL, &wait ); - -#if HAVE_ERRNO - if( ( -1 == err ) && ( errno != EINTR ) ) - fgWarning ( "freeglut select() error: %d", errno ); -#endif - } -#elif TARGET_HOST_MS_WINDOWS - MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT ); -#endif -} - -#if TARGET_HOST_POSIX_X11 -/* - * Returns GLUT modifier mask for the state field of an X11 event. - */ -static int fghGetXModifiers( int state ) -{ - int ret = 0; - - if( state & ( ShiftMask | LockMask ) ) - ret |= GLUT_ACTIVE_SHIFT; - if( state & ControlMask ) - ret |= GLUT_ACTIVE_CTRL; - if( state & Mod1Mask ) - ret |= GLUT_ACTIVE_ALT; - - return ret; -} -#endif - - -#if TARGET_HOST_POSIX_X11 && _DEBUG - -static const char* fghTypeToString( int type ) -{ - switch( type ) { - case KeyPress: return "KeyPress"; - case KeyRelease: return "KeyRelease"; - case ButtonPress: return "ButtonPress"; - case ButtonRelease: return "ButtonRelease"; - case MotionNotify: return "MotionNotify"; - case EnterNotify: return "EnterNotify"; - case LeaveNotify: return "LeaveNotify"; - case FocusIn: return "FocusIn"; - case FocusOut: return "FocusOut"; - case KeymapNotify: return "KeymapNotify"; - case Expose: return "Expose"; - case GraphicsExpose: return "GraphicsExpose"; - case NoExpose: return "NoExpose"; - case VisibilityNotify: return "VisibilityNotify"; - case CreateNotify: return "CreateNotify"; - case DestroyNotify: return "DestroyNotify"; - case UnmapNotify: return "UnmapNotify"; - case MapNotify: return "MapNotify"; - case MapRequest: return "MapRequest"; - case ReparentNotify: return "ReparentNotify"; - case ConfigureNotify: return "ConfigureNotify"; - case ConfigureRequest: return "ConfigureRequest"; - case GravityNotify: return "GravityNotify"; - case ResizeRequest: return "ResizeRequest"; - case CirculateNotify: return "CirculateNotify"; - case CirculateRequest: return "CirculateRequest"; - case PropertyNotify: return "PropertyNotify"; - case SelectionClear: return "SelectionClear"; - case SelectionRequest: return "SelectionRequest"; - case SelectionNotify: return "SelectionNotify"; - case ColormapNotify: return "ColormapNotify"; - case ClientMessage: return "ClientMessage"; - case MappingNotify: return "MappingNotify"; - default: return "UNKNOWN"; - } -} - -static const char* fghBoolToString( Bool b ) -{ - return b == False ? "False" : "True"; -} - -static const char* fghNotifyHintToString( char is_hint ) -{ - switch( is_hint ) { - case NotifyNormal: return "NotifyNormal"; - case NotifyHint: return "NotifyHint"; - default: return "UNKNOWN"; - } -} - -static const char* fghNotifyModeToString( int mode ) -{ - switch( mode ) { - case NotifyNormal: return "NotifyNormal"; - case NotifyGrab: return "NotifyGrab"; - case NotifyUngrab: return "NotifyUngrab"; - case NotifyWhileGrabbed: return "NotifyWhileGrabbed"; - default: return "UNKNOWN"; - } -} - -static const char* fghNotifyDetailToString( int detail ) -{ - switch( detail ) { - case NotifyAncestor: return "NotifyAncestor"; - case NotifyVirtual: return "NotifyVirtual"; - case NotifyInferior: return "NotifyInferior"; - case NotifyNonlinear: return "NotifyNonlinear"; - case NotifyNonlinearVirtual: return "NotifyNonlinearVirtual"; - case NotifyPointer: return "NotifyPointer"; - case NotifyPointerRoot: return "NotifyPointerRoot"; - case NotifyDetailNone: return "NotifyDetailNone"; - default: return "UNKNOWN"; - } -} - -static const char* fghVisibilityToString( int state ) { - switch( state ) { - case VisibilityUnobscured: return "VisibilityUnobscured"; - case VisibilityPartiallyObscured: return "VisibilityPartiallyObscured"; - case VisibilityFullyObscured: return "VisibilityFullyObscured"; - default: return "UNKNOWN"; - } -} - -static const char* fghConfigureDetailToString( int detail ) -{ - switch( detail ) { - case Above: return "Above"; - case Below: return "Below"; - case TopIf: return "TopIf"; - case BottomIf: return "BottomIf"; - case Opposite: return "Opposite"; - default: return "UNKNOWN"; - } -} - -static const char* fghPlaceToString( int place ) -{ - switch( place ) { - case PlaceOnTop: return "PlaceOnTop"; - case PlaceOnBottom: return "PlaceOnBottom"; - default: return "UNKNOWN"; - } -} - -static const char* fghMappingRequestToString( int request ) -{ - switch( request ) { - case MappingModifier: return "MappingModifier"; - case MappingKeyboard: return "MappingKeyboard"; - case MappingPointer: return "MappingPointer"; - default: return "UNKNOWN"; - } -} - -static const char* fghPropertyStateToString( int state ) -{ - switch( state ) { - case PropertyNewValue: return "PropertyNewValue"; - case PropertyDelete: return "PropertyDelete"; - default: return "UNKNOWN"; - } -} - -static const char* fghColormapStateToString( int state ) -{ - switch( state ) { - case ColormapUninstalled: return "ColormapUninstalled"; - case ColormapInstalled: return "ColormapInstalled"; - default: return "UNKNOWN"; - } -} - -static void fghPrintEvent( XEvent *event ) -{ - switch( event->type ) { - - case KeyPress: - case KeyRelease: { - XKeyEvent *e = &event->xkey; - fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, " - "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, " - "keycode=%u, same_screen=%s", fghTypeToString( e->type ), - e->window, e->root, e->subwindow, (unsigned long)e->time, - e->x, e->y, e->x_root, e->y_root, e->state, e->keycode, - fghBoolToString( e->same_screen ) ); - break; - } - - case ButtonPress: - case ButtonRelease: { - XButtonEvent *e = &event->xbutton; - fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, " - "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, " - "button=%u, same_screen=%d", fghTypeToString( e->type ), - e->window, e->root, e->subwindow, (unsigned long)e->time, - e->x, e->y, e->x_root, e->y_root, e->state, e->button, - fghBoolToString( e->same_screen ) ); - break; - } - - case MotionNotify: { - XMotionEvent *e = &event->xmotion; - fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, " - "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, " - "is_hint=%s, same_screen=%d", fghTypeToString( e->type ), - e->window, e->root, e->subwindow, (unsigned long)e->time, - e->x, e->y, e->x_root, e->y_root, e->state, - fghNotifyHintToString( e->is_hint ), - fghBoolToString( e->same_screen ) ); - break; - } - - case EnterNotify: - case LeaveNotify: { - XCrossingEvent *e = &event->xcrossing; - fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, " - "(x,y)=(%d,%d), mode=%s, detail=%s, same_screen=%d, " - "focus=%d, state=0x%x", fghTypeToString( e->type ), - e->window, e->root, e->subwindow, (unsigned long)e->time, - e->x, e->y, fghNotifyModeToString( e->mode ), - fghNotifyDetailToString( e->detail ), (int)e->same_screen, - (int)e->focus, e->state ); - break; - } - - case FocusIn: - case FocusOut: { - XFocusChangeEvent *e = &event->xfocus; - fgWarning( "%s: window=0x%x, mode=%s, detail=%s", - fghTypeToString( e->type ), e->window, - fghNotifyModeToString( e->mode ), - fghNotifyDetailToString( e->detail ) ); - break; - } - - case KeymapNotify: { - XKeymapEvent *e = &event->xkeymap; - char buf[32 * 2 + 1]; - int i; - for ( i = 0; i < 32; i++ ) { - snprintf( &buf[ i * 2 ], sizeof( buf ) - i * 2, - "%02x", e->key_vector[ i ] ); - } - buf[ i ] = '\0'; - fgWarning( "%s: window=0x%x, %s", fghTypeToString( e->type ), e->window, - buf ); - break; - } - - case Expose: { - XExposeEvent *e = &event->xexpose; - fgWarning( "%s: window=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), " - "count=%d", fghTypeToString( e->type ), e->window, e->x, - e->y, e->width, e->height, e->count ); - break; - } - - case GraphicsExpose: { - XGraphicsExposeEvent *e = &event->xgraphicsexpose; - fgWarning( "%s: drawable=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), " - "count=%d, (major_code,minor_code)=(%d,%d)", - fghTypeToString( e->type ), e->drawable, e->x, e->y, - e->width, e->height, e->count, e->major_code, - e->minor_code ); - break; - } - - case NoExpose: { - XNoExposeEvent *e = &event->xnoexpose; - fgWarning( "%s: drawable=0x%x, (major_code,minor_code)=(%d,%d)", - fghTypeToString( e->type ), e->drawable, e->major_code, - e->minor_code ); - break; - } - - case VisibilityNotify: { - XVisibilityEvent *e = &event->xvisibility; - fgWarning( "%s: window=0x%x, state=%s", fghTypeToString( e->type ), - e->window, fghVisibilityToString( e->state) ); - break; - } - - case CreateNotify: { - XCreateWindowEvent *e = &event->xcreatewindow; - fgWarning( "%s: (x,y)=(%d,%d), (width,height)=(%d,%d), border_width=%d, " - "window=0x%x, override_redirect=%s", - fghTypeToString( e->type ), e->x, e->y, e->width, e->height, - e->border_width, e->window, - fghBoolToString( e->override_redirect ) ); - break; - } - - case DestroyNotify: { - XDestroyWindowEvent *e = &event->xdestroywindow; - fgWarning( "%s: event=0x%x, window=0x%x", - fghTypeToString( e->type ), e->event, e->window ); - break; - } - - case UnmapNotify: { - XUnmapEvent *e = &event->xunmap; - fgWarning( "%s: event=0x%x, window=0x%x, from_configure=%s", - fghTypeToString( e->type ), e->event, e->window, - fghBoolToString( e->from_configure ) ); - break; - } - - case MapNotify: { - XMapEvent *e = &event->xmap; - fgWarning( "%s: event=0x%x, window=0x%x, override_redirect=%s", - fghTypeToString( e->type ), e->event, e->window, - fghBoolToString( e->override_redirect ) ); - break; - } - - case MapRequest: { - XMapRequestEvent *e = &event->xmaprequest; - fgWarning( "%s: parent=0x%x, window=0x%x", - fghTypeToString( event->type ), e->parent, e->window ); - break; - } - - case ReparentNotify: { - XReparentEvent *e = &event->xreparent; - fgWarning( "%s: event=0x%x, window=0x%x, parent=0x%x, (x,y)=(%d,%d), " - "override_redirect=%s", fghTypeToString( e->type ), - e->event, e->window, e->parent, e->x, e->y, - fghBoolToString( e->override_redirect ) ); - break; - } - - case ConfigureNotify: { - XConfigureEvent *e = &event->xconfigure; - fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d), " - "(width,height)=(%d,%d), border_width=%d, above=0x%x, " - "override_redirect=%s", fghTypeToString( e->type ), e->event, - e->window, e->x, e->y, e->width, e->height, e->border_width, - e->above, fghBoolToString( e->override_redirect ) ); - break; - } - - case ConfigureRequest: { - XConfigureRequestEvent *e = &event->xconfigurerequest; - fgWarning( "%s: parent=0x%x, window=0x%x, (x,y)=(%d,%d), " - "(width,height)=(%d,%d), border_width=%d, above=0x%x, " - "detail=%s, value_mask=%lx", fghTypeToString( e->type ), - e->parent, e->window, e->x, e->y, e->width, e->height, - e->border_width, e->above, - fghConfigureDetailToString( e->detail ), e->value_mask ); - break; - } - - case GravityNotify: { - XGravityEvent *e = &event->xgravity; - fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d)", - fghTypeToString( e->type ), e->event, e->window, e->x, e->y ); - break; - } - - case ResizeRequest: { - XResizeRequestEvent *e = &event->xresizerequest; - fgWarning( "%s: window=0x%x, (width,height)=(%d,%d)", - fghTypeToString( e->type ), e->window, e->width, e->height ); - break; - } - - case CirculateNotify: { - XCirculateEvent *e = &event->xcirculate; - fgWarning( "%s: event=0x%x, window=0x%x, place=%s", - fghTypeToString( e->type ), e->event, e->window, - fghPlaceToString( e->place ) ); - break; - } - - case CirculateRequest: { - XCirculateRequestEvent *e = &event->xcirculaterequest; - fgWarning( "%s: parent=0x%x, window=0x%x, place=%s", - fghTypeToString( e->type ), e->parent, e->window, - fghPlaceToString( e->place ) ); - break; - } - - case PropertyNotify: { - XPropertyEvent *e = &event->xproperty; - fgWarning( "%s: window=0x%x, atom=%lu, time=%lu, state=%s", - fghTypeToString( e->type ), e->window, - (unsigned long)e->atom, (unsigned long)e->time, - fghPropertyStateToString( e->state ) ); - break; - } - - case SelectionClear: { - XSelectionClearEvent *e = &event->xselectionclear; - fgWarning( "%s: window=0x%x, selection=%lu, time=%lu", - fghTypeToString( e->type ), e->window, - (unsigned long)e->selection, (unsigned long)e->time ); - break; - } - - case SelectionRequest: { - XSelectionRequestEvent *e = &event->xselectionrequest; - fgWarning( "%s: owner=0x%x, requestor=0x%x, selection=0x%x, " - "target=0x%x, property=%lu, time=%lu", - fghTypeToString( e->type ), e->owner, e->requestor, - (unsigned long)e->selection, (unsigned long)e->target, - (unsigned long)e->property, (unsigned long)e->time ); - break; - } - - case SelectionNotify: { - XSelectionEvent *e = &event->xselection; - fgWarning( "%s: requestor=0x%x, selection=0x%x, target=0x%x, " - "property=%lu, time=%lu", fghTypeToString( e->type ), - e->requestor, (unsigned long)e->selection, - (unsigned long)e->target, (unsigned long)e->property, - (unsigned long)e->time ); - break; - } - - case ColormapNotify: { - XColormapEvent *e = &event->xcolormap; - fgWarning( "%s: window=0x%x, colormap=%lu, new=%s, state=%s", - fghTypeToString( e->type ), e->window, - (unsigned long)e->colormap, fghBoolToString( e->new ), - fghColormapStateToString( e->state ) ); - break; - } - - case ClientMessage: { - XClientMessageEvent *e = &event->xclient; - char buf[ 61 ]; - char* p = buf; - char* end = buf + sizeof( buf ); - int i; - switch( e->format ) { - case 8: - for ( i = 0; i < 20; i++, p += 3 ) { - snprintf( p, end - p, " %02x", e->data.b[ i ] ); - } - break; - case 16: - for ( i = 0; i < 10; i++, p += 5 ) { - snprintf( p, end - p, " %04x", e->data.s[ i ] ); - } - break; - case 32: - for ( i = 0; i < 5; i++, p += 9 ) { - snprintf( p, end - p, " %08lx", e->data.l[ i ] ); - } - break; - } - *p = '\0'; - fgWarning( "%s: window=0x%x, message_type=%lu, format=%d, data=(%s )", - fghTypeToString( e->type ), e->window, - (unsigned long)e->message_type, e->format, buf ); - break; - } - - case MappingNotify: { - XMappingEvent *e = &event->xmapping; - fgWarning( "%s: window=0x%x, request=%s, first_keycode=%d, count=%d", - fghTypeToString( e->type ), e->window, - fghMappingRequestToString( e->request ), e->first_keycode, - e->count ); - break; - } - - default: { - fgWarning( "%s", fghTypeToString( event->type ) ); - break; - } - } -} - -#endif - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Executes a single iteration in the freeglut processing loop. - */ -void FGAPIENTRY glutMainLoopEvent( void ) -{ -#if TARGET_HOST_POSIX_X11 - SFG_Window* window; - XEvent event; - - /* This code was repeated constantly, so here it goes into a definition: */ -#define GETWINDOW(a) \ - window = fgWindowByHandle( event.a.window ); \ - if( window == NULL ) \ - break; - -#define GETMOUSE(a) \ - window->State.MouseX = event.a.x; \ - window->State.MouseY = event.a.y; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" ); - - while( XPending( fgDisplay.Display ) ) - { - XNextEvent( fgDisplay.Display, &event ); -#if _DEBUG - fghPrintEvent( &event ); -#endif - - switch( event.type ) - { - case ClientMessage: - if(fgIsSpaceballXEvent(&event)) { - fgSpaceballHandleXEvent(&event); - break; - } - /* Destroy the window when the WM_DELETE_WINDOW message arrives */ - if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.DeleteWindow ) - { - GETWINDOW( xclient ); - - fgDestroyWindow ( window ); - - if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) - { - fgDeinitialize( ); - exit( 0 ); - } - else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS ) - fgState.ExecState = GLUT_EXEC_STATE_STOP; - - return; - } - break; - - /* - * CreateNotify causes a configure-event so that sub-windows are - * handled compatibly with GLUT. Otherwise, your sub-windows - * (in freeglut only) will not get an initial reshape event, - * which can break things. - * - * GLUT presumably does this because it generally tries to treat - * sub-windows the same as windows. - */ - case CreateNotify: - case ConfigureNotify: - { - int width, height; - if( event.type == CreateNotify ) { - GETWINDOW( xcreatewindow ); - width = event.xcreatewindow.width; - height = event.xcreatewindow.height; - } else { - GETWINDOW( xconfigure ); - width = event.xconfigure.width; - height = event.xconfigure.height; - } - - if( ( width != window->State.OldWidth ) || - ( height != window->State.OldHeight ) ) - { - SFG_Window *current_window = fgStructure.CurrentWindow; - - window->State.OldWidth = width; - window->State.OldHeight = height; - if( FETCH_WCB( *window, Reshape ) ) - INVOKE_WCB( *window, Reshape, ( width, height ) ); - else - { - fgSetWindow( window ); - glViewport( 0, 0, width, height ); - } - glutPostRedisplay( ); - if( window->IsMenu ) - fgSetWindow( current_window ); - } - } - break; - - case DestroyNotify: - /* - * This is sent to confirm the XDestroyWindow call. - * - * XXX WHY is this commented out? Should we re-enable it? - */ - /* fgAddToWindowDestroyList ( window ); */ - break; - - case Expose: - /* - * We are too dumb to process partial exposes... - * - * XXX Well, we could do it. However, it seems to only - * XXX be potentially useful for single-buffered (since - * XXX double-buffered does not respect viewport when we - * XXX do a buffer-swap). - * - */ - if( event.xexpose.count == 0 ) - { - GETWINDOW( xexpose ); - window->State.Redisplay = GL_TRUE; - } - break; - - case MapNotify: - break; - - case UnmapNotify: - /* We get this when iconifying a window. */ - GETWINDOW( xunmap ); - INVOKE_WCB( *window, WindowStatus, ( GLUT_HIDDEN ) ); - window->State.Visible = GL_FALSE; - break; - - case MappingNotify: - /* - * Have the client's keyboard knowledge updated (xlib.ps, - * page 206, says that's a good thing to do) - */ - XRefreshKeyboardMapping( (XMappingEvent *) &event ); - break; - - case VisibilityNotify: - { - /* - * Sending this event, the X server can notify us that the window - * has just acquired one of the three possible visibility states: - * VisibilityUnobscured, VisibilityPartiallyObscured or - * VisibilityFullyObscured. Note that we DO NOT receive a - * VisibilityNotify event when iconifying a window, we only get an - * UnmapNotify then. - */ - GETWINDOW( xvisibility ); - switch( event.xvisibility.state ) - { - case VisibilityUnobscured: - INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_RETAINED ) ); - window->State.Visible = GL_TRUE; - break; - - case VisibilityPartiallyObscured: - INVOKE_WCB( *window, WindowStatus, - ( GLUT_PARTIALLY_RETAINED ) ); - window->State.Visible = GL_TRUE; - break; - - case VisibilityFullyObscured: - INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_COVERED ) ); - window->State.Visible = GL_FALSE; - break; - - default: - fgWarning( "Unknown X visibility state: %d", - event.xvisibility.state ); - break; - } - } - break; - - case EnterNotify: - case LeaveNotify: - GETWINDOW( xcrossing ); - GETMOUSE( xcrossing ); - if( ( event.type == LeaveNotify ) && window->IsMenu && - window->ActiveMenu && window->ActiveMenu->IsActive ) - fgUpdateMenuHighlight( window->ActiveMenu ); - - INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ? - GLUT_ENTERED : - GLUT_LEFT ) ); - break; - - case MotionNotify: - { - GETWINDOW( xmotion ); - GETMOUSE( xmotion ); - - if( window->ActiveMenu ) - { - if( window == window->ActiveMenu->ParentWindow ) - { - window->ActiveMenu->Window->State.MouseX = - event.xmotion.x_root - window->ActiveMenu->X; - window->ActiveMenu->Window->State.MouseY = - event.xmotion.y_root - window->ActiveMenu->Y; - } - - fgUpdateMenuHighlight( window->ActiveMenu ); - - break; - } - - /* - * XXX For more than 5 buttons, just check {event.xmotion.state}, - * XXX rather than a host of bit-masks? Or maybe we need to - * XXX track ButtonPress/ButtonRelease events in our own - * XXX bit-mask? - */ - fgState.Modifiers = fghGetXModifiers( event.xmotion.state ); - if ( event.xmotion.state & ( Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask ) ) { - INVOKE_WCB( *window, Motion, ( event.xmotion.x, - event.xmotion.y ) ); - } else { - INVOKE_WCB( *window, Passive, ( event.xmotion.x, - event.xmotion.y ) ); - } - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case ButtonRelease: - case ButtonPress: - { - GLboolean pressed = GL_TRUE; - int button; - - if( event.type == ButtonRelease ) - pressed = GL_FALSE ; - - /* - * A mouse button has been pressed or released. Traditionally, - * break if the window was found within the freeglut structures. - */ - GETWINDOW( xbutton ); - GETMOUSE( xbutton ); - - /* - * An X button (at least in XFree86) is numbered from 1. - * A GLUT button is numbered from 0. - * Old GLUT passed through buttons other than just the first - * three, though it only gave symbolic names and official - * support to the first three. - */ - button = event.xbutton.button - 1; - - /* - * Do not execute the application's mouse callback if a menu - * is hooked to this button. In that case an appropriate - * private call should be generated. - */ - if( fgCheckActiveMenu( window, button, pressed, - event.xbutton.x_root, event.xbutton.y_root ) ) - break; - - /* - * Check if there is a mouse or mouse wheel callback hooked to the - * window - */ - if( ! FETCH_WCB( *window, Mouse ) && - ! FETCH_WCB( *window, MouseWheel ) ) - break; - - fgState.Modifiers = fghGetXModifiers( event.xbutton.state ); - - /* Finally execute the mouse or mouse wheel callback */ - if( ( button < glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS ) ) || ( ! FETCH_WCB( *window, MouseWheel ) ) ) - INVOKE_WCB( *window, Mouse, ( button, - pressed ? GLUT_DOWN : GLUT_UP, - event.xbutton.x, - event.xbutton.y ) - ); - else - { - /* - * Map 4 and 5 to wheel zero; EVEN to +1, ODD to -1 - * " 6 and 7 " " one; ... - * - * XXX This *should* be behind some variables/macros, - * XXX since the order and numbering isn't certain - * XXX See XFree86 configuration docs (even back in the - * XXX 3.x days, and especially with 4.x). - * - * XXX Note that {button} has already been decremeted - * XXX in mapping from X button numbering to GLUT. - */ - int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2; - int direction = -1; - if( button % 2 ) - direction = 1; - - if( pressed ) - INVOKE_WCB( *window, MouseWheel, ( wheel_number, - direction, - event.xbutton.x, - event.xbutton.y ) - ); - } - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case KeyRelease: - case KeyPress: - { - FGCBKeyboard keyboard_cb; - FGCBSpecial special_cb; - - GETWINDOW( xkey ); - GETMOUSE( xkey ); - - /* Detect auto repeated keys, if configured globally or per-window */ - - if ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) - { - if (event.type==KeyRelease) - { - /* - * Look at X11 keystate to detect repeat mode. - * While X11 says the key is actually held down, we'll ignore KeyRelease/KeyPress pairs. - */ - - char keys[32]; - XQueryKeymap( fgDisplay.Display, keys ); /* Look at X11 keystate to detect repeat mode */ - - if ( event.xkey.keycode<256 ) /* XQueryKeymap is limited to 256 keycodes */ - { - if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) ) - window->State.KeyRepeating = GL_TRUE; - else - window->State.KeyRepeating = GL_FALSE; - } - } - } - else - window->State.KeyRepeating = GL_FALSE; - - /* Cease processing this event if it is auto repeated */ - - if (window->State.KeyRepeating) - { - if (event.type == KeyPress) window->State.KeyRepeating = GL_FALSE; - break; - } - - if( event.type == KeyPress ) - { - keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard )); - special_cb = (FGCBSpecial) ( FETCH_WCB( *window, Special )); - } - else - { - keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp )); - special_cb = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp )); - } - - /* Is there a keyboard/special callback hooked for this window? */ - if( keyboard_cb || special_cb ) - { - XComposeStatus composeStatus; - char asciiCode[ 32 ]; - KeySym keySym; - int len; - - /* Check for the ASCII/KeySym codes associated with the event: */ - len = XLookupString( &event.xkey, asciiCode, sizeof(asciiCode), - &keySym, &composeStatus - ); - - /* GLUT API tells us to have two separate callbacks... */ - if( len > 0 ) - { - /* ...one for the ASCII translateable keypresses... */ - if( keyboard_cb ) - { - fgSetWindow( window ); - fgState.Modifiers = fghGetXModifiers( event.xkey.state ); - keyboard_cb( asciiCode[ 0 ], - event.xkey.x, event.xkey.y - ); - fgState.Modifiers = INVALID_MODIFIERS; - } - } - else - { - int special = -1; - - /* - * ...and one for all the others, which need to be - * translated to GLUT_KEY_Xs... - */ - switch( keySym ) - { - case XK_F1: special = GLUT_KEY_F1; break; - case XK_F2: special = GLUT_KEY_F2; break; - case XK_F3: special = GLUT_KEY_F3; break; - case XK_F4: special = GLUT_KEY_F4; break; - case XK_F5: special = GLUT_KEY_F5; break; - case XK_F6: special = GLUT_KEY_F6; break; - case XK_F7: special = GLUT_KEY_F7; break; - case XK_F8: special = GLUT_KEY_F8; break; - case XK_F9: special = GLUT_KEY_F9; break; - case XK_F10: special = GLUT_KEY_F10; break; - case XK_F11: special = GLUT_KEY_F11; break; - case XK_F12: special = GLUT_KEY_F12; break; - - case XK_KP_Left: - case XK_Left: special = GLUT_KEY_LEFT; break; - case XK_KP_Right: - case XK_Right: special = GLUT_KEY_RIGHT; break; - case XK_KP_Up: - case XK_Up: special = GLUT_KEY_UP; break; - case XK_KP_Down: - case XK_Down: special = GLUT_KEY_DOWN; break; - - case XK_KP_Prior: - case XK_Prior: special = GLUT_KEY_PAGE_UP; break; - case XK_KP_Next: - case XK_Next: special = GLUT_KEY_PAGE_DOWN; break; - case XK_KP_Home: - case XK_Home: special = GLUT_KEY_HOME; break; - case XK_KP_End: - case XK_End: special = GLUT_KEY_END; break; - case XK_KP_Insert: - case XK_Insert: special = GLUT_KEY_INSERT; break; - - case XK_Num_Lock : special = GLUT_KEY_NUM_LOCK; break; - case XK_KP_Begin : special = GLUT_KEY_BEGIN; break; - case XK_KP_Delete: special = GLUT_KEY_DELETE; break; - } - - /* - * Execute the callback (if one has been specified), - * given that the special code seems to be valid... - */ - if( special_cb && (special != -1) ) - { - fgSetWindow( window ); - fgState.Modifiers = fghGetXModifiers( event.xkey.state ); - special_cb( special, event.xkey.x, event.xkey.y ); - fgState.Modifiers = INVALID_MODIFIERS; - } - } - } - } - break; - - case ReparentNotify: - break; /* XXX Should disable this event */ - - /* Not handled */ - case GravityNotify: - break; - - default: - fgWarning ("Unknown X event type: %d\n", event.type); - break; - } - } - -#elif TARGET_HOST_MS_WINDOWS - - MSG stMsg; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" ); - - while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) ) - { - if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 ) - { - if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) - { - fgDeinitialize( ); - exit( 0 ); - } - else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS ) - fgState.ExecState = GLUT_EXEC_STATE_STOP; - - return; - } - - TranslateMessage( &stMsg ); - DispatchMessage( &stMsg ); - } -#endif - - if( fgState.Timers.First ) - fghCheckTimers( ); - fghCheckJoystickPolls( ); - fghDisplayAll( ); - - fgCloseWindows( ); -} - -/* - * Enters the freeglut processing loop. - * Stays until the "ExecState" changes to "GLUT_EXEC_STATE_STOP". - */ -void FGAPIENTRY glutMainLoop( void ) -{ - int action; - -#if TARGET_HOST_MS_WINDOWS - SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ; -#endif - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" ); - -#if TARGET_HOST_MS_WINDOWS - /* - * Processing before the main loop: If there is a window which is open and - * which has a visibility callback, call it. I know this is an ugly hack, - * but I'm not sure what else to do about it. Ideally we should leave - * something uninitialized in the create window code and initialize it in - * the main loop, and have that initialization create a "WM_ACTIVATE" - * message. Then we would put the visibility callback code in the - * "case WM_ACTIVATE" block below. - John Fay -- 10/24/02 - */ - while( window ) - { - if ( FETCH_WCB( *window, Visibility ) ) - { - SFG_Window *current_window = fgStructure.CurrentWindow ; - - INVOKE_WCB( *window, Visibility, ( window->State.Visible ) ); - fgSetWindow( current_window ); - } - - window = (SFG_Window *)window->Node.Next ; - } -#endif - - fgState.ExecState = GLUT_EXEC_STATE_RUNNING ; - while( fgState.ExecState == GLUT_EXEC_STATE_RUNNING ) - { - SFG_Window *window; - - glutMainLoopEvent( ); - /* - * Step through the list of windows, seeing if there are any - * that are not menus - */ - for( window = ( SFG_Window * )fgStructure.Windows.First; - window; - window = ( SFG_Window * )window->Node.Next ) - if ( ! ( window->IsMenu ) ) - break; - - if( ! window ) - fgState.ExecState = GLUT_EXEC_STATE_STOP; - else - { - if( fgState.IdleCallback ) - { - if( fgStructure.CurrentWindow && - fgStructure.CurrentWindow->IsMenu ) - /* fail safe */ - fgSetWindow( window ); - fgState.IdleCallback( ); - } - - fghSleepForEvents( ); - } - } - - /* - * When this loop terminates, destroy the display, state and structure - * of a freeglut session, so that another glutInit() call can happen - * - * Save the "ActionOnWindowClose" because "fgDeinitialize" resets it. - */ - action = fgState.ActionOnWindowClose; - fgDeinitialize( ); - if( action == GLUT_ACTION_EXIT ) - exit( 0 ); -} - -/* - * Leaves the freeglut processing loop. - */ -void FGAPIENTRY glutLeaveMainLoop( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveMainLoop" ); - fgState.ExecState = GLUT_EXEC_STATE_STOP ; -} - - -#if TARGET_HOST_MS_WINDOWS -/* - * Determine a GLUT modifer mask based on MS-WINDOWS system info. - */ -static int fghGetWin32Modifiers (void) -{ - return - ( ( ( GetKeyState( VK_LSHIFT ) < 0 ) || - ( GetKeyState( VK_RSHIFT ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) | - ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) || - ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL : 0 ) | - ( ( ( GetKeyState( VK_LMENU ) < 0 ) || - ( GetKeyState( VK_RMENU ) < 0 )) ? GLUT_ACTIVE_ALT : 0 ); -} - -/* - * The window procedure for handling Win32 events - */ -LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, - LPARAM lParam ) -{ - SFG_Window* window; - PAINTSTRUCT ps; - LRESULT lRet = 1; - - FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ; - - window = fgWindowByHandle( hWnd ); - - if ( ( window == NULL ) && ( uMsg != WM_CREATE ) ) - return DefWindowProc( hWnd, uMsg, wParam, lParam ); - - /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0, - uMsg, wParam, lParam ); */ - switch( uMsg ) - { - case WM_CREATE: - /* The window structure is passed as the creation structure paramter... */ - window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams); - FREEGLUT_INTERNAL_ERROR_EXIT ( ( window != NULL ), "Cannot create window", - "fgWindowProc" ); - - window->Window.Handle = hWnd; - window->Window.Device = GetDC( hWnd ); - if( window->IsMenu ) - { - unsigned int current_DisplayMode = fgState.DisplayMode; - fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH; -#if !defined(_WIN32_WCE) - fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE ); -#endif - fgState.DisplayMode = current_DisplayMode; - - if( fgStructure.MenuContext ) - wglMakeCurrent( window->Window.Device, - fgStructure.MenuContext->MContext - ); - else - { - fgStructure.MenuContext = - (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); - fgStructure.MenuContext->MContext = - wglCreateContext( window->Window.Device ); - } - - /* window->Window.Context = wglGetCurrentContext (); */ - window->Window.Context = wglCreateContext( window->Window.Device ); - } - else - { -#if !defined(_WIN32_WCE) - fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE ); -#endif - - if( ! fgState.UseCurrentContext ) - window->Window.Context = - wglCreateContext( window->Window.Device ); - else - { - window->Window.Context = wglGetCurrentContext( ); - if( ! window->Window.Context ) - window->Window.Context = - wglCreateContext( window->Window.Device ); - } - -#if !defined(_WIN32_WCE) - fgNewWGLCreateContext( window ); -#endif - } - - window->State.NeedToResize = GL_TRUE; - if( ( window->State.Width < 0 ) || ( window->State.Height < 0 ) ) - { - SFG_Window *current_window = fgStructure.CurrentWindow; - - fgSetWindow( window ); - window->State.Width = glutGet( GLUT_WINDOW_WIDTH ); - window->State.Height = glutGet( GLUT_WINDOW_HEIGHT ); - fgSetWindow( current_window ); - } - - ReleaseDC( window->Window.Handle, window->Window.Device ); - -#if defined(_WIN32_WCE) - /* Take over button handling */ - { - HINSTANCE dxDllLib=LoadLibrary(_T("gx.dll")); - if (dxDllLib) - { - GXGetDefaultKeys_=(GXGETDEFAULTKEYS)GetProcAddress(dxDllLib, _T("?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z")); - GXOpenInput_=(GXOPENINPUT)GetProcAddress(dxDllLib, _T("?GXOpenInput@@YAHXZ")); - } - - if(GXOpenInput_) - (*GXOpenInput_)(); - if(GXGetDefaultKeys_) - gxKeyList = (*GXGetDefaultKeys_)(GX_LANDSCAPEKEYS); - } - -#endif /* defined(_WIN32_WCE) */ - break; - - case WM_SIZE: - /* - * If the window is visible, then it is the user manually resizing it. - * If it is not, then it is the system sending us a dummy resize with - * zero dimensions on a "glutIconifyWindow" call. - */ - if( window->State.Visible ) - { - window->State.NeedToResize = GL_TRUE; -#if defined(_WIN32_WCE) - window->State.Width = HIWORD(lParam); - window->State.Height = LOWORD(lParam); -#else - window->State.Width = LOWORD(lParam); - window->State.Height = HIWORD(lParam); -#endif /* defined(_WIN32_WCE) */ - } - - break; - - case WM_SETFOCUS: -/* printf("WM_SETFOCUS: %p\n", window ); */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) ); - break; - - case WM_KILLFOCUS: -/* printf("WM_KILLFOCUS: %p\n", window ); */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); - - if( window->IsMenu && - window->ActiveMenu && window->ActiveMenu->IsActive ) - fgUpdateMenuHighlight( window->ActiveMenu ); - - break; - -#if 0 - case WM_ACTIVATE: - if (LOWORD(wParam) != WA_INACTIVE) - { -/* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window, - window->State.Cursor ); */ - fgSetCursor( window, window->State.Cursor ); - } - - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; -#endif - - case WM_SETCURSOR: -/* printf ( "Cursor event %x %x %x %x\n", window, window->State.Cursor, lParam, wParam ) ; */ - if( LOWORD( lParam ) == HTCLIENT ) - fgSetCursor ( window, window->State.Cursor ) ; - else - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; - - case WM_SHOWWINDOW: - window->State.Visible = GL_TRUE; - window->State.Redisplay = GL_TRUE; - break; - - case WM_PAINT: - /* Turn on the visibility in case it was turned off somehow */ - window->State.Visible = GL_TRUE; - BeginPaint( hWnd, &ps ); - fghRedrawWindow( window ); - EndPaint( hWnd, &ps ); - break; - - case WM_CLOSE: - fgDestroyWindow ( window ); - if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) - PostQuitMessage(0); - break; - - case WM_DESTROY: - /* - * The window already got destroyed, so don't bother with it. - */ - return 0; - - case WM_MOUSEMOVE: - { -#if defined(_WIN32_WCE) - window->State.MouseX = 320-HIWORD( lParam ); - window->State.MouseY = LOWORD( lParam ); -#else - window->State.MouseX = LOWORD( lParam ); - window->State.MouseY = HIWORD( lParam ); -#endif /* defined(_WIN32_WCE) */ - /* Restrict to [-32768, 32767] to match X11 behaviour */ - /* See comment in "freeglut_developer" mailing list 10/4/04 */ - if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536; - if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536; - - if ( window->ActiveMenu ) - { - fgUpdateMenuHighlight( window->ActiveMenu ); - break; - } - - fgState.Modifiers = fghGetWin32Modifiers( ); - - if( ( wParam & MK_LBUTTON ) || - ( wParam & MK_MBUTTON ) || - ( wParam & MK_RBUTTON ) ) - INVOKE_WCB( *window, Motion, ( window->State.MouseX, - window->State.MouseY ) ); - else - INVOKE_WCB( *window, Passive, ( window->State.MouseX, - window->State.MouseY ) ); - - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - { - GLboolean pressed = GL_TRUE; - int button; - -#if defined(_WIN32_WCE) - window->State.MouseX = 320-HIWORD( lParam ); - window->State.MouseY = LOWORD( lParam ); -#else - window->State.MouseX = LOWORD( lParam ); - window->State.MouseY = HIWORD( lParam ); -#endif /* defined(_WIN32_WCE) */ - - /* Restrict to [-32768, 32767] to match X11 behaviour */ - /* See comment in "freeglut_developer" mailing list 10/4/04 */ - if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536; - if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536; - - switch( uMsg ) - { - case WM_LBUTTONDOWN: - pressed = GL_TRUE; - button = GLUT_LEFT_BUTTON; - break; - case WM_MBUTTONDOWN: - pressed = GL_TRUE; - button = GLUT_MIDDLE_BUTTON; - break; - case WM_RBUTTONDOWN: - pressed = GL_TRUE; - button = GLUT_RIGHT_BUTTON; - break; - case WM_LBUTTONUP: - pressed = GL_FALSE; - button = GLUT_LEFT_BUTTON; - break; - case WM_MBUTTONUP: - pressed = GL_FALSE; - button = GLUT_MIDDLE_BUTTON; - break; - case WM_RBUTTONUP: - pressed = GL_FALSE; - button = GLUT_RIGHT_BUTTON; - break; - default: - pressed = GL_FALSE; - button = -1; - break; - } - -#if !defined(_WIN32_WCE) - if( GetSystemMetrics( SM_SWAPBUTTON ) ) - { - if( button == GLUT_LEFT_BUTTON ) - button = GLUT_RIGHT_BUTTON; - else - if( button == GLUT_RIGHT_BUTTON ) - button = GLUT_LEFT_BUTTON; - } -#endif /* !defined(_WIN32_WCE) */ - - if( button == -1 ) - return DefWindowProc( hWnd, uMsg, lParam, wParam ); - - /* - * Do not execute the application's mouse callback if a menu - * is hooked to this button. In that case an appropriate - * private call should be generated. - */ - if( fgCheckActiveMenu( window, button, pressed, - window->State.MouseX, window->State.MouseY ) ) - break; - - /* Set capture so that the window captures all the mouse messages */ - /* - * XXX - Multiple button support: Under X11, the mouse is not released - * XXX - from the window until all buttons have been released, even if the - * XXX - user presses a button in another window. This will take more - * XXX - code changes than I am up to at the moment (10/5/04). The present - * XXX - is a 90 percent solution. - */ - if ( pressed == GL_TRUE ) - SetCapture ( window->Window.Handle ) ; - else - ReleaseCapture () ; - - if( ! FETCH_WCB( *window, Mouse ) ) - break; - - fgSetWindow( window ); - fgState.Modifiers = fghGetWin32Modifiers( ); - - INVOKE_WCB( - *window, Mouse, - ( button, - pressed ? GLUT_DOWN : GLUT_UP, - window->State.MouseX, - window->State.MouseY - ) - ); - - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case 0x020a: - /* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */ - { - /* - * XXX THIS IS SPECULATIVE -- John Fay, 10/2/03 - * XXX Should use WHEEL_DELTA instead of 120 - */ - int wheel_number = LOWORD( wParam ); - short ticks = ( short )HIWORD( wParam ) / 120; - int direction = 1; - - if( ticks < 0 ) - { - direction = -1; - ticks = -ticks; - } - - /* - * The mouse cursor has moved. Remember the new mouse cursor's position - */ - /* window->State.MouseX = LOWORD( lParam ); */ - /* Need to adjust by window position, */ - /* window->State.MouseY = HIWORD( lParam ); */ - /* change "lParam" to other parameter */ - - if( ! FETCH_WCB( *window, MouseWheel ) && - ! FETCH_WCB( *window, Mouse ) ) - break; - - fgSetWindow( window ); - fgState.Modifiers = fghGetWin32Modifiers( ); - - while( ticks-- ) - if( FETCH_WCB( *window, MouseWheel ) ) - INVOKE_WCB( *window, MouseWheel, - ( wheel_number, - direction, - window->State.MouseX, - window->State.MouseY - ) - ); - else /* No mouse wheel, call the mouse button callback twice */ - { - /* - * Map wheel zero to button 3 and 4; +1 to 3, -1 to 4 - * " " one +1 to 5, -1 to 6, ... - * - * XXX The below assumes that you have no more than 3 mouse - * XXX buttons. Sorry. - */ - int button = wheel_number * 2 + 3; - if( direction < 0 ) - ++button; - INVOKE_WCB( *window, Mouse, - ( button, GLUT_DOWN, - window->State.MouseX, window->State.MouseY ) - ); - INVOKE_WCB( *window, Mouse, - ( button, GLUT_UP, - window->State.MouseX, window->State.MouseY ) - ); - } - - fgState.Modifiers = INVALID_MODIFIERS; - } - break ; - - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - { - int keypress = -1; - POINT mouse_pos ; - - if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) - break; - - /* - * Remember the current modifiers state. This is done here in order - * to make sure the VK_DELETE keyboard callback is executed properly. - */ - fgState.Modifiers = fghGetWin32Modifiers( ); - - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - - /* Convert the Win32 keystroke codes to GLUTtish way */ -# define KEY(a,b) case a: keypress = b; break; - - switch( wParam ) - { - KEY( VK_F1, GLUT_KEY_F1 ); - KEY( VK_F2, GLUT_KEY_F2 ); - KEY( VK_F3, GLUT_KEY_F3 ); - KEY( VK_F4, GLUT_KEY_F4 ); - KEY( VK_F5, GLUT_KEY_F5 ); - KEY( VK_F6, GLUT_KEY_F6 ); - KEY( VK_F7, GLUT_KEY_F7 ); - KEY( VK_F8, GLUT_KEY_F8 ); - KEY( VK_F9, GLUT_KEY_F9 ); - KEY( VK_F10, GLUT_KEY_F10 ); - KEY( VK_F11, GLUT_KEY_F11 ); - KEY( VK_F12, GLUT_KEY_F12 ); - KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); - KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); - KEY( VK_HOME, GLUT_KEY_HOME ); - KEY( VK_END, GLUT_KEY_END ); - KEY( VK_LEFT, GLUT_KEY_LEFT ); - KEY( VK_UP, GLUT_KEY_UP ); - KEY( VK_RIGHT, GLUT_KEY_RIGHT ); - KEY( VK_DOWN, GLUT_KEY_DOWN ); - KEY( VK_INSERT, GLUT_KEY_INSERT ); - - case VK_DELETE: - /* The delete key should be treated as an ASCII keypress: */ - INVOKE_WCB( *window, Keyboard, - ( 127, window->State.MouseX, window->State.MouseY ) - ); - } - -#if defined(_WIN32_WCE) - if(!(lParam & 0x40000000)) /* Prevent auto-repeat */ - { - if(wParam==(unsigned)gxKeyList.vkRight) - keypress = GLUT_KEY_RIGHT; - else if(wParam==(unsigned)gxKeyList.vkLeft) - keypress = GLUT_KEY_LEFT; - else if(wParam==(unsigned)gxKeyList.vkUp) - keypress = GLUT_KEY_UP; - else if(wParam==(unsigned)gxKeyList.vkDown) - keypress = GLUT_KEY_DOWN; - else if(wParam==(unsigned)gxKeyList.vkA) - keypress = GLUT_KEY_F1; - else if(wParam==(unsigned)gxKeyList.vkB) - keypress = GLUT_KEY_F2; - else if(wParam==(unsigned)gxKeyList.vkC) - keypress = GLUT_KEY_F3; - else if(wParam==(unsigned)gxKeyList.vkStart) - keypress = GLUT_KEY_F4; - } -#endif - - if( keypress != -1 ) - INVOKE_WCB( *window, Special, - ( keypress, - window->State.MouseX, window->State.MouseY ) - ); - - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case WM_SYSKEYUP: - case WM_KEYUP: - { - int keypress = -1; - POINT mouse_pos; - - /* - * Remember the current modifiers state. This is done here in order - * to make sure the VK_DELETE keyboard callback is executed properly. - */ - fgState.Modifiers = fghGetWin32Modifiers( ); - - GetCursorPos( &mouse_pos ); - ScreenToClient( window->Window.Handle, &mouse_pos ); - - window->State.MouseX = mouse_pos.x; - window->State.MouseY = mouse_pos.y; - - /* - * Convert the Win32 keystroke codes to GLUTtish way. - * "KEY(a,b)" was defined under "WM_KEYDOWN" - */ - - switch( wParam ) - { - KEY( VK_F1, GLUT_KEY_F1 ); - KEY( VK_F2, GLUT_KEY_F2 ); - KEY( VK_F3, GLUT_KEY_F3 ); - KEY( VK_F4, GLUT_KEY_F4 ); - KEY( VK_F5, GLUT_KEY_F5 ); - KEY( VK_F6, GLUT_KEY_F6 ); - KEY( VK_F7, GLUT_KEY_F7 ); - KEY( VK_F8, GLUT_KEY_F8 ); - KEY( VK_F9, GLUT_KEY_F9 ); - KEY( VK_F10, GLUT_KEY_F10 ); - KEY( VK_F11, GLUT_KEY_F11 ); - KEY( VK_F12, GLUT_KEY_F12 ); - KEY( VK_PRIOR, GLUT_KEY_PAGE_UP ); - KEY( VK_NEXT, GLUT_KEY_PAGE_DOWN ); - KEY( VK_HOME, GLUT_KEY_HOME ); - KEY( VK_END, GLUT_KEY_END ); - KEY( VK_LEFT, GLUT_KEY_LEFT ); - KEY( VK_UP, GLUT_KEY_UP ); - KEY( VK_RIGHT, GLUT_KEY_RIGHT ); - KEY( VK_DOWN, GLUT_KEY_DOWN ); - KEY( VK_INSERT, GLUT_KEY_INSERT ); - - case VK_DELETE: - /* The delete key should be treated as an ASCII keypress: */ - INVOKE_WCB( *window, KeyboardUp, - ( 127, window->State.MouseX, window->State.MouseY ) - ); - break; - - default: - { -#if !defined(_WIN32_WCE) - BYTE state[ 256 ]; - WORD code[ 2 ]; - - GetKeyboardState( state ); - - if( ToAscii( (UINT)wParam, 0, state, code, 0 ) == 1 ) - wParam=code[ 0 ]; - - INVOKE_WCB( *window, KeyboardUp, - ( (char)wParam, - window->State.MouseX, window->State.MouseY ) - ); -#endif /* !defined(_WIN32_WCE) */ - } - } - - if( keypress != -1 ) - INVOKE_WCB( *window, SpecialUp, - ( keypress, - window->State.MouseX, window->State.MouseY ) - ); - - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case WM_SYSCHAR: - case WM_CHAR: - { - if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) ) - break; - - fgState.Modifiers = fghGetWin32Modifiers( ); - INVOKE_WCB( *window, Keyboard, - ( (char)wParam, - window->State.MouseX, window->State.MouseY ) - ); - fgState.Modifiers = INVALID_MODIFIERS; - } - break; - - case WM_CAPTURECHANGED: - /* User has finished resizing the window, force a redraw */ - INVOKE_WCB( *window, Display, ( ) ); - - /*lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); */ - break; - - /* Other messages that I have seen and which are not handled already */ - case WM_SETTEXT: /* 0x000c */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - /* Pass it on to "DefWindowProc" to set the window text */ - break; - - case WM_GETTEXT: /* 0x000d */ - /* Ideally we would copy the title of the window into "lParam" */ - /* strncpy ( (char *)lParam, "Window Title", wParam ); - lRet = ( wParam > 12 ) ? 12 : wParam; */ - /* the number of characters copied */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; - - case WM_GETTEXTLENGTH: /* 0x000e */ - /* Ideally we would get the length of the title of the window */ - lRet = 12; - /* the number of characters in "Window Title\0" (see above) */ - break; - - case WM_ERASEBKGND: /* 0x0014 */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; - -#if !defined(_WIN32_WCE) - case WM_SYNCPAINT: /* 0x0088 */ - /* Another window has moved, need to update this one */ - window->State.Redisplay = GL_TRUE; - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - /* Help screen says this message must be passed to "DefWindowProc" */ - break; - - case WM_NCPAINT: /* 0x0085 */ - /* Need to update the border of this window */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - /* Pass it on to "DefWindowProc" to repaint a standard border */ - break; - - case WM_SYSCOMMAND : /* 0x0112 */ - { - /* - * We have received a system command message. Try to act on it. - * The commands are passed in through the "wParam" parameter: - * The least significant digit seems to be which edge of the window - * is being used for a resize event: - * 4 3 5 - * 1 2 - * 7 6 8 - * Congratulations and thanks to Richard Rauch for figuring this out.. - */ - switch ( wParam & 0xfff0 ) - { - case SC_SIZE : - break ; - - case SC_MOVE : - break ; - - case SC_MINIMIZE : - /* User has clicked on the "-" to minimize the window */ - /* Turn off the visibility */ - window->State.Visible = GL_FALSE ; - - break ; - - case SC_MAXIMIZE : - break ; - - case SC_NEXTWINDOW : - break ; - - case SC_PREVWINDOW : - break ; - - case SC_CLOSE : - /* Followed very closely by a WM_CLOSE message */ - break ; - - case SC_VSCROLL : - break ; - - case SC_HSCROLL : - break ; - - case SC_MOUSEMENU : - break ; - - case SC_KEYMENU : - break ; - - case SC_ARRANGE : - break ; - - case SC_RESTORE : - break ; - - case SC_TASKLIST : - break ; - - case SC_SCREENSAVE : - break ; - - case SC_HOTKEY : - break ; - -#if(WINVER >= 0x0400) - case SC_DEFAULT : - break ; - - case SC_MONITORPOWER : - break ; - - case SC_CONTEXTHELP : - break ; -#endif /* WINVER >= 0x0400 */ - - default: -#if _DEBUG - fgWarning( "Unknown wParam type 0x%x", wParam ); -#endif - break; - } - } -#endif /* !defined(_WIN32_WCE) */ - - /* We need to pass the message on to the operating system as well */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; - - default: - /* Handle unhandled messages */ - lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); - break; - } - - return lRet; -} -#endif - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_menu.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_menu.c deleted file mode 100644 index ea5837e80..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_menu.c +++ /dev/null @@ -1,1002 +0,0 @@ -/* - * freeglut_menu.c - * - * Pull-down menu creation and handling. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#define FREEGLUT_BUILDING_LIB -#include -#include "freeglut_internal.h" - -/* -- DEFINITIONS ---------------------------------------------------------- */ - -/* - * FREEGLUT_MENU_FONT can be any freeglut bitmapped font. - * (Stroked fonts would not be out of the question, but we'd need to alter - * code, since GLUT (hence freeglut) does not quite unify stroked and - * bitmapped font handling.) - * Old UNIX/X11 GLUT (BSD, UNIX, IRIX, LINUX, HPUX, ...) used a system - * font best approximated by an 18-pixel HELVETICA, I think. MS-WINDOWS - * GLUT used something closest to the 8x13 fixed-width font. (Old - * GLUT apparently uses host-system menus rather than building its own. - * freeglut is building its own menus from scratch.) - * - * FREEGLUT_MENU_HEIGHT gives the height of ONE menu box. This should be - * the distances between two adjacent menu entries. It should scale - * automatically with the font choice, so you needn't alter it---unless you - * use a stroked font. - * - * FREEGLUT_MENU_BORDER says how many pixels to allow around the edge of a - * menu. (It also seems to be the same as the number of pixels used as - * a border around *items* to separate them from neighbors. John says - * that that wasn't the original intent...if not, perhaps we need another - * symbolic constant, FREEGLUT_MENU_ITEM_BORDER, or such.) - */ -#if TARGET_HOST_MS_WINDOWS -#define FREEGLUT_MENU_FONT GLUT_BITMAP_8_BY_13 -#else -#define FREEGLUT_MENU_FONT GLUT_BITMAP_HELVETICA_18 -#endif - -#define FREEGLUT_MENU_HEIGHT (glutBitmapHeight(FREEGLUT_MENU_FONT) + \ - FREEGLUT_MENU_BORDER) -#define FREEGLUT_MENU_BORDER 2 - - -/* - * These variables are for rendering the freeglut menu items. - * - * The choices are fore- and background, with and without h for Highlighting. - * Old GLUT appeared to be system-dependant for its colors (sigh) so we are - * too. These variables should be stuffed into global state and initialized - * via the glutInit*() system. - */ -#if TARGET_HOST_MS_WINDOWS -static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f}; -static float menu_pen_back [4] = {0.85f, 0.85f, 0.85f, 1.0f}; -static float menu_pen_hfore [4] = {1.0f, 1.0f, 1.0f, 1.0f}; -static float menu_pen_hback [4] = {0.15f, 0.15f, 0.45f, 1.0f}; -#else -static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f}; -static float menu_pen_back [4] = {0.70f, 0.70f, 0.70f, 1.0f}; -static float menu_pen_hfore [4] = {0.0f, 0.0f, 0.0f, 1.0f}; -static float menu_pen_hback [4] = {1.0f, 1.0f, 1.0f, 1.0f}; -#endif - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -/* - * Private function to find a menu entry by index - */ -static SFG_MenuEntry *fghFindMenuEntry( SFG_Menu* menu, int index ) -{ - SFG_MenuEntry *entry; - int i = 1; - - for( entry = (SFG_MenuEntry *)menu->Entries.First; - entry; - entry = (SFG_MenuEntry *)entry->Node.Next ) - { - if( i == index ) - break; - ++i; - } - - return entry; -} - -/* - * Deactivates a menu pointed by the function argument. - */ -static void fghDeactivateSubMenu( SFG_MenuEntry *menuEntry ) -{ - SFG_MenuEntry *subMenuIter; - /* Hide the present menu's window */ - fgSetWindow( menuEntry->SubMenu->Window ); - glutHideWindow( ); - - /* Forget about having that menu active anymore, now: */ - menuEntry->SubMenu->Window->ActiveMenu = NULL; - menuEntry->SubMenu->IsActive = GL_FALSE; - menuEntry->SubMenu->ActiveEntry = NULL; - - /* Hide all submenu windows, and the root menu's window. */ - for ( subMenuIter = (SFG_MenuEntry *)menuEntry->SubMenu->Entries.First; - subMenuIter; - subMenuIter = (SFG_MenuEntry *)subMenuIter->Node.Next ) - { - subMenuIter->IsActive = GL_FALSE; - - /* Is that an active submenu by any case? */ - if( subMenuIter->SubMenu ) - fghDeactivateSubMenu( subMenuIter ); - } - - fgSetWindow ( menuEntry->SubMenu->ParentWindow ) ; -} - -/* - * Private function to get the virtual maximum screen extent - */ -static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y ) -{ - if( fgStructure.GameModeWindow ) - { -#if TARGET_HOST_POSIX_X11 - int wx, wy; - Window w; - - XTranslateCoordinates( - fgDisplay.Display, - window->Window.Handle, - fgDisplay.RootWindow, - 0, 0, &wx, &wy, &w); - - *x = fgState.GameModeSize.X + wx; - *y = fgState.GameModeSize.Y + wy; -#else - *x = glutGet ( GLUT_SCREEN_WIDTH ); - *y = glutGet ( GLUT_SCREEN_HEIGHT ); -#endif - } - else - { - *x = fgDisplay.ScreenWidth; - *y = fgDisplay.ScreenHeight; - } -} - -/* - * Private function to check for the current menu/sub menu activity state - */ -static GLboolean fghCheckMenuStatus( SFG_Menu* menu ) -{ - SFG_MenuEntry* menuEntry; - int x, y; - - /* First of all check any of the active sub menus... */ - for( menuEntry = (SFG_MenuEntry *)menu->Entries.First; - menuEntry; - menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next ) - { - if( menuEntry->SubMenu && menuEntry->IsActive ) - { - /* - * OK, have the sub-menu checked, too. If it returns GL_TRUE, it - * will mean that it caught the mouse cursor and we do not need - * to regenerate the activity list, and so our parents do... - */ - GLboolean return_status; - - menuEntry->SubMenu->Window->State.MouseX = - menu->Window->State.MouseX + menu->X - menuEntry->SubMenu->X; - menuEntry->SubMenu->Window->State.MouseY = - menu->Window->State.MouseY + menu->Y - menuEntry->SubMenu->Y; - return_status = fghCheckMenuStatus( menuEntry->SubMenu ); - - if ( return_status ) - return GL_TRUE; - } - } - - /* That much about our sub menus, let's get to checking the current menu: */ - x = menu->Window->State.MouseX; - y = menu->Window->State.MouseY; - - /* Check if the mouse cursor is contained within the current menu box */ - if( ( x >= FREEGLUT_MENU_BORDER ) && - ( x < menu->Width - FREEGLUT_MENU_BORDER ) && - ( y >= FREEGLUT_MENU_BORDER ) && - ( y < menu->Height - FREEGLUT_MENU_BORDER ) ) - { - int menuID = ( y - FREEGLUT_MENU_BORDER ) / FREEGLUT_MENU_HEIGHT; - - /* The mouse cursor is somewhere over our box, check it out. */ - menuEntry = fghFindMenuEntry( menu, menuID + 1 ); - FREEGLUT_INTERNAL_ERROR_EXIT( menuEntry, "Cannot find menu entry", - "fghCheckMenuStatus" ); - - menuEntry->IsActive = GL_TRUE; - menuEntry->Ordinal = menuID; - - /* - * If this is not the same as the last active menu entry, deactivate - * the previous entry. Specifically, if the previous active entry - * was a submenu then deactivate it. - */ - if( menu->ActiveEntry && ( menuEntry != menu->ActiveEntry ) ) - if( menu->ActiveEntry->SubMenu ) - fghDeactivateSubMenu( menu->ActiveEntry ); - - if( menuEntry != menu->ActiveEntry ) - { - menu->Window->State.Redisplay = GL_TRUE; - if( menu->ActiveEntry ) - menu->ActiveEntry->IsActive = GL_FALSE; - } - - menu->ActiveEntry = menuEntry; - menu->IsActive = GL_TRUE; /* XXX Do we need this? */ - - /* - * OKi, we have marked that entry as active, but it would be also - * nice to have its contents updated, in case it's a sub menu. - * Also, ignore the return value of the check function: - */ - if( menuEntry->SubMenu ) - { - if ( ! menuEntry->SubMenu->IsActive ) - { - int max_x, max_y; - SFG_Window *current_window = fgStructure.CurrentWindow; - - /* Set up the initial menu position now... */ - menuEntry->SubMenu->IsActive = GL_TRUE; - - /* Set up the initial submenu position now: */ - fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y); - menuEntry->SubMenu->X = menu->X + menu->Width; - menuEntry->SubMenu->Y = menu->Y + - menuEntry->Ordinal * FREEGLUT_MENU_HEIGHT; - - if( menuEntry->SubMenu->X + menuEntry->SubMenu->Width > max_x ) - menuEntry->SubMenu->X = menu->X - menuEntry->SubMenu->Width; - - if( menuEntry->SubMenu->Y + menuEntry->SubMenu->Height > max_y ) - { - menuEntry->SubMenu->Y -= ( menuEntry->SubMenu->Height - - FREEGLUT_MENU_HEIGHT - - 2 * FREEGLUT_MENU_BORDER ); - if( menuEntry->SubMenu->Y < 0 ) - menuEntry->SubMenu->Y = 0; - } - - fgSetWindow( menuEntry->SubMenu->Window ); - glutPositionWindow( menuEntry->SubMenu->X, - menuEntry->SubMenu->Y ); - glutReshapeWindow( menuEntry->SubMenu->Width, - menuEntry->SubMenu->Height ); - glutPopWindow( ); - glutShowWindow( ); - menuEntry->SubMenu->Window->ActiveMenu = menuEntry->SubMenu; - fgSetWindow( current_window ); - menuEntry->SubMenu->Window->State.MouseX = - x + menu->X - menuEntry->SubMenu->X; - menuEntry->SubMenu->Window->State.MouseY = - y + menu->Y - menuEntry->SubMenu->Y; - fghCheckMenuStatus( menuEntry->SubMenu ); - } - - /* Activate it because its parent entry is active */ - menuEntry->SubMenu->IsActive = GL_TRUE; /* XXX Do we need this? */ - } - - /* Report back that we have caught the menu cursor */ - return GL_TRUE; - } - - /* Looks like the menu cursor is somewhere else... */ - if( menu->ActiveEntry && menu->ActiveEntry->IsActive && - ( !menu->ActiveEntry->SubMenu || - !menu->ActiveEntry->SubMenu->IsActive ) ) - { - menu->Window->State.Redisplay = GL_TRUE; - menu->ActiveEntry->IsActive = GL_FALSE; - menu->ActiveEntry = NULL; - } - - return GL_FALSE; -} - -/* - * Displays a menu box and all of its submenus (if they are active) - */ -static void fghDisplayMenuBox( SFG_Menu* menu ) -{ - SFG_MenuEntry *menuEntry; - int i; - int border = FREEGLUT_MENU_BORDER; - - /* - * Have the menu box drawn first. The +- values are - * here just to make it more nice-looking... - */ - /* a non-black dark version of the below. */ - glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); - glBegin( GL_QUAD_STRIP ); - glVertex2i( menu->Width , 0 ); - glVertex2i( menu->Width - border, border); - glVertex2i( 0 , 0 ); - glVertex2i( border, border); - glVertex2i( 0 , menu->Height ); - glVertex2i( border, menu->Height - border); - glEnd( ); - - /* a non-black dark version of the below. */ - glColor4f( 0.5f, 0.5f, 0.5f, 1.0f ); - glBegin( GL_QUAD_STRIP ); - glVertex2i( 0 , menu->Height ); - glVertex2i( border, menu->Height - border); - glVertex2i( menu->Width , menu->Height ); - glVertex2i( menu->Width - border, menu->Height - border); - glVertex2i( menu->Width , 0 ); - glVertex2i( menu->Width - border, border); - glEnd( ); - - glColor4fv( menu_pen_back ); - glBegin( GL_QUADS ); - glVertex2i( border, border); - glVertex2i( menu->Width - border, border); - glVertex2i( menu->Width - border, menu->Height - border); - glVertex2i( border, menu->Height - border); - glEnd( ); - - /* Check if any of the submenus is currently active... */ - for( menuEntry = (SFG_MenuEntry *)menu->Entries.First; - menuEntry; - menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next ) - { - /* Has the menu been marked as active, maybe? */ - if( menuEntry->IsActive ) - { - /* - * That's truly right, and we need to have it highlighted. - * There is an assumption that mouse cursor didn't move - * since the last check of menu activity state: - */ - int menuID = menuEntry->Ordinal; - - /* So have the highlight drawn... */ - glColor4fv( menu_pen_hback ); - glBegin( GL_QUADS ); - glVertex2i( border, - (menuID + 0)*FREEGLUT_MENU_HEIGHT + border ); - glVertex2i( menu->Width - border, - (menuID + 0)*FREEGLUT_MENU_HEIGHT + border ); - glVertex2i( menu->Width - border, - (menuID + 1)*FREEGLUT_MENU_HEIGHT + border ); - glVertex2i( border, - (menuID + 1)*FREEGLUT_MENU_HEIGHT + border ); - glEnd( ); - } - } - - /* Print the menu entries now... */ - - glColor4fv( menu_pen_fore ); - - for( menuEntry = (SFG_MenuEntry *)menu->Entries.First, i = 0; - menuEntry; - menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next, ++i ) - { - /* If the menu entry is active, set the color to white */ - if( menuEntry->IsActive ) - glColor4fv( menu_pen_hfore ); - - /* Move the raster into position... */ - /* Try to center the text - JCJ 31 July 2003*/ - glRasterPos2i( - 2 * border, - ( i + 1 )*FREEGLUT_MENU_HEIGHT - - ( int )( FREEGLUT_MENU_HEIGHT*0.3 - border ) - ); - - /* Have the label drawn, character after character: */ - glutBitmapString( FREEGLUT_MENU_FONT, - (unsigned char *)menuEntry->Text); - - /* If it's a submenu, draw a right arrow */ - if( menuEntry->SubMenu ) - { - int width = glutBitmapWidth( FREEGLUT_MENU_FONT, '_' ); - int x_base = menu->Width - 2 - width; - int y_base = i*FREEGLUT_MENU_HEIGHT + border; - glBegin( GL_TRIANGLES ); - glVertex2i( x_base, y_base + 2*border); - glVertex2i( menu->Width - 2, y_base + - ( FREEGLUT_MENU_HEIGHT + border) / 2 ); - glVertex2i( x_base, y_base + FREEGLUT_MENU_HEIGHT - border ); - glEnd( ); - } - - /* If the menu entry is active, reset the color */ - if( menuEntry->IsActive ) - glColor4fv( menu_pen_fore ); - } -} - -/* - * Private static function to set the parent window of a submenu and all - * of its submenus - */ -static void fghSetMenuParentWindow( SFG_Window *window, SFG_Menu *menu ) -{ - SFG_MenuEntry *menuEntry; - - menu->ParentWindow = window; - - for( menuEntry = ( SFG_MenuEntry * )menu->Entries.First; - menuEntry; - menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next ) - if( menuEntry->SubMenu ) - fghSetMenuParentWindow( window, menuEntry->SubMenu ); -} - -/* - * Function to check for menu entry selection on menu deactivation - */ -static void fghExecuteMenuCallback( SFG_Menu* menu ) -{ - SFG_MenuEntry *menuEntry; - - /* First of all check any of the active sub menus... */ - for( menuEntry = (SFG_MenuEntry *)menu->Entries.First; - menuEntry; - menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next) - { - if( menuEntry->IsActive ) - { - if( menuEntry->SubMenu ) - fghExecuteMenuCallback( menuEntry->SubMenu ); - else - if( menu->Callback ) - { - SFG_Menu *save_menu = fgStructure.CurrentMenu; - fgStructure.CurrentMenu = menu; - menu->Callback( menuEntry->ID ); - fgStructure.CurrentMenu = save_menu; - } - - return; - } - } -} - - -/* - * Displays the currently active menu for the current window - */ -void fgDisplayMenu( void ) -{ - SFG_Window* window = fgStructure.CurrentWindow; - SFG_Menu* menu = NULL; - - FREEGLUT_INTERNAL_ERROR_EXIT ( fgStructure.CurrentWindow, "Displaying menu in nonexistent window", - "fgDisplayMenu" ); - - /* Check if there is an active menu attached to this window... */ - menu = window->ActiveMenu; - freeglut_return_if_fail( menu ); - - fgSetWindow( menu->Window ); - - glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_TEXTURE_BIT | GL_LIGHTING_BIT | - GL_POLYGON_BIT ); - - glDisable( GL_DEPTH_TEST ); - glDisable( GL_TEXTURE_2D ); - glDisable( GL_LIGHTING ); - glDisable( GL_CULL_FACE ); - - glMatrixMode( GL_PROJECTION ); - glPushMatrix( ); - glLoadIdentity( ); - glOrtho( - 0, glutGet( GLUT_WINDOW_WIDTH ), - glutGet( GLUT_WINDOW_HEIGHT ), 0, - -1, 1 - ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix( ); - glLoadIdentity( ); - - fghDisplayMenuBox( menu ); - - glPopAttrib( ); - - glMatrixMode( GL_PROJECTION ); - glPopMatrix( ); - glMatrixMode( GL_MODELVIEW ); - glPopMatrix( ); - - glutSwapBuffers( ); - - fgSetWindow ( window ); -} - -/* - * Activates a menu pointed by the function argument - */ -static void fghActivateMenu( SFG_Window* window, int button ) -{ - int max_x, max_y; - - /* We'll be referencing this menu a lot, so remember its address: */ - SFG_Menu* menu = window->Menu[ button ]; - SFG_Window* current_window = fgStructure.CurrentWindow; - - /* If the menu is already active in another window, deactivate it there */ - if ( menu->ParentWindow ) - menu->ParentWindow->ActiveMenu = NULL ; - - /* Mark the menu as active, so that it gets displayed: */ - window->ActiveMenu = menu; - menu->IsActive = GL_TRUE; - fghSetMenuParentWindow ( window, menu ); - fgState.ActiveMenus++; - - /* Set up the initial menu position now: */ - fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y); - fgSetWindow( window ); - menu->X = window->State.MouseX + glutGet( GLUT_WINDOW_X ); - menu->Y = window->State.MouseY + glutGet( GLUT_WINDOW_Y ); - - if( menu->X + menu->Width > max_x ) - menu->X -=menu->Width; - - if( menu->Y + menu->Height > max_y ) - { - menu->Y -=menu->Height; - if( menu->Y < 0 ) - menu->Y = 0; - } - - menu->Window->State.MouseX = - window->State.MouseX + glutGet( GLUT_WINDOW_X ) - menu->X; - menu->Window->State.MouseY = - window->State.MouseY + glutGet( GLUT_WINDOW_Y ) - menu->Y; - - fgSetWindow( menu->Window ); - glutPositionWindow( menu->X, menu->Y ); - glutReshapeWindow( menu->Width, menu->Height ); - glutPopWindow( ); - glutShowWindow( ); - menu->Window->ActiveMenu = menu; - fghCheckMenuStatus( menu ); - fgSetWindow( current_window ); -} - -/* - * Update Highlight states of the menu - * - * Current mouse position is in menu->Window->State.MouseX/Y. - */ -void fgUpdateMenuHighlight ( SFG_Menu *menu ) -{ - fghCheckMenuStatus( menu ); -} - -/* - * Check whether an active menu absorbs a mouse click - */ -GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed, - int mouse_x, int mouse_y ) -{ - /* - * Near as I can tell, this is the menu behaviour: - * - Down-click the menu button, menu not active: activate - * the menu with its upper left-hand corner at the mouse - * location. - * - Down-click any button outside the menu, menu active: - * deactivate the menu - * - Down-click any button inside the menu, menu active: - * select the menu entry and deactivate the menu - * - Up-click the menu button, menu not active: nothing happens - * - Up-click the menu button outside the menu, menu active: - * nothing happens - * - Up-click the menu button inside the menu, menu active: - * select the menu entry and deactivate the menu - * Since menus can have submenus, we need to check this recursively. - */ - if( window->ActiveMenu ) - { - if( window == window->ActiveMenu->ParentWindow ) - { - window->ActiveMenu->Window->State.MouseX = - mouse_x - window->ActiveMenu->X; - window->ActiveMenu->Window->State.MouseY = - mouse_y - window->ActiveMenu->Y; - } - - /* In the menu, invoke the callback and deactivate the menu */ - if( fghCheckMenuStatus( window->ActiveMenu ) ) - { - /* - * Save the current window and menu and set the current - * window to the window whose menu this is - */ - SFG_Window *save_window = fgStructure.CurrentWindow; - SFG_Menu *save_menu = fgStructure.CurrentMenu; - SFG_Window *parent_window = window->ActiveMenu->ParentWindow; - fgSetWindow( parent_window ); - fgStructure.CurrentMenu = window->ActiveMenu; - - /* Execute the menu callback */ - fghExecuteMenuCallback( window->ActiveMenu ); - fgDeactivateMenu( parent_window ); - - /* Restore the current window and menu */ - fgSetWindow( save_window ); - fgStructure.CurrentMenu = save_menu; - } - else if( pressed ) - /* - * Outside the menu, deactivate if it's a downclick - * - * XXX This isn't enough. A downclick outside of - * XXX the interior of our freeglut windows should also - * XXX deactivate the menu. This is more complicated. - */ - fgDeactivateMenu( window->ActiveMenu->ParentWindow ); - - /* - * XXX Why does an active menu require a redisplay at - * XXX this point? If this can come out cleanly, then - * XXX it probably should do so; if not, a comment should - * XXX explain it. - */ - if( ! window->IsMenu ) - window->State.Redisplay = GL_TRUE; - - return GL_TRUE; - } - - /* No active menu, let's check whether we need to activate one. */ - if( ( 0 <= button ) && - ( FREEGLUT_MAX_MENUS > button ) && - ( window->Menu[ button ] ) && - pressed ) - { - /* XXX Posting a requisite Redisplay seems bogus. */ - window->State.Redisplay = GL_TRUE; - fghActivateMenu( window, button ); - return GL_TRUE; - } - - return GL_FALSE; -} - -/* - * Deactivates a menu pointed by the function argument. - */ -void fgDeactivateMenu( SFG_Window *window ) -{ - SFG_Window *parent_window = NULL; - - /* Check if there is an active menu attached to this window... */ - SFG_Menu* menu = window->ActiveMenu; - SFG_MenuEntry *menuEntry; - - /* Did we find an active window? */ - freeglut_return_if_fail( menu ); - - parent_window = menu->ParentWindow; - - /* Hide the present menu's window */ - fgSetWindow( menu->Window ); - glutHideWindow( ); - - /* Forget about having that menu active anymore, now: */ - menu->Window->ActiveMenu = NULL; - menu->ParentWindow->ActiveMenu = NULL; - fghSetMenuParentWindow ( NULL, menu ); - menu->IsActive = GL_FALSE; - menu->ActiveEntry = NULL; - - fgState.ActiveMenus--; - - /* Hide all submenu windows, and the root menu's window. */ - for ( menuEntry = ( SFG_MenuEntry * )menu->Entries.First; - menuEntry; - menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next ) - { - menuEntry->IsActive = GL_FALSE; - - /* Is that an active submenu by any case? */ - if( menuEntry->SubMenu ) - fghDeactivateSubMenu( menuEntry ); - } - - fgSetWindow ( parent_window ) ; -} - -/* - * Recalculates current menu's box size - */ -void fghCalculateMenuBoxSize( void ) -{ - SFG_MenuEntry* menuEntry; - int width = 0, height = 0; - - /* Make sure there is a current menu set */ - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - /* The menu's box size depends on the menu entries: */ - for( menuEntry = ( SFG_MenuEntry * )fgStructure.CurrentMenu->Entries.First; - menuEntry; - menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next ) - { - /* Update the menu entry's width value */ - menuEntry->Width = glutBitmapLength( - FREEGLUT_MENU_FONT, - (unsigned char *)menuEntry->Text - ); - - /* - * If the entry is a submenu, then it needs to be wider to - * accomodate the arrow. JCJ 31 July 2003 - */ - if (menuEntry->SubMenu ) - menuEntry->Width += glutBitmapLength( - FREEGLUT_MENU_FONT, - (unsigned char *)"_" - ); - - /* Check if it's the biggest we've found */ - if( menuEntry->Width > width ) - width = menuEntry->Width; - - height += FREEGLUT_MENU_HEIGHT; - } - - /* Store the menu's box size now: */ - fgStructure.CurrentMenu->Height = height + 2 * FREEGLUT_MENU_BORDER; - fgStructure.CurrentMenu->Width = width + 4 * FREEGLUT_MENU_BORDER; -} - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Creates a new menu object, adding it to the freeglut structure - */ -int FGAPIENTRY glutCreateMenu( void(* callback)( int ) ) -{ - /* The menu object creation code resides in freeglut_structure.c */ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" ); - return fgCreateMenu( callback )->ID; -} - -#if TARGET_HOST_MS_WINDOWS -int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - return glutCreateMenu( callback ); -} -#endif - -/* - * Destroys a menu object, removing all references to it - */ -void FGAPIENTRY glutDestroyMenu( int menuID ) -{ - SFG_Menu* menu; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyMenu" ); - menu = fgMenuByID( menuID ); - - freeglut_return_if_fail( menu ); - - /* The menu object destruction code resides in freeglut_structure.c */ - fgDestroyMenu( menu ); -} - -/* - * Returns the ID number of the currently active menu - */ -int FGAPIENTRY glutGetMenu( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenu" ); - - if( fgStructure.CurrentMenu ) - return fgStructure.CurrentMenu->ID; - - return 0; -} - -/* - * Sets the current menu given its menu ID - */ -void FGAPIENTRY glutSetMenu( int menuID ) -{ - SFG_Menu* menu; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenu" ); - menu = fgMenuByID( menuID ); - - freeglut_return_if_fail( menu ); - - fgStructure.CurrentMenu = menu; -} - -/* - * Adds a menu entry to the bottom of the current menu - */ -void FGAPIENTRY glutAddMenuEntry( const char* label, int value ) -{ - SFG_MenuEntry* menuEntry; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddMenuEntry" ); - menuEntry = (SFG_MenuEntry *)calloc( sizeof(SFG_MenuEntry), 1 ); - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - menuEntry->Text = strdup( label ); - menuEntry->ID = value; - - /* Have the new menu entry attached to the current menu */ - fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node ); - - fghCalculateMenuBoxSize( ); -} - -/* - * Add a sub menu to the bottom of the current menu - */ -void FGAPIENTRY glutAddSubMenu( const char *label, int subMenuID ) -{ - SFG_MenuEntry *menuEntry; - SFG_Menu *subMenu; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddSubMenu" ); - menuEntry = ( SFG_MenuEntry * )calloc( sizeof( SFG_MenuEntry ), 1 ); - subMenu = fgMenuByID( subMenuID ); - - freeglut_return_if_fail( fgStructure.CurrentMenu ); - freeglut_return_if_fail( subMenu ); - - menuEntry->Text = strdup( label ); - menuEntry->SubMenu = subMenu; - menuEntry->ID = -1; - - fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node ); - fghCalculateMenuBoxSize( ); -} - -/* - * Changes the specified menu item in the current menu into a menu entry - */ -void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value ) -{ - SFG_MenuEntry* menuEntry = NULL; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToMenuEntry" ); - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - /* Get n-th menu entry in the current menu, starting from one: */ - menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item ); - - freeglut_return_if_fail( menuEntry ); - - /* We want it to become a normal menu entry, so: */ - if( menuEntry->Text ) - free( menuEntry->Text ); - - menuEntry->Text = strdup( label ); - menuEntry->ID = value; - menuEntry->SubMenu = NULL; - fghCalculateMenuBoxSize( ); -} - -/* - * Changes the specified menu item in the current menu into a sub-menu trigger. - */ -void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, - int subMenuID ) -{ - SFG_Menu* subMenu; - SFG_MenuEntry* menuEntry; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToSubMenu" ); - subMenu = fgMenuByID( subMenuID ); - menuEntry = NULL; - - freeglut_return_if_fail( fgStructure.CurrentMenu ); - freeglut_return_if_fail( subMenu ); - - /* Get n-th menu entry in the current menu, starting from one: */ - menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item ); - - freeglut_return_if_fail( menuEntry ); - - /* We want it to become a sub menu entry, so: */ - if( menuEntry->Text ) - free( menuEntry->Text ); - - menuEntry->Text = strdup( label ); - menuEntry->SubMenu = subMenu; - menuEntry->ID = -1; - fghCalculateMenuBoxSize( ); -} - -/* - * Removes the specified menu item from the current menu - */ -void FGAPIENTRY glutRemoveMenuItem( int item ) -{ - SFG_MenuEntry* menuEntry; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutRemoveMenuItem" ); - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - /* Get n-th menu entry in the current menu, starting from one: */ - menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item ); - - freeglut_return_if_fail( menuEntry ); - - fgListRemove( &fgStructure.CurrentMenu->Entries, &menuEntry->Node ); - if ( menuEntry->Text ) - free( menuEntry->Text ); - - free( menuEntry ); - fghCalculateMenuBoxSize( ); -} - -/* - * Attaches a menu to the current window - */ -void FGAPIENTRY glutAttachMenu( int button ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAttachMenu" ); - - freeglut_return_if_fail( fgStructure.CurrentWindow ); - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - freeglut_return_if_fail( button >= 0 ); - freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS ); - - fgStructure.CurrentWindow->Menu[ button ] = fgStructure.CurrentMenu; -} - -/* - * Detaches a menu from the current window - */ -void FGAPIENTRY glutDetachMenu( int button ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDetachMenu" ); - - freeglut_return_if_fail( fgStructure.CurrentWindow ); - freeglut_return_if_fail( fgStructure.CurrentMenu ); - - freeglut_return_if_fail( button >= 0 ); - freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS ); - - fgStructure.CurrentWindow->Menu[ button ] = NULL; -} - -/* - * A.Donev: Set and retrieve the menu's user data - */ -void* FGAPIENTRY glutGetMenuData( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenuData" ); - return fgStructure.CurrentMenu->UserData; -} - -void FGAPIENTRY glutSetMenuData(void* data) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenuData" ); - fgStructure.CurrentMenu->UserData=data; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_misc.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_misc.c deleted file mode 100644 index 4aa809ac4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_misc.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * freeglut_misc.c - * - * Functions that didn't fit anywhere else... - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 9 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * glutSetColor() -- - * glutGetColor() -- - * glutCopyColormap() -- - * glutSetKeyRepeat() -- this is evil and should be removed from API - */ - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * This functions checks if an OpenGL extension is supported or not - * - * XXX Wouldn't this be simpler and clearer if we used strtok()? - */ -int FGAPIENTRY glutExtensionSupported( const char* extension ) -{ - const char *extensions, *start; - const size_t len = strlen( extension ); - - /* Make sure there is a current window, and thus a current context available */ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutExtensionSupported" ); - freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); - - if (strchr(extension, ' ')) - return 0; - start = extensions = (const char *) glGetString(GL_EXTENSIONS); - - /* XXX consider printing a warning to stderr that there's no current - * rendering context. - */ - freeglut_return_val_if_fail( extensions != NULL, 0 ); - - while (1) { - const char *p = strstr(extensions, extension); - if (!p) - return 0; /* not found */ - /* check that the match isn't a super string */ - if ((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0)) - return 1; - /* skip the false match and continue */ - extensions = p + len; - } - - return 0 ; -} - -#ifndef GL_INVALID_FRAMEBUFFER_OPERATION -#ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT -#define GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_EXT -#else -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#endif -#endif - -#ifndef GL_TABLE_TOO_LARGE -#ifdef GL_TABLE_TOO_LARGE_EXT -#define GL_TABLE_TOO_LARGE GL_TABLE_TOO_LARGE_EXT -#else -#define GL_TABLE_TOO_LARGE 0x8031 -#endif -#endif - -#ifndef GL_TEXTURE_TOO_LARGE -#ifdef GL_TEXTURE_TOO_LARGE_EXT -#define GL_TEXTURE_TOO_LARGE GL_TEXTURE_TOO_LARGE_EXT -#else -#define GL_TEXTURE_TOO_LARGE 0x8065 -#endif -#endif - -/* - * A cut-down local version of gluErrorString to avoid depending on GLU. - */ -static const char* fghErrorString( GLenum error ) -{ - switch ( error ) { - case GL_INVALID_ENUM: return "invalid enumerant"; - case GL_INVALID_VALUE: return "invalid value"; - case GL_INVALID_OPERATION: return "invalid operation"; - case GL_STACK_OVERFLOW: return "stack overflow"; - case GL_STACK_UNDERFLOW: return "stack underflow"; - case GL_OUT_OF_MEMORY: return "out of memory"; - case GL_TABLE_TOO_LARGE: return "table too large"; - case GL_INVALID_FRAMEBUFFER_OPERATION: return "invalid framebuffer operation"; - case GL_TEXTURE_TOO_LARGE: return "texture too large"; - default: return "unknown GL error"; - } -} - -/* - * This function reports all the OpenGL errors that happened till now - */ -void FGAPIENTRY glutReportErrors( void ) -{ - GLenum error; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReportErrors" ); - while( ( error = glGetError() ) != GL_NO_ERROR ) - fgWarning( "GL error: %s", fghErrorString( error ) ); -} - -/* - * Control the auto-repeat of keystrokes to the current window - */ -void FGAPIENTRY glutIgnoreKeyRepeat( int ignore ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIgnoreKeyRepeat" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIgnoreKeyRepeat" ); - - fgStructure.CurrentWindow->State.IgnoreKeyRepeat = ignore ? GL_TRUE : GL_FALSE; -} - -/* - * Set global auto-repeat of keystrokes - * - * RepeatMode should be either: - * GLUT_KEY_REPEAT_OFF - * GLUT_KEY_REPEAT_ON - * GLUT_KEY_REPEAT_DEFAULT - */ -void FGAPIENTRY glutSetKeyRepeat( int repeatMode ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetKeyRepeat" ); - - switch( repeatMode ) - { - case GLUT_KEY_REPEAT_OFF: - case GLUT_KEY_REPEAT_ON: - fgState.KeyRepeat = repeatMode; - break; - - case GLUT_KEY_REPEAT_DEFAULT: - fgState.KeyRepeat = GLUT_KEY_REPEAT_ON; - break; - - default: - fgError ("Invalid glutSetKeyRepeat mode: %d", repeatMode); - break; - } -} - -/* - * Forces the joystick callback to be executed - */ -void FGAPIENTRY glutForceJoystickFunc( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutForceJoystickFunc" ); -#if !defined(_WIN32_WCE) - freeglut_return_if_fail( fgStructure.CurrentWindow != NULL ); - freeglut_return_if_fail( FETCH_WCB( *( fgStructure.CurrentWindow ), Joystick ) ); - fgJoystickPollWindow( fgStructure.CurrentWindow ); -#endif /* !defined(_WIN32_WCE) */ -} - -/* - * - */ -void FGAPIENTRY glutSetColor( int nColor, GLfloat red, GLfloat green, GLfloat blue ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetColor" ); - /* We really need to do something here. */ -} - -/* - * - */ -GLfloat FGAPIENTRY glutGetColor( int color, int component ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetColor" ); - /* We really need to do something here. */ - return( 0.0f ); -} - -/* - * - */ -void FGAPIENTRY glutCopyColormap( int window ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCopyColormap" ); - /* We really need to do something here. */ -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_overlay.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_overlay.c deleted file mode 100644 index 2a1314a4c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_overlay.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * freeglut_overlay.c - * - * Overlay management functions (as defined by GLUT API) - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * NOTE: functions declared in this file probably will not be implemented. - */ - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -void FGAPIENTRY glutEstablishOverlay( void ) { /* Not implemented */ } -void FGAPIENTRY glutRemoveOverlay( void ) { /* Not implemented */ } -void FGAPIENTRY glutUseLayer( GLenum layer ) { /* Not implemented */ } -void FGAPIENTRY glutPostOverlayRedisplay( void ) { /* Not implemented */ } -void FGAPIENTRY glutPostWindowOverlayRedisplay( int ID ) { /* Not implemented */ } -void FGAPIENTRY glutShowOverlay( void ) { /* Not implemented */ } -void FGAPIENTRY glutHideOverlay( void ) { /* Not implemented */ } - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_spaceball.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_spaceball.c deleted file mode 100644 index ad500d59e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_spaceball.c +++ /dev/null @@ -1,454 +0,0 @@ -/* Spaceball support for Linux. - * Written by John Tsiombikas - * - * This code supports 3Dconnexion's 6-dof space-whatever devices. - * It can communicate with either the proprietary 3Dconnexion daemon (3dxsrv) - * free spacenavd (http://spacenav.sourceforge.net), through the "standard" - * magellan X-based protocol. - */ - -#include -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 -#include - -enum { - SPNAV_EVENT_ANY, /* used by spnav_remove_events() */ - SPNAV_EVENT_MOTION, - SPNAV_EVENT_BUTTON /* includes both press and release */ -}; - -struct spnav_event_motion { - int type; - int x, y, z; - int rx, ry, rz; - unsigned int period; - int *data; -}; - -struct spnav_event_button { - int type; - int press; - int bnum; -}; - -typedef union spnav_event { - int type; - struct spnav_event_motion motion; - struct spnav_event_button button; -} spnav_event; - - -static int spnav_x11_open(Display *dpy, Window win); -static int spnav_x11_window(Window win); -static int spnav_x11_event(const XEvent *xev, spnav_event *event); -static int spnav_close(void); -static int spnav_fd(void); -static int spnav_remove_events(int type); - -static SFG_Window *spnav_win; -#endif - -static int sball_initialized; - - -void fgInitialiseSpaceball(void) -{ - if(sball_initialized) { - return; - } - -#if TARGET_HOST_POSIX_X11 - { - Window w; - - if(!fgStructure.CurrentWindow) - return; - - w = fgStructure.CurrentWindow->Window.Handle; - if(spnav_x11_open(fgDisplay.Display, w) == -1) { - return; - } - } -#endif - - sball_initialized = 1; -} - -void fgSpaceballClose(void) -{ -#if TARGET_HOST_POSIX_X11 - spnav_close(); -#endif -} - -int fgHasSpaceball(void) -{ - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - fgWarning("fgInitialiseSpaceball failed\n"); - return 0; - } - } - -#if TARGET_HOST_POSIX_X11 - /* XXX this function should somehow query the driver if there's a device - * plugged in, as opposed to just checking if there's a driver to talk to. - */ - return spnav_fd() == -1 ? 0 : 1; -#else - return 0; -#endif -} - -int fgSpaceballNumButtons(void) -{ - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - fgWarning("fgInitialiseSpaceball failed\n"); - return 0; - } - } - -#if TARGET_HOST_POSIX_X11 - return 2; /* TODO implement this properly */ -#else - return 0; -#endif -} - -void fgSpaceballSetWindow(SFG_Window *window) -{ - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - return; - } - } - -#if TARGET_HOST_POSIX_X11 - if(spnav_win != window) { - spnav_x11_window(window->Window.Handle); - spnav_win = window; - } -#endif -} - - -#if TARGET_HOST_POSIX_X11 -int fgIsSpaceballXEvent(const XEvent *xev) -{ - spnav_event sev; - - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - return 0; - } - } - - return spnav_x11_event(xev, &sev); -} - -void fgSpaceballHandleXEvent(const XEvent *xev) -{ - spnav_event sev; - - if(!sball_initialized) { - fgInitialiseSpaceball(); - if(!sball_initialized) { - return; - } - } - - if(spnav_x11_event(xev, &sev)) { - switch(sev.type) { - case SPNAV_EVENT_MOTION: - if(sev.motion.x | sev.motion.y | sev.motion.z) { - INVOKE_WCB(*spnav_win, SpaceMotion, (sev.motion.x, sev.motion.y, sev.motion.z)); - } - if(sev.motion.rx | sev.motion.ry | sev.motion.rz) { - INVOKE_WCB(*spnav_win, SpaceRotation, (sev.motion.rx, sev.motion.ry, sev.motion.rz)); - } - spnav_remove_events(SPNAV_EVENT_MOTION); - break; - - case SPNAV_EVENT_BUTTON: - INVOKE_WCB(*spnav_win, SpaceButton, (sev.button.bnum, sev.button.press ? GLUT_DOWN : GLUT_UP)); - break; - - default: - break; - } - } -} - -/* -The following code is part of libspnav, part of the spacenav project (spacenav.sf.net) -Copyright (C) 2007-2009 John Tsiombikas - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. -*/ -#include -#include -#include -#include - -#include -#include - -static Window get_daemon_window(Display *dpy); -static int catch_badwin(Display *dpy, XErrorEvent *err); - -static Display *dpy; -static Window app_win; -static Atom motion_event, button_press_event, button_release_event, command_event; - -enum { - CMD_APP_WINDOW = 27695, - CMD_APP_SENS -}; - -#define IS_OPEN dpy - -struct event_node { - spnav_event event; - struct event_node *next; -}; - -static int spnav_x11_open(Display *display, Window win) -{ - if(IS_OPEN) { - return -1; - } - - dpy = display; - - motion_event = XInternAtom(dpy, "MotionEvent", True); - button_press_event = XInternAtom(dpy, "ButtonPressEvent", True); - button_release_event = XInternAtom(dpy, "ButtonReleaseEvent", True); - command_event = XInternAtom(dpy, "CommandEvent", True); - - if(!motion_event || !button_press_event || !button_release_event || !command_event) { - dpy = 0; - return -1; /* daemon not started */ - } - - if(spnav_x11_window(win) == -1) { - dpy = 0; - return -1; /* daemon not started */ - } - - app_win = win; - return 0; -} - -static int spnav_close(void) -{ - if(dpy) { - spnav_x11_window(DefaultRootWindow(dpy)); - app_win = 0; - dpy = 0; - return 0; - } - return -1; -} - -static int spnav_x11_window(Window win) -{ - int (*prev_xerr_handler)(Display*, XErrorEvent*); - XEvent xev; - Window daemon_win; - - if(!IS_OPEN) { - return -1; - } - - if(!(daemon_win = get_daemon_window(dpy))) { - return -1; - } - - prev_xerr_handler = XSetErrorHandler(catch_badwin); - - xev.type = ClientMessage; - xev.xclient.send_event = False; - xev.xclient.display = dpy; - xev.xclient.window = win; - xev.xclient.message_type = command_event; - xev.xclient.format = 16; - xev.xclient.data.s[0] = ((unsigned int)win & 0xffff0000) >> 16; - xev.xclient.data.s[1] = (unsigned int)win & 0xffff; - xev.xclient.data.s[2] = CMD_APP_WINDOW; - - XSendEvent(dpy, daemon_win, False, 0, &xev); - XSync(dpy, False); - - XSetErrorHandler(prev_xerr_handler); - return 0; -} - -static int spnav_fd(void) -{ - if(dpy) { - return ConnectionNumber(dpy); - } - return -1; -} - -/*static int spnav_wait_event(spnav_event *event) -{ - if(dpy) { - for(;;) { - XEvent xev; - XNextEvent(dpy, &xev); - - if(spnav_x11_event(&xev, event) > 0) { - return event->type; - } - } - } - return 0; -} - -static int spnav_poll_event(spnav_event *event) -{ - if(dpy) { - if(XPending(dpy)) { - XEvent xev; - XNextEvent(dpy, &xev); - - return spnav_x11_event(&xev, event); - } - } - return 0; -}*/ - -static Bool match_events(Display *dpy, XEvent *xev, char *arg) -{ - int evtype = *(int*)arg; - - if(xev->type != ClientMessage) { - return False; - } - - if(xev->xclient.message_type == motion_event) { - return !evtype || evtype == SPNAV_EVENT_MOTION ? True : False; - } - if(xev->xclient.message_type == button_press_event || - xev->xclient.message_type == button_release_event) { - return !evtype || evtype == SPNAV_EVENT_BUTTON ? True : False; - } - return False; -} - -static int spnav_remove_events(int type) -{ - int rm_count = 0; - - if(dpy) { - XEvent xev; - - while(XCheckIfEvent(dpy, &xev, match_events, (char*)&type)) { - rm_count++; - } - return rm_count; - } - return 0; -} - -static int spnav_x11_event(const XEvent *xev, spnav_event *event) -{ - int i; - int xmsg_type; - - if(xev->type != ClientMessage) { - return 0; - } - - xmsg_type = xev->xclient.message_type; - - if(xmsg_type != motion_event && xmsg_type != button_press_event && - xmsg_type != button_release_event) { - return 0; - } - - if(xmsg_type == motion_event) { - event->type = SPNAV_EVENT_MOTION; - event->motion.data = &event->motion.x; - - for(i=0; i<6; i++) { - event->motion.data[i] = xev->xclient.data.s[i + 2]; - } - event->motion.period = xev->xclient.data.s[8]; - } else { - event->type = SPNAV_EVENT_BUTTON; - event->button.press = xmsg_type == button_press_event ? 1 : 0; - event->button.bnum = xev->xclient.data.s[2]; - } - return event->type; -} - - -static Window get_daemon_window(Display *dpy) -{ - Window win, root_win; - XTextProperty wname; - Atom type; - int fmt; - unsigned long nitems, bytes_after; - unsigned char *prop; - - root_win = DefaultRootWindow(dpy); - - XGetWindowProperty(dpy, root_win, command_event, 0, 1, False, AnyPropertyType, &type, &fmt, &nitems, &bytes_after, &prop); - if(!prop) { - return 0; - } - - win = *(Window*)prop; - XFree(prop); - - if(!XGetWMName(dpy, win, &wname) || strcmp("Magellan Window", (char*)wname.value) != 0) { - return 0; - } - - return win; -} - -static int catch_badwin(Display *dpy, XErrorEvent *err) -{ - char buf[256]; - - if(err->error_code == BadWindow) { - /* do nothing? */ - } else { - XGetErrorText(dpy, err->error_code, buf, sizeof buf); - fprintf(stderr, "Caught unexpected X error: %s\n", buf); - } - return 0; -} - -#endif /* TARGET_HOST_POSIX_X11 */ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_state.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_state.c deleted file mode 100644 index 589f8ffb0..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_state.c +++ /dev/null @@ -1,895 +0,0 @@ -/* - * freeglut_state.c - * - * Freeglut state query methods. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * TODO BEFORE THE STABLE RELEASE: - * - * glutGet() -- X11 tests passed, but check if all enums - * handled (what about Win32?) - * glutDeviceGet() -- X11 tests passed, but check if all enums - * handled (what about Win32?) - * glutGetModifiers() -- OK, but could also remove the limitation - * glutLayerGet() -- what about GLUT_NORMAL_DAMAGED? - * - * The fail-on-call policy will help adding the most needed things imho. - */ - -/* -- LOCAL DEFINITIONS ---------------------------------------------------- */ - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -#if TARGET_HOST_POSIX_X11 -/* - * Queries the GL context about some attributes - */ -static int fghGetConfig( int attribute ) -{ - int returnValue = 0; - int result; /* Not checked */ - - if( fgStructure.CurrentWindow ) - result = glXGetFBConfigAttrib( fgDisplay.Display, - *(fgStructure.CurrentWindow->Window.FBConfig), - attribute, - &returnValue ); - - return returnValue; -} -#endif - -/* Check if the window is in full screen state. */ -static int fghCheckFullScreen(void) -{ -#if TARGET_HOST_POSIX_X11 - return fgStructure.CurrentWindow->State.IsFullscreen; -#else - return 0; -#endif -} - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * General settings assignment method - */ -void FGAPIENTRY glutSetOption( GLenum eWhat, int value ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" ); - - /* - * XXX In chronological code add order. (WHY in that order?) - */ - switch( eWhat ) - { - case GLUT_INIT_WINDOW_X: - fgState.Position.X = (GLint)value; - break; - - case GLUT_INIT_WINDOW_Y: - fgState.Position.Y = (GLint)value; - break; - - case GLUT_INIT_WINDOW_WIDTH: - fgState.Size.X = (GLint)value; - break; - - case GLUT_INIT_WINDOW_HEIGHT: - fgState.Size.Y = (GLint)value; - break; - - case GLUT_INIT_DISPLAY_MODE: - fgState.DisplayMode = (unsigned int)value; - break; - - case GLUT_ACTION_ON_WINDOW_CLOSE: - fgState.ActionOnWindowClose = value; - break; - - case GLUT_RENDERING_CONTEXT: - fgState.UseCurrentContext = - ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE; - break; - - case GLUT_DIRECT_RENDERING: - fgState.DirectContext = value; - break; - - case GLUT_WINDOW_CURSOR: - if( fgStructure.CurrentWindow != NULL ) - fgStructure.CurrentWindow->State.Cursor = value; - break; - - case GLUT_AUX: - fgState.AuxiliaryBufferNumber = value; - break; - - case GLUT_MULTISAMPLE: - fgState.SampleNumber = value; - break; - - default: - fgWarning( "glutSetOption(): missing enum handle %d", eWhat ); - break; - } -} - -#if TARGET_HOST_MS_WINDOWS -/* The following include file is available from SGI but is not standard: - * #include - * So we copy the necessary parts out of it to support the multisampling query - */ -#define WGL_SAMPLES_ARB 0x2042 -#endif - - -/* - * General settings query method - */ -int FGAPIENTRY glutGet( GLenum eWhat ) -{ -#if TARGET_HOST_MS_WINDOWS - int returnValue ; - GLboolean boolValue ; -#endif - - int nsamples = 0; - - switch (eWhat) - { - case GLUT_INIT_STATE: - return fgState.Initialised; - - case GLUT_ELAPSED_TIME: - return fgElapsedTime(); - } - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" ); - - /* XXX In chronological code add order. (WHY in that order?) */ - switch( eWhat ) - { - /* Following values are stored in fgState and fgDisplay global structures */ - case GLUT_SCREEN_WIDTH: return fgDisplay.ScreenWidth ; - case GLUT_SCREEN_HEIGHT: return fgDisplay.ScreenHeight ; - case GLUT_SCREEN_WIDTH_MM: return fgDisplay.ScreenWidthMM ; - case GLUT_SCREEN_HEIGHT_MM: return fgDisplay.ScreenHeightMM; - case GLUT_INIT_WINDOW_X: return fgState.Position.Use ? - fgState.Position.X : -1 ; - case GLUT_INIT_WINDOW_Y: return fgState.Position.Use ? - fgState.Position.Y : -1 ; - case GLUT_INIT_WINDOW_WIDTH: return fgState.Size.Use ? - fgState.Size.X : -1 ; - case GLUT_INIT_WINDOW_HEIGHT: return fgState.Size.Use ? - fgState.Size.Y : -1 ; - case GLUT_INIT_DISPLAY_MODE: return fgState.DisplayMode ; - case GLUT_INIT_MAJOR_VERSION: return fgState.MajorVersion ; - case GLUT_INIT_MINOR_VERSION: return fgState.MinorVersion ; - case GLUT_INIT_FLAGS: return fgState.ContextFlags ; - case GLUT_INIT_PROFILE: return fgState.ContextProfile ; - -#if TARGET_HOST_POSIX_X11 - /* - * The window/context specific queries are handled mostly by - * fghGetConfig(). - */ - case GLUT_WINDOW_NUM_SAMPLES: -#ifdef GLX_VERSION_1_3 - glGetIntegerv(GL_SAMPLES, &nsamples); -#endif - return nsamples; - - /* - * The rest of GLX queries under X are general enough to use a macro to - * check them - */ -# define GLX_QUERY(a,b) case a: return fghGetConfig( b ); - - GLX_QUERY( GLUT_WINDOW_RGBA, GLX_RGBA ); - GLX_QUERY( GLUT_WINDOW_DOUBLEBUFFER, GLX_DOUBLEBUFFER ); - GLX_QUERY( GLUT_WINDOW_BUFFER_SIZE, GLX_BUFFER_SIZE ); - GLX_QUERY( GLUT_WINDOW_STENCIL_SIZE, GLX_STENCIL_SIZE ); - GLX_QUERY( GLUT_WINDOW_DEPTH_SIZE, GLX_DEPTH_SIZE ); - GLX_QUERY( GLUT_WINDOW_RED_SIZE, GLX_RED_SIZE ); - GLX_QUERY( GLUT_WINDOW_GREEN_SIZE, GLX_GREEN_SIZE ); - GLX_QUERY( GLUT_WINDOW_BLUE_SIZE, GLX_BLUE_SIZE ); - GLX_QUERY( GLUT_WINDOW_ALPHA_SIZE, GLX_ALPHA_SIZE ); - GLX_QUERY( GLUT_WINDOW_ACCUM_RED_SIZE, GLX_ACCUM_RED_SIZE ); - GLX_QUERY( GLUT_WINDOW_ACCUM_GREEN_SIZE, GLX_ACCUM_GREEN_SIZE ); - GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE, GLX_ACCUM_BLUE_SIZE ); - GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE, GLX_ACCUM_ALPHA_SIZE ); - GLX_QUERY( GLUT_WINDOW_STEREO, GLX_STEREO ); - -# undef GLX_QUERY - - /* Colormap size is handled in a bit different way than all the rest */ - case GLUT_WINDOW_COLORMAP_SIZE: - if( (fghGetConfig( GLX_RGBA )) || (fgStructure.CurrentWindow == NULL) ) - { - /* - * We've got a RGBA visual, so there is no colormap at all. - * The other possibility is that we have no current window set. - */ - return 0; - } - else - { - const GLXFBConfig * fbconfig = - fgStructure.CurrentWindow->Window.FBConfig; - - XVisualInfo * visualInfo = - glXGetVisualFromFBConfig( fgDisplay.Display, *fbconfig ); - - const int result = visualInfo->visual->map_entries; - - XFree(visualInfo); - - return result; - } - - /* - * Those calls are somewhat similiar, as they use XGetWindowAttributes() - * function - */ - case GLUT_WINDOW_X: - case GLUT_WINDOW_Y: - case GLUT_WINDOW_BORDER_WIDTH: - case GLUT_WINDOW_HEADER_HEIGHT: - { - int x, y; - Window w; - - if( fgStructure.CurrentWindow == NULL ) - return 0; - - XTranslateCoordinates( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - fgDisplay.RootWindow, - 0, 0, &x, &y, &w); - - switch ( eWhat ) - { - case GLUT_WINDOW_X: return x; - case GLUT_WINDOW_Y: return y; - } - - if ( w == 0 ) - return 0; - XTranslateCoordinates( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - w, 0, 0, &x, &y, &w); - - switch ( eWhat ) - { - case GLUT_WINDOW_BORDER_WIDTH: return x; - case GLUT_WINDOW_HEADER_HEIGHT: return y; - } - } - - case GLUT_WINDOW_WIDTH: - case GLUT_WINDOW_HEIGHT: - { - XWindowAttributes winAttributes; - - if( fgStructure.CurrentWindow == NULL ) - return 0; - XGetWindowAttributes( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &winAttributes - ); - switch ( eWhat ) - { - case GLUT_WINDOW_WIDTH: return winAttributes.width ; - case GLUT_WINDOW_HEIGHT: return winAttributes.height ; - } - } - - /* I do not know yet if there will be a fgChooseVisual() function for Win32 */ - case GLUT_DISPLAY_MODE_POSSIBLE: - { - /* We should not have to call fgChooseFBConfig again here. */ - GLXFBConfig * fbconfig; - int isPossible; - - fbconfig = fgChooseFBConfig(); - - if (fbconfig == NULL) - { - isPossible = 0; - } - else - { - isPossible = 1; - XFree(fbconfig); - } - - return isPossible; - } - - /* This is system-dependant */ - case GLUT_WINDOW_FORMAT_ID: - if( fgStructure.CurrentWindow == NULL ) - return 0; - - return fghGetConfig( GLX_VISUAL_ID ); - -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_WINDOW_NUM_SAMPLES: - glGetIntegerv(WGL_SAMPLES_ARB, &nsamples); - return nsamples; - - /* Handle the OpenGL inquiries */ - case GLUT_WINDOW_RGBA: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_RGBA_MODE, &boolValue ); - returnValue = boolValue ? 1 : 0; -#endif - return returnValue; - case GLUT_WINDOW_DOUBLEBUFFER: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_DOUBLEBUFFER, &boolValue ); - returnValue = boolValue ? 1 : 0; -#endif - return returnValue; - case GLUT_WINDOW_STEREO: -#if defined(_WIN32_WCE) - boolValue = (GLboolean)0; /* WinCE doesn't support this feature */ -#else - glGetBooleanv ( GL_STEREO, &boolValue ); - returnValue = boolValue ? 1 : 0; -#endif - return returnValue; - - case GLUT_WINDOW_RED_SIZE: - glGetIntegerv ( GL_RED_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_GREEN_SIZE: - glGetIntegerv ( GL_GREEN_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_BLUE_SIZE: - glGetIntegerv ( GL_BLUE_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_ALPHA_SIZE: - glGetIntegerv ( GL_ALPHA_BITS, &returnValue ); - return returnValue; - case GLUT_WINDOW_ACCUM_RED_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_RED_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_GREEN_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_GREEN_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_BLUE_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_BLUE_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_ACCUM_ALPHA_SIZE: -#if defined(_WIN32_WCE) - returnValue = 0; /* WinCE doesn't support this feature */ -#else - glGetIntegerv ( GL_ACCUM_ALPHA_BITS, &returnValue ); -#endif - return returnValue; - case GLUT_WINDOW_DEPTH_SIZE: - glGetIntegerv ( GL_DEPTH_BITS, &returnValue ); - return returnValue; - - case GLUT_WINDOW_BUFFER_SIZE: - returnValue = 1 ; /* ????? */ - return returnValue; - case GLUT_WINDOW_STENCIL_SIZE: - returnValue = 0 ; /* ????? */ - return returnValue; - - case GLUT_WINDOW_X: - case GLUT_WINDOW_Y: - case GLUT_WINDOW_WIDTH: - case GLUT_WINDOW_HEIGHT: - { - /* - * There is considerable confusion about the "right thing to - * do" concerning window size and position. GLUT itself is - * not consistent between Windows and UNIX/X11; since - * platform independence is a virtue for "freeglut", we - * decided to break with GLUT's behaviour. - * - * Under UNIX/X11, it is apparently not possible to get the - * window border sizes in order to subtract them off the - * window's initial position until some time after the window - * has been created. Therefore we decided on the following - * behaviour, both under Windows and under UNIX/X11: - * - When you create a window with position (x,y) and size - * (w,h), the upper left hand corner of the outside of the - * window is at (x,y) and the size of the drawable area is - * (w,h). - * - When you query the size and position of the window--as - * is happening here for Windows--"freeglut" will return - * the size of the drawable area--the (w,h) that you - * specified when you created the window--and the coordinates - * of the upper left hand corner of the drawable - * area--which is NOT the (x,y) you specified. - */ - - RECT winRect; - - freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 ); - - /* - * We need to call GetWindowRect() first... - * (this returns the pixel coordinates of the outside of the window) - */ - GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); - - /* ...then we've got to correct the results we've just received... */ - -#if !defined(_WIN32_WCE) - if ( ( fgStructure.GameModeWindow != fgStructure.CurrentWindow ) && ( fgStructure.CurrentWindow->Parent == NULL ) && - ( ! fgStructure.CurrentWindow->IsMenu ) ) - { - winRect.left += GetSystemMetrics( SM_CXSIZEFRAME ); - winRect.right -= GetSystemMetrics( SM_CXSIZEFRAME ); - winRect.top += GetSystemMetrics( SM_CYSIZEFRAME ) + GetSystemMetrics( SM_CYCAPTION ); - winRect.bottom -= GetSystemMetrics( SM_CYSIZEFRAME ); - } -#endif /* !defined(_WIN32_WCE) */ - - switch( eWhat ) - { - case GLUT_WINDOW_X: return winRect.left ; - case GLUT_WINDOW_Y: return winRect.top ; - case GLUT_WINDOW_WIDTH: return winRect.right - winRect.left; - case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top; - } - } - break; - - case GLUT_WINDOW_BORDER_WIDTH : -#if defined(_WIN32_WCE) - return 0; -#else - return GetSystemMetrics( SM_CXSIZEFRAME ); -#endif /* !defined(_WIN32_WCE) */ - - case GLUT_WINDOW_HEADER_HEIGHT : -#if defined(_WIN32_WCE) - return 0; -#else - return GetSystemMetrics( SM_CYCAPTION ); -#endif /* defined(_WIN32_WCE) */ - - case GLUT_DISPLAY_MODE_POSSIBLE: -#if defined(_WIN32_WCE) - return 0; -#else - return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, - PFD_MAIN_PLANE ); -#endif /* defined(_WIN32_WCE) */ - - - case GLUT_WINDOW_FORMAT_ID: -#if !defined(_WIN32_WCE) - if( fgStructure.CurrentWindow != NULL ) - return GetPixelFormat( fgStructure.CurrentWindow->Window.Device ); -#endif /* defined(_WIN32_WCE) */ - return 0; - -#endif - - /* The window structure queries */ - case GLUT_WINDOW_PARENT: - if( fgStructure.CurrentWindow == NULL ) return 0; - if( fgStructure.CurrentWindow->Parent == NULL ) return 0; - return fgStructure.CurrentWindow->Parent->ID; - - case GLUT_WINDOW_NUM_CHILDREN: - if( fgStructure.CurrentWindow == NULL ) - return 0; - return fgListLength( &fgStructure.CurrentWindow->Children ); - - case GLUT_WINDOW_CURSOR: - if( fgStructure.CurrentWindow == NULL ) - return 0; - return fgStructure.CurrentWindow->State.Cursor; - - case GLUT_MENU_NUM_ITEMS: - if( fgStructure.CurrentMenu == NULL ) - return 0; - return fgListLength( &fgStructure.CurrentMenu->Entries ); - - case GLUT_ACTION_ON_WINDOW_CLOSE: - return fgState.ActionOnWindowClose; - - case GLUT_VERSION : - return VERSION_MAJOR * 10000 + VERSION_MINOR * 100 + VERSION_PATCH; - - case GLUT_RENDERING_CONTEXT: - return fgState.UseCurrentContext ? GLUT_USE_CURRENT_CONTEXT - : GLUT_CREATE_NEW_CONTEXT; - - case GLUT_DIRECT_RENDERING: - return fgState.DirectContext; - - case GLUT_FULL_SCREEN: - return fghCheckFullScreen(); - - case GLUT_AUX: - return fgState.AuxiliaryBufferNumber; - - case GLUT_MULTISAMPLE: - return fgState.SampleNumber; - - default: - fgWarning( "glutGet(): missing enum handle %d", eWhat ); - break; - } - return -1; -} - -/* - * Returns various device information. - */ -int FGAPIENTRY glutDeviceGet( GLenum eWhat ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDeviceGet" ); - - /* XXX WARNING: we are mostly lying in this function. */ - switch( eWhat ) - { - case GLUT_HAS_KEYBOARD: - /* - * Win32 is assumed a keyboard, and this cannot be queried, - * except for WindowsCE. - * - * X11 has a core keyboard by definition, although it can - * be present as a virtual/dummy keyboard. For now, there - * is no reliable way to tell if a real keyboard is present. - */ -#if defined(_WIN32_CE) - return ( GetKeyboardStatus() & KBDI_KEYBOARD_PRESENT ) ? 1 : 0; -# if FREEGLUT_LIB_PRAGMAS -# pragma comment (lib,"Kbdui.lib") -# endif - -#else - return 1; -#endif - -#if TARGET_HOST_POSIX_X11 - - /* X11 has a mouse by definition */ - case GLUT_HAS_MOUSE: - return 1 ; - - case GLUT_NUM_MOUSE_BUTTONS: - /* We should be able to pass NULL when the last argument is zero, - * but at least one X server has a bug where this causes a segfault. - * - * In XFree86/Xorg servers, a mouse wheel is seen as two buttons - * rather than an Axis; "freeglut_main.c" expects this when - * checking for a wheel event. - */ - { - unsigned char map; - int nbuttons = XGetPointerMapping(fgDisplay.Display, &map,0); - return nbuttons; - } - -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_HAS_MOUSE: - /* - * MS Windows can be booted without a mouse. - */ - return GetSystemMetrics( SM_MOUSEPRESENT ); - - case GLUT_NUM_MOUSE_BUTTONS: -# if defined(_WIN32_WCE) - return 1; -# else - return GetSystemMetrics( SM_CMOUSEBUTTONS ); -# endif -#endif - - case GLUT_HAS_JOYSTICK: - return fgJoystickDetect (); - - case GLUT_OWNS_JOYSTICK: - return fgState.JoysticksInitialised; - - case GLUT_JOYSTICK_POLL_RATE: - return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.JoystickPollRate : 0; - - /* XXX The following two are only for Joystick 0 but this is an improvement */ - case GLUT_JOYSTICK_BUTTONS: - return glutJoystickGetNumButtons ( 0 ); - - case GLUT_JOYSTICK_AXES: - return glutJoystickGetNumAxes ( 0 ); - - case GLUT_HAS_DIAL_AND_BUTTON_BOX: - return fgInputDeviceDetect (); - - case GLUT_NUM_DIALS: - if ( fgState.InputDevsInitialised ) return 8; - return 0; - - case GLUT_NUM_BUTTON_BOX_BUTTONS: - return 0; - - case GLUT_HAS_SPACEBALL: - return fgHasSpaceball(); - - case GLUT_HAS_TABLET: - return 0; - - case GLUT_NUM_SPACEBALL_BUTTONS: - return fgSpaceballNumButtons(); - - case GLUT_NUM_TABLET_BUTTONS: - return 0; - - case GLUT_DEVICE_IGNORE_KEY_REPEAT: - return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.IgnoreKeyRepeat : 0; - - case GLUT_DEVICE_KEY_REPEAT: - return fgState.KeyRepeat; - - default: - fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat ); - break; - } - - /* And now -- the failure. */ - return -1; -} - -/* - * This should return the current state of ALT, SHIFT and CTRL keys. - */ -int FGAPIENTRY glutGetModifiers( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetModifiers" ); - if( fgState.Modifiers == INVALID_MODIFIERS ) - { - fgWarning( "glutGetModifiers() called outside an input callback" ); - return 0; - } - - return fgState.Modifiers; -} - -/* - * Return the state of the GLUT API overlay subsystem. A misery ;-) - */ -int FGAPIENTRY glutLayerGet( GLenum eWhat ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLayerGet" ); - - /* - * This is easy as layers are not implemented ;-) - * - * XXX Can we merge the UNIX/X11 and WIN32 sections? Or - * XXX is overlay support planned? - */ - switch( eWhat ) - { - -#if TARGET_HOST_POSIX_X11 - - case GLUT_OVERLAY_POSSIBLE: - return 0; - - case GLUT_LAYER_IN_USE: - return GLUT_NORMAL; - - case GLUT_HAS_OVERLAY: - return 0; - - case GLUT_TRANSPARENT_INDEX: - /* - * Return just anything, which is always defined as zero - * - * XXX HUH? - */ - return 0; - - case GLUT_NORMAL_DAMAGED: - /* XXX Actually I do not know. Maybe. */ - return 0; - - case GLUT_OVERLAY_DAMAGED: - return -1; - -#elif TARGET_HOST_MS_WINDOWS - - case GLUT_OVERLAY_POSSIBLE: -/* return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE, - PFD_OVERLAY_PLANE ); */ - return 0 ; - - case GLUT_LAYER_IN_USE: - return GLUT_NORMAL; - - case GLUT_HAS_OVERLAY: - return 0; - - case GLUT_TRANSPARENT_INDEX: - /* - * Return just anything, which is always defined as zero - * - * XXX HUH? - */ - return 0; - - case GLUT_NORMAL_DAMAGED: - /* XXX Actually I do not know. Maybe. */ - return 0; - - case GLUT_OVERLAY_DAMAGED: - return -1; -#endif - - default: - fgWarning( "glutLayerGet(): missing enum handle %d", eWhat ); - break; - } - - /* And fail. That's good. Programs do love failing. */ - return -1; -} - -int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int * size) -{ - int * array; - -#if TARGET_HOST_POSIX_X11 - int attributes[9]; - GLXFBConfig * fbconfigArray; /* Array of FBConfigs */ - int fbconfigArraySize; /* Number of FBConfigs in the array */ - int attribute_name = 0; -#endif - - FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues"); - - array = NULL; - *size = 0; - - switch (eWhat) - { -#if TARGET_HOST_POSIX_X11 - case GLUT_AUX: - case GLUT_MULTISAMPLE: - - attributes[0] = GLX_BUFFER_SIZE; - attributes[1] = GLX_DONT_CARE; - - switch (eWhat) - { - case GLUT_AUX: - /* - FBConfigs are now sorted by increasing number of auxiliary - buffers. We want at least one buffer. - */ - attributes[2] = GLX_AUX_BUFFERS; - attributes[3] = 1; - attributes[4] = None; - - attribute_name = GLX_AUX_BUFFERS; - - break; - - - case GLUT_MULTISAMPLE: - attributes[2] = GLX_AUX_BUFFERS; - attributes[3] = GLX_DONT_CARE; - attributes[4] = GLX_SAMPLE_BUFFERS; - attributes[5] = 1; - /* - FBConfigs are now sorted by increasing number of samples per - pixel. We want at least one sample. - */ - attributes[6] = GLX_SAMPLES; - attributes[7] = 1; - attributes[8] = None; - - attribute_name = GLX_SAMPLES; - - break; - } - - fbconfigArray = glXChooseFBConfig(fgDisplay.Display, - fgDisplay.Screen, - attributes, - &fbconfigArraySize); - - if (fbconfigArray != NULL) - { - int * temp_array; - int result; /* Returned by glXGetFBConfigAttrib. Not checked. */ - int previous_value; - int i; - - temp_array = malloc(sizeof(int) * fbconfigArraySize); - previous_value = 0; - - for (i = 0; i < fbconfigArraySize; i++) - { - int value; - - result = glXGetFBConfigAttrib(fgDisplay.Display, - fbconfigArray[i], - attribute_name, - &value); - if (value > previous_value) - { - temp_array[*size] = value; - previous_value = value; - (*size)++; - } - } - - array = malloc(sizeof(int) * (*size)); - for (i = 0; i < *size; i++) - { - array[i] = temp_array[i]; - } - - free(temp_array); - XFree(fbconfigArray); - } - - break; -#endif - - default: - break; - } - - return array; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_mono_roman.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_mono_roman.c deleted file mode 100644 index ec86d56ff..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_mono_roman.c +++ /dev/null @@ -1,2849 +0,0 @@ -/* - * freeglut_stroke_mono_roman.c - * - * freeglut Monospace Roman stroke font definition - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -/* This file has been automatically generated by the genstroke utility. */ - -#include -#include "freeglut_internal.h" - -/* char: 0x20 */ - -static const SFG_StrokeStrip ch32st[] = -{ - { 0, NULL } -}; - -static const SFG_StrokeChar ch32 = {104.762f,0,ch32st}; - -/* char: 0x21 */ - -static const SFG_StrokeVertex ch33st0[] = -{ - {52.381f,100.0f}, - {52.381f,33.3333f} -}; - -static const SFG_StrokeVertex ch33st1[] = -{ - {52.381f,9.5238f}, - {47.6191f,4.7619f}, - {52.381f,0.0f}, - {57.1429f,4.7619f}, - {52.381f,9.5238f} -}; - -static const SFG_StrokeStrip ch33st[] = -{ - {2,ch33st0}, - {5,ch33st1} -}; - -static const SFG_StrokeChar ch33 = {104.762f,2,ch33st}; - -/* char: 0x22 */ - -static const SFG_StrokeVertex ch34st0[] = -{ - {33.3334f,100.0f}, - {33.3334f,66.6667f} -}; - -static const SFG_StrokeVertex ch34st1[] = -{ - {71.4286f,100.0f}, - {71.4286f,66.6667f} -}; - -static const SFG_StrokeStrip ch34st[] = -{ - {2,ch34st0}, - {2,ch34st1} -}; - -static const SFG_StrokeChar ch34 = {104.762f,2,ch34st}; - -/* char: 0x23 */ - -static const SFG_StrokeVertex ch35st0[] = -{ - {54.7619f,119.048f}, - {21.4286f,-33.3333f} -}; - -static const SFG_StrokeVertex ch35st1[] = -{ - {83.3334f,119.048f}, - {50.0f,-33.3333f} -}; - -static const SFG_StrokeVertex ch35st2[] = -{ - {21.4286f,57.1429f}, - {88.0952f,57.1429f} -}; - -static const SFG_StrokeVertex ch35st3[] = -{ - {16.6667f,28.5714f}, - {83.3334f,28.5714f} -}; - -static const SFG_StrokeStrip ch35st[] = -{ - {2,ch35st0}, - {2,ch35st1}, - {2,ch35st2}, - {2,ch35st3} -}; - -static const SFG_StrokeChar ch35 = {104.762f,4,ch35st}; - -/* char: 0x24 */ - -static const SFG_StrokeVertex ch36st0[] = -{ - {42.8571f,119.048f}, - {42.8571f,-19.0476f} -}; - -static const SFG_StrokeVertex ch36st1[] = -{ - {61.9047f,119.048f}, - {61.9047f,-19.0476f} -}; - -static const SFG_StrokeVertex ch36st2[] = -{ - {85.7143f,85.7143f}, - {76.1905f,95.2381f}, - {61.9047f,100.0f}, - {42.8571f,100.0f}, - {28.5714f,95.2381f}, - {19.0476f,85.7143f}, - {19.0476f,76.1905f}, - {23.8095f,66.6667f}, - {28.5714f,61.9048f}, - {38.0952f,57.1429f}, - {66.6666f,47.619f}, - {76.1905f,42.8571f}, - {80.9524f,38.0952f}, - {85.7143f,28.5714f}, - {85.7143f,14.2857f}, - {76.1905f,4.7619f}, - {61.9047f,0.0f}, - {42.8571f,0.0f}, - {28.5714f,4.7619f}, - {19.0476f,14.2857f} -}; - -static const SFG_StrokeStrip ch36st[] = -{ - {2,ch36st0}, - {2,ch36st1}, - {20,ch36st2} -}; - -static const SFG_StrokeChar ch36 = {104.762f,3,ch36st}; - -/* char: 0x25 */ - -static const SFG_StrokeVertex ch37st0[] = -{ - {95.2381f,100.0f}, - {9.5238f,0.0f} -}; - -static const SFG_StrokeVertex ch37st1[] = -{ - {33.3333f,100.0f}, - {42.8571f,90.4762f}, - {42.8571f,80.9524f}, - {38.0952f,71.4286f}, - {28.5714f,66.6667f}, - {19.0476f,66.6667f}, - {9.5238f,76.1905f}, - {9.5238f,85.7143f}, - {14.2857f,95.2381f}, - {23.8095f,100.0f}, - {33.3333f,100.0f}, - {42.8571f,95.2381f}, - {57.1428f,90.4762f}, - {71.4286f,90.4762f}, - {85.7143f,95.2381f}, - {95.2381f,100.0f} -}; - -static const SFG_StrokeVertex ch37st2[] = -{ - {76.1905f,33.3333f}, - {66.6667f,28.5714f}, - {61.9048f,19.0476f}, - {61.9048f,9.5238f}, - {71.4286f,0.0f}, - {80.9524f,0.0f}, - {90.4762f,4.7619f}, - {95.2381f,14.2857f}, - {95.2381f,23.8095f}, - {85.7143f,33.3333f}, - {76.1905f,33.3333f} -}; - -static const SFG_StrokeStrip ch37st[] = -{ - {2,ch37st0}, - {16,ch37st1}, - {11,ch37st2} -}; - -static const SFG_StrokeChar ch37 = {104.762f,3,ch37st}; - -/* char: 0x26 */ - -static const SFG_StrokeVertex ch38st0[] = -{ - {100.0f,57.1429f}, - {100.0f,61.9048f}, - {95.2381f,66.6667f}, - {90.4762f,66.6667f}, - {85.7143f,61.9048f}, - {80.9524f,52.381f}, - {71.4286f,28.5714f}, - {61.9048f,14.2857f}, - {52.3809f,4.7619f}, - {42.8571f,0.0f}, - {23.8095f,0.0f}, - {14.2857f,4.7619f}, - {9.5238f,9.5238f}, - {4.7619f,19.0476f}, - {4.7619f,28.5714f}, - {9.5238f,38.0952f}, - {14.2857f,42.8571f}, - {47.619f,61.9048f}, - {52.3809f,66.6667f}, - {57.1429f,76.1905f}, - {57.1429f,85.7143f}, - {52.3809f,95.2381f}, - {42.8571f,100.0f}, - {33.3333f,95.2381f}, - {28.5714f,85.7143f}, - {28.5714f,76.1905f}, - {33.3333f,61.9048f}, - {42.8571f,47.619f}, - {66.6667f,14.2857f}, - {76.1905f,4.7619f}, - {85.7143f,0.0f}, - {95.2381f,0.0f}, - {100.0f,4.7619f}, - {100.0f,9.5238f} -}; - -static const SFG_StrokeStrip ch38st[] = -{ - {34,ch38st0} -}; - -static const SFG_StrokeChar ch38 = {104.762f,1,ch38st}; - -/* char: 0x27 */ - -static const SFG_StrokeVertex ch39st0[] = -{ - {52.381f,100.0f}, - {52.381f,66.6667f} -}; - -static const SFG_StrokeStrip ch39st[] = -{ - {2,ch39st0} -}; - -static const SFG_StrokeChar ch39 = {104.762f,1,ch39st}; - -/* char: 0x28 */ - -static const SFG_StrokeVertex ch40st0[] = -{ - {69.0476f,119.048f}, - {59.5238f,109.524f}, - {50.0f,95.2381f}, - {40.4762f,76.1905f}, - {35.7143f,52.381f}, - {35.7143f,33.3333f}, - {40.4762f,9.5238f}, - {50.0f,-9.5238f}, - {59.5238f,-23.8095f}, - {69.0476f,-33.3333f} -}; - -static const SFG_StrokeStrip ch40st[] = -{ - {10,ch40st0} -}; - -static const SFG_StrokeChar ch40 = {104.762f,1,ch40st}; - -/* char: 0x29 */ - -static const SFG_StrokeVertex ch41st0[] = -{ - {35.7143f,119.048f}, - {45.2381f,109.524f}, - {54.7619f,95.2381f}, - {64.2857f,76.1905f}, - {69.0476f,52.381f}, - {69.0476f,33.3333f}, - {64.2857f,9.5238f}, - {54.7619f,-9.5238f}, - {45.2381f,-23.8095f}, - {35.7143f,-33.3333f} -}; - -static const SFG_StrokeStrip ch41st[] = -{ - {10,ch41st0} -}; - -static const SFG_StrokeChar ch41 = {104.762f,1,ch41st}; - -/* char: 0x2a */ - -static const SFG_StrokeVertex ch42st0[] = -{ - {52.381f,71.4286f}, - {52.381f,14.2857f} -}; - -static const SFG_StrokeVertex ch42st1[] = -{ - {28.5715f,57.1429f}, - {76.1905f,28.5714f} -}; - -static const SFG_StrokeVertex ch42st2[] = -{ - {76.1905f,57.1429f}, - {28.5715f,28.5714f} -}; - -static const SFG_StrokeStrip ch42st[] = -{ - {2,ch42st0}, - {2,ch42st1}, - {2,ch42st2} -}; - -static const SFG_StrokeChar ch42 = {104.762f,3,ch42st}; - -/* char: 0x2b */ - -static const SFG_StrokeVertex ch43st0[] = -{ - {52.3809f,85.7143f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch43st1[] = -{ - {9.5238f,42.8571f}, - {95.2381f,42.8571f} -}; - -static const SFG_StrokeStrip ch43st[] = -{ - {2,ch43st0}, - {2,ch43st1} -}; - -static const SFG_StrokeChar ch43 = {104.762f,2,ch43st}; - -/* char: 0x2c */ - -static const SFG_StrokeVertex ch44st0[] = -{ - {57.1429f,4.7619f}, - {52.381f,0.0f}, - {47.6191f,4.7619f}, - {52.381f,9.5238f}, - {57.1429f,4.7619f}, - {57.1429f,-4.7619f}, - {52.381f,-14.2857f}, - {47.6191f,-19.0476f} -}; - -static const SFG_StrokeStrip ch44st[] = -{ - {8,ch44st0} -}; - -static const SFG_StrokeChar ch44 = {104.762f,1,ch44st}; - -/* char: 0x2d */ - -static const SFG_StrokeVertex ch45st0[] = -{ - {9.5238f,42.8571f}, - {95.2381f,42.8571f} -}; - -static const SFG_StrokeStrip ch45st[] = -{ - {2,ch45st0} -}; - -static const SFG_StrokeChar ch45 = {104.762f,1,ch45st}; - -/* char: 0x2e */ - -static const SFG_StrokeVertex ch46st0[] = -{ - {52.381f,9.5238f}, - {47.6191f,4.7619f}, - {52.381f,0.0f}, - {57.1429f,4.7619f}, - {52.381f,9.5238f} -}; - -static const SFG_StrokeStrip ch46st[] = -{ - {5,ch46st0} -}; - -static const SFG_StrokeChar ch46 = {104.762f,1,ch46st}; - -/* char: 0x2f */ - -static const SFG_StrokeVertex ch47st0[] = -{ - {19.0476f,-14.2857f}, - {85.7143f,100.0f} -}; - -static const SFG_StrokeStrip ch47st[] = -{ - {2,ch47st0} -}; - -static const SFG_StrokeChar ch47 = {104.762f,1,ch47st}; - -/* char: 0x30 */ - -static const SFG_StrokeVertex ch48st0[] = -{ - {47.619f,100.0f}, - {33.3333f,95.2381f}, - {23.8095f,80.9524f}, - {19.0476f,57.1429f}, - {19.0476f,42.8571f}, - {23.8095f,19.0476f}, - {33.3333f,4.7619f}, - {47.619f,0.0f}, - {57.1428f,0.0f}, - {71.4286f,4.7619f}, - {80.9524f,19.0476f}, - {85.7143f,42.8571f}, - {85.7143f,57.1429f}, - {80.9524f,80.9524f}, - {71.4286f,95.2381f}, - {57.1428f,100.0f}, - {47.619f,100.0f} -}; - -static const SFG_StrokeStrip ch48st[] = -{ - {17,ch48st0} -}; - -static const SFG_StrokeChar ch48 = {104.762f,1,ch48st}; - -/* char: 0x31 */ - -static const SFG_StrokeVertex ch49st0[] = -{ - {40.4762f,80.9524f}, - {50.0f,85.7143f}, - {64.2857f,100.0f}, - {64.2857f,0.0f} -}; - -static const SFG_StrokeStrip ch49st[] = -{ - {4,ch49st0} -}; - -static const SFG_StrokeChar ch49 = {104.762f,1,ch49st}; - -/* char: 0x32 */ - -static const SFG_StrokeVertex ch50st0[] = -{ - {23.8095f,76.1905f}, - {23.8095f,80.9524f}, - {28.5714f,90.4762f}, - {33.3333f,95.2381f}, - {42.8571f,100.0f}, - {61.9047f,100.0f}, - {71.4286f,95.2381f}, - {76.1905f,90.4762f}, - {80.9524f,80.9524f}, - {80.9524f,71.4286f}, - {76.1905f,61.9048f}, - {66.6666f,47.619f}, - {19.0476f,0.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeStrip ch50st[] = -{ - {14,ch50st0} -}; - -static const SFG_StrokeChar ch50 = {104.762f,1,ch50st}; - -/* char: 0x33 */ - -static const SFG_StrokeVertex ch51st0[] = -{ - {28.5714f,100.0f}, - {80.9524f,100.0f}, - {52.3809f,61.9048f}, - {66.6666f,61.9048f}, - {76.1905f,57.1429f}, - {80.9524f,52.381f}, - {85.7143f,38.0952f}, - {85.7143f,28.5714f}, - {80.9524f,14.2857f}, - {71.4286f,4.7619f}, - {57.1428f,0.0f}, - {42.8571f,0.0f}, - {28.5714f,4.7619f}, - {23.8095f,9.5238f}, - {19.0476f,19.0476f} -}; - -static const SFG_StrokeStrip ch51st[] = -{ - {15,ch51st0} -}; - -static const SFG_StrokeChar ch51 = {104.762f,1,ch51st}; - -/* char: 0x34 */ - -static const SFG_StrokeVertex ch52st0[] = -{ - {64.2857f,100.0f}, - {16.6667f,33.3333f}, - {88.0952f,33.3333f} -}; - -static const SFG_StrokeVertex ch52st1[] = -{ - {64.2857f,100.0f}, - {64.2857f,0.0f} -}; - -static const SFG_StrokeStrip ch52st[] = -{ - {3,ch52st0}, - {2,ch52st1} -}; - -static const SFG_StrokeChar ch52 = {104.762f,2,ch52st}; - -/* char: 0x35 */ - -static const SFG_StrokeVertex ch53st0[] = -{ - {76.1905f,100.0f}, - {28.5714f,100.0f}, - {23.8095f,57.1429f}, - {28.5714f,61.9048f}, - {42.8571f,66.6667f}, - {57.1428f,66.6667f}, - {71.4286f,61.9048f}, - {80.9524f,52.381f}, - {85.7143f,38.0952f}, - {85.7143f,28.5714f}, - {80.9524f,14.2857f}, - {71.4286f,4.7619f}, - {57.1428f,0.0f}, - {42.8571f,0.0f}, - {28.5714f,4.7619f}, - {23.8095f,9.5238f}, - {19.0476f,19.0476f} -}; - -static const SFG_StrokeStrip ch53st[] = -{ - {17,ch53st0} -}; - -static const SFG_StrokeChar ch53 = {104.762f,1,ch53st}; - -/* char: 0x36 */ - -static const SFG_StrokeVertex ch54st0[] = -{ - {78.5714f,85.7143f}, - {73.8096f,95.2381f}, - {59.5238f,100.0f}, - {50.0f,100.0f}, - {35.7143f,95.2381f}, - {26.1905f,80.9524f}, - {21.4286f,57.1429f}, - {21.4286f,33.3333f}, - {26.1905f,14.2857f}, - {35.7143f,4.7619f}, - {50.0f,0.0f}, - {54.7619f,0.0f}, - {69.0476f,4.7619f}, - {78.5714f,14.2857f}, - {83.3334f,28.5714f}, - {83.3334f,33.3333f}, - {78.5714f,47.619f}, - {69.0476f,57.1429f}, - {54.7619f,61.9048f}, - {50.0f,61.9048f}, - {35.7143f,57.1429f}, - {26.1905f,47.619f}, - {21.4286f,33.3333f} -}; - -static const SFG_StrokeStrip ch54st[] = -{ - {23,ch54st0} -}; - -static const SFG_StrokeChar ch54 = {104.762f,1,ch54st}; - -/* char: 0x37 */ - -static const SFG_StrokeVertex ch55st0[] = -{ - {85.7143f,100.0f}, - {38.0952f,0.0f} -}; - -static const SFG_StrokeVertex ch55st1[] = -{ - {19.0476f,100.0f}, - {85.7143f,100.0f} -}; - -static const SFG_StrokeStrip ch55st[] = -{ - {2,ch55st0}, - {2,ch55st1} -}; - -static const SFG_StrokeChar ch55 = {104.762f,2,ch55st}; - -/* char: 0x38 */ - -static const SFG_StrokeVertex ch56st0[] = -{ - {42.8571f,100.0f}, - {28.5714f,95.2381f}, - {23.8095f,85.7143f}, - {23.8095f,76.1905f}, - {28.5714f,66.6667f}, - {38.0952f,61.9048f}, - {57.1428f,57.1429f}, - {71.4286f,52.381f}, - {80.9524f,42.8571f}, - {85.7143f,33.3333f}, - {85.7143f,19.0476f}, - {80.9524f,9.5238f}, - {76.1905f,4.7619f}, - {61.9047f,0.0f}, - {42.8571f,0.0f}, - {28.5714f,4.7619f}, - {23.8095f,9.5238f}, - {19.0476f,19.0476f}, - {19.0476f,33.3333f}, - {23.8095f,42.8571f}, - {33.3333f,52.381f}, - {47.619f,57.1429f}, - {66.6666f,61.9048f}, - {76.1905f,66.6667f}, - {80.9524f,76.1905f}, - {80.9524f,85.7143f}, - {76.1905f,95.2381f}, - {61.9047f,100.0f}, - {42.8571f,100.0f} -}; - -static const SFG_StrokeStrip ch56st[] = -{ - {29,ch56st0} -}; - -static const SFG_StrokeChar ch56 = {104.762f,1,ch56st}; - -/* char: 0x39 */ - -static const SFG_StrokeVertex ch57st0[] = -{ - {83.3334f,66.6667f}, - {78.5714f,52.381f}, - {69.0476f,42.8571f}, - {54.7619f,38.0952f}, - {50.0f,38.0952f}, - {35.7143f,42.8571f}, - {26.1905f,52.381f}, - {21.4286f,66.6667f}, - {21.4286f,71.4286f}, - {26.1905f,85.7143f}, - {35.7143f,95.2381f}, - {50.0f,100.0f}, - {54.7619f,100.0f}, - {69.0476f,95.2381f}, - {78.5714f,85.7143f}, - {83.3334f,66.6667f}, - {83.3334f,42.8571f}, - {78.5714f,19.0476f}, - {69.0476f,4.7619f}, - {54.7619f,0.0f}, - {45.2381f,0.0f}, - {30.9524f,4.7619f}, - {26.1905f,14.2857f} -}; - -static const SFG_StrokeStrip ch57st[] = -{ - {23,ch57st0} -}; - -static const SFG_StrokeChar ch57 = {104.762f,1,ch57st}; - -/* char: 0x3a */ - -static const SFG_StrokeVertex ch58st0[] = -{ - {52.381f,66.6667f}, - {47.6191f,61.9048f}, - {52.381f,57.1429f}, - {57.1429f,61.9048f}, - {52.381f,66.6667f} -}; - -static const SFG_StrokeVertex ch58st1[] = -{ - {52.381f,9.5238f}, - {47.6191f,4.7619f}, - {52.381f,0.0f}, - {57.1429f,4.7619f}, - {52.381f,9.5238f} -}; - -static const SFG_StrokeStrip ch58st[] = -{ - {5,ch58st0}, - {5,ch58st1} -}; - -static const SFG_StrokeChar ch58 = {104.762f,2,ch58st}; - -/* char: 0x3b */ - -static const SFG_StrokeVertex ch59st0[] = -{ - {52.381f,66.6667f}, - {47.6191f,61.9048f}, - {52.381f,57.1429f}, - {57.1429f,61.9048f}, - {52.381f,66.6667f} -}; - -static const SFG_StrokeVertex ch59st1[] = -{ - {57.1429f,4.7619f}, - {52.381f,0.0f}, - {47.6191f,4.7619f}, - {52.381f,9.5238f}, - {57.1429f,4.7619f}, - {57.1429f,-4.7619f}, - {52.381f,-14.2857f}, - {47.6191f,-19.0476f} -}; - -static const SFG_StrokeStrip ch59st[] = -{ - {5,ch59st0}, - {8,ch59st1} -}; - -static const SFG_StrokeChar ch59 = {104.762f,2,ch59st}; - -/* char: 0x3c */ - -static const SFG_StrokeVertex ch60st0[] = -{ - {90.4762f,85.7143f}, - {14.2857f,42.8571f}, - {90.4762f,0.0f} -}; - -static const SFG_StrokeStrip ch60st[] = -{ - {3,ch60st0} -}; - -static const SFG_StrokeChar ch60 = {104.762f,1,ch60st}; - -/* char: 0x3d */ - -static const SFG_StrokeVertex ch61st0[] = -{ - {9.5238f,57.1429f}, - {95.2381f,57.1429f} -}; - -static const SFG_StrokeVertex ch61st1[] = -{ - {9.5238f,28.5714f}, - {95.2381f,28.5714f} -}; - -static const SFG_StrokeStrip ch61st[] = -{ - {2,ch61st0}, - {2,ch61st1} -}; - -static const SFG_StrokeChar ch61 = {104.762f,2,ch61st}; - -/* char: 0x3e */ - -static const SFG_StrokeVertex ch62st0[] = -{ - {14.2857f,85.7143f}, - {90.4762f,42.8571f}, - {14.2857f,0.0f} -}; - -static const SFG_StrokeStrip ch62st[] = -{ - {3,ch62st0} -}; - -static const SFG_StrokeChar ch62 = {104.762f,1,ch62st}; - -/* char: 0x3f */ - -static const SFG_StrokeVertex ch63st0[] = -{ - {23.8095f,76.1905f}, - {23.8095f,80.9524f}, - {28.5714f,90.4762f}, - {33.3333f,95.2381f}, - {42.8571f,100.0f}, - {61.9047f,100.0f}, - {71.4285f,95.2381f}, - {76.1905f,90.4762f}, - {80.9524f,80.9524f}, - {80.9524f,71.4286f}, - {76.1905f,61.9048f}, - {71.4285f,57.1429f}, - {52.3809f,47.619f}, - {52.3809f,33.3333f} -}; - -static const SFG_StrokeVertex ch63st1[] = -{ - {52.3809f,9.5238f}, - {47.619f,4.7619f}, - {52.3809f,0.0f}, - {57.1428f,4.7619f}, - {52.3809f,9.5238f} -}; - -static const SFG_StrokeStrip ch63st[] = -{ - {14,ch63st0}, - {5,ch63st1} -}; - -static const SFG_StrokeChar ch63 = {104.762f,2,ch63st}; - -/* char: 0x40 */ - -static const SFG_StrokeVertex ch64st0[] = -{ - {64.2857f,52.381f}, - {54.7619f,57.1429f}, - {45.2381f,57.1429f}, - {40.4762f,47.619f}, - {40.4762f,42.8571f}, - {45.2381f,33.3333f}, - {54.7619f,33.3333f}, - {64.2857f,38.0952f} -}; - -static const SFG_StrokeVertex ch64st1[] = -{ - {64.2857f,57.1429f}, - {64.2857f,38.0952f}, - {69.0476f,33.3333f}, - {78.5714f,33.3333f}, - {83.3334f,42.8571f}, - {83.3334f,47.619f}, - {78.5714f,61.9048f}, - {69.0476f,71.4286f}, - {54.7619f,76.1905f}, - {50.0f,76.1905f}, - {35.7143f,71.4286f}, - {26.1905f,61.9048f}, - {21.4286f,47.619f}, - {21.4286f,42.8571f}, - {26.1905f,28.5714f}, - {35.7143f,19.0476f}, - {50.0f,14.2857f}, - {54.7619f,14.2857f}, - {69.0476f,19.0476f} -}; - -static const SFG_StrokeStrip ch64st[] = -{ - {8,ch64st0}, - {19,ch64st1} -}; - -static const SFG_StrokeChar ch64 = {104.762f,2,ch64st}; - -/* char: 0x41 */ - -static const SFG_StrokeVertex ch65st0[] = -{ - {52.3809f,100.0f}, - {14.2857f,0.0f} -}; - -static const SFG_StrokeVertex ch65st1[] = -{ - {52.3809f,100.0f}, - {90.4762f,0.0f} -}; - -static const SFG_StrokeVertex ch65st2[] = -{ - {28.5714f,33.3333f}, - {76.1905f,33.3333f} -}; - -static const SFG_StrokeStrip ch65st[] = -{ - {2,ch65st0}, - {2,ch65st1}, - {2,ch65st2} -}; - -static const SFG_StrokeChar ch65 = {104.762f,3,ch65st}; - -/* char: 0x42 */ - -static const SFG_StrokeVertex ch66st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch66st1[] = -{ - {19.0476f,100.0f}, - {61.9047f,100.0f}, - {76.1905f,95.2381f}, - {80.9524f,90.4762f}, - {85.7143f,80.9524f}, - {85.7143f,71.4286f}, - {80.9524f,61.9048f}, - {76.1905f,57.1429f}, - {61.9047f,52.381f} -}; - -static const SFG_StrokeVertex ch66st2[] = -{ - {19.0476f,52.381f}, - {61.9047f,52.381f}, - {76.1905f,47.619f}, - {80.9524f,42.8571f}, - {85.7143f,33.3333f}, - {85.7143f,19.0476f}, - {80.9524f,9.5238f}, - {76.1905f,4.7619f}, - {61.9047f,0.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeStrip ch66st[] = -{ - {2,ch66st0}, - {9,ch66st1}, - {10,ch66st2} -}; - -static const SFG_StrokeChar ch66 = {104.762f,3,ch66st}; - -/* char: 0x43 */ - -static const SFG_StrokeVertex ch67st0[] = -{ - {88.0952f,76.1905f}, - {83.3334f,85.7143f}, - {73.8096f,95.2381f}, - {64.2857f,100.0f}, - {45.2381f,100.0f}, - {35.7143f,95.2381f}, - {26.1905f,85.7143f}, - {21.4286f,76.1905f}, - {16.6667f,61.9048f}, - {16.6667f,38.0952f}, - {21.4286f,23.8095f}, - {26.1905f,14.2857f}, - {35.7143f,4.7619f}, - {45.2381f,0.0f}, - {64.2857f,0.0f}, - {73.8096f,4.7619f}, - {83.3334f,14.2857f}, - {88.0952f,23.8095f} -}; - -static const SFG_StrokeStrip ch67st[] = -{ - {18,ch67st0} -}; - -static const SFG_StrokeChar ch67 = {104.762f,1,ch67st}; - -/* char: 0x44 */ - -static const SFG_StrokeVertex ch68st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch68st1[] = -{ - {19.0476f,100.0f}, - {52.3809f,100.0f}, - {66.6666f,95.2381f}, - {76.1905f,85.7143f}, - {80.9524f,76.1905f}, - {85.7143f,61.9048f}, - {85.7143f,38.0952f}, - {80.9524f,23.8095f}, - {76.1905f,14.2857f}, - {66.6666f,4.7619f}, - {52.3809f,0.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeStrip ch68st[] = -{ - {2,ch68st0}, - {12,ch68st1} -}; - -static const SFG_StrokeChar ch68 = {104.762f,2,ch68st}; - -/* char: 0x45 */ - -static const SFG_StrokeVertex ch69st0[] = -{ - {21.4286f,100.0f}, - {21.4286f,0.0f} -}; - -static const SFG_StrokeVertex ch69st1[] = -{ - {21.4286f,100.0f}, - {83.3334f,100.0f} -}; - -static const SFG_StrokeVertex ch69st2[] = -{ - {21.4286f,52.381f}, - {59.5238f,52.381f} -}; - -static const SFG_StrokeVertex ch69st3[] = -{ - {21.4286f,0.0f}, - {83.3334f,0.0f} -}; - -static const SFG_StrokeStrip ch69st[] = -{ - {2,ch69st0}, - {2,ch69st1}, - {2,ch69st2}, - {2,ch69st3} -}; - -static const SFG_StrokeChar ch69 = {104.762f,4,ch69st}; - -/* char: 0x46 */ - -static const SFG_StrokeVertex ch70st0[] = -{ - {21.4286f,100.0f}, - {21.4286f,0.0f} -}; - -static const SFG_StrokeVertex ch70st1[] = -{ - {21.4286f,100.0f}, - {83.3334f,100.0f} -}; - -static const SFG_StrokeVertex ch70st2[] = -{ - {21.4286f,52.381f}, - {59.5238f,52.381f} -}; - -static const SFG_StrokeStrip ch70st[] = -{ - {2,ch70st0}, - {2,ch70st1}, - {2,ch70st2} -}; - -static const SFG_StrokeChar ch70 = {104.762f,3,ch70st}; - -/* char: 0x47 */ - -static const SFG_StrokeVertex ch71st0[] = -{ - {88.0952f,76.1905f}, - {83.3334f,85.7143f}, - {73.8096f,95.2381f}, - {64.2857f,100.0f}, - {45.2381f,100.0f}, - {35.7143f,95.2381f}, - {26.1905f,85.7143f}, - {21.4286f,76.1905f}, - {16.6667f,61.9048f}, - {16.6667f,38.0952f}, - {21.4286f,23.8095f}, - {26.1905f,14.2857f}, - {35.7143f,4.7619f}, - {45.2381f,0.0f}, - {64.2857f,0.0f}, - {73.8096f,4.7619f}, - {83.3334f,14.2857f}, - {88.0952f,23.8095f}, - {88.0952f,38.0952f} -}; - -static const SFG_StrokeVertex ch71st1[] = -{ - {64.2857f,38.0952f}, - {88.0952f,38.0952f} -}; - -static const SFG_StrokeStrip ch71st[] = -{ - {19,ch71st0}, - {2,ch71st1} -}; - -static const SFG_StrokeChar ch71 = {104.762f,2,ch71st}; - -/* char: 0x48 */ - -static const SFG_StrokeVertex ch72st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch72st1[] = -{ - {85.7143f,100.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeVertex ch72st2[] = -{ - {19.0476f,52.381f}, - {85.7143f,52.381f} -}; - -static const SFG_StrokeStrip ch72st[] = -{ - {2,ch72st0}, - {2,ch72st1}, - {2,ch72st2} -}; - -static const SFG_StrokeChar ch72 = {104.762f,3,ch72st}; - -/* char: 0x49 */ - -static const SFG_StrokeVertex ch73st0[] = -{ - {52.381f,100.0f}, - {52.381f,0.0f} -}; - -static const SFG_StrokeStrip ch73st[] = -{ - {2,ch73st0} -}; - -static const SFG_StrokeChar ch73 = {104.762f,1,ch73st}; - -/* char: 0x4a */ - -static const SFG_StrokeVertex ch74st0[] = -{ - {76.1905f,100.0f}, - {76.1905f,23.8095f}, - {71.4286f,9.5238f}, - {66.6667f,4.7619f}, - {57.1429f,0.0f}, - {47.6191f,0.0f}, - {38.0953f,4.7619f}, - {33.3334f,9.5238f}, - {28.5715f,23.8095f}, - {28.5715f,33.3333f} -}; - -static const SFG_StrokeStrip ch74st[] = -{ - {10,ch74st0} -}; - -static const SFG_StrokeChar ch74 = {104.762f,1,ch74st}; - -/* char: 0x4b */ - -static const SFG_StrokeVertex ch75st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch75st1[] = -{ - {85.7143f,100.0f}, - {19.0476f,33.3333f} -}; - -static const SFG_StrokeVertex ch75st2[] = -{ - {42.8571f,57.1429f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeStrip ch75st[] = -{ - {2,ch75st0}, - {2,ch75st1}, - {2,ch75st2} -}; - -static const SFG_StrokeChar ch75 = {104.762f,3,ch75st}; - -/* char: 0x4c */ - -static const SFG_StrokeVertex ch76st0[] = -{ - {23.8095f,100.0f}, - {23.8095f,0.0f} -}; - -static const SFG_StrokeVertex ch76st1[] = -{ - {23.8095f,0.0f}, - {80.9524f,0.0f} -}; - -static const SFG_StrokeStrip ch76st[] = -{ - {2,ch76st0}, - {2,ch76st1} -}; - -static const SFG_StrokeChar ch76 = {104.762f,2,ch76st}; - -/* char: 0x4d */ - -static const SFG_StrokeVertex ch77st0[] = -{ - {14.2857f,100.0f}, - {14.2857f,0.0f} -}; - -static const SFG_StrokeVertex ch77st1[] = -{ - {14.2857f,100.0f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch77st2[] = -{ - {90.4762f,100.0f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch77st3[] = -{ - {90.4762f,100.0f}, - {90.4762f,0.0f} -}; - -static const SFG_StrokeStrip ch77st[] = -{ - {2,ch77st0}, - {2,ch77st1}, - {2,ch77st2}, - {2,ch77st3} -}; - -static const SFG_StrokeChar ch77 = {104.762f,4,ch77st}; - -/* char: 0x4e */ - -static const SFG_StrokeVertex ch78st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch78st1[] = -{ - {19.0476f,100.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeVertex ch78st2[] = -{ - {85.7143f,100.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeStrip ch78st[] = -{ - {2,ch78st0}, - {2,ch78st1}, - {2,ch78st2} -}; - -static const SFG_StrokeChar ch78 = {104.762f,3,ch78st}; - -/* char: 0x4f */ - -static const SFG_StrokeVertex ch79st0[] = -{ - {42.8571f,100.0f}, - {33.3333f,95.2381f}, - {23.8095f,85.7143f}, - {19.0476f,76.1905f}, - {14.2857f,61.9048f}, - {14.2857f,38.0952f}, - {19.0476f,23.8095f}, - {23.8095f,14.2857f}, - {33.3333f,4.7619f}, - {42.8571f,0.0f}, - {61.9047f,0.0f}, - {71.4286f,4.7619f}, - {80.9524f,14.2857f}, - {85.7143f,23.8095f}, - {90.4762f,38.0952f}, - {90.4762f,61.9048f}, - {85.7143f,76.1905f}, - {80.9524f,85.7143f}, - {71.4286f,95.2381f}, - {61.9047f,100.0f}, - {42.8571f,100.0f} -}; - -static const SFG_StrokeStrip ch79st[] = -{ - {21,ch79st0} -}; - -static const SFG_StrokeChar ch79 = {104.762f,1,ch79st}; - -/* char: 0x50 */ - -static const SFG_StrokeVertex ch80st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch80st1[] = -{ - {19.0476f,100.0f}, - {61.9047f,100.0f}, - {76.1905f,95.2381f}, - {80.9524f,90.4762f}, - {85.7143f,80.9524f}, - {85.7143f,66.6667f}, - {80.9524f,57.1429f}, - {76.1905f,52.381f}, - {61.9047f,47.619f}, - {19.0476f,47.619f} -}; - -static const SFG_StrokeStrip ch80st[] = -{ - {2,ch80st0}, - {10,ch80st1} -}; - -static const SFG_StrokeChar ch80 = {104.762f,2,ch80st}; - -/* char: 0x51 */ - -static const SFG_StrokeVertex ch81st0[] = -{ - {42.8571f,100.0f}, - {33.3333f,95.2381f}, - {23.8095f,85.7143f}, - {19.0476f,76.1905f}, - {14.2857f,61.9048f}, - {14.2857f,38.0952f}, - {19.0476f,23.8095f}, - {23.8095f,14.2857f}, - {33.3333f,4.7619f}, - {42.8571f,0.0f}, - {61.9047f,0.0f}, - {71.4286f,4.7619f}, - {80.9524f,14.2857f}, - {85.7143f,23.8095f}, - {90.4762f,38.0952f}, - {90.4762f,61.9048f}, - {85.7143f,76.1905f}, - {80.9524f,85.7143f}, - {71.4286f,95.2381f}, - {61.9047f,100.0f}, - {42.8571f,100.0f} -}; - -static const SFG_StrokeVertex ch81st1[] = -{ - {57.1428f,19.0476f}, - {85.7143f,-9.5238f} -}; - -static const SFG_StrokeStrip ch81st[] = -{ - {21,ch81st0}, - {2,ch81st1} -}; - -static const SFG_StrokeChar ch81 = {104.762f,2,ch81st}; - -/* char: 0x52 */ - -static const SFG_StrokeVertex ch82st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch82st1[] = -{ - {19.0476f,100.0f}, - {61.9047f,100.0f}, - {76.1905f,95.2381f}, - {80.9524f,90.4762f}, - {85.7143f,80.9524f}, - {85.7143f,71.4286f}, - {80.9524f,61.9048f}, - {76.1905f,57.1429f}, - {61.9047f,52.381f}, - {19.0476f,52.381f} -}; - -static const SFG_StrokeVertex ch82st2[] = -{ - {52.3809f,52.381f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeStrip ch82st[] = -{ - {2,ch82st0}, - {10,ch82st1}, - {2,ch82st2} -}; - -static const SFG_StrokeChar ch82 = {104.762f,3,ch82st}; - -/* char: 0x53 */ - -static const SFG_StrokeVertex ch83st0[] = -{ - {85.7143f,85.7143f}, - {76.1905f,95.2381f}, - {61.9047f,100.0f}, - {42.8571f,100.0f}, - {28.5714f,95.2381f}, - {19.0476f,85.7143f}, - {19.0476f,76.1905f}, - {23.8095f,66.6667f}, - {28.5714f,61.9048f}, - {38.0952f,57.1429f}, - {66.6666f,47.619f}, - {76.1905f,42.8571f}, - {80.9524f,38.0952f}, - {85.7143f,28.5714f}, - {85.7143f,14.2857f}, - {76.1905f,4.7619f}, - {61.9047f,0.0f}, - {42.8571f,0.0f}, - {28.5714f,4.7619f}, - {19.0476f,14.2857f} -}; - -static const SFG_StrokeStrip ch83st[] = -{ - {20,ch83st0} -}; - -static const SFG_StrokeChar ch83 = {104.762f,1,ch83st}; - -/* char: 0x54 */ - -static const SFG_StrokeVertex ch84st0[] = -{ - {52.3809f,100.0f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch84st1[] = -{ - {19.0476f,100.0f}, - {85.7143f,100.0f} -}; - -static const SFG_StrokeStrip ch84st[] = -{ - {2,ch84st0}, - {2,ch84st1} -}; - -static const SFG_StrokeChar ch84 = {104.762f,2,ch84st}; - -/* char: 0x55 */ - -static const SFG_StrokeVertex ch85st0[] = -{ - {19.0476f,100.0f}, - {19.0476f,28.5714f}, - {23.8095f,14.2857f}, - {33.3333f,4.7619f}, - {47.619f,0.0f}, - {57.1428f,0.0f}, - {71.4286f,4.7619f}, - {80.9524f,14.2857f}, - {85.7143f,28.5714f}, - {85.7143f,100.0f} -}; - -static const SFG_StrokeStrip ch85st[] = -{ - {10,ch85st0} -}; - -static const SFG_StrokeChar ch85 = {104.762f,1,ch85st}; - -/* char: 0x56 */ - -static const SFG_StrokeVertex ch86st0[] = -{ - {14.2857f,100.0f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch86st1[] = -{ - {90.4762f,100.0f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeStrip ch86st[] = -{ - {2,ch86st0}, - {2,ch86st1} -}; - -static const SFG_StrokeChar ch86 = {104.762f,2,ch86st}; - -/* char: 0x57 */ - -static const SFG_StrokeVertex ch87st0[] = -{ - {4.7619f,100.0f}, - {28.5714f,0.0f} -}; - -static const SFG_StrokeVertex ch87st1[] = -{ - {52.3809f,100.0f}, - {28.5714f,0.0f} -}; - -static const SFG_StrokeVertex ch87st2[] = -{ - {52.3809f,100.0f}, - {76.1905f,0.0f} -}; - -static const SFG_StrokeVertex ch87st3[] = -{ - {100.0f,100.0f}, - {76.1905f,0.0f} -}; - -static const SFG_StrokeStrip ch87st[] = -{ - {2,ch87st0}, - {2,ch87st1}, - {2,ch87st2}, - {2,ch87st3} -}; - -static const SFG_StrokeChar ch87 = {104.762f,4,ch87st}; - -/* char: 0x58 */ - -static const SFG_StrokeVertex ch88st0[] = -{ - {19.0476f,100.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeVertex ch88st1[] = -{ - {85.7143f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeStrip ch88st[] = -{ - {2,ch88st0}, - {2,ch88st1} -}; - -static const SFG_StrokeChar ch88 = {104.762f,2,ch88st}; - -/* char: 0x59 */ - -static const SFG_StrokeVertex ch89st0[] = -{ - {14.2857f,100.0f}, - {52.3809f,52.381f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch89st1[] = -{ - {90.4762f,100.0f}, - {52.3809f,52.381f} -}; - -static const SFG_StrokeStrip ch89st[] = -{ - {3,ch89st0}, - {2,ch89st1} -}; - -static const SFG_StrokeChar ch89 = {104.762f,2,ch89st}; - -/* char: 0x5a */ - -static const SFG_StrokeVertex ch90st0[] = -{ - {85.7143f,100.0f}, - {19.0476f,0.0f} -}; - -static const SFG_StrokeVertex ch90st1[] = -{ - {19.0476f,100.0f}, - {85.7143f,100.0f} -}; - -static const SFG_StrokeVertex ch90st2[] = -{ - {19.0476f,0.0f}, - {85.7143f,0.0f} -}; - -static const SFG_StrokeStrip ch90st[] = -{ - {2,ch90st0}, - {2,ch90st1}, - {2,ch90st2} -}; - -static const SFG_StrokeChar ch90 = {104.762f,3,ch90st}; - -/* char: 0x5b */ - -static const SFG_StrokeVertex ch91st0[] = -{ - {35.7143f,119.048f}, - {35.7143f,-33.3333f} -}; - -static const SFG_StrokeVertex ch91st1[] = -{ - {40.4762f,119.048f}, - {40.4762f,-33.3333f} -}; - -static const SFG_StrokeVertex ch91st2[] = -{ - {35.7143f,119.048f}, - {69.0476f,119.048f} -}; - -static const SFG_StrokeVertex ch91st3[] = -{ - {35.7143f,-33.3333f}, - {69.0476f,-33.3333f} -}; - -static const SFG_StrokeStrip ch91st[] = -{ - {2,ch91st0}, - {2,ch91st1}, - {2,ch91st2}, - {2,ch91st3} -}; - -static const SFG_StrokeChar ch91 = {104.762f,4,ch91st}; - -/* char: 0x5c */ - -static const SFG_StrokeVertex ch92st0[] = -{ - {19.0476f,100.0f}, - {85.7143f,-14.2857f} -}; - -static const SFG_StrokeStrip ch92st[] = -{ - {2,ch92st0} -}; - -static const SFG_StrokeChar ch92 = {104.762f,1,ch92st}; - -/* char: 0x5d */ - -static const SFG_StrokeVertex ch93st0[] = -{ - {64.2857f,119.048f}, - {64.2857f,-33.3333f} -}; - -static const SFG_StrokeVertex ch93st1[] = -{ - {69.0476f,119.048f}, - {69.0476f,-33.3333f} -}; - -static const SFG_StrokeVertex ch93st2[] = -{ - {35.7143f,119.048f}, - {69.0476f,119.048f} -}; - -static const SFG_StrokeVertex ch93st3[] = -{ - {35.7143f,-33.3333f}, - {69.0476f,-33.3333f} -}; - -static const SFG_StrokeStrip ch93st[] = -{ - {2,ch93st0}, - {2,ch93st1}, - {2,ch93st2}, - {2,ch93st3} -}; - -static const SFG_StrokeChar ch93 = {104.762f,4,ch93st}; - -/* char: 0x5e */ - -static const SFG_StrokeVertex ch94st0[] = -{ - {52.3809f,109.524f}, - {14.2857f,42.8571f} -}; - -static const SFG_StrokeVertex ch94st1[] = -{ - {52.3809f,109.524f}, - {90.4762f,42.8571f} -}; - -static const SFG_StrokeStrip ch94st[] = -{ - {2,ch94st0}, - {2,ch94st1} -}; - -static const SFG_StrokeChar ch94 = {104.762f,2,ch94st}; - -/* char: 0x5f */ - -static const SFG_StrokeVertex ch95st0[] = -{ - {0,-33.3333f}, - {104.762f,-33.3333f}, - {104.762f,-28.5714f}, - {0,-28.5714f}, - {0,-33.3333f} -}; - -static const SFG_StrokeStrip ch95st[] = -{ - {5,ch95st0} -}; - -static const SFG_StrokeChar ch95 = {104.762f,1,ch95st}; - -/* char: 0x60 */ - -static const SFG_StrokeVertex ch96st0[] = -{ - {42.8572f,100.0f}, - {66.6667f,71.4286f} -}; - -static const SFG_StrokeVertex ch96st1[] = -{ - {42.8572f,100.0f}, - {38.0953f,95.2381f}, - {66.6667f,71.4286f} -}; - -static const SFG_StrokeStrip ch96st[] = -{ - {2,ch96st0}, - {3,ch96st1} -}; - -static const SFG_StrokeChar ch96 = {104.762f,2,ch96st}; - -/* char: 0x61 */ - -static const SFG_StrokeVertex ch97st0[] = -{ - {80.9524f,66.6667f}, - {80.9524f,0.0f} -}; - -static const SFG_StrokeVertex ch97st1[] = -{ - {80.9524f,52.381f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch97st[] = -{ - {2,ch97st0}, - {14,ch97st1} -}; - -static const SFG_StrokeChar ch97 = {104.762f,2,ch97st}; - -/* char: 0x62 */ - -static const SFG_StrokeVertex ch98st0[] = -{ - {23.8095f,100.0f}, - {23.8095f,0.0f} -}; - -static const SFG_StrokeVertex ch98st1[] = -{ - {23.8095f,52.381f}, - {33.3333f,61.9048f}, - {42.8571f,66.6667f}, - {57.1428f,66.6667f}, - {66.6666f,61.9048f}, - {76.1905f,52.381f}, - {80.9524f,38.0952f}, - {80.9524f,28.5714f}, - {76.1905f,14.2857f}, - {66.6666f,4.7619f}, - {57.1428f,0.0f}, - {42.8571f,0.0f}, - {33.3333f,4.7619f}, - {23.8095f,14.2857f} -}; - -static const SFG_StrokeStrip ch98st[] = -{ - {2,ch98st0}, - {14,ch98st1} -}; - -static const SFG_StrokeChar ch98 = {104.762f,2,ch98st}; - -/* char: 0x63 */ - -static const SFG_StrokeVertex ch99st0[] = -{ - {80.9524f,52.381f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch99st[] = -{ - {14,ch99st0} -}; - -static const SFG_StrokeChar ch99 = {104.762f,1,ch99st}; - -/* char: 0x64 */ - -static const SFG_StrokeVertex ch100st0[] = -{ - {80.9524f,100.0f}, - {80.9524f,0.0f} -}; - -static const SFG_StrokeVertex ch100st1[] = -{ - {80.9524f,52.381f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch100st[] = -{ - {2,ch100st0}, - {14,ch100st1} -}; - -static const SFG_StrokeChar ch100 = {104.762f,2,ch100st}; - -/* char: 0x65 */ - -static const SFG_StrokeVertex ch101st0[] = -{ - {23.8095f,38.0952f}, - {80.9524f,38.0952f}, - {80.9524f,47.619f}, - {76.1905f,57.1429f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch101st[] = -{ - {17,ch101st0} -}; - -static const SFG_StrokeChar ch101 = {104.762f,1,ch101st}; - -/* char: 0x66 */ - -static const SFG_StrokeVertex ch102st0[] = -{ - {71.4286f,100.0f}, - {61.9048f,100.0f}, - {52.381f,95.2381f}, - {47.6191f,80.9524f}, - {47.6191f,0.0f} -}; - -static const SFG_StrokeVertex ch102st1[] = -{ - {33.3334f,66.6667f}, - {66.6667f,66.6667f} -}; - -static const SFG_StrokeStrip ch102st[] = -{ - {5,ch102st0}, - {2,ch102st1} -}; - -static const SFG_StrokeChar ch102 = {104.762f,2,ch102st}; - -/* char: 0x67 */ - -static const SFG_StrokeVertex ch103st0[] = -{ - {80.9524f,66.6667f}, - {80.9524f,-9.5238f}, - {76.1905f,-23.8095f}, - {71.4285f,-28.5714f}, - {61.9047f,-33.3333f}, - {47.619f,-33.3333f}, - {38.0952f,-28.5714f} -}; - -static const SFG_StrokeVertex ch103st1[] = -{ - {80.9524f,52.381f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch103st[] = -{ - {7,ch103st0}, - {14,ch103st1} -}; - -static const SFG_StrokeChar ch103 = {104.762f,2,ch103st}; - -/* char: 0x68 */ - -static const SFG_StrokeVertex ch104st0[] = -{ - {26.1905f,100.0f}, - {26.1905f,0.0f} -}; - -static const SFG_StrokeVertex ch104st1[] = -{ - {26.1905f,47.619f}, - {40.4762f,61.9048f}, - {50.0f,66.6667f}, - {64.2857f,66.6667f}, - {73.8095f,61.9048f}, - {78.5715f,47.619f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeStrip ch104st[] = -{ - {2,ch104st0}, - {7,ch104st1} -}; - -static const SFG_StrokeChar ch104 = {104.762f,2,ch104st}; - -/* char: 0x69 */ - -static const SFG_StrokeVertex ch105st0[] = -{ - {47.6191f,100.0f}, - {52.381f,95.2381f}, - {57.1429f,100.0f}, - {52.381f,104.762f}, - {47.6191f,100.0f} -}; - -static const SFG_StrokeVertex ch105st1[] = -{ - {52.381f,66.6667f}, - {52.381f,0.0f} -}; - -static const SFG_StrokeStrip ch105st[] = -{ - {5,ch105st0}, - {2,ch105st1} -}; - -static const SFG_StrokeChar ch105 = {104.762f,2,ch105st}; - -/* char: 0x6a */ - -static const SFG_StrokeVertex ch106st0[] = -{ - {57.1429f,100.0f}, - {61.9048f,95.2381f}, - {66.6667f,100.0f}, - {61.9048f,104.762f}, - {57.1429f,100.0f} -}; - -static const SFG_StrokeVertex ch106st1[] = -{ - {61.9048f,66.6667f}, - {61.9048f,-14.2857f}, - {57.1429f,-28.5714f}, - {47.6191f,-33.3333f}, - {38.0953f,-33.3333f} -}; - -static const SFG_StrokeStrip ch106st[] = -{ - {5,ch106st0}, - {5,ch106st1} -}; - -static const SFG_StrokeChar ch106 = {104.762f,2,ch106st}; - -/* char: 0x6b */ - -static const SFG_StrokeVertex ch107st0[] = -{ - {26.1905f,100.0f}, - {26.1905f,0.0f} -}; - -static const SFG_StrokeVertex ch107st1[] = -{ - {73.8095f,66.6667f}, - {26.1905f,19.0476f} -}; - -static const SFG_StrokeVertex ch107st2[] = -{ - {45.2381f,38.0952f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeStrip ch107st[] = -{ - {2,ch107st0}, - {2,ch107st1}, - {2,ch107st2} -}; - -static const SFG_StrokeChar ch107 = {104.762f,3,ch107st}; - -/* char: 0x6c */ - -static const SFG_StrokeVertex ch108st0[] = -{ - {52.381f,100.0f}, - {52.381f,0.0f} -}; - -static const SFG_StrokeStrip ch108st[] = -{ - {2,ch108st0} -}; - -static const SFG_StrokeChar ch108 = {104.762f,1,ch108st}; - -/* char: 0x6d */ - -static const SFG_StrokeVertex ch109st0[] = -{ - {0,66.6667f}, - {0,0.0f} -}; - -static const SFG_StrokeVertex ch109st1[] = -{ - {0,47.619f}, - {14.2857f,61.9048f}, - {23.8095f,66.6667f}, - {38.0952f,66.6667f}, - {47.619f,61.9048f}, - {52.381f,47.619f}, - {52.381f,0.0f} -}; - -static const SFG_StrokeVertex ch109st2[] = -{ - {52.381f,47.619f}, - {66.6667f,61.9048f}, - {76.1905f,66.6667f}, - {90.4762f,66.6667f}, - {100.0f,61.9048f}, - {104.762f,47.619f}, - {104.762f,0.0f} -}; - -static const SFG_StrokeStrip ch109st[] = -{ - {2,ch109st0}, - {7,ch109st1}, - {7,ch109st2} -}; - -static const SFG_StrokeChar ch109 = {104.762f,3,ch109st}; - -/* char: 0x6e */ - -static const SFG_StrokeVertex ch110st0[] = -{ - {26.1905f,66.6667f}, - {26.1905f,0.0f} -}; - -static const SFG_StrokeVertex ch110st1[] = -{ - {26.1905f,47.619f}, - {40.4762f,61.9048f}, - {50.0f,66.6667f}, - {64.2857f,66.6667f}, - {73.8095f,61.9048f}, - {78.5715f,47.619f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeStrip ch110st[] = -{ - {2,ch110st0}, - {7,ch110st1} -}; - -static const SFG_StrokeChar ch110 = {104.762f,2,ch110st}; - -/* char: 0x6f */ - -static const SFG_StrokeVertex ch111st0[] = -{ - {45.2381f,66.6667f}, - {35.7143f,61.9048f}, - {26.1905f,52.381f}, - {21.4286f,38.0952f}, - {21.4286f,28.5714f}, - {26.1905f,14.2857f}, - {35.7143f,4.7619f}, - {45.2381f,0.0f}, - {59.5238f,0.0f}, - {69.0476f,4.7619f}, - {78.5714f,14.2857f}, - {83.3334f,28.5714f}, - {83.3334f,38.0952f}, - {78.5714f,52.381f}, - {69.0476f,61.9048f}, - {59.5238f,66.6667f}, - {45.2381f,66.6667f} -}; - -static const SFG_StrokeStrip ch111st[] = -{ - {17,ch111st0} -}; - -static const SFG_StrokeChar ch111 = {104.762f,1,ch111st}; - -/* char: 0x70 */ - -static const SFG_StrokeVertex ch112st0[] = -{ - {23.8095f,66.6667f}, - {23.8095f,-33.3333f} -}; - -static const SFG_StrokeVertex ch112st1[] = -{ - {23.8095f,52.381f}, - {33.3333f,61.9048f}, - {42.8571f,66.6667f}, - {57.1428f,66.6667f}, - {66.6666f,61.9048f}, - {76.1905f,52.381f}, - {80.9524f,38.0952f}, - {80.9524f,28.5714f}, - {76.1905f,14.2857f}, - {66.6666f,4.7619f}, - {57.1428f,0.0f}, - {42.8571f,0.0f}, - {33.3333f,4.7619f}, - {23.8095f,14.2857f} -}; - -static const SFG_StrokeStrip ch112st[] = -{ - {2,ch112st0}, - {14,ch112st1} -}; - -static const SFG_StrokeChar ch112 = {104.762f,2,ch112st}; - -/* char: 0x71 */ - -static const SFG_StrokeVertex ch113st0[] = -{ - {80.9524f,66.6667f}, - {80.9524f,-33.3333f} -}; - -static const SFG_StrokeVertex ch113st1[] = -{ - {80.9524f,52.381f}, - {71.4285f,61.9048f}, - {61.9047f,66.6667f}, - {47.619f,66.6667f}, - {38.0952f,61.9048f}, - {28.5714f,52.381f}, - {23.8095f,38.0952f}, - {23.8095f,28.5714f}, - {28.5714f,14.2857f}, - {38.0952f,4.7619f}, - {47.619f,0.0f}, - {61.9047f,0.0f}, - {71.4285f,4.7619f}, - {80.9524f,14.2857f} -}; - -static const SFG_StrokeStrip ch113st[] = -{ - {2,ch113st0}, - {14,ch113st1} -}; - -static const SFG_StrokeChar ch113 = {104.762f,2,ch113st}; - -/* char: 0x72 */ - -static const SFG_StrokeVertex ch114st0[] = -{ - {33.3334f,66.6667f}, - {33.3334f,0.0f} -}; - -static const SFG_StrokeVertex ch114st1[] = -{ - {33.3334f,38.0952f}, - {38.0953f,52.381f}, - {47.6191f,61.9048f}, - {57.1429f,66.6667f}, - {71.4286f,66.6667f} -}; - -static const SFG_StrokeStrip ch114st[] = -{ - {2,ch114st0}, - {5,ch114st1} -}; - -static const SFG_StrokeChar ch114 = {104.762f,2,ch114st}; - -/* char: 0x73 */ - -static const SFG_StrokeVertex ch115st0[] = -{ - {78.5715f,52.381f}, - {73.8095f,61.9048f}, - {59.5238f,66.6667f}, - {45.2381f,66.6667f}, - {30.9524f,61.9048f}, - {26.1905f,52.381f}, - {30.9524f,42.8571f}, - {40.4762f,38.0952f}, - {64.2857f,33.3333f}, - {73.8095f,28.5714f}, - {78.5715f,19.0476f}, - {78.5715f,14.2857f}, - {73.8095f,4.7619f}, - {59.5238f,0.0f}, - {45.2381f,0.0f}, - {30.9524f,4.7619f}, - {26.1905f,14.2857f} -}; - -static const SFG_StrokeStrip ch115st[] = -{ - {17,ch115st0} -}; - -static const SFG_StrokeChar ch115 = {104.762f,1,ch115st}; - -/* char: 0x74 */ - -static const SFG_StrokeVertex ch116st0[] = -{ - {47.6191f,100.0f}, - {47.6191f,19.0476f}, - {52.381f,4.7619f}, - {61.9048f,0.0f}, - {71.4286f,0.0f} -}; - -static const SFG_StrokeVertex ch116st1[] = -{ - {33.3334f,66.6667f}, - {66.6667f,66.6667f} -}; - -static const SFG_StrokeStrip ch116st[] = -{ - {5,ch116st0}, - {2,ch116st1} -}; - -static const SFG_StrokeChar ch116 = {104.762f,2,ch116st}; - -/* char: 0x75 */ - -static const SFG_StrokeVertex ch117st0[] = -{ - {26.1905f,66.6667f}, - {26.1905f,19.0476f}, - {30.9524f,4.7619f}, - {40.4762f,0.0f}, - {54.7619f,0.0f}, - {64.2857f,4.7619f}, - {78.5715f,19.0476f} -}; - -static const SFG_StrokeVertex ch117st1[] = -{ - {78.5715f,66.6667f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeStrip ch117st[] = -{ - {7,ch117st0}, - {2,ch117st1} -}; - -static const SFG_StrokeChar ch117 = {104.762f,2,ch117st}; - -/* char: 0x76 */ - -static const SFG_StrokeVertex ch118st0[] = -{ - {23.8095f,66.6667f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeVertex ch118st1[] = -{ - {80.9524f,66.6667f}, - {52.3809f,0.0f} -}; - -static const SFG_StrokeStrip ch118st[] = -{ - {2,ch118st0}, - {2,ch118st1} -}; - -static const SFG_StrokeChar ch118 = {104.762f,2,ch118st}; - -/* char: 0x77 */ - -static const SFG_StrokeVertex ch119st0[] = -{ - {14.2857f,66.6667f}, - {33.3333f,0.0f} -}; - -static const SFG_StrokeVertex ch119st1[] = -{ - {52.3809f,66.6667f}, - {33.3333f,0.0f} -}; - -static const SFG_StrokeVertex ch119st2[] = -{ - {52.3809f,66.6667f}, - {71.4286f,0.0f} -}; - -static const SFG_StrokeVertex ch119st3[] = -{ - {90.4762f,66.6667f}, - {71.4286f,0.0f} -}; - -static const SFG_StrokeStrip ch119st[] = -{ - {2,ch119st0}, - {2,ch119st1}, - {2,ch119st2}, - {2,ch119st3} -}; - -static const SFG_StrokeChar ch119 = {104.762f,4,ch119st}; - -/* char: 0x78 */ - -static const SFG_StrokeVertex ch120st0[] = -{ - {26.1905f,66.6667f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeVertex ch120st1[] = -{ - {78.5715f,66.6667f}, - {26.1905f,0.0f} -}; - -static const SFG_StrokeStrip ch120st[] = -{ - {2,ch120st0}, - {2,ch120st1} -}; - -static const SFG_StrokeChar ch120 = {104.762f,2,ch120st}; - -/* char: 0x79 */ - -static const SFG_StrokeVertex ch121st0[] = -{ - {26.1905f,66.6667f}, - {54.7619f,0.0f} -}; - -static const SFG_StrokeVertex ch121st1[] = -{ - {83.3334f,66.6667f}, - {54.7619f,0.0f}, - {45.2381f,-19.0476f}, - {35.7143f,-28.5714f}, - {26.1905f,-33.3333f}, - {21.4286f,-33.3333f} -}; - -static const SFG_StrokeStrip ch121st[] = -{ - {2,ch121st0}, - {6,ch121st1} -}; - -static const SFG_StrokeChar ch121 = {104.762f,2,ch121st}; - -/* char: 0x7a */ - -static const SFG_StrokeVertex ch122st0[] = -{ - {78.5715f,66.6667f}, - {26.1905f,0.0f} -}; - -static const SFG_StrokeVertex ch122st1[] = -{ - {26.1905f,66.6667f}, - {78.5715f,66.6667f} -}; - -static const SFG_StrokeVertex ch122st2[] = -{ - {26.1905f,0.0f}, - {78.5715f,0.0f} -}; - -static const SFG_StrokeStrip ch122st[] = -{ - {2,ch122st0}, - {2,ch122st1}, - {2,ch122st2} -}; - -static const SFG_StrokeChar ch122 = {104.762f,3,ch122st}; - -/* char: 0x7b */ - -static const SFG_StrokeVertex ch123st0[] = -{ - {64.2857f,119.048f}, - {54.7619f,114.286f}, - {50.0f,109.524f}, - {45.2381f,100.0f}, - {45.2381f,90.4762f}, - {50.0f,80.9524f}, - {54.7619f,76.1905f}, - {59.5238f,66.6667f}, - {59.5238f,57.1429f}, - {50.0f,47.619f} -}; - -static const SFG_StrokeVertex ch123st1[] = -{ - {54.7619f,114.286f}, - {50.0f,104.762f}, - {50.0f,95.2381f}, - {54.7619f,85.7143f}, - {59.5238f,80.9524f}, - {64.2857f,71.4286f}, - {64.2857f,61.9048f}, - {59.5238f,52.381f}, - {40.4762f,42.8571f}, - {59.5238f,33.3333f}, - {64.2857f,23.8095f}, - {64.2857f,14.2857f}, - {59.5238f,4.7619f}, - {54.7619f,0.0f}, - {50.0f,-9.5238f}, - {50.0f,-19.0476f}, - {54.7619f,-28.5714f} -}; - -static const SFG_StrokeVertex ch123st2[] = -{ - {50.0f,38.0952f}, - {59.5238f,28.5714f}, - {59.5238f,19.0476f}, - {54.7619f,9.5238f}, - {50.0f,4.7619f}, - {45.2381f,-4.7619f}, - {45.2381f,-14.2857f}, - {50.0f,-23.8095f}, - {54.7619f,-28.5714f}, - {64.2857f,-33.3333f} -}; - -static const SFG_StrokeStrip ch123st[] = -{ - {10,ch123st0}, - {17,ch123st1}, - {10,ch123st2} -}; - -static const SFG_StrokeChar ch123 = {104.762f,3,ch123st}; - -/* char: 0x7c */ - -static const SFG_StrokeVertex ch124st0[] = -{ - {52.381f,119.048f}, - {52.381f,-33.3333f} -}; - -static const SFG_StrokeStrip ch124st[] = -{ - {2,ch124st0} -}; - -static const SFG_StrokeChar ch124 = {104.762f,1,ch124st}; - -/* char: 0x7d */ - -static const SFG_StrokeVertex ch125st0[] = -{ - {40.4762f,119.048f}, - {50.0f,114.286f}, - {54.7619f,109.524f}, - {59.5238f,100.0f}, - {59.5238f,90.4762f}, - {54.7619f,80.9524f}, - {50.0f,76.1905f}, - {45.2381f,66.6667f}, - {45.2381f,57.1429f}, - {54.7619f,47.619f} -}; - -static const SFG_StrokeVertex ch125st1[] = -{ - {50.0f,114.286f}, - {54.7619f,104.762f}, - {54.7619f,95.2381f}, - {50.0f,85.7143f}, - {45.2381f,80.9524f}, - {40.4762f,71.4286f}, - {40.4762f,61.9048f}, - {45.2381f,52.381f}, - {64.2857f,42.8571f}, - {45.2381f,33.3333f}, - {40.4762f,23.8095f}, - {40.4762f,14.2857f}, - {45.2381f,4.7619f}, - {50.0f,0.0f}, - {54.7619f,-9.5238f}, - {54.7619f,-19.0476f}, - {50.0f,-28.5714f} -}; - -static const SFG_StrokeVertex ch125st2[] = -{ - {54.7619f,38.0952f}, - {45.2381f,28.5714f}, - {45.2381f,19.0476f}, - {50.0f,9.5238f}, - {54.7619f,4.7619f}, - {59.5238f,-4.7619f}, - {59.5238f,-14.2857f}, - {54.7619f,-23.8095f}, - {50.0f,-28.5714f}, - {40.4762f,-33.3333f} -}; - -static const SFG_StrokeStrip ch125st[] = -{ - {10,ch125st0}, - {17,ch125st1}, - {10,ch125st2} -}; - -static const SFG_StrokeChar ch125 = {104.762f,3,ch125st}; - -/* char: 0x7e */ - -static const SFG_StrokeVertex ch126st0[] = -{ - {9.5238f,28.5714f}, - {9.5238f,38.0952f}, - {14.2857f,52.381f}, - {23.8095f,57.1429f}, - {33.3333f,57.1429f}, - {42.8571f,52.381f}, - {61.9048f,38.0952f}, - {71.4286f,33.3333f}, - {80.9524f,33.3333f}, - {90.4762f,38.0952f}, - {95.2381f,47.619f} -}; - -static const SFG_StrokeVertex ch126st1[] = -{ - {9.5238f,38.0952f}, - {14.2857f,47.619f}, - {23.8095f,52.381f}, - {33.3333f,52.381f}, - {42.8571f,47.619f}, - {61.9048f,33.3333f}, - {71.4286f,28.5714f}, - {80.9524f,28.5714f}, - {90.4762f,33.3333f}, - {95.2381f,47.619f}, - {95.2381f,57.1429f} -}; - -static const SFG_StrokeStrip ch126st[] = -{ - {11,ch126st0}, - {11,ch126st1} -}; - -static const SFG_StrokeChar ch126 = {104.762f,2,ch126st}; - -/* char: 0x7f */ - -static const SFG_StrokeVertex ch127st0[] = -{ - {71.4286f,100.0f}, - {33.3333f,-33.3333f} -}; - -static const SFG_StrokeVertex ch127st1[] = -{ - {47.619f,66.6667f}, - {33.3333f,61.9048f}, - {23.8095f,52.381f}, - {19.0476f,38.0952f}, - {19.0476f,23.8095f}, - {23.8095f,14.2857f}, - {33.3333f,4.7619f}, - {47.619f,0.0f}, - {57.1428f,0.0f}, - {71.4286f,4.7619f}, - {80.9524f,14.2857f}, - {85.7143f,28.5714f}, - {85.7143f,42.8571f}, - {80.9524f,52.381f}, - {71.4286f,61.9048f}, - {57.1428f,66.6667f}, - {47.619f,66.6667f} -}; - -static const SFG_StrokeStrip ch127st[] = -{ - {2,ch127st0}, - {17,ch127st1} -}; - -static const SFG_StrokeChar ch127 = {104.762f,2,ch127st}; - -static const SFG_StrokeChar *chars[] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39, - &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47, - &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55, - &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63, - &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71, - &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79, - &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87, - &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95, - &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103, - &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111, - &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119, - &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127 -}; - -const SFG_StrokeFont fgStrokeMonoRoman = {"MonoRoman",128,152.381f,chars}; diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_roman.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_roman.c deleted file mode 100644 index da4e03023..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_stroke_roman.c +++ /dev/null @@ -1,2849 +0,0 @@ -/* - * freeglut_stroke_roman.c - * - * freeglut Roman stroke font definition - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -/* This file has been automatically generated by the genstroke utility. */ - -#include -#include "freeglut_internal.h" - -/* char: 0x20 */ - -static const SFG_StrokeStrip ch32st[] = -{ - { 0, NULL } -}; - -static const SFG_StrokeChar ch32 = {104.762f,0,ch32st}; - -/* char: 0x21 */ - -static const SFG_StrokeVertex ch33st0[] = -{ - {13.3819f,100.0f}, - {13.3819f,33.3333f} -}; - -static const SFG_StrokeVertex ch33st1[] = -{ - {13.3819f,9.5238f}, - {8.62f,4.7619f}, - {13.3819f,0.0f}, - {18.1438f,4.7619f}, - {13.3819f,9.5238f} -}; - -static const SFG_StrokeStrip ch33st[] = -{ - {2,ch33st0}, - {5,ch33st1} -}; - -static const SFG_StrokeChar ch33 = {26.6238f,2,ch33st}; - -/* char: 0x22 */ - -static const SFG_StrokeVertex ch34st0[] = -{ - {4.02f,100.0f}, - {4.02f,66.6667f} -}; - -static const SFG_StrokeVertex ch34st1[] = -{ - {42.1152f,100.0f}, - {42.1152f,66.6667f} -}; - -static const SFG_StrokeStrip ch34st[] = -{ - {2,ch34st0}, - {2,ch34st1} -}; - -static const SFG_StrokeChar ch34 = {51.4352f,2,ch34st}; - -/* char: 0x23 */ - -static const SFG_StrokeVertex ch35st0[] = -{ - {41.2952f,119.048f}, - {7.9619f,-33.3333f} -}; - -static const SFG_StrokeVertex ch35st1[] = -{ - {69.8667f,119.048f}, - {36.5333f,-33.3333f} -}; - -static const SFG_StrokeVertex ch35st2[] = -{ - {7.9619f,57.1429f}, - {74.6286f,57.1429f} -}; - -static const SFG_StrokeVertex ch35st3[] = -{ - {3.2f,28.5714f}, - {69.8667f,28.5714f} -}; - -static const SFG_StrokeStrip ch35st[] = -{ - {2,ch35st0}, - {2,ch35st1}, - {2,ch35st2}, - {2,ch35st3} -}; - -static const SFG_StrokeChar ch35 = {79.4886f,4,ch35st}; - -/* char: 0x24 */ - -static const SFG_StrokeVertex ch36st0[] = -{ - {28.6295f,119.048f}, - {28.6295f,-19.0476f} -}; - -static const SFG_StrokeVertex ch36st1[] = -{ - {47.6771f,119.048f}, - {47.6771f,-19.0476f} -}; - -static const SFG_StrokeVertex ch36st2[] = -{ - {71.4867f,85.7143f}, - {61.9629f,95.2381f}, - {47.6771f,100.0f}, - {28.6295f,100.0f}, - {14.3438f,95.2381f}, - {4.82f,85.7143f}, - {4.82f,76.1905f}, - {9.5819f,66.6667f}, - {14.3438f,61.9048f}, - {23.8676f,57.1429f}, - {52.439f,47.619f}, - {61.9629f,42.8571f}, - {66.7248f,38.0952f}, - {71.4867f,28.5714f}, - {71.4867f,14.2857f}, - {61.9629f,4.7619f}, - {47.6771f,0.0f}, - {28.6295f,0.0f}, - {14.3438f,4.7619f}, - {4.82f,14.2857f} -}; - -static const SFG_StrokeStrip ch36st[] = -{ - {2,ch36st0}, - {2,ch36st1}, - {20,ch36st2} -}; - -static const SFG_StrokeChar ch36 = {76.2067f,3,ch36st}; - -/* char: 0x25 */ - -static const SFG_StrokeVertex ch37st0[] = -{ - {92.0743f,100.0f}, - {6.36f,0.0f} -}; - -static const SFG_StrokeVertex ch37st1[] = -{ - {30.1695f,100.0f}, - {39.6933f,90.4762f}, - {39.6933f,80.9524f}, - {34.9314f,71.4286f}, - {25.4076f,66.6667f}, - {15.8838f,66.6667f}, - {6.36f,76.1905f}, - {6.36f,85.7143f}, - {11.1219f,95.2381f}, - {20.6457f,100.0f}, - {30.1695f,100.0f}, - {39.6933f,95.2381f}, - {53.979f,90.4762f}, - {68.2648f,90.4762f}, - {82.5505f,95.2381f}, - {92.0743f,100.0f} -}; - -static const SFG_StrokeVertex ch37st2[] = -{ - {73.0267f,33.3333f}, - {63.5029f,28.5714f}, - {58.741f,19.0476f}, - {58.741f,9.5238f}, - {68.2648f,0.0f}, - {77.7886f,0.0f}, - {87.3124f,4.7619f}, - {92.0743f,14.2857f}, - {92.0743f,23.8095f}, - {82.5505f,33.3333f}, - {73.0267f,33.3333f} -}; - -static const SFG_StrokeStrip ch37st[] = -{ - {2,ch37st0}, - {16,ch37st1}, - {11,ch37st2} -}; - -static const SFG_StrokeChar ch37 = {96.5743f,3,ch37st}; - -/* char: 0x26 */ - -static const SFG_StrokeVertex ch38st0[] = -{ - {101.218f,57.1429f}, - {101.218f,61.9048f}, - {96.4562f,66.6667f}, - {91.6943f,66.6667f}, - {86.9324f,61.9048f}, - {82.1705f,52.381f}, - {72.6467f,28.5714f}, - {63.1229f,14.2857f}, - {53.599f,4.7619f}, - {44.0752f,0.0f}, - {25.0276f,0.0f}, - {15.5038f,4.7619f}, - {10.7419f,9.5238f}, - {5.98f,19.0476f}, - {5.98f,28.5714f}, - {10.7419f,38.0952f}, - {15.5038f,42.8571f}, - {48.8371f,61.9048f}, - {53.599f,66.6667f}, - {58.361f,76.1905f}, - {58.361f,85.7143f}, - {53.599f,95.2381f}, - {44.0752f,100.0f}, - {34.5514f,95.2381f}, - {29.7895f,85.7143f}, - {29.7895f,76.1905f}, - {34.5514f,61.9048f}, - {44.0752f,47.619f}, - {67.8848f,14.2857f}, - {77.4086f,4.7619f}, - {86.9324f,0.0f}, - {96.4562f,0.0f}, - {101.218f,4.7619f}, - {101.218f,9.5238f} -}; - -static const SFG_StrokeStrip ch38st[] = -{ - {34,ch38st0} -}; - -static const SFG_StrokeChar ch38 = {101.758f,1,ch38st}; - -/* char: 0x27 */ - -static const SFG_StrokeVertex ch39st0[] = -{ - {4.44f,100.0f}, - {4.44f,66.6667f} -}; - -static const SFG_StrokeStrip ch39st[] = -{ - {2,ch39st0} -}; - -static const SFG_StrokeChar ch39 = {13.62f,1,ch39st}; - -/* char: 0x28 */ - -static const SFG_StrokeVertex ch40st0[] = -{ - {40.9133f,119.048f}, - {31.3895f,109.524f}, - {21.8657f,95.2381f}, - {12.3419f,76.1905f}, - {7.58f,52.381f}, - {7.58f,33.3333f}, - {12.3419f,9.5238f}, - {21.8657f,-9.5238f}, - {31.3895f,-23.8095f}, - {40.9133f,-33.3333f} -}; - -static const SFG_StrokeStrip ch40st[] = -{ - {10,ch40st0} -}; - -static const SFG_StrokeChar ch40 = {47.1733f,1,ch40st}; - -/* char: 0x29 */ - -static const SFG_StrokeVertex ch41st0[] = -{ - {5.28f,119.048f}, - {14.8038f,109.524f}, - {24.3276f,95.2381f}, - {33.8514f,76.1905f}, - {38.6133f,52.381f}, - {38.6133f,33.3333f}, - {33.8514f,9.5238f}, - {24.3276f,-9.5238f}, - {14.8038f,-23.8095f}, - {5.28f,-33.3333f} -}; - -static const SFG_StrokeStrip ch41st[] = -{ - {10,ch41st0} -}; - -static const SFG_StrokeChar ch41 = {47.5333f,1,ch41st}; - -/* char: 0x2a */ - -static const SFG_StrokeVertex ch42st0[] = -{ - {30.7695f,71.4286f}, - {30.7695f,14.2857f} -}; - -static const SFG_StrokeVertex ch42st1[] = -{ - {6.96f,57.1429f}, - {54.579f,28.5714f} -}; - -static const SFG_StrokeVertex ch42st2[] = -{ - {54.579f,57.1429f}, - {6.96f,28.5714f} -}; - -static const SFG_StrokeStrip ch42st[] = -{ - {2,ch42st0}, - {2,ch42st1}, - {2,ch42st2} -}; - -static const SFG_StrokeChar ch42 = {59.439f,3,ch42st}; - -/* char: 0x2b */ - -static const SFG_StrokeVertex ch43st0[] = -{ - {48.8371f,85.7143f}, - {48.8371f,0.0f} -}; - -static const SFG_StrokeVertex ch43st1[] = -{ - {5.98f,42.8571f}, - {91.6943f,42.8571f} -}; - -static const SFG_StrokeStrip ch43st[] = -{ - {2,ch43st0}, - {2,ch43st1} -}; - -static const SFG_StrokeChar ch43 = {97.2543f,2,ch43st}; - -/* char: 0x2c */ - -static const SFG_StrokeVertex ch44st0[] = -{ - {18.2838f,4.7619f}, - {13.5219f,0.0f}, - {8.76f,4.7619f}, - {13.5219f,9.5238f}, - {18.2838f,4.7619f}, - {18.2838f,-4.7619f}, - {13.5219f,-14.2857f}, - {8.76f,-19.0476f} -}; - -static const SFG_StrokeStrip ch44st[] = -{ - {8,ch44st0} -}; - -static const SFG_StrokeChar ch44 = {26.0638f,1,ch44st}; - -/* char: 0x2d */ - -static const SFG_StrokeVertex ch45st0[] = -{ - {7.38f,42.8571f}, - {93.0943f,42.8571f} -}; - -static const SFG_StrokeStrip ch45st[] = -{ - {2,ch45st0} -}; - -static const SFG_StrokeChar ch45 = {100.754f,1,ch45st}; - -/* char: 0x2e */ - -static const SFG_StrokeVertex ch46st0[] = -{ - {13.1019f,9.5238f}, - {8.34f,4.7619f}, - {13.1019f,0.0f}, - {17.8638f,4.7619f}, - {13.1019f,9.5238f} -}; - -static const SFG_StrokeStrip ch46st[] = -{ - {5,ch46st0} -}; - -static const SFG_StrokeChar ch46 = {26.4838f,1,ch46st}; - -/* char: 0x2f */ - -static const SFG_StrokeVertex ch47st0[] = -{ - {7.24f,-14.2857f}, - {73.9067f,100.0f} -}; - -static const SFG_StrokeStrip ch47st[] = -{ - {2,ch47st0} -}; - -static const SFG_StrokeChar ch47 = {82.1067f,1,ch47st}; - -/* char: 0x30 */ - -static const SFG_StrokeVertex ch48st0[] = -{ - {33.5514f,100.0f}, - {19.2657f,95.2381f}, - {9.7419f,80.9524f}, - {4.98f,57.1429f}, - {4.98f,42.8571f}, - {9.7419f,19.0476f}, - {19.2657f,4.7619f}, - {33.5514f,0.0f}, - {43.0752f,0.0f}, - {57.361f,4.7619f}, - {66.8848f,19.0476f}, - {71.6467f,42.8571f}, - {71.6467f,57.1429f}, - {66.8848f,80.9524f}, - {57.361f,95.2381f}, - {43.0752f,100.0f}, - {33.5514f,100.0f} -}; - -static const SFG_StrokeStrip ch48st[] = -{ - {17,ch48st0} -}; - -static const SFG_StrokeChar ch48 = {77.0667f,1,ch48st}; - -/* char: 0x31 */ - -static const SFG_StrokeVertex ch49st0[] = -{ - {11.82f,80.9524f}, - {21.3438f,85.7143f}, - {35.6295f,100.0f}, - {35.6295f,0.0f} -}; - -static const SFG_StrokeStrip ch49st[] = -{ - {4,ch49st0} -}; - -static const SFG_StrokeChar ch49 = {66.5295f,1,ch49st}; - -/* char: 0x32 */ - -static const SFG_StrokeVertex ch50st0[] = -{ - {10.1819f,76.1905f}, - {10.1819f,80.9524f}, - {14.9438f,90.4762f}, - {19.7057f,95.2381f}, - {29.2295f,100.0f}, - {48.2771f,100.0f}, - {57.801f,95.2381f}, - {62.5629f,90.4762f}, - {67.3248f,80.9524f}, - {67.3248f,71.4286f}, - {62.5629f,61.9048f}, - {53.039f,47.619f}, - {5.42f,0.0f}, - {72.0867f,0.0f} -}; - -static const SFG_StrokeStrip ch50st[] = -{ - {14,ch50st0} -}; - -static const SFG_StrokeChar ch50 = {77.6467f,1,ch50st}; - -/* char: 0x33 */ - -static const SFG_StrokeVertex ch51st0[] = -{ - {14.5238f,100.0f}, - {66.9048f,100.0f}, - {38.3333f,61.9048f}, - {52.619f,61.9048f}, - {62.1429f,57.1429f}, - {66.9048f,52.381f}, - {71.6667f,38.0952f}, - {71.6667f,28.5714f}, - {66.9048f,14.2857f}, - {57.381f,4.7619f}, - {43.0952f,0.0f}, - {28.8095f,0.0f}, - {14.5238f,4.7619f}, - {9.7619f,9.5238f}, - {5.0f,19.0476f} -}; - -static const SFG_StrokeStrip ch51st[] = -{ - {15,ch51st0} -}; - -static const SFG_StrokeChar ch51 = {77.0467f,1,ch51st}; - -/* char: 0x34 */ - -static const SFG_StrokeVertex ch52st0[] = -{ - {51.499f,100.0f}, - {3.88f,33.3333f}, - {75.3086f,33.3333f} -}; - -static const SFG_StrokeVertex ch52st1[] = -{ - {51.499f,100.0f}, - {51.499f,0.0f} -}; - -static const SFG_StrokeStrip ch52st[] = -{ - {3,ch52st0}, - {2,ch52st1} -}; - -static const SFG_StrokeChar ch52 = {80.1686f,2,ch52st}; - -/* char: 0x35 */ - -static const SFG_StrokeVertex ch53st0[] = -{ - {62.0029f,100.0f}, - {14.3838f,100.0f}, - {9.6219f,57.1429f}, - {14.3838f,61.9048f}, - {28.6695f,66.6667f}, - {42.9552f,66.6667f}, - {57.241f,61.9048f}, - {66.7648f,52.381f}, - {71.5267f,38.0952f}, - {71.5267f,28.5714f}, - {66.7648f,14.2857f}, - {57.241f,4.7619f}, - {42.9552f,0.0f}, - {28.6695f,0.0f}, - {14.3838f,4.7619f}, - {9.6219f,9.5238f}, - {4.86f,19.0476f} -}; - -static const SFG_StrokeStrip ch53st[] = -{ - {17,ch53st0} -}; - -static const SFG_StrokeChar ch53 = {77.6867f,1,ch53st}; - -/* char: 0x36 */ - -static const SFG_StrokeVertex ch54st0[] = -{ - {62.7229f,85.7143f}, - {57.961f,95.2381f}, - {43.6752f,100.0f}, - {34.1514f,100.0f}, - {19.8657f,95.2381f}, - {10.3419f,80.9524f}, - {5.58f,57.1429f}, - {5.58f,33.3333f}, - {10.3419f,14.2857f}, - {19.8657f,4.7619f}, - {34.1514f,0.0f}, - {38.9133f,0.0f}, - {53.199f,4.7619f}, - {62.7229f,14.2857f}, - {67.4848f,28.5714f}, - {67.4848f,33.3333f}, - {62.7229f,47.619f}, - {53.199f,57.1429f}, - {38.9133f,61.9048f}, - {34.1514f,61.9048f}, - {19.8657f,57.1429f}, - {10.3419f,47.619f}, - {5.58f,33.3333f} -}; - -static const SFG_StrokeStrip ch54st[] = -{ - {23,ch54st0} -}; - -static const SFG_StrokeChar ch54 = {73.8048f,1,ch54st}; - -/* char: 0x37 */ - -static const SFG_StrokeVertex ch55st0[] = -{ - {72.2267f,100.0f}, - {24.6076f,0.0f} -}; - -static const SFG_StrokeVertex ch55st1[] = -{ - {5.56f,100.0f}, - {72.2267f,100.0f} -}; - -static const SFG_StrokeStrip ch55st[] = -{ - {2,ch55st0}, - {2,ch55st1} -}; - -static const SFG_StrokeChar ch55 = {77.2267f,2,ch55st}; - -/* char: 0x38 */ - -static const SFG_StrokeVertex ch56st0[] = -{ - {29.4095f,100.0f}, - {15.1238f,95.2381f}, - {10.3619f,85.7143f}, - {10.3619f,76.1905f}, - {15.1238f,66.6667f}, - {24.6476f,61.9048f}, - {43.6952f,57.1429f}, - {57.981f,52.381f}, - {67.5048f,42.8571f}, - {72.2667f,33.3333f}, - {72.2667f,19.0476f}, - {67.5048f,9.5238f}, - {62.7429f,4.7619f}, - {48.4571f,0.0f}, - {29.4095f,0.0f}, - {15.1238f,4.7619f}, - {10.3619f,9.5238f}, - {5.6f,19.0476f}, - {5.6f,33.3333f}, - {10.3619f,42.8571f}, - {19.8857f,52.381f}, - {34.1714f,57.1429f}, - {53.219f,61.9048f}, - {62.7429f,66.6667f}, - {67.5048f,76.1905f}, - {67.5048f,85.7143f}, - {62.7429f,95.2381f}, - {48.4571f,100.0f}, - {29.4095f,100.0f} -}; - -static const SFG_StrokeStrip ch56st[] = -{ - {29,ch56st0} -}; - -static const SFG_StrokeChar ch56 = {77.6667f,1,ch56st}; - -/* char: 0x39 */ - -static const SFG_StrokeVertex ch57st0[] = -{ - {68.5048f,66.6667f}, - {63.7429f,52.381f}, - {54.219f,42.8571f}, - {39.9333f,38.0952f}, - {35.1714f,38.0952f}, - {20.8857f,42.8571f}, - {11.3619f,52.381f}, - {6.6f,66.6667f}, - {6.6f,71.4286f}, - {11.3619f,85.7143f}, - {20.8857f,95.2381f}, - {35.1714f,100.0f}, - {39.9333f,100.0f}, - {54.219f,95.2381f}, - {63.7429f,85.7143f}, - {68.5048f,66.6667f}, - {68.5048f,42.8571f}, - {63.7429f,19.0476f}, - {54.219f,4.7619f}, - {39.9333f,0.0f}, - {30.4095f,0.0f}, - {16.1238f,4.7619f}, - {11.3619f,14.2857f} -}; - -static const SFG_StrokeStrip ch57st[] = -{ - {23,ch57st0} -}; - -static const SFG_StrokeChar ch57 = {74.0648f,1,ch57st}; - -/* char: 0x3a */ - -static const SFG_StrokeVertex ch58st0[] = -{ - {14.0819f,66.6667f}, - {9.32f,61.9048f}, - {14.0819f,57.1429f}, - {18.8438f,61.9048f}, - {14.0819f,66.6667f} -}; - -static const SFG_StrokeVertex ch58st1[] = -{ - {14.0819f,9.5238f}, - {9.32f,4.7619f}, - {14.0819f,0.0f}, - {18.8438f,4.7619f}, - {14.0819f,9.5238f} -}; - -static const SFG_StrokeStrip ch58st[] = -{ - {5,ch58st0}, - {5,ch58st1} -}; - -static const SFG_StrokeChar ch58 = {26.2238f,2,ch58st}; - -/* char: 0x3b */ - -static const SFG_StrokeVertex ch59st0[] = -{ - {12.9619f,66.6667f}, - {8.2f,61.9048f}, - {12.9619f,57.1429f}, - {17.7238f,61.9048f}, - {12.9619f,66.6667f} -}; - -static const SFG_StrokeVertex ch59st1[] = -{ - {17.7238f,4.7619f}, - {12.9619f,0.0f}, - {8.2f,4.7619f}, - {12.9619f,9.5238f}, - {17.7238f,4.7619f}, - {17.7238f,-4.7619f}, - {12.9619f,-14.2857f}, - {8.2f,-19.0476f} -}; - -static const SFG_StrokeStrip ch59st[] = -{ - {5,ch59st0}, - {8,ch59st1} -}; - -static const SFG_StrokeChar ch59 = {26.3038f,2,ch59st}; - -/* char: 0x3c */ - -static const SFG_StrokeVertex ch60st0[] = -{ - {79.2505f,85.7143f}, - {3.06f,42.8571f}, - {79.2505f,0.0f} -}; - -static const SFG_StrokeStrip ch60st[] = -{ - {3,ch60st0} -}; - -static const SFG_StrokeChar ch60 = {81.6105f,1,ch60st}; - -/* char: 0x3d */ - -static const SFG_StrokeVertex ch61st0[] = -{ - {5.7f,57.1429f}, - {91.4143f,57.1429f} -}; - -static const SFG_StrokeVertex ch61st1[] = -{ - {5.7f,28.5714f}, - {91.4143f,28.5714f} -}; - -static const SFG_StrokeStrip ch61st[] = -{ - {2,ch61st0}, - {2,ch61st1} -}; - -static const SFG_StrokeChar ch61 = {97.2543f,2,ch61st}; - -/* char: 0x3e */ - -static const SFG_StrokeVertex ch62st0[] = -{ - {2.78f,85.7143f}, - {78.9705f,42.8571f}, - {2.78f,0.0f} -}; - -static const SFG_StrokeStrip ch62st[] = -{ - {3,ch62st0} -}; - -static const SFG_StrokeChar ch62 = {81.6105f,1,ch62st}; - -/* char: 0x3f */ - -static const SFG_StrokeVertex ch63st0[] = -{ - {8.42f,76.1905f}, - {8.42f,80.9524f}, - {13.1819f,90.4762f}, - {17.9438f,95.2381f}, - {27.4676f,100.0f}, - {46.5152f,100.0f}, - {56.039f,95.2381f}, - {60.801f,90.4762f}, - {65.5629f,80.9524f}, - {65.5629f,71.4286f}, - {60.801f,61.9048f}, - {56.039f,57.1429f}, - {36.9914f,47.619f}, - {36.9914f,33.3333f} -}; - -static const SFG_StrokeVertex ch63st1[] = -{ - {36.9914f,9.5238f}, - {32.2295f,4.7619f}, - {36.9914f,0.0f}, - {41.7533f,4.7619f}, - {36.9914f,9.5238f} -}; - -static const SFG_StrokeStrip ch63st[] = -{ - {14,ch63st0}, - {5,ch63st1} -}; - -static const SFG_StrokeChar ch63 = {73.9029f,2,ch63st}; - -/* char: 0x40 */ - -static const SFG_StrokeVertex ch64st0[] = -{ - {49.2171f,52.381f}, - {39.6933f,57.1429f}, - {30.1695f,57.1429f}, - {25.4076f,47.619f}, - {25.4076f,42.8571f}, - {30.1695f,33.3333f}, - {39.6933f,33.3333f}, - {49.2171f,38.0952f} -}; - -static const SFG_StrokeVertex ch64st1[] = -{ - {49.2171f,57.1429f}, - {49.2171f,38.0952f}, - {53.979f,33.3333f}, - {63.5029f,33.3333f}, - {68.2648f,42.8571f}, - {68.2648f,47.619f}, - {63.5029f,61.9048f}, - {53.979f,71.4286f}, - {39.6933f,76.1905f}, - {34.9314f,76.1905f}, - {20.6457f,71.4286f}, - {11.1219f,61.9048f}, - {6.36f,47.619f}, - {6.36f,42.8571f}, - {11.1219f,28.5714f}, - {20.6457f,19.0476f}, - {34.9314f,14.2857f}, - {39.6933f,14.2857f}, - {53.979f,19.0476f} -}; - -static const SFG_StrokeStrip ch64st[] = -{ - {8,ch64st0}, - {19,ch64st1} -}; - -static const SFG_StrokeChar ch64 = {74.3648f,2,ch64st}; - -/* char: 0x41 */ - -static const SFG_StrokeVertex ch65st0[] = -{ - {40.5952f,100.0f}, - {2.5f,0.0f} -}; - -static const SFG_StrokeVertex ch65st1[] = -{ - {40.5952f,100.0f}, - {78.6905f,0.0f} -}; - -static const SFG_StrokeVertex ch65st2[] = -{ - {16.7857f,33.3333f}, - {64.4048f,33.3333f} -}; - -static const SFG_StrokeStrip ch65st[] = -{ - {2,ch65st0}, - {2,ch65st1}, - {2,ch65st2} -}; - -static const SFG_StrokeChar ch65 = {80.4905f,3,ch65st}; - -/* char: 0x42 */ - -static const SFG_StrokeVertex ch66st0[] = -{ - {11.42f,100.0f}, - {11.42f,0.0f} -}; - -static const SFG_StrokeVertex ch66st1[] = -{ - {11.42f,100.0f}, - {54.2771f,100.0f}, - {68.5629f,95.2381f}, - {73.3248f,90.4762f}, - {78.0867f,80.9524f}, - {78.0867f,71.4286f}, - {73.3248f,61.9048f}, - {68.5629f,57.1429f}, - {54.2771f,52.381f} -}; - -static const SFG_StrokeVertex ch66st2[] = -{ - {11.42f,52.381f}, - {54.2771f,52.381f}, - {68.5629f,47.619f}, - {73.3248f,42.8571f}, - {78.0867f,33.3333f}, - {78.0867f,19.0476f}, - {73.3248f,9.5238f}, - {68.5629f,4.7619f}, - {54.2771f,0.0f}, - {11.42f,0.0f} -}; - -static const SFG_StrokeStrip ch66st[] = -{ - {2,ch66st0}, - {9,ch66st1}, - {10,ch66st2} -}; - -static const SFG_StrokeChar ch66 = {83.6267f,3,ch66st}; - -/* char: 0x43 */ - -static const SFG_StrokeVertex ch67st0[] = -{ - {78.0886f,76.1905f}, - {73.3267f,85.7143f}, - {63.8029f,95.2381f}, - {54.279f,100.0f}, - {35.2314f,100.0f}, - {25.7076f,95.2381f}, - {16.1838f,85.7143f}, - {11.4219f,76.1905f}, - {6.66f,61.9048f}, - {6.66f,38.0952f}, - {11.4219f,23.8095f}, - {16.1838f,14.2857f}, - {25.7076f,4.7619f}, - {35.2314f,0.0f}, - {54.279f,0.0f}, - {63.8029f,4.7619f}, - {73.3267f,14.2857f}, - {78.0886f,23.8095f} -}; - -static const SFG_StrokeStrip ch67st[] = -{ - {18,ch67st0} -}; - -static const SFG_StrokeChar ch67 = {84.4886f,1,ch67st}; - -/* char: 0x44 */ - -static const SFG_StrokeVertex ch68st0[] = -{ - {11.96f,100.0f}, - {11.96f,0.0f} -}; - -static const SFG_StrokeVertex ch68st1[] = -{ - {11.96f,100.0f}, - {45.2933f,100.0f}, - {59.579f,95.2381f}, - {69.1029f,85.7143f}, - {73.8648f,76.1905f}, - {78.6267f,61.9048f}, - {78.6267f,38.0952f}, - {73.8648f,23.8095f}, - {69.1029f,14.2857f}, - {59.579f,4.7619f}, - {45.2933f,0.0f}, - {11.96f,0.0f} -}; - -static const SFG_StrokeStrip ch68st[] = -{ - {2,ch68st0}, - {12,ch68st1} -}; - -static const SFG_StrokeChar ch68 = {85.2867f,2,ch68st}; - -/* char: 0x45 */ - -static const SFG_StrokeVertex ch69st0[] = -{ - {11.42f,100.0f}, - {11.42f,0.0f} -}; - -static const SFG_StrokeVertex ch69st1[] = -{ - {11.42f,100.0f}, - {73.3248f,100.0f} -}; - -static const SFG_StrokeVertex ch69st2[] = -{ - {11.42f,52.381f}, - {49.5152f,52.381f} -}; - -static const SFG_StrokeVertex ch69st3[] = -{ - {11.42f,0.0f}, - {73.3248f,0.0f} -}; - -static const SFG_StrokeStrip ch69st[] = -{ - {2,ch69st0}, - {2,ch69st1}, - {2,ch69st2}, - {2,ch69st3} -}; - -static const SFG_StrokeChar ch69 = {78.1848f,4,ch69st}; - -/* char: 0x46 */ - -static const SFG_StrokeVertex ch70st0[] = -{ - {11.42f,100.0f}, - {11.42f,0.0f} -}; - -static const SFG_StrokeVertex ch70st1[] = -{ - {11.42f,100.0f}, - {73.3248f,100.0f} -}; - -static const SFG_StrokeVertex ch70st2[] = -{ - {11.42f,52.381f}, - {49.5152f,52.381f} -}; - -static const SFG_StrokeStrip ch70st[] = -{ - {2,ch70st0}, - {2,ch70st1}, - {2,ch70st2} -}; - -static const SFG_StrokeChar ch70 = {78.7448f,3,ch70st}; - -/* char: 0x47 */ - -static const SFG_StrokeVertex ch71st0[] = -{ - {78.4886f,76.1905f}, - {73.7267f,85.7143f}, - {64.2029f,95.2381f}, - {54.679f,100.0f}, - {35.6314f,100.0f}, - {26.1076f,95.2381f}, - {16.5838f,85.7143f}, - {11.8219f,76.1905f}, - {7.06f,61.9048f}, - {7.06f,38.0952f}, - {11.8219f,23.8095f}, - {16.5838f,14.2857f}, - {26.1076f,4.7619f}, - {35.6314f,0.0f}, - {54.679f,0.0f}, - {64.2029f,4.7619f}, - {73.7267f,14.2857f}, - {78.4886f,23.8095f}, - {78.4886f,38.0952f} -}; - -static const SFG_StrokeVertex ch71st1[] = -{ - {54.679f,38.0952f}, - {78.4886f,38.0952f} -}; - -static const SFG_StrokeStrip ch71st[] = -{ - {19,ch71st0}, - {2,ch71st1} -}; - -static const SFG_StrokeChar ch71 = {89.7686f,2,ch71st}; - -/* char: 0x48 */ - -static const SFG_StrokeVertex ch72st0[] = -{ - {11.42f,100.0f}, - {11.42f,0.0f} -}; - -static const SFG_StrokeVertex ch72st1[] = -{ - {78.0867f,100.0f}, - {78.0867f,0.0f} -}; - -static const SFG_StrokeVertex ch72st2[] = -{ - {11.42f,52.381f}, - {78.0867f,52.381f} -}; - -static const SFG_StrokeStrip ch72st[] = -{ - {2,ch72st0}, - {2,ch72st1}, - {2,ch72st2} -}; - -static const SFG_StrokeChar ch72 = {89.0867f,3,ch72st}; - -/* char: 0x49 */ - -static const SFG_StrokeVertex ch73st0[] = -{ - {10.86f,100.0f}, - {10.86f,0.0f} -}; - -static const SFG_StrokeStrip ch73st[] = -{ - {2,ch73st0} -}; - -static const SFG_StrokeChar ch73 = {21.3f,1,ch73st}; - -/* char: 0x4a */ - -static const SFG_StrokeVertex ch74st0[] = -{ - {50.119f,100.0f}, - {50.119f,23.8095f}, - {45.3571f,9.5238f}, - {40.5952f,4.7619f}, - {31.0714f,0.0f}, - {21.5476f,0.0f}, - {12.0238f,4.7619f}, - {7.2619f,9.5238f}, - {2.5f,23.8095f}, - {2.5f,33.3333f} -}; - -static const SFG_StrokeStrip ch74st[] = -{ - {10,ch74st0} -}; - -static const SFG_StrokeChar ch74 = {59.999f,1,ch74st}; - -/* char: 0x4b */ - -static const SFG_StrokeVertex ch75st0[] = -{ - {11.28f,100.0f}, - {11.28f,0.0f} -}; - -static const SFG_StrokeVertex ch75st1[] = -{ - {77.9467f,100.0f}, - {11.28f,33.3333f} -}; - -static const SFG_StrokeVertex ch75st2[] = -{ - {35.0895f,57.1429f}, - {77.9467f,0.0f} -}; - -static const SFG_StrokeStrip ch75st[] = -{ - {2,ch75st0}, - {2,ch75st1}, - {2,ch75st2} -}; - -static const SFG_StrokeChar ch75 = {79.3267f,3,ch75st}; - -/* char: 0x4c */ - -static const SFG_StrokeVertex ch76st0[] = -{ - {11.68f,100.0f}, - {11.68f,0.0f} -}; - -static const SFG_StrokeVertex ch76st1[] = -{ - {11.68f,0.0f}, - {68.8229f,0.0f} -}; - -static const SFG_StrokeStrip ch76st[] = -{ - {2,ch76st0}, - {2,ch76st1} -}; - -static const SFG_StrokeChar ch76 = {71.3229f,2,ch76st}; - -/* char: 0x4d */ - -static const SFG_StrokeVertex ch77st0[] = -{ - {10.86f,100.0f}, - {10.86f,0.0f} -}; - -static const SFG_StrokeVertex ch77st1[] = -{ - {10.86f,100.0f}, - {48.9552f,0.0f} -}; - -static const SFG_StrokeVertex ch77st2[] = -{ - {87.0505f,100.0f}, - {48.9552f,0.0f} -}; - -static const SFG_StrokeVertex ch77st3[] = -{ - {87.0505f,100.0f}, - {87.0505f,0.0f} -}; - -static const SFG_StrokeStrip ch77st[] = -{ - {2,ch77st0}, - {2,ch77st1}, - {2,ch77st2}, - {2,ch77st3} -}; - -static const SFG_StrokeChar ch77 = {97.2105f,4,ch77st}; - -/* char: 0x4e */ - -static const SFG_StrokeVertex ch78st0[] = -{ - {11.14f,100.0f}, - {11.14f,0.0f} -}; - -static const SFG_StrokeVertex ch78st1[] = -{ - {11.14f,100.0f}, - {77.8067f,0.0f} -}; - -static const SFG_StrokeVertex ch78st2[] = -{ - {77.8067f,100.0f}, - {77.8067f,0.0f} -}; - -static const SFG_StrokeStrip ch78st[] = -{ - {2,ch78st0}, - {2,ch78st1}, - {2,ch78st2} -}; - -static const SFG_StrokeChar ch78 = {88.8067f,3,ch78st}; - -/* char: 0x4f */ - -static const SFG_StrokeVertex ch79st0[] = -{ - {34.8114f,100.0f}, - {25.2876f,95.2381f}, - {15.7638f,85.7143f}, - {11.0019f,76.1905f}, - {6.24f,61.9048f}, - {6.24f,38.0952f}, - {11.0019f,23.8095f}, - {15.7638f,14.2857f}, - {25.2876f,4.7619f}, - {34.8114f,0.0f}, - {53.859f,0.0f}, - {63.3829f,4.7619f}, - {72.9067f,14.2857f}, - {77.6686f,23.8095f}, - {82.4305f,38.0952f}, - {82.4305f,61.9048f}, - {77.6686f,76.1905f}, - {72.9067f,85.7143f}, - {63.3829f,95.2381f}, - {53.859f,100.0f}, - {34.8114f,100.0f} -}; - -static const SFG_StrokeStrip ch79st[] = -{ - {21,ch79st0} -}; - -static const SFG_StrokeChar ch79 = {88.8305f,1,ch79st}; - -/* char: 0x50 */ - -static const SFG_StrokeVertex ch80st0[] = -{ - {12.1f,100.0f}, - {12.1f,0.0f} -}; - -static const SFG_StrokeVertex ch80st1[] = -{ - {12.1f,100.0f}, - {54.9571f,100.0f}, - {69.2429f,95.2381f}, - {74.0048f,90.4762f}, - {78.7667f,80.9524f}, - {78.7667f,66.6667f}, - {74.0048f,57.1429f}, - {69.2429f,52.381f}, - {54.9571f,47.619f}, - {12.1f,47.619f} -}; - -static const SFG_StrokeStrip ch80st[] = -{ - {2,ch80st0}, - {10,ch80st1} -}; - -static const SFG_StrokeChar ch80 = {85.6667f,2,ch80st}; - -/* char: 0x51 */ - -static const SFG_StrokeVertex ch81st0[] = -{ - {33.8714f,100.0f}, - {24.3476f,95.2381f}, - {14.8238f,85.7143f}, - {10.0619f,76.1905f}, - {5.3f,61.9048f}, - {5.3f,38.0952f}, - {10.0619f,23.8095f}, - {14.8238f,14.2857f}, - {24.3476f,4.7619f}, - {33.8714f,0.0f}, - {52.919f,0.0f}, - {62.4429f,4.7619f}, - {71.9667f,14.2857f}, - {76.7286f,23.8095f}, - {81.4905f,38.0952f}, - {81.4905f,61.9048f}, - {76.7286f,76.1905f}, - {71.9667f,85.7143f}, - {62.4429f,95.2381f}, - {52.919f,100.0f}, - {33.8714f,100.0f} -}; - -static const SFG_StrokeVertex ch81st1[] = -{ - {48.1571f,19.0476f}, - {76.7286f,-9.5238f} -}; - -static const SFG_StrokeStrip ch81st[] = -{ - {21,ch81st0}, - {2,ch81st1} -}; - -static const SFG_StrokeChar ch81 = {88.0905f,2,ch81st}; - -/* char: 0x52 */ - -static const SFG_StrokeVertex ch82st0[] = -{ - {11.68f,100.0f}, - {11.68f,0.0f} -}; - -static const SFG_StrokeVertex ch82st1[] = -{ - {11.68f,100.0f}, - {54.5371f,100.0f}, - {68.8229f,95.2381f}, - {73.5848f,90.4762f}, - {78.3467f,80.9524f}, - {78.3467f,71.4286f}, - {73.5848f,61.9048f}, - {68.8229f,57.1429f}, - {54.5371f,52.381f}, - {11.68f,52.381f} -}; - -static const SFG_StrokeVertex ch82st2[] = -{ - {45.0133f,52.381f}, - {78.3467f,0.0f} -}; - -static const SFG_StrokeStrip ch82st[] = -{ - {2,ch82st0}, - {10,ch82st1}, - {2,ch82st2} -}; - -static const SFG_StrokeChar ch82 = {82.3667f,3,ch82st}; - -/* char: 0x53 */ - -static const SFG_StrokeVertex ch83st0[] = -{ - {74.6667f,85.7143f}, - {65.1429f,95.2381f}, - {50.8571f,100.0f}, - {31.8095f,100.0f}, - {17.5238f,95.2381f}, - {8.0f,85.7143f}, - {8.0f,76.1905f}, - {12.7619f,66.6667f}, - {17.5238f,61.9048f}, - {27.0476f,57.1429f}, - {55.619f,47.619f}, - {65.1429f,42.8571f}, - {69.9048f,38.0952f}, - {74.6667f,28.5714f}, - {74.6667f,14.2857f}, - {65.1429f,4.7619f}, - {50.8571f,0.0f}, - {31.8095f,0.0f}, - {17.5238f,4.7619f}, - {8.0f,14.2857f} -}; - -static const SFG_StrokeStrip ch83st[] = -{ - {20,ch83st0} -}; - -static const SFG_StrokeChar ch83 = {80.8267f,1,ch83st}; - -/* char: 0x54 */ - -static const SFG_StrokeVertex ch84st0[] = -{ - {35.6933f,100.0f}, - {35.6933f,0.0f} -}; - -static const SFG_StrokeVertex ch84st1[] = -{ - {2.36f,100.0f}, - {69.0267f,100.0f} -}; - -static const SFG_StrokeStrip ch84st[] = -{ - {2,ch84st0}, - {2,ch84st1} -}; - -static const SFG_StrokeChar ch84 = {71.9467f,2,ch84st}; - -/* char: 0x55 */ - -static const SFG_StrokeVertex ch85st0[] = -{ - {11.54f,100.0f}, - {11.54f,28.5714f}, - {16.3019f,14.2857f}, - {25.8257f,4.7619f}, - {40.1114f,0.0f}, - {49.6352f,0.0f}, - {63.921f,4.7619f}, - {73.4448f,14.2857f}, - {78.2067f,28.5714f}, - {78.2067f,100.0f} -}; - -static const SFG_StrokeStrip ch85st[] = -{ - {10,ch85st0} -}; - -static const SFG_StrokeChar ch85 = {89.4867f,1,ch85st}; - -/* char: 0x56 */ - -static const SFG_StrokeVertex ch86st0[] = -{ - {2.36f,100.0f}, - {40.4552f,0.0f} -}; - -static const SFG_StrokeVertex ch86st1[] = -{ - {78.5505f,100.0f}, - {40.4552f,0.0f} -}; - -static const SFG_StrokeStrip ch86st[] = -{ - {2,ch86st0}, - {2,ch86st1} -}; - -static const SFG_StrokeChar ch86 = {81.6105f,2,ch86st}; - -/* char: 0x57 */ - -static const SFG_StrokeVertex ch87st0[] = -{ - {2.22f,100.0f}, - {26.0295f,0.0f} -}; - -static const SFG_StrokeVertex ch87st1[] = -{ - {49.839f,100.0f}, - {26.0295f,0.0f} -}; - -static const SFG_StrokeVertex ch87st2[] = -{ - {49.839f,100.0f}, - {73.6486f,0.0f} -}; - -static const SFG_StrokeVertex ch87st3[] = -{ - {97.4581f,100.0f}, - {73.6486f,0.0f} -}; - -static const SFG_StrokeStrip ch87st[] = -{ - {2,ch87st0}, - {2,ch87st1}, - {2,ch87st2}, - {2,ch87st3} -}; - -static const SFG_StrokeChar ch87 = {100.518f,4,ch87st}; - -/* char: 0x58 */ - -static const SFG_StrokeVertex ch88st0[] = -{ - {2.5f,100.0f}, - {69.1667f,0.0f} -}; - -static const SFG_StrokeVertex ch88st1[] = -{ - {69.1667f,100.0f}, - {2.5f,0.0f} -}; - -static const SFG_StrokeStrip ch88st[] = -{ - {2,ch88st0}, - {2,ch88st1} -}; - -static const SFG_StrokeChar ch88 = {72.3667f,2,ch88st}; - -/* char: 0x59 */ - -static const SFG_StrokeVertex ch89st0[] = -{ - {1.52f,100.0f}, - {39.6152f,52.381f}, - {39.6152f,0.0f} -}; - -static const SFG_StrokeVertex ch89st1[] = -{ - {77.7105f,100.0f}, - {39.6152f,52.381f} -}; - -static const SFG_StrokeStrip ch89st[] = -{ - {3,ch89st0}, - {2,ch89st1} -}; - -static const SFG_StrokeChar ch89 = {79.6505f,2,ch89st}; - -/* char: 0x5a */ - -static const SFG_StrokeVertex ch90st0[] = -{ - {69.1667f,100.0f}, - {2.5f,0.0f} -}; - -static const SFG_StrokeVertex ch90st1[] = -{ - {2.5f,100.0f}, - {69.1667f,100.0f} -}; - -static const SFG_StrokeVertex ch90st2[] = -{ - {2.5f,0.0f}, - {69.1667f,0.0f} -}; - -static const SFG_StrokeStrip ch90st[] = -{ - {2,ch90st0}, - {2,ch90st1}, - {2,ch90st2} -}; - -static const SFG_StrokeChar ch90 = {73.7467f,3,ch90st}; - -/* char: 0x5b */ - -static const SFG_StrokeVertex ch91st0[] = -{ - {7.78f,119.048f}, - {7.78f,-33.3333f} -}; - -static const SFG_StrokeVertex ch91st1[] = -{ - {12.5419f,119.048f}, - {12.5419f,-33.3333f} -}; - -static const SFG_StrokeVertex ch91st2[] = -{ - {7.78f,119.048f}, - {41.1133f,119.048f} -}; - -static const SFG_StrokeVertex ch91st3[] = -{ - {7.78f,-33.3333f}, - {41.1133f,-33.3333f} -}; - -static const SFG_StrokeStrip ch91st[] = -{ - {2,ch91st0}, - {2,ch91st1}, - {2,ch91st2}, - {2,ch91st3} -}; - -static const SFG_StrokeChar ch91 = {46.1133f,4,ch91st}; - -/* char: 0x5c */ - -static const SFG_StrokeVertex ch92st0[] = -{ - {5.84f,100.0f}, - {72.5067f,-14.2857f} -}; - -static const SFG_StrokeStrip ch92st[] = -{ - {2,ch92st0} -}; - -static const SFG_StrokeChar ch92 = {78.2067f,1,ch92st}; - -/* char: 0x5d */ - -static const SFG_StrokeVertex ch93st0[] = -{ - {33.0114f,119.048f}, - {33.0114f,-33.3333f} -}; - -static const SFG_StrokeVertex ch93st1[] = -{ - {37.7733f,119.048f}, - {37.7733f,-33.3333f} -}; - -static const SFG_StrokeVertex ch93st2[] = -{ - {4.44f,119.048f}, - {37.7733f,119.048f} -}; - -static const SFG_StrokeVertex ch93st3[] = -{ - {4.44f,-33.3333f}, - {37.7733f,-33.3333f} -}; - -static const SFG_StrokeStrip ch93st[] = -{ - {2,ch93st0}, - {2,ch93st1}, - {2,ch93st2}, - {2,ch93st3} -}; - -static const SFG_StrokeChar ch93 = {46.3933f,4,ch93st}; - -/* char: 0x5e */ - -static const SFG_StrokeVertex ch94st0[] = -{ - {44.0752f,109.524f}, - {5.98f,42.8571f} -}; - -static const SFG_StrokeVertex ch94st1[] = -{ - {44.0752f,109.524f}, - {82.1705f,42.8571f} -}; - -static const SFG_StrokeStrip ch94st[] = -{ - {2,ch94st0}, - {2,ch94st1} -}; - -static const SFG_StrokeChar ch94 = {90.2305f,2,ch94st}; - -/* char: 0x5f */ - -static const SFG_StrokeVertex ch95st0[] = -{ - {-1.1f,-33.3333f}, - {103.662f,-33.3333f}, - {103.662f,-28.5714f}, - {-1.1f,-28.5714f}, - {-1.1f,-33.3333f} -}; - -static const SFG_StrokeStrip ch95st[] = -{ - {5,ch95st0} -}; - -static const SFG_StrokeChar ch95 = {104.062f,1,ch95st}; - -/* char: 0x60 */ - -static const SFG_StrokeVertex ch96st0[] = -{ - {33.0219f,100.0f}, - {56.8314f,71.4286f} -}; - -static const SFG_StrokeVertex ch96st1[] = -{ - {33.0219f,100.0f}, - {28.26f,95.2381f}, - {56.8314f,71.4286f} -}; - -static const SFG_StrokeStrip ch96st[] = -{ - {2,ch96st0}, - {3,ch96st1} -}; - -static const SFG_StrokeChar ch96 = {83.5714f,2,ch96st}; - -/* char: 0x61 */ - -static const SFG_StrokeVertex ch97st0[] = -{ - {63.8229f,66.6667f}, - {63.8229f,0.0f} -}; - -static const SFG_StrokeVertex ch97st1[] = -{ - {63.8229f,52.381f}, - {54.299f,61.9048f}, - {44.7752f,66.6667f}, - {30.4895f,66.6667f}, - {20.9657f,61.9048f}, - {11.4419f,52.381f}, - {6.68f,38.0952f}, - {6.68f,28.5714f}, - {11.4419f,14.2857f}, - {20.9657f,4.7619f}, - {30.4895f,0.0f}, - {44.7752f,0.0f}, - {54.299f,4.7619f}, - {63.8229f,14.2857f} -}; - -static const SFG_StrokeStrip ch97st[] = -{ - {2,ch97st0}, - {14,ch97st1} -}; - -static const SFG_StrokeChar ch97 = {66.6029f,2,ch97st}; - -/* char: 0x62 */ - -static const SFG_StrokeVertex ch98st0[] = -{ - {8.76f,100.0f}, - {8.76f,0.0f} -}; - -static const SFG_StrokeVertex ch98st1[] = -{ - {8.76f,52.381f}, - {18.2838f,61.9048f}, - {27.8076f,66.6667f}, - {42.0933f,66.6667f}, - {51.6171f,61.9048f}, - {61.141f,52.381f}, - {65.9029f,38.0952f}, - {65.9029f,28.5714f}, - {61.141f,14.2857f}, - {51.6171f,4.7619f}, - {42.0933f,0.0f}, - {27.8076f,0.0f}, - {18.2838f,4.7619f}, - {8.76f,14.2857f} -}; - -static const SFG_StrokeStrip ch98st[] = -{ - {2,ch98st0}, - {14,ch98st1} -}; - -static const SFG_StrokeChar ch98 = {70.4629f,2,ch98st}; - -/* char: 0x63 */ - -static const SFG_StrokeVertex ch99st0[] = -{ - {62.6629f,52.381f}, - {53.139f,61.9048f}, - {43.6152f,66.6667f}, - {29.3295f,66.6667f}, - {19.8057f,61.9048f}, - {10.2819f,52.381f}, - {5.52f,38.0952f}, - {5.52f,28.5714f}, - {10.2819f,14.2857f}, - {19.8057f,4.7619f}, - {29.3295f,0.0f}, - {43.6152f,0.0f}, - {53.139f,4.7619f}, - {62.6629f,14.2857f} -}; - -static const SFG_StrokeStrip ch99st[] = -{ - {14,ch99st0} -}; - -static const SFG_StrokeChar ch99 = {68.9229f,1,ch99st}; - -/* char: 0x64 */ - -static const SFG_StrokeVertex ch100st0[] = -{ - {61.7829f,100.0f}, - {61.7829f,0.0f} -}; - -static const SFG_StrokeVertex ch100st1[] = -{ - {61.7829f,52.381f}, - {52.259f,61.9048f}, - {42.7352f,66.6667f}, - {28.4495f,66.6667f}, - {18.9257f,61.9048f}, - {9.4019f,52.381f}, - {4.64f,38.0952f}, - {4.64f,28.5714f}, - {9.4019f,14.2857f}, - {18.9257f,4.7619f}, - {28.4495f,0.0f}, - {42.7352f,0.0f}, - {52.259f,4.7619f}, - {61.7829f,14.2857f} -}; - -static const SFG_StrokeStrip ch100st[] = -{ - {2,ch100st0}, - {14,ch100st1} -}; - -static const SFG_StrokeChar ch100 = {70.2629f,2,ch100st}; - -/* char: 0x65 */ - -static const SFG_StrokeVertex ch101st0[] = -{ - {5.72f,38.0952f}, - {62.8629f,38.0952f}, - {62.8629f,47.619f}, - {58.101f,57.1429f}, - {53.339f,61.9048f}, - {43.8152f,66.6667f}, - {29.5295f,66.6667f}, - {20.0057f,61.9048f}, - {10.4819f,52.381f}, - {5.72f,38.0952f}, - {5.72f,28.5714f}, - {10.4819f,14.2857f}, - {20.0057f,4.7619f}, - {29.5295f,0.0f}, - {43.8152f,0.0f}, - {53.339f,4.7619f}, - {62.8629f,14.2857f} -}; - -static const SFG_StrokeStrip ch101st[] = -{ - {17,ch101st0} -}; - -static const SFG_StrokeChar ch101 = {68.5229f,1,ch101st}; - -/* char: 0x66 */ - -static const SFG_StrokeVertex ch102st0[] = -{ - {38.7752f,100.0f}, - {29.2514f,100.0f}, - {19.7276f,95.2381f}, - {14.9657f,80.9524f}, - {14.9657f,0.0f} -}; - -static const SFG_StrokeVertex ch102st1[] = -{ - {0.68f,66.6667f}, - {34.0133f,66.6667f} -}; - -static const SFG_StrokeStrip ch102st[] = -{ - {5,ch102st0}, - {2,ch102st1} -}; - -static const SFG_StrokeChar ch102 = {38.6552f,2,ch102st}; - -/* char: 0x67 */ - -static const SFG_StrokeVertex ch103st0[] = -{ - {62.5029f,66.6667f}, - {62.5029f,-9.5238f}, - {57.741f,-23.8095f}, - {52.979f,-28.5714f}, - {43.4552f,-33.3333f}, - {29.1695f,-33.3333f}, - {19.6457f,-28.5714f} -}; - -static const SFG_StrokeVertex ch103st1[] = -{ - {62.5029f,52.381f}, - {52.979f,61.9048f}, - {43.4552f,66.6667f}, - {29.1695f,66.6667f}, - {19.6457f,61.9048f}, - {10.1219f,52.381f}, - {5.36f,38.0952f}, - {5.36f,28.5714f}, - {10.1219f,14.2857f}, - {19.6457f,4.7619f}, - {29.1695f,0.0f}, - {43.4552f,0.0f}, - {52.979f,4.7619f}, - {62.5029f,14.2857f} -}; - -static const SFG_StrokeStrip ch103st[] = -{ - {7,ch103st0}, - {14,ch103st1} -}; - -static const SFG_StrokeChar ch103 = {70.9829f,2,ch103st}; - -/* char: 0x68 */ - -static const SFG_StrokeVertex ch104st0[] = -{ - {9.6f,100.0f}, - {9.6f,0.0f} -}; - -static const SFG_StrokeVertex ch104st1[] = -{ - {9.6f,47.619f}, - {23.8857f,61.9048f}, - {33.4095f,66.6667f}, - {47.6952f,66.6667f}, - {57.219f,61.9048f}, - {61.981f,47.619f}, - {61.981f,0.0f} -}; - -static const SFG_StrokeStrip ch104st[] = -{ - {2,ch104st0}, - {7,ch104st1} -}; - -static const SFG_StrokeChar ch104 = {71.021f,2,ch104st}; - -/* char: 0x69 */ - -static const SFG_StrokeVertex ch105st0[] = -{ - {10.02f,100.0f}, - {14.7819f,95.2381f}, - {19.5438f,100.0f}, - {14.7819f,104.762f}, - {10.02f,100.0f} -}; - -static const SFG_StrokeVertex ch105st1[] = -{ - {14.7819f,66.6667f}, - {14.7819f,0.0f} -}; - -static const SFG_StrokeStrip ch105st[] = -{ - {5,ch105st0}, - {2,ch105st1} -}; - -static const SFG_StrokeChar ch105 = {28.8638f,2,ch105st}; - -/* char: 0x6a */ - -static const SFG_StrokeVertex ch106st0[] = -{ - {17.3876f,100.0f}, - {22.1495f,95.2381f}, - {26.9114f,100.0f}, - {22.1495f,104.762f}, - {17.3876f,100.0f} -}; - -static const SFG_StrokeVertex ch106st1[] = -{ - {22.1495f,66.6667f}, - {22.1495f,-14.2857f}, - {17.3876f,-28.5714f}, - {7.8638f,-33.3333f}, - {-1.66f,-33.3333f} -}; - -static const SFG_StrokeStrip ch106st[] = -{ - {5,ch106st0}, - {5,ch106st1} -}; - -static const SFG_StrokeChar ch106 = {36.2314f,2,ch106st}; - -/* char: 0x6b */ - -static const SFG_StrokeVertex ch107st0[] = -{ - {9.6f,100.0f}, - {9.6f,0.0f} -}; - -static const SFG_StrokeVertex ch107st1[] = -{ - {57.219f,66.6667f}, - {9.6f,19.0476f} -}; - -static const SFG_StrokeVertex ch107st2[] = -{ - {28.6476f,38.0952f}, - {61.981f,0.0f} -}; - -static const SFG_StrokeStrip ch107st[] = -{ - {2,ch107st0}, - {2,ch107st1}, - {2,ch107st2} -}; - -static const SFG_StrokeChar ch107 = {62.521f,3,ch107st}; - -/* char: 0x6c */ - -static const SFG_StrokeVertex ch108st0[] = -{ - {10.02f,100.0f}, - {10.02f,0.0f} -}; - -static const SFG_StrokeStrip ch108st[] = -{ - {2,ch108st0} -}; - -static const SFG_StrokeChar ch108 = {19.34f,1,ch108st}; - -/* char: 0x6d */ - -static const SFG_StrokeVertex ch109st0[] = -{ - {9.6f,66.6667f}, - {9.6f,0.0f} -}; - -static const SFG_StrokeVertex ch109st1[] = -{ - {9.6f,47.619f}, - {23.8857f,61.9048f}, - {33.4095f,66.6667f}, - {47.6952f,66.6667f}, - {57.219f,61.9048f}, - {61.981f,47.619f}, - {61.981f,0.0f} -}; - -static const SFG_StrokeVertex ch109st2[] = -{ - {61.981f,47.619f}, - {76.2667f,61.9048f}, - {85.7905f,66.6667f}, - {100.076f,66.6667f}, - {109.6f,61.9048f}, - {114.362f,47.619f}, - {114.362f,0.0f} -}; - -static const SFG_StrokeStrip ch109st[] = -{ - {2,ch109st0}, - {7,ch109st1}, - {7,ch109st2} -}; - -static const SFG_StrokeChar ch109 = {123.962f,3,ch109st}; - -/* char: 0x6e */ - -static const SFG_StrokeVertex ch110st0[] = -{ - {9.18f,66.6667f}, - {9.18f,0.0f} -}; - -static const SFG_StrokeVertex ch110st1[] = -{ - {9.18f,47.619f}, - {23.4657f,61.9048f}, - {32.9895f,66.6667f}, - {47.2752f,66.6667f}, - {56.799f,61.9048f}, - {61.561f,47.619f}, - {61.561f,0.0f} -}; - -static const SFG_StrokeStrip ch110st[] = -{ - {2,ch110st0}, - {7,ch110st1} -}; - -static const SFG_StrokeChar ch110 = {70.881f,2,ch110st}; - -/* char: 0x6f */ - -static const SFG_StrokeVertex ch111st0[] = -{ - {28.7895f,66.6667f}, - {19.2657f,61.9048f}, - {9.7419f,52.381f}, - {4.98f,38.0952f}, - {4.98f,28.5714f}, - {9.7419f,14.2857f}, - {19.2657f,4.7619f}, - {28.7895f,0.0f}, - {43.0752f,0.0f}, - {52.599f,4.7619f}, - {62.1229f,14.2857f}, - {66.8848f,28.5714f}, - {66.8848f,38.0952f}, - {62.1229f,52.381f}, - {52.599f,61.9048f}, - {43.0752f,66.6667f}, - {28.7895f,66.6667f} -}; - -static const SFG_StrokeStrip ch111st[] = -{ - {17,ch111st0} -}; - -static const SFG_StrokeChar ch111 = {71.7448f,1,ch111st}; - -/* char: 0x70 */ - -static const SFG_StrokeVertex ch112st0[] = -{ - {9.46f,66.6667f}, - {9.46f,-33.3333f} -}; - -static const SFG_StrokeVertex ch112st1[] = -{ - {9.46f,52.381f}, - {18.9838f,61.9048f}, - {28.5076f,66.6667f}, - {42.7933f,66.6667f}, - {52.3171f,61.9048f}, - {61.841f,52.381f}, - {66.6029f,38.0952f}, - {66.6029f,28.5714f}, - {61.841f,14.2857f}, - {52.3171f,4.7619f}, - {42.7933f,0.0f}, - {28.5076f,0.0f}, - {18.9838f,4.7619f}, - {9.46f,14.2857f} -}; - -static const SFG_StrokeStrip ch112st[] = -{ - {2,ch112st0}, - {14,ch112st1} -}; - -static const SFG_StrokeChar ch112 = {70.8029f,2,ch112st}; - -/* char: 0x71 */ - -static const SFG_StrokeVertex ch113st0[] = -{ - {61.9829f,66.6667f}, - {61.9829f,-33.3333f} -}; - -static const SFG_StrokeVertex ch113st1[] = -{ - {61.9829f,52.381f}, - {52.459f,61.9048f}, - {42.9352f,66.6667f}, - {28.6495f,66.6667f}, - {19.1257f,61.9048f}, - {9.6019f,52.381f}, - {4.84f,38.0952f}, - {4.84f,28.5714f}, - {9.6019f,14.2857f}, - {19.1257f,4.7619f}, - {28.6495f,0.0f}, - {42.9352f,0.0f}, - {52.459f,4.7619f}, - {61.9829f,14.2857f} -}; - -static const SFG_StrokeStrip ch113st[] = -{ - {2,ch113st0}, - {14,ch113st1} -}; - -static const SFG_StrokeChar ch113 = {70.7429f,2,ch113st}; - -/* char: 0x72 */ - -static const SFG_StrokeVertex ch114st0[] = -{ - {9.46f,66.6667f}, - {9.46f,0.0f} -}; - -static const SFG_StrokeVertex ch114st1[] = -{ - {9.46f,38.0952f}, - {14.2219f,52.381f}, - {23.7457f,61.9048f}, - {33.2695f,66.6667f}, - {47.5552f,66.6667f} -}; - -static const SFG_StrokeStrip ch114st[] = -{ - {2,ch114st0}, - {5,ch114st1} -}; - -static const SFG_StrokeChar ch114 = {49.4952f,2,ch114st}; - -/* char: 0x73 */ - -static const SFG_StrokeVertex ch115st0[] = -{ - {57.081f,52.381f}, - {52.319f,61.9048f}, - {38.0333f,66.6667f}, - {23.7476f,66.6667f}, - {9.4619f,61.9048f}, - {4.7f,52.381f}, - {9.4619f,42.8571f}, - {18.9857f,38.0952f}, - {42.7952f,33.3333f}, - {52.319f,28.5714f}, - {57.081f,19.0476f}, - {57.081f,14.2857f}, - {52.319f,4.7619f}, - {38.0333f,0.0f}, - {23.7476f,0.0f}, - {9.4619f,4.7619f}, - {4.7f,14.2857f} -}; - -static const SFG_StrokeStrip ch115st[] = -{ - {17,ch115st0} -}; - -static const SFG_StrokeChar ch115 = {62.321f,1,ch115st}; - -/* char: 0x74 */ - -static const SFG_StrokeVertex ch116st0[] = -{ - {14.8257f,100.0f}, - {14.8257f,19.0476f}, - {19.5876f,4.7619f}, - {29.1114f,0.0f}, - {38.6352f,0.0f} -}; - -static const SFG_StrokeVertex ch116st1[] = -{ - {0.54f,66.6667f}, - {33.8733f,66.6667f} -}; - -static const SFG_StrokeStrip ch116st[] = -{ - {5,ch116st0}, - {2,ch116st1} -}; - -static const SFG_StrokeChar ch116 = {39.3152f,2,ch116st}; - -/* char: 0x75 */ - -static const SFG_StrokeVertex ch117st0[] = -{ - {9.46f,66.6667f}, - {9.46f,19.0476f}, - {14.2219f,4.7619f}, - {23.7457f,0.0f}, - {38.0314f,0.0f}, - {47.5552f,4.7619f}, - {61.841f,19.0476f} -}; - -static const SFG_StrokeVertex ch117st1[] = -{ - {61.841f,66.6667f}, - {61.841f,0.0f} -}; - -static const SFG_StrokeStrip ch117st[] = -{ - {7,ch117st0}, - {2,ch117st1} -}; - -static const SFG_StrokeChar ch117 = {71.161f,2,ch117st}; - -/* char: 0x76 */ - -static const SFG_StrokeVertex ch118st0[] = -{ - {1.8f,66.6667f}, - {30.3714f,0.0f} -}; - -static const SFG_StrokeVertex ch118st1[] = -{ - {58.9429f,66.6667f}, - {30.3714f,0.0f} -}; - -static const SFG_StrokeStrip ch118st[] = -{ - {2,ch118st0}, - {2,ch118st1} -}; - -static const SFG_StrokeChar ch118 = {60.6029f,2,ch118st}; - -/* char: 0x77 */ - -static const SFG_StrokeVertex ch119st0[] = -{ - {2.5f,66.6667f}, - {21.5476f,0.0f} -}; - -static const SFG_StrokeVertex ch119st1[] = -{ - {40.5952f,66.6667f}, - {21.5476f,0.0f} -}; - -static const SFG_StrokeVertex ch119st2[] = -{ - {40.5952f,66.6667f}, - {59.6429f,0.0f} -}; - -static const SFG_StrokeVertex ch119st3[] = -{ - {78.6905f,66.6667f}, - {59.6429f,0.0f} -}; - -static const SFG_StrokeStrip ch119st[] = -{ - {2,ch119st0}, - {2,ch119st1}, - {2,ch119st2}, - {2,ch119st3} -}; - -static const SFG_StrokeChar ch119 = {80.4905f,4,ch119st}; - -/* char: 0x78 */ - -static const SFG_StrokeVertex ch120st0[] = -{ - {1.66f,66.6667f}, - {54.041f,0.0f} -}; - -static const SFG_StrokeVertex ch120st1[] = -{ - {54.041f,66.6667f}, - {1.66f,0.0f} -}; - -static const SFG_StrokeStrip ch120st[] = -{ - {2,ch120st0}, - {2,ch120st1} -}; - -static const SFG_StrokeChar ch120 = {56.401f,2,ch120st}; - -/* char: 0x79 */ - -static const SFG_StrokeVertex ch121st0[] = -{ - {6.5619f,66.6667f}, - {35.1333f,0.0f} -}; - -static const SFG_StrokeVertex ch121st1[] = -{ - {63.7048f,66.6667f}, - {35.1333f,0.0f}, - {25.6095f,-19.0476f}, - {16.0857f,-28.5714f}, - {6.5619f,-33.3333f}, - {1.8f,-33.3333f} -}; - -static const SFG_StrokeStrip ch121st[] = -{ - {2,ch121st0}, - {6,ch121st1} -}; - -static const SFG_StrokeChar ch121 = {66.0648f,2,ch121st}; - -/* char: 0x7a */ - -static const SFG_StrokeVertex ch122st0[] = -{ - {56.821f,66.6667f}, - {4.44f,0.0f} -}; - -static const SFG_StrokeVertex ch122st1[] = -{ - {4.44f,66.6667f}, - {56.821f,66.6667f} -}; - -static const SFG_StrokeVertex ch122st2[] = -{ - {4.44f,0.0f}, - {56.821f,0.0f} -}; - -static const SFG_StrokeStrip ch122st[] = -{ - {2,ch122st0}, - {2,ch122st1}, - {2,ch122st2} -}; - -static const SFG_StrokeChar ch122 = {61.821f,3,ch122st}; - -/* char: 0x7b */ - -static const SFG_StrokeVertex ch123st0[] = -{ - {31.1895f,119.048f}, - {21.6657f,114.286f}, - {16.9038f,109.524f}, - {12.1419f,100.0f}, - {12.1419f,90.4762f}, - {16.9038f,80.9524f}, - {21.6657f,76.1905f}, - {26.4276f,66.6667f}, - {26.4276f,57.1429f}, - {16.9038f,47.619f} -}; - -static const SFG_StrokeVertex ch123st1[] = -{ - {21.6657f,114.286f}, - {16.9038f,104.762f}, - {16.9038f,95.2381f}, - {21.6657f,85.7143f}, - {26.4276f,80.9524f}, - {31.1895f,71.4286f}, - {31.1895f,61.9048f}, - {26.4276f,52.381f}, - {7.38f,42.8571f}, - {26.4276f,33.3333f}, - {31.1895f,23.8095f}, - {31.1895f,14.2857f}, - {26.4276f,4.7619f}, - {21.6657f,0.0f}, - {16.9038f,-9.5238f}, - {16.9038f,-19.0476f}, - {21.6657f,-28.5714f} -}; - -static const SFG_StrokeVertex ch123st2[] = -{ - {16.9038f,38.0952f}, - {26.4276f,28.5714f}, - {26.4276f,19.0476f}, - {21.6657f,9.5238f}, - {16.9038f,4.7619f}, - {12.1419f,-4.7619f}, - {12.1419f,-14.2857f}, - {16.9038f,-23.8095f}, - {21.6657f,-28.5714f}, - {31.1895f,-33.3333f} -}; - -static const SFG_StrokeStrip ch123st[] = -{ - {10,ch123st0}, - {17,ch123st1}, - {10,ch123st2} -}; - -static const SFG_StrokeChar ch123 = {41.6295f,3,ch123st}; - -/* char: 0x7c */ - -static const SFG_StrokeVertex ch124st0[] = -{ - {11.54f,119.048f}, - {11.54f,-33.3333f} -}; - -static const SFG_StrokeStrip ch124st[] = -{ - {2,ch124st0} -}; - -static const SFG_StrokeChar ch124 = {23.78f,1,ch124st}; - -/* char: 0x7d */ - -static const SFG_StrokeVertex ch125st0[] = -{ - {9.18f,119.048f}, - {18.7038f,114.286f}, - {23.4657f,109.524f}, - {28.2276f,100.0f}, - {28.2276f,90.4762f}, - {23.4657f,80.9524f}, - {18.7038f,76.1905f}, - {13.9419f,66.6667f}, - {13.9419f,57.1429f}, - {23.4657f,47.619f} -}; - -static const SFG_StrokeVertex ch125st1[] = -{ - {18.7038f,114.286f}, - {23.4657f,104.762f}, - {23.4657f,95.2381f}, - {18.7038f,85.7143f}, - {13.9419f,80.9524f}, - {9.18f,71.4286f}, - {9.18f,61.9048f}, - {13.9419f,52.381f}, - {32.9895f,42.8571f}, - {13.9419f,33.3333f}, - {9.18f,23.8095f}, - {9.18f,14.2857f}, - {13.9419f,4.7619f}, - {18.7038f,0.0f}, - {23.4657f,-9.5238f}, - {23.4657f,-19.0476f}, - {18.7038f,-28.5714f} -}; - -static const SFG_StrokeVertex ch125st2[] = -{ - {23.4657f,38.0952f}, - {13.9419f,28.5714f}, - {13.9419f,19.0476f}, - {18.7038f,9.5238f}, - {23.4657f,4.7619f}, - {28.2276f,-4.7619f}, - {28.2276f,-14.2857f}, - {23.4657f,-23.8095f}, - {18.7038f,-28.5714f}, - {9.18f,-33.3333f} -}; - -static const SFG_StrokeStrip ch125st[] = -{ - {10,ch125st0}, - {17,ch125st1}, - {10,ch125st2} -}; - -static const SFG_StrokeChar ch125 = {41.4695f,3,ch125st}; - -/* char: 0x7e */ - -static const SFG_StrokeVertex ch126st0[] = -{ - {2.92f,28.5714f}, - {2.92f,38.0952f}, - {7.6819f,52.381f}, - {17.2057f,57.1429f}, - {26.7295f,57.1429f}, - {36.2533f,52.381f}, - {55.301f,38.0952f}, - {64.8248f,33.3333f}, - {74.3486f,33.3333f}, - {83.8724f,38.0952f}, - {88.6343f,47.619f} -}; - -static const SFG_StrokeVertex ch126st1[] = -{ - {2.92f,38.0952f}, - {7.6819f,47.619f}, - {17.2057f,52.381f}, - {26.7295f,52.381f}, - {36.2533f,47.619f}, - {55.301f,33.3333f}, - {64.8248f,28.5714f}, - {74.3486f,28.5714f}, - {83.8724f,33.3333f}, - {88.6343f,47.619f}, - {88.6343f,57.1429f} -}; - -static const SFG_StrokeStrip ch126st[] = -{ - {11,ch126st0}, - {11,ch126st1} -}; - -static const SFG_StrokeChar ch126 = {91.2743f,2,ch126st}; - -/* char: 0x7f */ - -static const SFG_StrokeVertex ch127st0[] = -{ - {52.381f,100.0f}, - {14.2857f,-33.3333f} -}; - -static const SFG_StrokeVertex ch127st1[] = -{ - {28.5714f,66.6667f}, - {14.2857f,61.9048f}, - {4.7619f,52.381f}, - {0.0f,38.0952f}, - {0.0f,23.8095f}, - {4.7619f,14.2857f}, - {14.2857f,4.7619f}, - {28.5714f,0.0f}, - {38.0952f,0.0f}, - {52.381f,4.7619f}, - {61.9048f,14.2857f}, - {66.6667f,28.5714f}, - {66.6667f,42.8571f}, - {61.9048f,52.381f}, - {52.381f,61.9048f}, - {38.0952f,66.6667f}, - {28.5714f,66.6667f} -}; - -static const SFG_StrokeStrip ch127st[] = -{ - {2,ch127st0}, - {17,ch127st1} -}; - -static const SFG_StrokeChar ch127 = {66.6667f,2,ch127st}; - -static const SFG_StrokeChar *chars[] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39, - &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47, - &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55, - &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63, - &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71, - &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79, - &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87, - &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95, - &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103, - &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111, - &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119, - &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127 -}; - -const SFG_StrokeFont fgStrokeRoman = {"Roman",128,152.381f,chars}; diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_structure.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_structure.c deleted file mode 100644 index e092429d7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_structure.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * freeglut_structure.c - * - * Windows and menus need tree structure - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Sat Dec 18 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* -- GLOBAL EXPORTS ------------------------------------------------------- */ - -/* - * The SFG_Structure container holds information about windows and menus - * created between glutInit() and glutMainLoop() return. - */ - -SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */ - { NULL, NULL }, /* The list of menus */ - { NULL, NULL }, /* Windows to Destroy list */ - NULL, /* The current window */ - NULL, /* The current menu */ - NULL, /* The menu OpenGL context */ - NULL, /* The game mode window */ - 0, /* The current new window ID */ - 0 }; /* The current new menu ID */ - - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - -static void fghClearCallBacks( SFG_Window *window ) -{ - if( window ) - { - int i; - for( i = 0; i < TOTAL_CALLBACKS; ++i ) - window->CallBacks[ i ] = NULL; - } -} - -/* - * This private function creates, opens and adds to the hierarchy - * a freeglut window complete with OpenGL context and stuff... - * - * If parent is set to NULL, the window created will be a topmost one. - */ -SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, - GLboolean positionUse, int x, int y, - GLboolean sizeUse, int w, int h, - GLboolean gameMode, GLboolean isMenu ) -{ - /* Have the window object created */ - SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 ); - -#if TARGET_HOST_UNIX_X11 - window->Window.FBConfig = NULL; -#endif - fghClearCallBacks( window ); - - /* Initialize the object properties */ - window->ID = ++fgStructure.WindowID; - window->State.OldHeight = window->State.OldWidth = -1; - - fgListInit( &window->Children ); - if( parent ) - { - fgListAppend( &parent->Children, &window->Node ); - window->Parent = parent; - } - else - fgListAppend( &fgStructure.Windows, &window->Node ); - - /* Set the default mouse cursor and reset the modifiers value */ - window->State.Cursor = GLUT_CURSOR_INHERIT; - - window->IsMenu = isMenu; - - window->State.IgnoreKeyRepeat = GL_FALSE; - window->State.KeyRepeating = GL_FALSE; - window->State.IsFullscreen = GL_FALSE; - - /* - * Open the window now. The fgOpenWindow() function is system - * dependant, and resides in freeglut_window.c. Uses fgState. - */ - fgOpenWindow( window, title, positionUse, x, y, sizeUse, w, h, gameMode, - (GLboolean)(parent ? GL_TRUE : GL_FALSE) ); - - return window; -} - -/* - * This private function creates a menu and adds it to the menus list - */ -SFG_Menu* fgCreateMenu( FGCBMenu menuCallback ) -{ - int x = 100, y = 100, w = 100, h = 100; - SFG_Window *current_window = fgStructure.CurrentWindow; - - /* Have the menu object created */ - SFG_Menu* menu = (SFG_Menu *)calloc( sizeof(SFG_Menu), 1 ); - - menu->ParentWindow = NULL; - - /* Create a window for the menu to reside in. */ - - fgCreateWindow( NULL, "freeglut menu", GL_TRUE, x, y, GL_TRUE, w, h, - GL_FALSE, GL_TRUE ); - menu->Window = fgStructure.CurrentWindow; - glutDisplayFunc( fgDisplayMenu ); - - glutHideWindow( ); /* Hide the window for now */ - fgSetWindow( current_window ); - - /* Initialize the object properties: */ - menu->ID = ++fgStructure.MenuID; - menu->Callback = menuCallback; - menu->ActiveEntry = NULL; - - fgListInit( &menu->Entries ); - fgListAppend( &fgStructure.Menus, &menu->Node ); - - /* Newly created menus implicitly become current ones */ - fgStructure.CurrentMenu = menu; - - return menu; -} - -/* - * Function to add a window to the linked list of windows to destroy. - * Subwindows are automatically added because they hang from the window - * structure. - */ -void fgAddToWindowDestroyList( SFG_Window* window ) -{ - SFG_WindowList *new_list_entry = - ( SFG_WindowList* )malloc( sizeof(SFG_WindowList ) ); - new_list_entry->window = window; - fgListAppend( &fgStructure.WindowsToDestroy, &new_list_entry->node ); - - /* Check if the window is the current one... */ - if( fgStructure.CurrentWindow == window ) - fgStructure.CurrentWindow = NULL; - - /* - * Clear all window callbacks except Destroy, which will - * be invoked later. Right now, we are potentially carrying - * out a freeglut operation at the behest of a client callback, - * so we are reluctant to re-enter the client with the Destroy - * callback, right now. The others are all wiped out, however, - * to ensure that they are no longer called after this point. - */ - { - FGCBDestroy destroy = (FGCBDestroy)FETCH_WCB( *window, Destroy ); - fghClearCallBacks( window ); - SET_WCB( *window, Destroy, destroy ); - } -} - -/* - * Function to close down all the windows in the "WindowsToDestroy" list - */ -void fgCloseWindows( ) -{ - while( fgStructure.WindowsToDestroy.First ) - { - SFG_WindowList *window_ptr = fgStructure.WindowsToDestroy.First; - fgDestroyWindow( window_ptr->window ); - fgListRemove( &fgStructure.WindowsToDestroy, &window_ptr->node ); - free( window_ptr ); - } -} - -/* - * This function destroys a window and all of its subwindows. Actually, - * another function, defined in freeglut_window.c is called, but this is - * a whole different story... - */ -void fgDestroyWindow( SFG_Window* window ) -{ - FREEGLUT_INTERNAL_ERROR_EXIT ( window, "Window destroy function called with null window", - "fgDestroyWindow" ); - - while( window->Children.First ) - fgDestroyWindow( ( SFG_Window * )window->Children.First ); - - { - SFG_Window *activeWindow = fgStructure.CurrentWindow; - INVOKE_WCB( *window, Destroy, ( ) ); - fgSetWindow( activeWindow ); - } - - if( window->Parent ) - fgListRemove( &window->Parent->Children, &window->Node ); - else - fgListRemove( &fgStructure.Windows, &window->Node ); - - if( window->ActiveMenu ) - fgDeactivateMenu( window ); - - fghClearCallBacks( window ); - fgCloseWindow( window ); - free( window ); - if( fgStructure.CurrentWindow == window ) - fgStructure.CurrentWindow = NULL; -} - -/* - * This is a helper static function that removes a menu (given its pointer) - * from any windows that can be accessed from a given parent... - */ -static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu ) -{ - SFG_Window *subWindow; - int i; - - /* Check whether this is the active menu in the window */ - if ( menu == window->ActiveMenu ) - window->ActiveMenu = NULL ; - - /* - * Check if the menu is attached to the current window, - * if so, have it detached (by overwriting with a NULL): - */ - for( i = 0; i < FREEGLUT_MAX_MENUS; i++ ) - if( window->Menu[ i ] == menu ) - window->Menu[ i ] = NULL; - - /* Call this function for all of the window's children recursively: */ - for( subWindow = (SFG_Window *)window->Children.First; - subWindow; - subWindow = (SFG_Window *)subWindow->Node.Next) - fghRemoveMenuFromWindow( subWindow, menu ); -} - -/* - * This is a static helper function that removes menu references - * from another menu, given two pointers to them... - */ -static void fghRemoveMenuFromMenu( SFG_Menu* from, SFG_Menu* menu ) -{ - SFG_MenuEntry *entry; - - for( entry = (SFG_MenuEntry *)from->Entries.First; - entry; - entry = ( SFG_MenuEntry * )entry->Node.Next ) - if( entry->SubMenu == menu ) - entry->SubMenu = NULL; -} - -/* - * This function destroys a menu specified by the parameter. All menus - * and windows are updated to make sure no ill pointers hang around. - */ -void fgDestroyMenu( SFG_Menu* menu ) -{ - SFG_Window *window; - SFG_Menu *from; - - FREEGLUT_INTERNAL_ERROR_EXIT ( menu, "Menu destroy function called with null menu", - "fgDestroyMenu" ); - - /* First of all, have all references to this menu removed from all windows: */ - for( window = (SFG_Window *)fgStructure.Windows.First; - window; - window = (SFG_Window *)window->Node.Next ) - fghRemoveMenuFromWindow( window, menu ); - - /* Now proceed with removing menu entries that lead to this menu */ - for( from = ( SFG_Menu * )fgStructure.Menus.First; - from; - from = ( SFG_Menu * )from->Node.Next ) - fghRemoveMenuFromMenu( from, menu ); - - /* - * If the programmer defined a destroy callback, call it - * A. Donev: But first make this the active menu - */ - if( menu->Destroy ) - { - SFG_Menu *activeMenu=fgStructure.CurrentMenu; - fgStructure.CurrentMenu = menu; - menu->Destroy( ); - fgStructure.CurrentMenu = activeMenu; - } - - /* - * Now we are pretty sure the menu is not used anywhere - * and that we can remove all of its entries - */ - while( menu->Entries.First ) - { - SFG_MenuEntry *entry = ( SFG_MenuEntry * ) menu->Entries.First; - - fgListRemove( &menu->Entries, &entry->Node ); - - if( entry->Text ) - free( entry->Text ); - entry->Text = NULL; - - free( entry ); - } - - if( fgStructure.CurrentWindow == menu->Window ) - fgSetWindow( NULL ); - fgDestroyWindow( menu->Window ); - fgListRemove( &fgStructure.Menus, &menu->Node ); - if( fgStructure.CurrentMenu == menu ) - fgStructure.CurrentMenu = NULL; - - free( menu ); -} - -/* - * This function should be called on glutInit(). It will prepare the internal - * structure of freeglut to be used in the application. The structure will be - * destroyed using fgDestroyStructure() on glutMainLoop() return. In that - * case further use of freeglut should be preceeded with a glutInit() call. - */ -void fgCreateStructure( void ) -{ - /* - * We will be needing two lists: the first containing windows, - * and the second containing the user-defined menus. - * Also, no current window/menu is set, as none has been created yet. - */ - - fgListInit(&fgStructure.Windows); - fgListInit(&fgStructure.Menus); - fgListInit(&fgStructure.WindowsToDestroy); - - fgStructure.CurrentWindow = NULL; - fgStructure.CurrentMenu = NULL; - fgStructure.MenuContext = NULL; - fgStructure.GameModeWindow = NULL; - fgStructure.WindowID = 0; - fgStructure.MenuID = 0; -} - -/* - * This function is automatically called on glutMainLoop() return. - * It should deallocate and destroy all remnants of previous - * glutInit()-enforced structure initialization... - */ -void fgDestroyStructure( void ) -{ - /* Clean up the WindowsToDestroy list. */ - fgCloseWindows( ); - - /* Make sure all windows and menus have been deallocated */ - while( fgStructure.Menus.First ) - fgDestroyMenu( ( SFG_Menu * )fgStructure.Menus.First ); - - while( fgStructure.Windows.First ) - fgDestroyWindow( ( SFG_Window * )fgStructure.Windows.First ); -} - -/* - * Helper function to enumerate through all registered top-level windows - */ -void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator ) -{ - SFG_Window *window; - - FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator, - "Enumerator or callback missing from window enumerator call", - "fgEnumWindows" ); - - /* Check every of the top-level windows */ - for( window = ( SFG_Window * )fgStructure.Windows.First; - window; - window = ( SFG_Window * )window->Node.Next ) - { - enumCallback( window, enumerator ); - if( enumerator->found ) - return; - } -} - -/* - * Helper function to enumerate through all a window's subwindows - * (single level descent) - */ -void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, - SFG_Enumerator* enumerator ) -{ - SFG_Window *child; - - FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator, - "Enumerator or callback missing from subwindow enumerator call", - "fgEnumSubWindows" ); - FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Window Enumeration" ); - - for( child = ( SFG_Window * )window->Children.First; - child; - child = ( SFG_Window * )child->Node.Next ) - { - enumCallback( child, enumerator ); - if( enumerator->found ) - return; - } -} - -/* - * A static helper function to look for a window given its handle - */ -static void fghcbWindowByHandle( SFG_Window *window, - SFG_Enumerator *enumerator ) -{ - if ( enumerator->found ) - return; - - /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */ - if( window->Window.Handle == (SFG_WindowHandleType) (enumerator->data) ) - { - enumerator->found = GL_TRUE; - enumerator->data = window; - - return; - } - - /* Otherwise, check this window's children */ - fgEnumSubWindows( window, fghcbWindowByHandle, enumerator ); -} - -/* - * fgWindowByHandle returns a (SFG_Window *) value pointing to the - * first window in the queue matching the specified window handle. - * The function is defined in freeglut_structure.c file. - */ -SFG_Window* fgWindowByHandle ( SFG_WindowHandleType hWindow ) -{ - SFG_Enumerator enumerator; - - /* This is easy and makes use of the windows enumeration defined above */ - enumerator.found = GL_FALSE; - enumerator.data = (void *)hWindow; - fgEnumWindows( fghcbWindowByHandle, &enumerator ); - - if( enumerator.found ) - return( SFG_Window *) enumerator.data; - return NULL; -} - -/* - * A static helper function to look for a window given its ID - */ -static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator ) -{ - /* Make sure we do not overwrite our precious results... */ - if( enumerator->found ) - return; - - /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */ - if( window->ID == *( int *)(enumerator->data) ) - { - enumerator->found = GL_TRUE; - enumerator->data = window; - - return; - } - - /* Otherwise, check this window's children */ - fgEnumSubWindows( window, fghcbWindowByID, enumerator ); -} - -/* - * This function is similiar to the previous one, except it is - * looking for a specified (sub)window identifier. The function - * is defined in freeglut_structure.c file. - */ -SFG_Window* fgWindowByID( int windowID ) -{ - SFG_Enumerator enumerator; - - /* Uses a method very similiar for fgWindowByHandle... */ - enumerator.found = GL_FALSE; - enumerator.data = ( void * )&windowID; - fgEnumWindows( fghcbWindowByID, &enumerator ); - if( enumerator.found ) - return ( SFG_Window * )enumerator.data; - return NULL; -} - -/* - * Looks up a menu given its ID. This is easier that fgWindowByXXX - * as all menus are placed in one doubly linked list... - */ -SFG_Menu* fgMenuByID( int menuID ) -{ - SFG_Menu *menu = NULL; - - /* It's enough to check all entries in fgStructure.Menus... */ - for( menu = (SFG_Menu *)fgStructure.Menus.First; - menu; - menu = (SFG_Menu *)menu->Node.Next ) - if( menu->ID == menuID ) - return menu; - return NULL; -} - -/* - * List functions... - */ -void fgListInit(SFG_List *list) -{ - list->First = NULL; - list->Last = NULL; -} - -void fgListAppend(SFG_List *list, SFG_Node *node) -{ - if ( list->Last ) - { - SFG_Node *ln = (SFG_Node *) list->Last; - ln->Next = node; - node->Prev = ln; - } - else - { - node->Prev = NULL; - list->First = node; - } - - node->Next = NULL; - list->Last = node; -} - -void fgListRemove(SFG_List *list, SFG_Node *node) -{ - if( node->Next ) - ( ( SFG_Node * )node->Next )->Prev = node->Prev; - if( node->Prev ) - ( ( SFG_Node * )node->Prev )->Next = node->Next; - if( ( ( SFG_Node * )list->First ) == node ) - list->First = node->Next; - if( ( ( SFG_Node * )list->Last ) == node ) - list->Last = node->Prev; -} - -int fgListLength(SFG_List *list) -{ - SFG_Node *node; - int length = 0; - - for( node =( SFG_Node * )list->First; - node; - node = ( SFG_Node * )node->Next ) - ++length; - - return length; -} - - -void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node) -{ - SFG_Node *prev; - - if( (node->Next = next) ) - { - prev = next->Prev; - next->Prev = node; - } - else - { - prev = list->Last; - list->Last = node; - } - - if( (node->Prev = prev) ) - prev->Next = node; - else - list->First = node; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot.c deleted file mode 100644 index 722bca612..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * freeglut_teapot.c - * - * Teapot(tm) rendering code. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 24 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * Original teapot code copyright follows: - */ - -/* - * (c) Copyright 1993, Silicon Graphics, Inc. - * - * ALL RIGHTS RESERVED - * - * Permission to use, copy, modify, and distribute this software - * for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that - * both the copyright notice and this permission notice appear in - * supporting documentation, and that the name of Silicon - * Graphics, Inc. not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. - * - * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU - * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR - * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO - * EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE - * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, - * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, - * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR - * NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY - * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * US Government Users Restricted Rights - * - * Use, duplication, or disclosure by the Government is subject to - * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph - * (c)(1)(ii) of the Rights in Technical Data and Computer - * Software clause at DFARS 252.227-7013 and/or in similar or - * successor clauses in the FAR or the DOD or NASA FAR - * Supplement. Unpublished-- rights reserved under the copyright - * laws of the United States. Contractor/manufacturer is Silicon - * Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA - * 94039-7311. - * - * OpenGL(TM) is a trademark of Silicon Graphics, Inc. - */ - -#include -#include "freeglut_internal.h" -#include "freeglut_teapot_data.h" - -/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ - - -static void fghTeapot( GLint grid, GLdouble scale, GLenum type ) -{ -#if defined(_WIN32_WCE) - int i, numV=sizeof(strip_vertices)/4, numI=sizeof(strip_normals)/4; -#else - double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3]; - long i, j, k, l; -#endif - - glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT ); - glEnable( GL_AUTO_NORMAL ); - glEnable( GL_NORMALIZE ); - glEnable( GL_MAP2_VERTEX_3 ); - glEnable( GL_MAP2_TEXTURE_COORD_2 ); - - glPushMatrix(); - glRotated( 270.0, 1.0, 0.0, 0.0 ); - glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale ); - glTranslated( 0.0, 0.0, -1.5 ); - -#if defined(_WIN32_WCE) - glRotated( 90.0, 1.0, 0.0, 0.0 ); - glBegin( GL_TRIANGLE_STRIP ); - - for( i = 0; i < numV-1; i++ ) - { - int vidx = strip_vertices[i], - nidx = strip_normals[i]; - - if( vidx != -1 ) - { - glNormal3fv( normals[nidx] ); - glVertex3fv( vertices[vidx] ); - } - else - { - glEnd(); - glBegin( GL_TRIANGLE_STRIP ); - } - } - - glEnd(); -#else - for (i = 0; i < 10; i++) { - for (j = 0; j < 4; j++) { - for (k = 0; k < 4; k++) { - for (l = 0; l < 3; l++) { - p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; - q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l]; - if (l == 1) - q[j][k][l] *= -1.0; - if (i < 6) { - r[j][k][l] = - cpdata[patchdata[i][j * 4 + (3 - k)]][l]; - if (l == 0) - r[j][k][l] *= -1.0; - s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; - if (l == 0) - s[j][k][l] *= -1.0; - if (l == 1) - s[j][k][l] *= -1.0; - } - } - } - } - - glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2, - &tex[0][0][0]); - glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, - &p[0][0][0]); - glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0); - glEvalMesh2(type, 0, grid, 0, grid); - glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, - &q[0][0][0]); - glEvalMesh2(type, 0, grid, 0, grid); - if (i < 6) { - glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, - &r[0][0][0]); - glEvalMesh2(type, 0, grid, 0, grid); - glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, - &s[0][0][0]); - glEvalMesh2(type, 0, grid, 0, grid); - } - } -#endif /* defined(_WIN32_WCE) */ - - glPopMatrix(); - glPopAttrib(); -} - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Renders a beautiful wired teapot... - */ -void FGAPIENTRY glutWireTeapot( GLdouble size ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTeapot" ); - /* We will use the general teapot rendering code */ - fghTeapot( 10, size, GL_LINE ); -} - -/* - * Renders a beautiful filled teapot... - */ -void FGAPIENTRY glutSolidTeapot( GLdouble size ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTeapot" ); - /* We will use the general teapot rendering code */ - fghTeapot( 7, size, GL_FILL ); -} - -/*** END OF FILE ***/ - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot_data.h b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot_data.h deleted file mode 100644 index 3928f9277..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_teapot_data.h +++ /dev/null @@ -1,2436 +0,0 @@ -/* - * freeglut_teapot_data.h - * - * The freeglut library teapot data include file. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef FREEGLUT_TEAPOT_DATA_H -#define FREEGLUT_TEAPOT_DATA_H - -#if defined(_WIN32_WCE) -/* - * Submitted through the kind offices of Daniel Wagner (daniel@ims.tuwien.ac.at) - */ - -/* 530 vertices */ - -const int numVertices = 530; -const float vertices[530][3] = { -2.1f, 3.6f, 0.0f, -2.071f, 3.711f, 0.0f, -2.105f, 3.748f, 0.0f, -2.174f, 3.711f, 0.0f, -2.25f, 3.6f, 0.0f, -1.937f, 3.6f, 0.8242f, -1.91f, 3.711f, 0.8128f, -1.942f, 3.748f, 0.8261f, -2.005f, 3.711f, 0.8532f, -2.076f, 3.6f, 0.8831f, -1.491f, 3.6f, 1.491f, -1.47f, 3.711f, 1.47f, -1.494f, 3.748f, 1.494f, -1.543f, 3.711f, 1.543f, -1.597f, 3.6f, 1.597f, -0.8242f, 3.6f, 1.937f, -0.8128f, 3.711f, 1.91f, -0.8261f, 3.748f, 1.942f, -0.8532f, 3.711f, 2.005f, -0.8831f, 3.6f, 2.076f, -0.0f, 3.6f, 2.1f, -0.0f, 3.711f, 2.071f, -0.0f, 3.748f, 2.105f, -0.0f, 3.711f, 2.174f, -0.0f, 3.6f, 2.25f, --0.8812f, 3.6f, 1.937f, --0.8368f, 3.711f, 1.91f, --0.8332f, 3.748f, 1.942f, --0.8541f, 3.711f, 2.005f, --0.8831f, 3.6f, 2.076f, --1.542f, 3.6f, 1.491f, --1.492f, 3.711f, 1.47f, --1.501f, 3.748f, 1.494f, --1.544f, 3.711f, 1.543f, --1.597f, 3.6f, 1.597f, --1.956f, 3.6f, 0.8242f, --1.918f, 3.711f, 0.8128f, --1.944f, 3.748f, 0.8261f, --2.006f, 3.711f, 0.8532f, --2.076f, 3.6f, 0.8831f, --2.1f, 3.6f, 0.0f, --2.071f, 3.711f, 0.0f, --2.105f, 3.748f, 0.0f, --2.174f, 3.711f, 0.0f, --2.25f, 3.6f, 0.0f, --1.937f, 3.6f, -0.8242f, --1.91f, 3.711f, -0.8128f, --1.942f, 3.748f, -0.8261f, --2.005f, 3.711f, -0.8532f, --2.076f, 3.6f, -0.8831f, --1.491f, 3.6f, -1.491f, --1.47f, 3.711f, -1.47f, --1.494f, 3.748f, -1.494f, --1.543f, 3.711f, -1.543f, --1.597f, 3.6f, -1.597f, --0.8242f, 3.6f, -1.937f, --0.8128f, 3.711f, -1.91f, --0.8261f, 3.748f, -1.942f, --0.8532f, 3.711f, -2.005f, --0.8831f, 3.6f, -2.076f, -0.0f, 3.6f, -2.1f, -0.0f, 3.711f, -2.071f, -0.0f, 3.748f, -2.105f, -0.0f, 3.711f, -2.174f, -0.0f, 3.6f, -2.25f, -0.8242f, 3.6f, -1.937f, -0.8128f, 3.711f, -1.91f, -0.8261f, 3.748f, -1.942f, -0.8532f, 3.711f, -2.005f, -0.8831f, 3.6f, -2.076f, -1.491f, 3.6f, -1.491f, -1.47f, 3.711f, -1.47f, -1.494f, 3.748f, -1.494f, -1.543f, 3.711f, -1.543f, -1.597f, 3.6f, -1.597f, -1.937f, 3.6f, -0.8242f, -1.91f, 3.711f, -0.8128f, -1.942f, 3.748f, -0.8261f, -2.005f, 3.711f, -0.8532f, -2.076f, 3.6f, -0.8831f, -2.525f, 3.011f, 0.0f, -2.766f, 2.433f, 0.0f, -2.936f, 1.876f, 0.0f, -3.0f, 1.35f, 0.0f, -2.33f, 3.011f, 0.9912f, -2.551f, 2.433f, 1.086f, -2.708f, 1.876f, 1.152f, -2.767f, 1.35f, 1.178f, -1.793f, 3.011f, 1.793f, -1.964f, 2.433f, 1.964f, -2.084f, 1.876f, 2.084f, -2.13f, 1.35f, 2.13f, -0.9912f, 3.011f, 2.33f, -1.086f, 2.433f, 2.551f, -1.152f, 1.876f, 2.708f, -1.178f, 1.35f, 2.767f, -0.0f, 3.011f, 2.525f, -0.0f, 2.433f, 2.766f, -0.0f, 1.876f, 2.936f, -0.0f, 1.35f, 3.0f, --0.9912f, 3.011f, 2.33f, --1.086f, 2.433f, 2.551f, --1.152f, 1.876f, 2.708f, --1.178f, 1.35f, 2.767f, --1.793f, 3.011f, 1.793f, --1.964f, 2.433f, 1.964f, --2.084f, 1.876f, 2.084f, --2.13f, 1.35f, 2.13f, --2.33f, 3.011f, 0.9912f, --2.551f, 2.433f, 1.086f, --2.708f, 1.876f, 1.152f, --2.767f, 1.35f, 1.178f, --2.525f, 3.011f, 0.0f, --2.766f, 2.433f, 0.0f, --2.936f, 1.876f, 0.0f, --3.0f, 1.35f, 0.0f, --2.33f, 3.011f, -0.9912f, --2.551f, 2.433f, -1.086f, --2.708f, 1.876f, -1.152f, --2.767f, 1.35f, -1.178f, --1.793f, 3.011f, -1.793f, --1.964f, 2.433f, -1.964f, --2.084f, 1.876f, -2.084f, --2.13f, 1.35f, -2.13f, --0.9912f, 3.011f, -2.33f, --1.086f, 2.433f, -2.551f, --1.152f, 1.876f, -2.708f, --1.178f, 1.35f, -2.767f, -0.0f, 3.011f, -2.525f, -0.0f, 2.433f, -2.766f, -0.0f, 1.876f, -2.936f, -0.0f, 1.35f, -3.0f, -0.9912f, 3.011f, -2.33f, -1.086f, 2.433f, -2.551f, -1.152f, 1.876f, -2.708f, -1.178f, 1.35f, -2.767f, -1.793f, 3.011f, -1.793f, -1.964f, 2.433f, -1.964f, -2.084f, 1.876f, -2.084f, -2.13f, 1.35f, -2.13f, -2.33f, 3.011f, -0.9912f, -2.551f, 2.433f, -1.086f, -2.708f, 1.876f, -1.152f, -2.767f, 1.35f, -1.178f, -2.883f, 0.9053f, 0.0f, -2.625f, 0.5766f, 0.0f, -2.367f, 0.3533f, 0.0f, -2.25f, 0.225f, 0.0f, -2.659f, 0.9053f, 1.132f, -2.422f, 0.5766f, 1.03f, -2.184f, 0.3533f, 0.9291f, -2.076f, 0.225f, 0.8831f, -2.047f, 0.9053f, 2.047f, -1.864f, 0.5766f, 1.864f, -1.681f, 0.3533f, 1.681f, -1.597f, 0.225f, 1.597f, -1.132f, 0.9053f, 2.659f, -1.03f, 0.5766f, 2.422f, -0.9291f, 0.3533f, 2.184f, -0.8831f, 0.225f, 2.076f, -0.0f, 0.9053f, 2.883f, -0.0f, 0.5766f, 2.625f, -0.0f, 0.3533f, 2.367f, -0.0f, 0.225f, 2.25f, --1.132f, 0.9053f, 2.659f, --1.03f, 0.5766f, 2.422f, --0.9291f, 0.3533f, 2.184f, --0.8831f, 0.225f, 2.076f, --2.047f, 0.9053f, 2.047f, --1.864f, 0.5766f, 1.864f, --1.681f, 0.3533f, 1.681f, --1.597f, 0.225f, 1.597f, --2.659f, 0.9053f, 1.132f, --2.422f, 0.5766f, 1.03f, --2.184f, 0.3533f, 0.9291f, --2.076f, 0.225f, 0.8831f, --2.883f, 0.9053f, 0.0f, --2.625f, 0.5766f, 0.0f, --2.367f, 0.3533f, 0.0f, --2.25f, 0.225f, 0.0f, --2.659f, 0.9053f, -1.132f, --2.422f, 0.5766f, -1.03f, --2.184f, 0.3533f, -0.9291f, --2.076f, 0.225f, -0.8831f, --2.047f, 0.9053f, -2.047f, --1.864f, 0.5766f, -1.864f, --1.681f, 0.3533f, -1.681f, --1.597f, 0.225f, -1.597f, --1.132f, 0.9053f, -2.659f, --1.03f, 0.5766f, -2.422f, --0.9291f, 0.3533f, -2.184f, --0.8831f, 0.225f, -2.076f, -0.0f, 0.9053f, -2.883f, -0.0f, 0.5766f, -2.625f, -0.0f, 0.3533f, -2.367f, -0.0f, 0.225f, -2.25f, -1.132f, 0.9053f, -2.659f, -1.03f, 0.5766f, -2.422f, -0.9291f, 0.3533f, -2.184f, -0.8831f, 0.225f, -2.076f, -2.047f, 0.9053f, -2.047f, -1.864f, 0.5766f, -1.864f, -1.681f, 0.3533f, -1.681f, -1.597f, 0.225f, -1.597f, -2.659f, 0.9053f, -1.132f, -2.422f, 0.5766f, -1.03f, -2.184f, 0.3533f, -0.9291f, -2.076f, 0.225f, -0.8831f, -2.199f, 0.1424f, 0.0f, -1.927f, 0.07031f, 0.0f, -1.253f, 0.01934f, 0.0f, -0.0f, 0.0f, 0.0f, -2.029f, 0.1424f, 0.8631f, -1.777f, 0.07031f, 0.7562f, -1.156f, 0.01934f, 0.4919f, -1.561f, 0.1424f, 1.561f, -1.368f, 0.07031f, 1.368f, -0.8899f, 0.01934f, 0.8899f, -0.8631f, 0.1424f, 2.029f, -0.7562f, 0.07031f, 1.777f, -0.4919f, 0.01934f, 1.156f, -0.0f, 0.1424f, 2.199f, -0.0f, 0.07031f, 1.927f, -0.0f, 0.01934f, 1.253f, --0.8631f, 0.1424f, 2.029f, --0.7562f, 0.07031f, 1.777f, --0.4919f, 0.01934f, 1.156f, --1.561f, 0.1424f, 1.561f, --1.368f, 0.07031f, 1.368f, --0.8899f, 0.01934f, 0.8899f, --2.029f, 0.1424f, 0.8631f, --1.777f, 0.07031f, 0.7562f, --1.156f, 0.01934f, 0.4919f, --2.199f, 0.1424f, 0.0f, --1.927f, 0.07031f, 0.0f, --1.253f, 0.01934f, 0.0f, --2.029f, 0.1424f, -0.8631f, --1.777f, 0.07031f, -0.7562f, --1.156f, 0.01934f, -0.4919f, --1.561f, 0.1424f, -1.561f, --1.368f, 0.07031f, -1.368f, --0.8899f, 0.01934f, -0.8899f, --0.8631f, 0.1424f, -2.029f, --0.7562f, 0.07031f, -1.777f, --0.4919f, 0.01934f, -1.156f, -0.0f, 0.1424f, -2.199f, -0.0f, 0.07031f, -1.927f, -0.0f, 0.01934f, -1.253f, -0.8631f, 0.1424f, -2.029f, -0.7562f, 0.07031f, -1.777f, -0.4919f, 0.01934f, -1.156f, -1.561f, 0.1424f, -1.561f, -1.368f, 0.07031f, -1.368f, -0.8899f, 0.01934f, -0.8899f, -2.029f, 0.1424f, -0.8631f, -1.777f, 0.07031f, -0.7562f, -1.156f, 0.01934f, -0.4919f, --2.4f, 3.038f, 0.0f, --3.101f, 3.032f, 0.0f, --3.619f, 2.995f, 0.0f, --3.94f, 2.895f, 0.0f, --4.05f, 2.7f, 0.0f, --2.377f, 3.09f, 0.2531f, --3.122f, 3.084f, 0.2531f, --3.669f, 3.041f, 0.2531f, --4.005f, 2.926f, 0.2531f, --4.12f, 2.7f, 0.2531f, --2.325f, 3.206f, 0.3375f, --3.168f, 3.198f, 0.3375f, --3.778f, 3.143f, 0.3375f, --4.15f, 2.993f, 0.3375f, --4.275f, 2.7f, 0.3375f, --2.273f, 3.322f, 0.2531f, --3.214f, 3.313f, 0.2531f, --3.888f, 3.244f, 0.2531f, --4.294f, 3.06f, 0.2531f, --4.43f, 2.7f, 0.2531f, --2.25f, 3.375f, 0.0f, --3.234f, 3.364f, 0.0f, --3.938f, 3.291f, 0.0f, --4.359f, 3.09f, 0.0f, --4.5f, 2.7f, 0.0f, --2.273f, 3.322f, -0.2531f, --3.214f, 3.313f, -0.2531f, --3.888f, 3.244f, -0.2531f, --4.294f, 3.06f, -0.2531f, --4.43f, 2.7f, -0.2531f, --2.325f, 3.206f, -0.3375f, --3.168f, 3.198f, -0.3375f, --3.778f, 3.143f, -0.3375f, --4.15f, 2.993f, -0.3375f, --4.275f, 2.7f, -0.3375f, --2.377f, 3.09f, -0.2531f, --3.122f, 3.084f, -0.2531f, --3.669f, 3.041f, -0.2531f, --4.005f, 2.926f, -0.2531f, --4.12f, 2.7f, -0.2531f, --3.991f, 2.394f, 0.0f, --3.806f, 2.025f, 0.0f, --3.48f, 1.656f, 0.0f, --3.0f, 1.35f, 0.0f, --4.055f, 2.365f, 0.2531f, --3.852f, 1.98f, 0.2531f, --3.496f, 1.6f, 0.2531f, --2.977f, 1.28f, 0.2531f, --4.196f, 2.3f, 0.3375f, --3.952f, 1.881f, 0.3375f, --3.531f, 1.478f, 0.3375f, --2.925f, 1.125f, 0.3375f, --4.336f, 2.235f, 0.2531f, --4.051f, 1.782f, 0.2531f, --3.566f, 1.356f, 0.2531f, --2.873f, 0.9703f, 0.2531f, --4.4f, 2.205f, 0.0f, --4.097f, 1.737f, 0.0f, --3.582f, 1.3f, 0.0f, --2.85f, 0.9f, 0.0f, --4.336f, 2.235f, -0.2531f, --4.051f, 1.782f, -0.2531f, --3.566f, 1.356f, -0.2531f, --2.873f, 0.9703f, -0.2531f, --4.196f, 2.3f, -0.3375f, --3.952f, 1.881f, -0.3375f, --3.531f, 1.478f, -0.3375f, --2.925f, 1.125f, -0.3375f, --4.055f, 2.365f, -0.2531f, --3.852f, 1.98f, -0.2531f, --3.496f, 1.6f, -0.2531f, --2.977f, 1.28f, -0.2531f, -2.55f, 2.137f, 0.0f, -3.27f, 2.303f, 0.0f, -3.581f, 2.7f, 0.0f, -3.752f, 3.182f, 0.0f, -4.05f, 3.6f, 0.0f, -2.55f, 1.944f, 0.5569f, -3.324f, 2.159f, 0.5028f, -3.652f, 2.617f, 0.3839f, -3.838f, 3.151f, 0.265f, -4.191f, 3.6f, 0.2109f, -2.55f, 1.519f, 0.7425f, -3.445f, 1.844f, 0.6704f, -3.806f, 2.433f, 0.5119f, -4.027f, 3.085f, 0.3533f, -4.5f, 3.6f, 0.2813f, -2.55f, 1.093f, 0.5569f, -3.566f, 1.529f, 0.5028f, -3.961f, 2.249f, 0.3839f, -4.215f, 3.018f, 0.265f, -4.809f, 3.6f, 0.2109f, -2.55f, 0.9f, 0.0f, -3.621f, 1.385f, 0.0f, -4.031f, 2.166f, 0.0f, -4.301f, 2.988f, 0.0f, -4.95f, 3.6f, 0.0f, -2.55f, 1.093f, -0.5569f, -3.566f, 1.529f, -0.5028f, -3.961f, 2.249f, -0.3839f, -4.215f, 3.018f, -0.265f, -4.809f, 3.6f, -0.2109f, -2.55f, 1.519f, -0.7425f, -3.445f, 1.844f, -0.6704f, -3.806f, 2.433f, -0.5119f, -4.027f, 3.085f, -0.3533f, -4.5f, 3.6f, -0.2813f, -2.55f, 1.944f, -0.5569f, -3.324f, 2.159f, -0.5028f, -3.652f, 2.617f, -0.3839f, -3.838f, 3.151f, -0.265f, -4.191f, 3.6f, -0.2109f, -4.158f, 3.663f, 0.0f, -4.238f, 3.684f, 0.0f, -4.261f, 3.663f, 0.0f, -4.2f, 3.6f, 0.0f, -4.308f, 3.666f, 0.1978f, -4.379f, 3.689f, 0.1687f, -4.381f, 3.668f, 0.1397f, -4.294f, 3.6f, 0.1266f, -4.64f, 3.673f, 0.2637f, -4.69f, 3.7f, 0.225f, -4.645f, 3.677f, 0.1863f, -4.5f, 3.6f, 0.1688f, -4.971f, 3.68f, 0.1978f, -5.001f, 3.711f, 0.1687f, -4.909f, 3.687f, 0.1397f, -4.706f, 3.6f, 0.1266f, -5.122f, 3.683f, 0.0f, -5.142f, 3.716f, 0.0f, -5.029f, 3.691f, 0.0f, -4.8f, 3.6f, 0.0f, -4.971f, 3.68f, -0.1978f, -5.001f, 3.711f, -0.1687f, -4.909f, 3.687f, -0.1397f, -4.706f, 3.6f, -0.1266f, -4.64f, 3.673f, -0.2637f, -4.69f, 3.7f, -0.225f, -4.645f, 3.677f, -0.1863f, -4.5f, 3.6f, -0.1688f, -4.308f, 3.666f, -0.1978f, -4.379f, 3.689f, -0.1687f, -4.381f, 3.668f, -0.1397f, -4.294f, 3.6f, -0.1266f, -0.0f, 4.725f, 0.0f, -0.5109f, 4.651f, 0.0f, -0.4875f, 4.472f, 0.0f, -0.2953f, 4.25f, 0.0f, -0.3f, 4.05f, 0.0f, -0.4715f, 4.651f, 0.2011f, -0.4499f, 4.472f, 0.1918f, -0.2725f, 4.25f, 0.1161f, -0.2768f, 4.05f, 0.1178f, -0.3632f, 4.651f, 0.3632f, -0.3465f, 4.472f, 0.3465f, -0.2098f, 4.25f, 0.2098f, -0.213f, 4.05f, 0.213f, -0.2011f, 4.651f, 0.4715f, -0.1918f, 4.472f, 0.4499f, -0.1161f, 4.25f, 0.2725f, -0.1178f, 4.05f, 0.2768f, -0.0f, 4.651f, 0.5109f, -0.0f, 4.472f, 0.4875f, -0.0f, 4.25f, 0.2953f, -0.0f, 4.05f, 0.3f, --0.2011f, 4.651f, 0.4715f, --0.1918f, 4.472f, 0.4499f, --0.1161f, 4.25f, 0.2725f, --0.1178f, 4.05f, 0.2768f, --0.3632f, 4.651f, 0.3632f, --0.3465f, 4.472f, 0.3465f, --0.2098f, 4.25f, 0.2098f, --0.213f, 4.05f, 0.213f, --0.4715f, 4.651f, 0.2011f, --0.4499f, 4.472f, 0.1918f, --0.2725f, 4.25f, 0.1161f, --0.2768f, 4.05f, 0.1178f, --0.5109f, 4.651f, 0.0f, --0.4875f, 4.472f, 0.0f, --0.2953f, 4.25f, 0.0f, --0.3f, 4.05f, 0.0f, --0.4715f, 4.651f, -0.2011f, --0.4499f, 4.472f, -0.1918f, --0.2725f, 4.25f, -0.1161f, --0.2768f, 4.05f, -0.1178f, --0.3632f, 4.651f, -0.3632f, --0.3465f, 4.472f, -0.3465f, --0.2098f, 4.25f, -0.2098f, --0.213f, 4.05f, -0.213f, --0.2011f, 4.651f, -0.4715f, --0.1918f, 4.472f, -0.4499f, --0.1161f, 4.25f, -0.2725f, --0.1178f, 4.05f, -0.2768f, -0.0f, 4.651f, -0.5109f, -0.0f, 4.472f, -0.4875f, -0.0f, 4.25f, -0.2953f, -0.0f, 4.05f, -0.3f, -0.2011f, 4.651f, -0.4715f, -0.1918f, 4.472f, -0.4499f, -0.1161f, 4.25f, -0.2725f, -0.1178f, 4.05f, -0.2768f, -0.3632f, 4.651f, -0.3632f, -0.3465f, 4.472f, -0.3465f, -0.2098f, 4.25f, -0.2098f, -0.213f, 4.05f, -0.213f, -0.4715f, 4.651f, -0.2011f, -0.4499f, 4.472f, -0.1918f, -0.2725f, 4.25f, -0.1161f, -0.2768f, 4.05f, -0.1178f, -0.6844f, 3.916f, 0.0f, -1.237f, 3.825f, 0.0f, -1.734f, 3.734f, 0.0f, -1.95f, 3.6f, 0.0f, -0.6313f, 3.916f, 0.2686f, -1.142f, 3.825f, 0.4857f, -1.6f, 3.734f, 0.6807f, -1.799f, 3.6f, 0.7654f, -0.4859f, 3.916f, 0.4859f, -0.8786f, 3.825f, 0.8786f, -1.231f, 3.734f, 1.231f, -1.385f, 3.6f, 1.385f, -0.2686f, 3.916f, 0.6313f, -0.4857f, 3.825f, 1.142f, -0.6807f, 3.734f, 1.6f, -0.7654f, 3.6f, 1.799f, -0.0f, 3.916f, 0.6844f, -0.0f, 3.825f, 1.237f, -0.0f, 3.734f, 1.734f, -0.0f, 3.6f, 1.95f, --0.2686f, 3.916f, 0.6313f, --0.4857f, 3.825f, 1.142f, --0.6807f, 3.734f, 1.6f, --0.7654f, 3.6f, 1.799f, --0.4859f, 3.916f, 0.4859f, --0.8786f, 3.825f, 0.8786f, --1.231f, 3.734f, 1.231f, --1.385f, 3.6f, 1.385f, --0.6313f, 3.916f, 0.2686f, --1.142f, 3.825f, 0.4857f, --1.6f, 3.734f, 0.6807f, --1.799f, 3.6f, 0.7654f, --0.6844f, 3.916f, 0.0f, --1.237f, 3.825f, 0.0f, --1.734f, 3.734f, 0.0f, --1.95f, 3.6f, 0.0f, --0.6313f, 3.916f, -0.2686f, --1.142f, 3.825f, -0.4857f, --1.6f, 3.734f, -0.6807f, --1.799f, 3.6f, -0.7654f, --0.4859f, 3.916f, -0.4859f, --0.8786f, 3.825f, -0.8786f, --1.231f, 3.734f, -1.231f, --1.385f, 3.6f, -1.385f, --0.2686f, 3.916f, -0.6313f, --0.4857f, 3.825f, -1.142f, --0.6807f, 3.734f, -1.6f, --0.7654f, 3.6f, -1.799f, -0.0f, 3.916f, -0.6844f, -0.0f, 3.825f, -1.237f, -0.0f, 3.734f, -1.734f, -0.0f, 3.6f, -1.95f, -0.2686f, 3.916f, -0.6313f, -0.4857f, 3.825f, -1.142f, -0.6807f, 3.734f, -1.6f, -0.7654f, 3.6f, -1.799f, -0.4859f, 3.916f, -0.4859f, -0.8786f, 3.825f, -0.8786f, -1.231f, 3.734f, -1.231f, -1.385f, 3.6f, -1.385f, -0.6313f, 3.916f, -0.2686f, -1.142f, 3.825f, -0.4857f, -1.6f, 3.734f, -0.6807f, -1.799f, 3.6f, -0.7654f -}; - - -/* 530 normals */ -const int numNormals = 530; -const float normals[530][3] = { -0.0486f, -0.9986f, 0.0168f, -0.9976f, -0.0678f, -0.0008f, --0.233f, 0.8502f, -0.4719f, --0.2299f, 0.9679f, 0.1004f, --0.1648f, 0.985f, 0.0501f, --0.0117f, 0.7461f, 0.6656f, --0.0888f, 0.9692f, 0.2294f, -0.6449f, -0.7172f, -0.2637f, --0.066f, 0.9851f, 0.1583f, --0.6585f, -0.342f, -0.6703f, --0.293f, 0.9558f, 0.0209f, -0.179f, 0.9825f, -0.0513f, --0.0094f, 0.903f, 0.4295f, --0.0059f, -0.986f, -0.1662f, --0.7355f, 0.6774f, -0.0026f, --0.997f, 0.0763f, 0.0019f, --0.1478f, 0.9333f, 0.3271f, --0.3014f, -0.6034f, -0.7382f, --0.7048f, -0.0681f, 0.706f, --0.3361f, 0.9332f, 0.1263f, -0.3709f, 0.1524f, -0.916f, --0.3399f, -0.4121f, 0.8453f, -0.1921f, 0.9724f, -0.1316f, --0.2671f, 0.7429f, 0.6137f, -0.0888f, 0.9692f, -0.2294f, -0.066f, 0.9851f, -0.1583f, -0.9411f, 0.338f, 0.001f, -0.8666f, -0.2559f, 0.4282f, --0.8029f, 0.4968f, 0.3293f, --0.0008f, -0.0678f, -0.9976f, --0.8453f, -0.4121f, -0.3399f, --0.4801f, -0.8741f, 0.0733f, -0.6355f, -0.772f, 0.0006f, --0.9215f, -0.0678f, 0.3822f, --0.6698f, -0.6907f, -0.2723f, -0.3734f, 0.876f, -0.3051f, -0.3548f, -0.4118f, 0.8393f, --0.3629f, 0.2429f, 0.8995f, -0.9033f, 0.2079f, 0.375f, --0.2824f, 0.5939f, 0.7532f, -0.8938f, 0.4452f, 0.0532f, -0.1478f, 0.9333f, -0.3271f, -0.0085f, -0.0031f, -0.9999f, -0.3595f, 0.933f, 0.0115f, -0.8995f, 0.2429f, 0.3629f, -0.7048f, -0.0681f, -0.706f, --0.6428f, -0.7172f, -0.2688f, -0.6366f, -0.447f, 0.6283f, --0.1213f, -0.9861f, -0.1128f, -0.8003f, 0.4978f, 0.334f, -0.3361f, 0.9332f, -0.1263f, -0.3399f, -0.4121f, -0.8453f, --0.3909f, 0.4452f, 0.8055f, -0.0117f, 0.7462f, -0.6655f, -0.9215f, -0.0678f, -0.3822f, -0.3582f, -0.7656f, 0.5343f, --0.9782f, 0.2075f, -0.0011f, -0.2824f, 0.5939f, -0.7532f, -0.035f, -0.8413f, 0.5393f, --0.8044f, 0.5934f, 0.0262f, --0.1128f, -0.9861f, 0.1213f, -0.13f, -0.1396f, 0.9816f, -0.6644f, 0.3392f, 0.6659f, --0.0042f, -0.6898f, -0.7239f, --0.1587f, 0.9851f, 0.065f, --0.8719f, -0.3415f, 0.3508f, -0.6486f, 0.4756f, -0.5941f, --0.4991f, 0.8499f, -0.1684f, --0.3969f, 0.6342f, -0.6634f, -0.7041f, -0.3863f, -0.5956f, -0.3909f, 0.4452f, -0.8055f, --0.0391f, -0.0113f, 0.9991f, --0.3321f, 0.5936f, -0.733f, -0.8523f, -0.5219f, -0.0338f, -0.329f, 0.4978f, 0.8023f, -0.8044f, 0.5934f, -0.0262f, -0.1128f, -0.9861f, -0.1213f, -0.0178f, 0.9861f, -0.1651f, -0.3491f, 0.4045f, 0.8452f, --0.2727f, 0.8505f, 0.4496f, -0.065f, 0.9851f, 0.1587f, --0.0005f, 0.4037f, 0.9148f, --0.0077f, -0.4109f, -0.9116f, -0.5609f, -0.604f, 0.5661f, -0.8236f, 0.5668f, -0.0138f, -0.1587f, 0.9851f, -0.065f, -0.8719f, -0.3415f, -0.3508f, --0.7382f, -0.6034f, 0.3014f, -0.0346f, 0.8495f, 0.5263f, --0.4373f, -0.7921f, -0.4257f, --0.0532f, 0.4452f, 0.8938f, -0.0689f, -0.9861f, 0.1509f, --0.1509f, -0.9861f, 0.0689f, -0.7706f, -0.2424f, -0.5893f, --0.7543f, -0.6564f, 0.0105f, -0.0005f, 0.4037f, -0.9148f, --0.9116f, -0.4109f, 0.0077f, -0.0058f, -0.0438f, 0.999f, -0.1719f, 0.985f, 0.0005f, --0.1697f, 0.9693f, 0.1774f, -0.5874f, -0.5124f, 0.6263f, -0.7382f, -0.6034f, -0.3014f, --0.1518f, 0.985f, -0.081f, -0.646f, 0.4051f, 0.6468f, -0.334f, 0.4978f, -0.8003f, --0.7354f, -0.6034f, -0.3082f, --0.6919f, 0.2428f, -0.6798f, -0.0532f, 0.4452f, -0.8938f, -0.3547f, -0.3173f, 0.8794f, -0.9879f, -0.1547f, -0.0033f, --0.0462f, -0.9986f, 0.0223f, --0.6088f, 0.4806f, 0.6311f, --0.109f, -0.1969f, -0.9743f, -0.1509f, -0.9861f, -0.0689f, --0.0568f, 0.9983f, 0.0009f, -0.9074f, -0.3096f, -0.2839f, -0.8677f, 0.4969f, 0.0026f, --0.2723f, -0.6907f, 0.6698f, --0.4734f, -0.6798f, 0.5599f, -0.9116f, -0.4109f, -0.0077f, -0.1697f, 0.9693f, -0.1774f, -0.5875f, 0.5937f, 0.5497f, --0.3232f, 0.6846f, 0.6533f, --0.5078f, -0.6913f, 0.5139f, --0.4612f, 0.7474f, -0.478f, --0.2071f, -0.8049f, 0.556f, --0.6976f, -0.7164f, -0.0027f, --0.8697f, 0.3388f, 0.3587f, -0.0462f, -0.9986f, -0.0223f, -0.2723f, -0.6907f, -0.6698f, --0.829f, -0.4466f, -0.3365f, -0.9148f, 0.4037f, 0.0005f, --0.1583f, 0.9851f, -0.066f, -0.148f, 0.9838f, 0.1002f, --0.1717f, 0.985f, -0.0162f, --0.4282f, -0.2559f, 0.8666f, -0.3094f, -0.2556f, 0.9159f, -0.2803f, -0.6907f, 0.6665f, --0.6154f, 0.497f, 0.6117f, --0.0262f, 0.5934f, -0.8044f, -0.0286f, 0.1639f, -0.986f, --0.6924f, 0.2083f, 0.6907f, --0.0105f, 0.9975f, -0.0685f, -0.5078f, -0.6913f, -0.5139f, -0.2071f, -0.8049f, -0.556f, --0.4903f, -0.7178f, -0.4942f, --0.2637f, -0.7172f, -0.6449f, --0.3822f, -0.0678f, -0.9215f, -0.8697f, 0.3388f, -0.3587f, -0.2461f, -0.805f, 0.5397f, --0.2615f, 0.9334f, 0.2452f, -0.6187f, 0.747f, -0.243f, -0.0375f, -0.8401f, -0.5411f, -0.0054f, 0.9691f, 0.2464f, -0.3587f, 0.3388f, 0.8697f, -0.3993f, 0.6582f, -0.6381f, --0.3476f, -0.4464f, -0.8245f, -0.099f, 0.9692f, 0.2251f, --0.3666f, -0.3412f, 0.8655f, -0.0396f, 0.153f, -0.9874f, -0.0349f, 0.9969f, -0.0698f, -0.1096f, 0.985f, 0.1324f, --0.0578f, -0.9861f, 0.1556f, -0.4479f, -0.5145f, -0.7311f, -0.6924f, 0.2083f, -0.6907f, -0.6096f, 0.747f, 0.265f, --0.3508f, -0.3415f, -0.8719f, --0.6215f, 0.4454f, -0.6443f, --0.4942f, -0.7178f, 0.4903f, --0.9402f, -0.3403f, -0.0085f, -0.0056f, -0.0358f, 0.9993f, -0.2615f, 0.9334f, -0.2452f, --0.0024f, 0.0291f, -0.9995f, --0.2667f, 0.9637f, -0.001f, -0.0569f, -0.2712f, -0.9608f, -0.7463f, 0.254f, 0.615f, -0.5153f, 0.6516f, -0.5564f, -0.0223f, -0.9986f, 0.0462f, -0.3666f, -0.3412f, -0.8655f, -0.0578f, -0.9861f, -0.1556f, -0.6111f, 0.4984f, 0.6148f, --0.243f, 0.747f, -0.6187f, --0.0092f, 0.2338f, -0.9722f, -0.478f, 0.7474f, -0.4612f, --0.0058f, -0.4457f, -0.8951f, --0.4856f, -0.6774f, -0.5524f, -0.54f, 0.6414f, 0.5448f, --0.3365f, -0.4466f, 0.829f, --0.2257f, 0.795f, 0.5629f, -0.8055f, 0.4452f, 0.3909f, -0.3729f, 0.208f, 0.9042f, --0.727f, -0.2562f, 0.6369f, --0.0514f, -0.9986f, 0.0029f, -0.9159f, 0.1555f, -0.3699f, -0.0019f, -0.2377f, -0.9713f, -0.4942f, -0.7178f, -0.4903f, -0.6497f, -0.4127f, 0.6383f, -0.0089f, 0.0486f, -0.9987f, --0.0213f, 0.6301f, -0.7761f, --0.9269f, -0.3751f, 0.0038f, --0.1215f, 0.9852f, 0.1207f, --0.5856f, 0.5198f, 0.6218f, -0.8655f, -0.3412f, 0.3666f, --0.2464f, 0.9691f, 0.0054f, -0.0123f, 0.1386f, 0.9902f, -0.0179f, -0.0369f, 0.9991f, --0.1207f, 0.9852f, -0.1215f, --0.0081f, 0.5671f, 0.8235f, --0.8689f, 0.3387f, -0.3607f, -0.0062f, 0.0309f, -0.9995f, -0.3365f, -0.4466f, -0.829f, --0.3787f, 0.2424f, -0.8931f, --0.2904f, 0.4454f, -0.8468f, --0.8707f, 0.4915f, 0.0133f, -0.163f, -0.8182f, 0.5512f, -0.4337f, -0.8052f, 0.4041f, -0.0514f, -0.9986f, -0.0029f, --0.0084f, 0.1303f, 0.9914f, --0.706f, -0.0681f, -0.7048f, --0.556f, -0.8049f, -0.2071f, -0.8448f, 0.4045f, 0.3501f, -0.4259f, -0.5474f, 0.7203f, --0.6907f, 0.2083f, -0.6924f, -0.1215f, 0.9852f, -0.1207f, --0.1263f, 0.9332f, -0.3361f, -0.7711f, -0.0741f, -0.6323f, -0.2464f, 0.9691f, -0.0054f, -0.1774f, 0.9693f, 0.1697f, --0.9042f, 0.208f, 0.3729f, --0.8393f, -0.4118f, 0.3548f, -0.6888f, -0.7219f, -0.0648f, -0.1556f, -0.9861f, 0.0578f, -0.3271f, 0.9333f, 0.1478f, --0.0024f, 0.2379f, 0.9712f, --0.0026f, 0.4969f, 0.8677f, -0.0f, 1.0f, 0.0f, -0.1912f, -0.9815f, -0.0025f, --0.3762f, -0.6681f, 0.6418f, --0.7759f, 0.0432f, 0.6292f, --0.0208f, -0.8044f, -0.5936f, --0.2274f, 0.8822f, -0.4122f, -0.7532f, 0.5939f, 0.2824f, --0.9221f, -0.0681f, -0.3807f, --0.2198f, 0.8494f, 0.4796f, -0.0065f, -0.7656f, 0.6431f, --0.5876f, 0.4472f, -0.6742f, -0.7981f, -0.6024f, 0.0036f, --0.0383f, -0.9986f, -0.0341f, --0.6369f, -0.2562f, -0.727f, --0.5497f, 0.5937f, 0.5875f, -0.1084f, 0.9431f, 0.314f, -0.9042f, 0.208f, -0.3729f, --0.6659f, 0.3392f, 0.6644f, -0.8393f, -0.4118f, -0.3548f, -0.0029f, -0.9986f, 0.0514f, --0.9647f, -0.2552f, -0.0635f, --0.2294f, 0.9692f, -0.0888f, -0.0026f, 0.4969f, -0.8677f, -0.2452f, 0.9334f, 0.2615f, -0.5171f, -0.4876f, -0.7033f, --0.8951f, -0.4457f, 0.0058f, --0.5936f, -0.8044f, 0.0208f, -0.5642f, -0.5426f, -0.6222f, -0.5938f, 0.4451f, 0.6702f, -0.5497f, 0.5937f, -0.5875f, -0.6657f, 0.4653f, 0.5832f, -0.4857f, -0.6243f, 0.6117f, --0.0486f, -0.9986f, -0.0168f, --0.6468f, 0.4051f, 0.646f, -0.6659f, 0.3392f, -0.6644f, -0.1833f, 0.9735f, -0.1365f, -0.3955f, 0.8505f, 0.3465f, -0.5139f, -0.6913f, 0.5078f, -0.8023f, 0.4978f, -0.329f, --0.001f, 0.338f, 0.9411f, --0.2496f, 0.8321f, -0.4951f, -0.8951f, -0.4457f, -0.0058f, -0.233f, 0.8502f, 0.4719f, --0.0168f, -0.9986f, 0.0486f, -0.5936f, -0.8044f, -0.0208f, --0.05f, 0.3155f, 0.9475f, -0.6585f, -0.342f, 0.6703f, -0.4909f, -0.1864f, -0.8509f, --0.37f, 0.9238f, -0.0973f, -0.6468f, 0.4051f, -0.646f, -0.0059f, -0.986f, 0.1662f, --0.3724f, 0.9278f, -0.0202f, --0.3501f, 0.4045f, 0.8448f, --0.0425f, 0.8398f, -0.5411f, --0.1684f, 0.8499f, 0.4991f, --0.6665f, -0.6907f, 0.2803f, --0.2251f, 0.9692f, 0.099f, -0.9241f, -0.3816f, -0.0169f, -0.001f, 0.338f, -0.9411f, --0.9411f, 0.338f, -0.001f, --0.8666f, -0.2559f, -0.4282f, -0.0262f, 0.5183f, -0.8547f, -0.3014f, -0.6034f, 0.7382f, -0.0168f, -0.9986f, -0.0486f, --0.3548f, -0.4118f, -0.8393f, --0.6023f, -0.5297f, 0.5971f, --0.9033f, 0.2079f, -0.375f, --0.8938f, 0.4452f, -0.0532f, -0.6044f, 0.7397f, 0.2957f, -0.0008f, -0.0678f, 0.9976f, -0.7058f, 0.0906f, -0.7025f, -0.8453f, -0.4121f, 0.3399f, --0.3595f, 0.933f, -0.0115f, -0.6698f, -0.6907f, 0.2723f, --0.8995f, 0.2429f, -0.3629f, --0.6366f, -0.447f, -0.6283f, -0.3501f, 0.4045f, -0.8448f, --0.01f, -0.0605f, 0.9981f, --0.8003f, 0.4978f, -0.334f, -0.1684f, 0.8499f, -0.4991f, -0.6665f, -0.6907f, -0.2803f, -0.2251f, 0.9692f, -0.099f, --0.0036f, -0.6024f, 0.7981f, -0.6637f, -0.2967f, -0.6865f, --0.081f, 0.985f, 0.1518f, -0.0084f, 0.2423f, 0.9701f, -0.0071f, -0.9029f, -0.4296f, --0.8679f, 0.4966f, -0.0026f, -0.0123f, 0.5735f, 0.819f, --0.0005f, 0.985f, 0.1719f, -0.6428f, -0.7172f, 0.2688f, -0.6588f, -0.3366f, 0.6727f, -0.1213f, -0.9861f, 0.1128f, --0.8931f, 0.2424f, 0.3787f, --0.1662f, -0.986f, 0.0059f, -0.9994f, 0.0313f, 0.0095f, -0.762f, -0.146f, 0.6308f, --0.7731f, 0.0861f, -0.6283f, --0.6644f, 0.3392f, -0.6659f, --0.0027f, -0.7164f, 0.6976f, -0.0036f, -0.6024f, -0.7981f, -0.9782f, 0.2075f, 0.0011f, -0.0405f, -0.9991f, -0.0018f, -0.6882f, -0.703f, 0.179f, --0.0115f, 0.933f, 0.3595f, -0.0911f, 0.0518f, -0.9944f, -0.0005f, 0.985f, -0.1719f, -0.5337f, -0.5852f, -0.6104f, -0.0042f, -0.6898f, 0.7239f, -0.4863f, 0.2366f, 0.8411f, -0.4991f, 0.8499f, 0.1684f, --0.6543f, 0.7561f, 0.0071f, -0.265f, 0.747f, -0.6096f, --0.329f, 0.4978f, -0.8023f, -0.1662f, -0.986f, -0.0059f, --0.3491f, 0.4045f, -0.8452f, -0.3321f, 0.5936f, 0.733f, --0.065f, 0.9851f, -0.1587f, --0.6283f, -0.447f, 0.6366f, -0.0027f, -0.7164f, -0.6976f, --0.1316f, 0.6339f, 0.762f, --0.5609f, -0.604f, -0.5661f, --0.8452f, 0.4045f, 0.3491f, --0.5263f, 0.8495f, 0.0346f, -0.0115f, 0.933f, -0.3595f, --0.0346f, 0.8495f, -0.5263f, -0.0077f, -0.4109f, 0.9116f, -0.5758f, -0.8175f, -0.0017f, --0.0011f, 0.2075f, 0.9782f, --0.0689f, -0.9861f, -0.1509f, -0.2934f, -0.5928f, -0.7499f, -0.0724f, 0.1198f, -0.9901f, --0.7367f, -0.275f, -0.6176f, --0.3131f, 0.8154f, 0.4868f, --0.0114f, 0.0022f, 0.9999f, -0.6283f, -0.447f, -0.6366f, -0.8452f, 0.4045f, -0.3491f, -0.5263f, 0.8495f, -0.0346f, --0.6383f, -0.4127f, 0.6497f, --0.1719f, 0.985f, -0.0005f, --0.6703f, -0.342f, 0.6585f, --0.0085f, -0.3403f, 0.9402f, --0.646f, 0.4051f, -0.6468f, -0.0011f, 0.2075f, -0.9782f, --0.7216f, -0.3071f, 0.6204f, -0.0282f, 0.0023f, -0.9995f, --0.2483f, 0.6806f, -0.6892f, -0.1518f, 0.985f, 0.081f, -0.047f, 0.0466f, -0.9978f, -0.7354f, -0.6034f, 0.3082f, -0.6919f, 0.2428f, 0.6798f, -0.4086f, -0.3626f, -0.8375f, -0.6383f, -0.4127f, -0.6497f, --0.5875f, 0.5937f, -0.5497f, -0.6703f, -0.342f, -0.6585f, --0.8245f, -0.4464f, 0.3476f, -0.0085f, -0.3403f, -0.9402f, --0.0591f, -0.0663f, 0.996f, -0.0f, -1.0f, 0.0f, -0.4612f, 0.7474f, 0.478f, -0.6976f, -0.7164f, 0.0027f, --0.9148f, 0.4037f, -0.0005f, -0.173f, -0.8158f, -0.5518f, --0.3607f, 0.3387f, 0.8689f, -0.7836f, -0.2411f, 0.5724f, --0.1985f, 0.8026f, -0.5623f, --0.3094f, -0.2556f, -0.9159f, --0.2803f, -0.6907f, -0.6665f, -0.8245f, -0.4464f, -0.3476f, -0.829f, -0.4466f, 0.3365f, --0.4848f, 0.7385f, 0.4683f, -0.1583f, 0.9851f, 0.066f, --0.0077f, 0.7656f, -0.6432f, --0.0162f, 0.985f, 0.1717f, -0.1717f, 0.985f, 0.0162f, -0.0244f, 0.9805f, -0.1949f, --0.2461f, -0.805f, -0.5397f, -0.0262f, 0.5934f, 0.8044f, -0.142f, 0.1881f, 0.9718f, -0.1846f, 0.1002f, 0.9776f, -0.4903f, -0.7178f, 0.4942f, -0.2637f, -0.7172f, 0.6449f, -0.3822f, -0.0678f, 0.9215f, --0.0054f, 0.9691f, -0.2464f, -0.3607f, 0.3387f, -0.8689f, --0.3587f, 0.3388f, -0.8697f, --0.5694f, -0.8219f, 0.0081f, --0.1324f, 0.985f, 0.1096f, --0.099f, 0.9692f, -0.2251f, --0.6702f, 0.4451f, 0.5938f, -0.0077f, -0.9976f, 0.0684f, --0.5661f, -0.604f, 0.5609f, --0.1096f, 0.985f, -0.1324f, --0.6096f, 0.747f, -0.265f, --0.0015f, 0.0295f, -0.9995f, -0.3476f, -0.4464f, 0.8245f, --0.0635f, -0.2552f, 0.9647f, --0.8468f, 0.4454f, 0.2904f, --0.4719f, 0.8502f, 0.233f, --0.0502f, 0.8385f, 0.5425f, --0.6671f, 0.7448f, -0.0116f, -0.3508f, -0.3415f, 0.8719f, --0.4119f, 0.6135f, -0.6736f, --0.2688f, -0.7172f, 0.6428f, --0.4041f, -0.8052f, 0.4337f, --0.375f, 0.2079f, 0.9033f, --0.0223f, -0.9986f, -0.0462f, -0.6702f, 0.4451f, -0.5938f, -0.9402f, -0.3403f, 0.0085f, -0.5661f, -0.604f, -0.5609f, --0.6252f, 0.7406f, 0.246f, --0.0341f, -0.9986f, 0.0383f, --0.6111f, 0.4984f, -0.6148f, -0.6655f, 0.7462f, 0.0117f, -0.1233f, 0.199f, 0.9722f, -0.8468f, 0.4454f, -0.2904f, -0.7383f, 0.2702f, -0.6179f, --0.8055f, 0.4452f, -0.3909f, --0.3729f, 0.208f, -0.9042f, -0.4719f, 0.8502f, -0.233f, -0.243f, 0.747f, 0.6187f, --0.6497f, -0.4127f, -0.6383f, --0.5406f, 0.5651f, -0.623f, -0.0058f, -0.4457f, 0.8951f, --0.3082f, -0.6034f, 0.7354f, --0.8655f, -0.3412f, -0.3666f, -0.2688f, -0.7172f, -0.6428f, -0.4041f, -0.8052f, -0.4337f, -0.375f, 0.2079f, -0.9033f, -0.0341f, -0.9986f, -0.0383f, --0.9701f, 0.2423f, 0.0084f, --0.3807f, -0.0681f, 0.9221f, -0.9643f, -0.2551f, 0.0705f, --0.8758f, 0.4808f, 0.0415f, -0.1207f, 0.9852f, 0.1215f, -0.4821f, 0.7724f, 0.4133f, --0.0522f, 0.9982f, 0.0278f, --0.4337f, -0.8052f, -0.4041f, --0.6164f, 0.4198f, 0.6661f, --0.8448f, 0.4045f, -0.3501f, -0.3082f, -0.6034f, -0.7354f, -0.8689f, 0.3387f, 0.3607f, -0.6894f, -0.7242f, 0.0091f, -0.3787f, 0.2424f, 0.8931f, -0.2904f, 0.4454f, 0.8468f, -0.6148f, 0.4984f, -0.6111f, -0.0501f, 0.985f, 0.1648f, --0.5397f, -0.805f, 0.2461f, --0.9159f, -0.2556f, 0.3094f, -0.706f, -0.0681f, 0.7048f, --0.3341f, 0.4972f, 0.8006f, -0.556f, -0.8049f, 0.2071f, --0.1774f, 0.9693f, -0.1697f, -0.6907f, 0.2083f, 0.6924f, -0.1263f, 0.9332f, 0.3361f, -0.3807f, -0.0681f, -0.9221f, --0.1556f, -0.9861f, -0.0578f, --0.3271f, 0.9333f, -0.1478f, --0.3465f, 0.8505f, 0.3955f, -0.5315f, 0.8438f, -0.0735f, -0.9737f, 0.2276f, -0.0003f, -0.6441f, 0.7648f, -0.0112f, --0.7239f, -0.6898f, 0.0042f, --0.7532f, 0.5939f, -0.2824f, -0.1093f, 0.1415f, -0.9838f, -0.5397f, -0.805f, -0.2461f, --0.7981f, -0.6024f, -0.0036f, -0.9456f, 0.3251f, -0.0052f, -0.1278f, 0.9696f, -0.2085f, -0.0208f, -0.8044f, 0.5936f, -0.1635f, 0.1348f, -0.9772f, --0.733f, 0.5936f, 0.3321f, --0.0505f, 0.9852f, -0.1635f, -0.4089f, -0.9069f, -0.1015f, --0.0029f, -0.9986f, -0.0514f, --0.1796f, 0.814f, -0.5522f, -0.9221f, -0.0681f, 0.3807f, -0.0383f, -0.9986f, 0.0341f, -0.6369f, -0.2562f, 0.727f, -0.3465f, 0.8505f, -0.3955f, --0.2452f, 0.9334f, -0.2615f, -0.4921f, -0.247f, 0.8346f, --0.9976f, -0.0678f, 0.0008f, --0.5396f, 0.8418f, -0.0094f, -0.2294f, 0.9692f, 0.0888f, -0.7239f, -0.6898f, -0.0042f, --0.4472f, 0.5952f, 0.6675f, --0.6449f, -0.7172f, 0.2637f, -0.4543f, 0.2732f, -0.8478f, --0.6798f, 0.2428f, 0.6919f, --0.5938f, 0.4451f, -0.6702f, -0.733f, 0.5936f, -0.3321f, --0.3955f, 0.8505f, -0.3465f, --0.5139f, -0.6913f, -0.5078f, --0.623f, -0.5156f, -0.5881f -}; - -/* 1 color */ -/*255 255 0 */ - -/* 1024 faces */ -/* numIdx fidx0 fidx1 fidx2 nidx0 nidx1 nidx2 coloridx */ - -const int numFaces = 1024; -const int faces[1024][8] = { -3, 0, 5, 6, 255, 295, 309, 0, -3, 6, 1, 0, 309, 465, 255, 0, -3, 1, 6, 7, 465, 309, 134, 0, -3, 7, 2, 1, 134, 4, 465, 0, -3, 2, 7, 8, 4, 134, 165, 0, -3, 8, 3, 2, 165, 448, 4, 0, -3, 3, 8, 9, 448, 165, 49, 0, -3, 9, 4, 3, 49, 116, 448, 0, -3, 5, 10, 11, 295, 248, 106, 0, -3, 11, 6, 5, 106, 309, 295, 0, -3, 6, 11, 12, 309, 106, 102, 0, -3, 12, 7, 6, 102, 134, 309, 0, -3, 7, 12, 13, 134, 102, 394, 0, -3, 13, 8, 7, 394, 165, 134, 0, -3, 8, 13, 14, 165, 394, 180, 0, -3, 14, 9, 8, 180, 49, 165, 0, -3, 10, 15, 16, 248, 401, 211, 0, -3, 16, 11, 10, 211, 106, 248, 0, -3, 11, 16, 17, 106, 211, 427, 0, -3, 17, 12, 11, 427, 102, 106, 0, -3, 12, 17, 18, 102, 427, 455, 0, -3, 18, 13, 12, 455, 394, 102, 0, -3, 13, 18, 19, 394, 455, 74, 0, -3, 19, 14, 13, 74, 180, 394, 0, -3, 15, 20, 21, 401, 174, 182, 0, -3, 21, 16, 15, 182, 211, 401, 0, -3, 16, 21, 22, 211, 182, 507, 0, -3, 22, 17, 16, 507, 427, 211, 0, -3, 17, 22, 23, 427, 507, 5, 0, -3, 23, 18, 17, 5, 455, 427, 0, -3, 18, 23, 24, 455, 5, 234, 0, -3, 24, 19, 18, 234, 74, 455, 0, -3, 20, 25, 26, 174, 386, 20, 0, -3, 26, 21, 20, 20, 182, 174, 0, -3, 21, 26, 27, 182, 20, 410, 0, -3, 27, 22, 21, 410, 507, 182, 0, -3, 22, 27, 28, 507, 410, 23, 0, -3, 28, 23, 22, 23, 5, 507, 0, -3, 23, 28, 29, 5, 23, 485, 0, -3, 29, 24, 23, 485, 234, 5, 0, -3, 25, 30, 31, 386, 69, 305, 0, -3, 31, 26, 25, 305, 20, 386, 0, -3, 26, 31, 32, 20, 305, 503, 0, -3, 32, 27, 26, 503, 410, 20, 0, -3, 27, 32, 33, 410, 503, 405, 0, -3, 33, 28, 27, 405, 23, 410, 0, -3, 28, 33, 34, 23, 405, 138, 0, -3, 34, 29, 28, 138, 485, 23, 0, -3, 30, 35, 36, 69, 115, 193, 0, -3, 36, 31, 30, 193, 305, 69, 0, -3, 31, 36, 37, 305, 193, 270, 0, -3, 37, 32, 31, 270, 503, 305, 0, -3, 32, 37, 38, 503, 270, 445, 0, -3, 38, 33, 32, 445, 405, 503, 0, -3, 33, 38, 39, 405, 445, 28, 0, -3, 39, 34, 33, 28, 138, 405, 0, -3, 35, 40, 41, 115, 467, 495, 0, -3, 41, 36, 35, 495, 193, 115, 0, -3, 36, 41, 42, 193, 495, 11, 0, -3, 42, 37, 36, 11, 270, 193, 0, -3, 37, 42, 43, 270, 11, 435, 0, -3, 43, 38, 37, 435, 445, 270, 0, -3, 38, 43, 44, 445, 435, 322, 0, -3, 44, 39, 38, 322, 28, 445, 0, -3, 40, 45, 46, 467, 27, 44, 0, -3, 46, 41, 40, 44, 495, 467, 0, -3, 41, 46, 47, 495, 44, 409, 0, -3, 47, 42, 41, 409, 11, 495, 0, -3, 42, 47, 48, 11, 409, 428, 0, -3, 48, 43, 42, 428, 435, 11, 0, -3, 43, 48, 49, 435, 428, 313, 0, -3, 49, 44, 43, 313, 322, 435, 0, -3, 45, 50, 51, 27, 513, 385, 0, -3, 51, 46, 45, 385, 44, 27, 0, -3, 46, 51, 52, 44, 385, 382, 0, -3, 52, 47, 46, 382, 409, 44, 0, -3, 47, 52, 53, 409, 382, 124, 0, -3, 53, 48, 47, 124, 428, 409, 0, -3, 48, 53, 54, 428, 124, 447, 0, -3, 54, 49, 48, 447, 313, 428, 0, -3, 50, 55, 56, 513, 136, 478, 0, -3, 56, 51, 50, 478, 385, 513, 0, -3, 51, 56, 57, 385, 478, 161, 0, -3, 57, 52, 51, 161, 382, 385, 0, -3, 52, 57, 58, 382, 161, 181, 0, -3, 58, 53, 52, 181, 124, 382, 0, -3, 53, 58, 59, 124, 181, 348, 0, -3, 59, 54, 53, 348, 447, 124, 0, -3, 55, 60, 61, 136, 431, 320, 0, -3, 61, 56, 55, 320, 478, 136, 0, -3, 56, 61, 62, 478, 320, 481, 0, -3, 62, 57, 56, 481, 161, 478, 0, -3, 57, 62, 63, 161, 481, 53, 0, -3, 63, 58, 57, 53, 181, 161, 0, -3, 58, 63, 64, 181, 53, 257, 0, -3, 64, 59, 58, 257, 348, 181, 0, -3, 60, 65, 66, 431, 135, 37, 0, -3, 66, 61, 60, 37, 320, 431, 0, -3, 61, 66, 67, 320, 37, 408, 0, -3, 67, 62, 61, 408, 481, 320, 0, -3, 62, 67, 68, 481, 408, 347, 0, -3, 68, 63, 62, 347, 53, 481, 0, -3, 63, 68, 69, 53, 347, 104, 0, -3, 69, 64, 63, 104, 257, 53, 0, -3, 65, 70, 71, 135, 191, 524, 0, -3, 71, 66, 65, 524, 37, 135, 0, -3, 66, 71, 72, 37, 524, 319, 0, -3, 72, 67, 66, 319, 408, 37, 0, -3, 67, 72, 73, 408, 319, 183, 0, -3, 73, 68, 67, 183, 347, 408, 0, -3, 68, 73, 74, 347, 183, 480, 0, -3, 74, 69, 68, 480, 104, 347, 0, -3, 70, 75, 76, 191, 483, 328, 0, -3, 76, 71, 70, 328, 524, 191, 0, -3, 71, 76, 77, 524, 328, 422, 0, -3, 77, 72, 71, 422, 319, 524, 0, -3, 72, 77, 78, 319, 422, 151, 0, -3, 78, 73, 72, 151, 183, 319, 0, -3, 73, 78, 79, 183, 151, 273, 0, -3, 79, 74, 73, 273, 480, 183, 0, -3, 75, 0, 1, 483, 255, 465, 0, -3, 1, 76, 75, 465, 328, 483, 0, -3, 76, 1, 2, 328, 465, 4, 0, -3, 2, 77, 76, 4, 422, 328, 0, -3, 77, 2, 3, 422, 4, 448, 0, -3, 3, 78, 77, 448, 151, 422, 0, -3, 78, 3, 4, 151, 448, 116, 0, -3, 4, 79, 78, 116, 273, 151, 0, -3, 4, 9, 84, 116, 49, 220, 0, -3, 84, 80, 4, 220, 131, 116, 0, -3, 80, 84, 85, 131, 220, 476, 0, -3, 85, 81, 80, 476, 26, 131, 0, -3, 81, 85, 86, 26, 476, 38, 0, -3, 86, 82, 81, 38, 336, 26, 0, -3, 82, 86, 87, 336, 38, 511, 0, -3, 87, 83, 82, 511, 1, 336, 0, -3, 9, 14, 88, 49, 180, 103, 0, -3, 88, 84, 9, 103, 220, 49, 0, -3, 84, 88, 89, 220, 103, 62, 0, -3, 89, 85, 84, 62, 476, 220, 0, -3, 85, 89, 90, 476, 62, 488, 0, -3, 90, 86, 85, 488, 38, 476, 0, -3, 86, 90, 91, 38, 488, 484, 0, -3, 91, 87, 86, 484, 511, 38, 0, -3, 14, 19, 92, 180, 74, 78, 0, -3, 92, 88, 14, 78, 103, 180, 0, -3, 88, 92, 93, 103, 78, 154, 0, -3, 93, 89, 88, 154, 62, 103, 0, -3, 89, 93, 94, 62, 154, 190, 0, -3, 94, 90, 89, 190, 488, 62, 0, -3, 90, 94, 95, 488, 190, 417, 0, -3, 95, 91, 90, 417, 484, 488, 0, -3, 19, 24, 96, 74, 234, 81, 0, -3, 96, 92, 19, 81, 78, 74, 0, -3, 92, 96, 97, 78, 81, 274, 0, -3, 97, 93, 92, 274, 154, 78, 0, -3, 93, 97, 98, 154, 274, 363, 0, -3, 98, 94, 93, 363, 190, 154, 0, -3, 94, 98, 99, 190, 363, 304, 0, -3, 99, 95, 94, 304, 417, 190, 0, -3, 24, 29, 100, 234, 485, 287, 0, -3, 100, 96, 24, 287, 81, 234, 0, -3, 96, 100, 101, 81, 287, 398, 0, -3, 101, 97, 96, 398, 274, 81, 0, -3, 97, 101, 102, 274, 398, 440, 0, -3, 102, 98, 97, 440, 363, 274, 0, -3, 98, 102, 103, 363, 440, 466, 0, -3, 103, 99, 98, 466, 304, 363, 0, -3, 29, 34, 104, 485, 138, 268, 0, -3, 104, 100, 29, 268, 287, 485, 0, -3, 100, 104, 105, 287, 268, 252, 0, -3, 105, 101, 100, 252, 398, 287, 0, -3, 101, 105, 106, 398, 252, 141, 0, -3, 106, 102, 101, 141, 440, 398, 0, -3, 102, 106, 107, 440, 141, 18, 0, -3, 107, 103, 102, 18, 466, 440, 0, -3, 34, 39, 108, 138, 28, 357, 0, -3, 108, 104, 34, 357, 268, 138, 0, -3, 104, 108, 109, 268, 357, 127, 0, -3, 109, 105, 104, 127, 252, 268, 0, -3, 105, 109, 110, 252, 127, 228, 0, -3, 110, 106, 105, 228, 141, 252, 0, -3, 106, 110, 111, 141, 228, 33, 0, -3, 111, 107, 106, 33, 18, 141, 0, -3, 39, 44, 112, 28, 322, 396, 0, -3, 112, 108, 39, 396, 357, 28, 0, -3, 108, 112, 113, 357, 396, 294, 0, -3, 113, 109, 108, 294, 127, 357, 0, -3, 109, 113, 114, 127, 294, 56, 0, -3, 114, 110, 109, 56, 228, 127, 0, -3, 110, 114, 115, 228, 56, 517, 0, -3, 115, 111, 110, 517, 33, 228, 0, -3, 44, 49, 116, 322, 313, 474, 0, -3, 116, 112, 44, 474, 396, 322, 0, -3, 112, 116, 117, 396, 474, 208, 0, -3, 117, 113, 112, 208, 294, 396, 0, -3, 113, 117, 118, 294, 208, 301, 0, -3, 118, 114, 113, 301, 56, 294, 0, -3, 114, 118, 119, 56, 301, 242, 0, -3, 119, 115, 114, 242, 517, 56, 0, -3, 49, 54, 120, 313, 447, 377, 0, -3, 120, 116, 49, 377, 474, 313, 0, -3, 116, 120, 121, 474, 377, 333, 0, -3, 121, 117, 116, 333, 208, 474, 0, -3, 117, 121, 122, 208, 333, 222, 0, -3, 122, 118, 117, 222, 301, 208, 0, -3, 118, 122, 123, 301, 222, 218, 0, -3, 123, 119, 118, 218, 242, 301, 0, -3, 54, 59, 124, 447, 348, 350, 0, -3, 124, 120, 54, 350, 377, 447, 0, -3, 120, 124, 125, 377, 350, 420, 0, -3, 125, 121, 120, 420, 333, 377, 0, -3, 121, 125, 126, 333, 420, 453, 0, -3, 126, 122, 121, 453, 222, 333, 0, -3, 122, 126, 127, 222, 453, 147, 0, -3, 127, 123, 122, 147, 218, 222, 0, -3, 59, 64, 128, 348, 257, 95, 0, -3, 128, 124, 59, 95, 350, 348, 0, -3, 124, 128, 129, 350, 95, 293, 0, -3, 129, 125, 124, 293, 420, 350, 0, -3, 125, 129, 130, 420, 293, 378, 0, -3, 130, 126, 125, 378, 453, 420, 0, -3, 126, 130, 131, 453, 378, 29, 0, -3, 131, 127, 126, 29, 147, 453, 0, -3, 64, 69, 132, 257, 104, 311, 0, -3, 132, 128, 64, 311, 95, 257, 0, -3, 128, 132, 133, 95, 311, 419, 0, -3, 133, 129, 128, 419, 293, 95, 0, -3, 129, 133, 134, 293, 419, 463, 0, -3, 134, 130, 129, 463, 378, 293, 0, -3, 130, 134, 135, 378, 463, 490, 0, -3, 135, 131, 130, 490, 29, 378, 0, -3, 69, 74, 136, 104, 480, 284, 0, -3, 136, 132, 69, 284, 311, 104, 0, -3, 132, 136, 137, 311, 284, 269, 0, -3, 137, 133, 132, 269, 419, 311, 0, -3, 133, 137, 138, 419, 269, 164, 0, -3, 138, 134, 133, 164, 463, 419, 0, -3, 134, 138, 139, 463, 164, 45, 0, -3, 139, 135, 134, 45, 490, 463, 0, -3, 74, 79, 140, 480, 273, 371, 0, -3, 140, 136, 74, 371, 284, 480, 0, -3, 136, 140, 141, 284, 371, 148, 0, -3, 141, 137, 136, 148, 269, 284, 0, -3, 137, 141, 142, 269, 148, 251, 0, -3, 142, 138, 137, 251, 164, 269, 0, -3, 138, 142, 143, 164, 251, 54, 0, -3, 143, 139, 138, 54, 45, 164, 0, -3, 79, 4, 80, 273, 116, 131, 0, -3, 80, 140, 79, 131, 371, 273, 0, -3, 140, 80, 81, 371, 131, 26, 0, -3, 81, 141, 140, 26, 148, 371, 0, -3, 141, 81, 82, 148, 26, 336, 0, -3, 82, 142, 141, 336, 251, 148, 0, -3, 142, 82, 83, 251, 336, 1, 0, -3, 83, 143, 142, 1, 54, 251, 0, -3, 83, 87, 148, 1, 511, 404, 0, -3, 148, 144, 83, 404, 276, 1, 0, -3, 144, 148, 149, 276, 404, 308, 0, -3, 149, 145, 144, 308, 520, 276, 0, -3, 145, 149, 150, 520, 308, 325, 0, -3, 150, 146, 145, 325, 395, 520, 0, -3, 146, 150, 151, 395, 325, 384, 0, -3, 151, 147, 146, 384, 246, 395, 0, -3, 87, 91, 152, 511, 484, 47, 0, -3, 152, 148, 87, 47, 404, 511, 0, -3, 148, 152, 153, 404, 47, 272, 0, -3, 153, 149, 148, 272, 308, 404, 0, -3, 149, 153, 154, 308, 272, 415, 0, -3, 154, 150, 149, 415, 325, 308, 0, -3, 150, 154, 155, 325, 415, 83, 0, -3, 155, 151, 150, 83, 384, 325, 0, -3, 91, 95, 156, 484, 417, 430, 0, -3, 156, 152, 91, 430, 47, 484, 0, -3, 152, 156, 157, 47, 430, 137, 0, -3, 157, 153, 152, 137, 272, 47, 0, -3, 153, 157, 158, 272, 137, 416, 0, -3, 158, 154, 153, 416, 415, 272, 0, -3, 154, 158, 159, 415, 416, 297, 0, -3, 159, 155, 154, 297, 83, 415, 0, -3, 95, 99, 160, 417, 304, 458, 0, -3, 160, 156, 95, 458, 430, 417, 0, -3, 156, 160, 161, 430, 458, 343, 0, -3, 161, 157, 156, 343, 137, 430, 0, -3, 157, 161, 162, 137, 343, 334, 0, -3, 162, 158, 157, 334, 416, 137, 0, -3, 158, 162, 163, 416, 334, 317, 0, -3, 163, 159, 158, 317, 297, 416, 0, -3, 99, 103, 164, 304, 466, 187, 0, -3, 164, 160, 99, 187, 458, 304, 0, -3, 160, 164, 165, 458, 187, 117, 0, -3, 165, 161, 160, 117, 343, 458, 0, -3, 161, 165, 166, 343, 117, 438, 0, -3, 166, 162, 161, 438, 334, 343, 0, -3, 162, 166, 167, 334, 438, 459, 0, -3, 167, 163, 162, 459, 317, 334, 0, -3, 103, 107, 168, 466, 18, 353, 0, -3, 168, 164, 103, 353, 187, 466, 0, -3, 164, 168, 169, 187, 353, 123, 0, -3, 169, 165, 164, 123, 117, 187, 0, -3, 165, 169, 170, 117, 123, 168, 0, -3, 170, 166, 165, 168, 438, 117, 0, -3, 166, 170, 171, 438, 168, 426, 0, -3, 171, 167, 166, 426, 459, 438, 0, -3, 107, 111, 172, 18, 33, 390, 0, -3, 172, 168, 107, 390, 353, 18, 0, -3, 168, 172, 173, 353, 390, 290, 0, -3, 173, 169, 168, 290, 123, 353, 0, -3, 169, 173, 174, 123, 290, 522, 0, -3, 174, 170, 169, 522, 168, 123, 0, -3, 170, 174, 175, 168, 522, 87, 0, -3, 175, 171, 170, 87, 426, 168, 0, -3, 111, 115, 176, 33, 517, 260, 0, -3, 176, 172, 111, 260, 390, 33, 0, -3, 172, 176, 177, 390, 260, 497, 0, -3, 177, 173, 172, 497, 290, 390, 0, -3, 173, 177, 178, 290, 497, 126, 0, -3, 178, 174, 173, 126, 522, 290, 0, -3, 174, 178, 179, 522, 126, 501, 0, -3, 179, 175, 174, 501, 87, 522, 0, -3, 115, 119, 180, 517, 242, 130, 0, -3, 180, 176, 115, 130, 260, 517, 0, -3, 176, 180, 181, 260, 130, 34, 0, -3, 181, 177, 176, 34, 497, 260, 0, -3, 177, 181, 182, 497, 34, 46, 0, -3, 182, 178, 177, 46, 126, 497, 0, -3, 178, 182, 183, 126, 46, 105, 0, -3, 183, 179, 178, 105, 501, 126, 0, -3, 119, 123, 184, 242, 218, 310, 0, -3, 184, 180, 119, 310, 130, 242, 0, -3, 180, 184, 185, 130, 310, 528, 0, -3, 185, 181, 180, 528, 34, 130, 0, -3, 181, 185, 186, 34, 528, 145, 0, -3, 186, 182, 181, 145, 46, 34, 0, -3, 182, 186, 187, 46, 145, 356, 0, -3, 187, 183, 182, 356, 105, 46, 0, -3, 123, 127, 188, 218, 147, 156, 0, -3, 188, 184, 123, 156, 310, 218, 0, -3, 184, 188, 189, 310, 156, 402, 0, -3, 189, 185, 184, 402, 528, 310, 0, -3, 185, 189, 190, 528, 402, 146, 0, -3, 190, 186, 185, 146, 145, 528, 0, -3, 186, 190, 191, 145, 146, 17, 0, -3, 191, 187, 186, 17, 356, 145, 0, -3, 127, 131, 192, 147, 29, 184, 0, -3, 192, 188, 127, 184, 156, 147, 0, -3, 188, 192, 193, 156, 184, 63, 0, -3, 193, 189, 188, 63, 402, 156, 0, -3, 189, 193, 194, 402, 63, 354, 0, -3, 194, 190, 189, 354, 146, 402, 0, -3, 190, 194, 195, 146, 354, 335, 0, -3, 195, 191, 190, 335, 17, 146, 0, -3, 131, 135, 196, 29, 490, 210, 0, -3, 196, 192, 131, 210, 184, 29, 0, -3, 192, 196, 197, 184, 210, 129, 0, -3, 197, 193, 192, 129, 63, 184, 0, -3, 193, 197, 198, 63, 129, 461, 0, -3, 198, 194, 193, 461, 354, 63, 0, -3, 194, 198, 199, 354, 461, 475, 0, -3, 199, 195, 194, 475, 335, 354, 0, -3, 135, 139, 200, 490, 45, 370, 0, -3, 200, 196, 135, 370, 210, 490, 0, -3, 196, 200, 201, 210, 370, 143, 0, -3, 201, 197, 196, 143, 129, 210, 0, -3, 197, 201, 202, 129, 143, 195, 0, -3, 202, 198, 197, 195, 461, 129, 0, -3, 198, 202, 203, 461, 195, 444, 0, -3, 203, 199, 198, 444, 475, 461, 0, -3, 139, 143, 204, 45, 54, 403, 0, -3, 204, 200, 139, 403, 370, 45, 0, -3, 200, 204, 205, 370, 403, 315, 0, -3, 205, 201, 200, 315, 143, 370, 0, -3, 201, 205, 206, 143, 315, 7, 0, -3, 206, 202, 201, 7, 195, 143, 0, -3, 202, 206, 207, 195, 7, 101, 0, -3, 207, 203, 202, 101, 444, 195, 0, -3, 143, 83, 144, 54, 1, 276, 0, -3, 144, 204, 143, 276, 403, 54, 0, -3, 204, 144, 145, 403, 276, 520, 0, -3, 145, 205, 204, 520, 315, 403, 0, -3, 205, 145, 146, 315, 520, 395, 0, -3, 146, 206, 205, 395, 7, 315, 0, -3, 206, 146, 147, 7, 395, 246, 0, -3, 147, 207, 206, 246, 101, 7, 0, -3, 147, 151, 212, 246, 384, 486, 0, -3, 212, 208, 147, 486, 279, 246, 0, -3, 208, 212, 213, 279, 486, 231, 0, -3, 213, 209, 208, 231, 349, 279, 0, -3, 209, 213, 214, 349, 231, 0, 0, -3, 214, 210, 209, 0, 216, 349, 0, -3, 210, 214, 211, 216, 0, 393, 0, -3, 211, 211, 210, 393, 393, 216, 0, -3, 151, 155, 215, 384, 83, 215, 0, -3, 215, 212, 151, 215, 486, 384, 0, -3, 212, 215, 216, 486, 215, 327, 0, -3, 216, 213, 212, 327, 231, 486, 0, -3, 213, 216, 217, 231, 327, 512, 0, -3, 217, 214, 213, 512, 0, 231, 0, -3, 214, 217, 211, 0, 512, 393, 0, -3, 211, 211, 214, 393, 393, 0, 0, -3, 155, 159, 218, 83, 297, 149, 0, -3, 218, 215, 155, 149, 215, 83, 0, -3, 215, 218, 219, 215, 149, 91, 0, -3, 219, 216, 215, 91, 327, 215, 0, -3, 216, 219, 220, 327, 91, 177, 0, -3, 220, 217, 216, 177, 512, 327, 0, -3, 217, 220, 211, 512, 177, 393, 0, -3, 211, 211, 217, 393, 393, 512, 0, -3, 159, 163, 221, 297, 317, 504, 0, -3, 221, 218, 159, 504, 149, 297, 0, -3, 218, 221, 222, 149, 504, 285, 0, -3, 222, 219, 218, 285, 91, 149, 0, -3, 219, 222, 223, 91, 285, 254, 0, -3, 223, 220, 219, 254, 177, 91, 0, -3, 220, 223, 211, 177, 254, 393, 0, -3, 211, 211, 220, 393, 393, 177, 0, -3, 163, 167, 224, 317, 459, 125, 0, -3, 224, 221, 163, 125, 504, 317, 0, -3, 221, 224, 225, 504, 125, 162, 0, -3, 225, 222, 221, 162, 285, 504, 0, -3, 222, 225, 226, 285, 162, 278, 0, -3, 226, 223, 222, 278, 254, 285, 0, -3, 223, 226, 211, 254, 278, 393, 0, -3, 211, 211, 223, 393, 393, 254, 0, -3, 167, 171, 227, 459, 426, 439, 0, -3, 227, 224, 167, 439, 125, 459, 0, -3, 224, 227, 228, 125, 439, 60, 0, -3, 228, 225, 224, 60, 162, 125, 0, -3, 225, 228, 229, 162, 60, 446, 0, -3, 229, 226, 225, 446, 278, 162, 0, -3, 226, 229, 211, 278, 446, 393, 0, -3, 211, 211, 226, 393, 393, 278, 0, -3, 171, 175, 230, 426, 87, 482, 0, -3, 230, 227, 171, 482, 439, 426, 0, -3, 227, 230, 231, 439, 482, 92, 0, -3, 231, 228, 227, 92, 60, 439, 0, -3, 228, 231, 232, 60, 92, 110, 0, -3, 232, 229, 228, 110, 446, 60, 0, -3, 229, 232, 211, 446, 110, 393, 0, -3, 211, 211, 229, 393, 393, 446, 0, -3, 175, 179, 233, 87, 501, 261, 0, -3, 233, 230, 175, 261, 482, 87, 0, -3, 230, 233, 234, 482, 261, 329, 0, -3, 234, 231, 230, 329, 92, 482, 0, -3, 231, 234, 235, 92, 329, 192, 0, -3, 235, 232, 231, 192, 110, 92, 0, -3, 232, 235, 211, 110, 192, 393, 0, -3, 211, 211, 232, 393, 393, 110, 0, -3, 179, 183, 236, 501, 105, 219, 0, -3, 236, 233, 179, 219, 261, 501, 0, -3, 233, 236, 237, 261, 219, 491, 0, -3, 237, 234, 233, 491, 329, 261, 0, -3, 234, 237, 238, 329, 491, 267, 0, -3, 238, 235, 234, 267, 192, 329, 0, -3, 235, 238, 211, 192, 267, 393, 0, -3, 211, 211, 235, 393, 393, 192, 0, -3, 183, 187, 239, 105, 356, 472, 0, -3, 239, 236, 183, 472, 219, 105, 0, -3, 236, 239, 240, 219, 472, 48, 0, -3, 240, 237, 236, 48, 491, 219, 0, -3, 237, 240, 241, 491, 48, 247, 0, -3, 241, 238, 237, 247, 267, 491, 0, -3, 238, 241, 211, 267, 247, 393, 0, -3, 211, 211, 238, 393, 393, 267, 0, -3, 187, 191, 242, 356, 17, 411, 0, -3, 242, 239, 187, 411, 472, 356, 0, -3, 239, 242, 243, 472, 411, 364, 0, -3, 243, 240, 239, 364, 48, 472, 0, -3, 240, 243, 244, 48, 364, 441, 0, -3, 244, 241, 240, 441, 247, 48, 0, -3, 241, 244, 211, 247, 441, 393, 0, -3, 211, 211, 241, 393, 393, 247, 0, -3, 191, 195, 245, 17, 335, 239, 0, -3, 245, 242, 191, 239, 411, 17, 0, -3, 242, 245, 246, 411, 239, 13, 0, -3, 246, 243, 242, 13, 364, 411, 0, -3, 243, 246, 247, 364, 13, 509, 0, -3, 247, 244, 243, 509, 441, 364, 0, -3, 244, 247, 211, 441, 509, 393, 0, -3, 211, 211, 244, 393, 393, 441, 0, -3, 195, 199, 248, 335, 475, 144, 0, -3, 248, 245, 195, 144, 239, 335, 0, -3, 245, 248, 249, 239, 144, 179, 0, -3, 249, 246, 245, 179, 13, 239, 0, -3, 246, 249, 250, 13, 179, 298, 0, -3, 250, 247, 246, 298, 509, 13, 0, -3, 247, 250, 211, 509, 298, 393, 0, -3, 211, 211, 247, 393, 393, 509, 0, -3, 199, 203, 251, 475, 444, 462, 0, -3, 251, 248, 199, 462, 144, 475, 0, -3, 248, 251, 252, 144, 462, 76, 0, -3, 252, 249, 248, 76, 179, 144, 0, -3, 249, 252, 253, 179, 76, 464, 0, -3, 253, 250, 249, 464, 298, 179, 0, -3, 250, 253, 211, 298, 464, 393, 0, -3, 211, 211, 250, 393, 393, 298, 0, -3, 203, 207, 254, 444, 101, 500, 0, -3, 254, 251, 203, 500, 462, 444, 0, -3, 251, 254, 255, 462, 500, 113, 0, -3, 255, 252, 251, 113, 76, 462, 0, -3, 252, 255, 256, 76, 113, 128, 0, -3, 256, 253, 252, 128, 464, 76, 0, -3, 253, 256, 211, 464, 128, 393, 0, -3, 211, 211, 253, 393, 393, 464, 0, -3, 207, 147, 208, 101, 246, 279, 0, -3, 208, 254, 207, 279, 500, 101, 0, -3, 254, 208, 209, 500, 279, 349, 0, -3, 209, 255, 254, 349, 113, 500, 0, -3, 255, 209, 210, 113, 349, 216, 0, -3, 210, 256, 255, 216, 128, 113, 0, -3, 256, 210, 211, 128, 216, 393, 0, -3, 211, 211, 256, 393, 393, 128, 0, -3, 257, 262, 263, 425, 244, 58, 0, -3, 263, 258, 257, 58, 337, 425, 0, -3, 258, 263, 264, 337, 58, 214, 0, -3, 264, 259, 258, 214, 236, 337, 0, -3, 259, 264, 265, 236, 214, 266, 0, -3, 265, 260, 259, 266, 32, 236, 0, -3, 260, 265, 266, 32, 266, 331, 0, -3, 266, 261, 260, 331, 109, 32, 0, -3, 262, 267, 268, 244, 233, 369, 0, -3, 268, 263, 262, 369, 58, 244, 0, -3, 263, 268, 269, 58, 369, 71, 0, -3, 269, 264, 263, 71, 214, 58, 0, -3, 264, 269, 270, 214, 71, 392, 0, -3, 270, 265, 264, 392, 266, 214, 0, -3, 265, 270, 271, 266, 392, 312, 0, -3, 271, 266, 265, 312, 331, 266, 0, -3, 267, 272, 273, 233, 12, 434, 0, -3, 273, 268, 267, 434, 369, 233, 0, -3, 268, 273, 274, 369, 434, 188, 0, -3, 274, 269, 268, 188, 71, 369, 0, -3, 269, 274, 275, 71, 188, 201, 0, -3, 275, 270, 269, 201, 392, 71, 0, -3, 270, 275, 276, 392, 201, 238, 0, -3, 276, 271, 270, 238, 312, 392, 0, -3, 272, 277, 278, 12, 142, 114, 0, -3, 278, 273, 272, 114, 434, 12, 0, -3, 273, 278, 279, 434, 114, 173, 0, -3, 279, 274, 273, 173, 188, 434, 0, -3, 274, 279, 280, 188, 173, 14, 0, -3, 280, 275, 274, 14, 201, 188, 0, -3, 275, 280, 281, 201, 14, 15, 0, -3, 281, 276, 275, 15, 238, 201, 0, -3, 277, 282, 283, 142, 407, 288, 0, -3, 283, 278, 277, 288, 114, 142, 0, -3, 278, 283, 284, 114, 288, 400, 0, -3, 284, 279, 278, 400, 173, 114, 0, -3, 279, 284, 285, 173, 400, 457, 0, -3, 285, 280, 279, 457, 14, 173, 0, -3, 280, 285, 286, 14, 457, 332, 0, -3, 286, 281, 280, 332, 15, 14, 0, -3, 282, 287, 288, 407, 194, 42, 0, -3, 288, 283, 282, 42, 288, 407, 0, -3, 283, 288, 289, 288, 42, 380, 0, -3, 289, 284, 283, 380, 400, 288, 0, -3, 284, 289, 290, 400, 380, 383, 0, -3, 290, 285, 284, 383, 457, 400, 0, -3, 285, 290, 291, 457, 383, 197, 0, -3, 291, 286, 285, 197, 332, 457, 0, -3, 287, 292, 293, 194, 321, 152, 0, -3, 293, 288, 287, 152, 42, 194, 0, -3, 288, 293, 294, 42, 152, 397, 0, -3, 294, 289, 288, 397, 380, 42, 0, -3, 289, 294, 295, 380, 397, 342, 0, -3, 295, 290, 289, 342, 383, 380, 0, -3, 290, 295, 296, 383, 342, 225, 0, -3, 296, 291, 290, 225, 197, 383, 0, -3, 292, 257, 258, 321, 425, 337, 0, -3, 258, 293, 292, 337, 152, 321, 0, -3, 293, 258, 259, 152, 337, 236, 0, -3, 259, 294, 293, 236, 397, 152, 0, -3, 294, 259, 260, 397, 236, 32, 0, -3, 260, 295, 294, 32, 342, 397, 0, -3, 295, 260, 261, 342, 32, 109, 0, -3, 261, 296, 295, 109, 225, 342, 0, -3, 261, 266, 301, 109, 331, 175, 0, -3, 301, 297, 261, 175, 502, 109, 0, -3, 297, 301, 302, 502, 175, 265, 0, -3, 302, 298, 297, 265, 84, 502, 0, -3, 298, 302, 303, 84, 265, 186, 0, -3, 303, 299, 298, 186, 496, 84, 0, -3, 299, 303, 304, 496, 186, 470, 0, -3, 304, 300, 299, 470, 494, 496, 0, -3, 266, 271, 305, 331, 312, 170, 0, -3, 305, 301, 266, 170, 175, 331, 0, -3, 301, 305, 306, 175, 170, 97, 0, -3, 306, 302, 301, 97, 265, 175, 0, -3, 302, 306, 307, 265, 97, 205, 0, -3, 307, 303, 302, 205, 186, 265, 0, -3, 303, 307, 308, 186, 205, 449, 0, -3, 308, 304, 303, 449, 470, 186, 0, -3, 271, 276, 309, 312, 238, 379, 0, -3, 309, 305, 271, 379, 170, 312, 0, -3, 305, 309, 310, 170, 379, 300, 0, -3, 310, 306, 305, 300, 97, 170, 0, -3, 306, 310, 311, 97, 300, 118, 0, -3, 311, 307, 306, 118, 205, 97, 0, -3, 307, 311, 312, 205, 118, 237, 0, -3, 312, 308, 307, 237, 449, 205, 0, -3, 276, 281, 313, 238, 15, 199, 0, -3, 313, 309, 276, 199, 379, 238, 0, -3, 309, 313, 314, 379, 199, 94, 0, -3, 314, 310, 309, 94, 300, 379, 0, -3, 310, 314, 315, 300, 94, 421, 0, -3, 315, 311, 310, 421, 118, 300, 0, -3, 311, 315, 316, 118, 421, 31, 0, -3, 316, 312, 311, 31, 237, 118, 0, -3, 281, 286, 317, 15, 332, 367, 0, -3, 317, 313, 281, 367, 199, 15, 0, -3, 313, 317, 318, 199, 367, 529, 0, -3, 318, 314, 313, 529, 94, 199, 0, -3, 314, 318, 319, 94, 529, 185, 0, -3, 319, 315, 314, 185, 421, 94, 0, -3, 315, 319, 320, 421, 185, 89, 0, -3, 320, 316, 315, 89, 31, 421, 0, -3, 286, 291, 321, 332, 197, 172, 0, -3, 321, 317, 286, 172, 367, 332, 0, -3, 317, 321, 322, 367, 172, 209, 0, -3, 322, 318, 317, 209, 529, 367, 0, -3, 318, 322, 323, 529, 209, 429, 0, -3, 323, 319, 318, 429, 185, 529, 0, -3, 319, 323, 324, 185, 429, 112, 0, -3, 324, 320, 319, 112, 89, 185, 0, -3, 291, 296, 325, 197, 225, 451, 0, -3, 325, 321, 291, 451, 172, 197, 0, -3, 321, 325, 326, 172, 451, 66, 0, -3, 326, 322, 321, 66, 209, 172, 0, -3, 322, 326, 327, 209, 66, 176, 0, -3, 327, 323, 322, 176, 429, 209, 0, -3, 323, 327, 328, 429, 176, 155, 0, -3, 328, 324, 323, 155, 112, 429, 0, -3, 296, 261, 297, 225, 109, 502, 0, -3, 297, 325, 296, 502, 451, 225, 0, -3, 325, 297, 298, 451, 502, 84, 0, -3, 298, 326, 325, 84, 66, 451, 0, -3, 326, 298, 299, 66, 84, 496, 0, -3, 299, 327, 326, 496, 176, 66, 0, -3, 327, 299, 300, 176, 496, 494, 0, -3, 300, 328, 327, 494, 155, 176, 0, -3, 329, 334, 335, 3, 355, 122, 0, -3, 335, 330, 329, 122, 518, 3, 0, -3, 330, 335, 336, 518, 122, 111, 0, -3, 336, 331, 330, 111, 213, 518, 0, -3, 331, 336, 337, 213, 111, 473, 0, -3, 337, 332, 331, 473, 468, 213, 0, -3, 332, 337, 338, 468, 473, 521, 0, -3, 338, 333, 332, 521, 346, 468, 0, -3, 334, 339, 340, 355, 61, 414, 0, -3, 340, 335, 334, 414, 122, 355, 0, -3, 335, 340, 341, 122, 414, 413, 0, -3, 341, 336, 335, 413, 111, 122, 0, -3, 336, 341, 342, 111, 413, 204, 0, -3, 342, 337, 336, 204, 473, 111, 0, -3, 337, 342, 343, 473, 204, 217, 0, -3, 343, 338, 337, 217, 521, 473, 0, -3, 339, 344, 345, 61, 55, 100, 0, -3, 345, 340, 339, 100, 414, 61, 0, -3, 340, 345, 346, 414, 100, 399, 0, -3, 346, 341, 340, 399, 413, 414, 0, -3, 341, 346, 347, 413, 399, 326, 0, -3, 347, 342, 341, 326, 204, 413, 0, -3, 342, 347, 348, 204, 326, 221, 0, -3, 348, 343, 342, 221, 217, 204, 0, -3, 344, 349, 350, 55, 508, 477, 0, -3, 350, 345, 344, 477, 100, 55, 0, -3, 345, 350, 351, 100, 477, 292, 0, -3, 351, 346, 345, 292, 399, 100, 0, -3, 346, 351, 352, 399, 292, 73, 0, -3, 352, 347, 346, 73, 326, 399, 0, -3, 347, 352, 353, 326, 73, 362, 0, -3, 353, 348, 347, 362, 221, 326, 0, -3, 349, 354, 355, 508, 365, 262, 0, -3, 355, 350, 349, 262, 477, 508, 0, -3, 350, 355, 356, 477, 262, 93, 0, -3, 356, 351, 350, 93, 292, 477, 0, -3, 351, 356, 357, 292, 93, 318, 0, -3, 357, 352, 351, 318, 73, 292, 0, -3, 352, 357, 358, 73, 318, 163, 0, -3, 358, 353, 352, 163, 362, 73, 0, -3, 354, 359, 360, 365, 140, 340, 0, -3, 360, 355, 354, 340, 262, 365, 0, -3, 355, 360, 361, 262, 340, 505, 0, -3, 361, 356, 355, 505, 93, 262, 0, -3, 356, 361, 362, 93, 505, 499, 0, -3, 362, 357, 356, 499, 318, 93, 0, -3, 357, 362, 363, 318, 499, 159, 0, -3, 363, 358, 357, 159, 163, 318, 0, -3, 359, 364, 365, 140, 510, 68, 0, -3, 365, 360, 359, 68, 340, 140, 0, -3, 360, 365, 366, 340, 68, 167, 0, -3, 366, 361, 360, 167, 505, 340, 0, -3, 361, 366, 367, 505, 167, 245, 0, -3, 367, 362, 361, 245, 499, 505, 0, -3, 362, 367, 368, 499, 245, 437, 0, -3, 368, 363, 362, 437, 159, 499, 0, -3, 364, 329, 330, 510, 3, 518, 0, -3, 330, 365, 364, 518, 68, 510, 0, -3, 365, 330, 331, 68, 518, 213, 0, -3, 331, 366, 365, 213, 167, 68, 0, -3, 366, 331, 332, 167, 213, 468, 0, -3, 332, 367, 366, 468, 245, 167, 0, -3, 367, 332, 333, 245, 468, 346, 0, -3, 333, 368, 367, 346, 437, 245, 0, -3, 333, 338, 373, 346, 521, 79, 0, -3, 373, 369, 333, 79, 286, 346, 0, -3, 369, 373, 374, 286, 79, 77, 0, -3, 374, 370, 369, 77, 22, 286, 0, -3, 370, 374, 375, 22, 77, 523, 0, -3, 375, 371, 370, 523, 330, 22, 0, -3, 371, 375, 376, 330, 523, 259, 0, -3, 376, 372, 371, 259, 338, 330, 0, -3, 338, 343, 377, 521, 217, 207, 0, -3, 377, 373, 338, 207, 79, 521, 0, -3, 373, 377, 378, 79, 207, 471, 0, -3, 378, 374, 373, 471, 77, 79, 0, -3, 374, 378, 379, 77, 471, 198, 0, -3, 379, 375, 374, 198, 523, 77, 0, -3, 375, 379, 380, 523, 198, 366, 0, -3, 380, 376, 375, 366, 259, 523, 0, -3, 343, 348, 381, 217, 221, 516, 0, -3, 381, 377, 343, 516, 207, 217, 0, -3, 377, 381, 382, 207, 516, 250, 0, -3, 382, 378, 377, 250, 471, 207, 0, -3, 378, 382, 383, 471, 250, 240, 0, -3, 383, 379, 378, 240, 198, 471, 0, -3, 379, 383, 384, 198, 240, 381, 0, -3, 384, 380, 379, 381, 366, 198, 0, -3, 348, 353, 385, 221, 362, 230, 0, -3, 385, 381, 348, 230, 516, 221, 0, -3, 381, 385, 386, 516, 230, 303, 0, -3, 386, 382, 381, 303, 250, 516, 0, -3, 382, 386, 387, 250, 303, 10, 0, -3, 387, 383, 382, 10, 240, 250, 0, -3, 383, 387, 388, 240, 10, 283, 0, -3, 388, 384, 383, 283, 381, 240, 0, -3, 353, 358, 389, 362, 163, 282, 0, -3, 389, 385, 353, 282, 230, 362, 0, -3, 385, 389, 390, 230, 282, 35, 0, -3, 390, 386, 385, 35, 303, 230, 0, -3, 386, 390, 391, 303, 35, 243, 0, -3, 391, 387, 386, 243, 10, 303, 0, -3, 387, 391, 392, 10, 243, 368, 0, -3, 392, 388, 387, 368, 283, 10, 0, -3, 358, 363, 393, 163, 159, 296, 0, -3, 393, 389, 358, 296, 282, 163, 0, -3, 389, 393, 394, 282, 296, 160, 0, -3, 394, 390, 389, 160, 35, 282, 0, -3, 390, 394, 395, 35, 160, 323, 0, -3, 395, 391, 390, 323, 243, 35, 0, -3, 391, 395, 396, 243, 323, 280, 0, -3, 396, 392, 391, 280, 368, 243, 0, -3, 363, 368, 397, 159, 437, 275, 0, -3, 397, 393, 363, 275, 296, 159, 0, -3, 393, 397, 398, 296, 275, 133, 0, -3, 398, 394, 393, 133, 160, 296, 0, -3, 394, 398, 399, 160, 133, 344, 0, -3, 399, 395, 394, 344, 323, 160, 0, -3, 395, 399, 400, 323, 344, 108, 0, -3, 400, 396, 395, 108, 280, 323, 0, -3, 368, 333, 369, 437, 346, 286, 0, -3, 369, 397, 368, 286, 275, 437, 0, -3, 397, 369, 370, 275, 286, 22, 0, -3, 370, 398, 397, 22, 133, 275, 0, -3, 398, 370, 371, 133, 22, 330, 0, -3, 371, 399, 398, 330, 344, 133, 0, -3, 399, 371, 372, 344, 330, 338, 0, -3, 372, 400, 399, 338, 108, 344, 0, -3, 401, 401, 406, 235, 235, 189, 0, -3, 406, 402, 401, 189, 40, 235, 0, -3, 402, 406, 407, 40, 189, 306, 0, -3, 407, 403, 402, 306, 119, 40, 0, -3, 403, 407, 408, 119, 306, 202, 0, -3, 408, 404, 403, 202, 443, 119, 0, -3, 404, 408, 409, 443, 202, 241, 0, -3, 409, 405, 404, 241, 75, 443, 0, -3, 401, 401, 410, 235, 235, 263, 0, -3, 410, 406, 401, 263, 189, 235, 0, -3, 406, 410, 411, 189, 263, 196, 0, -3, 411, 407, 406, 196, 306, 189, 0, -3, 407, 411, 412, 306, 196, 281, 0, -3, 412, 408, 407, 281, 202, 306, 0, -3, 408, 412, 413, 202, 281, 121, 0, -3, 413, 409, 408, 121, 241, 202, 0, -3, 401, 401, 414, 235, 235, 479, 0, -3, 414, 410, 401, 479, 263, 235, 0, -3, 410, 414, 415, 263, 479, 36, 0, -3, 415, 411, 410, 36, 196, 263, 0, -3, 411, 415, 416, 196, 36, 436, 0, -3, 416, 412, 411, 436, 281, 196, 0, -3, 412, 416, 417, 281, 436, 351, 0, -3, 417, 413, 412, 351, 121, 281, 0, -3, 401, 401, 418, 235, 235, 90, 0, -3, 418, 414, 401, 90, 479, 235, 0, -3, 414, 418, 419, 479, 90, 361, 0, -3, 419, 415, 414, 361, 36, 479, 0, -3, 415, 419, 420, 36, 361, 376, 0, -3, 420, 416, 415, 376, 436, 36, 0, -3, 416, 420, 421, 436, 376, 412, 0, -3, 421, 417, 416, 412, 351, 436, 0, -3, 401, 401, 422, 235, 235, 52, 0, -3, 422, 418, 401, 52, 90, 235, 0, -3, 418, 422, 423, 90, 52, 21, 0, -3, 423, 419, 418, 21, 361, 90, 0, -3, 419, 423, 424, 361, 21, 158, 0, -3, 424, 420, 419, 158, 376, 361, 0, -3, 420, 424, 425, 376, 158, 39, 0, -3, 425, 421, 420, 39, 412, 376, 0, -3, 401, 401, 426, 235, 235, 424, 0, -3, 426, 422, 401, 424, 52, 235, 0, -3, 422, 426, 427, 52, 424, 373, 0, -3, 427, 423, 422, 373, 21, 52, 0, -3, 423, 427, 428, 21, 373, 375, 0, -3, 428, 424, 423, 375, 158, 21, 0, -3, 424, 428, 429, 158, 375, 249, 0, -3, 429, 425, 424, 249, 39, 158, 0, -3, 401, 401, 430, 235, 235, 432, 0, -3, 430, 426, 401, 432, 424, 235, 0, -3, 426, 430, 431, 424, 432, 229, 0, -3, 431, 427, 426, 229, 373, 424, 0, -3, 427, 431, 432, 373, 229, 65, 0, -3, 432, 428, 427, 65, 375, 373, 0, -3, 428, 432, 433, 375, 65, 506, 0, -3, 433, 429, 428, 506, 249, 375, 0, -3, 401, 401, 434, 235, 235, 302, 0, -3, 434, 430, 401, 302, 432, 235, 0, -3, 430, 434, 435, 432, 302, 96, 0, -3, 435, 431, 430, 96, 229, 432, 0, -3, 431, 435, 436, 229, 96, 169, 0, -3, 436, 432, 431, 169, 65, 229, 0, -3, 432, 436, 437, 65, 169, 59, 0, -3, 437, 433, 432, 59, 506, 65, 0, -3, 401, 401, 438, 235, 235, 452, 0, -3, 438, 434, 401, 452, 302, 235, 0, -3, 434, 438, 439, 302, 452, 30, 0, -3, 439, 435, 434, 30, 96, 302, 0, -3, 435, 439, 440, 96, 30, 460, 0, -3, 440, 436, 435, 460, 169, 96, 0, -3, 436, 440, 441, 169, 460, 498, 0, -3, 441, 437, 436, 498, 59, 169, 0, -3, 401, 401, 442, 235, 235, 525, 0, -3, 442, 438, 401, 525, 452, 235, 0, -3, 438, 442, 443, 452, 525, 456, 0, -3, 443, 439, 438, 456, 30, 452, 0, -3, 439, 443, 444, 30, 456, 9, 0, -3, 444, 440, 439, 9, 460, 30, 0, -3, 440, 444, 445, 460, 9, 388, 0, -3, 445, 441, 440, 388, 498, 460, 0, -3, 401, 401, 446, 235, 235, 212, 0, -3, 446, 442, 401, 212, 525, 235, 0, -3, 442, 446, 447, 525, 212, 299, 0, -3, 447, 443, 442, 299, 456, 525, 0, -3, 443, 447, 448, 456, 299, 166, 0, -3, 448, 444, 443, 166, 9, 456, 0, -3, 444, 448, 449, 9, 166, 72, 0, -3, 449, 445, 444, 72, 388, 9, 0, -3, 401, 401, 450, 235, 235, 107, 0, -3, 450, 446, 401, 107, 212, 235, 0, -3, 446, 450, 451, 212, 107, 82, 0, -3, 451, 447, 446, 82, 299, 212, 0, -3, 447, 451, 452, 299, 82, 391, 0, -3, 452, 448, 447, 391, 166, 299, 0, -3, 448, 452, 453, 166, 391, 139, 0, -3, 453, 449, 448, 139, 72, 166, 0, -3, 401, 401, 454, 235, 235, 70, 0, -3, 454, 450, 401, 70, 107, 235, 0, -3, 450, 454, 455, 107, 70, 51, 0, -3, 455, 451, 450, 51, 82, 107, 0, -3, 451, 455, 456, 82, 51, 178, 0, -3, 456, 452, 451, 178, 391, 82, 0, -3, 452, 456, 457, 391, 178, 57, 0, -3, 457, 453, 452, 57, 139, 391, 0, -3, 401, 401, 458, 235, 235, 442, 0, -3, 458, 454, 401, 442, 70, 235, 0, -3, 454, 458, 459, 70, 442, 387, 0, -3, 459, 455, 454, 387, 51, 70, 0, -3, 455, 459, 460, 51, 387, 389, 0, -3, 460, 456, 455, 389, 178, 51, 0, -3, 456, 460, 461, 178, 389, 264, 0, -3, 461, 457, 456, 264, 57, 178, 0, -3, 401, 401, 462, 235, 235, 450, 0, -3, 462, 458, 401, 450, 442, 235, 0, -3, 458, 462, 463, 442, 450, 253, 0, -3, 463, 459, 458, 253, 387, 442, 0, -3, 459, 463, 464, 387, 253, 86, 0, -3, 464, 460, 459, 86, 389, 387, 0, -3, 460, 464, 465, 389, 86, 526, 0, -3, 465, 461, 460, 526, 264, 389, 0, -3, 401, 401, 402, 235, 235, 40, 0, -3, 402, 462, 401, 40, 450, 235, 0, -3, 462, 402, 403, 450, 40, 119, 0, -3, 403, 463, 462, 119, 253, 450, 0, -3, 463, 403, 404, 253, 119, 443, 0, -3, 404, 464, 463, 443, 86, 253, 0, -3, 464, 404, 405, 86, 443, 75, 0, -3, 405, 465, 464, 75, 526, 86, 0, -3, 405, 409, 470, 75, 241, 519, 0, -3, 470, 466, 405, 519, 226, 75, 0, -3, 466, 470, 471, 226, 519, 406, 0, -3, 471, 467, 466, 406, 98, 226, 0, -3, 467, 471, 472, 98, 406, 232, 0, -3, 472, 468, 467, 232, 43, 98, 0, -3, 468, 472, 473, 43, 232, 345, 0, -3, 473, 469, 468, 345, 372, 43, 0, -3, 409, 413, 474, 241, 121, 227, 0, -3, 474, 470, 409, 227, 519, 241, 0, -3, 470, 474, 475, 519, 227, 469, 0, -3, 475, 471, 470, 469, 406, 519, 0, -3, 471, 475, 476, 406, 469, 258, 0, -3, 476, 472, 471, 258, 232, 406, 0, -3, 472, 476, 477, 232, 258, 271, 0, -3, 477, 473, 472, 271, 345, 232, 0, -3, 413, 417, 478, 121, 351, 157, 0, -3, 478, 474, 413, 157, 227, 121, 0, -3, 474, 478, 479, 227, 157, 80, 0, -3, 479, 475, 474, 80, 469, 227, 0, -3, 475, 479, 480, 469, 80, 489, 0, -3, 480, 476, 475, 489, 258, 469, 0, -3, 476, 480, 481, 258, 489, 277, 0, -3, 481, 477, 476, 277, 271, 258, 0, -3, 417, 421, 482, 351, 412, 153, 0, -3, 482, 478, 417, 153, 157, 351, 0, -3, 478, 482, 483, 157, 153, 324, 0, -3, 483, 479, 478, 324, 80, 157, 0, -3, 479, 483, 484, 80, 324, 339, 0, -3, 484, 480, 479, 339, 489, 80, 0, -3, 480, 484, 485, 489, 339, 88, 0, -3, 485, 481, 480, 88, 277, 489, 0, -3, 421, 425, 486, 412, 39, 6, 0, -3, 486, 482, 421, 6, 153, 412, 0, -3, 482, 486, 487, 153, 6, 8, 0, -3, 487, 483, 482, 8, 324, 153, 0, -3, 483, 487, 488, 324, 8, 16, 0, -3, 488, 484, 483, 16, 339, 324, 0, -3, 484, 488, 489, 339, 16, 289, 0, -3, 489, 485, 484, 289, 88, 339, 0, -3, 425, 429, 490, 39, 249, 99, 0, -3, 490, 486, 425, 99, 6, 39, 0, -3, 486, 490, 491, 6, 99, 200, 0, -3, 491, 487, 486, 200, 8, 6, 0, -3, 487, 491, 492, 8, 200, 150, 0, -3, 492, 488, 487, 150, 16, 8, 0, -3, 488, 492, 493, 16, 150, 493, 0, -3, 493, 489, 488, 493, 289, 16, 0, -3, 429, 433, 494, 249, 506, 291, 0, -3, 494, 490, 429, 291, 99, 249, 0, -3, 490, 494, 495, 99, 291, 64, 0, -3, 495, 491, 490, 64, 200, 99, 0, -3, 491, 495, 496, 200, 64, 19, 0, -3, 496, 492, 491, 19, 150, 200, 0, -3, 492, 496, 497, 150, 19, 433, 0, -3, 497, 493, 492, 433, 493, 150, 0, -3, 433, 437, 498, 506, 59, 203, 0, -3, 498, 494, 433, 203, 291, 506, 0, -3, 494, 498, 499, 291, 203, 374, 0, -3, 499, 495, 494, 374, 64, 291, 0, -3, 495, 499, 500, 64, 374, 307, 0, -3, 500, 496, 495, 307, 19, 64, 0, -3, 496, 500, 501, 19, 307, 358, 0, -3, 501, 497, 496, 358, 433, 19, 0, -3, 437, 441, 502, 59, 498, 256, 0, -3, 502, 498, 437, 256, 203, 59, 0, -3, 498, 502, 503, 203, 256, 132, 0, -3, 503, 499, 498, 132, 374, 203, 0, -3, 499, 503, 504, 374, 132, 492, 0, -3, 504, 500, 499, 492, 307, 374, 0, -3, 500, 504, 505, 307, 492, 67, 0, -3, 505, 501, 500, 67, 358, 307, 0, -3, 441, 445, 506, 498, 388, 487, 0, -3, 506, 502, 441, 487, 256, 498, 0, -3, 502, 506, 507, 256, 487, 206, 0, -3, 507, 503, 502, 206, 132, 256, 0, -3, 503, 507, 508, 132, 206, 515, 0, -3, 508, 504, 503, 515, 492, 132, 0, -3, 504, 508, 509, 492, 515, 527, 0, -3, 509, 505, 504, 527, 67, 492, 0, -3, 445, 449, 510, 388, 72, 423, 0, -3, 510, 506, 445, 423, 487, 388, 0, -3, 506, 510, 511, 487, 423, 352, 0, -3, 511, 507, 506, 352, 206, 487, 0, -3, 507, 511, 512, 206, 352, 224, 0, -3, 512, 508, 507, 224, 515, 206, 0, -3, 508, 512, 513, 515, 224, 2, 0, -3, 513, 509, 508, 2, 527, 515, 0, -3, 449, 453, 514, 72, 139, 418, 0, -3, 514, 510, 449, 418, 423, 72, 0, -3, 510, 514, 515, 423, 418, 341, 0, -3, 515, 511, 510, 341, 352, 423, 0, -3, 511, 515, 516, 352, 341, 359, 0, -3, 516, 512, 511, 359, 224, 352, 0, -3, 512, 516, 517, 224, 359, 360, 0, -3, 517, 513, 512, 360, 2, 224, 0, -3, 453, 457, 518, 139, 57, 24, 0, -3, 518, 514, 453, 24, 418, 139, 0, -3, 514, 518, 519, 418, 24, 25, 0, -3, 519, 515, 514, 25, 341, 418, 0, -3, 515, 519, 520, 341, 25, 41, 0, -3, 520, 516, 515, 41, 359, 341, 0, -3, 516, 520, 521, 359, 41, 314, 0, -3, 521, 517, 516, 314, 360, 359, 0, -3, 457, 461, 522, 57, 264, 120, 0, -3, 522, 518, 457, 120, 24, 57, 0, -3, 518, 522, 523, 24, 120, 223, 0, -3, 523, 519, 518, 223, 25, 24, 0, -3, 519, 523, 524, 25, 223, 171, 0, -3, 524, 520, 519, 171, 41, 25, 0, -3, 520, 524, 525, 41, 171, 514, 0, -3, 525, 521, 520, 514, 314, 41, 0, -3, 461, 465, 526, 264, 526, 316, 0, -3, 526, 522, 461, 316, 120, 264, 0, -3, 522, 526, 527, 120, 316, 85, 0, -3, 527, 523, 522, 85, 223, 120, 0, -3, 523, 527, 528, 223, 85, 50, 0, -3, 528, 524, 523, 50, 171, 223, 0, -3, 524, 528, 529, 171, 50, 454, 0, -3, 529, 525, 524, 454, 514, 171, 0, -3, 465, 405, 466, 526, 75, 226, 0, -3, 466, 526, 465, 226, 316, 526, 0, -3, 526, 466, 467, 316, 226, 98, 0, -3, 467, 527, 526, 98, 85, 316, 0, -3, 527, 467, 468, 85, 98, 43, 0, -3, 468, 528, 527, 43, 50, 85, 0, -3, 528, 468, 469, 50, 43, 372, 0, -3, 469, 529, 528, 372, 454, 50, 0 -}; - - -const int strip_vertices[] = { -508, 508, 504, 509, 504, 505, 500, 501, 496, 497, 492, 493, 488, 489, 484, 485, 480, 481, 476, 477, 472, 473, -1, -476, 475, 480, 479, 484, 483, 488, 487, 492, 491, 496, 495, 500, 499, 504, 499, 503, 498, 502, 437, 441, -1, -527, 526, 467, 466, 471, 470, 475, 474, 479, 478, 483, 482, 487, 486, 491, 490, 495, 494, 499, 494, 498, -1, -490, 490, 425, 486, 421, 482, 417, 478, 413, 474, 409, 470, 405, 466, 465, 526, 465, 461, 460, 456, 455, 451, -1, -405, 465, 464, 460, 459, 455, 454, 450, -1, -455, 451, 450, 446, 450, 401, 454, 458, 459, 463, 464, 404, 405, 404, 409, 408, 413, 412, 417, 416, 421, 420, -1, -421, 420, 425, 420, 424, 419, 423, 418, 422, 418, 401, 414, 410, 415, 411, 416, 411, 412, 407, 408, 403, 404, 403, 463, -1, -418, 418, 414, 419, 415, 420, 416, -1, -407, 403, 402, 462, -1, -403, 463, 462, 458, 462, 401, 402, 406, 407, 406, 411, 406, 410, 401, -1, -494, 494, 498, 433, 437, 432, 436, 431, 435, 430, 434, 430, 401, 426, 422, 427, 423, 428, 424, 429, 425, 490, -1, -430, 430, 426, 431, 427, 432, 428, 433, 429, 494, 490, -1, -437, 437, 441, 436, 440, 435, 439, 434, 438, 401, 442, 446, 447, 451, 452, 456, 457, 461, 522, 526, 527, -1, -452, 448, 447, -1, -510, 445, 449, 444, 448, 443, 447, 443, 442, 443, 438, 443, 439, 444, 440, 445, 441, 506, 502, 507, 503, -1, -510, 506, 445, -1, -507, 506, 511, 510, 515, 510, 514, 449, 453, 448, 453, 452, 457, -1, -527, 523, 522, 518, 457, 518, 453, 518, 514, 519, 515, -1, -523, 519, 518, -1, -504, 503, 508, 507, 512, 511, 516, 515, 520, 519, 524, 523, 528, 527, 468, 467, 472, 471, 476, 475, -1, -472, 473, 468, 469, 528, 529, 524, 525, 520, 521, 516, 517, 512, 513, 508, 509, -1, -211, 211, 214, 210, 209, -1, -212, 215, 216, 219, 220, 223, 220, 211, 217, 214, 213, 209, 213, 208, 212, 147, -1, -220, 217, 216, 213, 212, -1, -251, 251, 248, 252, 249, 253, 250, 253, 211, 256, 210, 255, 209, 254, 208, 207, 147, 206, 147, 146, 147, 151, 212, 215, -1, -206, 206, 202, 207, 203, 254, 251, 255, 252, 256, 253, -1, -223, 223, 222, 219, 218, 215, 155, 151, 150, 146, 145, 146, 205, 206, 201, 202, 197, 202, 198, 203, 199, 251, 248, -1, -145, 149, 150, 154, 155, 159, 218, 221, 222, 225, 226, 229, -1, -204, 204, 145, 144, 149, 148, 149, 153, 154, 158, 159, 163, 221, 224, 225, 228, 229, 232, 229, 211, 226, 223, 222, -1, -224, 224, 167, 163, 162, 158, 157, 153, 152, 148, 87, 148, 83, 144, 143, 204, 139, 200, 135, 196, 131, 192, -1, -82, 83, 142, 143, 138, 139, 134, 135, 130, 131, 126, 127, 122, 123, 118, 123, 119, 184, 180, 185, 181, -1, -81, 82, 141, 142, 137, 138, 133, 134, 129, 130, 125, 126, 121, 122, 117, 118, 113, 114, 109, 110, -1, -80, 81, 140, 141, 136, 137, 132, 133, 128, 129, 124, 125, 120, 121, 116, 117, 112, 113, 108, 109, -1, -4, 80, 79, 140, 74, 136, 69, 132, 64, 128, 59, 124, 54, 120, 49, 116, 44, 112, 39, 108, -1, -79, 79, 73, 74, 68, 69, 63, 64, 58, 59, 53, 54, 48, 49, 48, 43, 42, 37, 36, 31, 30, 31, 25, -1, -42, 42, 48, 47, 53, 52, 58, 57, 63, 62, 68, 67, 73, 72, 78, 77, 3, 2, 8, 7, 13, -1, -36, 36, 42, 41, 47, 46, 52, 51, 57, 56, 62, 61, 67, 66, 72, 71, 77, 76, 2, 1, 7, -1, -66, 66, 60, 61, 55, 56, 50, 51, 45, 46, 40, 41, 35, 36, 30, -1, -31, 31, 25, 26, 20, 21, 15, 16, 10, 11, 5, 6, 0, 1, 75, 76, 70, 71, 65, 66, 60, -1, -1, 1, 7, 6, 12, 11, 17, 16, 22, 21, 27, 26, 32, 31, 32, 37, 38, 43, 44, 49, -1, -7, 7, 13, 12, 18, 17, 23, 22, 28, 27, 33, 32, 33, 38, -1, -44, 44, 38, 39, 33, 34, 28, 29, 23, 24, 18, 19, 13, 14, 8, 9, 3, 4, 78, 79, 73, -1, -39, 108, 34, 104, 29, 100, 24, 96, 19, 92, 14, 88, 9, 84, 4, 84, 80, 85, 81, 86, 81, 82, -1, -108, 109, 104, 105, 100, 101, 96, 97, 92, 93, 88, 89, 84, 85, -1, -109, 110, 105, 106, 101, 102, 97, 98, 93, 94, 89, 90, 85, 86, -1, -118, 119, 114, 115, 110, 111, 106, 107, 102, 103, 98, 99, 94, 95, 90, 91, 86, 87, 82, 83, -1, -111, 115, 176, -1, -107, 111, 172, 176, 177, -1, -103, 107, 168, 172, 173, 177, 178, -1, -99, 103, 164, 168, 169, 173, 174, 178, 179, -1, -95, 99, 160, 164, 165, 169, 170, 174, 175, 179, 233, -1, -91, 95, 156, 160, 161, 165, 166, 170, 171, 175, 230, 233, 234, -1, -87, 91, 152, 156, 157, 161, 162, 166, 167, 171, 227, 230, 231, 234, 235, 234, 238, 234, 237, 233, 236, 179, -1, -185, 185, 181, 186, 182, 187, 183, 239, 236, 240, 237, 241, 238, 211, 235, 232, 231, 228, 227, 224, 167, -1, -236, 179, 183, 178, 182, 177, 181, 176, 180, 115, 119, -1, -131, 192, 127, 188, 123, 188, 184, 189, 185, 190, 186, 191, 187, 242, 239, 243, 240, 244, 241, 244, 211, 247, -1, -192, 192, 188, 193, 189, 194, 190, 195, 191, 245, 242, 246, 243, 247, 244, -1, -211, 247, 250, 246, 249, 245, 248, 195, 199, 194, 198, 193, 197, 192, 197, 196, 201, 200, 205, 204, 145, -1, -393, 393, 394, 398, 399, 371, -1, -399, 395, 394, -1, -363, 363, 393, 397, 398, 370, 371, 375, -1, -379, 375, 374, 370, 369, 397, 368, 363, 362, -1, -396, 395, 400, 399, 372, 371, 376, 375, 380, 379, 384, 383, 388, 387, 392, 391, 396, 391, 395, 390, 394, -1, -374, 378, 379, 378, 383, 382, 387, 386, 391, 386, 390, 385, 389, 353, 358, 352, 357, 351, 356, 350, 355, -1, -341, 341, 347, 346, 352, 346, 351, 345, 350, -1, -335, 334, 340, 339, 345, 344, 350, 349, 355, 354, -1, -390, 390, 394, 389, 393, 358, 363, 357, 362, 356, 361, 355, 360, 354, 360, 359, 365, 364, 330, 329, 335, 334, -1, -345, 346, 340, 341, 335, 336, 330, 331, 365, 366, 360, 366, 361, 367, 362, 367, 368, 333, 369, 373, 374, 378, -1, -353, 353, 348, 385, 381, 386, 381, 382, 377, 378, 377, 373, 338, 333, 332, 367, 332, 366, 332, 331, 337, 336, 342, 341, 347, -1, -332, 337, 338, 343, 377, 343, 381, 343, 348, 342, 348, 347, 353, 352, -1, -337, 342, 343, -1, -314, 314, 319, 318, 323, 322, 323, 327, -1, -309, 309, 314, 313, 318, 317, 322, 321, 322, 326, 327, 299, -1, -271, 271, 309, 276, 313, 281, 317, 286, 321, 291, 321, 325, 326, 298, 299, 303, -1, -265, 265, 271, 270, 276, 275, 281, 280, 286, 285, 291, 290, 291, 296, 325, 297, 298, 302, 303, 307, -1, -259, 259, 265, 264, 270, 269, 275, 274, 280, 279, 285, 284, 290, 289, 290, 295, 296, 261, 297, 301, 302, 306, 307, 311, -1, -293, 293, 259, 258, 264, 263, 269, 268, 274, 273, 279, 278, 284, 283, 289, 288, 289, 294, 295, 260, 261, 266, -1, -309, 305, 271, 266, 265, 260, 259, 294, 293, 288, 287, 288, 282, 283, 277, 278, 272, 273, 267, 268, 262, -1, -268, 268, 262, 263, 257, 258, 292, 293, 287, -1, -261, 266, 301, 305, 306, 310, 311, 315, 316, 320, -1, -316, 316, 311, 312, 307, 308, 303, 304, 299, 300, 327, 328, 323, 324, 319, 320, 319, 315, 314, 310, 309, 305, -1 -}; - - -const int strip_normals[] = { -515, 515, 492, 527, 492, 67, 307, 358, 19, 433, 150, 493, 16, 289, 339, 88, 489, 277, 258, 271, 232, 345, -1, -258, 469, 489, 80, 339, 324, 16, 8, 150, 200, 19, 64, 307, 374, 492, 374, 132, 203, 256, 59, 498, -1, -85, 316, 98, 226, 406, 519, 469, 227, 80, 157, 324, 153, 8, 6, 200, 99, 64, 291, 374, 291, 203, -1, -99, 99, 39, 6, 412, 153, 351, 157, 121, 227, 241, 519, 75, 226, 526, 316, 526, 264, 389, 178, 51, 82, -1, -75, 526, 86, 389, 387, 51, 70, 107, -1, -51, 82, 107, 212, 107, 235, 70, 442, 387, 253, 86, 443, 75, 443, 241, 202, 121, 281, 351, 436, 412, 376, -1, -412, 376, 39, 376, 158, 361, 21, 90, 52, 90, 235, 479, 263, 36, 196, 436, 196, 281, 306, 202, 119, 443, 119, 253, -1, -90, 90, 479, 361, 36, 376, 436, -1, -306, 119, 40, 450, -1, -119, 253, 450, 442, 450, 235, 40, 189, 306, 189, 196, 189, 263, 235, -1, -291, 291, 203, 506, 59, 65, 169, 229, 96, 432, 302, 432, 235, 424, 52, 373, 21, 375, 158, 249, 39, 99, -1, -432, 432, 424, 229, 373, 65, 375, 506, 249, 291, 99, -1, -59, 59, 498, 169, 460, 96, 30, 302, 452, 235, 525, 212, 299, 82, 391, 178, 57, 264, 120, 316, 85, -1, -391, 166, 299, -1, -423, 388, 72, 9, 166, 456, 299, 456, 525, 456, 452, 456, 30, 9, 460, 388, 498, 487, 256, 206, 132, -1, -423, 487, 388, -1, -206, 487, 352, 423, 341, 423, 418, 72, 139, 166, 139, 391, 57, -1, -85, 223, 120, 24, 57, 24, 139, 24, 418, 25, 341, -1, -223, 25, 24, -1, -492, 132, 515, 206, 224, 352, 359, 341, 41, 25, 171, 223, 50, 85, 43, 98, 232, 406, 258, 469, -1, -232, 345, 43, 372, 50, 454, 171, 514, 41, 314, 359, 360, 224, 2, 515, 527, -1, -393, 393, 0, 216, 349, -1, -486, 215, 327, 91, 177, 254, 177, 393, 512, 0, 231, 349, 231, 279, 486, 246, -1, -177, 512, 327, 231, 486, -1, -462, 462, 144, 76, 179, 464, 298, 464, 393, 128, 216, 113, 349, 500, 279, 101, 246, 7, 246, 395, 246, 384, 486, 215, -1, -7, 7, 195, 101, 444, 500, 462, 113, 76, 128, 464, -1, -254, 254, 285, 91, 149, 215, 83, 384, 325, 395, 520, 395, 315, 7, 143, 195, 129, 195, 461, 444, 475, 462, 144, -1, -520, 308, 325, 415, 83, 297, 149, 504, 285, 162, 278, 446, -1, -403, 403, 520, 276, 308, 404, 308, 272, 415, 416, 297, 317, 504, 125, 162, 60, 446, 110, 446, 393, 278, 254, 285, -1, -125, 125, 459, 317, 334, 416, 137, 272, 47, 404, 511, 404, 1, 276, 54, 403, 45, 370, 490, 210, 29, 184, -1, -336, 1, 251, 54, 164, 45, 463, 490, 378, 29, 453, 147, 222, 218, 301, 218, 242, 310, 130, 528, 34, -1, -26, 336, 148, 251, 269, 164, 419, 463, 293, 378, 420, 453, 333, 222, 208, 301, 294, 56, 127, 228, -1, -131, 26, 371, 148, 284, 269, 311, 419, 95, 293, 350, 420, 377, 333, 474, 208, 396, 294, 357, 127, -1, -116, 131, 273, 371, 480, 284, 104, 311, 257, 95, 348, 350, 447, 377, 313, 474, 322, 396, 28, 357, -1, -273, 273, 183, 480, 347, 104, 53, 257, 181, 348, 124, 447, 428, 313, 428, 435, 11, 270, 193, 305, 69, 305, 386, -1, -11, 11, 428, 409, 124, 382, 181, 161, 53, 481, 347, 408, 183, 319, 151, 422, 448, 4, 165, 134, 394, -1, -193, 193, 11, 495, 409, 44, 382, 385, 161, 478, 481, 320, 408, 37, 319, 524, 422, 328, 4, 465, 134, -1, -37, 37, 431, 320, 136, 478, 513, 385, 27, 44, 467, 495, 115, 193, 69, -1, -305, 305, 386, 20, 174, 182, 401, 211, 248, 106, 295, 309, 255, 465, 483, 328, 191, 524, 135, 37, 431, -1, -465, 465, 134, 309, 102, 106, 427, 211, 507, 182, 410, 20, 503, 305, 503, 270, 445, 435, 322, 313, -1, -134, 134, 394, 102, 455, 427, 5, 507, 23, 410, 405, 503, 405, 445, -1, -322, 322, 445, 28, 405, 138, 23, 485, 5, 234, 455, 74, 394, 180, 165, 49, 448, 116, 151, 273, 183, -1, -28, 357, 138, 268, 485, 287, 234, 81, 74, 78, 180, 103, 49, 220, 116, 220, 131, 476, 26, 38, 26, 336, -1, -357, 127, 268, 252, 287, 398, 81, 274, 78, 154, 103, 62, 220, 476, -1, -127, 228, 252, 141, 398, 440, 274, 363, 154, 190, 62, 488, 476, 38, -1, -301, 242, 56, 517, 228, 33, 141, 18, 440, 466, 363, 304, 190, 417, 488, 484, 38, 511, 336, 1, -1, -33, 517, 260, -1, -18, 33, 390, 260, 497, -1, -466, 18, 353, 390, 290, 497, 126, -1, -304, 466, 187, 353, 123, 290, 522, 126, 501, -1, -417, 304, 458, 187, 117, 123, 168, 522, 87, 501, 261, -1, -484, 417, 430, 458, 343, 117, 438, 168, 426, 87, 482, 261, 329, -1, -511, 484, 47, 430, 137, 343, 334, 438, 459, 426, 439, 482, 92, 329, 192, 329, 267, 329, 491, 261, 219, 501, -1, -528, 528, 34, 145, 46, 356, 105, 472, 219, 48, 491, 247, 267, 393, 192, 110, 92, 60, 439, 125, 459, -1, -219, 501, 105, 126, 46, 497, 34, 260, 130, 517, 242, -1, -29, 184, 147, 156, 218, 156, 310, 402, 528, 146, 145, 17, 356, 411, 472, 364, 48, 441, 247, 441, 393, 509, -1, -184, 184, 156, 63, 402, 354, 146, 335, 17, 239, 411, 13, 364, 509, 441, -1, -393, 509, 298, 13, 179, 239, 144, 335, 475, 354, 461, 63, 129, 184, 129, 210, 143, 370, 315, 403, 520, -1, -296, 296, 160, 133, 344, 330, -1, -344, 323, 160, -1, -159, 159, 296, 275, 133, 22, 330, 523, -1, -198, 523, 77, 22, 286, 275, 437, 159, 499, -1, -280, 323, 108, 344, 338, 330, 259, 523, 366, 198, 381, 240, 283, 10, 368, 243, 280, 243, 323, 35, 160, -1, -77, 471, 198, 471, 240, 250, 10, 303, 243, 303, 35, 230, 282, 362, 163, 73, 318, 292, 93, 477, 262, -1, -413, 413, 326, 399, 73, 399, 292, 100, 477, -1, -122, 355, 414, 61, 100, 55, 477, 508, 262, 365, -1, -35, 35, 160, 282, 296, 163, 159, 318, 499, 93, 505, 262, 340, 365, 340, 140, 68, 510, 518, 3, 122, 355, -1, -100, 399, 414, 413, 122, 111, 518, 213, 68, 167, 340, 167, 505, 245, 499, 245, 437, 346, 286, 79, 77, 471, -1, -362, 362, 221, 230, 516, 303, 516, 250, 207, 471, 207, 79, 521, 346, 468, 245, 468, 167, 468, 213, 473, 111, 204, 413, 326, -1, -468, 473, 521, 217, 207, 217, 516, 217, 221, 204, 221, 326, 362, 73, -1, -473, 204, 217, -1, -94, 94, 185, 529, 429, 209, 429, 176, -1, -379, 379, 94, 199, 529, 367, 209, 172, 209, 66, 176, 496, -1, -312, 312, 379, 238, 199, 15, 367, 332, 172, 197, 172, 451, 66, 84, 496, 186, -1, -266, 266, 312, 392, 238, 201, 15, 14, 332, 457, 197, 383, 197, 225, 451, 502, 84, 265, 186, 205, -1, -236, 236, 266, 214, 392, 71, 201, 188, 14, 173, 457, 400, 383, 380, 383, 342, 225, 109, 502, 175, 265, 97, 205, 118, -1, -152, 152, 236, 337, 214, 58, 71, 369, 188, 434, 173, 114, 400, 288, 380, 42, 380, 397, 342, 32, 109, 331, -1, -379, 170, 312, 331, 266, 32, 236, 397, 152, 42, 194, 42, 407, 288, 142, 114, 12, 434, 233, 369, 244, -1, -369, 369, 244, 58, 425, 337, 321, 152, 194, -1, -109, 331, 175, 170, 97, 300, 118, 421, 31, 89, -1, -31, 31, 118, 237, 205, 449, 186, 470, 496, 494, 176, 155, 429, 112, 185, 89, 185, 421, 94, 300, 379, 170, -1 -}; - -#else /* defined(_WIN32_WCE) */ - -/* - * Original teapot code copyright follows: - */ - -/* - * (c) Copyright 1993, Silicon Graphics, Inc. - * - * ALL RIGHTS RESERVED - * - * Permission to use, copy, modify, and distribute this software - * for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that - * both the copyright notice and this permission notice appear in - * supporting documentation, and that the name of Silicon - * Graphics, Inc. not be used in advertising or publicity - * pertaining to distribution of the software without specific, - * written prior permission. - * - * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU - * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR - * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO - * EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE - * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, - * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, - * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR - * NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY - * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * US Government Users Restricted Rights - * - * Use, duplication, or disclosure by the Government is subject to - * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph - * (c)(1)(ii) of the Rights in Technical Data and Computer - * Software clause at DFARS 252.227-7013 and/or in similar or - * successor clauses in the FAR or the DOD or NASA FAR - * Supplement. Unpublished-- rights reserved under the copyright - * laws of the United States. Contractor/manufacturer is Silicon - * Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA - * 94039-7311. - * - * OpenGL(TM) is a trademark of Silicon Graphics, Inc. - */ - -/* - * Rim, body, lid, and bottom data must be reflected in x and y; - * handle and spout data across the y axis only. - */ -static int patchdata[][16] = -{ - { 102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* rim */ - { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }, /* body */ - { 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 }, - { 96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2, 3 }, /* lid */ - { 0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 }, - { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120, 40, 39, 38, 37 }, /* bottom */ - { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, /* handle */ - { 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66, 67 }, - { 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83 }, /* spout */ - { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 } -}; - -static double cpdata[][3] = -{ - {0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0, - -0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125}, - {0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375, - 0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375, - 2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84, - 2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875}, - {1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75, - 1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35}, - {0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2, - 0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12, - 0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225}, - {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225}, - {1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0, - -1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5, - -0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3, - 2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0, - 2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0, - 2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8}, - {-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3, - -0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3, - 1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2, - -0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0, - 1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0, - 0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66, - 0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1}, - {2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7, - -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0, - 2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375}, - {3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475}, - {3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4}, - {2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0, - 3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8, - 3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4, - -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0, - 2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4, - 2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3, - 2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4}, - {0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425, - -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425, - 0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075}, - {0.84, -1.5, 0.075} -}; - -static double tex[2][2][2] = -{ - { {0.0, 0.0}, {1.0, 0.0} }, - { {0.0, 1.0}, {1.0, 1.0} } -}; -#endif /* defined(_WIN32_WCE) */ - - -#endif /* FREEGLUT_TEAPOT_DATA_H */ - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_videoresize.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_videoresize.c deleted file mode 100644 index 4d00fb9c5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_videoresize.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * freeglut_videoresize.c - * - * Video resize functions (as defined by GLUT API) - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Thu Dec 16 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include "freeglut_internal.h" - -/* - * NOTE: functions declared in this file probably will not be implemented. - */ - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -int FGAPIENTRY glutVideoResizeGet( GLenum eWhat ) { return( 0x00 ); } -void FGAPIENTRY glutSetupVideoResizing( void ) { /* Not implemented */ } -void FGAPIENTRY glutStopVideoResizing( void ) { /* Not implemented */ } -void FGAPIENTRY glutVideoResize( int x, int y, int w, int h ) { /* Not implemented */ } -void FGAPIENTRY glutVideoPan( int x, int y, int w, int h ) { /* Not implemented */ } - -/*** END OF FILE ***/ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_window.c b/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_window.c deleted file mode 100644 index e19eaff06..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/freeglut/freeglut_window.c +++ /dev/null @@ -1,1743 +0,0 @@ -/* - * freeglut_window.c - * - * Window management methods. - * - * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. - * Written by Pawel W. Olszta, - * Creation date: Fri Dec 3 1999 - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#define FREEGLUT_BUILDING_LIB -#include -#include "freeglut_internal.h" - -#if TARGET_HOST_POSIX_X11 -#include /* LONG_MAX */ -#endif - -#if defined(_WIN32_WCE) -# include -# ifdef FREEGLUT_LIB_PRAGMAS -# pragma comment( lib, "Aygshell.lib" ) -# endif - -static wchar_t* fghWstrFromStr(const char* str) -{ - int i,len=strlen(str); - wchar_t* wstr = (wchar_t*)malloc(2*len+2); - for(i=0; i 0 ) { - ATTRIB_VAL( GLX_AUX_BUFFERS, numAuxBuffers ); - } - - if( fgState.DisplayMode & GLUT_SRGB ) { - ATTRIB_VAL( GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, True ); - } - - if (fgState.DisplayMode & GLUT_MULTISAMPLE) { - ATTRIB_VAL(GLX_SAMPLE_BUFFERS, 1); - ATTRIB_VAL(GLX_SAMPLES, fgState.SampleNumber); - } - - /* Push a terminator at the end of the list */ - ATTRIB( None ); - - { - GLXFBConfig * fbconfigArray; /* Array of FBConfigs */ - GLXFBConfig * fbconfig; /* The FBConfig we want */ - int fbconfigArraySize; /* Number of FBConfigs in the array */ - - - /* Get all FBConfigs that match "attributes". */ - fbconfigArray = glXChooseFBConfig( fgDisplay.Display, - fgDisplay.Screen, - attributes, - &fbconfigArraySize ); - - if (fbconfigArray != NULL) - { - int result; /* Returned by glXGetFBConfigAttrib, not checked. */ - - - if( wantIndexedMode ) - { - /* - * In index mode, we want the largest buffer size, i.e. visual - * depth. Here, FBConfigs are sorted by increasing buffer size - * first, so FBConfigs with the largest size come last. - */ - - int bufferSizeMin, bufferSizeMax; - - /* Get bufferSizeMin. */ - result = - glXGetFBConfigAttrib( fgDisplay.Display, - fbconfigArray[0], - GLX_BUFFER_SIZE, - &bufferSizeMin ); - /* Get bufferSizeMax. */ - result = - glXGetFBConfigAttrib( fgDisplay.Display, - fbconfigArray[fbconfigArraySize - 1], - GLX_BUFFER_SIZE, - &bufferSizeMax ); - - if (bufferSizeMax > bufferSizeMin) - { - /* - * Free and reallocate fbconfigArray, keeping only FBConfigs - * with the largest buffer size. - */ - XFree(fbconfigArray); - - /* Add buffer size token at the end of the list. */ - where--; - ATTRIB_VAL( GLX_BUFFER_SIZE, bufferSizeMax ); - ATTRIB( None ); - - fbconfigArray = glXChooseFBConfig( fgDisplay.Display, - fgDisplay.Screen, - attributes, - &fbconfigArraySize ); - } - } - - /* - * We now have an array of FBConfigs, the first one being the "best" - * one. So we should return only this FBConfig: - * - * int fbconfigXID; - * - * - pick the XID of the FBConfig we want - * result = glXGetFBConfigAttrib( fgDisplay.Display, - * fbconfigArray[0], - * GLX_FBCONFIG_ID, - * &fbconfigXID ); - * - * - free the array - * XFree(fbconfigArray); - * - * - reset "attributes" with the XID - * where = 0; - * ATTRIB_VAL( GLX_FBCONFIG_ID, fbconfigXID ); - * ATTRIB( None ); - * - * - get our FBConfig only - * fbconfig = glXChooseFBConfig( fgDisplay.Display, - * fgDisplay.Screen, - * attributes, - * &fbconfigArraySize ); - * - * However, for some configurations (for instance multisampling with - * Mesa 6.5.2 and ATI drivers), this does not work: - * glXChooseFBConfig returns NULL, whereas fbconfigXID is a valid - * XID. Further investigation is needed. - * - * So, for now, we return the whole array of FBConfigs. This should - * not produce any side effects elsewhere. - */ - fbconfig = fbconfigArray; - } - else - { - fbconfig = NULL; - } - - return fbconfig; - } -} -#endif /* TARGET_HOST_POSIX_X11 */ - -/* - * Setup the pixel format for a Win32 window - */ -#if TARGET_HOST_MS_WINDOWS -/* The following include file is available from SGI but is not standard: - * #include - * So we copy the necessary parts out of it. - * XXX: should local definitions for extensions be put in a separate include file? - */ -typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); - -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_FULL_ACCELERATION_ARB 0x2027 - -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 - -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 - -#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 - -#ifndef WGL_ARB_create_context -#define WGL_ARB_create_context 1 -#ifdef WGL_WGLEXT_PROTOTYPES -extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *); -#endif /* WGL_WGLEXT_PROTOTYPES */ -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); - -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 - -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 - -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 - -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define ERROR_INVALID_PROFILE_ARB 0x2096 -#endif - -static void fghFillContextAttributes( int *attributes ) { - int where = 0, contextFlags, contextProfile; - - if ( !fghIsLegacyContextVersionRequested() ) { - ATTRIB_VAL( WGL_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion ); - ATTRIB_VAL( WGL_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion ); - } - - contextFlags = - fghMapBit( fgState.ContextFlags, GLUT_DEBUG, WGL_CONTEXT_DEBUG_BIT_ARB ) | - fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB ); - if ( contextFlags != 0 ) { - ATTRIB_VAL( WGL_CONTEXT_FLAGS_ARB, contextFlags ); - } - - contextProfile = - fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, WGL_CONTEXT_CORE_PROFILE_BIT_ARB ) | - fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ); - if ( contextProfile != 0 ) { - ATTRIB_VAL( WGL_CONTEXT_PROFILE_MASK_ARB, contextProfile ); - } - - ATTRIB( 0 ); -} - -static int fghIsExtensionSupported( HDC hdc, const char *extension ) { - const char *pWglExtString; - PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB = - (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); - if ( wglGetEntensionsStringARB == NULL ) - { - return FALSE; - } - pWglExtString = wglGetEntensionsStringARB( hdc ); - return ( pWglExtString != NULL ) && ( strstr(pWglExtString, extension) != NULL ); -} - -void fgNewWGLCreateContext( SFG_Window* window ) -{ - HGLRC context; - int attributes[9]; - PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; - - /* If nothing fancy has been required, leave the context as it is */ - if ( fghIsLegacyContextRequested() ) - { - return; - } - - wglMakeCurrent( window->Window.Device, window->Window.Context ); - - if ( !fghIsExtensionSupported( window->Window.Device, "WGL_ARB_create_context" ) ) - { - return; - } - - /* new context creation */ - fghFillContextAttributes( attributes ); - - wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress( "wglCreateContextAttribsARB" ); - if ( wglCreateContextAttribsARB == NULL ) - { - fgError( "wglCreateContextAttribsARB not found" ); - } - - context = wglCreateContextAttribsARB( window->Window.Device, 0, attributes ); - if ( context == NULL ) - { - fghContextCreationError(); - } - - wglMakeCurrent( NULL, NULL ); - wglDeleteContext( window->Window.Context ); - window->Window.Context = context; -} - -#if !defined(_WIN32_WCE) - -static void fghFillPFD( PIXELFORMATDESCRIPTOR *ppfd, HDC hdc, unsigned char layer_type ) -{ - int flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; - if ( fgState.DisplayMode & GLUT_DOUBLE ) { - flags |= PFD_DOUBLEBUFFER; - } - if ( fgState.DisplayMode & GLUT_STEREO ) { - flags |= PFD_STEREO; - } - -#if defined(_MSC_VER) -#pragma message( "fgSetupPixelFormat(): there is still some work to do here!" ) -#endif - - /* Specify which pixel format do we opt for... */ - ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR); - ppfd->nVersion = 1; - ppfd->dwFlags = flags; - - if( fgState.DisplayMode & GLUT_INDEX ) { - ppfd->iPixelType = PFD_TYPE_COLORINDEX; - ppfd->cRedBits = 0; - ppfd->cGreenBits = 0; - ppfd->cBlueBits = 0; - ppfd->cAlphaBits = 0; - } else { - ppfd->iPixelType = PFD_TYPE_RGBA; - ppfd->cRedBits = 8; - ppfd->cGreenBits = 8; - ppfd->cBlueBits = 8; - ppfd->cAlphaBits = ( fgState.DisplayMode & GLUT_ALPHA ) ? 8 : 0; - } - - ppfd->cColorBits = 24; - ppfd->cRedShift = 0; - ppfd->cGreenShift = 0; - ppfd->cBlueShift = 0; - ppfd->cAlphaShift = 0; - ppfd->cAccumBits = 0; - ppfd->cAccumRedBits = 0; - ppfd->cAccumGreenBits = 0; - ppfd->cAccumBlueBits = 0; - ppfd->cAccumAlphaBits = 0; - - /* Hmmm, or 32/0 instead of 24/8? */ - ppfd->cDepthBits = 24; - ppfd->cStencilBits = 8; - - ppfd->cAuxBuffers = fghNumberOfAuxBuffersRequested(); - ppfd->iLayerType = layer_type; - ppfd->bReserved = 0; - ppfd->dwLayerMask = 0; - ppfd->dwVisibleMask = 0; - ppfd->dwDamageMask = 0; - - ppfd->cColorBits = (BYTE) GetDeviceCaps( hdc, BITSPIXEL ); -} - -static void fghFillPixelFormatAttributes( int *attributes, const PIXELFORMATDESCRIPTOR *ppfd ) -{ - int where = 0; - - ATTRIB_VAL( WGL_DRAW_TO_WINDOW_ARB, GL_TRUE ); - ATTRIB_VAL( WGL_SUPPORT_OPENGL_ARB, GL_TRUE ); - ATTRIB_VAL( WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB ); - - ATTRIB_VAL( WGL_COLOR_BITS_ARB, ppfd->cColorBits ); - ATTRIB_VAL( WGL_ALPHA_BITS_ARB, ppfd->cAlphaBits ); - ATTRIB_VAL( WGL_DEPTH_BITS_ARB, ppfd->cDepthBits ); - ATTRIB_VAL( WGL_STENCIL_BITS_ARB, ppfd->cStencilBits ); - - ATTRIB_VAL( WGL_DOUBLE_BUFFER_ARB, ( fgState.DisplayMode & GLUT_DOUBLE ) != 0 ); - - if ( fgState.DisplayMode & GLUT_SRGB ) { - ATTRIB_VAL( WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, TRUE ); - } - - ATTRIB_VAL( WGL_SAMPLE_BUFFERS_ARB, GL_TRUE ); - ATTRIB_VAL( WGL_SAMPLES_ARB, fgState.SampleNumber ); - ATTRIB( 0 ); -} -#endif - -GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, - unsigned char layer_type ) -{ -#if defined(_WIN32_WCE) - return GL_TRUE; -#else - PIXELFORMATDESCRIPTOR pfd; - PIXELFORMATDESCRIPTOR* ppfd = &pfd; - int pixelformat; - - fghFillPFD( ppfd, window->Window.Device, layer_type ); - pixelformat = ChoosePixelFormat( window->Window.Device, ppfd ); - - /* windows hack for multismapling/sRGB */ - if ( ( fgState.DisplayMode & GLUT_MULTISAMPLE ) || - ( fgState.DisplayMode & GLUT_SRGB ) ) - { - HGLRC rc, rc_before=wglGetCurrentContext(); - HWND hWnd; - HDC hDC, hDC_before=wglGetCurrentDC(); - WNDCLASS wndCls; - - /* create a dummy window */ - ZeroMemory(&wndCls, sizeof(wndCls)); - wndCls.lpfnWndProc = DefWindowProc; - wndCls.hInstance = fgDisplay.Instance; - wndCls.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; - wndCls.lpszClassName = _T("FREEGLUT_dummy"); - RegisterClass( &wndCls ); - - hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.Instance, 0 ); - hDC=GetDC(hWnd); - SetPixelFormat( hDC, pixelformat, ppfd ); - - rc = wglCreateContext( hDC ); - wglMakeCurrent(hDC, rc); - - if ( fghIsExtensionSupported( hDC, "WGL_ARB_multisample" ) ) - { - PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARBProc = - (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB"); - if ( wglChoosePixelFormatARBProc ) - { - int attributes[100]; - int iPixelFormat; - BOOL bValid; - float fAttributes[] = { 0, 0 }; - UINT numFormats; - fghFillPixelFormatAttributes( attributes, ppfd ); - bValid = wglChoosePixelFormatARBProc(window->Window.Device, attributes, fAttributes, 1, &iPixelFormat, &numFormats); - - if ( bValid && numFormats > 0 ) - { - pixelformat = iPixelFormat; - } - } - } - - wglMakeCurrent( hDC_before, rc_before); - wglDeleteContext(rc); - ReleaseDC(hWnd, hDC); - DestroyWindow(hWnd); - UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.Instance); - } - - return ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( window->Window.Device, pixelformat, ppfd ) ); -#endif /* defined(_WIN32_WCE) */ -} -#endif /* TARGET_HOST_MS_WINDOWS */ - -/* - * Sets the OpenGL context and the fgStructure "Current Window" pointer to - * the window structure passed in. - */ -void fgSetWindow ( SFG_Window *window ) -{ -#if TARGET_HOST_POSIX_X11 - if ( window ) - { - glXMakeContextCurrent( - fgDisplay.Display, - window->Window.Handle, - window->Window.Handle, - window->Window.Context - ); - - /* also register this window to receive spaceball events */ - fgSpaceballSetWindow(window); - } -#elif TARGET_HOST_MS_WINDOWS - if( fgStructure.CurrentWindow ) - ReleaseDC( fgStructure.CurrentWindow->Window.Handle, - fgStructure.CurrentWindow->Window.Device ); - - if ( window ) - { - window->Window.Device = GetDC( window->Window.Handle ); - wglMakeCurrent( - window->Window.Device, - window->Window.Context - ); - } -#endif - fgStructure.CurrentWindow = window; -} - - - -#if TARGET_HOST_POSIX_X11 - -#ifndef GLX_CONTEXT_MAJOR_VERSION_ARB -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#endif - -#ifndef GLX_CONTEXT_MINOR_VERSION_ARB -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#endif - -#ifndef GLX_CONTEXT_FLAGS_ARB -#define GLX_CONTEXT_FLAGS_ARB 0x2094 -#endif - -#ifndef GLX_CONTEXT_PROFILE_MASK_ARB -#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 -#endif - -#ifndef GLX_CONTEXT_DEBUG_BIT_ARB -#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 -#endif - -#ifndef GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#endif - -#ifndef GLX_CONTEXT_CORE_PROFILE_BIT_ARB -#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 -#endif - -#ifndef GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB -#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 -#endif - -#ifndef GLX_RGBA_FLOAT_TYPE -#define GLX_RGBA_FLOAT_TYPE 0x20B9 -#endif - -#ifndef GLX_RGBA_FLOAT_BIT -#define GLX_RGBA_FLOAT_BIT 0x00000004 -#endif - -static void fghFillContextAttributes( int *attributes ) { - int where = 0, contextFlags, contextProfile; - - if ( !fghIsLegacyContextVersionRequested() ) { - ATTRIB_VAL( GLX_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion ); - ATTRIB_VAL( GLX_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion ); - } - - contextFlags = - fghMapBit( fgState.ContextFlags, GLUT_DEBUG, GLX_CONTEXT_DEBUG_BIT_ARB ) | - fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB ); - if ( contextFlags != 0 ) { - ATTRIB_VAL( GLX_CONTEXT_FLAGS_ARB, contextFlags ); - } - - contextProfile = - fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB ) | - fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ); - if ( contextProfile != 0 ) { - ATTRIB_VAL( GLX_CONTEXT_PROFILE_MASK_ARB, contextProfile ); - } - - ATTRIB( 0 ); -} - -typedef GLXContext (*CreateContextAttribsProc)(Display *dpy, GLXFBConfig config, - GLXContext share_list, Bool direct, - const int *attrib_list); - -static GLXContext fghCreateNewContext( SFG_Window* window ) -{ - /* for color model calculation */ - int menu = ( window->IsMenu && !fgStructure.MenuContext ); - int index_mode = ( fgState.DisplayMode & GLUT_INDEX ); - - /* "classic" context creation */ - Display *dpy = fgDisplay.Display; - GLXFBConfig config = *(window->Window.FBConfig); - int render_type = ( !menu && index_mode ) ? GLX_COLOR_INDEX_TYPE : GLX_RGBA_TYPE; - GLXContext share_list = NULL; - Bool direct = ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT ); - GLXContext context; - - /* new context creation */ - int attributes[9]; - CreateContextAttribsProc createContextAttribs; - - /* If nothing fancy has been required, simply use the old context creation GLX API entry */ - if ( fghIsLegacyContextRequested() ) - { - context = glXCreateNewContext( dpy, config, render_type, share_list, direct ); - if ( context == NULL ) { - fghContextCreationError(); - } - return context; - } - - /* color index mode is not available anymore with OpenGL 3.0 */ - if ( render_type == GLX_COLOR_INDEX_TYPE ) { - fgWarning( "color index mode is deprecated, using RGBA mode" ); - } - - fghFillContextAttributes( attributes ); - - createContextAttribs = (CreateContextAttribsProc) fghGetProcAddress( "glXCreateContextAttribsARB" ); - if ( createContextAttribs == NULL ) { - fgError( "glXCreateContextAttribsARB not found" ); - } - - context = createContextAttribs( dpy, config, share_list, direct, attributes ); - if ( context == NULL ) { - fghContextCreationError(); - } - return context; -} -#endif - - -/* - * Opens a window. Requires a SFG_Window object created and attached - * to the freeglut structure. OpenGL context is created here. - */ -void fgOpenWindow( SFG_Window* window, const char* title, - GLboolean positionUse, int x, int y, - GLboolean sizeUse, int w, int h, - GLboolean gameMode, GLboolean isSubWindow ) -{ -#if TARGET_HOST_POSIX_X11 - XVisualInfo * visualInfo; - XSetWindowAttributes winAttr; - XTextProperty textProperty; - XSizeHints sizeHints; - XWMHints wmHints; - unsigned long mask; - unsigned int current_DisplayMode = fgState.DisplayMode ; - - /* Save the display mode if we are creating a menu window */ - if( window->IsMenu && ( ! fgStructure.MenuContext ) ) - fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB ; - - window->Window.FBConfig = fgChooseFBConfig( ); - - if( window->IsMenu && ( ! fgStructure.MenuContext ) ) - fgState.DisplayMode = current_DisplayMode ; - - if( ! window->Window.FBConfig ) - { - /* - * The "fgChooseFBConfig" returned a null meaning that the visual - * context is not available. - * Try a couple of variations to see if they will work. - */ - if( !( fgState.DisplayMode & GLUT_DOUBLE ) ) - { - fgState.DisplayMode |= GLUT_DOUBLE ; - window->Window.FBConfig = fgChooseFBConfig( ); - fgState.DisplayMode &= ~GLUT_DOUBLE; - } - - if( fgState.DisplayMode & GLUT_MULTISAMPLE ) - { - fgState.DisplayMode &= ~GLUT_MULTISAMPLE ; - window->Window.FBConfig = fgChooseFBConfig( ); - fgState.DisplayMode |= GLUT_MULTISAMPLE; - } - } - - FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.FBConfig != NULL, - "FBConfig with necessary capabilities not found", "fgOpenWindow" ); - - /* Get the X visual. */ - visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display, - *(window->Window.FBConfig) ); - - /* - * XXX HINT: the masks should be updated when adding/removing callbacks. - * XXX This might speed up message processing. Is that true? - * XXX - * XXX A: Not appreciably, but it WILL make it easier to debug. - * XXX Try tracing old GLUT and try tracing freeglut. Old GLUT - * XXX turns off events that it doesn't need and is a whole lot - * XXX more pleasant to trace. (Think mouse-motion! Tons of - * XXX ``bonus'' GUI events stream in.) - */ - winAttr.event_mask = - StructureNotifyMask | SubstructureNotifyMask | ExposureMask | - ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | - VisibilityChangeMask | EnterWindowMask | LeaveWindowMask | - PointerMotionMask | ButtonMotionMask; - winAttr.background_pixmap = None; - winAttr.background_pixel = 0; - winAttr.border_pixel = 0; - - winAttr.colormap = XCreateColormap( - fgDisplay.Display, fgDisplay.RootWindow, - visualInfo->visual, AllocNone - ); - - mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask; - - if( window->IsMenu || ( gameMode == GL_TRUE ) ) - { - winAttr.override_redirect = True; - mask |= CWOverrideRedirect; - } - - if( ! positionUse ) - x = y = -1; /* default window position */ - if( ! sizeUse ) - w = h = 300; /* default window size */ - - window->Window.Handle = XCreateWindow( - fgDisplay.Display, - window->Parent == NULL ? fgDisplay.RootWindow : - window->Parent->Window.Handle, - x, y, w, h, 0, - visualInfo->depth, InputOutput, - visualInfo->visual, mask, - &winAttr - ); - - /* - * The GLX context creation, possibly trying the direct context rendering - * or else use the current context if the user has so specified - */ - - if( window->IsMenu ) - { - /* - * If there isn't already an OpenGL rendering context for menu - * windows, make one - */ - if( !fgStructure.MenuContext ) - { - fgStructure.MenuContext = - (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) ); - fgStructure.MenuContext->MContext = fghCreateNewContext( window ); - } - - /* window->Window.Context = fgStructure.MenuContext->MContext; */ - window->Window.Context = fghCreateNewContext( window ); - } - else if( fgState.UseCurrentContext ) - { - window->Window.Context = glXGetCurrentContext( ); - - if( ! window->Window.Context ) - window->Window.Context = fghCreateNewContext( window ); - } - else - window->Window.Context = fghCreateNewContext( window ); - -#if !defined( __FreeBSD__ ) && !defined( __NetBSD__ ) - if( !glXIsDirect( fgDisplay.Display, window->Window.Context ) ) - { - if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT ) - fgError( "Unable to force direct context rendering for window '%s'", - title ); - } -#endif - - /* - * XXX Assume the new window is visible by default - * XXX Is this a safe assumption? - */ - window->State.Visible = GL_TRUE; - - sizeHints.flags = 0; - if ( positionUse ) - sizeHints.flags |= USPosition; - if ( sizeUse ) - sizeHints.flags |= USSize; - - /* - * Fill in the size hints values now (the x, y, width and height - * settings are obsolete, are there any more WMs that support them?) - * Unless the X servers actually stop supporting these, we should - * continue to fill them in. It is *not* our place to tell the user - * that they should replace a window manager that they like, and which - * works, just because *we* think that it's not "modern" enough. - */ - sizeHints.x = x; - sizeHints.y = y; - sizeHints.width = w; - sizeHints.height = h; - - wmHints.flags = StateHint; - wmHints.initial_state = fgState.ForceIconic ? IconicState : NormalState; - /* Prepare the window and iconified window names... */ - XStringListToTextProperty( (char **) &title, 1, &textProperty ); - - XSetWMProperties( - fgDisplay.Display, - window->Window.Handle, - &textProperty, - &textProperty, - 0, - 0, - &sizeHints, - &wmHints, - NULL - ); - XFree( textProperty.value ); - - XSetWMProtocols( fgDisplay.Display, window->Window.Handle, - &fgDisplay.DeleteWindow, 1 ); - - glXMakeContextCurrent( - fgDisplay.Display, - window->Window.Handle, - window->Window.Handle, - window->Window.Context - ); - - XMapWindow( fgDisplay.Display, window->Window.Handle ); - - XFree(visualInfo); - -#elif TARGET_HOST_MS_WINDOWS - - WNDCLASS wc; - DWORD flags; - DWORD exFlags = 0; - ATOM atom; - int WindowStyle = 0; - - /* Grab the window class we have registered on glutInit(): */ - atom = GetClassInfo( fgDisplay.Instance, _T("FREEGLUT"), &wc ); - FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Info Not Found", - "fgOpenWindow" ); - - if( gameMode ) - { - FREEGLUT_INTERNAL_ERROR_EXIT ( window->Parent == NULL, - "Game mode being invoked on a subwindow", - "fgOpenWindow" ); - - /* - * Set the window creation flags appropriately to make the window - * entirely visible: - */ - flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; - } - else - { - int worig = w, horig = h; - -#if !defined(_WIN32_WCE) - if ( ( ! isSubWindow ) && ( ! window->IsMenu ) ) - { - /* - * Update the window dimensions, taking account of window - * decorations. "freeglut" is to create the window with the - * outside of its border at (x,y) and with dimensions (w,h). - */ - w += (GetSystemMetrics( SM_CXSIZEFRAME ) )*2; - h += (GetSystemMetrics( SM_CYSIZEFRAME ) )*2 + - GetSystemMetrics( SM_CYCAPTION ); - } -#endif /* defined(_WIN32_WCE) */ - - if( ! positionUse ) - { - x = CW_USEDEFAULT; - y = CW_USEDEFAULT; - } - /* setting State.Width/Height to call resize callback later */ - if( ! sizeUse ) - { - if( ! window->IsMenu ) - { - w = CW_USEDEFAULT; - h = CW_USEDEFAULT; - } - else /* fail safe - Windows can make a window of size (0, 0) */ - w = h = 300; /* default window size */ - window->State.Width = window->State.Height = -1; - } - else - { - window->State.Width = worig; - window->State.Height = horig; - } - - /* - * There's a small difference between creating the top, child and - * game mode windows - */ - flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; - - if ( window->IsMenu ) - { - flags |= WS_POPUP; - exFlags |= WS_EX_TOOLWINDOW; - } -#if !defined(_WIN32_WCE) - else if( window->Parent == NULL ) - flags |= WS_OVERLAPPEDWINDOW; -#endif - else - flags |= WS_CHILD; - } - -#if defined(_WIN32_WCE) - { - wchar_t* wstr = fghWstrFromStr(title); - - window->Window.Handle = CreateWindow( - _T("FREEGLUT"), - wstr, - WS_VISIBLE | WS_POPUP, - 0,0, 240,320, - NULL, - NULL, - fgDisplay.Instance, - (LPVOID) window - ); - - free(wstr); - - SHFullScreen(window->Window.Handle, SHFS_HIDESTARTICON); - SHFullScreen(window->Window.Handle, SHFS_HIDESIPBUTTON); - SHFullScreen(window->Window.Handle, SHFS_HIDETASKBAR); - MoveWindow(window->Window.Handle, 0, 0, 240, 320, TRUE); - ShowWindow(window->Window.Handle, SW_SHOW); - UpdateWindow(window->Window.Handle); - } -#else - window->Window.Handle = CreateWindowEx( - exFlags, - _T("FREEGLUT"), - title, - flags, - x, y, w, h, - (HWND) window->Parent == NULL ? NULL : window->Parent->Window.Handle, - (HMENU) NULL, - fgDisplay.Instance, - (LPVOID) window - ); -#endif /* defined(_WIN32_WCE) */ - - if( !( window->Window.Handle ) ) - fgError( "Failed to create a window (%s)!", title ); - - /* Make a menu window always on top - fix Feature Request 947118 */ - if( window->IsMenu || gameMode ) - SetWindowPos( - window->Window.Handle, - HWND_TOPMOST, - 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE - ); - - /* Hack to remove the caption (title bar) and/or border - * and all the system menu controls. - */ - WindowStyle = GetWindowLong(window->Window.Handle, GWL_STYLE); - if ( fgState.DisplayMode & GLUT_CAPTIONLESS ) - { - SetWindowLong ( window->Window.Handle, GWL_STYLE, - WindowStyle & ~(WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)); - } - else if ( fgState.DisplayMode & GLUT_BORDERLESS ) - { - SetWindowLong ( window->Window.Handle, GWL_STYLE, - WindowStyle & ~(WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)); - } -/* SetWindowPos(window->Window.Handle, NULL, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); */ - - -#if defined(_WIN32_WCE) - ShowWindow( window->Window.Handle, SW_SHOW ); -#else - ShowWindow( window->Window.Handle, - fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW ); -#endif /* defined(_WIN32_WCE) */ - - UpdateWindow( window->Window.Handle ); - ShowCursor( TRUE ); /* XXX Old comments say "hide cursor"! */ - -#endif - - fgSetWindow( window ); - - window->Window.DoubleBuffered = - ( fgState.DisplayMode & GLUT_DOUBLE ) ? 1 : 0; - - if ( ! window->Window.DoubleBuffered ) - { - glDrawBuffer ( GL_FRONT ); - glReadBuffer ( GL_FRONT ); - } -} - -/* - * Closes a window, destroying the frame and OpenGL context - */ -void fgCloseWindow( SFG_Window* window ) -{ -#if TARGET_HOST_POSIX_X11 - - if( window->Window.Context ) - glXDestroyContext( fgDisplay.Display, window->Window.Context ); - XFree( window->Window.FBConfig ); - XDestroyWindow( fgDisplay.Display, window->Window.Handle ); - /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - /* Make sure we don't close a window with current context active */ - if( fgStructure.CurrentWindow == window ) - wglMakeCurrent( NULL, NULL ); - - /* - * Step through the list of windows. If the rendering context - * is not being used by another window, then we delete it. - */ - { - int used = FALSE ; - SFG_Window *iter ; - - for( iter = (SFG_Window *)fgStructure.Windows.First; - iter; - iter = (SFG_Window *)iter->Node.Next ) - { - if( ( iter->Window.Context == window->Window.Context ) && - ( iter != window ) ) - used = TRUE; - } - - if( ! used ) - wglDeleteContext( window->Window.Context ); - } - - DestroyWindow( window->Window.Handle ); -#endif -} - - -/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ - -/* - * Creates a new top-level freeglut window - */ -int FGAPIENTRY glutCreateWindow( const char* title ) -{ - /* XXX GLUT does not exit; it simply calls "glutInit" quietly if the - * XXX application has not already done so. The "freeglut" community - * XXX decided not to go this route (freeglut-developer e-mail from - * XXX Steve Baker, 12/16/04, 4:22 PM CST, "Re: [Freeglut-developer] - * XXX Desired 'freeglut' behaviour when there is no current window" - */ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateWindow" ); - - return fgCreateWindow( NULL, title, fgState.Position.Use, - fgState.Position.X, fgState.Position.Y, - fgState.Size.Use, fgState.Size.X, fgState.Size.Y, - GL_FALSE, GL_FALSE )->ID; -} - -#if TARGET_HOST_MS_WINDOWS -int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) ) -{ - __glutExitFunc = exit_function; - return glutCreateWindow( title ); -} -#endif - -/* - * This function creates a sub window. - */ -int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h ) -{ - int ret = 0; - SFG_Window* window = NULL; - SFG_Window* parent = NULL; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateSubWindow" ); - parent = fgWindowByID( parentID ); - freeglut_return_val_if_fail( parent != NULL, 0 ); - if ( x < 0 ) - { - x = parent->State.Width + x ; - if ( w >= 0 ) x -= w ; - } - - if ( w < 0 ) w = parent->State.Width - x + w ; - if ( w < 0 ) - { - x += w ; - w = -w ; - } - - if ( y < 0 ) - { - y = parent->State.Height + y ; - if ( h >= 0 ) y -= h ; - } - - if ( h < 0 ) h = parent->State.Height - y + h ; - if ( h < 0 ) - { - y += h ; - h = -h ; - } - - window = fgCreateWindow( parent, "", GL_TRUE, x, y, GL_TRUE, w, h, GL_FALSE, GL_FALSE ); - ret = window->ID; - - return ret; -} - -/* - * Destroys a window and all of its subwindows - */ -void FGAPIENTRY glutDestroyWindow( int windowID ) -{ - SFG_Window* window; - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyWindow" ); - window = fgWindowByID( windowID ); - freeglut_return_if_fail( window != NULL ); - { - fgExecutionState ExecState = fgState.ExecState; - fgAddToWindowDestroyList( window ); - fgState.ExecState = ExecState; - } -} - -/* - * This function selects the current window - */ -void FGAPIENTRY glutSetWindow( int ID ) -{ - SFG_Window* window = NULL; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindow" ); - if( fgStructure.CurrentWindow != NULL ) - if( fgStructure.CurrentWindow->ID == ID ) - return; - - window = fgWindowByID( ID ); - if( window == NULL ) - { - fgWarning( "glutSetWindow(): window ID %d not found!", ID ); - return; - } - - fgSetWindow( window ); -} - -/* - * This function returns the ID number of the current window, 0 if none exists - */ -int FGAPIENTRY glutGetWindow( void ) -{ - SFG_Window *win = fgStructure.CurrentWindow; - /* - * Since GLUT did not throw an error if this function was called without a prior call to - * "glutInit", this function shouldn't do so here. Instead let us return a zero. - * See Feature Request "[ 1307049 ] glutInit check". - */ - if ( ! fgState.Initialised ) - return 0; - - while ( win && win->IsMenu ) - win = win->Parent; - return win ? win->ID : 0; -} - -/* - * This function makes the current window visible - */ -void FGAPIENTRY glutShowWindow( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" ); - -#if TARGET_HOST_POSIX_X11 - - XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW ); - -#endif - - fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; -} - -/* - * This function hides the current window - */ -void FGAPIENTRY glutHideWindow( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" ); - -#if TARGET_HOST_POSIX_X11 - - if( fgStructure.CurrentWindow->Parent == NULL ) - XWithdrawWindow( fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - fgDisplay.Screen ); - else - XUnmapWindow( fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE ); - -#endif - - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; -} - -/* - * Iconify the current window (top-level windows only) - */ -void FGAPIENTRY glutIconifyWindow( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIconifyWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" ); - - fgStructure.CurrentWindow->State.Visible = GL_FALSE; -#if TARGET_HOST_POSIX_X11 - - XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, - fgDisplay.Screen ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE ); - -#endif - - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; -} - -/* - * Set the current window's title - */ -void FGAPIENTRY glutSetWindowTitle( const char* title ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowTitle" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" ); - if( ! fgStructure.CurrentWindow->Parent ) - { -#if TARGET_HOST_POSIX_X11 - - XTextProperty text; - - text.value = (unsigned char *) title; - text.encoding = XA_STRING; - text.format = 8; - text.nitems = strlen( title ); - - XSetWMName( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &text - ); - - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS -# ifdef _WIN32_WCE - { - wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); - free(wstr); - } -# else - SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); -# endif - -#endif - } -} - -/* - * Set the current window's iconified title - */ -void FGAPIENTRY glutSetIconTitle( const char* title ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetIconTitle" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetIconTitle" ); - - if( ! fgStructure.CurrentWindow->Parent ) - { -#if TARGET_HOST_POSIX_X11 - - XTextProperty text; - - text.value = (unsigned char *) title; - text.encoding = XA_STRING; - text.format = 8; - text.nitems = strlen( title ); - - XSetWMIconName( - fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &text - ); - - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS -# ifdef _WIN32_WCE - { - wchar_t* wstr = fghWstrFromStr(title); - SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr ); - free(wstr); - } -# else - SetWindowText( fgStructure.CurrentWindow->Window.Handle, title ); -# endif - -#endif - } -} - -/* - * Change the current window's size - */ -void FGAPIENTRY glutReshapeWindow( int width, int height ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutReshapeWindow" ); - - if (glutGet(GLUT_FULL_SCREEN)) - { - /* Leave full screen state before resizing. */ - glutFullScreenToggle(); - } - - fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE; - fgStructure.CurrentWindow->State.Width = width ; - fgStructure.CurrentWindow->State.Height = height; -} - -/* - * Change the current window's position - */ -void FGAPIENTRY glutPositionWindow( int x, int y ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPositionWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPositionWindow" ); - - if (glutGet(GLUT_FULL_SCREEN)) - { - /* Leave full screen state before moving. */ - glutFullScreenToggle(); - } - -#if TARGET_HOST_POSIX_X11 - - XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle, - x, y ); - XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ - -#elif TARGET_HOST_MS_WINDOWS - - { - RECT winRect; - - /* "GetWindowRect" returns the pixel coordinates of the outside of the window */ - GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect ); - MoveWindow( - fgStructure.CurrentWindow->Window.Handle, - x, - y, - winRect.right - winRect.left, - winRect.bottom - winRect.top, - TRUE - ); - } - -#endif -} - -/* - * Lowers the current window (by Z order change) - */ -void FGAPIENTRY glutPushWindow( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" ); - -#if TARGET_HOST_POSIX_X11 - - XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - -#elif TARGET_HOST_MS_WINDOWS - - SetWindowPos( - fgStructure.CurrentWindow->Window.Handle, - HWND_BOTTOM, - 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE - ); - -#endif -} - -/* - * Raises the current window (by Z order change) - */ -void FGAPIENTRY glutPopWindow( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" ); - -#if TARGET_HOST_POSIX_X11 - - XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle ); - -#elif TARGET_HOST_MS_WINDOWS - - SetWindowPos( - fgStructure.CurrentWindow->Window.Handle, - HWND_TOP, - 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE - ); - -#endif -} - -#if TARGET_HOST_POSIX_X11 -static int ewmh_fullscr_toggle(void); -static int resize_fullscr_toogle(void); - -static int toggle_fullscreen(void) -{ - /* first try the EWMH (_NET_WM_STATE) method ... */ - if(ewmh_fullscr_toggle() != -1) { - return 0; - } - - /* fall back to resizing the window */ - if(resize_fullscr_toogle() != -1) { - return 0; - } - return -1; -} - -#define _NET_WM_STATE_TOGGLE 2 -static int ewmh_fullscr_toggle(void) -{ - XEvent xev; - long evmask = SubstructureRedirectMask | SubstructureNotifyMask; - - if(!fgDisplay.State || !fgDisplay.StateFullScreen) { - return -1; - } - - xev.type = ClientMessage; - xev.xclient.window = fgStructure.CurrentWindow->Window.Handle; - xev.xclient.message_type = fgDisplay.State; - xev.xclient.format = 32; - xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE; - xev.xclient.data.l[1] = fgDisplay.StateFullScreen; - xev.xclient.data.l[2] = 0; /* no second property to toggle */ - xev.xclient.data.l[3] = 1; /* source indication: application */ - xev.xclient.data.l[4] = 0; /* unused */ - - if(!XSendEvent(fgDisplay.Display, fgDisplay.RootWindow, 0, evmask, &xev)) { - return -1; - } - return 0; -} - -static int resize_fullscr_toogle(void) -{ - XWindowAttributes attributes; - - if(glutGet(GLUT_FULL_SCREEN)) { - /* restore original window size */ - SFG_Window *win = fgStructure.CurrentWindow; - fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE; - fgStructure.CurrentWindow->State.Width = win->State.OldWidth; - fgStructure.CurrentWindow->State.Height = win->State.OldHeight; - - } else { - /* resize the window to cover the entire screen */ - XGetWindowAttributes(fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - &attributes); - - /* - * The "x" and "y" members of "attributes" are the window's coordinates - * relative to its parent, i.e. to the decoration window. - */ - XMoveResizeWindow(fgDisplay.Display, - fgStructure.CurrentWindow->Window.Handle, - -attributes.x, - -attributes.y, - fgDisplay.ScreenWidth, - fgDisplay.ScreenHeight); - } - return 0; -} -#endif /* TARGET_HOST_POSIX_X11 */ - - -/* - * Resize the current window so that it fits the whole screen - */ -void FGAPIENTRY glutFullScreen( void ) -{ - SFG_Window *win; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" ); - - win = fgStructure.CurrentWindow; - -#if TARGET_HOST_POSIX_X11 - if(!glutGet(GLUT_FULL_SCREEN)) { - if(toggle_fullscreen() != -1) { - win->State.IsFullscreen = GL_TRUE; - } - } - -#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: what about WinCE */ - - if (glutGet(GLUT_FULL_SCREEN)) - { - /* Leave full screen state before resizing. */ - glutFullScreenToggle(); - } - - { - RECT rect; - - /* For fullscreen mode, force the top-left corner to 0,0 - * and adjust the window rectangle so that the client area - * covers the whole screen. - */ - - rect.left = 0; - rect.top = 0; - rect.right = fgDisplay.ScreenWidth; - rect.bottom = fgDisplay.ScreenHeight; - - AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | - WS_CLIPCHILDREN, FALSE ); - - /* - * SWP_NOACTIVATE Do not activate the window - * SWP_NOOWNERZORDER Do not change position in z-order - * SWP_NOSENDCHANGING Supress WM_WINDOWPOSCHANGING message - * SWP_NOZORDER Retains the current Z order (ignore 2nd param) - */ - - SetWindowPos( fgStructure.CurrentWindow->Window.Handle, - HWND_TOP, - rect.left, - rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING | - SWP_NOZORDER - ); - - win->State.IsFullscreen = GL_TRUE; - } -#endif -} - -/* - * Toggle the window's full screen state. - */ -void FGAPIENTRY glutFullScreenToggle( void ) -{ - SFG_Window *win; - - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreenToggle" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreenToggle" ); - - win = fgStructure.CurrentWindow; - -#if TARGET_HOST_POSIX_X11 - if(toggle_fullscreen() != -1) { - win->State.IsFullscreen = !win->State.IsFullscreen; - } -#elif TARGET_HOST_MS_WINDOWS - glutFullScreen(); - win->State.IsFullscreen = !win->State.IsFullscreen; -#endif -} - -/* - * A.Donev: Set and retrieve the window's user data - */ -void* FGAPIENTRY glutGetWindowData( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetWindowData" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutGetWindowData" ); - return fgStructure.CurrentWindow->UserData; -} - -void FGAPIENTRY glutSetWindowData(void* data) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowData" ); - FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowData" ); - fgStructure.CurrentWindow->UserData = data; -} - -/*** END OF FILE ***/ diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/CMakeLists.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/CMakeLists.txt deleted file mode 100644 index 06d9a8a7a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -add_definitions( -DFREEGLUT_STATIC -D_CRT_SECURE_NO_WARNINGS ) - -if(MSVC) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W1") -endif(MSVC) - -set(glui_SRCS - algebra3.cpp - arcball.cpp - glui_add_controls.cpp - glui_bitmap_img_data.cpp - glui_bitmaps.cpp - glui_button.cpp - glui_checkbox.cpp - glui_column.cpp - glui_commandline.cpp - glui_control.cpp - glui_edittext.cpp - glui_filebrowser.cpp - glui_list.cpp - glui_listbox.cpp - glui_mouse_iaction.cpp - glui_node.cpp - glui_panel.cpp - glui_radio.cpp - glui_rollout.cpp - glui_rotation.cpp - glui_scrollbar.cpp - glui_separator.cpp - glui_spinner.cpp - glui_statictext.cpp - glui_string.cpp - glui_textbox.cpp - glui_translation.cpp - glui_tree.cpp - glui_treepanel.cpp - glui_window.cpp - glui.cpp - quaternion.cpp -) - -include_directories ( - ${OPENGL_INCLUDE_DIR} - ../freeglut -) - -add_library(glui - ${glui_SRCS} -) diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/GL/glui.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/GL/glui.h deleted file mode 100644 index 520e5925d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/GL/glui.h +++ /dev/null @@ -1,2593 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - ---------------------------------- - - glui.h - Main (and only) external header for - GLUI User Interface Toolkit - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#ifndef GLUI_GLUI_H -#define GLUI_GLUI_H - -#if defined(GLUI_FREEGLUT) - - // FreeGLUT does not yet work perfectly with GLUI - // - use at your own risk. - #include - -#elif defined(GLUI_OPENGLUT) - - // OpenGLUT does not yet work properly with GLUI - // - use at your own risk. - - #include - -#else - - #ifdef __APPLE__ - #include - #else - #include "../../freeglut/GL/glut.h" - //#include - #endif - -#endif - -#include -#include -#include -#include -#include - -#define GLUI_VERSION 2.3f /********** Current version **********/ - -#if defined(_WIN32) -#if !defined(GLUI_NO_LIB_PRAGMA) -//#pragma comment(lib, "glui32.lib") // Link automatically with GLUI library -#endif -#endif - -/********** Do some basic defines *******/ - -#ifndef Byte -#define Byte unsigned char -#endif - -#ifndef _RGBC_ -class RGBc { -public: - Byte r, g, b; - - void set(Byte r,Byte g,Byte b) {this->r=r;this->g=g;this->b=b;} - - RGBc( void ) {} - RGBc( Byte r, Byte g, Byte b ) { set( r, g, b ); } -}; -#define _RGBC_ -#endif - -/********** List of GLUT callbacks ********/ - -enum GLUI_Glut_CB_Types -{ - GLUI_GLUT_RESHAPE, - GLUI_GLUT_KEYBOARD, - GLUI_GLUT_DISPLAY, - GLUI_GLUT_MOUSE, - GLUI_GLUT_MOTION, - GLUI_GLUT_SPECIAL, - GLUI_GLUT_PASSIVE_MOTION, - GLUI_GLUT_ENTRY, - GLUI_GLUT_VISIBILITY -}; - -/********* Constants for window placement **********/ - -#define GLUI_XOFF 6 -#define GLUI_YOFF 6 -#define GLUI_ITEMSPACING 3 -#define GLUI_CHECKBOX_SIZE 13 -#define GLUI_RADIOBUTTON_SIZE 13 -#define GLUI_BUTTON_SIZE 20 -#define GLUI_STATICTEXT_SIZE 13 -#define GLUI_SEPARATOR_HEIGHT 8 -#define GLUI_DEFAULT_CONTROL_WIDTH 100 -#define GLUI_DEFAULT_CONTROL_HEIGHT 13 -#define GLUI_EDITTEXT_BOXINNERMARGINX 3 -#define GLUI_EDITTEXT_HEIGHT 20 -#define GLUI_EDITTEXT_WIDTH 130 -#define GLUI_EDITTEXT_MIN_INT_WIDTH 35 -#define GLUI_EDITTEXT_MIN_TEXT_WIDTH 50 -#define GLUI_PANEL_NAME_DROP 8 -#define GLUI_PANEL_EMBOSS_TOP 4 -/* #define GLUI_ROTATION_WIDTH 60 */ -/* #define GLUI_ROTATION_HEIGHT 78 */ -#define GLUI_ROTATION_WIDTH 50 -#define GLUI_ROTATION_HEIGHT (GLUI_ROTATION_WIDTH+18) -#define GLUI_MOUSE_INTERACTION_WIDTH 50 -#define GLUI_MOUSE_INTERACTION_HEIGHT (GLUI_MOUSE_INTERACTION_WIDTH)+18 - -/** Different panel control types **/ -#define GLUI_PANEL_NONE 0 -#define GLUI_PANEL_EMBOSSED 1 -#define GLUI_PANEL_RAISED 2 - -/** Max # of els in control's float_array **/ -#define GLUI_DEF_MAX_ARRAY 30 - -/********* The control's 'active' behavior *********/ -#define GLUI_CONTROL_ACTIVE_MOUSEDOWN 1 -#define GLUI_CONTROL_ACTIVE_PERMANENT 2 - -/********* Control alignment types **********/ -#define GLUI_ALIGN_CENTER 1 -#define GLUI_ALIGN_RIGHT 2 -#define GLUI_ALIGN_LEFT 3 - -/********** Limit types - how to limit spinner values *********/ -#define GLUI_LIMIT_NONE 0 -#define GLUI_LIMIT_CLAMP 1 -#define GLUI_LIMIT_WRAP 2 - -/********** Translation control types ********************/ -#define GLUI_TRANSLATION_XY 0 -#define GLUI_TRANSLATION_Z 1 -#define GLUI_TRANSLATION_X 2 -#define GLUI_TRANSLATION_Y 3 - -#define GLUI_TRANSLATION_LOCK_NONE 0 -#define GLUI_TRANSLATION_LOCK_X 1 -#define GLUI_TRANSLATION_LOCK_Y 2 - -/********** How was a control activated? *****************/ -#define GLUI_ACTIVATE_MOUSE 1 -#define GLUI_ACTIVATE_TAB 2 - -/********** What type of live variable does a control have? **********/ -#define GLUI_LIVE_NONE 0 -#define GLUI_LIVE_INT 1 -#define GLUI_LIVE_FLOAT 2 -#define GLUI_LIVE_TEXT 3 -#define GLUI_LIVE_STRING 6 -#define GLUI_LIVE_DOUBLE 4 -#define GLUI_LIVE_FLOAT_ARRAY 5 - -/************* Textbox and List Defaults - JVK ******************/ -#define GLUI_TEXTBOX_HEIGHT 130 -#define GLUI_TEXTBOX_WIDTH 130 -#define GLUI_LIST_HEIGHT 130 -#define GLUI_LIST_WIDTH 130 -#define GLUI_DOUBLE_CLICK 1 -#define GLUI_SINGLE_CLICK 0 -#define GLUI_TAB_WIDTH 50 /* In pixels */ -#define GLUI_TEXTBOX_BOXINNERMARGINX 3 -#define GLUI_TEXTBOX_MIN_TEXT_WIDTH 50 -#define GLUI_LIST_BOXINNERMARGINX 3 -#define GLUI_LIST_MIN_TEXT_WIDTH 50 - -/*********************** TreePanel Defaults - JVK *****************************/ -#define GLUI_TREEPANEL_DEFAULTS 0 // bar, standard bar color -#define GLUI_TREEPANEL_ALTERNATE_COLOR 1 // Alternate between 8 different bar colors -#define GLUI_TREEPANEL_ENABLE_BAR 2 // enable the bar -#define GLUI_TREEPANEL_DISABLE_BAR 4 // disable the bar -#define GLUI_TREEPANEL_DISABLE_DEEPEST_BAR 8 // disable only the deepest bar -#define GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY 16 // disable only the bar of the last child of each root -#define GLUI_TREEPANEL_DISPLAY_HIERARCHY 32 // display some sort of hierachy in the tree node title -#define GLUI_TREEPANEL_HIERARCHY_NUMERICDOT 64 // display hierarchy in 1.3.2 (etc... ) format -#define GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY 128 // display hierarchy as only the level depth - -/******************* GLUI Scrollbar Defaults - JVK ***************************/ -#define GLUI_SCROLL_ARROW_WIDTH 16 -#define GLUI_SCROLL_ARROW_HEIGHT 16 -#define GLUI_SCROLL_BOX_MIN_HEIGHT 5 -#define GLUI_SCROLL_BOX_STD_HEIGHT 16 -#define GLUI_SCROLL_STATE_NONE 0 -#define GLUI_SCROLL_STATE_UP 1 -#define GLUI_SCROLL_STATE_DOWN 2 -#define GLUI_SCROLL_STATE_BOTH 3 -#define GLUI_SCROLL_STATE_SCROLL 4 -#define GLUI_SCROLL_DEFAULT_GROWTH_EXP 1.05f -#define GLUI_SCROLL_VERTICAL 0 -#define GLUI_SCROLL_HORIZONTAL 1 - - -/** Size of the character width hash table for faster lookups. - Make sure to keep this a power of two to avoid the slow divide. - This is also a speed/memory tradeoff; 128 is enough for low ASCII. -*/ -#define CHAR_WIDTH_HASH_SIZE 128 - -/********** Translation codes **********/ - -enum TranslationCodes -{ - GLUI_TRANSLATION_MOUSE_NONE = 0, - GLUI_TRANSLATION_MOUSE_UP, - GLUI_TRANSLATION_MOUSE_DOWN, - GLUI_TRANSLATION_MOUSE_LEFT, - GLUI_TRANSLATION_MOUSE_RIGHT, - GLUI_TRANSLATION_MOUSE_UP_LEFT, - GLUI_TRANSLATION_MOUSE_UP_RIGHT, - GLUI_TRANSLATION_MOUSE_DOWN_LEFT, - GLUI_TRANSLATION_MOUSE_DOWN_RIGHT -}; - -/************ A string type for us to use **********/ - -typedef std::string GLUI_String; -GLUI_String& glui_format_str(GLUI_String &str, const char* fmt, ...); - -/********* Pre-declare classes as needed *********/ - -class GLUI; -class GLUI_Control; -class GLUI_Listbox; -class GLUI_StaticText; -class GLUI_EditText; -class GLUI_Panel; -class GLUI_Spinner; -class GLUI_RadioButton; -class GLUI_RadioGroup; -class GLUI_Glut_Window; -class GLUI_TreePanel; -class GLUI_Scrollbar; -class GLUI_List; - -class Arcball; - -/*** Flags for GLUI class constructor ***/ -#define GLUI_SUBWINDOW ((long)(1<<1)) -#define GLUI_SUBWINDOW_TOP ((long)(1<<2)) -#define GLUI_SUBWINDOW_BOTTOM ((long)(1<<3)) -#define GLUI_SUBWINDOW_LEFT ((long)(1<<4)) -#define GLUI_SUBWINDOW_RIGHT ((long)(1<<5)) - -/*** Codes for different type of edittext boxes and spinners ***/ -#define GLUI_EDITTEXT_TEXT 1 -#define GLUI_EDITTEXT_INT 2 -#define GLUI_EDITTEXT_FLOAT 3 -#define GLUI_SPINNER_INT GLUI_EDITTEXT_INT -#define GLUI_SPINNER_FLOAT GLUI_EDITTEXT_FLOAT -#define GLUI_SCROLL_INT GLUI_EDITTEXT_INT -#define GLUI_SCROLL_FLOAT GLUI_EDITTEXT_FLOAT -// This is only for deprecated interface -#define GLUI_EDITTEXT_STRING 4 - -/*** Definition of callbacks ***/ -typedef void (*GLUI_Update_CB) (int id); -typedef void (*GLUI_Control_CB)(GLUI_Control *); -typedef void (*Int1_CB) (int); -typedef void (*Int2_CB) (int, int); -typedef void (*Int3_CB) (int, int, int); -typedef void (*Int4_CB) (int, int, int, int); - -/************************************************************/ -/** - Callback Adapter Class - Allows us to support different types of callbacks; - like a GLUI_Update_CB function pointer--which takes an int; - and a GLUI_Control_CB function pointer--which takes a GUI_Control object. -*/ -class GLUI_CB -{ -public: - GLUI_CB() : idCB(0),objCB(0) {} - GLUI_CB(GLUI_Update_CB cb) : idCB(cb),objCB(0) {} - GLUI_CB(GLUI_Control_CB cb) : idCB(0),objCB(cb) {} - // (Compiler generated copy constructor) - - /** This control just activated. Fire our callback.*/ - void operator()(GLUI_Control *ctrl) const; - bool operator!() const { return !idCB && !objCB; } - operator bool() const { return !(!(*this)); } -private: - GLUI_Update_CB idCB; - GLUI_Control_CB objCB; -}; - -/************************************************************/ -/* */ -/* Base class, for hierarchical relationships */ -/* */ -/************************************************************/ - -class GLUI_Control; - -/** - GLUI_Node is a node in a sort of tree of GLUI controls. - Each GLUI_Node has a list of siblings (in a circular list) - and a linked list of children. - - Everything onscreen is a GLUI_Node--windows, buttons, etc. - The nodes are traversed for event processing, sizing, redraws, etc. -*/ -class GLUI_Node -{ - friend class GLUI_Tree; /* JVK */ - friend class GLUI_Rollout; - friend class GLUI_Main; - -public: - GLUI_Node(); - virtual ~GLUI_Node() {} - - GLUI_Node *first_sibling(); - GLUI_Node *last_sibling(); - GLUI_Node *prev(); - GLUI_Node *next(); - - GLUI_Node *first_child() { return child_head; } - GLUI_Node *last_child() { return child_tail; } - GLUI_Node *parent() { return parent_node; } - - /** Link in a new child control */ - virtual int add_control( GLUI_Control *control ); - - void link_this_to_parent_last (GLUI_Node *parent ); - void link_this_to_parent_first(GLUI_Node *parent ); - void link_this_to_sibling_next(GLUI_Node *sibling ); - void link_this_to_sibling_prev(GLUI_Node *sibling ); - void unlink(); - - void dump( FILE *out, const char *name ); - -protected: - static void add_child_to_control(GLUI_Node *parent,GLUI_Control *child); - GLUI_Node *parent_node; - GLUI_Node *child_head; - GLUI_Node *child_tail; - GLUI_Node *next_sibling; - GLUI_Node *prev_sibling; -}; - - -/************************************************************/ -/* */ -/* Standard Bitmap stuff */ -/* */ -/************************************************************/ - -enum GLUI_StdBitmaps_Codes -{ - GLUI_STDBITMAP_CHECKBOX_OFF = 0, - GLUI_STDBITMAP_CHECKBOX_ON, - GLUI_STDBITMAP_RADIOBUTTON_OFF, - GLUI_STDBITMAP_RADIOBUTTON_ON, - GLUI_STDBITMAP_UP_ARROW, - GLUI_STDBITMAP_DOWN_ARROW, - GLUI_STDBITMAP_LEFT_ARROW, - GLUI_STDBITMAP_RIGHT_ARROW, - GLUI_STDBITMAP_SPINNER_UP_OFF, - GLUI_STDBITMAP_SPINNER_UP_ON, - GLUI_STDBITMAP_SPINNER_DOWN_OFF, - GLUI_STDBITMAP_SPINNER_DOWN_ON, - GLUI_STDBITMAP_CHECKBOX_OFF_DIS, /*** Disactivated control bitmaps ***/ - GLUI_STDBITMAP_CHECKBOX_ON_DIS, - GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, - GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, - GLUI_STDBITMAP_SPINNER_UP_DIS, - GLUI_STDBITMAP_SPINNER_DOWN_DIS, - GLUI_STDBITMAP_LISTBOX_UP, - GLUI_STDBITMAP_LISTBOX_DOWN, - GLUI_STDBITMAP_LISTBOX_UP_DIS, - GLUI_STDBITMAP_NUM_ITEMS -}; - -/************************************************************/ -/* */ -/* Class GLUI_Bitmap */ -/* */ -/************************************************************/ - -/** - GLUI_Bitmap is a simple 2D texture map. It's used - to represent small textures like checkboxes, arrows, etc. - via the GLUI_StdBitmaps class. -*/ -class GLUI_Bitmap -{ - friend class GLUI_StdBitmaps; - -public: - GLUI_Bitmap(); - ~GLUI_Bitmap(); - - /** Create bitmap from greyscale byte image */ - void init_grey(unsigned char *array); - - /** Create bitmap from color int image */ - void init(int *array); - -private: - /** RGB pixel data */ - unsigned char *pixels; - int w, h; -}; - - -/************************************************************/ -/* */ -/* Class GLUI_StdBitmap */ -/* */ -/************************************************************/ - -/** - Keeps an array of GLUI_Bitmap objects to represent all the - images used in the UI: checkboxes, arrows, etc. -*/ -class GLUI_StdBitmaps -{ -public: - GLUI_StdBitmaps(); - ~GLUI_StdBitmaps(); - - /** Return the width (in pixels) of the n'th standard bitmap. */ - int width (int n) const; - /** Return the height (in pixels) of the n'th standard bitmap. */ - int height(int n) const; - - /** Draw the n'th standard bitmap (one of the enums - listed in GLUI_StdBitmaps_Codes) at pixel corner (x,y). - */ - void draw(int n, int x, int y) const; - -private: - GLUI_Bitmap bitmaps[GLUI_STDBITMAP_NUM_ITEMS]; -}; - -/************************************************************/ -/* */ -/* Master GLUI Class */ -/* */ -/************************************************************/ - -/** - The master manages our interaction with GLUT. - There's only one GLUI_Master_Object. -*/ -class GLUI_Master_Object -{ - - friend void glui_idle_func(); - -public: - - GLUI_Master_Object(); - ~GLUI_Master_Object(); - - GLUI_Node gluis; - GLUI_Control *active_control, *curr_left_button_glut_menu; - GLUI *active_control_glui; - int glui_id_counter; - - GLUI_Glut_Window *find_glut_window( int window_id ); - - void set_glutIdleFunc(void (*f)(void)); - - /************** - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_reshape_CB)(int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_mouse_CB)(int,int,int,int); - - void (*glut_passive_motion_CB)(int,int); - void (*glut_visibility_CB)(int); - void (*glut_motion_CB)(int,int); - void (*glut_display_CB)(void); - void (*glut_entry_CB)(int); - **********/ - - void set_left_button_glut_menu_control( GLUI_Control *control ); - - /********** GLUT callthroughs **********/ - /* These are the glut callbacks that we do not handle */ - - void set_glutReshapeFunc (void (*f)(int width, int height)); - void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); - void set_glutSpecialFunc (void (*f)(int key, int x, int y)); - void set_glutMouseFunc (void (*f)(int, int, int, int )); - - void set_glutDisplayFunc(void (*f)(void)) {glutDisplayFunc(f);} - void set_glutTimerFunc(unsigned int millis, void (*f)(int value), int value) - { ::glutTimerFunc(millis,f,value);} - void set_glutOverlayDisplayFunc(void(*f)(void)){glutOverlayDisplayFunc(f);} - void set_glutSpaceballMotionFunc(Int3_CB f) {glutSpaceballMotionFunc(f);} - void set_glutSpaceballRotateFunc(Int3_CB f) {glutSpaceballRotateFunc(f);} - void set_glutSpaceballButtonFunc(Int2_CB f) {glutSpaceballButtonFunc(f);} - void set_glutTabletMotionFunc(Int2_CB f) {glutTabletMotionFunc(f);} - void set_glutTabletButtonFunc(Int4_CB f) {glutTabletButtonFunc(f);} - /* void set_glutWindowStatusFunc(Int1_CB f) {glutWindowStatusFunc(f);} */ - void set_glutMenuStatusFunc(Int3_CB f) {glutMenuStatusFunc(f);} - void set_glutMenuStateFunc(Int1_CB f) {glutMenuStateFunc(f);} - void set_glutButtonBoxFunc(Int2_CB f) {glutButtonBoxFunc(f);} - void set_glutDialsFunc(Int2_CB f) {glutDialsFunc(f);} - - - GLUI *create_glui( const char *name, long flags=0, int x=-1, int y=-1 ); - GLUI *create_glui_subwindow( int parent_window, long flags=0 ); - GLUI *find_glui_by_window_id( int window_id ); - void get_viewport_area( int *x, int *y, int *w, int *h ); - void auto_set_viewport(); - void close_all(); - void sync_live_all(); - - void reshape(); - - float get_version() { return GLUI_VERSION; } - - void glui_setIdleFuncIfNecessary(void); - -private: - GLUI_Node glut_windows; - void (*glut_idle_CB)(void); - - void add_cb_to_glut_window(int window,int cb_type,void *cb); -}; - -/** - This is the only GLUI_Master_Object in existence. -*/ -extern GLUI_Master_Object GLUI_Master; - -/************************************************************/ -/* */ -/* Class for managing a GLUT window */ -/* */ -/************************************************************/ - -/** - A top-level window. The GLUI_Master GLUT callback can route events - to the callbacks in this class, for arbitrary use by external users. - (see GLUI_Master_Object::set_glutKeyboardFunc). - - This entire approach seems to be superceded by the "subwindow" flavor - of GLUI. -*/ -class GLUI_Glut_Window : public GLUI_Node -{ -public: - GLUI_Glut_Window(); - - int glut_window_id; - - /*********** Pointers to GLUT callthrough functions *****/ - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_reshape_CB)(int, int); - void (*glut_passive_motion_CB)(int,int); - void (*glut_mouse_CB)(int,int,int,int); - void (*glut_visibility_CB)(int); - void (*glut_motion_CB)(int,int); - void (*glut_display_CB)(void); - void (*glut_entry_CB)(int); -}; - -/************************************************************/ -/* */ -/* Main Window GLUI class (not user-level) */ -/* */ -/************************************************************/ - -/** - A GLUI_Main handles GLUT events for one window, routing them to the - appropriate controls. The central user-visible "GLUI" class - inherits from this class; users should not allocate GLUT_Main objects. - - There's a separate GLUI_Main object for: - - Each top-level window with GUI stuff in it. - - Each "subwindow" of another top-level window. - - All the GLUI_Main objects are listed in GLUI_Master.gluis. - A better name for this class might be "GLUI_Environment"; - this class provides the window-level context for every control. -*/ -class GLUI_Main : public GLUI_Node -{ - /********** Friend classes *************/ - - friend class GLUI_Control; - friend class GLUI_Rotation; - friend class GLUI_Translation; - friend class GLUI; - friend class GLUI_Master_Object; - - /*********** Friend functions **********/ - - friend void glui_mouse_func(int button, int state, int x, int y); - friend void glui_keyboard_func(unsigned char key, int x, int y); - friend void glui_special_func(int key, int x, int y); - friend void glui_passive_motion_func(int x, int y); - friend void glui_reshape_func( int w, int h ); - friend void glui_visibility_func(int state); - friend void glui_motion_func(int x, int y); - friend void glui_entry_func(int state); - friend void glui_display_func( void ); - friend void glui_idle_func(void); - - friend void glui_parent_window_reshape_func( int w, int h ); - friend void glui_parent_window_keyboard_func( unsigned char, int, int ); - friend void glui_parent_window_special_func( int, int, int ); - friend void glui_parent_window_mouse_func( int, int, int, int ); - -protected: - /*** Variables ***/ - int main_gfx_window_id; - int mouse_button_down; - int glut_window_id; - int top_level_glut_window_id; - GLUI_Control *active_control; - GLUI_Control *mouse_over_control; - GLUI_Panel *main_panel; - enum buffer_mode_t { - buffer_front=1, ///< Draw updated controls directly to screen. - buffer_back=2 ///< Double buffering: postpone updates until next redraw. - }; - buffer_mode_t buffer_mode; ///< Current drawing mode - int curr_cursor; - int w, h; - long flags; - bool closing; - int parent_window; - int glui_id; - - /********** Misc functions *************/ - - GLUI_Control *find_control( int x, int y ); - GLUI_Control *find_next_control( GLUI_Control *control ); - GLUI_Control *find_next_control_rec( GLUI_Control *control ); - GLUI_Control *find_next_control_( GLUI_Control *control ); - GLUI_Control *find_prev_control( GLUI_Control *control ); - void create_standalone_window( const char *name, int x=-1, int y=-1 ); - void create_subwindow( int parent,int window_alignment ); - void setup_default_glut_callbacks( void ); - - void mouse(int button, int state, int x, int y); - void keyboard(unsigned char key, int x, int y); - void special(int key, int x, int y); - void passive_motion(int x, int y); - void reshape( int w, int h ); - void visibility(int state); - void motion(int x, int y); - void entry(int state); - void display( void ); - void idle(void); - int needs_idle(void); - - void (*glut_mouse_CB)(int, int, int, int); - void (*glut_keyboard_CB)(unsigned char, int, int); - void (*glut_special_CB)(int, int, int); - void (*glut_reshape_CB)(int, int); - - - /*********** Controls ************/ - - virtual int add_control( GLUI_Node *parent, GLUI_Control *control ); - - - /********** Constructors and Destructors ***********/ - - GLUI_Main( void ); - -public: - GLUI_StdBitmaps std_bitmaps; - GLUI_String window_name; - RGBc bkgd_color; - float bkgd_color_f[3]; - - void *font; - int curr_modifiers; - - void adjust_glut_xy( int &x, int &y ) { x; y = h-y; } - void activate_control( GLUI_Control *control, int how ); - void align_controls( GLUI_Control *control ); - void deactivate_current_control( void ); - - /** Draw a 3D-look pushed-out box around this rectangle */ - void draw_raised_box( int x, int y, int w, int h ); - /** Draw a 3D-look pushed-in box around this rectangle */ - void draw_lowered_box( int x, int y, int w, int h ); - - /** Return true if this control should redraw itself immediately (front buffer); - Or queue up a redraw and return false if it shouldn't (back buffer). - */ - bool should_redraw_now(GLUI_Control *ctl); - - /** Switch to the appropriate draw buffer now. Returns the old draw buffer. - This routine should probably only be called from inside the GLUI_DrawingSentinal, - in glui_internal_control.h - */ - int set_current_draw_buffer(); - /** Go back to using this draw buffer. Undoes set_current_draw_buffer. */ - void restore_draw_buffer( int buffer_state ); - - /** Pack, resize the window, and redraw all the controls. */ - void refresh(); - - /** Redraw the main graphics window */ - void post_update_main_gfx(); - - /** Recompute the sizes and positions of all controls */ - void pack_controls(); - - void close_internal(); - void check_subwindow_position(); - void set_ortho_projection(); - void set_viewport(); - int get_glut_window_id( void ) { return glut_window_id; } /* JVK */ -}; - -/************************************************************/ -/* */ -/* GLUI_Control: base class for all controls */ -/* */ -/************************************************************/ - -/** - All the GUI objects inherit from GLUI_Control: buttons, - checkboxes, labels, edit boxes, scrollbars, etc. - Most of the work of this class is in routing events, - like keystrokes, mouseclicks, redraws, and sizing events. - - Yes, this is a huge and hideous class. It needs to be - split up into simpler subobjects. None of the data members - should be directly accessed by users (they should be protected, - not public); only subclasses. -*/ -class GLUI_Control : public GLUI_Node -{ -public: - -/** Onscreen coordinates */ - int w, h; /* dimensions of control */ - int x_abs, y_abs; - int x_off, y_off_top, y_off_bot; /* INNER margins, by which child - controls are indented */ - int contain_x, contain_y; - int contain_w, contain_h; - /* if this is a container control (e.g., - radiogroup or panel) this indicated dimensions - of inner area in which controls reside */ - -/** "activation" for tabbing between controls. */ - int active_type; ///< "GLUI_CONTROL_ACTIVE_..." - bool active; ///< If true, we've got the focus - bool can_activate; ///< If false, remove from tab order. - bool spacebar_mouse_click; ///< Spacebar simulates click. - -/** Callbacks */ - long user_id; ///< Integer to pass to callback function. - GLUI_CB callback; ///< User callback function, or NULL. - -/** Variable value storage */ - float float_val; /**< Our float value */ - int int_val; /**< Our integer value */ - float float_array_val[GLUI_DEF_MAX_ARRAY]; - int float_array_size; - GLUI_String text; /**< The text inside this control */ - -/** "Live variable" updating */ - void *ptr_val; /**< A pointer to the user's live variable value */ - int live_type; - bool live_inited; - /* These variables store the last value that live variable was known to have. */ - int last_live_int; - float last_live_float; - GLUI_String last_live_text; - float last_live_float_array[GLUI_DEF_MAX_ARRAY]; - -/** Properties of our control */ - GLUI *glui; /**< Our containing event handler (NEVER NULL during event processing!) */ - bool is_container; /**< Is this a container class (e.g., panel) */ - int alignment; - bool enabled; /**< Is this control grayed out? */ - GLUI_String name; /**< The name of this control */ - void *font; /**< Our glutbitmap font */ - bool collapsible, is_open; - GLUI_Node collapsed_node; - bool hidden; /* Collapsed controls (and children) are hidden */ - int char_widths[CHAR_WIDTH_HASH_SIZE][2]; /* Character width hash table */ - -public: - /*** Get/Set values ***/ - virtual void set_name( const char *string ); - virtual void set_int_val( int new_int ) { int_val = new_int; output_live(true); } - virtual void set_float_val( float new_float ) { float_val = new_float; output_live(true); } - virtual void set_ptr_val( void *new_ptr ) { ptr_val = new_ptr; output_live(true); } - virtual void set_float_array_val( float *array_ptr ); - - virtual float get_float_val( void ) { return float_val; } - virtual int get_int_val( void ) { return int_val; } - virtual void get_float_array_val( float *array_ptr ); - virtual int get_id( void ) const { return user_id; } - virtual void set_id( int id ) { user_id=id; } - - virtual int mouse_down_handler( int local_x, int local_y ) { local_x; local_y; return false; } - virtual int mouse_up_handler( int local_x, int local_y, bool inside ) { local_x; local_y; inside; return false; } - virtual int mouse_held_down_handler( int local_x, int local_y, bool inside) { local_x; local_y; inside; return false; } - virtual int key_handler( unsigned char key, int modifiers ) { key; modifiers; return false; } - virtual int special_handler( int key,int modifiers ) { key; modifiers; return false; } - - virtual void update_size( void ) { } - virtual void idle( void ) { } - virtual int mouse_over( int state, int x, int y ) { state; x; y; return false; } - - virtual void enable( void ); - virtual void disable( void ); - virtual void activate( int how ) { how; active = true; } - virtual void deactivate( void ) { active = false; } - - /** Hide (shrink into a rollout) and unhide (expose from a rollout) */ - void hide_internal( int recurse ); - void unhide_internal( int recurse ); - - /** Return true if it currently makes sense to draw this class. */ - int can_draw( void ) { return (glui != NULL && hidden == false); } - - /** Redraw this control. - In single-buffering mode (drawing to GL_FRONT), this is just - a call to translate_and_draw_front (after a can_draw() check). - In double-buffering mode (drawing to GL_BACK), this queues up - a redraw and returns false, since you shouldn't draw yet. - */ - void redraw(void); - - /** Redraw everybody in our window. */ - void redraw_window(void); - - virtual void align( void ); - void pack( int x, int y ); /* Recalculate positions and offsets */ - void pack_old( int x, int y ); - void draw_recursive( int x, int y ); - int set_to_glut_window( void ); - void restore_window( int orig ); - void translate_and_draw_front( void ); - void translate_to_origin( void ) - {glTranslatef((float)x_abs+.5f,(float)y_abs+.5f,0.0f);} - virtual void draw( int x, int y )=0; - void set_font( void *new_font ); - void *get_font( void ); - int string_width( const char *text ); - int string_width( const GLUI_String &str ) - { return string_width(str.c_str()); } - int char_width( char c ); - - void draw_name( int x, int y ); - void draw_box_inwards_outline( int x_min, int x_max, - int y_min, int y_max ); - void draw_box( int x_min, int x_max, int y_min, int y_max, - float r, float g, float b ); - void draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ); - void draw_emboss_box( int x_min, int x_max,int y_min,int y_max); - void draw_string( const char *text ); - void draw_string( const GLUI_String &s ) - { draw_string(s.c_str()); } - void draw_char( char c ); - void draw_active_box( int x_min, int x_max, int y_min, int y_max ); - void set_to_bkgd_color( void ); - - void set_w( int new_w ); - void set_h( int new_w ); - void set_alignment( int new_align ); - void sync_live( int recurse, int draw ); /* Reads live variable */ - void init_live( void ); - void output_live( int update_main_gfx ); /** Writes live variable **/ - virtual void set_text( const char *t ) { t; } - void execute_callback( void ); - void get_this_column_dims( int *col_x, int *col_y, - int *col_w, int *col_h, - int *col_x_off, int *col_y_off ); - virtual bool needs_idle( void ) const; - virtual bool wants_tabs() const { return false; } - - GLUI_Control(void) - { - x_off = GLUI_XOFF; - y_off_top = GLUI_YOFF; - y_off_bot = GLUI_YOFF; - x_abs = GLUI_XOFF; - y_abs = GLUI_YOFF; - active = false; - enabled = true; - int_val = 0; - last_live_int = 0; - float_array_size = 0; - glui_format_str(name, "Control: %p", this); - float_val = 0.0; - last_live_float = 0.0; - ptr_val = NULL; - glui = NULL; - w = GLUI_DEFAULT_CONTROL_WIDTH; - h = GLUI_DEFAULT_CONTROL_HEIGHT; - font = NULL; - active_type = GLUI_CONTROL_ACTIVE_MOUSEDOWN; - alignment = GLUI_ALIGN_LEFT; - is_container = false; - can_activate = true; /* By default, you can activate a control */ - spacebar_mouse_click = true; /* Does spacebar simulate a mouse click? */ - live_type = GLUI_LIVE_NONE; - text = ""; - last_live_text == ""; - live_inited = false; - collapsible = false; - is_open = true; - hidden = false; - memset(char_widths, -1, sizeof(char_widths)); /* JVK */ - int i; - for( i=0; iint_val = 1; set_color(red, green, blue); } } - void disable_bar() { if (column) { column->int_val = 0; } } - void set_child_number(int c) { child_number = c; } - void set_level_color(float r, float g, float b) { - lred = r; - lgreen = g; - lblue = b; - } - void set_color(float r, float g, float b) { - red = r; - green = g; - blue = b; - } -protected: - void common_init() - { - currently_inside = false; - initially_inside = false; - can_activate = true; - is_container = true; - h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - w = GLUI_DEFAULT_CONTROL_WIDTH; - y_off_top = 21; - collapsible = true; - red = .5; - green = .5; - blue = .5; - lred = 0; - lgreen = 0; - lblue = 0; - column = NULL; - is_current = 0; - child_number = 0; - format = 0; - panel = NULL; - name = ""; - level_name = ""; - level = 0; - - }; -}; - - -/************************************************************/ -/* */ -/* TreePanel class (container) JVK */ -/* */ -/************************************************************/ - -/** - Manages, maintains, and formats a tree of GLUI_Tree objects. - These are shown in a heirarchical, collapsible display. - - FIXME: There's an infinite loop in the traversal code (OSL 2006/06) -*/ -class GLUI_TreePanel : public GLUI_Panel -{ -public: - GLUI_TreePanel(GLUI_Node *parent, const char *name, - bool open=false, int inset=0); - - int max_levels; - int next_id; - int format; - float red; - float green; - float blue; - float lred; - float lgreen; - float lblue; - int root_children; - /* These variables allow the tree panel to traverse the tree - using only two function calls. (Well, four, if you count - going in reverse */ - - GLUI_Tree *curr_branch; /* Current Branch */ - GLUI_Panel *curr_root; /* Current Root */ - -public: - void set_color(float r, float g, float b); - void set_level_color(float r, float g, float b); - void set_format(int f) { format = f; } - - /* Adds branch to curr_root */ - GLUI_Tree * ab(const char *name, GLUI_Tree *root = NULL); - /* Goes up one level, resets curr_root and curr_branch to parents*/ - void fb(GLUI_Tree *branch= NULL); - /* Deletes the curr_branch, goes up one level using fb */ - void db(GLUI_Tree *branch = NULL); - /* Finds the very last branch of curr_root, resets vars */ - void descendBranch(GLUI_Panel *root = NULL); - /* Resets curr_root and curr branch to TreePanel and lastChild */ - void resetToRoot(GLUI_Panel *new_root = NULL); - void next( void ); - void refresh( void ); - void expand_all( void ); - void collapse_all( void ); - void update_all( void ); - void initNode(GLUI_Tree *temp); - void formatNode(GLUI_Tree *temp); - -protected: - int uniqueID( void ) { next_id++; return next_id - 1; } - void common_init() - { - GLUI_Panel(); - next_id = 0; - curr_root = this; - curr_branch = NULL; - red = .5; - green = .5; - blue = .5; - root_children = 0; - } -}; - -/************************************************************/ -/* */ -/* User-Level GLUI class */ -/* */ -/************************************************************/ - -class GLUI_Rotation; -class GLUI_Translation; - -/** - The main user-visible interface object to GLUI. - -*/ -class GLUI : public GLUI_Main -{ -public: -/** DEPRECATED interface for creating new GLUI objects */ - int add_control( GLUI_Control *control ) { return main_panel->add_control(control); } - - void add_column( int draw_bar = true ); - void add_column_to_panel( GLUI_Panel *panel, int draw_bar = true ); - - void add_separator( void ); - void add_separator_to_panel( GLUI_Panel *panel ); - - GLUI_RadioGroup - *add_radiogroup( int *live_var=NULL, - int user_id=-1,GLUI_CB callback=GLUI_CB()); - - GLUI_RadioGroup - *add_radiogroup_to_panel( GLUI_Panel *panel, - int *live_var=NULL, - int user_id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_RadioButton - *add_radiobutton_to_group( GLUI_RadioGroup *group, - const char *name ); - - GLUI_Listbox *add_listbox( const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Listbox *add_listbox_to_panel( GLUI_Panel *panel, - const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Rotation *add_rotation( const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Rotation *add_rotation_to_panel( GLUI_Panel *panel, - const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Translation *add_translation( const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Translation *add_translation_to_panel( - GLUI_Panel *panel, const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - - GLUI_Checkbox *add_checkbox( const char *name, - int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB()); - GLUI_Checkbox *add_checkbox_to_panel( GLUI_Panel *panel, const char *name, - int *live_var=NULL, int id=-1, - GLUI_CB callback=GLUI_CB()); - - GLUI_Button *add_button( const char *name, int id=-1, - GLUI_CB callback=GLUI_CB()); - GLUI_Button *add_button_to_panel( GLUI_Panel *panel, const char *name, - int id=-1, GLUI_CB callback=GLUI_CB() ); - - GLUI_StaticText *add_statictext( const char *name ); - GLUI_StaticText *add_statictext_to_panel( GLUI_Panel *panel, const char *name ); - - GLUI_EditText *add_edittext( const char *name, - int data_type=GLUI_EDITTEXT_TEXT, - void*live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, - const char *name, - int data_type=GLUI_EDITTEXT_TEXT, - void *live_var=NULL, int id=-1, - GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext( const char *name, GLUI_String& live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_EditText *add_edittext_to_panel( GLUI_Panel *panel, const char *name, - GLUI_String& live_var, int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_Spinner *add_spinner( const char *name, - int data_type=GLUI_SPINNER_INT, - void *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Spinner *add_spinner_to_panel( GLUI_Panel *panel, - const char *name, - int data_type=GLUI_SPINNER_INT, - void *live_var=NULL, - int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_Panel *add_panel( const char *name, int type=GLUI_PANEL_EMBOSSED ); - GLUI_Panel *add_panel_to_panel( GLUI_Panel *panel, const char *name, - int type=GLUI_PANEL_EMBOSSED ); - - - GLUI_Rollout *add_rollout( const char *name, int open=true, - int type=GLUI_PANEL_EMBOSSED); - GLUI_Rollout *add_rollout_to_panel( GLUI_Panel *panel, const char *name, - int open=true, - int type=GLUI_PANEL_EMBOSSED); - - -/** Set the window where our widgets should be displayed. */ - void set_main_gfx_window( int window_id ); - int get_glut_window_id( void ) { return glut_window_id; } - - void enable( void ) { main_panel->enable(); } - void disable( void ); - - void sync_live( void ); - - void close( void ); - - void show( void ); - void hide( void ); - - /***** GLUT callback setup functions *****/ - /* - void set_glutDisplayFunc(void (*f)(void)); - void set_glutReshapeFunc(void (*f)(int width, int height)); - void set_glutKeyboardFunc(void (*f)(unsigned char key, int x, int y)); - void set_glutSpecialFunc(void (*f)(int key, int x, int y)); - void set_glutMouseFunc(void (*f)(int button, int state, int x, int y)); - void set_glutMotionFunc(void (*f)(int x, int y)); - void set_glutPassiveMotionFunc(void (*f)(int x, int y)); - void set_glutEntryFunc(void (*f)(int state)); - void set_glutVisibilityFunc(void (*f)(int state)); - void set_glutInit( int *argcp, const char **argv ); - void set_glutInitWindowSize(int width, int height); - void set_glutInitWindowPosition(int x, int y); - void set_glutInitDisplayMode(unsigned int mode); - int set_glutCreateWindow(const char *name); - */ - - /***** Constructors and desctructors *****/ - - int init( const char *name, long flags, int x, int y, int parent_window ); -protected: - virtual int add_control( GLUI_Node *parent, GLUI_Control *control ) { - return GLUI_Main::add_control( parent, control ); - } -}; - -/************************************************************/ -/* */ -/* EditText class */ -/* */ -/************************************************************/ - -class GLUI_EditText : public GLUI_Control -{ -public: - int has_limits; - int data_type; - GLUI_String orig_text; - int insertion_pt; - int title_x_offset; - int text_x_offset; - int substring_start; /*substring that gets displayed in box*/ - int substring_end; - int sel_start, sel_end; /* current selection */ - int num_periods; - int last_insertion_pt; - float float_low, float_high; - int int_low, int_high; - GLUI_Spinner *spinner; - int debug; - int draw_text_only; - - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key, int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int find_word_break( int start, int direction ); - int substring_width( int start, int end ); - void clear_substring( int start, int end ); - int find_insertion_pt( int x, int y ); - int update_substring_bounds( void ); - void update_and_draw_text( void ); - void draw_text( int x, int y ); - void draw_insertion_pt( void ); - void set_numeric_text( void ); - void update_x_offsets( void ); - void update_size( void ); - - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - void set_int_limits( int low, int high, int limit_type=GLUI_LIMIT_CLAMP ); - void set_float_val( float new_val ); - void set_int_val( int new_val ); - void set_text( const char *text ); - void set_text( const GLUI_String &s) { set_text(s.c_str()); } - const char *get_text() { return text.c_str(); } - - void dump( FILE *out, const char *text ); - - // Constructor, no live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type=GLUI_EDITTEXT_TEXT, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, int live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - int *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, float live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - float *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, char* live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - char *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, std::string live variable - GLUI_EditText( GLUI_Node *parent, const char *name, - std::string &live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - - // Deprecated constructor, only called internally - GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type, void *live_var, - int id, GLUI_CB callback ); - // Deprecated constructor, only called internally - GLUI_EditText( void ) { common_init(); } - -protected: - void common_init( void ) { - h = GLUI_EDITTEXT_HEIGHT; - w = GLUI_EDITTEXT_WIDTH; - title_x_offset = 0; - text_x_offset = 55; - insertion_pt = -1; - last_insertion_pt = -1; - name = ""; - substring_start = 0; - data_type = GLUI_EDITTEXT_TEXT; - substring_end = 2; - num_periods = 0; - has_limits = GLUI_LIMIT_NONE; - sel_start = 0; - sel_end = 0; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - spinner = NULL; - debug = false; - draw_text_only = false; - } - void common_construct( GLUI_Node *parent, const char *name, - int data_type, int live_type, void *live_var, - int id, GLUI_CB callback ); -}; - -/************************************************************/ -/* */ -/* CommandLine class */ -/* */ -/************************************************************/ - -class GLUI_CommandLine : public GLUI_EditText -{ -public: - typedef GLUI_EditText Super; - - enum { HIST_SIZE = 100 }; - std::vector hist_list; - int curr_hist; - int oldest_hist; - int newest_hist; - bool commit_flag; - -public: - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - void deactivate( void ); - - virtual const char *get_history( int command_number ) const - { return hist_list[command_number - oldest_hist].c_str(); } - virtual GLUI_String& get_history_str( int command_number ) - { return hist_list[command_number - oldest_hist]; } - virtual const GLUI_String& get_history_str( int command_number ) const - { return hist_list[command_number - oldest_hist]; } - virtual void recall_history( int history_number ); - virtual void scroll_history( int direction ); - virtual void add_to_history( const char *text ); - virtual void reset_history( void ); - - void dump( FILE *out, const char *text ); - - - GLUI_CommandLine( GLUI_Node *parent, const char *name, void *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_CommandLine( void ) { common_init(); } -protected: - void common_init() { - hist_list.resize(HIST_SIZE); - curr_hist = 0; - oldest_hist = 0; - newest_hist = 0; - commit_flag = false; - } -}; - -/************************************************************/ -/* */ -/* RadioGroup class (container) */ -/* */ -/************************************************************/ - -class GLUI_RadioGroup : public GLUI_Control -{ -public: - int num_buttons; - - void draw( int x, int y ); - void set_name( const char *text ); - void set_int_val( int int_val ); - void set_selected( int int_val ); - - void draw_group( int translate ); - - GLUI_RadioGroup( GLUI_Node *parent, int *live_var=NULL, - int user_id=-1,GLUI_CB callback=GLUI_CB() ); - GLUI_RadioGroup( void ) { common_init(); } - -protected: - void common_init( void ) { - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - is_container = true; - w = 300; - h = 300; - num_buttons = 0; - name = ""; - can_activate = false; - live_type = GLUI_LIVE_INT; - } -}; - -/************************************************************/ -/* */ -/* RadioButton class (container) */ -/* */ -/************************************************************/ - -class GLUI_RadioButton : public GLUI_Control -{ -public: - int orig_value; - bool currently_inside; - int text_x_offset; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - - void draw( int x, int y ); - void update_size( void ); - - void draw_active_area( void ); - void draw_checked( void ); - void draw_unchecked( void ); - void draw_O( void ); - - GLUI_RadioButton( GLUI_RadioGroup *group, const char *name ); - GLUI_RadioGroup *group; - -protected: - void common_init() - { - glui_format_str( name, "RadioButton: %p", (void *) this ); - h = GLUI_RADIOBUTTON_SIZE; - group = NULL; - orig_value = -1; - text_x_offset = 18; - can_activate = true; - } -}; - - -/************************************************************/ -/* */ -/* Separator class (container) */ -/* */ -/************************************************************/ - -class GLUI_Separator : public GLUI_Control -{ -public: - void draw( int x, int y ); - - GLUI_Separator( GLUI_Node *parent ); - GLUI_Separator( void ) { common_init(); } - -protected: - void common_init() { - w = 100; - h = GLUI_SEPARATOR_HEIGHT; - can_activate = false; - } -}; - -#define GLUI_SPINNER_ARROW_WIDTH 12 -#define GLUI_SPINNER_ARROW_HEIGHT 8 -#define GLUI_SPINNER_ARROW_Y 2 - -#define GLUI_SPINNER_STATE_NONE 0 -#define GLUI_SPINNER_STATE_UP 1 -#define GLUI_SPINNER_STATE_DOWN 2 -#define GLUI_SPINNER_STATE_BOTH 3 - -#define GLUI_SPINNER_DEFAULT_GROWTH_EXP 1.05f - -/************************************************************/ -/* */ -/* Spinner class (container) */ -/* */ -/************************************************************/ - -class GLUI_Spinner : public GLUI_Control -{ -public: - // Constructor, no live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type=GLUI_SPINNER_INT, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, int live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - int *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Constructor, float live var - GLUI_Spinner( GLUI_Node* parent, const char *name, - float *live_var, int id=-1, GLUI_CB callback=GLUI_CB() ); - // Deprecated constructor - GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type, - void *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() ); - // Deprecated constructor - GLUI_Spinner( void ) { common_init(); } - - bool currently_inside; - int state; - float growth, growth_exp; - int last_x, last_y; - int data_type; - int callback_count; - int last_int_val; - float last_float_val; - int first_callback; - float user_speed; - - GLUI_EditText *edittext; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void draw( int x, int y ); - void draw_pressed( void ); - void draw_unpressed( void ); - void draw_text( int sunken ); - - void update_size( void ); - - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); - int find_arrow( int local_x, int local_y ); - void do_drag( int x, int y ); - void do_callbacks( void ); - void do_click( void ); - void idle( void ); - bool needs_idle( void ) const; - - const char *get_text( void ); - - void set_float_val( float new_val ); - void set_int_val( int new_val ); - float get_float_val( void ); - int get_int_val( void ); - void increase_growth( void ); - void reset_growth( void ); - - void set_speed( float speed ) { user_speed = speed; } - -protected: - void common_init() { - glui_format_str( name, "Spinner: %p", this ); - h = GLUI_EDITTEXT_HEIGHT; - w = GLUI_EDITTEXT_WIDTH; - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - can_activate = true; - state = GLUI_SPINNER_STATE_NONE; - edittext = NULL; - growth_exp = GLUI_SPINNER_DEFAULT_GROWTH_EXP; - callback_count = 0; - first_callback = true; - user_speed = 1.0; - } - void common_construct( GLUI_Node* parent, const char *name, - int data_type, void *live_var, - int id, GLUI_CB callback ); -}; - -/************************************************************/ -/* */ -/* StaticText class */ -/* */ -/************************************************************/ - -class GLUI_StaticText : public GLUI_Control -{ -public: - void set_text( const char *text ); - void draw( int x, int y ); - void draw_text( void ); - void update_size( void ); - void erase_text( void ); - - GLUI_StaticText(GLUI_Node *parent, const char *name); - GLUI_StaticText( void ) { common_init(); } - -protected: - void common_init() { - h = GLUI_STATICTEXT_SIZE; - name = ""; - can_activate = false; - } -}; - -/************************************************************/ -/* */ -/* TextBox class - JVK */ -/* */ -/************************************************************/ - -class GLUI_TextBox : public GLUI_Control -{ -public: - /* GLUI Textbox - JVK */ - GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, - bool scroll = false, int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_TextBox( GLUI_Node *parent, - bool scroll = false, int id=-1, - GLUI_CB callback=GLUI_CB() ); - - GLUI_String orig_text; - int insertion_pt; - int substring_start; /*substring that gets displayed in box*/ - int substring_end; - int sel_start, sel_end; /* current selection */ - int last_insertion_pt; - int debug; - int draw_text_only; - int tab_width; - int start_line; - int num_lines; - int curr_line; - int visible_lines; - int insert_x; /* Similar to "insertion_pt", these variables keep */ - int insert_y; /* track of where the ptr is, but in pixels */ - int keygoal_x; /* where up down keys would like to put insertion pt*/ - GLUI_Scrollbar *scrollbar; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void enable( void ); - void disable( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int get_box_width(); - int find_word_break( int start, int direction ); - int substring_width( int start, int end, int initial_width=0 ); - void clear_substring( int start, int end ); - int find_insertion_pt( int x, int y ); - int update_substring_bounds( void ); - void update_and_draw_text( void ); - void draw_text( int x, int y ); - void draw_insertion_pt( void ); - void update_x_offsets( void ); - void update_size( void ); - - void set_text( const char *text ); - const char *get_text( void ) { return text.c_str(); } - - void dump( FILE *out, char *text ); - void set_tab_w(int w) { tab_width = w; } - void set_start_line(int l) { start_line = l; } - static void scrollbar_callback(GLUI_Control*); - - bool wants_tabs( void ) const { return true; } - -protected: - void common_init() - { - h = GLUI_TEXTBOX_HEIGHT; - w = GLUI_TEXTBOX_WIDTH; - tab_width = GLUI_TAB_WIDTH; - num_lines = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - insert_y = -1; - insert_x = -1; - insertion_pt = -1; - last_insertion_pt = -1; - name[0] = '\0'; - substring_start = 0; - substring_end = 2; - sel_start = 0; - sel_end = 0; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - scrollbar = NULL; - debug = false; - draw_text_only = false; - } - void common_construct( - GLUI_Node *parent, GLUI_String *live_var, - bool scroll, int id, GLUI_CB callback); -}; - -/************************************************************/ -/* */ -/* List class - JVK */ -/* */ -/************************************************************/ - -class GLUI_List_Item : public GLUI_Node -{ -public: - GLUI_String text; - int id; -}; - -/************************************************************/ -/* */ -/* List class - JVK */ -/* */ -/************************************************************/ - -class GLUI_List : public GLUI_Control -{ -public: - /* GLUI List - JVK */ - GLUI_List( GLUI_Node *parent, bool scroll = false, - int id=-1, GLUI_CB callback=GLUI_CB() ); - /*, GLUI_Control *object = NULL - ,GLUI_InterObject_CB obj_cb = NULL);*/ - - GLUI_List( GLUI_Node *parent, - GLUI_String& live_var, bool scroll = false, - int id=-1, - GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL */ - /*,GLUI_InterObject_CB obj_cb = NULL*/); - - - GLUI_String orig_text; - int debug; - int draw_text_only; - int start_line; - int num_lines; - int curr_line; - int visible_lines; - GLUI_Scrollbar *scrollbar; - GLUI_List_Item items_list; - GLUI_Control *associated_object; - GLUI_CB obj_cb; - int cb_click_type; - int last_line; - int last_click_time; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void activate( int how ); - void deactivate( void ); - - void draw( int x, int y ); - - int mouse_over( int state, int x, int y ); - - int get_box_width(); - int find_word_break( int start, int direction ); - int substring_width( const char *t, int start, int end ); - int find_line( int x, int y ); - void update_and_draw_text( void ); - void draw_text( const char *t, int selected, int x, int y ); - void update_size( void ); - - - int add_item( int id, const char *text ); - int delete_item( const char *text ); - int delete_item( int id ); - int delete_all(); - - GLUI_List_Item *get_item_ptr( const char *text ); - GLUI_List_Item *get_item_ptr( int id ); - - void dump( FILE *out, const char *text ); - void set_start_line(int l) { start_line = l; } - static void scrollbar_callback(GLUI_Control*); - int get_current_item() { return curr_line; } - void set_click_type(int d) { - cb_click_type = d; } - void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) - { obj_cb=cb; associated_object=obj; } - -protected: - void common_init() - { - h = GLUI_LIST_HEIGHT; - w = GLUI_LIST_WIDTH; - num_lines = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - name[0] = '\0'; - active_type = GLUI_CONTROL_ACTIVE_PERMANENT; - can_activate = true; - spacebar_mouse_click = false; - scrollbar = NULL; - debug = false; - draw_text_only = false; - cb_click_type = GLUI_SINGLE_CLICK; - last_line = -1; - last_click_time = 0; - associated_object = NULL; - }; - void common_construct( - GLUI_Node *parent, - GLUI_String* live_var, bool scroll, - int id, - GLUI_CB callback - /*,GLUI_Control *object*/ - /*,GLUI_InterObject_CB obj_cb*/); -}; - -/************************************************************/ -/* */ -/* Scrollbar class - JVK */ -/* */ -/************************************************************/ - -class GLUI_Scrollbar : public GLUI_Control -{ -public: - // Constructor, no live var - GLUI_Scrollbar( GLUI_Node *parent, - const char *name, - int horz_vert=GLUI_SCROLL_HORIZONTAL, - int data_type=GLUI_SCROLL_INT, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - // Constructor, int live var - GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, - int *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - // Constructor, float live var - GLUI_Scrollbar( GLUI_Node *parent, const char *name, int horz_vert, - float *live_var, - int id=-1, GLUI_CB callback=GLUI_CB() - /*,GLUI_Control *object = NULL*/ - /*,GLUI_InterObject_CB obj_cb = NULL*/ - ); - - bool currently_inside; - int state; - float growth, growth_exp; - int last_x, last_y; - int data_type; - int callback_count; - int last_int_val; ///< Used to prevent repeated callbacks. - float last_float_val; - int first_callback; - float user_speed; - float float_min, float_max; - int int_min, int_max; - int horizontal; - double last_update_time; ///< GLUI_Time() we last advanced scrollbar. - double velocity_limit; ///< Maximum distance to advance per second. - int box_length; - int box_start_position; - int box_end_position; - int track_length; - - - /* Rather than directly access an Editbox or Textbox for - changing variables, a pointer to some object is defined - along with a static callback in the form func(void *, int) - - the int is the new value, the void * must be cast to that - particular object type before use. - */ - void * associated_object; /* Lets the Spinner manage it's own callbacks */ - GLUI_CB object_cb; /* function pointer to object call_back */ - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void draw( int x, int y ); - void draw_pressed( void ); - void draw_unpressed( void ); - void draw_text( int sunken ); - - void update_size( void ); - - void set_int_limits( int low, int high,int limit_type=GLUI_LIMIT_CLAMP); - void set_float_limits( float low,float high,int limit_type=GLUI_LIMIT_CLAMP); - int find_arrow( int local_x, int local_y ); - void do_drag( int x, int y ); - void do_callbacks( void ); - void draw_scroll( void ); - void do_click( void ); - void idle( void ); - bool needs_idle( void ) const; - void set_int_val( int new_val ); - void set_float_val( float new_val ); - void increase_growth( void ); - void reset_growth( void ); - - void set_speed( float speed ) { user_speed = speed; }; - void update_scroll_parameters(); - void set_object_callback(GLUI_CB cb=GLUI_CB(), GLUI_Control*obj=NULL) - { object_cb=cb; associated_object=obj; } - -protected: - void common_init ( void ); - void common_construct( - GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, void* live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ); - - virtual void draw_scroll_arrow(int arrowtype, int x, int y); - virtual void draw_scroll_box(int x, int y, int w, int h); -}; - -/************************************************************/ -/* */ -/* Listbox class */ -/* */ -/************************************************************/ - -class GLUI_Listbox_Item : public GLUI_Node -{ -public: - GLUI_String text; - int id; -}; - -class GLUI_Listbox : public GLUI_Control -{ -public: - GLUI_String curr_text; - GLUI_Listbox_Item items_list; - int depressed; - - int orig_value; - bool currently_inside; - int text_x_offset, title_x_offset; - int glut_menu_id; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int key_handler( unsigned char key,int modifiers ); - int special_handler( int key,int modifiers ); - - void update_size( void ); - void draw( int x, int y ); - int mouse_over( int state, int x, int y ); - - void set_int_val( int new_val ); - void dump( FILE *output ); - - int add_item( int id, const char *text ); - int delete_item( const char *text ); - int delete_item( int id ); - int sort_items( void ); - - int do_selection( int item ); - - GLUI_Listbox_Item *get_item_ptr( const char *text ); - GLUI_Listbox_Item *get_item_ptr( int id ); - - - GLUI_Listbox( GLUI_Node *parent, - const char *name, int *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Listbox( void ) { common_init(); } - -protected: - /** Change w and return true if we need to be widened to fit the current item. */ - bool recalculate_item_width( void ); - void common_init() { - glui_format_str( name, "Listbox: %p", this ); - w = GLUI_EDITTEXT_WIDTH; - h = GLUI_EDITTEXT_HEIGHT; - orig_value = -1; - title_x_offset = 0; - text_x_offset = 55; - can_activate = true; - curr_text = ""; - live_type = GLUI_LIVE_INT; /* This has an integer live var */ - depressed = false; - glut_menu_id = -1; - } - - ~GLUI_Listbox(); -}; - -/************************************************************/ -/* */ -/* Mouse_Interaction class */ -/* */ -/************************************************************/ - -/** - This is the superclass of translation and rotation widgets. -*/ -class GLUI_Mouse_Interaction : public GLUI_Control -{ -public: - /*int get_main_area_size( void ) { return MIN( h-18, */ - int draw_active_area_only; - - int mouse_down_handler( int local_x, int local_y ); - int mouse_up_handler( int local_x, int local_y, bool inside ); - int mouse_held_down_handler( int local_x, int local_y, bool inside ); - int special_handler( int key, int modifiers ); - void update_size( void ); - void draw( int x, int y ); - void draw_active_area( void ); - - /*** The following methods (starting with "iaction_") need to - be overloaded ***/ - virtual int iaction_mouse_down_handler( int local_x, int local_y ) = 0; - virtual int iaction_mouse_up_handler( int local_x, int local_y, bool inside )=0; - virtual int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside )=0; - virtual int iaction_special_handler( int key, int modifiers )=0; - virtual void iaction_draw_active_area_persp( void )=0; - virtual void iaction_draw_active_area_ortho( void )=0; - virtual void iaction_dump( FILE *output )=0; - virtual void iaction_init( void ) = 0; - - GLUI_Mouse_Interaction( void ) { - glui_format_str( name, "Mouse_Interaction: %p", this ); - w = GLUI_MOUSE_INTERACTION_WIDTH; - h = GLUI_MOUSE_INTERACTION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_NONE; - alignment = GLUI_ALIGN_CENTER; - draw_active_area_only = false; - } -}; - -/************************************************************/ -/* */ -/* Rotation class */ -/* */ -/************************************************************/ - -/** - An onscreen rotation controller--allows the user to interact with - a 3D rotation via a spaceball-like interface. -*/ -class GLUI_Rotation : public GLUI_Mouse_Interaction -{ -public: - Arcball *ball; - GLUquadricObj *quadObj; - bool can_spin, spinning; - float damping; - - int iaction_mouse_down_handler( int local_x, int local_y ); - int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); - int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); - int iaction_special_handler( int key, int modifiers ); - void iaction_init( void ) { init_ball(); } - void iaction_draw_active_area_persp( void ); - void iaction_draw_active_area_ortho( void ); - void iaction_dump( FILE *output ); - - /* void update_size( void ); */ - /* void draw( int x, int y ); */ - /* int mouse_over( int state, int x, int y ); */ - - void setup_texture( void ); - void setup_lights( void ); - void draw_ball( float radius ); - - void init_ball( void ); - - void reset( void ); - - bool needs_idle( void ) const; - void idle( void ); - - void copy_float_array_to_ball( void ); - void copy_ball_to_float_array( void ); - - void set_spin( float damp_factor ); - - GLUI_Rotation( GLUI_Node *parent, const char *name, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Rotation(void) { common_init(); } - -protected: - void common_init(); -}; - -/************************************************************/ -/* */ -/* Translation class */ -/* */ -/************************************************************/ - -/** - An onscreen translation controller--allows the user to interact with - a 3D translation. -*/ -class GLUI_Translation : public GLUI_Mouse_Interaction -{ -public: - int trans_type; /* Is this an XY or a Z controller? */ - int down_x, down_y; - float scale_factor; - GLUquadricObj *quadObj; - int trans_mouse_code; - float orig_x, orig_y, orig_z; - int locked; - - int iaction_mouse_down_handler( int local_x, int local_y ); - int iaction_mouse_up_handler( int local_x, int local_y, bool inside ); - int iaction_mouse_held_down_handler( int local_x, int local_y, bool inside ); - int iaction_special_handler( int key, int modifiers ); - void iaction_init( void ) { } - void iaction_draw_active_area_persp( void ); - void iaction_draw_active_area_ortho( void ); - void iaction_dump( FILE *output ); - - void set_speed( float s ) { scale_factor = s; } - - void setup_texture( void ); - void setup_lights( void ); - void draw_2d_arrow( int radius, int filled, int orientation ); - void draw_2d_x_arrows( int radius ); - void draw_2d_y_arrows( int radius ); - void draw_2d_z_arrows( int radius ); - void draw_2d_xy_arrows( int radius ); - - int get_mouse_code( int x, int y ); - - /* Float array is either a single float (for single-axis controls), - or two floats for X and Y (if an XY controller) */ - - float get_z( void ) { return float_array_val[0]; } - float get_x( void ) { return float_array_val[0]; } - float get_y( void ) { - if ( trans_type == GLUI_TRANSLATION_XY ) return float_array_val[1]; - else return float_array_val[0]; - } - - void set_z( float val ); - void set_x( float val ); - void set_y( float val ); - void set_one_val( float val, int index ); - - GLUI_Translation( GLUI_Node *parent, const char *name, - int trans_type, float *live_var=NULL, - int id=-1, GLUI_CB callback=GLUI_CB() ); - GLUI_Translation( void ) { common_init(); } - -protected: - void common_init() { - locked = GLUI_TRANSLATION_LOCK_NONE; - glui_format_str( name, "Translation: %p", this ); - w = GLUI_MOUSE_INTERACTION_WIDTH; - h = GLUI_MOUSE_INTERACTION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_FLOAT_ARRAY; - float_array_size = 0; - alignment = GLUI_ALIGN_CENTER; - trans_type = GLUI_TRANSLATION_XY; - scale_factor = 1.0; - quadObj = NULL; - trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; - } -}; - -/********** Misc functions *********************/ -int _glutBitmapWidthString( void *font, const char *s ); -void _glutBitmapString( void *font, const char *s ); - -/********** Our own callbacks for glut *********/ -/* These are the callbacks that we pass to glut. They take - some action if necessary, then (possibly) call the user-level - glut callbacks. -*/ - -void glui_display_func( void ); -void glui_reshape_func( int w, int h ); -void glui_keyboard_func(unsigned char key, int x, int y); -void glui_special_func(int key, int x, int y); -void glui_mouse_func(int button, int state, int x, int y); -void glui_motion_func(int x, int y); -void glui_passive_motion_func(int x, int y); -void glui_entry_func(int state); -void glui_visibility_func(int state); -void glui_idle_func(void); - -void glui_parent_window_reshape_func( int w, int h ); -void glui_parent_window_keyboard_func(unsigned char key, int x, int y); -void glui_parent_window_mouse_func(int, int, int, int ); -void glui_parent_window_special_func(int key, int x, int y); - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.cpp deleted file mode 100644 index 36e5560b7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.cpp +++ /dev/null @@ -1,1616 +0,0 @@ -/* - - algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -/************************************************************************** - - There are three vector classes and two matrix classes: vec2, vec3, - vec4, mat3, and mat4. - - All the standard arithmetic operations are defined, with '*' - for dot product of two vectors and multiplication of two matrices, - and '^' for cross product of two vectors. - - Additional functions include length(), normalize(), homogenize for - vectors, and print(), set(), apply() for all classes. - - There is a function transpose() for matrices, but note that it - does not actually change the matrix, - - When multiplied with a matrix, a vector is treated as a row vector - if it precedes the matrix (v*M), and as a column vector if it - follows the matrix (M*v). - - Matrices are stored in row-major form. - - A vector of one dimension (2d, 3d, or 4d) can be cast to a vector - of a higher or lower dimension. If casting to a higher dimension, - the new component is set by default to 1.0, unless a value is - specified: - vec3 a(1.0, 2.0, 3.0 ); - vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; - When casting to a lower dimension, the vector is homogenized in - the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the - resulting vector is {X/W, Y/W, Z/W}. It is up to the user to - insure the fourth component is not zero before casting. - - There are also the following function for building matrices: - identity2D(), translation2D(), rotation2D(), - scaling2D(), identity3D(), translation3D(), - rotation3D(), rotation3Drad(), scaling3D(), - perspective3D() - - - --------------------------------------------------------------------- - - Author: Jean-Francois DOUEg - Revised: Paul Rademacher - Version 3.2 - Feb 1998 - Revised: Nigel Stewart (GLUI Code Cleaning) - -**************************************************************************/ - -#include "algebra3.h" -#include "glui_internal.h" -#include - -#ifdef VEC_ERROR_FATAL -#ifndef VEC_ERROR -#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); exit(1); } -#endif -#else -#ifndef VEC_ERROR -#define VEC_ERROR(E) { printf( "VERROR %s\n", E ); } -#endif -#endif - -/**************************************************************** - * * - * vec2 Member functions * - * * - ****************************************************************/ - -/******************** vec2 CONSTRUCTORS ********************/ - -vec2::vec2() -{ - n[VX] = n[VY] = 0.0; -} - -vec2::vec2(float x, float y) -{ - n[VX] = x; - n[VY] = y; -} - -vec2::vec2(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; -} - -vec2::vec2(const vec3 &v) // it is up to caller to avoid divide-by-zero -{ - n[VX] = v.n[VX]/v.n[VZ]; - n[VY] = v.n[VY]/v.n[VZ]; -} - -vec2::vec2(const vec3 &v, int dropAxis) -{ - switch (dropAxis) - { - case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; break; - case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; break; - default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; break; - } -} - -/******************** vec2 ASSIGNMENT OPERATORS ******************/ - -vec2 & vec2::operator=(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - return *this; -} - -vec2 & vec2::operator+=(const vec2 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - return *this; -} - -vec2 & vec2::operator-=(const vec2 &v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - return *this; -} - -vec2 &vec2::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - return *this; -} - -vec2 &vec2::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - return *this; -} - -float &vec2::operator[](int i) -{ - if (i < VX || i > VY) - //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec2 [] operator: illegal access" ); - return n[i]; -} - -const float &vec2::operator[](int i) const -{ - if (i < VX || i > VY) - //VEC_ERROR("vec2 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec2 [] operator: illegal access" ); - - return n[i]; -} - -/******************** vec2 SPECIAL FUNCTIONS ********************/ - -float vec2::length() const -{ - return (float) sqrt(length2()); -} - -float vec2::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY]; -} - -vec2 &vec2::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec2 &vec2::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - return *this; -} - -void vec2::set( float x, float y ) -{ - n[VX] = x; n[VY] = y; -} - -/******************** vec2 FRIENDS *****************************/ - -vec2 operator-(const vec2 &a) -{ - return vec2(-a.n[VX],-a.n[VY]); -} - -vec2 operator+(const vec2 &a, const vec2& b) -{ - return vec2(a.n[VX]+b.n[VX], a.n[VY]+b.n[VY]); -} - -vec2 operator-(const vec2 &a, const vec2& b) -{ - return vec2(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY]); -} - -vec2 operator*(const vec2 &a, float d) -{ - return vec2(d*a.n[VX], d*a.n[VY]); -} - -vec2 operator*(float d, const vec2 &a) -{ - return a*d; -} - -vec2 operator*(const mat3 &a, const vec2 &v) -{ - vec3 av; - - av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]; - av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]; - av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]; - - return av; -} - -vec2 operator*(const vec2 &v, const mat3 &a) -{ - return a.transpose() * v; -} - -vec3 operator*(const mat3 &a, const vec3 &v) -{ - vec3 av; - - av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ]*v.n[VZ]; - av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ]*v.n[VZ]; - av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ]*v.n[VZ]; - - return av; -} - -vec3 operator*(const vec3 &v, const mat3 &a) -{ - return a.transpose() * v; -} - -float operator*(const vec2 &a, const vec2 &b) -{ - return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY]; -} - -vec2 operator/(const vec2 &a, float d) -{ - float d_inv = 1.0f/d; - return vec2(a.n[VX]*d_inv, a.n[VY]*d_inv); -} - -vec3 operator^(const vec2 &a, const vec2 &b) -{ - return vec3(0.0, 0.0, a.n[VX] * b.n[VY] - b.n[VX] * a.n[VY]); -} - -int operator==(const vec2 &a, const vec2 &b) -{ - return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]); -} - -int operator!=(const vec2 &a, const vec2 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec2& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << " |"; } -*/ - -/*istream& operator >> (istream& s, vec2& v) { - vec2 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y or | x y | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec2 &a, vec2 &b) -{ - vec2 tmp(a); - a = b; - b = tmp; -} - -vec2 min_vec(const vec2 &a, const vec2 &b) -{ - return vec2(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY])); -} - -vec2 max_vec(const vec2 &a, const vec2 &b) -{ - return vec2(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY])); -} - -vec2 prod(const vec2 &a, const vec2 &b) -{ - return vec2(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY]); -} - -/**************************************************************** - * * - * vec3 Member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -vec3::vec3() -{ - n[VX] = n[VY] = n[VZ] = 0.0; -} - -vec3::vec3(float x, float y, float z) -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; -} - -vec3::vec3(const vec3 &v) -{ - n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; -} - -vec3::vec3(const vec2 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = 1.0; -} - -vec3::vec3(const vec2 &v, float d) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = d; -} - -vec3::vec3(const vec4 &v) // it is up to caller to avoid divide-by-zero -{ - n[VX] = v.n[VX] / v.n[VW]; - n[VY] = v.n[VY] / v.n[VW]; - n[VZ] = v.n[VZ] / v.n[VW]; -} - -vec3::vec3(const vec4 &v, int dropAxis) -{ - switch (dropAxis) - { - case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; - case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break; - case VZ: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VW]; break; - default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; break; - } -} - - -// ASSIGNMENT OPERATORS - -vec3 &vec3::operator=(const vec3 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - return *this; -} - -vec3 &vec3::operator+=(const vec3 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - n[VZ] += v.n[VZ]; - return *this; -} - -vec3 &vec3::operator-=(const vec3& v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - n[VZ] -= v.n[VZ]; - return *this; -} - -vec3 &vec3::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - n[VZ] *= d; - return *this; -} - -vec3 &vec3::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - n[VZ] *= d_inv; - return *this; -} - -float &vec3::operator[](int i) -{ - if (i < VX || i > VZ) - //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec3 [] operator: illegal access" ); - - return n[i]; -} - -const float &vec3::operator[](int i) const -{ - if (i < VX || i > VZ) - //VEC_ERROR("vec3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec3 [] operator: illegal access" ); - - return n[i]; -} - -// SPECIAL FUNCTIONS - -float vec3::length() const -{ - return (float) sqrt(length2()); -} - -float vec3::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; -} - -vec3 &vec3::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec3 &vec3::homogenize(void) // it is up to caller to avoid divide-by-zero -{ - n[VX] /= n[VZ]; - n[VY] /= n[VZ]; - n[VZ] = 1.0; - return *this; -} - -vec3 &vec3::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - n[VZ] = (*fct)(n[VZ]); - return *this; -} - -void vec3::set(float x, float y, float z) // set vector -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; -} - -void vec3::print(FILE *file, const char *name) const // print vector to a file -{ - fprintf( file, "%s: <%f, %f, %f>\n", name, n[VX], n[VY], n[VZ] ); -} - -// FRIENDS - -vec3 operator-(const vec3 &a) -{ - return vec3(-a.n[VX],-a.n[VY],-a.n[VZ]); -} - -vec3 operator+(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ]); -} - -vec3 operator-(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY], a.n[VZ]-b.n[VZ]); -} - -vec3 operator*(const vec3 &a, float d) -{ - return vec3(d*a.n[VX], d*a.n[VY], d*a.n[VZ]); -} - -vec3 operator*(float d, const vec3 &a) -{ - return a*d; -} - -vec3 operator*(const mat4 &a, const vec3 &v) -{ - return a*vec4(v); -} - -vec3 operator*(const vec3 &v, mat4 &a) -{ - return a.transpose()*v; -} - -float operator*(const vec3 &a, const vec3 &b) -{ - return a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ]; -} - -vec3 operator/(const vec3 &a, float d) -{ - float d_inv = 1.0f/d; - return vec3(a.n[VX]*d_inv, a.n[VY]*d_inv, a.n[VZ]*d_inv); -} - -vec3 operator^(const vec3 &a, const vec3 &b) -{ - return - vec3(a.n[VY]*b.n[VZ] - a.n[VZ]*b.n[VY], - a.n[VZ]*b.n[VX] - a.n[VX]*b.n[VZ], - a.n[VX]*b.n[VY] - a.n[VY]*b.n[VX]); -} - -int operator==(const vec3 &a, const vec3 &b) -{ - return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]) && (a.n[VZ] == b.n[VZ]); -} - -int operator!=(const vec3 &a, const vec3 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec3& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << " |"; } - -istream& operator >> (istream& s, vec3& v) { - vec3 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y z or | x y z | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec3 &a, vec3 &b) -{ - vec3 tmp(a); - a = b; - b = tmp; -} - -vec3 min_vec(const vec3 &a, const vec3 &b) -{ - return vec3( - MIN(a.n[VX], b.n[VX]), - MIN(a.n[VY], b.n[VY]), - MIN(a.n[VZ], b.n[VZ])); -} - -vec3 max_vec(const vec3 &a, const vec3 &b) -{ - return vec3( - MAX(a.n[VX], b.n[VX]), - MAX(a.n[VY], b.n[VY]), - MAX(a.n[VZ], b.n[VZ])); -} - -vec3 prod(const vec3 &a, const vec3 &b) -{ - return vec3(a.n[VX]*b.n[VX], a.n[VY]*b.n[VY], a.n[VZ]*b.n[VZ]); -} - -/**************************************************************** - * * - * vec4 Member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -vec4::vec4() -{ - n[VX] = n[VY] = n[VZ] = 0.0; - n[VW] = 1.0; -} - -vec4::vec4(float x, float y, float z, float w) -{ - n[VX] = x; - n[VY] = y; - n[VZ] = z; - n[VW] = w; -} - -vec4::vec4(const vec4 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = v.n[VW]; -} - -vec4::vec4(const vec3 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = 1.0; -} - -vec4::vec4(const vec3 &v, float d) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = d; -} - -// ASSIGNMENT OPERATORS - -vec4 &vec4::operator=(const vec4 &v) -{ - n[VX] = v.n[VX]; - n[VY] = v.n[VY]; - n[VZ] = v.n[VZ]; - n[VW] = v.n[VW]; - return *this; -} - -vec4 &vec4::operator+=(const vec4 &v) -{ - n[VX] += v.n[VX]; - n[VY] += v.n[VY]; - n[VZ] += v.n[VZ]; - n[VW] += v.n[VW]; - return *this; -} - -vec4 &vec4::operator-=(const vec4 &v) -{ - n[VX] -= v.n[VX]; - n[VY] -= v.n[VY]; - n[VZ] -= v.n[VZ]; - n[VW] -= v.n[VW]; - return *this; -} - -vec4 &vec4::operator*=(float d) -{ - n[VX] *= d; - n[VY] *= d; - n[VZ] *= d; - n[VW] *= d; - return *this; -} - -vec4 &vec4::operator/=(float d) -{ - float d_inv = 1.0f/d; - n[VX] *= d_inv; - n[VY] *= d_inv; - n[VZ] *= d_inv; - n[VW] *= d_inv; - return *this; -} - -float &vec4::operator[](int i) -{ - if (i < VX || i > VW) - //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec4 [] operator: illegal access" ); - - return n[i]; -} - -const float &vec4::operator[](int i) const -{ - if (i < VX || i > VW) - //VEC_ERROR("vec4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("vec4 [] operator: illegal access" ); - - return n[i]; -} - -// SPECIAL FUNCTIONS - -float vec4::length() const -{ - return (float) sqrt(length2()); -} - -float vec4::length2() const -{ - return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ] + n[VW]*n[VW]; -} - -vec4 &vec4::normalize() // it is up to caller to avoid divide-by-zero -{ - *this /= length(); - return *this; -} - -vec4 &vec4::homogenize() // it is up to caller to avoid divide-by-zero -{ - n[VX] /= n[VW]; - n[VY] /= n[VW]; - n[VZ] /= n[VW]; - n[VW] = 1.0; - return *this; -} - -vec4 &vec4::apply(V_FCT_PTR fct) -{ - n[VX] = (*fct)(n[VX]); - n[VY] = (*fct)(n[VY]); - n[VZ] = (*fct)(n[VZ]); - n[VW] = (*fct)(n[VW]); - return *this; -} - -void vec4::print(FILE *file, const char *name) const // print vector to a file -{ - fprintf( file, "%s: <%f, %f, %f, %f>\n", name, n[VX], n[VY], n[VZ], n[VW]); -} - -void vec4::set(float x, float y, float z, float a) -{ - n[0] = x; - n[1] = y; - n[2] = z; - n[3] = a; -} - - -// FRIENDS - -vec4 operator-(const vec4 &a) -{ - return vec4(-a.n[VX],-a.n[VY],-a.n[VZ],-a.n[VW]); -} - -vec4 operator+(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] + b.n[VX], - a.n[VY] + b.n[VY], - a.n[VZ] + b.n[VZ], - a.n[VW] + b.n[VW]); -} - -vec4 operator-(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] - b.n[VX], - a.n[VY] - b.n[VY], - a.n[VZ] - b.n[VZ], - a.n[VW] - b.n[VW]); -} - -vec4 operator*(const vec4 &a, float d) -{ - return vec4(d*a.n[VX], d*a.n[VY], d*a.n[VZ], d*a.n[VW]); -} - -vec4 operator*(float d, const vec4 &a) -{ - return a*d; -} - -vec4 operator*(const mat4 &a, const vec4 &v) -{ - #define ROWCOL(i) \ - a.v[i].n[0]*v.n[VX] + \ - a.v[i].n[1]*v.n[VY] + \ - a.v[i].n[2]*v.n[VZ] + \ - a.v[i].n[3]*v.n[VW] - - return vec4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3)); - - #undef ROWCOL -} - -vec4 operator*(const vec4 &v, const mat4 &a) -{ - return a.transpose()*v; -} - -float operator*(const vec4 &a, const vec4 &b) -{ - return - a.n[VX]*b.n[VX] + - a.n[VY]*b.n[VY] + - a.n[VZ]*b.n[VZ] + - a.n[VW]*b.n[VW]; -} - -vec4 operator/(const vec4 &a, float d) -{ - float d_inv = 1.0f/d; - return vec4( - a.n[VX]*d_inv, - a.n[VY]*d_inv, - a.n[VZ]*d_inv, - a.n[VW]*d_inv); -} - -int operator==(const vec4 &a, const vec4 &b) -{ - return - (a.n[VX] == b.n[VX]) && - (a.n[VY] == b.n[VY]) && - (a.n[VZ] == b.n[VZ]) && - (a.n[VW] == b.n[VW]); -} - -int operator!=(const vec4 &a, const vec4 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, vec4& v) -{ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << ' ' - << v.n[VW] << " |"; } - -istream& operator >> (istream& s, vec4& v) { - vec4 v_tmp; - char c = ' '; - - while (isspace(c)) - s >> c; - // The vectors can be formatted either as x y z w or | x y z w | - if (c == '|') { - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; - while (s >> c && isspace(c)) ; - if (c != '|') - ;//s.set(_bad); - } - else { - s.putback(c); - s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ] >> v_tmp[VW]; - } - if (s) - v = v_tmp; - return s; -} -*/ - -void swap(vec4 &a, vec4 &b) -{ - vec4 tmp(a); - a = b; - b = tmp; -} - -vec4 min_vec(const vec4 &a, const vec4 &b) -{ - return vec4( - MIN(a.n[VX], b.n[VX]), - MIN(a.n[VY], b.n[VY]), - MIN(a.n[VZ], b.n[VZ]), - MIN(a.n[VW], b.n[VW])); -} - -vec4 max_vec(const vec4 &a, const vec4 &b) -{ - return vec4( - MAX(a.n[VX], b.n[VX]), - MAX(a.n[VY], b.n[VY]), - MAX(a.n[VZ], b.n[VZ]), - MAX(a.n[VW], b.n[VW])); -} - -vec4 prod(const vec4 &a, const vec4 &b) -{ - return vec4( - a.n[VX] * b.n[VX], - a.n[VY] * b.n[VY], - a.n[VZ] * b.n[VZ], - a.n[VW] * b.n[VW]); -} - -/**************************************************************** - * * - * mat3 member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -mat3::mat3() -{ - *this = identity2D(); -} - -mat3::mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2) -{ - set(v0, v1, v2); -} - -mat3::mat3(const mat3 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; -} - -// ASSIGNMENT OPERATORS - -mat3 &mat3::operator=(const mat3 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - return *this; -} - -mat3 &mat3::operator+=(const mat3& m) -{ - v[0] += m.v[0]; - v[1] += m.v[1]; - v[2] += m.v[2]; - return *this; -} - -mat3 &mat3::operator-=(const mat3& m) -{ - v[0] -= m.v[0]; - v[1] -= m.v[1]; - v[2] -= m.v[2]; - return *this; -} - -mat3 &mat3::operator*=(float d) -{ - v[0] *= d; - v[1] *= d; - v[2] *= d; - return *this; -} - -mat3 &mat3::operator/=(float d) -{ - v[0] /= d; - v[1] /= d; - v[2] /= d; - return *this; -} - -vec3 &mat3::operator[](int i) -{ - if (i < VX || i > VZ) - //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat3 [] operator: illegal access" ); - - return v[i]; -} - -const vec3 &mat3::operator[](int i) const -{ - if (i < VX || i > VZ) - //VEC_ERROR("mat3 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat3 [] operator: illegal access" ); - - return v[i]; -} - -void mat3::set(const vec3 &v0, const vec3 &v1, const vec3 &v2) -{ - v[0] = v0; - v[1] = v1; - v[2] = v2; -} - -// SPECIAL FUNCTIONS - -mat3 mat3::transpose() const -{ - return mat3( - vec3(v[0][0], v[1][0], v[2][0]), - vec3(v[0][1], v[1][1], v[2][1]), - vec3(v[0][2], v[1][2], v[2][2])); -} - -mat3 mat3::inverse() const // Gauss-Jordan elimination with partial pivoting -{ - mat3 a(*this); // As a evolves from original mat into identity - mat3 b(identity2D()); // b evolves from identity into inverse(a) - int i, j, i1; - - // Loop over cols of a from left to right, eliminating above and below diag - for (j=0; j<3; j++) // Find largest pivot in column j among rows j..2 - { - i1 = j; // Row with largest pivot candidate - for (i=j+1; i<3; i++) - if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) - i1 = i; - - // Swap rows i1 and j in a and b to put pivot on diagonal - swap(a.v[i1], a.v[j]); - swap(b.v[i1], b.v[j]); - - // Scale row j to have a unit diagonal - if (a.v[j].n[j]==0.) - VEC_ERROR("mat3::inverse: singular matrix; can't invert\n"); - - b.v[j] /= a.v[j].n[j]; - a.v[j] /= a.v[j].n[j]; - - // Eliminate off-diagonal elems in col j of a, doing identical ops to b - for (i=0; i<3; i++) - if (i!=j) - { - b.v[i] -= a.v[i].n[j]*b.v[j]; - a.v[i] -= a.v[i].n[j]*a.v[j]; - } - } - - return b; -} - -mat3 &mat3::apply(V_FCT_PTR fct) -{ - v[VX].apply(fct); - v[VY].apply(fct); - v[VZ].apply(fct); - return *this; -} - - -// FRIENDS - -mat3 operator-(const mat3 &a) -{ - return mat3(-a.v[0], -a.v[1], -a.v[2]); -} - -mat3 operator+(const mat3 &a, const mat3 &b) -{ - return mat3(a.v[0]+b.v[0], a.v[1]+b.v[1], a.v[2]+b.v[2]); -} - -mat3 operator-(const mat3 &a, const mat3 &b) -{ - return mat3(a.v[0]-b.v[0], a.v[1]-b.v[1], a.v[2]-b.v[2]); -} - -mat3 operator*(const mat3 &a, const mat3 &b) -{ - #define ROWCOL(i, j) \ - a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + a.v[i].n[2]*b.v[2][j] - - return mat3( - vec3(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)), - vec3(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)), - vec3(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2))); - - #undef ROWCOL -} - -mat3 operator*(const mat3 &a, float d) -{ - return mat3(a.v[0]*d, a.v[1]*d, a.v[2]*d); -} - -mat3 operator*(float d, const mat3 &a) -{ - return a*d; -} - -mat3 operator/(const mat3 &a, float d) -{ - return mat3(a.v[0]/d, a.v[1]/d, a.v[2]/d); -} - -int operator==(const mat3 &a, const mat3 &b) -{ - return - (a.v[0] == b.v[0]) && - (a.v[1] == b.v[1]) && - (a.v[2] == b.v[2]); -} - -int operator!=(const mat3 &a, const mat3 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, mat3& m) -{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ]; } - -istream& operator >> (istream& s, mat3& m) { - mat3 m_tmp; - - s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ]; - if (s) - m = m_tmp; - return s; -} -*/ - -void swap(mat3 &a, mat3 &b) -{ - mat3 tmp(a); - a = b; - b = tmp; -} - -void mat3::print(FILE *file, const char *name) const -{ - int i, j; - - fprintf( stderr, "%s:\n", name ); - - for( i = 0; i < 3; i++ ) - { - fprintf( stderr, " " ); - for( j = 0; j < 3; j++ ) - { - fprintf( stderr, "%f ", v[i][j] ); - } - fprintf( stderr, "\n" ); - } -} - - - -/**************************************************************** - * * - * mat4 member functions * - * * - ****************************************************************/ - -// CONSTRUCTORS - -mat4::mat4() -{ - *this = identity3D(); -} - -mat4::mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3) -{ - v[0] = v0; - v[1] = v1; - v[2] = v2; - v[3] = v3; -} - -mat4::mat4(const mat4 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - v[3] = m.v[3]; -} - -mat4::mat4( - float a00, float a01, float a02, float a03, - float a10, float a11, float a12, float a13, - float a20, float a21, float a22, float a23, - float a30, float a31, float a32, float a33 ) -{ - v[0][0] = a00; v[0][1] = a01; v[0][2] = a02; v[0][3] = a03; - v[1][0] = a10; v[1][1] = a11; v[1][2] = a12; v[1][3] = a13; - v[2][0] = a20; v[2][1] = a21; v[2][2] = a22; v[2][3] = a23; - v[3][0] = a30; v[3][1] = a31; v[3][2] = a32; v[3][3] = a33; -} - -// ASSIGNMENT OPERATORS - -mat4 &mat4::operator=(const mat4 &m) -{ - v[0] = m.v[0]; - v[1] = m.v[1]; - v[2] = m.v[2]; - v[3] = m.v[3]; - return *this; -} - -mat4 &mat4::operator+=(const mat4 &m) -{ - v[0] += m.v[0]; - v[1] += m.v[1]; - v[2] += m.v[2]; - v[3] += m.v[3]; - return *this; -} - -mat4 &mat4::operator-=(const mat4 &m) -{ - v[0] -= m.v[0]; - v[1] -= m.v[1]; - v[2] -= m.v[2]; - v[3] -= m.v[3]; - return *this; -} - -mat4 &mat4::operator*=(float d) -{ - v[0] *= d; - v[1] *= d; - v[2] *= d; - v[3] *= d; - return *this; -} - -mat4 &mat4::operator/=(float d) -{ - v[0] /= d; - v[1] /= d; - v[2] /= d; - v[3] /= d; - return *this; -} - -vec4 &mat4::operator[](int i) -{ - if (i < VX || i > VW) - //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat4 [] operator: illegal access" ); - return v[i]; -} - -const vec4 &mat4::operator[](int i) const -{ - if (i < VX || i > VW) - //VEC_ERROR("mat4 [] operator: illegal access; index = " << i << '\n') - VEC_ERROR("mat4 [] operator: illegal access" ); - return v[i]; -} - -// SPECIAL FUNCTIONS; - -mat4 mat4::transpose() const -{ - return mat4( - vec4(v[0][0], v[1][0], v[2][0], v[3][0]), - vec4(v[0][1], v[1][1], v[2][1], v[3][1]), - vec4(v[0][2], v[1][2], v[2][2], v[3][2]), - vec4(v[0][3], v[1][3], v[2][3], v[3][3])); -} - -mat4 mat4::inverse() const // Gauss-Jordan elimination with partial pivoting -{ - mat4 a(*this); // As a evolves from original mat into identity - mat4 b(identity3D()); // b evolves from identity into inverse(a) - int i, j, i1; - - // Loop over cols of a from left to right, eliminating above and below diag - for (j=0; j<4; j++) // Find largest pivot in column j among rows j..3 - { - i1 = j; // Row with largest pivot candidate - for (i=j+1; i<4; i++) - if (fabs(a.v[i].n[j]) > fabs(a.v[i1].n[j])) - i1 = i; - - // Swap rows i1 and j in a and b to put pivot on diagonal - swap(a.v[i1], a.v[j]); - swap(b.v[i1], b.v[j]); - - // Scale row j to have a unit diagonal - if (a.v[j].n[j]==0.) - VEC_ERROR("mat4::inverse: singular matrix; can't invert\n"); - - b.v[j] /= a.v[j].n[j]; - a.v[j] /= a.v[j].n[j]; - - // Eliminate off-diagonal elems in col j of a, doing identical ops to b - for (i=0; i<4; i++) - if (i!=j) - { - b.v[i] -= a.v[i].n[j]*b.v[j]; - a.v[i] -= a.v[i].n[j]*a.v[j]; - } - } - - return b; -} - -mat4 &mat4::apply(V_FCT_PTR fct) -{ - v[VX].apply(fct); - v[VY].apply(fct); - v[VZ].apply(fct); - v[VW].apply(fct); - return *this; -} - -void mat4::print(FILE *file, const char *name) const -{ - int i, j; - - fprintf( stderr, "%s:\n", name ); - - for( i = 0; i < 4; i++ ) - { - fprintf( stderr, " " ); - for( j = 0; j < 4; j++ ) - { - fprintf( stderr, "%f ", v[i][j] ); - } - fprintf( stderr, "\n" ); - } -} - -void mat4::swap_rows(int i, int j) -{ - vec4 t; - - t = v[i]; - v[i] = v[j]; - v[j] = t; -} - -void mat4::swap_cols(int i, int j) -{ - float t; - int k; - - for (k=0; k<4; k++) - { - t = v[k][i]; - v[k][i] = v[k][j]; - v[k][j] = t; - } -} - - -// FRIENDS - -mat4 operator-(const mat4 &a) -{ - return mat4(-a.v[0],-a.v[1],-a.v[2],-a.v[3]); -} - -mat4 operator+(const mat4 &a, const mat4 &b) -{ - return mat4( - a.v[0] + b.v[0], - a.v[1] + b.v[1], - a.v[2] + b.v[2], - a.v[3] + b.v[3]); -} - -mat4 operator-(const mat4 &a, const mat4 &b) -{ - return mat4( - a.v[0] - b.v[0], - a.v[1] - b.v[1], - a.v[2] - b.v[2], - a.v[3] - b.v[3]); -} - -mat4 operator*(const mat4 &a, const mat4 &b) -{ - #define ROWCOL(i, j) \ - a.v[i].n[0]*b.v[0][j] + \ - a.v[i].n[1]*b.v[1][j] + \ - a.v[i].n[2]*b.v[2][j] + \ - a.v[i].n[3]*b.v[3][j] - - return mat4( - vec4(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)), - vec4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)), - vec4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)), - vec4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3)) - ); - - #undef ROWCOL -} - -mat4 operator*(const mat4 &a, float d) -{ - return mat4(a.v[0]*d, a.v[1]*d, a.v[2]*d, a.v[3]*d); -} - -mat4 operator*(float d, const mat4 &a) -{ - return a*d; -} - -mat4 operator/(const mat4 &a, float d) -{ - return mat4(a.v[0]/d, a.v[1]/d, a.v[2]/d, a.v[3]/d); -} - -int operator==(const mat4 &a, const mat4 &b) -{ - return - (a.v[0] == b.v[0]) && - (a.v[1] == b.v[1]) && - (a.v[2] == b.v[2]) && - (a.v[3] == b.v[3]); -} - -int operator!=(const mat4 &a, const mat4 &b) -{ - return !(a == b); -} - -/*ostream& operator << (ostream& s, mat4& m) -{ return s << m.v[VX] << '\n' << m.v[VY] << '\n' << m.v[VZ] << '\n' << m.v[VW]; } - -istream& operator >> (istream& s, mat4& m) -{ - mat4 m_tmp; - - s >> m_tmp[VX] >> m_tmp[VY] >> m_tmp[VZ] >> m_tmp[VW]; - if (s) - m = m_tmp; - return s; -} -*/ - -void swap(mat4 &a, mat4 &b) -{ - mat4 tmp(a); - a = b; - b = tmp; -} - -/**************************************************************** - * * - * 2D functions and 3D functions * - * * - ****************************************************************/ - -mat3 identity2D() -{ - return mat3( - vec3(1.0, 0.0, 0.0), - vec3(0.0, 1.0, 0.0), - vec3(0.0, 0.0, 1.0)); -} - -mat3 translation2D(const vec2 &v) -{ - return mat3( - vec3(1.0, 0.0, v[VX]), - vec3(0.0, 1.0, v[VY]), - vec3(0.0, 0.0, 1.0)); -} - -mat3 rotation2D(const vec2 &Center, float angleDeg) -{ - float angleRad = (float) (angleDeg * M_PI / 180.0); - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - - return mat3( - vec3(c, -s, Center[VX] * (1.0f-c) + Center[VY] * s), - vec3(s, c, Center[VY] * (1.0f-c) - Center[VX] * s), - vec3(0.0, 0.0, 1.0)); -} - -mat3 scaling2D(const vec2 &scaleVector) -{ - return mat3( - vec3(scaleVector[VX], 0.0, 0.0), - vec3(0.0, scaleVector[VY], 0.0), - vec3(0.0, 0.0, 1.0)); -} - -mat4 identity3D() -{ - return mat4( - vec4(1.0, 0.0, 0.0, 0.0), - vec4(0.0, 1.0, 0.0, 0.0), - vec4(0.0, 0.0, 1.0, 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 translation3D(const vec3 &v) -{ - return mat4( - vec4(1.0, 0.0, 0.0, v[VX]), - vec4(0.0, 1.0, 0.0, v[VY]), - vec4(0.0, 0.0, 1.0, v[VZ]), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 rotation3D(const vec3 &Axis, float angleDeg) -{ - float angleRad = (float) (angleDeg * M_PI / 180.0); - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - float t = 1.0f - c; - - vec3 axis(Axis); - axis.normalize(); - - return mat4( - vec4(t * axis[VX] * axis[VX] + c, - t * axis[VX] * axis[VY] - s * axis[VZ], - t * axis[VX] * axis[VZ] + s * axis[VY], - 0.0), - vec4(t * axis[VX] * axis[VY] + s * axis[VZ], - t * axis[VY] * axis[VY] + c, - t * axis[VY] * axis[VZ] - s * axis[VX], - 0.0), - vec4(t * axis[VX] * axis[VZ] - s * axis[VY], - t * axis[VY] * axis[VZ] + s * axis[VX], - t * axis[VZ] * axis[VZ] + c, - 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 rotation3Drad(const vec3 &Axis, float angleRad) -{ - float c = (float) cos(angleRad); - float s = (float) sin(angleRad); - float t = 1.0f - c; - - vec3 axis(Axis); - axis.normalize(); - - return mat4( - vec4(t * axis[VX] * axis[VX] + c, - t * axis[VX] * axis[VY] - s * axis[VZ], - t * axis[VX] * axis[VZ] + s * axis[VY], - 0.0), - vec4(t * axis[VX] * axis[VY] + s * axis[VZ], - t * axis[VY] * axis[VY] + c, - t * axis[VY] * axis[VZ] - s * axis[VX], - 0.0), - vec4(t * axis[VX] * axis[VZ] - s * axis[VY], - t * axis[VY] * axis[VZ] + s * axis[VX], - t * axis[VZ] * axis[VZ] + c, - 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 scaling3D(const vec3 &scaleVector) -{ - return mat4( - vec4(scaleVector[VX], 0.0, 0.0, 0.0), - vec4(0.0, scaleVector[VY], 0.0, 0.0), - vec4(0.0, 0.0, scaleVector[VZ], 0.0), - vec4(0.0, 0.0, 0.0, 1.0)); -} - -mat4 perspective3D(float d) -{ - return mat4( - vec4(1.0f, 0.0f, 0.0f, 0.0f), - vec4(0.0f, 1.0f, 0.0f, 0.0f), - vec4(0.0f, 0.0f, 1.0f, 0.0f), - vec4(0.0f, 0.0f, 1.0f/d, 0.0f)); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.h deleted file mode 100644 index c47f22787..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/algebra3.h +++ /dev/null @@ -1,482 +0,0 @@ -/* - - algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -/************************************************************************** - - There are three vector classes and two matrix classes: vec2, vec3, - vec4, mat3, and mat4. - - All the standard arithmetic operations are defined, with '*' - for dot product of two vectors and multiplication of two matrices, - and '^' for cross product of two vectors. - - Additional functions include length(), normalize(), homogenize for - vectors, and print(), set(), apply() for all classes. - - There is a function transpose() for matrices, but note that it - does not actually change the matrix, - - When multiplied with a matrix, a vector is treated as a row vector - if it precedes the matrix (v*M), and as a column vector if it - follows the matrix (M*v). - - Matrices are stored in row-major form. - - A vector of one dimension (2d, 3d, or 4d) can be cast to a vector - of a higher or lower dimension. If casting to a higher dimension, - the new component is set by default to 1.0, unless a value is - specified: - vec3 a(1.0, 2.0, 3.0 ); - vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0}; - When casting to a lower dimension, the vector is homogenized in - the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the - resulting vector is {X/W, Y/W, Z/W}. It is up to the user to - insure the fourth component is not zero before casting. - - There are also the following function for building matrices: - identity2D(), translation2D(), rotation2D(), - scaling2D(), identity3D(), translation3D(), - rotation3D(), rotation3Drad(), scaling3D(), - perspective3D() - - NOTE: When compiling for Windows, include this file first, to avoid - certain name conflicts - - --------------------------------------------------------------------- - - Author: Jean-Francois DOUEg - Revised: Paul Rademacher - Version 3.2 - Feb 1998 - Revised: Nigel Stewart (GLUI Code Cleaning) - -**************************************************************************/ - -#ifndef GLUI_ALGEBRA3_H -#define GLUI_ALGEBRA3_H - -#include -#include -#include - -// this line defines a new type: pointer to a function which returns a -// float and takes as argument a float -typedef float (*V_FCT_PTR)(float); - -class vec2; -class vec3; -class vec4; -class mat3; -class mat4; - -#ifndef M_PI -#define M_PI 3.141592654 -#endif - -enum {VX, VY, VZ, VW}; // axes -enum {PA, PB, PC, PD}; // planes -enum {RED, GREEN, BLUE, ALPHA}; // colors -enum {KA, KD, KS, ES}; // phong coefficients - -/**************************************************************** - * * - * 2D Vector * - * * - ****************************************************************/ - -class vec2 -{ - friend class vec3; - -protected: - - float n[2]; - -public: - - // Constructors - - vec2(); - vec2(float x, float y); - vec2(const vec2 &v); // copy constructor - vec2(const vec3 &v); // cast v3 to v2 - vec2(const vec3 &v, int dropAxis); // cast v3 to v2 - - // Assignment operators - - vec2 &operator = (const vec2 &v); // assignment of a vec2 - vec2 &operator += (const vec2 &v); // incrementation by a vec2 - vec2 &operator -= (const vec2 &v); // decrementation by a vec2 - vec2 &operator *= (float d); // multiplication by a constant - vec2 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec2 - float length2() const; // squared length of a vec2 - vec2 &normalize(); // normalize a vec2 - vec2 &apply(V_FCT_PTR fct); // apply a func. to each component - void set(float x, float y); // set vector - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec2 operator - (const vec2 &v); // -v1 - friend vec2 operator + (const vec2 &a, const vec2 &b); // v1 + v2 - friend vec2 operator - (const vec2 &a, const vec2 &b); // v1 - v2 - friend vec2 operator * (const vec2 &a, float d); // v1 * 3.0 - friend vec2 operator * (float d, const vec2 &a); // 3.0 * v1 - friend vec2 operator * (const mat3 &a, const vec2 &v); // M . v - friend vec2 operator * (const vec2 &v, const mat3 &a); // v . M - friend float operator * (const vec2 &a, const vec2 &b); // dot product - friend vec2 operator / (const vec2 &a, float d); // v1 / 3.0 - friend vec3 operator ^ (const vec2 &a, const vec2 &b); // cross product - friend int operator == (const vec2 &a, const vec2 &b); // v1 == v2 ? - friend int operator != (const vec2 &a, const vec2 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec2& v); // output to stream - //friend istream& operator >> (istream& s, vec2& v); // input from strm. - friend void swap(vec2 &a, vec2 &b); // swap v1 & v2 - friend vec2 min_vec(const vec2 &a, const vec2 &b); // min(v1, v2) - friend vec2 max_vec(const vec2 &a, const vec2 &b); // max(v1, v2) - friend vec2 prod (const vec2 &a, const vec2 &b); // term by term * -}; - -/**************************************************************** - * * - * 3D Vector * - * * - ****************************************************************/ - -class vec3 -{ - friend class vec2; - friend class vec4; - friend class mat3; - -protected: - - float n[3]; - -public: - - // Constructors - - vec3(); - vec3(float x, float y, float z); - vec3(const vec3 &v); // copy constructor - vec3(const vec2 &v); // cast v2 to v3 - vec3(const vec2 &v, float d); // cast v2 to v3 - vec3(const vec4 &v); // cast v4 to v3 - vec3(const vec4 &v, int dropAxis); // cast v4 to v3 - - // Assignment operators - - vec3 &operator = (const vec3 &v); // assignment of a vec3 - vec3 &operator += (const vec3 &v); // incrementation by a vec3 - vec3 &operator -= (const vec3 &v); // decrementation by a vec3 - vec3 &operator *= (float d); // multiplication by a constant - vec3 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec3 - float length2() const; // squared length of a vec3 - vec3& normalize(); // normalize a vec3 - vec3& homogenize(); // homogenize (div by Z) - vec3& apply(V_FCT_PTR fct); // apply a func. to each component - void set(float x, float y, float z); // set vector - - void print(FILE *file, const char *name) const; // print vector to a file - - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec3 operator - (const vec3 &v); // -v1 - friend vec3 operator + (const vec3 &a, const vec3 &b); // v1 + v2 - friend vec3 operator - (const vec3 &a, const vec3 &b); // v1 - v2 - friend vec3 operator * (const vec3 &a, float d); // v1 * 3.0 - friend vec3 operator * (float d, const vec3 &a); // 3.0 * v1 - friend vec3 operator * (const mat4 &a, const vec3 &v); // M . v - friend vec3 operator * (const vec3 &v, const mat4 &a); // v . M - friend float operator * (const vec3 &a, const vec3 &b); // dot product - friend vec3 operator / (const vec3 &a, float d); // v1 / 3.0 - friend vec3 operator ^ (const vec3 &a, const vec3 &b); // cross product - friend int operator == (const vec3 &a, const vec3 &b); // v1 == v2 ? - friend int operator != (const vec3 &a, const vec3 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec3& v); // output to stream - //friend istream& operator >> (istream& s, vec3& v); // input from strm. - friend void swap(vec3 &a, vec3 &b); // swap v1 & v2 - friend vec3 min_vec(const vec3 &a, const vec3 &b); // min(v1, v2) - friend vec3 max_vec(const vec3 &a, const vec3 &b); // max(v1, v2) - friend vec3 prod(const vec3 &a, const vec3 &b); // term by term * - - // necessary friend declarations - - friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform - friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform - friend mat3 operator * (const mat3 &a, const mat3 &b); // matrix 3 product -}; - -/**************************************************************** - * * - * 4D Vector * - * * - ****************************************************************/ - -class vec4 -{ - friend class vec3; - friend class mat4; - -protected: - - float n[4]; - -public: - - // Constructors - - vec4(); - vec4(float x, float y, float z, float w); - vec4(const vec4 &v); // copy constructor - vec4(const vec3 &v); // cast vec3 to vec4 - vec4(const vec3 &v, float d); // cast vec3 to vec4 - - // Assignment operators - - vec4 &operator = (const vec4 &v); // assignment of a vec4 - vec4 &operator += (const vec4 &v); // incrementation by a vec4 - vec4 &operator -= (const vec4 &v); // decrementation by a vec4 - vec4 &operator *= (float d); // multiplication by a constant - vec4 &operator /= (float d); // division by a constant - - // special functions - - float length() const; // length of a vec4 - float length2() const; // squared length of a vec4 - vec4 &normalize(); // normalize a vec4 - vec4 &apply(V_FCT_PTR fct); // apply a func. to each component - vec4 &homogenize(); - - void print(FILE *file, const char *name) const; // print vector to a file - - void set(float x, float y, float z, float a); - - float &operator [] (int i); // indexing - const float &operator [] (int i) const; // indexing - - // friends - - friend vec4 operator - (const vec4 &v); // -v1 - friend vec4 operator + (const vec4 &a, const vec4 &b); // v1 + v2 - friend vec4 operator - (const vec4 &a, const vec4 &b); // v1 - v2 - friend vec4 operator * (const vec4 &a, float d); // v1 * 3.0 - friend vec4 operator * (float d, const vec4 &a); // 3.0 * v1 - friend vec4 operator * (const mat4 &a, const vec4 &v); // M . v - friend vec4 operator * (const vec4 &v, const mat4 &a); // v . M - friend float operator * (const vec4 &a, const vec4 &b); // dot product - friend vec4 operator / (const vec4 &a, float d); // v1 / 3.0 - friend int operator == (const vec4 &a, const vec4 &b); // v1 == v2 ? - friend int operator != (const vec4 &a, const vec4 &b); // v1 != v2 ? - //friend ostream& operator << (ostream& s, vec4& v); // output to stream - //friend istream& operator >> (istream& s, vec4& v); // input from strm. - friend void swap(vec4 &a, vec4 &b); // swap v1 & v2 - friend vec4 min_vec(const vec4 &a, const vec4 &b); // min(v1, v2) - friend vec4 max_vec(const vec4 &a, const vec4 &b); // max(v1, v2) - friend vec4 prod (const vec4 &a, const vec4 &b); // term by term * - - // necessary friend declarations - - friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform - friend mat4 operator * (const mat4 &a, const mat4 &b); // matrix 4 product -}; - -/**************************************************************** - * * - * 3x3 Matrix * - * * - ****************************************************************/ - -class mat3 -{ -protected: - - vec3 v[3]; - -public: - - // Constructors - - mat3(); - mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2); - mat3(const mat3 &m); - - // Assignment operators - - mat3 &operator = (const mat3 &m); // assignment of a mat3 - mat3 &operator += (const mat3 &m); // incrementation by a mat3 - mat3 &operator -= (const mat3 &m); // decrementation by a mat3 - mat3 &operator *= (float d); // multiplication by a constant - mat3 &operator /= (float d); // division by a constant - - // special functions - - mat3 transpose() const; // transpose - mat3 inverse() const; // inverse - mat3 &apply(V_FCT_PTR fct); // apply a func. to each element - - void print(FILE *file, const char *name ) const; // print matrix to a file - - void set(const vec3 &v0, const vec3 &v1, const vec3 &v2); - - vec3 &operator [] (int i); // indexing - const vec3 &operator [] (int i) const; // indexing - - // friends - - friend mat3 operator - (const mat3 &a); // -m1 - friend mat3 operator + (const mat3 &a, const mat3 &b); // m1 + m2 - friend mat3 operator - (const mat3 &a, const mat3 &b); // m1 - m2 - friend mat3 operator * (const mat3 &a, const mat3 &b); // m1 * m2 - friend mat3 operator * (const mat3 &a, float d); // m1 * 3.0 - friend mat3 operator * (float d, const mat3 &a); // 3.0 * m1 - friend mat3 operator / (const mat3 &a, float d); // m1 / 3.0 - friend int operator == (const mat3 &a, const mat3 &b); // m1 == m2 ? - friend int operator != (const mat3 &a, const mat3 &b); // m1 != m2 ? - //friend ostream& operator << (ostream& s, mat3& m); // output to stream - //friend istream& operator >> (istream& s, mat3& m); // input from strm. - friend void swap(mat3 &a, mat3 &b); // swap m1 & m2 - - // necessary friend declarations - - friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform - friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform -}; - -/**************************************************************** - * * - * 4x4 Matrix * - * * - ****************************************************************/ - -class mat4 -{ -protected: - - vec4 v[4]; - -public: - - // Constructors - - mat4(); - mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3); - mat4(const mat4 &m); - mat4(float a00, float a01, float a02, float a03, - float a10, float a11, float a12, float a13, - float a20, float a21, float a22, float a23, - float a30, float a31, float a32, float a33 ); - - - // Assignment operators - - mat4 &operator = (const mat4 &m); // assignment of a mat4 - mat4 &operator += (const mat4 &m); // incrementation by a mat4 - mat4 &operator -= (const mat4 &m); // decrementation by a mat4 - mat4 &operator *= (float d); // multiplication by a constant - mat4 &operator /= (float d); // division by a constant - - // special functions - - mat4 transpose() const; // transpose - mat4 inverse() const; // inverse - mat4 &apply(V_FCT_PTR fct); // apply a func. to each element - - void print(FILE *file, const char *name) const; // print matrix to a file - - vec4 &operator [] (int i); // indexing - const vec4 &operator [] (int i) const; // indexing - - void swap_rows(int i, int j); // swap rows i and j - void swap_cols(int i, int j); // swap cols i and j - - // friends - - friend mat4 operator - (const mat4 &a); // -m1 - friend mat4 operator + (const mat4 &a, const mat4 &b); // m1 + m2 - friend mat4 operator - (const mat4 &a, const mat4 &b); // m1 - m2 - friend mat4 operator * (const mat4 &a, const mat4 &b); // m1 * m2 - friend mat4 operator * (const mat4 &a, float d); // m1 * 4.0 - friend mat4 operator * (float d, const mat4 &a); // 4.0 * m1 - friend mat4 operator / (const mat4 &a, float d); // m1 / 3.0 - friend int operator == (const mat4 &a, const mat4 &b); // m1 == m2 ? - friend int operator != (const mat4 &a, const mat4 &b); // m1 != m2 ? - //friend ostream& operator << (ostream& s, mat4& m); // output to stream - //friend istream& operator >> (istream& s, mat4& m); // input from strm. - friend void swap(mat4 &a, mat4 &b); // swap m1 & m2 - - // necessary friend declarations - - friend vec4 operator * (const mat4 &a, const vec4 &v); // linear transform - //friend vec4 operator * (const vec4& v, const mat4& a); // linear transform - friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform - friend vec3 operator * (const vec3 &v, const mat4 &a); // linear transform -}; - -/**************************************************************** - * * - * 2D functions and 3D functions * - * * - ****************************************************************/ - -mat3 identity2D (); // identity 2D -mat3 translation2D(const vec2 &v); // translation 2D -mat3 rotation2D (const vec2 &Center, float angleDeg); // rotation 2D -mat3 scaling2D (const vec2 &scaleVector); // scaling 2D -mat4 identity3D (); // identity 3D -mat4 translation3D(const vec3 &v); // translation 3D -mat4 rotation3D (const vec3 &Axis, float angleDeg); // rotation 3D -mat4 rotation3Drad(const vec3 &Axis, float angleRad); // rotation 3D -mat4 scaling3D (const vec3 &scaleVector); // scaling 3D -mat4 perspective3D(float d); // perspective 3D - -vec3 operator * (const vec3 &v, const mat3 &a); -vec2 operator * (const vec2 &v, const mat3 &a); -vec3 operator * (const vec3 &v, const mat4 &a); -vec4 operator * (const vec4 &v, const mat4 &a); - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.cpp deleted file mode 100644 index ab866f337..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/********************************************************************** - - arcball.cpp - - - -------------------------------------------------- - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -**********************************************************************/ - -#include "arcball.h" - -#include - - -/**************************************** Arcball::Arcball() ****/ -/* Default (void) constructor for Arcball */ - -Arcball::Arcball() -{ - rot_ptr = &rot; - init(); -} - -/**************************************** Arcball::Arcball() ****/ -/* Takes as argument a mat4 to use instead of the internal rot */ - -Arcball::Arcball(mat4 *mtx) -{ - rot_ptr = mtx; -} - - -/**************************************** Arcball::Arcball() ****/ -/* A constructor that accepts the screen center and arcball radius*/ - -Arcball::Arcball(const vec2 &_center, float _radius) -{ - rot_ptr = &rot; - init(); - set_params(_center, _radius); -} - - -/************************************** Arcball::set_params() ****/ - -void Arcball::set_params(const vec2 &_center, float _radius) -{ - center = _center; - radius = _radius; -} - -/*************************************** Arcball::init() **********/ - -void Arcball::init() -{ - center.set( 0.0, 0.0 ); - radius = 1.0; - q_now = quat_identity(); - *rot_ptr = identity3D(); - q_increment = quat_identity(); - rot_increment = identity3D(); - is_mouse_down = false; - is_spinning = false; - damp_factor = 0.0; - zero_increment = true; -} - -/*********************************** Arcball::mouse_to_sphere() ****/ - -vec3 Arcball::mouse_to_sphere(const vec2 &p) -{ - float mag; - vec2 v2 = (p - center) / radius; - vec3 v3( v2[0], v2[1], 0.0 ); - - mag = v2*v2; - - if ( mag > 1.0 ) - v3.normalize(); - else - v3[VZ] = (float) sqrt( 1.0 - mag ); - - /* Now we add constraints - X takes precedence over Y */ - if ( constraint_x ) - { - v3 = constrain_vector( v3, vec3( 1.0, 0.0, 0.0 )); - } - else if ( constraint_y ) - { - v3 = constrain_vector( v3, vec3( 0.0, 1.0, 0.0 )); - } - - return v3; -} - - -/************************************ Arcball::constrain_vector() ****/ - -vec3 Arcball::constrain_vector(const vec3 &vector, const vec3 &axis) -{ - return (vector-(vector*axis)*axis).normalize(); -} - -/************************************ Arcball::mouse_down() **********/ - -void Arcball::mouse_down(int x, int y) -{ - down_pt.set( (float)x, (float) y ); - is_mouse_down = true; - - q_increment = quat_identity(); - rot_increment = identity3D(); - zero_increment = true; -} - - -/************************************ Arcball::mouse_up() **********/ - -void Arcball::mouse_up() -{ - q_now = q_drag * q_now; - is_mouse_down = false; -} - - -/********************************** Arcball::mouse_motion() **********/ - -void Arcball::mouse_motion(int x, int y, int shift, int ctrl, int alt) -{ - /* Set the X constraint if CONTROL key is pressed, Y if ALT key */ - set_constraints( ctrl != 0, alt != 0 ); - - vec2 new_pt( (float)x, (float) y ); - vec3 v0 = mouse_to_sphere( down_pt ); - vec3 v1 = mouse_to_sphere( new_pt ); - - vec3 cross = v0^v1; - - q_drag.set( cross, v0 * v1 ); - - // *rot_ptr = (q_drag * q_now).to_mat4(); - mat4 temp = q_drag.to_mat4(); - *rot_ptr = *rot_ptr * temp; - - down_pt = new_pt; - - /* We keep a copy of the current incremental rotation (= q_drag) */ - q_increment = q_drag; - rot_increment = q_increment.to_mat4(); - - set_constraints(false, false); - - if ( q_increment.s < .999999 ) - { - is_spinning = true; - zero_increment = false; - } - else - { - is_spinning = false; - zero_increment = true; - } -} - - -/********************************** Arcball::mouse_motion() **********/ - -void Arcball::mouse_motion(int x, int y) -{ - mouse_motion(x, y, 0, 0, 0); -} - - -/***************************** Arcball::set_constraints() **********/ - -void Arcball::set_constraints(bool _constraint_x, bool _constraint_y) -{ - constraint_x = _constraint_x; - constraint_y = _constraint_y; -} - -/***************************** Arcball::idle() *********************/ - -void Arcball::idle() -{ - if (is_mouse_down) - { - is_spinning = false; - zero_increment = true; - } - - if (damp_factor < 1.0f) - q_increment.scale_angle(1.0f - damp_factor); - - rot_increment = q_increment.to_mat4(); - - if (q_increment.s >= .999999f) - { - is_spinning = false; - zero_increment = true; - } -} - - -/************************ Arcball::set_damping() *********************/ - -void Arcball::set_damping(float d) -{ - damp_factor = d; -} - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.h deleted file mode 100644 index 0f53b8f8e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/arcball.h +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - - arcball.h - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - --------------------------------------------------------------------- - - A C++ class that implements the Arcball, as described by Ken - Shoemake in Graphics Gems IV. - This class takes as input mouse events (mouse down, mouse drag, - mouse up), and creates the appropriate quaternions and 4x4 matrices - to represent the rotation given by the mouse. - - This class is used as follows: - - initialize [either in the constructor or with set_params()], the - center position (x,y) of the arcball on the screen, and the radius - - on mouse down, call mouse_down(x,y) with the mouse position - - as the mouse is dragged, repeatedly call mouse_motion() with the - current x and y positions. One can optionally pass in the current - state of the SHIFT, ALT, and CONTROL keys (passing zero if keys - are not pressed, non-zero otherwise), which constrains - the rotation to certain axes (X for CONTROL, Y for ALT). - - when the mouse button is released, call mouse_up() - - Axis constraints can also be explicitly set with the - set_constraints() function. - - The current rotation is stored in the 4x4 float matrix 'rot'. - It is also stored in the quaternion 'q_now'. - -**********************************************************************/ - -#ifndef GLUI_ARCBALL_H -#define GLUI_ARCBALL_H - -#include "glui_internal.h" -#include "algebra3.h" -#include "quaternion.h" - -class Arcball -{ -public: - Arcball(); - Arcball(mat4 *mtx); - Arcball(const vec2 ¢er, float radius); - - void set_damping(float d); - void idle(); - void mouse_down(int x, int y); - void mouse_up(); - void mouse_motion(int x, int y, int shift, int ctrl, int alt); - void mouse_motion(int x, int y); - void set_constraints(bool constrain_x, bool constrain_y); - void set_params(const vec2 ¢er, float radius); - void reset_mouse(); - void init(); - - vec3 constrain_vector(const vec3 &vector, const vec3 &axis); - vec3 mouse_to_sphere(const vec2 &p); - - //public: - int is_mouse_down; /* true for down, false for up */ - int is_spinning; - quat q_now, q_down, q_drag, q_increment; - vec2 down_pt; - mat4 rot, rot_increment; - mat4 *rot_ptr; - - bool constraint_x, constraint_y; - vec2 center; - float radius, damp_factor; - int zero_increment; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui.cpp deleted file mode 100644 index 83935d307..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui.cpp +++ /dev/null @@ -1,2112 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui.cpp - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ -#include "glui_internal_control.h" - - -/** - Note: moving this routine here from glui_add_controls.cpp prevents the linker - from touching glui_add_controls.o in non-deprecated programs, which - descreases the linked size of small GLUI programs substantially (100K+). (OSL 2006/06) -*/ -void GLUI_Node::add_child_to_control(GLUI_Node *parent,GLUI_Control *child) -{ - GLUI_Control *parent_control; - - /*** Collapsible nodes have to be handled differently, b/c the first and - last children are swapped in and out ***/ - parent_control = ((GLUI_Control*)parent); - if ( parent_control->collapsible == true ) { - if ( NOT parent_control->is_open ) { - /** Swap in the original first and last children **/ - parent_control->child_head = parent_control->collapsed_node.child_head; - parent_control->child_tail = parent_control->collapsed_node.child_tail; - - /*** Link this control ***/ - child->link_this_to_parent_last( parent_control ); - - /** Swap the children back out ***/ - parent_control->collapsed_node.child_head = parent_control->child_head; - parent_control->collapsed_node.child_tail = parent_control->child_tail; - parent_control->child_head = NULL; - parent_control->child_tail = NULL; - } - else { - child->link_this_to_parent_last( parent_control ); - } - } - else { - child->link_this_to_parent_last( parent_control ); - } - child->glui = (GLUI*) parent_control->glui; - child->update_size(); - child->enabled = parent_control->enabled; - child->glui->refresh(); - - /** Now set the 'hidden' var based on the parent **/ - if ( parent_control->hidden OR - (parent_control->collapsible AND NOT parent_control->is_open ) ) - { - child->hidden = true; - } -} - - -/************************************ GLUI_Node::add_control() **************/ - -int GLUI_Node::add_control( GLUI_Control *child ) -{ - add_child_to_control(this,child); - return true; -} - -/************************************ GLUI_Main::add_control() **************/ - -int GLUI_Main::add_control( GLUI_Node *parent, GLUI_Control *control ) -{ - add_child_to_control(parent,control); - return true; -} - - - -/*** This object must be used to create a GLUI ***/ - -GLUI_Master_Object GLUI_Master; - -/************************************ finish_drawing() *********** - Probably a silly routine. Called after all event handling callbacks. -*/ - -static void finish_drawing(void) -{ - glFinish(); -} - -/************************************ GLUI_CB::operator()() ************/ -void GLUI_CB::operator()(GLUI_Control*ctrl) const -{ - if (idCB) idCB(ctrl->user_id); - if (objCB) objCB(ctrl); -} - - -/************************************************ GLUI::GLUI() **********/ - -int GLUI::init( const char *text, long flags, int x, int y, int parent_window ) -{ - int old_glut_window; - - this->flags = flags; - - window_name = text; - - buffer_mode = buffer_back; ///< New smooth way - //buffer_mode = buffer_front; ///< Old flickery way (a bit faster). - - /*** We copy over the current window callthroughs ***/ - /*** (I think this might actually only be needed for subwindows) ***/ - /* glut_keyboard_CB = GLUI_Master.glut_keyboard_CB; - glut_reshape_CB = GLUI_Master.glut_reshape_CB; - glut_special_CB = GLUI_Master.glut_special_CB; - glut_mouse_CB = GLUI_Master.glut_mouse_CB;*/ - - - if ( (flags & GLUI_SUBWINDOW) != GLUI_SUBWINDOW ) { /* not a subwindow, creating a new top-level window */ - old_glut_window = glutGetWindow(); - - create_standalone_window( window_name.c_str(), x, y ); - setup_default_glut_callbacks(); - - if ( old_glut_window > 0 ) - glutSetWindow( old_glut_window ); - - top_level_glut_window_id = glut_window_id; - } - else /* *is* a subwindow */ - { - old_glut_window = glutGetWindow(); - - create_subwindow( parent_window, flags ); - setup_default_glut_callbacks(); - - if ( old_glut_window > 0 ) - glutSetWindow( old_glut_window ); - - top_level_glut_window_id = parent_window; - - /* - glutReshapeFunc( glui_parent_window_reshape_func ); - glutSpecialFunc( glui_parent_window_special_func ); - glutKeyboardFunc( glui_parent_window_keyboard_func ); - glutMouseFunc( glui_parent_window_mouse_func ); - */ - - } - - return true; -} - - -/**************************** GLUI_Main::create_standalone_window() ********/ - -void GLUI_Main::create_standalone_window( const char *name, int x, int y ) -{ - glutInitWindowSize( 100, 100 ); - if ( x >= 0 OR y >= 0 ) - glutInitWindowPosition( x, y ); - glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); - glut_window_id = glutCreateWindow( name ); -} - - -/******************************** GLUI_Main::create_subwindow() **********/ - -void GLUI_Main::create_subwindow( int parent_window, int window_alignment ) -{ - glut_window_id = glutCreateSubWindow(parent_window, 0,0, 100, 100); - this->parent_window = parent_window; -} - - -/**************************** GLUI_Main::setup_default_glut_callbacks() *****/ - -void GLUI_Main::setup_default_glut_callbacks( void ) -{ - glutDisplayFunc( glui_display_func ); - glutReshapeFunc( glui_reshape_func ); - glutKeyboardFunc( glui_keyboard_func ); - glutSpecialFunc( glui_special_func ); - glutMouseFunc( glui_mouse_func ); - glutMotionFunc( glui_motion_func ); - glutPassiveMotionFunc( glui_passive_motion_func ); - glutEntryFunc( glui_entry_func ); - glutVisibilityFunc( glui_visibility_func ); - /* glutIdleFunc( glui_idle_func ); // FIXME! 100% CPU usage! */ -} - - -/********************************************** glui_display_func() ********/ - -void glui_display_func(void) -{ - GLUI *glui; - - /* printf( "display func\n" ); */ - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->display(); - /* - Do not do anything after the above line, b/c the GLUI - window might have just closed itself - */ - } -} - - -/********************************************** glui_reshape_func() ********/ - -void glui_reshape_func(int w,int h ) -{ - GLUI *glui; - GLUI_Glut_Window *glut_window; - int current_window; - - /*printf( "glui_reshape_func(): %d w/h: %d/%d\n", glutGetWindow(), w, h ); */ - - current_window = glutGetWindow(); - - /*** First check if this is main glut window ***/ - glut_window = GLUI_Master.find_glut_window( current_window ); - if ( glut_window ) { - if (glut_window->glut_reshape_CB) glut_window->glut_reshape_CB(w,h); - - /*** Now send reshape events to all subwindows ***/ - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while(glui) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->reshape(w,h); - /* glui->check_subwindow_position(); */ - } - glui = (GLUI*) glui->next(); - } - } - else { - /*** A standalone GLUI window ***/ - - glui = GLUI_Master.find_glui_by_window_id( current_window ); - - if ( glui ) { - glui->reshape(w,h); - } - } -} - -/********************************************** glui_keyboard_func() ********/ - -void glui_keyboard_func(unsigned char key, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - /*printf( "key: %d\n", current_window ); */ - - if ( glut_window ) { /** Was event in a GLUT window? **/ - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->keyboard(key,x,y); - finish_drawing(); - - glutSetWindow( current_window ); - } - else { - if (glut_window->glut_keyboard_CB) - glut_window->glut_keyboard_CB( key, x, y ); - } - } - else { /*** Nope, event was in a standalone GLUI window **/ - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->keyboard(key,x,y); - finish_drawing(); - } - } -} - - -/************************************************ glui_special_func() ********/ - -void glui_special_func(int key, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - if (glut_window) /** Was event in a GLUT window? **/ - { - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) - { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->special(key,x,y); - finish_drawing(); - - glutSetWindow( current_window ); - } - else - { - if (glut_window->glut_special_CB) - glut_window->glut_special_CB( key, x, y ); - } - } - else /*** Nope, event was in a standalone GLUI window **/ - { - glui = GLUI_Master.find_glui_by_window_id(glutGetWindow()); - - if ( glui ) - { - glui->special(key,x,y); - finish_drawing(); - } - } -} - -/********************************************** glui_mouse_func() ********/ - -void glui_mouse_func(int button, int state, int x, int y) -{ - GLUI *glui; - int current_window; - GLUI_Glut_Window *glut_window; - - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - - if ( glut_window ) { /** Was event in a GLUT window? **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - if (glut_window->glut_mouse_CB) - glut_window->glut_mouse_CB( button, state, x, y ); - finish_drawing(); - } - else { /** Nope - event was in a GLUI standalone window **/ - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - if ( glui ) { - glui->passive_motion( 0,0 ); - glui->mouse( button, state, x, y ); - finish_drawing(); - } - } -} - - -/********************************************** glui_motion_func() ********/ - -void glui_motion_func(int x, int y) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->motion(x,y); - finish_drawing(); - } - -} - - -/**************************************** glui_passive_motion_func() ********/ - -void glui_passive_motion_func(int x, int y) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->passive_motion(x,y); - finish_drawing(); - } -} - - -/********************************************** glui_entry_func() ********/ - -void glui_entry_func(int state) -{ - GLUI *glui; - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->entry(state); - } -} - - -/******************************************** glui_visibility_func() ********/ - -void glui_visibility_func(int state) -{ - GLUI *glui; - - /* printf( "IN GLUI VISIBILITY()\n" ); */ - /* fflush( stdout ); */ - - glui = GLUI_Master.find_glui_by_window_id( glutGetWindow() ); - - if ( glui ) { - glui->visibility(state); - } -} - - -/********************************************** glui_idle_func() ********/ -/* Send idle event to each glui, then to the main window */ - -void glui_idle_func(void) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - glui->idle(); - finish_drawing(); - - glui = (GLUI*) glui->next(); - } - - if ( GLUI_Master.glut_idle_CB ) { - /*** We set the current glut window before calling the user's - idle function, even though glut explicitly says the window id is - undefined in an idle callback. ***/ - - /** Check what the current window is first ***/ - - /*** Arbitrarily set the window id to the main gfx window of the - first glui window ***/ - /* int current_window, new_window; */ - /* current_window = glutGetWindow(); */ - /* if (GLUI_Master.gluis.first_child() != NULL ) { */ - /* new_window = ((GLUI_Main*)GLUI_Master.gluis.first_child())-> */ - /* main_gfx_window_id; */ - /* if ( new_window > 0 AND new_window != old_window ) { */ - /* --- Window is changed only if its not already the current window ---*/ - /* glutSetWindow( new_window ); */ - /* } */ - /*} */ - - GLUI_Master.glut_idle_CB(); - } -} - -/*********************************** GLUI_Master_Object::GLUI_Master_Object() ******/ - -GLUI_Master_Object::GLUI_Master_Object() -: glui_id_counter(1), - glut_idle_CB(NULL) -{ -} - -GLUI_Master_Object::~GLUI_Master_Object() -{ -} - -/*********************************** GLUI_Master_Object::create_glui() ******/ - -GLUI *GLUI_Master_Object::create_glui( const char *name, long flags,int x,int y ) -{ - GLUI *new_glui = new GLUI; - new_glui->init( name, flags, x, y, -1 ); - new_glui->link_this_to_parent_last( &this->gluis ); - return new_glui; -} - - -/************************** GLUI_Master_Object::create_glui_subwindow() ******/ - -GLUI *GLUI_Master_Object::create_glui_subwindow( int parent_window, - long flags ) -{ - GLUI *new_glui = new GLUI; - GLUI_String new_name; - glui_format_str( new_name, "subwin_%p", this ); - - new_glui->init( new_name.c_str(), flags | GLUI_SUBWINDOW, 0,0, - parent_window ); - new_glui->main_panel->set_int_val( GLUI_PANEL_EMBOSSED ); - new_glui->link_this_to_parent_last( &this->gluis ); - return new_glui; -} - - -/********************** GLUI_Master_Object::find_glui_by_window_id() ********/ - -GLUI *GLUI_Master_Object::find_glui_by_window_id( int window_id ) -{ - GLUI_Node *node; - - node = gluis.first_child(); - while( node ) { - if ( ((GLUI*)node)->get_glut_window_id() == window_id ) - return (GLUI*) node; - - node = node->next(); - } - return NULL; -} - - -/******************************************** GLUI_Main::display() **********/ - -void GLUI_Main::display( void ) -{ - int win_w, win_h; - - /* SUBTLE: on freeGLUT, the correct window is always already set. - But older versions of GLUT need this call, or else subwindows - don't update properly when resizing or damage-painting. - */ - glutSetWindow( glut_window_id ); - - /* Set up OpenGL state for widget drawing */ - glDisable( GL_DEPTH_TEST ); - glCullFace( GL_BACK ); - glDisable( GL_CULL_FACE ); - glDisable( GL_LIGHTING ); - set_current_draw_buffer(); - - /**** This function is used as a special place to do 'safe' processing, - e.g., handling window close requests. - That is, we can't close the window directly in the callback, so - we set a flag, post a redisplay message (which eventually calls - this function), then close the window safely in here. ****/ - if ( closing ) { - close_internal(); - return; - } - - /* if ( TEST_AND( this->flags, GLUI_SUBWINDOW )) - check_subwindow_position(); - */ - - win_w = glutGet( GLUT_WINDOW_WIDTH ); - win_h = glutGet( GLUT_WINDOW_HEIGHT ); - - /*** Check here if the window needs resizing ***/ - if ( win_w != main_panel->w OR win_h != main_panel->h ) { - glutReshapeWindow( main_panel->w, main_panel->h ); - return; - } - - /******* Draw GLUI window ******/ - glClearColor( (float) bkgd_color.r / 255.0, - (float) bkgd_color.g / 255.0, - (float) bkgd_color.b / 255.0, - 1.0 ); - glClear( GL_COLOR_BUFFER_BIT ); /* | GL_DEPTH_BUFFER_BIT ); */ - - set_ortho_projection(); - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - /*** Rotate image so y increases downward. - In normal OpenGL, y increases upward. ***/ - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); - - // Recursively draw the main panel - // main_panel->draw_bkgd_box( 0, 0, win_w, win_h ); - main_panel->draw_recursive( 0, 0 ); - - switch (buffer_mode) { - case buffer_front: /* Make sure drawing gets to screen */ - glFlush(); - break; - case buffer_back: /* Bring back buffer to front */ - glutSwapBuffers(); - break; - } -} - - - - -/*************************************** _glutBitmapWidthString() **********/ - -int _glutBitmapWidthString( void *font, const char *s ) -{ - const char *p = s; - int width = 0; - - while( *p != '\0' ) { - width += glutBitmapWidth( font, *p ); - p++; - } - - return width; -} - -/************************************ _glutBitmapString *********************/ -/* Displays the contents of a string using GLUT's bitmap character function */ -/* Does not handle newlines */ - -void _glutBitmapString( void *font, const char *s ) -{ - const char *p = s; - - while( *p != '\0' ) { - glutBitmapCharacter( font, *p ); - p++; - } -} - - - -/****************************** GLUI_Main::reshape() **************/ - -void GLUI_Main::reshape( int reshape_w, int reshape_h ) -{ - int new_w, new_h; - - pack_controls(); - - new_w = main_panel->w;/* + 1; */ - new_h = main_panel->h;/* + 1; */ - - if ( reshape_w != new_w OR reshape_h != new_h ) { - this->w = new_w; - this->h = new_h; - - glutReshapeWindow( new_w, new_h ); - } - else { - } - - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - check_subwindow_position(); - - /***** if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - } - ****/ - } - - glViewport( 0, 0, new_w, new_h ); - - /* printf( "%d: %d\n", glutGetWindow(), this->flags ); */ - - glutPostRedisplay(); -} - - -/****************************** GLUI_Main::keyboard() **************/ - -void GLUI_Main::keyboard(unsigned char key, int x, int y) -{ - GLUI_Control *new_control; - - curr_modifiers = glutGetModifiers(); - - /*** If it's a tab or shift tab, we don't pass it on to the controls. - Instead, we use it to cycle through active controls ***/ - if ( key == '\t' AND !mouse_button_down AND - (!active_control || !active_control->wants_tabs())) { - if ( curr_modifiers & GLUT_ACTIVE_SHIFT ) { - new_control = find_prev_control( active_control ); - } - else { - new_control = find_next_control( active_control ); - } - - /* if ( new_control ) - printf( "new_control: %s\n", new_control->name ); - */ - - deactivate_current_control(); - activate_control( new_control, GLUI_ACTIVATE_TAB ); - } - else if ( key == ' ' AND active_control - AND active_control->spacebar_mouse_click ) { - /*** If the user presses the spacebar, and a non-edittext control - is active, we send it a mouse down event followed by a mouse up - event (simulated mouse-click) ***/ - - active_control->mouse_down_handler( 0, 0 ); - active_control->mouse_up_handler( 0, 0, true ); - } else { - /*** Pass the keystroke onto the active control, if any ***/ - if ( active_control != NULL ) - active_control->key_handler( key, curr_modifiers ); - } -} - - -/****************************** GLUI_Main::special() **************/ - -void GLUI_Main::special(int key, int x, int y) -{ - curr_modifiers = glutGetModifiers(); - - /*** Pass the keystroke onto the active control, if any ***/ - if ( active_control != NULL ) - active_control->special_handler( key, glutGetModifiers() ); -} - - - -/****************************** GLUI_Main::mouse() **************/ - -void GLUI_Main::mouse(int button, int state, int x, int y) -{ - int callthrough; - GLUI_Control *control; - - /* printf( "MOUSE: %d %d\n", button, state ); */ - - callthrough = true; - - curr_modifiers = glutGetModifiers(); - - if ( button == GLUT_LEFT ) { - control = find_control( x, y ); - - /*if ( control ) printf( "control: %s\n", control->name.c_str() ); */ - - if ( mouse_button_down AND active_control != NULL AND - state == GLUT_UP ) - { - /** We just released the mouse, which was depressed at some control **/ - - callthrough = active_control-> - mouse_up_handler( x, y, control==active_control); - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - if ( active_control AND - active_control->active_type == GLUI_CONTROL_ACTIVE_MOUSEDOWN AND 0) - { - /*** This is a control that needs to be deactivated when the - mouse button is released ****/ - deactivate_current_control(); - } - } - else { - if ( control ) { - if ( NOT mouse_button_down AND state == GLUT_DOWN ) { - /*** We just pressed the mouse down at some control ***/ - - if ( active_control != control ) { - if ( active_control != NULL ) { - /** There is an active control still - deactivate it ***/ - deactivate_current_control(); - } - } - - if ( control->enabled ) { - activate_control( control, GLUI_ACTIVATE_MOUSE ); - callthrough = control->mouse_down_handler( x, y ); - } - } - } - } - - if ( state == GLUT_DOWN ) - mouse_button_down = true; - else if ( state == GLUT_UP ) - mouse_button_down = false; - } - - /** - NO CALLTHROUGH NEEDED FOR MOUSE EVENTS - if ( callthrough AND glut_mouse_CB ) - glut_mouse_CB( button, state, x, y ); - **/ - - callthrough=callthrough; /* To get rid of compiler warnings */ -} - - -/****************************** GLUI_Main::motion() **************/ - -void GLUI_Main::motion(int x, int y) -{ - int callthrough; - GLUI_Control *control; - - /* printf( "MOTION: %d %d\n", x, y ); */ - - callthrough = true; - - control = find_control(x,y); - - if ( mouse_button_down AND active_control != NULL ) { - callthrough = - active_control->mouse_held_down_handler(x,y,control==active_control); - } - - /** - NO CALLTHROUGH NEEDED FOR MOUSE EVENTS - - if ( callthrough AND glut_motion_CB ) - glut_motion_CB(x,y); - **/ - - callthrough=callthrough; /* To get rid of compiler warnings */ -} - - -/*********************** GLUI_Main::passive_motion() **************/ - -void GLUI_Main::passive_motion(int x, int y) -{ - GLUI_Control *control; - - control = find_control( x, y ); - - /* printf( "%p %p\n", control, mouse_over_control ); */ - - if ( control != mouse_over_control ) { - if ( mouse_over_control ) { - mouse_over_control->mouse_over( false, x, y ); - } - - if ( control ) { - control->mouse_over( true, x, y ); - mouse_over_control = control; - } - } - - /* - if ( curr_cursor != GLUT_CURSOR_INHERIT ) { - curr_cursor = GLUT_CURSOR_INHERIT; - glutSetCursor( GLUT_CURSOR_INHERIT ); - }*/ - -} - - -/****************************** GLUI_Main::entry() **************/ - -void GLUI_Main::entry(int state) -{ - /*if ( NOT active_control OR ( active_control AND ( active_control->type == GLUI_CONTROL_EDITTEXT - OR active_control->type == GLUI_CONTROL_SPINNER) ) )*/ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); -} - - -/****************************** GLUI_Main::visibility() **************/ - -void GLUI_Main::visibility(int state) -{ -} - - -/****************************** GLUI_Main::idle() **************/ - -void GLUI_Main::idle(void) -{ - /*** Pass the idle event onto the active control, if any ***/ - - /* printf( "IDLE \t" ); */ - - if ( active_control != NULL ) { - /* First we check if the control actually needs the idle right now. - Otherwise, let's avoid wasting cycles and OpenGL context switching */ - - if ( active_control->needs_idle() ) { - /*** Set the current glut window to the glui window */ - /*** But don't change the window if we're already at that window ***/ - - if ( glut_window_id > 0 AND glutGetWindow() != glut_window_id ) { - glutSetWindow( glut_window_id ); - } - - active_control->idle(); - } - } -} - -int GLUI_Main::needs_idle( void ) -{ - return active_control != NULL && active_control->needs_idle(); -} - - -/******************************************* GLUI_Main::find_control() ******/ - -GLUI_Control *GLUI_Main::find_control( int x, int y ) -{ - GLUI_Control *node, *last_container; - - last_container = NULL; - - node = main_panel; - while( node != NULL ) { - if ( !dynamic_cast(node) AND - PT_IN_BOX( x, y, - node->x_abs, node->x_abs + node->w, - node->y_abs, node->y_abs + node->h ) - ) - { - /*** Point is inside current node ***/ - - if ( node->first_child() == NULL ) { - /*** SPECIAL CASE: for edittext boxes, we make sure click is - in box, and not on name string. This should be generalized - for all controls later... ***/ - if ( dynamic_cast(node) ) { - if ( x < node->x_abs + ((GLUI_EditText*)node)->text_x_offset ) - return (GLUI_Control*) node->parent(); - } - - return node; /* point is inside this node, and node has no children, - so return this node as the selected node */ - } - else { - /*** This is a container class ***/ - last_container = node; - node = (GLUI_Control*) node->first_child(); /* Descend into child */ - } - - } - else { - node = (GLUI_Control*) node->next(); - } - } - - /** No leaf-level nodes found to accept the mouse click, so - return the last container control found which DOES accept the click **/ - - if ( last_container ) { - /* printf( "ctrl: '%s'\n", last_container->name ); */ - - return last_container; - } - else { - return NULL; - } -} - - -/************************************* GLUI_Main::pack_controls() ***********/ - -void GLUI_Main::pack_controls( void ) -{ - main_panel->pack(0,0); - - /**** Now align controls within their bounds ****/ - align_controls( main_panel ); - - /*** If this is a subwindow, expand panel to fit parent window ***/ - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - int parent_h, parent_w; - int orig_window; - - orig_window = glutGetWindow(); - glutSetWindow( this->top_level_glut_window_id ); - parent_h = glutGet( GLUT_WINDOW_HEIGHT ); - parent_w = glutGet( GLUT_WINDOW_WIDTH ); - - glutSetWindow( orig_window ); - - /* printf( "%d %d\n", parent_h, parent_w ); */ - - if ( 1 ) { - if ( TEST_AND(this->flags,GLUI_SUBWINDOW_TOP )) { - main_panel->w = MAX( main_panel->w, parent_w ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - main_panel->h = MAX( main_panel->h, parent_h ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { - main_panel->w = MAX( main_panel->w, parent_w ); - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - main_panel->h = MAX( main_panel->h, parent_h ); - } - } - } - - this->w = main_panel->w; - this->h = main_panel->h; -} - - -/************************************ GLUI_Main::align_controls() **********/ - -void GLUI_Main::align_controls( GLUI_Control *control ) -{ - GLUI_Control *child; - - control->align(); - - child = (GLUI_Control*) control->first_child(); - - while( child != NULL ) { - align_controls( child ); - - child = (GLUI_Control*)child->next(); - } -} - - - -/*********************************** GLUI::set_main_gfx_window() ************/ - -void GLUI::set_main_gfx_window( int window_id ) -{ - main_gfx_window_id = window_id; -} - - -/********************************* GLUI_Main::post_update_main_gfx() ********/ - -void GLUI_Main::post_update_main_gfx( void ) -{ - int old_window; - - if ( main_gfx_window_id > 0 ) { - old_window = glutGetWindow(); - glutSetWindow( main_gfx_window_id ); - glutPostRedisplay(); - if( old_window > 0 ) - glutSetWindow( old_window ); - } -} - -/********************************* GLUI_Main::should_redraw_now() ********/ -/** Return true if this control should redraw itself immediately (front buffer); - Or queue up a redraw and return false if it shouldn't (back buffer). - - Called from GLUI_Control::redraw. -*/ -bool GLUI_Main::should_redraw_now(GLUI_Control *ctl) -{ - switch (buffer_mode) { - case buffer_front: return true; /* always draw in front-buffer mode */ - case buffer_back: { - int orig = ctl->set_to_glut_window(); - glutPostRedisplay(); /* redraw soon */ - ctl->restore_window(orig); - return false; /* don't draw now. */ - } - } - return false; /* never executed */ -} - -/********************************* GLUI_Main::set_current_draw_buffer() ********/ - -int GLUI_Main::set_current_draw_buffer( void ) -{ - /* Save old buffer */ - GLint state; - glGetIntegerv( GL_DRAW_BUFFER, &state ); - /* Switch to new buffer */ - switch (buffer_mode) { - case buffer_front: glDrawBuffer(GL_FRONT); break; - case buffer_back: glDrawBuffer(GL_BACK); break; /* might not be needed... */ - } - return (int)state; -} - - -/********************************* GLUI_Main::restore_draw_buffer() **********/ - -void GLUI_Main::restore_draw_buffer( int buffer_state ) -{ - glDrawBuffer( buffer_state ); -} - - -/******************************************** GLUI_Main::GLUI_Main() ********/ - -GLUI_Main::GLUI_Main( void ) -{ - mouse_button_down = false; - w = 0; - h = 0; - active_control = NULL; - mouse_over_control = NULL; - main_gfx_window_id = -1; - glut_window_id = -1; - curr_modifiers = 0; - closing = false; - parent_window = -1; - glui_id = GLUI_Master.glui_id_counter; - GLUI_Master.glui_id_counter++; - - font = GLUT_BITMAP_HELVETICA_12; - curr_cursor = GLUT_CURSOR_LEFT_ARROW; - - int r=200, g=200, b=200; - bkgd_color.set( r,g,b ); - bkgd_color_f[0] = r / 255.0; - bkgd_color_f[1] = g / 255.0; - bkgd_color_f[2] = b / 255.0; - - /*** Create the main panel ***/ - main_panel = new GLUI_Panel; - main_panel->set_int_val( GLUI_PANEL_NONE ); - main_panel->glui = (GLUI*) this; - main_panel->name = "\0"; -} - -/************************************ GLUI_Main::draw_raised_box() **********/ - -void GLUI_Main::draw_raised_box( int x, int y, int w, int h ) -{ - w = w+x; - h = h+y; - - glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); - - glColor3d( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); - glEnd(); - - glColor3d( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); - glEnd(); - - glColor3d( .5, .5, .5 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); -} - - -/************************************ GLUI_Main::draw_lowered_box() **********/ -/* Not quite perfect... **/ - -void GLUI_Main::draw_lowered_box( int x, int y, int w, int h ) -{ - w = w+x; - h = h+y; - - glColor3ub( bkgd_color.r, bkgd_color.g, bkgd_color.b ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x+1, y+1 ); glVertex2i( w-1, y+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); - - glColor3d( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( x, h ); glVertex2i( x, y ); glVertex2i( w, y ); - glEnd(); - - glColor3d( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w, y ); glVertex2i( w, h ); glVertex2i( x, h ); - glEnd(); - - glColor3d( .5, .5, .5 ); - glBegin( GL_LINE_STRIP ); - glVertex2i( w-1, y+1 ); glVertex2i( w-1, h-1 ); glVertex2i( x+1, h-1 ); - glEnd(); -} - - -/************************************* GLUI_Main::activate_control() *********/ - -void GLUI_Main::activate_control( GLUI_Control *control, int how ) -{ - /** Are we not activating a control in the same window as the - previous active control? */ - if ( GLUI_Master.active_control_glui AND - this != (GLUI_Main*) GLUI_Master.active_control_glui ) { - GLUI_Master.active_control_glui->deactivate_current_control(); - } - - /******* Now activate it *****/ - if ( control != NULL AND control->can_activate AND control->enabled ) { - active_control = control; - - control->activate(how); - - /*if ( NOT active_control->is_container OR */ - /* active_control->type == GLUI_CONTROL_ROLLOUT) { */ - active_control->redraw(); - /*} */ - } - else { - active_control = NULL; - } - - /* printf( "activate: %d\n", glutGetWindow() ); */ - GLUI_Master.active_control = active_control; - GLUI_Master.active_control_glui = (GLUI*) this; -} - - -/************************* GLUI_Main::deactivate_current_control() **********/ - -void GLUI_Main::deactivate_current_control( void ) -{ - int orig; - - if ( active_control != NULL ) { - orig = active_control->set_to_glut_window(); - - active_control->deactivate(); - - /** If this isn't a container control, then redraw it in its - deactivated state. Container controls, such as panels, look - the same activated or not **/ - - /*if ( NOT active_control->is_container OR */ - /* active_control->type == GLUI_CONTROL_ROLLOUT ) { */ - active_control->redraw(); - /*} */ - - active_control->restore_window( orig ); - - active_control = NULL; - } - - /* printf( "deactivate: %d\n", glutGetWindow() ); */ - GLUI_Master.active_control = NULL; - GLUI_Master.active_control_glui = NULL; -} - - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control_( GLUI_Control *control ) -{ - /*** THIS IS NOT find_next_control()! This is an unused older - version (look at the underscore at the end) ***/ - - if ( control == NULL ) - return find_next_control_rec( main_panel ); - else - return find_next_control_rec( control ); -} - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control_rec( GLUI_Control *control ) -{ - GLUI_Control *child = NULL, *rec_control, *sibling; - - /*** Recursively investigate children ***/ - child = (GLUI_Control*) control->first_child(); - if ( child ) { - /*** If we can activate the first child, then do so ***/ - if ( child->can_activate AND child->enabled ) - return child; - else /*** Recurse into first child ***/ - rec_control = find_next_control_rec( child ); - - if ( rec_control ) - return rec_control; - } - - /*** At this point, either we don't have children, or the child cannot - be activated. So let's try the next sibling ***/ - - sibling = (GLUI_Control*) control->next(); - if ( sibling ) { - if ( sibling->can_activate AND sibling->enabled ) - return sibling; - else /*** Recurse into sibling ***/ - rec_control = find_next_control_rec( sibling ); - - if ( rec_control ) - return rec_control; - } - - return NULL; -} - - -/****************************** GLUI_Main::find_next_control() **************/ - -GLUI_Control *GLUI_Main::find_next_control( GLUI_Control *control ) -{ - GLUI_Control *tmp_control = NULL; - int back_up; - - if ( control == NULL ) - control = main_panel; - - while( control != NULL ) { - /** see if this control has a child **/ - tmp_control = (GLUI_Control*) control->first_child(); - - if ( tmp_control != NULL ) { - if ( tmp_control->can_activate AND tmp_control->enabled ) - return tmp_control; - - control = tmp_control; /* Descend into child */ - continue; - } - - /*** At this point, control has no children ***/ - - /** see if this control has a next sibling **/ - tmp_control = (GLUI_Control*) control->next(); - - if ( tmp_control != NULL ) { - if ( tmp_control->can_activate AND tmp_control->enabled ) - return tmp_control; - - control = tmp_control; - continue; - } - - /** back up until we find a sibling of an ancestor **/ - back_up = true; - while ( control->parent() AND back_up ) { - control = (GLUI_Control*) control->parent(); - - if ( control->next() ) { - control = (GLUI_Control*) control->next(); - if ( control->can_activate AND control->enabled ) - return control; - else - back_up = false; - - /*** if ( control->is_container ) { - tmp_control = control; - control = NULL; - break; - } - else { - back_up = false; - } - ***/ - } - } - - /** Check if we've cycled back to the top... if so, return NULL **/ - if ( control == main_panel ) { - return NULL; - } - } - /* - if ( tmp_control != NULL AND tmp_control->can_activate AND - tmp_control->enabled ) { - return tmp_control; - }*/ - - return NULL; -} - - -/****************************** GLUI_Main::find_prev_control() **************/ - -GLUI_Control *GLUI_Main::find_prev_control( GLUI_Control *control ) -{ - GLUI_Control *tmp_control, *next_control; - - if ( control == NULL ) { /* here we find the last valid control */ - next_control = main_panel; - - do { - tmp_control = next_control; - next_control = find_next_control( tmp_control ); - } while( next_control != NULL ); - - return tmp_control; - } - else { /* here we find the actual previous control */ - next_control = main_panel; - - do { - tmp_control = next_control; - next_control = find_next_control( tmp_control ); - } while( next_control != NULL AND next_control != control ); - - if ( next_control == NULL OR tmp_control == main_panel ) - return NULL; - else - return tmp_control; - } -} - -/************************* GLUI_Master_Object::set_glutIdleFunc() ***********/ - -void GLUI_Master_Object::set_glutIdleFunc(void (*f)(void)) -{ - glut_idle_CB = f; - GLUI_Master.glui_setIdleFuncIfNecessary(); -} - - -/**************************************** GLUI::disable() ********************/ - -void GLUI::disable( void ) -{ - deactivate_current_control(); - main_panel->disable(); -} - - -/******************************************** GLUI::sync_live() **************/ - -void GLUI::sync_live( void ) -{ - main_panel->sync_live(true, true); -} - - -/********************************* GLUI_Master_Object::sync_live_all() *****/ - -void GLUI_Master_Object::sync_live_all( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - - glui->sync_live(); /** sync it **/ - - glui = (GLUI*) glui->next(); - } -} - - -/************************************* GLUI_Master_Object::close() **********/ - -void GLUI_Master_Object::close_all( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - - glui->close(); /** Set flag to close **/ - - glui = (GLUI*) glui->next(); - } -} - - -/************************************* GLUI_Main::close_internal() **********/ - -void GLUI_Main::close_internal( void ) -{ - glutDestroyWindow(glutGetWindow()); /** Close this window **/ - - this->unlink(); - - if ( GLUI_Master.active_control_glui == this ) { - GLUI_Master.active_control = NULL; - GLUI_Master.active_control_glui = NULL; - } - - if ( parent_window != -1 ) { - glutSetWindow( parent_window ); - int win_w = glutGet( GLUT_WINDOW_WIDTH ); - int win_h = glutGet( GLUT_WINDOW_HEIGHT ); - glutReshapeWindow(win_w+1, win_h); - glutReshapeWindow(win_w-1, win_h); - } - - delete this->main_panel; - - delete this; -} - - -/************************************************** GLUI::close() **********/ - -void GLUI::close( void ) -{ - int old_glut_window; - - closing = true; - - old_glut_window = glutGetWindow(); - glutSetWindow( get_glut_window_id() ); - glutPostRedisplay(); - - glutSetWindow( old_glut_window ); -} - - -/************************** GLUI_Main::check_subwindow_position() **********/ - -void GLUI_Main::check_subwindow_position( void ) -{ - /*** Reposition this window if subwindow ***/ - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - - int parent_w, parent_h, new_x, new_y; - int old_window = glutGetWindow(); - - glutSetWindow( glut_window_id ); - - glutSetWindow( glutGet( GLUT_WINDOW_PARENT )); - parent_w = glutGet( GLUT_WINDOW_WIDTH ); - parent_h = glutGet( GLUT_WINDOW_HEIGHT ); - - glutSetWindow( glut_window_id ); - - if ( TEST_AND(this->flags,GLUI_SUBWINDOW_RIGHT )) { - new_x = parent_w - this->w; - new_y = 0; - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_LEFT )) { - new_x = 0; - new_y = 0; - } - else if ( TEST_AND(this->flags,GLUI_SUBWINDOW_BOTTOM )) { - new_x = 0; - new_y = parent_h - this->h; - } - else { /*** GLUI_SUBWINDOW_TOP ***/ - new_x = 0; - new_y = 0; - } - - /** Now make adjustments based on presence of other subwindows **/ - GLUI *curr_glui; - curr_glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( curr_glui ) { - if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND - curr_glui->parent_window == this->parent_window ) { - - if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) AND - ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) OR - TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) ) ) { - /** If we are a RIGHT or LEFT subwindow, and there exists some - TOP subwindow, bump our position down **/ - - new_y += curr_glui->h; - } - - /** CHeck multiple subwins at same position **/ - /** We check the glui_id's: only the glui with the higher - ID number (meaning it was created later) gets bumped over **/ - if ( curr_glui != this AND this->glui_id > curr_glui->glui_id ) { - if ( TEST_AND( this->flags,GLUI_SUBWINDOW_LEFT ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - new_x += curr_glui->w; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_TOP ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { - new_y += curr_glui->h; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_BOTTOM ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - new_y -= curr_glui->h; - } - else if ( TEST_AND( this->flags,GLUI_SUBWINDOW_RIGHT ) AND - TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - new_x -= curr_glui->w; - } - - } - } - - curr_glui = (GLUI*) curr_glui->next(); - } - - - - CLAMP( new_x, 0, new_x ); - CLAMP( new_y, 0, new_y ); - - glutPositionWindow( new_x, new_y ); - /* glutPostRedisplay(); */ - - glutSetWindow( old_window ); - } -} - - -/********************************* GLUI_Master_Object::reshape() **********/ -/* This gets called by the user from a GLUT reshape callback. So we look */ -/* for subwindows that belong to the current window */ - -void GLUI_Master_Object::reshape( void ) -{ - GLUI *glui; - int current_window; - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->check_subwindow_position(); - } - - glui = (GLUI*) glui->next(); - } - - glutSetWindow(current_window); -} - - -/**************************** GLUI_Master_Object::set_glutReshapeFunc() *****/ - -void GLUI_Master_Object::set_glutReshapeFunc(void (*f)(int width, int height)) -{ - glutReshapeFunc( glui_reshape_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_RESHAPE, (void*) f); -} - - -/**************************** GLUI_Master_Object::set_glutKeyboardFunc() ****/ - -void GLUI_Master_Object::set_glutKeyboardFunc(void (*f)(unsigned char key, - int x, int y)) -{ - glutKeyboardFunc( glui_keyboard_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_KEYBOARD, (void*) f); -} - - -/*********************** GLUI_Master_Object::set_glutSpecialFunc() **********/ - -void GLUI_Master_Object::set_glutSpecialFunc(void (*f)(int key, - int x, int y)) -{ - glutSpecialFunc( glui_special_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_SPECIAL, (void*) f); -} - - -/*********************** GLUI_Master_Object::set_glutMouseFunc() **********/ - -void GLUI_Master_Object::set_glutMouseFunc(void (*f)(int button, int state, - int x, int y)) -{ - glutMouseFunc( glui_mouse_func ); - add_cb_to_glut_window( glutGetWindow(), GLUI_GLUT_MOUSE, (void*) f); -} - - -/****************************** glui_parent_window_reshape_func() **********/ -/* This is the reshape callback for a window that contains subwindows */ - -void glui_parent_window_reshape_func( int w, int h ) -{ - int current_window; - GLUI *glui; - int first = true; - - /* printf( "glui_parent_window_reshape_func: %d\n", glutGetWindow() ); */ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) { - glutSetWindow( glui->get_glut_window_id()); - glui->check_subwindow_position(); - glutSetWindow( current_window ); - - if ( first ) { - if (glui->glut_reshape_CB) glui->glut_reshape_CB( w, h ); - - first = false; - } - } - - glui = (GLUI*) glui->next(); - } -} - - -/****************************** glui_parent_window_keyboard_func() **********/ - -void glui_parent_window_keyboard_func(unsigned char key, int x, int y) -{ - /* printf( "glui_parent_window_keyboard_func: %d\n", glutGetWindow() ); */ - - int current_window; - GLUI *glui; - - current_window = glutGetWindow(); - - if ( GLUI_Master.active_control_glui AND GLUI_Master.active_control ) { - glutSetWindow( GLUI_Master.active_control_glui->get_glut_window_id() ); - - GLUI_Master.active_control_glui->keyboard(key,x,y); - - glutSetWindow( current_window ); - } - else { - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window AND - glui->glut_keyboard_CB ) - { - glui->glut_keyboard_CB( key, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } - } -} - - -/****************************** glui_parent_window_special_func() **********/ - -void glui_parent_window_special_func(int key, int x, int y) -{ - /*printf( "glui_parent_window_special_func: %d\n", glutGetWindow() ); */ - - int current_window; - GLUI *glui; - - /** If clicking in the main area of a window w/subwindows, - deactivate any current control **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - /*** Now pass on the mouse event ***/ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window ) - { - glutSetWindow( glui->get_glut_window_id()); - if (glui->glut_special_CB) glui->glut_special_CB( key, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } -} - - -/****************************** glui_parent_window_mouse_func() **********/ - -void glui_parent_window_mouse_func(int button, int state, int x, int y) -{ - int current_window; - GLUI *glui; - - /** If clicking in the main area of a window w/subwindows, - deactivate any current control **/ - if ( GLUI_Master.active_control_glui != NULL ) - GLUI_Master.active_control_glui->deactivate_current_control(); - - - /*** Now pass on the mouse event ***/ - - current_window = glutGetWindow(); - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - while( glui ) { - if ( TEST_AND( glui->flags, GLUI_SUBWINDOW) AND - glui->parent_window == current_window AND - glui->glut_mouse_CB) - { - glutSetWindow( glui->get_glut_window_id()); - glui->glut_mouse_CB( button, state, x, y ); - break; - } - - glui = (GLUI*) glui->next(); - } -} - - -/************************** GLUI_Master_Object::find_glut_window() **********/ - -GLUI_Glut_Window *GLUI_Master_Object::find_glut_window( int window_id ) -{ - GLUI_Glut_Window *window; - - window = (GLUI_Glut_Window*) glut_windows.first_child(); - while( window ) { - if ( window->glut_window_id == window_id ) - return window; - - window = (GLUI_Glut_Window*) window->next(); - } - - /*** Window not found - return NULL ***/ - return NULL; -} - - -/******************** GLUI_Master_Object::add_cb_to_glut_window() **********/ - -void GLUI_Master_Object::add_cb_to_glut_window(int window_id, - int cb_type,void *cb) -{ - GLUI_Glut_Window *window; - - window = find_glut_window( window_id ); - if ( NOT window ) { - /*** Allocate new window structure ***/ - - window = new GLUI_Glut_Window; - window->glut_window_id = window_id; - window->link_this_to_parent_last( (GLUI_Node*) &this->glut_windows ); - } - - switch( cb_type ) { - case GLUI_GLUT_RESHAPE: - window->glut_reshape_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_DISPLAY: - window->glut_display_CB = (void(*)()) cb; - break; - case GLUI_GLUT_KEYBOARD: - window->glut_keyboard_CB = (void(*)(unsigned char,int,int)) cb; - break; - case GLUI_GLUT_SPECIAL: - window->glut_special_CB = (void(*)(int,int,int)) cb; - break; - case GLUI_GLUT_MOUSE: - window->glut_mouse_CB = (void(*)(int,int,int,int)) cb; - break; - case GLUI_GLUT_MOTION: - window->glut_motion_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_PASSIVE_MOTION: - window->glut_passive_motion_CB = (void(*)(int,int)) cb; - break; - case GLUI_GLUT_ENTRY: - window->glut_entry_CB = (void(*)(int)) cb; - break; - case GLUI_GLUT_VISIBILITY: - window->glut_visibility_CB= (void(*)(int)) cb; - break; - } -} - - -/************* GLUI_Master_Object::set_left_button_glut_menu_control() *****/ - -void GLUI_Master_Object::set_left_button_glut_menu_control( - GLUI_Control *control ) -{ - curr_left_button_glut_menu = control; -} - - -/******************************* GLUI_Main::set_ortho_projection() **********/ - -void GLUI_Main::set_ortho_projection( void ) -{ - int win_h, win_w; - - win_w = glutGet( GLUT_WINDOW_WIDTH ); - win_h = glutGet( GLUT_WINDOW_HEIGHT ); - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - /* gluOrtho2D( 0.0, (float) win_w, 0.0, (float) win_h ); */ - glOrtho( 0.0, (float)win_w, 0.0, (float) win_h, -1000.0, 1000.0 ); - - glMatrixMode( GL_MODELVIEW ); - - return; /****-----------------------------------------------***/ - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - /*** Rotate image so y increases upwards, contrary to OpenGL axes ***/ - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); -} - - -/******************************* GLUI_Main::set_viewport() **********/ - -void GLUI_Main::set_viewport( void ) -{ - glViewport( 0, 0, main_panel->w, main_panel->h ); -} - - -/****************************** GLUI_Main::refresh() ****************/ - -void GLUI_Main::refresh( void ) -{ - int orig; - - /****** GLUI_Glut_Window *glut_window; - int current_window; - current_window = glutGetWindow(); - glut_window = GLUI_Master.find_glut_window( current_window ); - if ( glut_window ) { - glut_window->glut_reshape_CB(w,h); - ******/ - - orig = glutGetWindow(); - - pack_controls(); - - if ( glut_window_id > 0 ) - glutSetWindow( glut_window_id ); - - - if ( TEST_AND( this->flags, GLUI_SUBWINDOW ) ) { - /*** GLUI subwindow ***/ - - check_subwindow_position(); - } - else { - /*** Standalone GLUI window ***/ - - glutReshapeWindow( this->h, this->w ); - - } - - glutPostRedisplay(); - glutSetWindow( orig); -} - - - -/***************** GLUI_Master_Object::get_main_gfx_viewport() ***********/ - -void GLUI_Master_Object::get_viewport_area( int *x, int *y, - int *w, int *h ) -{ - GLUI *curr_glui; - int curr_x, curr_y, curr_w, curr_h; - int curr_window; - - curr_window = glutGetWindow(); - curr_x = 0; - curr_y = 0; - curr_w = glutGet( GLUT_WINDOW_WIDTH ); - curr_h = glutGet( GLUT_WINDOW_HEIGHT ); - - curr_glui = (GLUI*) gluis.first_child(); - while( curr_glui ) { - if ( TEST_AND( curr_glui->flags, GLUI_SUBWINDOW) AND - curr_glui->parent_window == curr_window ) { - - /* printf( "%s -> %d %d %d\n", curr_glui->window_name.c_str(), curr_glui->flags, - curr_glui->w, curr_glui->h );*/ - - if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_LEFT ) ) { - curr_x += curr_glui->w; - curr_w -= curr_glui->w; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_BOTTOM ) ) { - curr_y += curr_glui->h; - curr_h -= curr_glui->h; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_RIGHT ) ) { - curr_w -= curr_glui->w; - } - else if ( TEST_AND( curr_glui->flags,GLUI_SUBWINDOW_TOP ) ) { - curr_h -= curr_glui->h; - } - } - - curr_glui = (GLUI*) curr_glui->next(); - } - - curr_x = MAX( 0, curr_x ); - curr_y = MAX( 0, curr_y ); - curr_w = MAX( 0, curr_w ); - curr_h = MAX( 0, curr_h ); - - *x = curr_x; - *y = curr_y; - *w = curr_w; - *h = curr_h; -} - - -/*****************GLUI_Master_Object::auto_set_main_gfx_viewport() **********/ - -void GLUI_Master_Object::auto_set_viewport( void ) -{ - int x, y, w, h; - - get_viewport_area( &x, &y, &w, &h ); - glViewport( MAX(x,0), MAX(y,0), MAX(w,0), MAX(h,0) ); -} - - - -/***************************************** GLUI::show() **********************/ - -void GLUI::show( void ) -{ - int orig_window; - - orig_window = main_panel->set_to_glut_window(); - - glutShowWindow(); - - main_panel->restore_window(orig_window); -} - - - -/***************************************** GLUI::hide() **********************/ - -void GLUI::hide( void ) -{ - int orig_window; - - this->deactivate_current_control(); - - orig_window = main_panel->set_to_glut_window(); - - glutHideWindow(); - - main_panel->restore_window(orig_window); -} - - -/**************** GLUI_DrawingSentinal **************/ -GLUI_DrawingSentinal::GLUI_DrawingSentinal(GLUI_Control *c_) - :c(c_) -{ - orig_win = c->set_to_glut_window(); - orig_buf = c->glui->set_current_draw_buffer(); -} -GLUI_DrawingSentinal::~GLUI_DrawingSentinal() { - c->glui->restore_draw_buffer(orig_buf); - c->restore_window(orig_win); -} - - -void GLUI_Master_Object::glui_setIdleFuncIfNecessary( void ) -{ - GLUI *glui; - - glui = (GLUI*) GLUI_Master.gluis.first_child(); - int necessary; - if (this->glut_idle_CB) - necessary = true; - else { - necessary = false; - while( glui ) { - if( glui->needs_idle() ) { - necessary = true; - break; - } - glui = (GLUI*) glui->next(); - } - } - if( necessary ) - glutIdleFunc( glui_idle_func ); - else - glutIdleFunc( NULL ); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_add_controls.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_add_controls.cpp deleted file mode 100644 index 91401fc7b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_add_controls.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui_add_controls.cpp - Routines for adding controls to a GLUI window - -Note: these routines are all deprecated. Keeping them all here -prevents the linker from dragging in all the .o files, even for controls -that aren't used. - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - - -/*********************************** GLUI:: add_checkbox() ************/ - -GLUI_Checkbox *GLUI:: add_checkbox( const char *name, int *value_ptr, - int id, GLUI_CB callback ) -{ - return add_checkbox_to_panel( main_panel, - name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_checkbox_to_panel() **********/ - -GLUI_Checkbox *GLUI::add_checkbox_to_panel( GLUI_Panel *panel, - const char *name, int *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Checkbox( panel, name, value_ptr, id, callback ); -} - -/********************************************* GLUI::add_panel() *************/ - -GLUI_Panel *GLUI::add_panel( const char *name, int type ) -{ - return add_panel_to_panel( main_panel, name, type ); -} - - -/**************************************** GLUI::add_panel_to_panel() *********/ - -GLUI_Panel *GLUI::add_panel_to_panel( GLUI_Panel *parent_panel, - const char *name, int type ) -{ - return new GLUI_Panel( parent_panel, name, type ); -} - - -/***************************** GLUI::add_radiogroup() ***************/ - -GLUI_RadioGroup *GLUI::add_radiogroup( int *value_ptr, - int user_id, GLUI_CB callback) -{ - return add_radiogroup_to_panel( main_panel, value_ptr, - user_id, callback ); -} - - -/***************************** GLUI::add_radiogroup_to_panel() ***************/ - -GLUI_RadioGroup *GLUI::add_radiogroup_to_panel( - GLUI_Panel *panel, int *value_ptr, - int user_id, GLUI_CB callback - ) -{ - return new GLUI_RadioGroup( panel, value_ptr, user_id, callback ); -} - - -/***************************** GLUI::add_radiobutton_to_group() *************/ - -GLUI_RadioButton *GLUI::add_radiobutton_to_group( GLUI_RadioGroup *group, - const char *name ) -{ - return new GLUI_RadioButton( group, name ); -} - - -/********************************** GLUI::add_statictext() ************/ - -GLUI_StaticText *GLUI::add_statictext( const char *name ) -{ - return add_statictext_to_panel( main_panel, name ); -} - - -/******************************* GLUI::add_statictext_to_panel() **********/ - -GLUI_StaticText *GLUI::add_statictext_to_panel( GLUI_Panel *panel, - const char *name ) -{ - return new GLUI_StaticText( panel, name ); -} - - -/***************************************** GLUI:: add_button() ************/ - -GLUI_Button *GLUI:: add_button( const char *name, - int id, GLUI_CB callback ) -{ - return add_button_to_panel( main_panel, - name, id, callback ); -} - -/*********************************** GLUI:: add_button_to_panel() **********/ - -GLUI_Button *GLUI::add_button_to_panel( GLUI_Panel *panel, - const char *name, - int id, - GLUI_CB callback ) -{ - return new GLUI_Button( panel, name, id, callback ); -} - -/********************************** GLUI::add_separator() ************/ - -void GLUI::add_separator( void ) -{ - add_separator_to_panel( main_panel ); -} - - -/******************************* GLUI::add_separator_to_panel() **********/ - -void GLUI::add_separator_to_panel( GLUI_Panel *panel ) -{ - new GLUI_Separator( panel ); -} - - -/********************************** GLUI::add_edittext() ************/ - -GLUI_EditText *GLUI::add_edittext( const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return add_edittext_to_panel( main_panel, name, data_type, data, - id, callback ); -} - - -/******************************* GLUI::add_edittext_to_panel() **********/ - -GLUI_EditText *GLUI::add_edittext_to_panel( GLUI_Panel *panel, - const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return new GLUI_EditText( panel, name, data_type, data, id, callback ); -} - -/********************************** GLUI::add_edittext() ************/ - -GLUI_EditText *GLUI::add_edittext( const char *name, - GLUI_String & data, - int id, GLUI_CB callback) -{ - return add_edittext_to_panel( main_panel, name, data, id, callback ); -} - - -/******************************* GLUI::add_edittext_to_panel() **********/ - -GLUI_EditText* -GLUI::add_edittext_to_panel( GLUI_Panel *panel, const char *name, - GLUI_String& data, - int id, GLUI_CB callback) -{ - return new GLUI_EditText( panel, name, GLUI_EDITTEXT_STRING, &data, id, callback ); -} - -/********************************** GLUI::add_spinner() ************/ - -GLUI_Spinner *GLUI::add_spinner( const char *name, - int data_type, void *data, - int id, GLUI_CB callback) -{ - return add_spinner_to_panel( main_panel, name, data_type, data, - id, callback ); -} - - -/******************************* GLUI::add_spinner_to_panel() **********/ - -GLUI_Spinner *GLUI::add_spinner_to_panel( - GLUI_Panel *panel, const char *name, - int data_type, void *data, - int id, GLUI_CB callback -) -{ - return new GLUI_Spinner( panel, name, data_type, data, id, callback ); -} - - -/********************************** GLUI::add_column() ************/ - -void GLUI::add_column( int draw_bar ) -{ - add_column_to_panel( main_panel, draw_bar ); -} - - -/******************************* GLUI::add_column_to_panel() **********/ - -void GLUI::add_column_to_panel( GLUI_Panel *panel, int draw_bar ) -{ - new GLUI_Column( panel, draw_bar ); -} - - -/*********************************** GLUI:: add_listbox() ************/ - -GLUI_Listbox *GLUI:: add_listbox( const char *name, int *value_ptr, - int id, GLUI_CB callback ) -{ - return add_listbox_to_panel( main_panel, - name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_listbox_to_panel() **********/ - -GLUI_Listbox *GLUI::add_listbox_to_panel( GLUI_Panel *panel, - const char *name, int *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Listbox( panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_rotation() ************/ - -GLUI_Rotation *GLUI:: add_rotation( const char *name, float *value_ptr, - int id, GLUI_CB callback ) -{ - return add_rotation_to_panel( main_panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_rotation_to_panel() **********/ - -GLUI_Rotation *GLUI::add_rotation_to_panel( GLUI_Panel *panel, - const char *name, float *value_ptr, - int id, - GLUI_CB callback ) -{ - return new GLUI_Rotation( panel, name, value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_translation() ************/ - -GLUI_Translation *GLUI:: add_translation( const char *name, int trans_type, - float *value_ptr, int id, - GLUI_CB callback ) -{ - return add_translation_to_panel( main_panel,name,trans_type, - value_ptr, id, callback ); -} - - -/*********************************** GLUI:: add_translation_to_panel() **********/ - -GLUI_Translation *GLUI::add_translation_to_panel( - GLUI_Panel *panel, const char *name, - int trans_type, float *value_ptr, - int id, GLUI_CB callback - ) -{ - return new GLUI_Translation(panel, name, trans_type, value_ptr, id, callback); -} - - -/********************************** GLUI::add_rollout() **************/ - -GLUI_Rollout *GLUI::add_rollout( const char *name, int open, int type) -{ - return add_rollout_to_panel( main_panel, name, open, type); -} - - -/****************************** GLUI::add_rollout_to_panel() *********/ - -GLUI_Rollout *GLUI::add_rollout_to_panel(GLUI_Panel *panel, const char *name, - int open, int type) -{ - return new GLUI_Rollout( panel, name, open, type ); -} - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmap_img_data.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmap_img_data.cpp deleted file mode 100644 index e3a946f85..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmap_img_data.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/** - Bitmaps for all GLUI images. - - These were converted from original PPM images - (mostly lost) with the tools/ppm2array program. - - The images here are extracted in typical OpenGL - bottom-to-top fashion. - - FIXME: don't use greyscale brightness here--this prevents - people changing the background color. Instead, use a code - indicating the underlying purpose of the pixel: - 0 = shadows; outlines; UI elements (check boxes, arrows) - 64 = disabled shadows and UI elements - 128 = shadowing, disabled - 192 = disabled white; background - 255 = highlights; checkbox/radio background - - I'm thinking the way to do this would be to have an -enum { - BG = 0, // Background shines through-- totally alpha transparent - BS, // Background of scrollbar/spin box-- opaque gray - SB, // Shadowed-black element-- strong alpha blend to black - SD, // Shadowed-dark element-- weak alpha blend to black - HL, // Highlight-light-- weak alpha blend to white - HW, // Highlight-white-- strong alpha blend to white - UB, // User-interface black-- arrows, checkboxes, radio buttons - UW, // User-interface white-- backgrounds of checkboxes and radio buttons -}; - - Orion Sky Lawlor, olawlor@acm.org, 2006/05/04 (LGPL) -*/ - -/*----------------------- checkboxes --------------------------*/ -unsigned char glui_img_checkbox_0[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_0_dis[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_1[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 255, 0, 255, 255, 255, 255, 255, 192, 255, 128, 0, 255, 255, 0, 0, 0, 255, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 128, 0, 255, 0, 0, 255, 0, 0, 0, 255, 255, 192, 255, 128, 0, 255, 0, 255, 255, 255, 0, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 0, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 192, 255, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -unsigned char glui_img_checkbox_1_dis[] = { 13, 13, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 192, 64, 192, 192, 192, 192, 192, 192, 255, 128, 64, 192, 192, 64, 64, 64, 192, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 64, 64, 64, 192, 192, 192, 192, 255, 128, 64, 192, 64, 64, 192, 64, 64, 64, 192, 192, 192, 255, 128, 64, 192, 64, 192, 192, 192, 64, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 64, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 64, 192, 192, 255, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 255, -}; - - -/*------------------------------- arrows -------------------------------------*/ -unsigned char glui_img_downarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - - -unsigned char glui_img_leftarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -unsigned char glui_img_rightarrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -unsigned char glui_img_uparrow[] = { 16, 16, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 0, 0, 0, 0, 0, 0, 0, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 0, 0, 0, 0, 0, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 0, 0, 0, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, -}; - -/*------------------ listboxes ---------------------*/ -unsigned char glui_img_listbox_down[] = { 11, 17, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 127, 191, 191, 191, 127, 0, 127, 191, 191, 191, 127, 127, 127, 191, 191, 127, 0, 127, 191, 191, 127, 127, 127, 127, 127, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, -}; - - -unsigned char glui_img_listbox_up[] = { 11, 17, /* width, height */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 0, 191, 191, 191, 127, 0, 191, 255, 191, 191, 0, 0, 0, 191, 191, 127, 0, 191, 255, 191, 0, 0, 0, 0, 0, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 0, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, -}; - -unsigned char glui_img_listbox_up_dis[] = { 11, 17, /* width, height */ -127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 254, 191, 191, 191, 127, 127, 191, 255, 191, 191, 127, 127, 254, 191, 191, 127, 127, 191, 255, 191, 127, 127, 127, 127, 254, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 191, 191, 191, 191, 191, 191, 191, 127, 127, 191, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, -}; - -/*--------------------------- radio buttons -------------------------*/ -unsigned char glui_img_radiobutton_0[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_0_dis[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_1[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 255, 255, 255, 255, 192, 192, 255, 192, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 0, 0, 0, 0, 255, 255, 192, 255, 192, 192, 128, 0, 255, 255, 255, 0, 0, 255, 255, 255, 192, 255, 192, 192, 192, 128, 0, 255, 255, 255, 255, 255, 255, 192, 255, 192, 192, 192, 192, 128, 0, 0, 255, 255, 255, 255, 0, 0, 255, 192, 192, 192, 192, 192, 128, 128, 0, 0, 0, 0, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - -unsigned char glui_img_radiobutton_1_dis[] = { 14, 14, /* width, height */ -192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 255, 255, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 64, 64, 64, 64, 192, 192, 192, 255, 192, 192, 128, 64, 192, 192, 192, 64, 64, 192, 192, 192, 192, 255, 192, 192, 192, 128, 64, 192, 192, 192, 192, 192, 192, 192, 255, 192, 192, 192, 192, 128, 64, 64, 192, 192, 192, 192, 64, 64, 255, 192, 192, 192, 192, 192, 128, 128, 64, 64, 64, 64, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, -}; - - - -/*----------------- spinners ----------------------------*/ -unsigned char glui_img_spindown_0[] = { 12, 8, /* width, height */ -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, -}; - - -unsigned char glui_img_spindown_1[] = { 12, 8, /* width, height */ -255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, -}; - - -unsigned char glui_img_spindown_dis[] = { 12, 8, /* width, height */ -255, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, -}; - - -unsigned char glui_img_spinup_0[] = { 12, 8, /* width, height */ -255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 0, 0, 0, 0, 0, 127, 191, 127, 0, 255, 191, 191, 191, 0, 0, 0, 127, 191, 191, 127, 0, 255, 191, 191, 191, 191, 0, 127, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 0, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - - -unsigned char glui_img_spinup_1[] = { 12, 8, /* width, height */ - 0, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 191, 127, 0, 0, 0, 0, 0, 191, 191, 255, 0, 127, 191, 191, 127, 0, 0, 0, 191, 191, 191, 255, 0, 127, 191, 191, 191, 127, 0, 191, 191, 191, 191, 255, 0, 127, 191, 191, 191, 191, 191, 191, 191, 191, 191, 255, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 191, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, -}; - - -unsigned char glui_img_spinup_dis[] = { 12, 8, /* width, height */ -255, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 127, 127, 127, 127, 127, 255, 191, 127, 64, 255, 191, 191, 191, 127, 127, 127, 255, 191, 191, 127, 64, 255, 191, 191, 191, 191, 127, 255, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 127, 64, 255, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmaps.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmaps.cpp deleted file mode 100644 index c7014ebfd..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_bitmaps.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_bitmaps.cpp - -Draws the hardcoded images listed in glui_bitmap_img_data with OpenGL. - -FIXME: upload the images to a texture. This will allow them to be: - - Drawn with alpha blending - - Drawn at random sizes and angles onscreen - - Drawn much faster than with glDrawPixels - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include - -/************ Image Bitmap arrays **********/ - -extern unsigned char glui_img_checkbox_0[]; -extern unsigned char glui_img_checkbox_1[]; -extern unsigned char glui_img_radiobutton_0[]; -extern unsigned char glui_img_radiobutton_1[]; -extern unsigned char glui_img_uparrow[]; -extern unsigned char glui_img_downarrow[]; -extern unsigned char glui_img_leftarrow[]; -extern unsigned char glui_img_rightarrow[]; -extern unsigned char glui_img_spinup_0[]; -extern unsigned char glui_img_spinup_1[]; -extern unsigned char glui_img_spindown_0[]; -extern unsigned char glui_img_spindown_1[]; -extern unsigned char glui_img_checkbox_0_dis[]; -extern unsigned char glui_img_checkbox_1_dis[]; -extern unsigned char glui_img_radiobutton_0_dis[]; -extern unsigned char glui_img_radiobutton_1_dis[]; -extern unsigned char glui_img_spinup_dis[]; -extern unsigned char glui_img_spindown_dis[]; -extern unsigned char glui_img_listbox_up[]; -extern unsigned char glui_img_listbox_down[]; -extern unsigned char glui_img_listbox_up_dis[]; - - -// These must be in the same order as the GLUI_STDBITMAP enums from glui.h! -unsigned char *bitmap_arrays[] = { - glui_img_checkbox_0, - glui_img_checkbox_1, - glui_img_radiobutton_0, - glui_img_radiobutton_1, - glui_img_uparrow, - glui_img_downarrow, - glui_img_leftarrow, - glui_img_rightarrow, - glui_img_spinup_0, - glui_img_spinup_1, - glui_img_spindown_0, - glui_img_spindown_1, - glui_img_checkbox_0_dis, - glui_img_checkbox_1_dis, - glui_img_radiobutton_0_dis, - glui_img_radiobutton_1_dis, - glui_img_spinup_dis, - glui_img_spindown_dis, - glui_img_listbox_up, - glui_img_listbox_down, - glui_img_listbox_up_dis, -}; - - -/************************************ GLUI_Bitmap::load_from_array() ********/ - -GLUI_Bitmap::GLUI_Bitmap() -: pixels(NULL), - w(0), - h(0) -{ -} - -GLUI_Bitmap::~GLUI_Bitmap() -{ - if (pixels) - { - free(pixels); - pixels = NULL; - } -} - -/* Create bitmap from greyscale byte array */ -void GLUI_Bitmap::init_grey(unsigned char *array) -{ - w = array[0]; h = array[1]; - pixels = (unsigned char *) malloc(w*h*3); - assert(pixels); - - for(int i = 0; i=0 && i=0 && i=0 && iadd_control( this ); -} - - -/****************************** GLUI_Button::mouse_down_handler() **********/ - -int GLUI_Button::mouse_down_handler( int local_x, int local_y ) -{ - int_val = 1; /** A button always in unpressed before here, so - now we invariably set it to 'depressed' **/ - - currently_inside = true; - redraw(); - - return false; -} - - -/****************************** GLUI_Button::mouse_up_handler() **********/ - -int GLUI_Button::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - set_int_val( 0 ); /** A button always turns off after you press it **/ - - currently_inside = false; - redraw(); - - if ( inside ) { - /*** Invoke the user's callback ***/ - execute_callback(); - } - - return false; -} - - -/****************************** GLUI_Button::mouse_held_down_handler() ******/ - -int GLUI_Button::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - if (new_inside != currently_inside) { - currently_inside = new_inside; - redraw(); - } - - return false; -} - - -/****************************** GLUI_Button::key_handler() **********/ - -int GLUI_Button::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - -/********************************************** GLUI_Button::draw() **********/ - -void GLUI_Button::draw( int x, int y ) -{ - if (currently_inside) draw_pressed(); - else { - glui->draw_raised_box( 0, 0, w, h ); - draw_text( 0 ); - } -} - - -/************************************** GLUI_Button::draw_pressed() ******/ - -void GLUI_Button::draw_pressed( void ) -{ - glColor3f( 0.0, 0.0, 0.0 ); - - draw_text( 1 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); - glEnd(); -} - - -/**************************************** GLUI_Button::draw_text() **********/ - -void GLUI_Button::draw_text( int sunken ) -{ - int string_width; - - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i( 2, h-2 ); - glEnd(); - - glColor3ub( 0,0,0 ); - - string_width = _glutBitmapWidthString( glui->font, - this->name.c_str() ); - if ( NOT sunken ) { - draw_name( MAX((w-string_width),0)/2, 13); - } - else { - draw_name( MAX((w-string_width),0)/2 + 1, 13 + 1); - } - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - - glColor3f( 0., 0., 0. ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( 3, 3 ); glVertex2i( w-3, 3 ); - glVertex2i( w-3, h-3 ); glVertex2i( 3, h-3 ); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); - } -} - - -/************************************** GLUI_Button::update_size() **********/ - -void GLUI_Button::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width( name ); - - if ( w < text_size + 16 ) - w = text_size + 16 ; -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_checkbox.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_checkbox.cpp deleted file mode 100644 index 65df55503..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_checkbox.cpp +++ /dev/null @@ -1,195 +0,0 @@ - -/**************************************************************************** - - GLUI User Interface Toolkit (LGPL) - --------------------------- - - glui_checkbox - GLUI_Checkbox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Checkbox::GLUI_Checkbox() **********/ - -GLUI_Checkbox::GLUI_Checkbox( GLUI_Node *parent, - const char *name, int *value_ptr, - int id, - GLUI_CB cb ) -{ - common_init(); - - set_ptr_val( value_ptr ); - set_name( name ); - user_id = id; - callback = cb; - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_Checkbox::mouse_down_handler() **********/ - -int GLUI_Checkbox::mouse_down_handler( int local_x, int local_y ) -{ - orig_value = int_val; - int_val = !int_val; - - currently_inside = true; - redraw(); - - return false; -} - - -/****************************** GLUI_Checkbox::mouse_up_handler() **********/ - -int GLUI_Checkbox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( NOT inside ) { /* undo effect on value */ - int_val = orig_value; - } - else { - set_int_val( int_val ); - - /*** Invoke the callback ***/ - execute_callback(); - } - - return false; -} - - -/****************************** GLUI_Checkbox::mouse_held_down_handler() ******/ - -int GLUI_Checkbox::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - /********** Toggle checked and unchecked bitmap if we're entering or - leaving the checkbox area **********/ - if ( inside != currently_inside ) { - int_val = !int_val; - currently_inside = inside; - redraw(); - } - - return false; -} - - -/****************************** GLUI_Checkbox::key_handler() **********/ - -int GLUI_Checkbox::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - - -/****************************** GLUI_Checkbox::draw() **********/ - -void GLUI_Checkbox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( int_val != 0 ) { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_ON_DIS, 0, 0 ); - } - else { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_CHECKBOX_OFF_DIS, 0, 0 ); - } - - draw_active_area(); - - draw_name( text_x_offset, 10); -} - -/**************************** GLUI_Checkbox::draw_active_area() **************/ - -void GLUI_Checkbox::draw_active_area( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width, left, right; - - text_width = _glutBitmapWidthString( glui->font, name.c_str() ); - left = text_x_offset-3; - right = left + 7 + text_width; - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(left,0); glVertex2i( right,0); - glVertex2i(right,h+1); glVertex2i( left,h+1); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/************************************ GLUI_Checkbox::update_size() **********/ - -void GLUI_Checkbox::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = _glutBitmapWidthString( glui->font, name.c_str() ); - - /* if ( w < text_x_offset + text_size + 6 ) */ - w = text_x_offset + text_size + 6 ; -} - - -/********************************* GLUI_Checkbox::set_int_val() **************/ - -void GLUI_Checkbox::set_int_val( int new_val ) -{ - int_val = new_val; - - /*** Update the variable we're (possibly) pointing to ***/ - output_live(true); - redraw(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_column.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_column.cpp deleted file mode 100644 index 1fed1da87..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_column.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** - GLUI User Interface Toolkit - --------------------------- - - glui_column.cpp - GLUI_Column control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/******************************** GLUI_Column::GLUI_Column() ************/ - -GLUI_Column::GLUI_Column( GLUI_Node *parent, int draw_bar ) -{ - common_init(); - int_val = draw_bar; /* Whether to draw vertical bar or not */ - - parent->add_control( this ); -} - -/**************************************** GLUI_Column::draw() ************/ - -void GLUI_Column::draw( int x, int y ) -{ - int panel_x, panel_y, panel_w, panel_h, panel_x_off, panel_y_off; - int y_diff; - - if ( int_val == 1 ) { /* Draw a vertical bar */ - GLUI_DRAWINGSENTINAL_IDIOM - if ( parent() != NULL ) { - get_this_column_dims(&panel_x, &panel_y, &panel_w, &panel_h, - &panel_x_off, &panel_y_off); - - y_diff = y_abs - panel_y; - - if ( 0 ) { - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( -GLUI_XOFF+1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( -GLUI_XOFF+1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( -GLUI_XOFF+2, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( -GLUI_XOFF+2, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); - glEnd(); - } - else { - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( -2, 0 ); - glVertex2i( -2, h ); - /*glVertex2i( 0, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ - /*glVertex2i( 0, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( -1, 0 ); - glVertex2i( -1, h ); - /*glVertex2i( 1, -y_diff + GLUI_SEPARATOR_HEIGHT/2 ); */ - /*glVertex2i( 1, -y_diff + panel_h - GLUI_SEPARATOR_HEIGHT/2); */ - glEnd(); - } - } - } -} - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_commandline.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_commandline.cpp deleted file mode 100644 index faeb5d197..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_commandline.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_commandline.cpp - GLUI_CommandLine control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher, 2005 William Baxter - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA - - This program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - -/****************************** GLUI_CommandLine::GLUI_CommandLine() **********/ -GLUI_CommandLine::GLUI_CommandLine( GLUI_Node *parent, const char *name, - void *data, int id, GLUI_CB cb ) -{ - common_init(); - set_name( name ); - - data_type = GLUI_EDITTEXT_TEXT; - ptr_val = data; - user_id = id; - callback = cb; - - live_type = GLUI_LIVE_TEXT; - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_CommandLine::key_handler() **********/ - -int GLUI_CommandLine::key_handler( unsigned char key,int modifiers ) -{ - int ret; - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> CMD_TEXT KEY HANDLER" ); - - if ( key == 13 ) { /* RETURN */ - commit_flag = true; - } - - ret = Super::key_handler( key, modifiers ); - - if ( debug ) - dump( stdout, "<- CMD_TEXT KEY HANDLER" ); - - return ret; -} - - -/****************************** GLUI_CommandLine::deactivate() **********/ - -void GLUI_CommandLine::deactivate( void ) -{ - // if the commit_flag is set, add the current command to - // history and call deactivate as normal - - // Trick deactivate into calling callback if and only if commit_flag set. - // A bit subtle, but deactivate checks that orig_text and text - // are the same to decide whether or not to call the callback. - // Force them to be different for commit, and the same for no commit. - if (commit_flag) { - add_to_history(text.c_str()); - orig_text = ""; - Super::deactivate( ); - set_text( "" ); - commit_flag = false; - } - else { - orig_text = text; - } -} - -/**************************** GLUI_CommandLine::special_handler() **********/ - -int GLUI_CommandLine::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( debug ) - printf( "CMD_TEXT SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_UP ) // PREVIOUS HISTORY - { - scroll_history(-1); - } - else if ( key == GLUT_KEY_DOWN ) // NEXT HISTORY - { - scroll_history(+1); - } - else { - return Super::special_handler( key, modifiers ); - } - return false; -} - - - -/**************************** GLUI_CommandLine::scroll_history() ********/ - -void GLUI_CommandLine::scroll_history( int direction ) -{ - recall_history(curr_hist + direction); -} - -/**************************** GLUI_CommandLine::recall_history() ********/ - -void GLUI_CommandLine::recall_history( int hist_num ) -{ - if (hist_num < oldest_hist OR - hist_num > newest_hist OR - hist_num == curr_hist) - return; - - // Commit the current text first before we blow it away! - if (curr_hist == newest_hist) { - get_history_str(newest_hist) = text; - } - - curr_hist = hist_num; - set_text(get_history_str(curr_hist)); - sel_end = sel_start = insertion_pt = (int)text.length(); - update_and_draw_text(); -} - -/**************************** GLUI_CommandLine::add_to_history() ********/ - -void GLUI_CommandLine::add_to_history( const char *cmd ) -{ - if (cmd[0]=='\0') return; // don't add if it's empty - - curr_hist = newest_hist; - get_history_str(newest_hist) = text; - - newest_hist = ++curr_hist; - if ( newest_hist >= HIST_SIZE ) - { - // bump oldest off the list - hist_list.erase(hist_list.begin()); - hist_list.push_back(""); - - oldest_hist++; - } -} - -/**************************** GLUI_CommandLine::reset_history() ********/ - -void GLUI_CommandLine::reset_history( void ) -{ - oldest_hist = newest_hist = curr_hist = 0; -} - - - -/*************************************** GLUI_CommandLine::dump() **************/ - -void GLUI_CommandLine::dump( FILE *out, const char *name ) -{ - fprintf( out, - "%s (commandline@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, - insertion_pt, substring_start, substring_end, sel_start, sel_end, - (int)text.length()); -} - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_control.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_control.cpp deleted file mode 100644 index c14d40ae7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_control.cpp +++ /dev/null @@ -1,1210 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_control.cpp - top-level GLUI_Control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -int _glui_draw_border_only = 0; - -/*************************** Drawing Utility routines *********************/ - -/* Redraw this control. */ -void GLUI_Control::redraw(void) { - if (glui==NULL || hidden) return; - if (glui->should_redraw_now(this)) - translate_and_draw_front(); -} - -/** Redraw everybody in our window. */ -void GLUI_Control::redraw_window(void) { - if (glui==NULL || hidden) return; - if ( glui->get_glut_window_id() == -1 ) return; - int orig = set_to_glut_window(); - glutPostRedisplay(); - restore_window(orig); -} - - - -/* GLUI_Control::translate_and_draw_front() ********/ - -void GLUI_Control::translate_and_draw_front() -{ - GLUI_DRAWINGSENTINAL_IDIOM - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - translate_to_origin(); - draw(0,0); - glPopMatrix(); -} - - -/********** GLUI_Control::set_to_bkgd_color() ********/ - -void GLUI_Control::set_to_bkgd_color( void ) -{ - if ( NOT glui ) - return; - - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); -} - -/******** GLUI_Control::draw_box_inwards_outline() ********/ - -void GLUI_Control::draw_box_inwards_outline( int x_min, int x_max, int y_min, int y_max ) -{ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_min, y_min ); glVertex2i( x_min, y_max ); - - glColor3f( 1., 1., 1. ); - glVertex2i( x_min, y_max ); glVertex2i( x_max, y_max ); - glVertex2i( x_max, y_max ); glVertex2i( x_max, y_min ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_min+1, y_max-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( x_min+1, y_max-1 ); glVertex2i( x_max-1, y_max-1 ); - glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_max-1, y_min+1 ); - glEnd(); -} - - -/******* GLUI_Control::draw_box() **********/ - -void GLUI_Control::draw_box( int x_min, int x_max, int y_min, int y_max, float r, float g, float b) -{ - if ( r == 1.0 AND g == 1.0 AND b == 1.0 AND NOT enabled AND glui ) { - draw_bkgd_box( x_min, x_max, y_min, y_max ); - return; - } - - glColor3f( r, g, b ); - glBegin( GL_QUADS ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); -} - - -/******* GLUI_Control::draw_bkgd_box() **********/ - -void GLUI_Control::draw_bkgd_box( int x_min, int x_max, int y_min, int y_max ) -{ - set_to_bkgd_color(); - - glBegin( GL_QUADS ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); -} - - -/**** GLUI_Control::draw_active_area() ********/ - -void GLUI_Control::draw_active_box( int x_min, int x_max, int y_min, int y_max ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - set_to_bkgd_color(); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(x_min, y_min); glVertex2i( x_max, y_min ); - glVertex2i(x_max, y_max); glVertex2i( x_min, y_max ); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/**** GLUI_Control::draw_emboss_box() ********/ - -void GLUI_Control::draw_emboss_box(int x_min,int x_max,int y_min,int y_max) -{ - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min, y_min ); glVertex2i( x_max, y_min ); - glVertex2i( x_max, y_max ); glVertex2i( x_min, y_max ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min+1, y_min+1 ); glVertex2i( x_max-1, y_min+1 ); - glVertex2i( x_max-1, y_max-1 ); glVertex2i( x_min+1, y_max-1 ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( x_min, y_min ); - glVertex2i( x_max-1, y_min ); - glVertex2i( x_max-1, y_max-1 ); - glVertex2i( x_min, y_max-1 ); - glEnd(); -} - - - -/******* GLUT_Control::draw_recursive() **********/ - -void GLUI_Control::draw_recursive( int x, int y ) -{ - GLUI_Control *node; - - /* printf( "%s %d\n", this->name.c_str(), this->hidden );*/ - if ( NOT can_draw() ) - return; - - /*if ( 1 ) { -- Debugging to check control width - glColor3f( 1.0, 0.0, 0.0 ); - glBegin( GL_LINES ); - glVertex2i( x_abs, y_abs );00 - glVertex2i( x_abs+w, y_abs ); - - glEnd(); - }*/ - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - - glTranslatef( (float) this->x_abs + .5, - (float) this->y_abs + .5, - 0.0 ); - - if ( NOT _glui_draw_border_only ) { - if ( NOT strcmp( name.c_str(), "Rollout" ) ) { - } - - this->draw( this->x_off, this->y_off_top ); - } - else - { - if ( dynamic_cast(this) ) { - /* printf( "%s w/h: %d/%d\n", (char*) name, w, h ); */ - /*w = 2; */ - } - - /* The following draws the area of each control */ - glColor3f( 1.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); - } - glPopMatrix(); - - node = (GLUI_Control*) first_child(); - while( node ) { - node->draw_recursive( node->x_abs, node->y_abs ); - node = (GLUI_Control*) node->next(); - } -} - - -/****** GLUI_Control::set_to_glut_window() *********/ -/* Sets the current window to the glut window associated with this control */ - -int GLUI_Control::set_to_glut_window() -{ - int orig_window; - - if ( NOT glui) - return 1; - - orig_window = glutGetWindow(); - - glutSetWindow( glui->get_glut_window_id()); - - return orig_window; -} - - -/********** GLUI_Control::restore_window() *********/ - -void GLUI_Control::restore_window(int orig) -{ - if ( orig > 0 ) - glutSetWindow( orig ); -} - - - -/****************************** Text ***************************/ - -/*************** GLUI_Control::set_font() **********/ - -void GLUI_Control::set_font(void *new_font) -{ - font = new_font; - redraw(); -} - - -/********** GLUI_Control::draw_string() ************/ - -void GLUI_Control::draw_string( const char *text ) -{ - _glutBitmapString( get_font(), text ); -} - - -/**************** GLUI_Control::draw_char() ********/ - -void GLUI_Control::draw_char(char c) -{ - glutBitmapCharacter( get_font(), c ); -} - - -/*********** GLUI_Control::string_width() **********/ - -int GLUI_Control::string_width(const char *text) -{ - return _glutBitmapWidthString( get_font(), text ); -} - - -/************* GLUI_Control::char_width() **********/ - -int GLUI_Control::char_width(char c) -{ /* Hash table for faster character width lookups - JVK - Speeds up the textbox a little bit. - */ - int hash_index = c % CHAR_WIDTH_HASH_SIZE; - if (char_widths[hash_index][0] != c) { - char_widths[hash_index][0] = c; - char_widths[hash_index][1] = glutBitmapWidth( get_font(), c ); - } - return char_widths[hash_index][1]; -} - - -/*************** GLUI_Control::get_font() **********/ - -void *GLUI_Control::get_font( void ) -{ - /*** Does this control have its own font? ***/ - if ( this->font != NULL ) - return this->font; - - /*** Does the parent glui have a font? ***/ - if ( glui ) - return glui->font; - - /*** Return the default font ***/ - return GLUT_BITMAP_HELVETICA_12; -} - - -/************* GLUI_Control::draw_name() ***********/ -/* This draws the name of the control as either black (if enabled), or */ -/* embossed if disabled. */ - -void GLUI_Control::draw_name(int x, int y) -{ - if ( NOT can_draw() ) - return; - - if ( enabled ) - { - set_to_bkgd_color(); - glRasterPos2i(x+1, y+1); - draw_string(name); - glColor3b( 0, 0, 0 ); - glRasterPos2i(x, y); - draw_string(name); - } - else - { /* Control is disabled - emboss the string */ - glColor3f( 1.0f, 1.0f, 1.0f ); - glRasterPos2i(x+1, y+1); - draw_string(name); - glColor3f( .4f, .4f, .4f ); - glRasterPos2i(x, y); - draw_string(name); - } -} - - -/**************************** Layout and Packing *********************/ - -/****** GLUI_Control::align() **************/ - -void GLUI_Control::align() -{ - int col_x, col_y, col_w, col_h, col_x_off, col_y_off; - int orig_x_abs; - - orig_x_abs = x_abs; - - /* Fix alignment bug relating to columns */ - /*return; */ - - if ( NOT parent() ) - return; /* Clearly this shouldn't happen, though */ - - get_this_column_dims(&col_x, &col_y, &col_w, &col_h, - &col_x_off, &col_y_off); - - if ( dynamic_cast(this) ) { - /* if ( this->prev() != NULL ) { - ((GLUI_Control*)prev())->get_this_column_dims(&col_x, &col_y, &col_w, &col_h, - &col_x_off, &col_y_off); - - x_abs = col_x + col_w; - } - else { - x_abs = ((GLUI_Control*)parent())->x_abs; - } - */ - return; - } - - if ( alignment == GLUI_ALIGN_LEFT ) { - x_abs = col_x + col_x_off; - } - else if ( alignment == GLUI_ALIGN_RIGHT ) { - x_abs = col_x + col_w - col_x_off - this->w; - } - else if ( alignment == GLUI_ALIGN_CENTER ) { - x_abs = col_x + (col_w - this->w) / 2; - } - - if ( this->is_container ) { - /*** Shift all child columns ***/ - int delta = x_abs - orig_x_abs; - - GLUI_Control *node; - - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( dynamic_cast(node) ) { - node->x_abs += delta; - } - - node = (GLUI_Control*) node->next(); - } - } - -} - - -/************** GLUI_Control::pack() ************/ -/* Recalculate positions and offsets */ - -void GLUI_Control::pack_old(int x, int y) -{ - GLUI_Control *node; - int max_w, curr_y, curr_x, max_y; - int x_in = x, y_in =y; - int x_margin, y_margin_top, y_margin_bot; - int y_top_column; - int column_x; - GLUI_Column *curr_column = NULL; - this->update_size(); - x_margin = this->x_off; - y_margin_top = this->y_off_top; - y_margin_bot = this->y_off_bot; - this->x_abs = x_in; - this->y_abs = y_in; - max_w = -1; - max_y = -1; - curr_x = this->x_abs + x_margin; - curr_y = this->y_abs + y_margin_top; - /*** Record start of this set of columns ***/ - y_top_column = curr_y; - column_x = 0; - if ( this == glui->main_panel ) { - x=x; - } - /*** Iterate over children, packing them first ***/ - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( dynamic_cast(node) && !node->collapsible) { - /* Pad some space above fixed size panels */ - curr_y += GLUI_ITEMSPACING; - } - else if ( dynamic_cast(node)) { - curr_column = (GLUI_Column*) node; - if ( 1 ) { - column_x += max_w + 2 * x_margin; - curr_x += max_w + 2 * x_margin; - } - else { - column_x += max_w + 0 * x_margin; - curr_x += max_w + 0 * x_margin; - } - /*node->pack( curr_x, curr_y ); */ - node->x_abs = curr_x; - node->y_abs = y_top_column; - node->w = 2; - node->h = curr_y - y_top_column; - curr_x += x_margin * 3 + 40; - curr_y = y_top_column; - max_w = 0; - node = (GLUI_Control*) node->next(); - continue; - } - node->pack( curr_x, curr_y ); - if ( dynamic_cast(node) && !node->collapsible) - /* Pad some space below fixed size panels */ - curr_y += GLUI_ITEMSPACING; - curr_y += node->h; - if ( node->w > max_w ) { - max_w = node->w; - if ( curr_column != NULL ) - curr_column->w = max_w; - } - node = (GLUI_Control*) node->next(); - if ( node ) { - curr_y += GLUI_ITEMSPACING; - } - if ( curr_y > max_y ) - max_y = curr_y; - } - if ( this->is_container ) { - max_y += y_margin_bot; /*** Add bottom border inside box */ - if ( this->first_child() ) { - if ( dynamic_cast(this) ) { - /** We don't want the rollout to shrink in width when it's - closed **/ - this->w = MAX(this->w, column_x + max_w + 2 * x_margin ); - } - else { - this->w = column_x + max_w + 2 * x_margin; - } - this->h = (max_y - y_in); - } - else { /* An empty container, so just assign default w & h */ - this->w = GLUI_DEFAULT_CONTROL_WIDTH; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT; - } - /** Expand panel if necessary (e.g., to include all the text in - a panel label) **/ - this->update_size(); - } -} - -/*** GLUI_Control::get_this_column_dims() **********/ -/* Gets the x,y,w,h,and x/y offsets of the column to which a control belongs */ - -void GLUI_Control::get_this_column_dims( int *col_x, int *col_y, - int *col_w, int *col_h, - int *col_x_off, int *col_y_off ) -{ - GLUI_Control *node, *parent_ptr; - int parent_h, parent_y_abs; - - parent_ptr = (GLUI_Control*) parent(); - - if ( parent_ptr==NULL ) - return; - - parent_h = parent_ptr->h; - parent_y_abs = parent_ptr->y_abs; - - if ( dynamic_cast(parent_ptr) AND - parent_ptr->int_val == GLUI_PANEL_EMBOSSED AND - parent_ptr->name != "" ) { - parent_h -= GLUI_PANEL_EMBOSS_TOP; - parent_y_abs += GLUI_PANEL_EMBOSS_TOP; - } - - if ( 0 ) { - GLUI_Node *first, *last, *curr; - - /** Look for first control in this column **/ - first = this; - while (first->prev() AND !dynamic_cast(first->prev()) ) - first = first->prev(); - - /** Look for last control in this column **/ - last = this; - while ( last->next() AND !dynamic_cast(first->next()) ) - last = last->next(); - - curr = first; - int max_w = -1; - do { - if ( ((GLUI_Control*)curr)->w > max_w ) - max_w = ((GLUI_Control*)curr)->w; - - if ( curr == last ) - break; - - curr = curr->next(); - } while( curr != NULL ); - - *col_x = ((GLUI_Control*)first)->x_abs; - *col_y = ((GLUI_Control*)first)->y_abs; - *col_w = max_w; - if ( parent() ) { - *col_h = ((GLUI_Control*)parent())->h; - *col_x_off = ((GLUI_Control*)parent())->x_off; - } - else { - *col_h = 10; - *col_x_off = 0; - } - *col_y_off = 0; - - return; - } - - if ( 1 ) { /* IS THIS WRONG? */ - /*** Look for preceding column ***/ - node = (GLUI_Control*) this->prev(); - while( node ) { - if ( dynamic_cast(node) ) { - *col_x = node->x_abs; - *col_y = parent_y_abs; - *col_w = node->w; - *col_h = parent_h; - *col_x_off = node->x_off; - *col_y_off = 0; - - return; - } - - node = (GLUI_Control*) node->prev(); - } - - /*** Nope, Look for next column ***/ - node = (GLUI_Control*) this->next(); - while( node ) { - if ( dynamic_cast(node) ) { - *col_x = parent_ptr->x_abs; - *col_y = parent_y_abs; - *col_w = node->x_abs - parent_ptr->x_abs; - *col_h = parent_h; - *col_x_off = node->x_off; - *col_y_off = 0; - - return; - } - - node = (GLUI_Control*) node->next(); - } - - /*** This is single-column panel, so return panel dims ***/ - *col_x = parent_ptr->x_abs; - *col_y = parent_y_abs; - *col_w = parent_ptr->w; - *col_h = parent_h; - *col_x_off = parent_ptr->x_off; - *col_y_off = 0; - } -} - - -void GLUI_Control::pack( int x, int y ) -{ - GLUI_Control *node; - int max_w, curr_y, curr_x, max_y; - int x_in = x, y_in =y; - int x_margin, y_margin_top, y_margin_bot; - int y_top_column; - int column_x; - GLUI_Column *curr_column = NULL; - - this->update_size(); - - x_margin = this->x_off; - y_margin_top = this->y_off_top; - y_margin_bot = this->y_off_bot; - - this->x_abs = x_in; - this->y_abs = y_in; - - max_w = 0; - max_y = 0; - curr_x = this->x_abs + x_margin; - curr_y = this->y_abs + y_margin_top; - - /*** Record start of this set of columns ***/ - - y_top_column = curr_y; - column_x = curr_x; - - /*** Iterate over children, packing them first ***/ - - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( dynamic_cast(node) && !node->collapsible) { - /* Pad some space above fixed-size panels */ - curr_y += GLUI_ITEMSPACING; - } - else if ( dynamic_cast(node) ) { - curr_column = (GLUI_Column*) node; - curr_x += max_w + 1 * x_margin; - column_x = curr_x; - - node->x_abs = curr_x; - node->y_abs = y_top_column; - node->w = 2; - node->h = curr_y - y_top_column; - - curr_x += x_margin * 1; - curr_y = y_top_column; - max_w = 0; - - node = (GLUI_Control*) node->next(); - continue; - } - - node->pack( curr_x, curr_y ); - - if ( dynamic_cast(node) && !node->collapsible) - /* Pad some space below fixed-size panels */ - curr_y += GLUI_ITEMSPACING; - - curr_y += node->h; - - if ( node->w > max_w ) { - max_w = node->w; - if ( curr_column != NULL ) - curr_column->w = max_w + x_margin; - } - - if ( curr_y > max_y ) { - max_y = curr_y; - if ( curr_column != NULL ) - curr_column->h = max_y - y_top_column; - } - - node = (GLUI_Control*) node->next(); - - if ( node ) { - curr_y += GLUI_ITEMSPACING; - } - - } - - if ( this->is_container ) { - max_y += y_margin_bot; /*** Add bottom border inside box */ - - if ( this->first_child() ) { - this->w = column_x + max_w + 2 * x_margin - x_in; - this->h = (max_y - y_in); - } - else { /* An empty container, so just assign default w & h */ - if ( !dynamic_cast(this) && - !dynamic_cast(this) ) { - this->w = GLUI_DEFAULT_CONTROL_WIDTH; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT; - } - } - - /** Expand panel if necessary (e.g., to include all the text in - a panel label) **/ - this->update_size(); - - - /*** Now we step through the GLUI_Columns, setting the 'h' ***/ - node = (GLUI_Control*) this->first_child(); - while( node != NULL ) { - if ( dynamic_cast(node) ) { - node->h = this->h - y_margin_bot - y_margin_top; - } - - node = (GLUI_Control*) node->next(); - } - } -} - - - -/******************************** Live Variables **************************/ -/*********** GLUI_Control::sync_live() ************/ -/* Reads live variable and sets control to its current value */ -/* This function is recursive, and operates on control's children */ - -void GLUI_Control::sync_live(int recurse, int draw_it) -{ - GLUI_Node *node; - int sync_it=true; - int i; - float *fp; - bool changed = false; - - /*** If this is currently active control, and mouse button is down, - don't sync ***/ - if ( glui ) - { - if ( this == glui->active_control AND glui->mouse_button_down ) - sync_it = false; - - /*** Actually, just disable syncing if button is down ***/ - /*** Nope, go ahead and sync if mouse is down - this allows syncing in - callbacks ***/ - if ( 0 ) { /* THIS CODE BELOW SHOULD NOT BE EXECUTED */ - if ( glui->mouse_button_down ) { - /* printf( "Can't sync\n" ); */ - return; - } - } - } - - /*** If this control has a live variable, we check its current value - against the stored value in the control ***/ - - if ( ptr_val != NULL ) { - if ( live_type == GLUI_LIVE_NONE OR NOT sync_it ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - if ( *((int*)ptr_val) != last_live_int ) { - set_int_val( *((int*)ptr_val) ); - last_live_int = *((int*)ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - if ( *((float*)ptr_val) != last_live_float ) { - set_float_val( *((float*)ptr_val) ); - last_live_float = *((float*)ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_TEXT ) { - if ( last_live_text.compare((const char*)ptr_val) != 0 ) { - set_text( (char*) ptr_val ); - last_live_text = (const char*)ptr_val; - changed = true; - } - } - else if ( live_type == GLUI_LIVE_STRING ) { - if ( last_live_text.compare(((std::string*) ptr_val)->c_str()) != 0 ) { - set_text( ((std::string*) ptr_val)->c_str()); - last_live_text = *((std::string*) ptr_val); - changed = true; - } - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - /*** Step through the arrays, and see if they're the same ***/ - - fp = (float*) ptr_val; - for ( i=0; ifirst_child(); - while( node ) { - ((GLUI_Control*) node)->sync_live(true, true); - node = node->next(); - } - - if ( collapsible == true AND is_open == false ) { - /** Here we have a collapsed control (e.g., a rollout that is closed **/ - /** We need to go in and sync all the collapsed controls inside **/ - - node = this->collapsed_node.first_child(); - while( node ) { - ((GLUI_Control*) node)->sync_live(true, false); - node = node->next(); - } - } - } -} - - -/********** GLUI_Control::output_live() ************/ -/* Writes current value of control to live variable. */ - -void GLUI_Control::output_live(int update_main_gfx) -{ - int i; - float *fp; - - if ( ptr_val == NULL ) - return; - - if ( NOT live_inited ) - return; - - if ( live_type == GLUI_LIVE_NONE ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - *((int*)ptr_val) = int_val; - last_live_int = int_val; - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - *((float*)ptr_val) = float_val; - last_live_float = float_val; - } - else if ( live_type == GLUI_LIVE_TEXT ) { - strncpy( (char*) ptr_val, text.c_str(), text.length()+1); - last_live_text = text; - } - else if ( live_type == GLUI_LIVE_STRING ) { - (*(std::string*)ptr_val)= text.c_str(); - last_live_text = text; - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - fp = (float*) ptr_val; - - for( i=0; iglui != NULL ) { - this->glui->post_update_main_gfx(); - } -} - - -/****** GLUI_Control::execute_callback() **********/ - -void GLUI_Control::execute_callback() -{ - int old_window; - - old_window = glutGetWindow(); - - if ( glui AND glui->main_gfx_window_id != -1 ) - glutSetWindow( glui->main_gfx_window_id ); - - this->callback( this ); -// if ( this->callback ) -// this->callback( this->user_id ); - - glutSetWindow( old_window ); -} - - -/************** GLUI_Control::init_live() **********/ -/* Reads in value of a live variable. Called once, when ctrl is created */ - -void GLUI_Control::init_live() -{ - int i; - float *fp; - - if ( ptr_val == NULL ) - return; - - if ( live_type == GLUI_LIVE_NONE ) { - } - else if ( live_type == GLUI_LIVE_INT ) { - set_int_val( *((int*)ptr_val) ); - last_live_int = *((int*)ptr_val); - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - set_float_val( *((float*)ptr_val) ); - last_live_float = *((float*)ptr_val); - } - else if ( live_type == GLUI_LIVE_TEXT ) { - set_text( (const char*) ptr_val ); - last_live_text = (const char*) ptr_val; - } - else if ( live_type == GLUI_LIVE_STRING ) { - set_text( ((std::string*) ptr_val)->c_str() ); - last_live_text = ((std::string*) ptr_val)->c_str(); - } - else if ( live_type == GLUI_LIVE_FLOAT_ARRAY ) { - set_float_array_val( (float*) ptr_val ); - - fp = (float*) ptr_val; - - for( i=0; ienable(); - node = (GLUI_Control*) node->next(); - } -} - - -/***** GLUI_Control::disable() ****************/ - -void GLUI_Control::disable() -{ - GLUI_Control *node; - - enabled = false; - - if ( NOT glui ) - return; - - if ( glui->active_control == this ) - glui->deactivate_current_control(); - redraw(); - - /*** Now recursively disable all buttons below it ***/ - node = (GLUI_Control*) first_child(); - while(node) { - node->disable(); - node = (GLUI_Control*) node->next(); - } -} - -/******* GLUI_Control::set_w() **************/ - -void GLUI_Control::set_w(int new_w) -{ - w = new_w; - update_size(); /* Make sure control is big enough to fit text */ - if (glui) glui->refresh(); -} - - -/**** GLUI_Control::set_h() **************/ - -void GLUI_Control::set_h(int new_h) -{ - h = new_h; - update_size(); /* Make sure control is big enough to fit text */ - if (glui) glui->refresh(); -} - - -/***** GLUI_Control::set_alignment() ******/ - -void GLUI_Control::set_alignment(int new_align) -{ - alignment = new_align; - - if ( glui ) - { - glui->align_controls(this); - redraw_window(); - } -} - - -/***** GLUI_Control::needs_idle() *********/ -/* This method gets overloaded by specific classes, e.g. Spinner. */ -/* It returns whether or not a control needs to receive an idle event or not */ -/* For example, a spinner only needs idle events when the user is holding */ -/* the mouse down in one of the arrows. Otherwise, don't waste cycles */ -/* and OpenGL context switching by calling its idle. */ - -bool GLUI_Control::needs_idle() const -{ - return false; -} - - -/********* GLUI_Control::~GLUI_Control() **********/ - -GLUI_Control::~GLUI_Control() -{ - GLUI_Control *item = (GLUI_Control*) this->first_child(); - - while (item) - { - GLUI_Control *tmp = item; - item = (GLUI_Control*) item->next(); - delete tmp; - } -} - -/********* GLUI_Control::hide_internal() ********/ -/** Sets hidden==true for this control and all its siblings. */ -/** If recurse is true, we go to children as well */ - -void GLUI_Control::hide_internal( int recurse ) -{ - GLUI_Node *node; - - node = (GLUI_Node *) this; - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = true; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->hide_internal(true); - - node = node->next(); - } - - node = this->collapsed_node.first_child(); - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = true; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->hide_internal(true); - - node = node->next(); - } -} - - -/********* GLUI_Control::unhide_internal() ********/ -/** Sets hidden==false for this control and all its siblings. */ -/** If recurse is true, we go to children as well */ - -void GLUI_Control::unhide_internal( int recurse ) -{ - GLUI_Node *node; - - node = (GLUI_Node *) this; - while( node != NULL ) { - /* printf( "unhide: %s [%d]\n", ((GLUI_Control*)node)->name.c_str(), - ((GLUI_Control*)node)->hidden );*/ - ((GLUI_Control*)node)->hidden = false; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->unhide_internal(true); - - node = node->next(); - } - - node = this->collapsed_node.first_child(); - while( node != NULL ) { - ((GLUI_Control*)node)->hidden = false; - - if ( recurse AND node->first_child() != NULL ) - ((GLUI_Control*) node->first_child())->unhide_internal(true); - - node = node->next(); - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_edittext.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_edittext.cpp deleted file mode 100644 index 601162888..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_edittext.cpp +++ /dev/null @@ -1,1205 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_edittext.cpp - GLUI_EditText control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int data_type, void *live_var, - int id, GLUI_CB callback ) -{ - if (data_type == GLUI_EDITTEXT_TEXT) { - live_type = GLUI_LIVE_TEXT; - } - else if (data_type == GLUI_EDITTEXT_STRING) { - data_type = GLUI_EDITTEXT_TEXT; // EDITTEXT_STRING doesn't really exist. - // Except as a signal to make a string. - // It's a backwards-compat hack. - live_type = GLUI_LIVE_STRING; - } - else if (data_type == GLUI_EDITTEXT_INT) { - live_type = GLUI_LIVE_INT; - } - else if (data_type == GLUI_EDITTEXT_FLOAT) { - live_type = GLUI_LIVE_FLOAT; - } - common_construct( parent, name, data_type, live_type, live_var, id, callback ); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int text_type, int id, GLUI_CB callback ) -{ - common_construct( parent, name, text_type, GLUI_LIVE_NONE, 0, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - int *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_INT, GLUI_LIVE_INT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - float *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_FLOAT, GLUI_LIVE_FLOAT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - char *live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_TEXT, live_var, id, callback); -} - -/****************************** GLUI_EditText::GLUI_EditText() **********/ - -GLUI_EditText::GLUI_EditText( GLUI_Node *parent, const char *name, - std::string &live_var, - int id, GLUI_CB callback ) -{ - common_construct( parent, name, GLUI_EDITTEXT_TEXT, GLUI_LIVE_STRING, &live_var, id, callback); -} - -/****************************** GLUI_EditText::common_construct() **********/ - -void GLUI_EditText::common_construct( GLUI_Node *parent, const char *name, - int data_t, int live_t, void *data, int id, - GLUI_CB cb ) -{ - common_init(); - set_name( name ); - - live_type = live_t; - data_type = data_t; - ptr_val = data; - user_id = id; - callback = cb; - - - if ( live_type == GLUI_LIVE_INT) { - if ( data == NULL ) - set_int_val(int_val); /** Set to some default, in case of no live var **/ - } - else if ( live_type == GLUI_LIVE_FLOAT ) { - num_periods = 1; - if ( data == NULL ) - set_float_val(float_val); /** Set to some default, in case of no live var **/ - } - - parent->add_control( this ); - - init_live(); -} - -/****************************** GLUI_EditText::mouse_down_handler() **********/ - -int GLUI_EditText::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_insertion_pt; - - if ( debug ) dump( stdout, "-> MOUSE DOWN" ); - - tmp_insertion_pt = find_insertion_pt( local_x, local_y ); - if ( tmp_insertion_pt == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - insertion_pt = tmp_insertion_pt; - - sel_start = sel_end = insertion_pt; - - if ( can_draw()) - update_and_draw_text(); - - if ( debug ) dump( stdout, "<- MOUSE UP" ); - - return true; -} - - -/******************************** GLUI_EditText::mouse_up_handler() **********/ - -int GLUI_EditText::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_EditText::mouse_held_down_handler() ******/ - -int GLUI_EditText::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int tmp_pt; - - if ( NOT new_inside ) - return false; - - if ( debug ) dump( stdout, "-> HELD DOWN" ); - - tmp_pt = find_insertion_pt( local_x, local_y ); - - if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ - special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { - /* moved mouse past right edge */ - special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { - sel_end = insertion_pt = tmp_pt; - - update_and_draw_text(); - } - - if ( debug ) - dump( stdout, "<- HELD DOWN" ); - - return false; -} - - -/****************************** GLUI_EditText::key_handler() **********/ - -int GLUI_EditText::key_handler( unsigned char key,int modifiers ) -{ - int i, regular_key; - /* int has_selection; */ - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> KEY HANDLER" ); - - regular_key = false; - bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; - /* has_selection = (sel_start != sel_end); */ - - if ( key == CTRL('m') ) { /* RETURN */ - /* glui->deactivate_current_control(); */ - deactivate(); /** Force callbacks, etc **/ - activate(GLUI_ACTIVATE_TAB); /** Reselect all text **/ - redraw(); - return true; - } - else if ( key == CTRL('[')) { /* ESCAPE */ - glui->deactivate_current_control(); - return true; - } - else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ - ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) - { - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt < (int)text.length() ) { - /*** See if we're deleting a period in a float data-type box ***/ - if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt]=='.' ) - num_periods--; - - /*** Shift over string first ***/ - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( ((key == 127) AND ctrl_down) OR // Delete word forward - ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) - { - if ( sel_start == sel_end ) { /* no selection */ - sel_start = insertion_pt; - sel_end = find_word_break( insertion_pt, +1 ); - } - - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - else if ( key == CTRL('h') ) { /* BACKSPACE */ - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt > 0 ) { - /*** See if we're deleting a period in a float data-type box ***/ - if ( data_type == GLUI_EDITTEXT_FLOAT AND text[insertion_pt-1]=='.' ) - num_periods--; - - /*** Shift over string first ***/ - insertion_pt--; - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ - { - /* Ctrl-key bindings */ - if ( key == CTRL('a') ) { - return special_handler( GLUT_KEY_HOME, 0 ); - } - else if ( key == CTRL('e') ) { - return special_handler( GLUT_KEY_END, 0 ); - } - else if ( key == CTRL('b') ) { - return special_handler( GLUT_KEY_LEFT, 0 ); - } - else if ( key == CTRL('f') ) { - return special_handler( GLUT_KEY_RIGHT, 0 ); - } - else if ( key == CTRL('p') ) { - return special_handler( GLUT_KEY_UP, 0 ); - } - else if ( key == CTRL('n') ) { - return special_handler( GLUT_KEY_DOWN, 0 ); - } - else if ( key == CTRL('u') ) { /* ERASE LINE */ - insertion_pt = 0; - text.erase(0,text.length()); - sel_start = sel_end = 0; - } - else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ - sel_start = sel_end = insertion_pt; - text.erase(insertion_pt,GLUI_String::npos); - } - } - else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ - { - if ( key == 'b' ) { // Backward word - return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); - } - if ( key == 'f' ) { // Forward word - return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); - } - } - else if ( (modifiers & GLUT_ACTIVE_CTRL) OR - (modifiers & GLUT_ACTIVE_ALT) ) - { - /** ignore other keys with modifiers */ - return true; - } - else { /* Regular key */ - regular_key = true; - - /** Check if we only accept numbers **/ - if (data_type == GLUI_EDITTEXT_FLOAT ) { - if ( (key < '0' OR key > '9') AND key != '.' AND key != '-' ) - return true; - - if ( key == '-' ) { /* User typed a '-' */ - - /* If user has first character selected, then '-' is allowed */ - if ( NOT ( MIN(sel_start,sel_end) == 0 AND - MAX(sel_start,sel_end) > 0 ) ) { - - /* User does not have 1st char selected */ - if (insertion_pt != 0 OR text[0] == '-' ) { - return true; /* Can only place negative at beginning of text, - and only one of them */ - } - } - } - - if ( key == '.' ) { - /*printf( "PERIOD: %d\n", num_periods ); */ - - if ( num_periods > 0 ) { - /** We're trying to type a period, but the text already contains - a period. Check whether the period is contained within - is current selection (thus it will be safely replaced) **/ - - int period_found = false; - if ( sel_start != sel_end ) { - for( i=MIN(sel_end,sel_start); i '9') AND key != '-' ) - return true; - - if ( key == '-' ) { /* User typed a '-' */ - - /* If user has first character selected, then '-' is allowed */ - if ( NOT ( MIN(sel_start,sel_end) == 0 AND - MAX(sel_start,sel_end) > 0 ) ) { - - /* User does not have 1st char selected */ - if (insertion_pt != 0 OR text[0] == '-' ) { - return true; /* Can only place negative at beginning of text, - and only one of them */ - } - } - } - } - - /** This is just to get rid of warnings - the flag regular_key is - set if the key was not a backspace, return, whatever. But I - believe if we're here, we know it was a regular key anyway */ - if ( regular_key ) { - } - - /**** If there's a current selection, erase it ******/ - if ( sel_start != sel_end ) { - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - - /******** We insert the character into the string ***/ - - text.insert(insertion_pt,1,key); - - /******** Move the insertion point and substring_end one over ******/ - insertion_pt++; - substring_end++; - - sel_start = sel_end = insertion_pt; - } - - /******** Now redraw text ***********/ - /* Hack to prevent text box from being cleared first **/ - /** int substring_change = update_substring_bounds(); - draw_text_only = - (NOT substring_change AND NOT has_selection AND regular_key ); - */ - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - - if ( debug ) - dump( stdout, "<- KEY HANDLER" ); - - /*** Now look to see if this string has a period ***/ - num_periods = 0; - for( i=0; i<(int)text.length(); i++ ) - if ( text[i] == '.' ) - num_periods++; - - return true; -} - - -/****************************** GLUI_EditText::activate() **********/ - -void GLUI_EditText::activate( int how ) -{ - if ( debug ) - dump( stdout, "-> ACTIVATE" ); - - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - - orig_text = text; - - sel_start = 0; - sel_end = (int)text.length(); - insertion_pt = 0; - - if ( debug ) - dump( stdout, "<- ACTIVATE" ); -} - - -/****************************** GLUI_EditText::deactivate() **********/ - -void GLUI_EditText::deactivate( void ) -{ - int new_int_val; - float new_float_val; - - active = false; - - if ( NOT glui ) - return; - - if ( debug ) - dump( stdout, "-> DISACTIVATE" ); - - sel_start = sel_end = insertion_pt = -1; - - /***** Retrieve the current value from the text *****/ - /***** The live variable will be updated by set_text() ****/ - if ( data_type == GLUI_EDITTEXT_FLOAT ) { - if ( text.length() == 0 ) /* zero-length string - make it "0.0" */ - text = "0.0"; - - new_float_val = atof( text.c_str() ); - - set_float_val( new_float_val ); - } - else if ( data_type == GLUI_EDITTEXT_INT ) { - if ( text.length() == 0 ) /* zero-length string - make it "0" */ - text = "0"; - - new_int_val = atoi( text.c_str() ); - - set_int_val( new_int_val ); - } - else - if ( data_type == GLUI_EDITTEXT_TEXT ) { - set_text(text); /* This will force callbacks and gfx refresh */ - } - - update_substring_bounds(); - - /******** redraw text without insertion point ***********/ - redraw(); - - /***** Now do callbacks if value changed ******/ - if ( orig_text != text ) { - this->execute_callback(); - - if ( 0 ) { - /* THE CODE BELOW IS FROM WHEN SPINNER ALSO MAINTAINED CALLBACKS */ - if ( spinner == NULL ) { /** Are we independent of a spinner? **/ - if ( callback ) { - callback( this ); - } - } - else { /* We're attached to a spinner */ - spinner->do_callbacks(); /* Let the spinner do the callback stuff */ - } - } - } - - if ( debug ) - dump( stdout, "<- DISACTIVATE" ); -} - -/****************************** GLUI_EditText::draw() **********/ - -void GLUI_EditText::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int name_x; - - name_x = MAX(text_x_offset - string_width(this->name) - 3,0); - draw_name( name_x , 13); - - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( text_x_offset, 0 ); glVertex2i( w, 0 ); - glVertex2i( text_x_offset, 0 ); glVertex2i( text_x_offset, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( text_x_offset, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( text_x_offset+1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( text_x_offset+1, 1 ); glVertex2i( text_x_offset+1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( text_x_offset+1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /** Find where to draw the text **/ - update_substring_bounds(); - draw_text(0,0); - - draw_insertion_pt(); -} - - - -/************************** GLUI_EditText::update_substring_bounds() *********/ - -int GLUI_EditText::update_substring_bounds( void ) -{ - int box_width; - int text_len = (int)text.length(); - int old_start, old_end; - - old_start = substring_start; - old_end = substring_end; - - /*** Calculate the width of the usable area of the edit box ***/ - box_width = MAX( this->w - this->text_x_offset - - 4 /* 2 * the two-line box border */ - - 2 * GLUI_EDITTEXT_BOXINNERMARGINX, 0 ); - - CLAMP( substring_end, 0, MAX(text_len-1,0) ); - CLAMP( substring_start, 0, MAX(text_len-1,0) ); - - if ( debug ) dump( stdout, "-> UPDATE SS" ); - - if ( insertion_pt >= 0 AND - insertion_pt < substring_start ) { /* cursor moved left */ - substring_start = insertion_pt; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - } - else if ( insertion_pt > substring_end ) { /* cursor moved right */ - substring_end = insertion_pt-1; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_start++; - } - else { /* cursor is within old substring bounds */ - if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ - } - else { - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - while(substring_end < text_len-1 - AND substring_width( substring_start, substring_end ) <= box_width) - substring_end++; - } - } - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - last_insertion_pt = insertion_pt; - - /*** No selection if not enabled ***/ - if ( NOT enabled ) { - sel_start = sel_end = 0; - } - - if ( debug ) dump( stdout, "<- UPDATE SS" ); - - if ( substring_start == old_start AND substring_end == old_end ) - return false; /*** bounds did not change ***/ - else - return true; /*** bounds did change ***/ -} - - -/********************************* GLUI_EditText::update_x_offsets() *********/ - -void GLUI_EditText::update_x_offsets( void ) -{ -} - - -/********************************* GLUI_EditText::draw_text() ****************/ - -void GLUI_EditText::draw_text( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_x, i, sel_lo, sel_hi; - - if ( debug ) dump( stdout, "-> DRAW_TEXT" ); - - if ( NOT draw_text_only ) { - if ( enabled ) - glColor3f( 1., 1., 1. ); - else - set_to_bkgd_color(); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( text_x_offset+2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i( text_x_offset+2, h-2 ); - glEnd(); - } - - /** Find where to draw the text **/ - - text_x = text_x_offset + 2 + GLUI_EDITTEXT_BOXINNERMARGINX; - - /*printf( "text_x: %d substr_width: %d start/end: %d/%d\n", - text_x, substring_width( substring_start, substring_end ), - substring_start, substring_end ); - */ - /** Find lower and upper selection bounds **/ - sel_lo = MIN(sel_start, sel_end ); - sel_hi = MAX(sel_start, sel_end ); - - int sel_x_start, sel_x_end, delta; - - /** Draw selection area dark **/ - if ( sel_start != sel_end ) { - sel_x_start = text_x; - sel_x_end = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - delta = char_width( text[i] ); - - if ( i < sel_lo ) { - sel_x_start += delta; - sel_x_end += delta; - } - else if ( i < sel_hi ) { - sel_x_end += delta; - } - } - - glColor3f( 0.0f, 0.0f, .6f ); - glBegin( GL_QUADS ); - glVertex2i( sel_x_start, 2 ); glVertex2i( sel_x_end, 2 ); - glVertex2i( sel_x_end, h-2 ); glVertex2i( sel_x_start, h-2 ); - glEnd(); - } - - - if ( sel_start == sel_end ) { /* No current selection */ - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, 13); - for( i=substring_start; i<=substring_end; i++ ) { - glutBitmapCharacter( get_font(), this->text[i] ); - } - } - else { /* There is a selection */ - int x = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { /* This character is selected */ - glColor3f( 1., 1., 1. ); - glRasterPos2i( x, 13); - glutBitmapCharacter( get_font(), this->text[i] ); - } - else { - glColor3f( 0., 0., 0. ); - glRasterPos2i( x, 13); - glutBitmapCharacter( get_font(), this->text[i] ); - } - - x += char_width( text[i] ); - } - } - - if ( debug ) dump( stdout, "<- DRAW_TEXT" ); -} - - -/******************************** GLUI_EditText::find_insertion_pt() *********/ -/* This function returns the character numer *before which* the insertion */ -/* point goes */ - -int GLUI_EditText::find_insertion_pt( int x, int y ) -{ - int curr_x, i; - - /*** See if we clicked outside box ***/ - if ( x < this->x_abs + text_x_offset ) - return -1; - - /* We move from right to left, looking to see if the mouse was clicked - to the right of the ith character */ - - curr_x = this->x_abs + text_x_offset - + substring_width( substring_start, substring_end ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - /*** See if we clicked in an empty box ***/ - if ( (int) text.length() == 0 ) - return 0; - - /** find mouse click in text **/ - for( i=substring_end; i>=substring_start; i-- ) { - curr_x -= char_width( text[i] ); - - if ( x > curr_x ) { - /* printf( "-> %d\n", i ); */ - - return i+1; - } - } - - return 0; - - /* Well, the mouse wasn't after any of the characters...see if it's - before the beginning of the substring */ - if ( 0 ) { - if ( x > (x_abs + text_x_offset + 2 ) ) - return substring_start; - - return -1; /* Nothing found */ - } -} - - -/******************************** GLUI_EditText::draw_insertion_pt() *********/ - -void GLUI_EditText::draw_insertion_pt( void ) -{ - int curr_x, i; - - if ( NOT can_draw() ) - return; - - /*** Don't draw insertion pt if control is disabled ***/ - if ( NOT enabled ) - return; - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); - - if ( sel_start != sel_end OR insertion_pt < 0 ) { - return; /* Don't draw insertion point if there is a current selection */ - } - - /* printf( "insertion pt: %d\n", insertion_pt ); */ - - curr_x = this->x_abs + text_x_offset - + substring_width( substring_start, substring_end ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_EDITTEXT_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - for( i=substring_end; i>=insertion_pt; i-- ) { - curr_x -= char_width( text[i] ); - } - - glColor3f( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - /*** - glVertex2i( curr_x, y_abs + 4 ); - glVertex2i( curr_x, y_abs + 4 ); - glVertex2i( curr_x, y_abs + h - 3 ); - glVertex2i( curr_x, y_abs + h - 3 ); - ***/ - curr_x -= x_abs; - glVertex2i( curr_x, 0 + 4 ); - glVertex2i( curr_x, 0 + 4 ); - glVertex2i( curr_x, 0 + h - 3 ); - glVertex2i( curr_x, 0 + h - 3 ); - glEnd(); - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); -} - - - -/******************************** GLUI_EditText::substring_width() *********/ - -int GLUI_EditText::substring_width( int start, int end ) -{ - int i, width; - - width = 0; - - for( i=start; i<=end; i++ ) - width += char_width( text[i] ); - - return width; -} - - -/***************************** GLUI_EditText::update_and_draw_text() ********/ - -void GLUI_EditText::update_and_draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_EditText::special_handler() **********/ - -int GLUI_EditText::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( debug ) - printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_LEFT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, -1 ); - } - else { - insertion_pt--; - } - } - else if ( key == GLUT_KEY_RIGHT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, +1 ); - } - else { - insertion_pt++; - } - } - else if ( key == GLUT_KEY_HOME ) { - insertion_pt = 0; - } - else if ( key == GLUT_KEY_END ) { - insertion_pt = (int) text.length(); - } - - /*** Update selection if shift key is down ***/ - if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) - sel_end = insertion_pt; - else - sel_start = sel_end = insertion_pt; - - - CLAMP( insertion_pt, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_start, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_end, 0, (int) text.length()); /* Make sure insertion_pt - is in bounds */ - - /******** Now redraw text ***********/ - if ( can_draw()) - update_and_draw_text(); - - return true; -} - - -/****************************** GLUI_EditText::find_word_break() **********/ -/* It looks either left or right (depending on value of 'direction' */ -/* for the beginning of the next 'word', where word are characters */ -/* separated by one of the following tokens: " :-.," */ -/* If there is no next word in the specified direction, this returns */ -/* the beginning of 'text', or the very end. */ - -int GLUI_EditText::find_word_break( int start, int direction ) -{ - int i, j; - char *breaks = " :-.,"; - int num_break_chars = (int)strlen(breaks), text_len = (int)text.length(); - int new_pt; - - /** If we're moving left, we have to start two back, in case we're either - already at the beginning of a word, or on a separating token. - Otherwise, this function would just return the word we're already at **/ - if ( direction == -1 ) { - start -= 2; - } - - /***** Iterate over text in the specified direction *****/ - for ( i=start; i >= 0 AND i < text_len; i += direction ) { - - /** For each character in text, iterate over list of separating tokens **/ - for( j=0; j 0 ) /* Return the end of string */ - return text_len; - else /* Return the beginning of the text */ - return 0; -} - - -/********************************** GLUI_EditText::clear_substring() ********/ - -void GLUI_EditText::clear_substring( int start, int end ) -{ - int i; - - /* - printf( "clearing: %d-%d '", start,end); - for(i=start;ifloat_val = this->float_val; - spinner->int_val = this->int_val; - } - - /*** Now update the live variable ***/ - output_live(true); -} - - -/******************************* GLUI_EditText::set_float_val() ************/ - -void GLUI_EditText::set_float_val( float new_val ) -{ - if ( has_limits == GLUI_LIMIT_CLAMP ) { - /*** Clamp the new value to the existing limits ***/ - - CLAMP( new_val, float_low, float_high ); - } - else if ( has_limits == GLUI_LIMIT_WRAP ) { - /*** Clamp the value cyclically to the limits - that is, if the - value exceeds the max, set it the the minimum, and conversely ***/ - - if ( new_val < float_low ) - new_val = float_high; - if ( new_val > float_high ) - new_val = float_low; - } - - float_val = new_val; - int_val = (int) new_val; /* Mirror the value as an int, too */ - - set_numeric_text(); -} - - -/********************************** GLUI_EditText::set_int_val() ************/ - -void GLUI_EditText::set_int_val( int new_val ) -{ - if ( has_limits == GLUI_LIMIT_CLAMP ) { - /*** Clamp the new value to the existing limits ***/ - - CLAMP( new_val, int_low, int_high ); - } - else if ( has_limits == GLUI_LIMIT_WRAP ) { - /*** Clamp the value cyclically to the limits - that is, if the - value exceeds the max, set it the the minimum, and conversely ***/ - - if ( new_val < int_low ) - new_val = int_high; - if ( new_val > int_high ) - new_val = int_low; - } - - int_val = new_val; - float_val = (float) new_val; /* We mirror the value as a float, too */ - - set_numeric_text(); -} - - -/********************************* GLUI_EditText::set_float_limits() *********/ - -void GLUI_EditText::set_float_limits( float low, float high, int limit_type ) -{ - has_limits = limit_type; - float_low = low; - float_high = high; - - if ( NOT IN_BOUNDS( float_val, float_low, float_high )) - set_float_val( float_low ); - - int_low = (int) float_low; - int_high = (int) float_high; -} - - -/*********************************** GLUI_EditText::set_int_limits() *********/ - -void GLUI_EditText::set_int_limits( int low, int high, int limit_type ) -{ - has_limits = limit_type; - int_low = low; - int_high = high; - - if ( NOT IN_BOUNDS( int_val, int_low, int_high )) - set_int_val( int_low ); - - float_low = (float) int_low; - float_high = (float) int_high; -} - - -/************************************ GLUI_EditText::set_numeric_text() ******/ - -void GLUI_EditText::set_numeric_text( void ) -{ - char buf_num[200]; - int i, text_len; - - if ( data_type == GLUI_EDITTEXT_FLOAT ) { - sprintf( buf_num, "%#g", float_val ); - - num_periods = 0; - text_len = (int) strlen(buf_num); - for ( i=0; i 0 ) { - text_len = (int) strlen(buf_num); - for ( i=text_len-1; i>0; i-- ) { - if ( buf_num[i] == '0' AND buf_num[i-1] != '.' ) - buf_num[i] = '\0'; - else - break; - } - } - set_text( buf_num ); - } - else { - sprintf( buf_num, "%d", int_val ); - set_text( buf_num ); - } - -} - - -/*************************************** GLUI_EditText::dump() **************/ - -void GLUI_EditText::dump( FILE *out, const char *name ) -{ - fprintf( out, - "%s (edittext@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, - insertion_pt, - substring_start, - substring_end, - sel_start, - sel_end, - (int) text.length()); -} - - -/**************************************** GLUI_EditText::mouse_over() ********/ - -int GLUI_EditText::mouse_over( int state, int x, int y ) -{ - if ( state ) { - /* curr_cursor = GLUT_CURSOR_TEXT; */ - glutSetCursor( GLUT_CURSOR_TEXT ); - } - else { - /* printf( "OUT\n" ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - } - - return true; -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_filebrowser.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_filebrowser.cpp deleted file mode 100644 index cad065442..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_filebrowser.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_filebrowser.cpp - GLUI_FileBrowser control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include - -#ifdef __GNUC__ -#include -#include -#endif - -#ifdef _WIN32 -#include -#endif - -#include - -GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent, - const char *name, - int type, - int id, - GLUI_CB cb) -{ - common_init(); - - set_name( name ); - user_id = id; - int_val = type; - callback = cb; - - parent->add_control( this ); - list = new GLUI_List(this, true, 1); - list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this ); - list->set_click_type(GLUI_DOUBLE_CLICK); - this->fbreaddir(this->current_dir.c_str()); -} - -/****************************** GLUI_FileBrowser::draw() **********/ - -void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) { - GLUI_List *list = dynamic_cast(glui_object); - if (!list) - return; - GLUI_FileBrowser* me = dynamic_cast(list->associated_object); - if (!me) - return; - int this_item; - const char *selected; - this_item = list->get_current_item(); - if (this_item > 0) { /* file or directory selected */ - selected = list->get_item_ptr( this_item )->text.c_str(); - if (selected[0] == '/' || selected[0] == '\\') { - if (me->allow_change_dir) { -#ifdef __GNUC__ - chdir(selected+1); -#endif -#ifdef _WIN32 - SetCurrentDirectory(selected+1); -#endif - me->fbreaddir("."); - } - } else { - me->file = selected; - me->execute_callback(); - } - } -} - - - -void GLUI_FileBrowser::fbreaddir(const char *d) { - GLUI_String item; - int i = 0; - - if (!d) - return; - -#ifdef _WIN32 - - WIN32_FIND_DATA FN; - HANDLE hFind; - //char search_arg[MAX_PATH], new_file_path[MAX_PATH]; - //sprintf(search_arg, "%s\\*.*", path_name); - - hFind = FindFirstFile("*.*", &FN); - if (list) { - list->delete_all(); - if (hFind != INVALID_HANDLE_VALUE) { - do { - int len = strlen(FN.cFileName); - if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - item = '\\'; - item += FN.cFileName; - } else { - item = FN.cFileName; - } - list->add_item(i,item.c_str()); - i++; - } while (FindNextFile(hFind, &FN) != 0); - - if (GetLastError() == ERROR_NO_MORE_FILES) - FindClose(&FN); - else - perror("fbreaddir"); - } - } - -#elif defined(__GNUC__) - - DIR *dir; - struct dirent *dirp; - struct stat dr; - - if (list) { - list->delete_all(); - if ((dir = opendir(d)) == NULL) - perror("fbreaddir:"); - else { - while ((dirp = readdir(dir)) != NULL) /* open directory */ - { - if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory */ - item = dirp->d_name + GLUI_String("/"); - else - item = dirp->d_name; - - list->add_item(i,item.c_str()); - i++; - } - closedir(dir); - } - } -#endif -} - -void ProcessFiles(const char *path_name) -{ - -} - - -void GLUI_FileBrowser::set_w(int w) -{ - if (list) list->set_w(w); -} - -void GLUI_FileBrowser::set_h(int h) -{ - if (list) list->set_h(h); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal.h deleted file mode 100644 index a29d2cf61..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef GLUI_INTERNAL_H -#define GLUI_INTERNAL_H - -#include -#include - -#ifndef AND -#define AND && -#define OR || -#define NOT ! -#endif - -#ifndef MAX -#define MAX(a,b) ((a)>(b) ? (a) : (b)) -#define MIN(a,b) ((a)<(b) ? (a) : (b)) -#endif - -#ifndef ABS -#define ABS(a) ((a)>=0 ? (a) : (-(a))) -#endif - -/******************** bit comparisons and operations ***************/ -#ifndef TEST_BIT -#define TEST_BIT( x, b ) (((x) & (1<<(b))) != 0 ) -#define SET_BIT( x, b ) ((x) |= (1 << (b))) -#define CLEAR_BIT( x, b ) ((x) &= ~(1 << (b))) -#define TOGGLE_BIT( x, b ) ((TEST_BIT(x,b)) ?(CLEAR_BIT(x,b)):(SET_BIT(x,b))) -#endif - -#ifndef TEST_AND -#define TEST_AND( a, b ) ((a&b)==b) -#endif - - -#ifndef M_PI -#define M_PI 3.141592654 -#endif - -/*********** flush the stdout and stderr output streams *************/ -#ifndef flushout -#define flushout fflush(stdout) -#define flusherr fflush(stderr) -#endif - -/********** Debugging functions *************************************/ -#ifndef error_return -#define error_return( c ); {fprintf(stderr,c);return;} -#endif - -/************************* floating-point random ********************/ -#ifndef randf -#define randf() ((float) rand() / (float)RAND_MAX ) -#endif - -#ifndef SIGN -#define SIGN(x) ((x)>=0 ? 1 : -1) -#endif - -/****************** conversion between degrees and radians **********/ -#ifndef DEG2RAD -#define DEG2RAD(x) ((x)/180.0*M_PI) -#define RAD2DEG(x) ((x)/M_PI*180.0) -#endif - -/***************** clamp a value to some fixed interval *************/ -#ifndef CLAMP -#define CLAMP(x,lo,hi) {if ((x) < (lo)) {(x)=(lo);} else if((x) > (hi)) {(x)=(hi);}} -#endif - -/************ check if a value lies within a closed interval *********/ -#ifndef IN_BOUNDS -#define IN_BOUNDS( x, lo, hi ) ( (x) >= (lo) AND (x) <= (hi) ) -#endif - -/************ check if a 2D point lies within a 2D box ***************/ -#ifndef PT_IN_BOX -#define PT_IN_BOX( x, y, lo_x, hi_x, lo_y, hi_y ) \ -( IN_BOUNDS(x,lo_x,hi_x) AND IN_BOUNDS(y,lo_y,hi_y) ) -#endif - -/****** check if value lies on proper side of another value *****/ -/*** if side is positive => proper side is positive, else negative **/ -#ifndef CHECK_PROPER_SIDE -#define CHECK_PROPER_SIDE(x,val,side) ((side) > 0 ? (x) > (val) : (x) < (val)) -#endif - - -/***** Small value when we want to do a comparison to 'close to zero' *****/ -#ifndef FUDGE -#define FUDGE .00001 -#endif - - -/******************* swap two values, using a temp variable *********/ -#ifndef SWAP2 -#define SWAP2(a,b,t) {t=a;a=b;b=t;} -#endif - -#define VEC3_TO_ARRAY(v,a) a[0]=v[0], a[1]=v[1], a[2]=v[2] - -/**** Return the ASCII control code given the non-control ASCII character */ -#define CTRL(c) ( (c>=('a'-1)) ? (c-'a'+1) : (c-'A'+1) ) - - -#endif /* GLUI_INTERNAL_H */ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal_control.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal_control.h deleted file mode 100644 index 9b83fc0fb..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_internal_control.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Header file for use by GLUI controls. - Everything you need is right here. - - -*/ -#ifndef __GLUI_INTERNAL_CONTROL_H -#define __GLUI_INTERNAL_CONTROL_H - -/* This is the main GLUI external header */ -#include "GL/glui.h" - -/* Here's some utility routines */ -#include "glui_internal.h" - - -/** - A GLUI_Control-drawing sentinal object. - On creation, saves the current draw buffer and window. - On destruction, restores draw buffer and window. - This is way nicer than calling save/restore manually. -*/ -class GLUI_DrawingSentinal { - int orig_buf, orig_win; - GLUI_Control *c; -public: - /** The constructor sets up the drawing system */ - GLUI_DrawingSentinal(GLUI_Control *c_); - /** The destructor cleans up drawing back how it was */ - ~GLUI_DrawingSentinal(); - - // Do-nothing routine to avoid compiler warning about unused variable - inline void avoid_warning(void) {} -}; -/** Just drop a GLUI_DRAWINGSENTINAL_IDIOM at the start of your draw methods, -and they'll return if we can't be drawn, and -automatically save and restore all needed state. -*/ -#define GLUI_DRAWINGSENTINAL_IDIOM if (NOT can_draw()) return; GLUI_DrawingSentinal drawSentinal(this); drawSentinal.avoid_warning(); - - -/** Return the time, in seconds. */ -inline double GLUI_Time(void) {return 0.001*glutGet(GLUT_ELAPSED_TIME);} - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_list.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_list.cpp deleted file mode 100644 index cebb8a382..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_list.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_list.cpp - GLUI_List control class - - - -------------------------------------------------- - - Copyright (c) 2004 John Kew - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include -#include - -/****************************** GLUI_List::GLUI_List() **********/ - -GLUI_List::GLUI_List( GLUI_Node *parent, bool scroll, - int id, GLUI_CB callback - /*,GLUI_Control *object - GLUI_InterObject_CB obj_cb*/) -{ - common_construct(parent, NULL, scroll, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_List::GLUI_List() **********/ - -GLUI_List::GLUI_List( GLUI_Node *parent, - GLUI_String& live_var, bool scroll, - int id, - GLUI_CB callback - /* ,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ ) -{ - common_construct(parent, &live_var, scroll, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_List::common_construct() **********/ - -void GLUI_List::common_construct( - GLUI_Node *parent, - GLUI_String* data, bool scroll, - int id, - GLUI_CB callback - /*,GLUI_Control *object - , GLUI_InterObject_CB obj_cb*/) -{ - common_init(); - GLUI_Node *list_panel = parent; - - if (scroll) { - GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); - p->x_off = 1; - list_panel = p; - } - this->ptr_val = data; - if (data) { - this->live_type = GLUI_LIVE_STRING; - } - this->user_id = id; - this->callback = callback; - this->name = "list"; - list_panel->add_control( this ); - if (scroll) - { - new GLUI_Column(list_panel, false); - scrollbar = - new GLUI_Scrollbar(list_panel, - "scrollbar", - GLUI_SCROLL_VERTICAL, - GLUI_SCROLL_INT); - scrollbar->set_object_callback(GLUI_List::scrollbar_callback, this); - scrollbar->set_alignment(GLUI_ALIGN_LEFT); - // scrollbar->can_activate = false; //kills ability to mouse drag too - } - init_live(); -} - -/****************************** GLUI_List::mouse_down_handler() **********/ -int GLUI_List::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_line; - unsigned long int ms; - timeb time; - ftime(&time); - ms = time.millitm + (time.time)*1000; - - tmp_line = find_line( local_x-x_abs, local_y-y_abs-5 ); - if ( tmp_line == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - if (tmp_line < num_lines) { - curr_line = tmp_line; - if (scrollbar) - scrollbar->set_int_val(curr_line); - this->execute_callback(); - if (associated_object != NULL) - if (cb_click_type == GLUI_SINGLE_CLICK) { - if (obj_cb) { - // obj_cb(associated_object, user_id); - obj_cb(this); - } - } else { - if (last_line == curr_line && (ms - last_click_time) < 300) { - //obj_cb(associated_object, user_id); - obj_cb(this); - } else { - last_click_time = ms; - last_line = curr_line; - } - } - if ( can_draw()) - update_and_draw_text(); - } - - return true; -} - - - - -/******************************** GLUI_List::mouse_up_handler() **********/ - -int GLUI_List::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_List::mouse_held_down_handler() ******/ - -int GLUI_List::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - return false; -} - - -/****************************** GLUI_List::key_handler() **********/ - -int GLUI_List::key_handler( unsigned char key,int modifiers ) -{ - - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - return true; -} - - -/****************************** GLUI_List::activate() **********/ - -void GLUI_List::activate( int how ) -{ -// if ( debug ) -// dump( stdout, "-> ACTIVATE" ); - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - -} - - -/****************************** GLUI_List::deactivate() **********/ - -void GLUI_List::deactivate( void ) -{ - active = false; - redraw(); -} - -/****************************** GLUI_List::draw() **********/ - -void GLUI_List::draw( int x, int y ) -{ - int line = 0; - int box_width; - GLUI_List_Item *item; - - GLUI_DRAWINGSENTINAL_IDIOM - - /* Bevelled Border */ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( 0, 0 ); glVertex2i( 0, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /* Draw Background if enabled*/ - if (enabled) { - glColor3f( 1., 1., 1. ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } else { - glColor3f( .8, .8, .8 ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } - - /* Figure out how wide the box is */ - box_width = get_box_width(); - - /* Figure out which lines are visible*/ - - visible_lines = (int)(h-20)/15; - - item = (GLUI_List_Item *) items_list.first_child(); - - line = 0; - while (item) { - if (line < start_line) { - line++; - item = (GLUI_List_Item *) item->next(); - continue; - } - if (line >= start_line && line <= (start_line+visible_lines)) { - if (curr_line == line) - draw_text(item->text.c_str(),1,0,(line - start_line)*15); - else - draw_text(item->text.c_str(),0,0,(line - start_line)*15); - } - line++; - item = (GLUI_List_Item *) item->next(); - } - - if (scrollbar) { - scrollbar->set_int_limits(MAX(0,num_lines-visible_lines), 0); - glPushMatrix(); - glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); - scrollbar->draw_scroll(); - glPopMatrix(); - } -} - -/********************************* GLUI_List::draw_text() ****************/ - -void GLUI_List::draw_text(const char *t, int selected, int x, int y ) -{ - int text_x, i, x_pos; - int box_width; - - GLUI_DRAWINGSENTINAL_IDIOM - - /** Find where to draw the text **/ - - text_x = 2 + GLUI_LIST_BOXINNERMARGINX; - - /** Draw selection area dark **/ - if ( enabled && selected ) { - glColor3f( 0.0f, 0.0f, .6f ); - glBegin( GL_QUADS ); - glVertex2i(text_x, y+5 ); glVertex2i( w-text_x, y+5 ); - glVertex2i(w-text_x, y+19 ); glVertex2i(text_x, y+19 ); - glEnd(); - } - box_width = get_box_width(); - - if ( !selected || !enabled ) { /* No current selection */ - x_pos = text_x; /* or control disabled */ - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, y+15); - i = 0; - while( t[i] != '\0' && substring_width(t,0,i) < box_width) { - glutBitmapCharacter( get_font(), t[i] ); - x_pos += char_width( t[i] ); - i++; - } - } - else { /* There is a selection */ - i = 0; - x_pos = text_x; - glColor3f( 1., 1., 1. ); - glRasterPos2i( text_x, y+15); - while( t[i] != '\0' && substring_width(t,0,i) < box_width) { - glutBitmapCharacter( get_font(), t[i] ); - x_pos += char_width( t[i] ); - i++; - } - } -} - - -int GLUI_List::find_line(int x, int y) { - return start_line + ((int)(y/15)); -} - -int GLUI_List::get_box_width() { - return MAX( this->w - - 6 /* 2 * the two-line box border */ - - 2 * GLUI_LIST_BOXINNERMARGINX, 0 ); - -} - -/******************************** GLUI_List::substring_width() *********/ -int GLUI_List::substring_width( const char *t, int start, int end ) -{ - int i, width; - - width = 0; - - for( i=start; i<=end; i++ ) - width += char_width( t[i] ); - - return width; -} - - -/***************************** GLUI_List::update_and_draw_text() ********/ - -void GLUI_List::update_and_draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - //update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_List::special_handler() **********/ - -int GLUI_List::special_handler( int key,int modifiers ) -{ - if ( NOT glui ) - return false; - - if ( key == GLUT_KEY_DOWN ) { - if (curr_line < num_lines) { - curr_line++; - if (curr_line > start_line+visible_lines) - start_line++; - } - } else if ( key == GLUT_KEY_UP ) { - if (curr_line > 0) { - curr_line--; - if (curr_line < start_line) - start_line--; - } - } - - if (scrollbar) - scrollbar->set_int_val(curr_line); - redraw(); - return true; -} - - -/************************************ GLUI_List::update_size() **********/ - -void GLUI_List::update_size( void ) -{ - if ( NOT glui ) - return; - - if ( w < GLUI_LIST_MIN_TEXT_WIDTH ) - w = GLUI_LIST_MIN_TEXT_WIDTH; -} - -/**************************************** GLUI_Listbox::add_item() **********/ - -int GLUI_List::add_item( int id, const char *new_text ) -{ - GLUI_List_Item *new_node = new GLUI_List_Item; - GLUI_List_Item *head; - - new_node->text = new_text; - new_node->id = id; - - head = (GLUI_List_Item*) items_list.first_child(); - new_node->link_this_to_parent_last( &items_list ); - - if ( head == NULL ) { - /*** This is first item added ***/ - - int_val = id+1; /** Different than id **/ - // do_selection( id ); - last_live_int = id; - - if( glui ) - glui->post_update_main_gfx(); - } - num_lines++; - if (scrollbar) - scrollbar->set_int_limits(MAX(num_lines-visible_lines,0), 0); - - return true; -} - -/************************************** GLUI_Listbox::delete_() **********/ - -int GLUI_List::delete_all() -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - item->unlink(); - delete item; - item = (GLUI_List_Item *) items_list.first_child(); - } - - num_lines = 0; - curr_line = 0; - - return true; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_List::delete_item( const char *text ) -{ - GLUI_List_Item *node = get_item_ptr( text ); - - if ( node ) { - node->unlink(); - delete node; - num_lines--; - return true; - } - else { - return false; - } -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_List::delete_item( int id ) -{ - GLUI_List_Item *node = get_item_ptr( id ); - - if ( node ) { - node->unlink(); - delete node; - num_lines--; - return true; - } - else { - return false; - } -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_List_Item *GLUI_List::get_item_ptr( const char *text ) -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - if ( item->text == text ) - return item; - - item = (GLUI_List_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_List_Item *GLUI_List::get_item_ptr( int id ) -{ - GLUI_List_Item *item; - - item = (GLUI_List_Item *) items_list.first_child(); - while( item ) { - if ( item->id == id ) - return item; - - item = (GLUI_List_Item *) item->next(); - } - - return NULL; -} - -/**************************************** GLUI_List::mouse_over() ********/ - -int GLUI_List::mouse_over( int state, int x, int y ) -{ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - return true; -} - -void GLUI_List::scrollbar_callback(GLUI_Control *my_scrollbar) { - GLUI_Scrollbar *sb = dynamic_cast(my_scrollbar); - if (!sb) return; - GLUI_List* me = (GLUI_List*) sb->associated_object; - if (me->scrollbar == NULL) - return; - int new_start_line = sb->get_int_val(); // TODO!! - me->start_line = new_start_line; - - if ( me->can_draw() ) - me->update_and_draw_text(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_listbox.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_listbox.cpp deleted file mode 100644 index 7350e1df7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_listbox.cpp +++ /dev/null @@ -1,455 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_listbox - GLUI_ListBox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Listbox::GLUI_Listbox() **********/ -GLUI_Listbox::GLUI_Listbox( GLUI_Node *parent, - const char *name, int *value_ptr, - int id, - GLUI_CB cb) -{ - common_init(); - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - - parent->add_control( this ); - - init_live(); -} - - -/****************************** GLUI_Listbox::mouse_down_handler() **********/ - -int GLUI_Listbox::mouse_down_handler( int local_x, int local_y ) -{ - return false; -} - - -/****************************** GLUI_Listbox::mouse_up_handler() **********/ - -int GLUI_Listbox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - - return false; -} - - -/****************************** GLUI_Listbox::mouse_held_down_handler() ******/ - -int GLUI_Listbox::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - - return false; -} - - -/****************************** GLUI_Listbox::key_handler() **********/ - -int GLUI_Listbox::key_handler( unsigned char key,int modifiers ) -{ - return false; -} - - -/****************************** GLUI_Listbox::draw() **********/ - -void GLUI_Listbox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int name_x; - - /* draw_active_area(); */ - - name_x = MAX(text_x_offset - string_width(this->name) - 3,0); - draw_name( name_x , 13); - draw_box_inwards_outline( text_x_offset, w, - 0, h ); - - if ( NOT active ) { - draw_box( text_x_offset+3, w-2, 2, h-2, 1.0, 1.0, 1.0 ); - if ( NOT enabled ) - glColor3b( 32, 32, 32 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - glRasterPos2i( text_x_offset+5, 13 ); - draw_string( curr_text ); - } - else { - draw_box( text_x_offset+3, w-2, 2, h-2, .0, .0, .6 ); - glColor3f( 1.0, 1.0, 1.0 ); - glRasterPos2i( text_x_offset+5, 13 ); - draw_string( curr_text ); - } - - - if ( enabled ) { - glui->std_bitmaps. - draw(GLUI_STDBITMAP_LISTBOX_UP, - w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, - 2 ); - } - else { - glui->std_bitmaps. - draw(GLUI_STDBITMAP_LISTBOX_UP_DIS, - w-glui->std_bitmaps.width(GLUI_STDBITMAP_LISTBOX_UP)-1, - 2 ); - } -} - - -/************************************ GLUI_Listbox::update_si() **********/ -void GLUI_Listbox::update_size( void ) -{ - recalculate_item_width(); -} - -/********************************* GLUI_Listbox::set_int_val() **************/ - -void GLUI_Listbox::set_int_val( int new_val ) -{ - /* int_val = new_val; */ - - do_selection( new_val ); - - /*** Update the variable we're (possibly) pointing to, and update the main gfx ***/ - output_live(true); -} - -/**************************************** GLUI_Listbox::add_item() **********/ - -int GLUI_Listbox::add_item( int id, const char *new_text ) -{ - GLUI_Listbox_Item *new_node = new GLUI_Listbox_Item; - GLUI_Listbox_Item *head; - - new_node->text = new_text; - new_node->id = id; - - head = (GLUI_Listbox_Item*) items_list.first_child(); - new_node->link_this_to_parent_last( &items_list ); - - if ( head == NULL ) { - /*** This is first item added ***/ - - int_val = id+1; /** Different than id **/ - do_selection( id ); - last_live_int = id; - - if( glui ) - glui->post_update_main_gfx(); - } - if (recalculate_item_width()) glui->refresh(); - - return true; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_Listbox::delete_item( const char *text ) -{ - GLUI_Listbox_Item *node = get_item_ptr(text); - - if (node) - { - node->unlink(); - delete node; - return true; - } - if (recalculate_item_width()) glui->refresh(); - - return false; -} - - -/************************************** GLUI_Listbox::delete_item() **********/ - -int GLUI_Listbox::delete_item(int id) -{ - GLUI_Listbox_Item *node = get_item_ptr(id); - - if (node) - { - node->unlink(); - delete node; - return true; - } - if (recalculate_item_width()) glui->refresh(); - - return false; -} - - -/************************************** GLUI_Listbox::sort_items() **********/ - -int GLUI_Listbox::sort_items( void ) -{ - return false; -} - - -/********************************************* GLUI_Listbox::dump() **********/ - -void GLUI_Listbox::dump( FILE *output ) -{ - GLUI_Listbox_Item *item; - - /* printf( "%p\n", (char*) name ); */ - - fprintf( output, "Listbox: %s\n", name.c_str() ); - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - fprintf( output, " %3d : %s\n", item->id, item->text.c_str() ); - - item = (GLUI_Listbox_Item *) item->next(); - } -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( const char *text ) -{ - GLUI_Listbox_Item *item; - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->text == text ) - return item; - - item = (GLUI_Listbox_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::get_item_ptr() **********/ - -GLUI_Listbox_Item *GLUI_Listbox::get_item_ptr( int id ) -{ - GLUI_Listbox_Item *item; - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->id == id ) - return item; - - item = (GLUI_Listbox_Item *) item->next(); - } - - return NULL; -} - - -/************************************ GLUI_Listbox::mouse_over() **********/ - -static void listbox_callback( int i ) -{ - int old_val; - - if ( NOT GLUI_Master.curr_left_button_glut_menu OR - !dynamic_cast(GLUI_Master.curr_left_button_glut_menu) ) - return; - - old_val = ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val; - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->set_int_val(i); - - /**** If value changed, execute callback ****/ - if ( old_val != - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->int_val ) { - ((GLUI_Listbox*)GLUI_Master.curr_left_button_glut_menu)->execute_callback(); - } -} - - -/*************************************** GLUI_Listbox::mouse_over() **********/ - -int GLUI_Listbox::mouse_over( int state, int x, int y ) -{ - GLUI_Listbox_Item *item; - - /* printf( "x/y: %d/%d\n", x, y ); */ - - if ( state AND enabled AND x > x_abs + text_x_offset) { - /**** Build a GLUT menu for this listbox ***/ - - /* printf( "%d %d\n", x, y ); */ - - glut_menu_id = glutCreateMenu(listbox_callback); - - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - glutAddMenuEntry( item->text.c_str(), item->id ); - item = (GLUI_Listbox_Item *) item->next(); - } - - glutAttachMenu( GLUT_LEFT_BUTTON); - - GLUI_Master.set_left_button_glut_menu_control( this ); - } - else if ( glut_menu_id != -1 ) { - /* printf( "OUT\n" ); */ - glutDetachMenu( GLUT_LEFT_BUTTON ); - glutDestroyMenu( glut_menu_id ); - glut_menu_id = -1; - } - - return true; -} - - -/************************************ GLUI_Listbox::do_selection() **********/ - -int GLUI_Listbox::do_selection( int item_num ) -{ - GLUI_Listbox_Item *item, *sel_item; - - /*** Is this item already selected? ***/ - if ( item_num == int_val ) - return false; - - sel_item = NULL; - item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - if ( item->id == item_num ) { - sel_item = item; - break; - } - - item = (GLUI_Listbox_Item *) item->next(); - } - - if ( NOT sel_item ) - return false; - - /* printf( "-> %s\n", (char*) sel_item->text ); */ - - int_val = item_num; - curr_text = sel_item->text; - redraw(); - - return true; -} - - -/*********************************** GLUI_Listbox::~GLUI_Listbox() **********/ - -GLUI_Listbox::~GLUI_Listbox() -{ - GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); - - while (item) - { - GLUI_Listbox_Item *tmp = item; - item = (GLUI_Listbox_Item *) item->next(); - delete tmp; - } -} - -/****************************** GLUI_Listbox::special_handler() **********/ - -int GLUI_Listbox::special_handler( int key,int modifiers ) -{ - GLUI_Listbox_Item *node, *new_node; - - node = get_item_ptr( int_val ); - new_node = NULL; - - if ( key == GLUT_KEY_DOWN ) { - new_node = (GLUI_Listbox_Item*) node->next(); - } - else if ( key == GLUT_KEY_UP ) { - new_node = (GLUI_Listbox_Item*) node->prev(); - } - else if ( key == GLUT_KEY_HOME ) { - new_node = (GLUI_Listbox_Item*) items_list.first_child(); - } - else if ( key == GLUT_KEY_END ) { - new_node = (GLUI_Listbox_Item*) items_list.last_child(); - } - - if ( new_node != NULL AND new_node != node ) { - node = new_node; - set_int_val( node->id ); - execute_callback(); - return true; - } - else { - return false; - } -} - - -/************************* GLUI_Listbox::recalculate_item_width( void ) ***********/ -/** Change w and return true if we need to be widened to fit the current items. */ -bool GLUI_Listbox::recalculate_item_width( void ) -{ - int item_text_size; - - if ( NOT glui ) - return false; - - /* Find the title size */ - text_x_offset = string_width( name ); - - /* Find the longest item string ***/ - item_text_size = 0; - - GLUI_Listbox_Item *item = (GLUI_Listbox_Item *) items_list.first_child(); - while( item ) { - item_text_size = MAX(item_text_size,string_width(item->text)); - item = (GLUI_Listbox_Item *) item->next(); - } - - /* Sum up our layout: name, item, and drop-down marker */ - int new_wid=text_x_offset+MAX(GLUI_EDITTEXT_MIN_TEXT_WIDTH,item_text_size)+20; - if ( w != new_wid) { - w = new_wid; - return true; /* we gotta be shortened or widened */ - } - else { - return false; /* our current width is OK */ - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_mouse_iaction.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_mouse_iaction.cpp deleted file mode 100644 index 04acc5a9e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_mouse_iaction.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_mouse_iaction - GLUI Mouse Interaction control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/********************** GLUI_Mouse_Interaction::mouse_down_handler() ******/ - -int GLUI_Mouse_Interaction::mouse_down_handler( int local_x, int local_y ) -{ - /* int win_h = glutGet( GLUT_WINDOW_HEIGHT ); */ - - /* iaction_mouse_down_handler( local_x, local_y ); */ - iaction_mouse_down_handler( local_x-x_abs, local_y-y_abs ); - /*local_x-x_abs, ((glui->h-local_y)-y_abs) ); */ - redraw(); - - return false; -} - - -/**************************** GLUI_Mouse_Interaction::mouse_up_handler() */ - -int GLUI_Mouse_Interaction::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - iaction_mouse_up_handler( local_x-x_abs, local_y-y_abs, inside ); - return false; -} - - -/****************************** GLUI_Mouse_Interaction::mouse_held_down_handler() ******/ - -int GLUI_Mouse_Interaction::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - iaction_mouse_held_down_handler( local_x-x_abs, local_y-y_abs , inside ); - - redraw(); - - /** Tell the main graphics window to update iteself **/ - if( glui ) - glui->post_update_main_gfx(); - - execute_callback(); - - return false; -} - - - -/****************************** GLUI_Mouse_Interaction::draw() **********/ - -void GLUI_Mouse_Interaction::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width = string_width( this->name ); - int x_left = this->w/2 - text_width/2; - - if ( NOT draw_active_area_only ) { - draw_name( x_left, h-4 ); - draw_active_box( x_left-4, x_left+string_width( name )+4, - h, h-14 ); - } - - draw_active_area(); -} - - -/************************************ GLUI_Mouse_Interaction::update_size() **********/ - -void GLUI_Mouse_Interaction::update_size( void ) -{ - if ( NOT glui ) - return; - - int text_width = string_width( this->name ); - - if ( w < text_width+6 ) - w = text_width+6; - - if ( h - 18 > w ) - w = h - 18; - - iaction_init(); -} - - -/****************************** GLUI_Mouse_Interaction::special_handler() **********/ - -int GLUI_Mouse_Interaction::special_handler( int key,int modifiers ) -{ - int center_x, center_y; - int drag_x, drag_y; - - center_x = w/2; - center_y = (h-18)/2; - drag_x = 0; - drag_y = 0; - - if ( key == GLUT_KEY_LEFT ) - drag_x = -6; - else if ( key == GLUT_KEY_RIGHT ) - drag_x = 6; - else if ( key == GLUT_KEY_UP ) - drag_y = -6; - else if ( key == GLUT_KEY_DOWN ) - drag_y = 6; - - if ( drag_x != 0 OR drag_y != 0 ) { - mouse_down_handler( center_x, center_y ); - mouse_held_down_handler( center_x + drag_x, center_y + drag_y,true ); - mouse_up_handler( center_x + drag_x, center_y + drag_y, true ); - } - - return false; -} - - -/****************************** GLUI_Mouse_Interaction::draw_active_area() **********/ - -void GLUI_Mouse_Interaction::draw_active_area( void ) -{ - int win_h = glutGet( GLUT_WINDOW_HEIGHT ), win_w = glutGet(GLUT_WINDOW_WIDTH); - - int text_height = 18; /* what a kludge */ - - int viewport_size = h-text_height; /*MIN(w,h); */ - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - glTranslatef( (float) win_w/2.0, (float) win_h/2.0, 0.0 ); - glRotatef( 180.0, 0.0, 1.0, 0.0 ); - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - glTranslatef( (float) -win_w/2.0, (float) -win_h/2.0, 0.0 ); - - glTranslatef( (float) this->x_abs + .5, (float) this->y_abs + .5, 0.0 ); - - glTranslatef( (float)this->w/2.0, (float)viewport_size/2.0 + 2.0 , 0.0 ); - - /*** Draw the interaction control's orthographic elements ***/ - iaction_draw_active_area_ortho(); - - /*** Setup and draw the interaction control's perspective elements ***/ - - /*** Set the viewport to just the square of the drawing area ***/ - /* glViewport( this->x_abs , glui->main_panel->h - this->y_abs - this->h,*/ - /*glViewport( this->x_abs+1+(this->w/2-viewport_size/2), - this->h-this->y_abs-viewport_size-1, - viewport_size, viewport_size );*/ - - viewport_size -= 4; - int offset = 0; - if ( ((this->w-viewport_size) % 2) == 1 ) - offset = 1; - - glViewport( this->x_abs + (this->w-viewport_size)/2 + offset, - win_h - this->y_abs - this->h + text_height, - viewport_size, viewport_size ); - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - double xy=1.00,zc=50.0; /* X-Y size, and Z origin */ - glFrustum( -1.0*xy, 1.0*xy, -xy, xy, zc*0.7, zc*1.3 ); - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - glTranslatef( 0.0, 0.0, -zc ); - glScalef(xy,xy,1.0); // xy); - - /* glutSolidTeapot( 1.0 ); */ - iaction_draw_active_area_persp(); - - glMatrixMode( GL_MODELVIEW ); - glPopMatrix(); - - glui->set_viewport(); - glui->set_ortho_projection(); - - glMatrixMode( GL_MODELVIEW ); - glPopMatrix(); -} - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_node.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_node.cpp deleted file mode 100644 index 02c6e7573..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_node.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_node.cpp - linked-list tree structure - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" - -/********************************************* GLUI_Node::GLUI_Node() *******/ - -GLUI_Node::GLUI_Node() -: - parent_node(NULL), - child_head(NULL), - child_tail(NULL), - next_sibling(NULL), - prev_sibling(NULL) -{ -} - -/********************************************* GLUI_Node::first() *******/ -/* Returns first sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::first_sibling( void ) -{ - if ( parent_node == NULL ) - return this; /* root node has no siblings */ - else - return parent_node->child_head; -} - - -/******************************************** GLUI_Node::next() ********/ -/* Returns next sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::next( void ) -{ - return next_sibling; -} - - -/******************************************** GLUI_Node::prev() ********/ -/* Returns prev sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::prev( void ) -{ - return prev_sibling; -} - - -/********************************************* GLUI_Node::last() *******/ -/* Returns last sibling in 'this' node's sibling list */ - -GLUI_Node *GLUI_Node::last_sibling( void ) -{ - if ( parent_node == NULL ) - return this; /* root node has no siblings */ - else - return parent_node->child_tail; -} - - -/*************************** GLUI_Node::link_this_to_parent_last() *******/ -/* Links as last child of parent */ - -void GLUI_Node::link_this_to_parent_last( GLUI_Node *new_parent ) -{ - if ( new_parent->child_tail == NULL ) { /* parent has no children */ - new_parent->child_head = this; - new_parent->child_tail = this; - this->parent_node = new_parent; - } - else { /* parent has children */ - new_parent->child_tail->next_sibling = this; - this->prev_sibling = new_parent->child_tail; - new_parent->child_tail = this; - this->parent_node = new_parent; - } -} - - -/*************************** GLUI_Node::link_this_to_parent_first() *******/ -/* Links as first child of parent */ - -void GLUI_Node::link_this_to_parent_first( GLUI_Node *new_parent ) -{ - if ( new_parent->child_head == NULL ) { /* parent has no children */ - new_parent->child_head = this; - new_parent->child_tail = this; - this->parent_node = new_parent; - } - else { /* parent has children */ - new_parent->child_head->prev_sibling = this; - this->next_sibling = new_parent->child_head; - new_parent->child_head = this; - this->parent_node = new_parent; - } -} - -/**************************** GLUI_Node::link_this_to_sibling_next() *****/ - -void GLUI_Node::link_this_to_sibling_next( GLUI_Node *sibling ) -{ - if ( sibling->next_sibling == NULL ) { /* node has no next sibling */ - sibling->next_sibling = this; - this->prev_sibling = sibling; - - /* This was the parent's last child, so update that as well */ - if ( sibling->parent_node != NULL ) { - sibling->parent_node->child_tail = this; - } - } - else { /* node already has a next sibling */ - sibling->next_sibling->prev_sibling = this; - this->next_sibling = sibling->next_sibling; - sibling->next_sibling = this; - this->prev_sibling = sibling; - } - - this->parent_node = sibling->parent_node; -} - - -/**************************** GLUI_Node::link_this_to_sibling_prev() *****/ - -void GLUI_Node::link_this_to_sibling_prev( GLUI_Node *sibling ) -{ - if ( sibling->prev_sibling == NULL ) { /* node has no prev sibling */ - sibling->prev_sibling = this; - this->next_sibling = sibling; - - /* This was the parent's first child, so update that as well */ - if ( sibling->parent_node != NULL ) { - sibling->parent_node->child_head = this; - } - } - else { /* node already has a prev sibling */ - sibling->prev_sibling->next_sibling = this; - this->prev_sibling = sibling->prev_sibling; - sibling->prev_sibling = this; - this->next_sibling = sibling; - } - - this->parent_node = sibling->parent_node; -} - -/**************************************** GLUI_Node::unlink() **************/ - -void GLUI_Node::unlink( void ) -{ - /* Unlink from prev sibling */ - if ( this->prev_sibling != NULL ) { - this->prev_sibling->next_sibling = this->next_sibling; - } - else { /* No prev sibling: this was parent's first child */ - this->parent_node->child_head = this->next_sibling; - } - - /* Unlink from next sibling */ - if ( this->next_sibling != NULL ) { - this->next_sibling->prev_sibling = this->prev_sibling; - } - else { /* No next sibling: this was parent's last child */ - this->parent_node->child_tail = this->prev_sibling; - } - - this->parent_node = NULL; - this->next_sibling = NULL; - this->prev_sibling = NULL; - this->child_head = NULL; - this->child_tail = NULL; -} - -/**************************************** GLUI_Node::dump() **************/ - -void GLUI_Node::dump( FILE *out, const char *name ) -{ - fprintf( out, "GLUI_node: %s\n", name ); - fprintf( out, " parent: %p child_head: %p child_tail: %p\n", - (void *) parent_node, - (void *) child_head, - (void *) child_tail ); - fprintf( out, " next: %p prev: %p\n", - (void *) next_sibling, - (void *) prev_sibling ); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_panel.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_panel.cpp deleted file mode 100644 index 7605060a6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_panel.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -GLUI_Panel::GLUI_Panel( GLUI_Node *parent, const char *name, int type ) -{ - common_init(); - set_name( name ); - user_id = -1; - int_val = type; - - parent->add_control( this ); -} - -/****************************** GLUI_Panel::draw() **********/ - -void GLUI_Panel::draw( int x, int y ) -{ - int top; - GLUI_DRAWINGSENTINAL_IDIOM - - if ( int_val == GLUI_PANEL_RAISED ) { - top = 0; - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); glVertex2i( w, top ); - glVertex2i( 0, top ); glVertex2i( 0, h ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( w, top ); - glVertex2i( w, h ); - glVertex2i( 0, h ); - glVertex2i( w, h ); - glEnd(); - - /** ORIGINAL RAISED PANEL METHOD - A LITTLE TOO HIGH ** - glLineWidth(1.0); - glBegin( GL_LINES ); - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i( 1, 1 ); glVertex2i( w-2, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-2 ); - - glColor3f( .5, .5, .5 ); - glVertex2i( w-1, 1 ); glVertex2i( w-1, h-1 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - - glColor3f( 0.0, 0.0, 0.0 ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, 0 ); glVertex2i( w, h ); - glEnd(); - - -- Touch up the lines a bit (needed in some opengl implementations - glBegin( GL_POINTS ); - glColor3f( .5, .5, .5 ); - glVertex2i( w-1, h-1 ); - glColor3f( 0.0, 0.0, 0.0 ); - glVertex2i( w, h ); - glEnd(); - **/ - } - else if ( int_val == GLUI_PANEL_EMBOSSED ) { - if ( parent_node == NULL || name == "" ) { - top = 0; - } - else { - top = GLUI_PANEL_EMBOSS_TOP; - } - - glLineWidth( 1.0 ); - glColor3f( 1.0, 1.0, 1.0 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); glVertex2i( w, top ); - glVertex2i( w, h ); glVertex2i( 0, h ); - - glVertex2i( 1, top+1 ); glVertex2i( w-1, top+1 ); - glVertex2i( w-1, h-1 ); glVertex2i( 1, h-1 ); - glEnd(); - - glColor3f( .5, .5, .5 ); - glBegin( GL_LINE_LOOP ); - glVertex2i( 0, top ); - glVertex2i( w-1, top ); - glVertex2i( w-1, h-1 ); - glVertex2i( 0, h-1 ); - glEnd(); - - /**** Only display text in embossed panel ****/ - if ( parent_node != NULL && name != "" ) { /* Only draw non-null strings */ - int left = 7, height=GLUI_PANEL_NAME_DROP+1; - int str_width; - - str_width = string_width(name); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left-3, 0 ); glVertex2i( left+str_width+3, 0 ); - glVertex2i( left+str_width+3, height ); glVertex2i( left-3, height ); - glEnd(); - - draw_name( left, GLUI_PANEL_NAME_DROP ); - } - } - - glLineWidth( 1.0 ); -} - -/****************************** GLUI_Panel::set_name() **********/ - -void GLUI_Panel::set_name( const char *new_name ) -{ - name = new_name ? new_name : ""; - - update_size(); - - if ( glui ) - glui->refresh(); -} - - -/****************************** GLUI_Panel::set_type() **********/ - -void GLUI_Panel::set_type( int new_type ) -{ - if ( new_type != int_val ) { - int_val = new_type; - update_size(); - redraw(); - } -} - - -/************************************** GLUI_Panel::update_size() **********/ - -void GLUI_Panel::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if ( w < text_size + 16 ) - w = text_size + 16 ; - - if ( name != "" AND int_val == GLUI_PANEL_EMBOSSED ) { - this->y_off_top = GLUI_YOFF + 8; - } - else { - this->y_off_top = GLUI_YOFF; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_radio.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_radio.cpp deleted file mode 100644 index eeef24410..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_radio.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_radio.cpp - GLUI_RadioGroup and GLUI_RadioButton control classes - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - -/****************************** GLUI_RadioGroup::GLUI_RadioGroup() **********/ - -GLUI_RadioGroup::GLUI_RadioGroup(GLUI_Node *parent, - int *value_ptr, - int id, GLUI_CB cb) -{ - common_init(); - GLUI_String buf; - - set_ptr_val( value_ptr ); - if ( value_ptr ) { - int_val = *value_ptr; /** Can't call set_int_val(), b/c that - function will try to call the - callback, etc */ - /** Actually, maybe not **/ - last_live_int = *value_ptr; - } - - user_id = id; - glui_format_str( buf, "RadioGroup: %p", this ); - set_name( buf.c_str() ); - callback = cb; - - parent->add_control( this ); - - init_live(); -} - - -/****************************** GLUI_RadioGroup::draw() **********/ - -void GLUI_RadioGroup::draw( int x, int y ) -{ - if ( NOT can_draw() ) - return; - - draw_group(false); -} - - -/********************* GLUI_RadioGroup::draw_group(int translate) **********/ - -void GLUI_RadioGroup::draw_group( int translate ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - GLUI_RadioButton *button; - this->int_val = int_val; - - glMatrixMode(GL_MODELVIEW ); - - button = (GLUI_RadioButton*) first_child(); - while( button != NULL ) { - glPushMatrix(); - if (translate) { - button->translate_to_origin(); - } - else { - glTranslatef(button->x_abs-x_abs, - button->y_abs-y_abs,0.0); - } - - if ( button->int_val ) - button->draw_checked(); - else - button->draw_unchecked(); - - glPopMatrix(); - - button = (GLUI_RadioButton*) button->next(); - } -} - - -/****************************** GLUI_RadioGroup::set_name() **********/ - -void GLUI_RadioGroup::set_name( const char *text ) -{ - name = text; - - if ( glui ) - glui->refresh(); -} - - -/********************************* GLUI_RadioGroup::set_selected() **********/ - -void GLUI_RadioGroup::set_selected( int int_val ) -{ - GLUI_RadioButton *button; - - this->int_val = int_val; - - button = (GLUI_RadioButton*) first_child(); - while( button != NULL ) { - if ( int_val == -1 ) { /*** All buttons in group are deselected ***/ - button->set_int_val(0); - } - else if ( int_val == button->user_id ) { /*** This is selected button ***/ - button->set_int_val(1); - } - else { /*** This is NOT selected button ***/ - button->set_int_val(0); - - } - button = (GLUI_RadioButton*) button->next(); - } - redraw(); -} - - -/************************ GLUI_RadioButton::GLUI_RadioButton() **********/ - -GLUI_RadioButton::GLUI_RadioButton( GLUI_RadioGroup *grp, const char *name ) -{ - common_init(); - - set_int_val( 0 ); - - /** A radio button's user id is always its ordinal number (zero-indexed) - within the group */ - user_id = grp->num_buttons; - set_name( name ); - group = grp; - - group->num_buttons++; /* Increments radiogroup's button count */ - group->add_control( this ); - - /*** Now update button states ***/ - group->set_int_val( group->int_val ); /* This tells the group to - reset itself to its - current value, thereby - updating all its buttons */ -} - - -/************************ GLUI_RadioButton::mouse_down_handler() **********/ - -int GLUI_RadioButton::mouse_down_handler( int local_x, int local_y ) -{ - if ( NOT group ) - return false; - - orig_value = group->int_val; - - currently_inside = true; - - group->set_selected( this->user_id ); - redraw(); - - return false; -} - -/********************** GLUI_RadioButton::mouse_held_down_handler() ******/ - -int GLUI_RadioButton::mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - if (inside != currently_inside) { - if (inside) group->set_selected( this->user_id ); - else group->set_selected( orig_value ); - currently_inside = inside; - redraw(); - } - - return false; -} - - -/*************************** GLUI_RadioButton::mouse_up_handler() **********/ - -int GLUI_RadioButton::mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - if ( NOT group ) - return false; - - if ( NOT inside ) { - group->set_selected( orig_value ); - redraw(); - } - else { - /** Now we update the radio button group. We tell the group - handler to set the currently-selected item to this button, which - is reference by its user_id/ordinal number within group **/ - - group->set_selected( this->user_id ); - redraw(); - - /*** Now update the linked variable, and call the callback, - but ONLY if the value of the radio group actually changed ***/ - if ( group->int_val != orig_value ) { - group->output_live(true); /** Output live and update gfx ***/ - - group->execute_callback(); - } - } - - return false; -} - -/****************************** GLUI_RadioButton::draw() **********/ - -void GLUI_RadioButton::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( NOT group OR NOT can_draw() ) - return; - - /*** See if we're the currently-selected button. If so, draw ***/ - if ( group->int_val == this->user_id ) { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); - } - else { - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); - } - - draw_active_area(); - - draw_name( text_x_offset, 10 ); -} - - -/************************************ GLUI_RadioButton::draw_checked() ******/ - -void GLUI_RadioButton::draw_checked( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_ON_DIS, 0, 0 ); - draw_active_area(); -} - - -/*********************************** GLUI_RadioButton::draw_unchecked() ******/ - -void GLUI_RadioButton::draw_unchecked( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( enabled ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF, 0, 0 ); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_RADIOBUTTON_OFF_DIS, 0, 0 ); - draw_active_area(); -} - - -/**************************************** GLUI_RadioButton::draw_O() ********/ - -void GLUI_RadioButton::draw_O( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int i, j; - - glBegin( GL_POINTS ); - for(i=3; i<=GLUI_RADIOBUTTON_SIZE-3; i++ ) - for(j=3; j<=GLUI_RADIOBUTTON_SIZE-3; j++ ) - glVertex2i(i,j); - glEnd(); -} - - -/******************************** GLUI_RadioButton::update_size() **********/ - -void GLUI_RadioButton::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = _glutBitmapWidthString( glui->font, name.c_str() ); - - /* if ( w < text_x_offset + text_size + 6 ) */ - w = text_x_offset + text_size + 6 ; -} - - -/************************* GLUI_RadioButton::draw_active_area() **************/ - -void GLUI_RadioButton::draw_active_area( void ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_width, left, right; - - text_width = _glutBitmapWidthString( glui->font, name.c_str() ); - left = text_x_offset-3; - right = left + 7 + text_width; - - if ( active ) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - } else { - glColor3ub( glui->bkgd_color.r, glui->bkgd_color.g, glui->bkgd_color.b ); - } - - glBegin( GL_LINE_LOOP ); - glVertex2i(left,0); glVertex2i( right,0); - glVertex2i(right,h+1); glVertex2i( left,h+1); - glEnd(); - - glDisable( GL_LINE_STIPPLE ); -} - - -/********************************* GLUI_RadioGroup::set_int_val() **********/ - -void GLUI_RadioGroup::set_int_val( int new_val ) -{ - if ( new_val == int_val ) - return; - - set_selected( new_val ); - redraw(); - - output_live(true); - -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rollout.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rollout.cpp deleted file mode 100644 index 9b39480b7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rollout.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -enum {rollout_height_pixels=GLUI_DEFAULT_CONTROL_HEIGHT + 7}; - -/****************************** GLUI_Rollout::GLUI_Rollout() **********/ - -GLUI_Rollout::GLUI_Rollout( GLUI_Node *parent, const char *name, - int open, int type ) -{ - common_init(); - set_name( name ); - user_id = -1; - int_val = type; - - if ( NOT open ) { - is_open = false; - h = rollout_height_pixels; - } - - parent->add_control( this ); -} - -/****************************** GLUI_Rollout::open() **********/ - -void GLUI_Rollout::open( void ) -{ - if ( NOT glui ) - return; - - if ( is_open ) - return; - is_open = true; - - GLUI_DRAWINGSENTINAL_IDIOM - - /* Copy hidden children into our private list "collapsed_node" */ - child_head = collapsed_node.child_head; - child_tail = collapsed_node.child_tail; - collapsed_node.child_head = NULL; - collapsed_node.child_tail = NULL; - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->unhide_internal( true ); - } - - glui->refresh(); -} - - -/****************************** GLUI_Rollout::close() **********/ - -void GLUI_Rollout::close( void ) -{ - if ( NOT glui ) - return; - - if ( NOT is_open ) - return; - is_open = false; - - GLUI_DRAWINGSENTINAL_IDIOM - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->hide_internal( true ); - } - - /* Move all children into a private list of hidden children */ - collapsed_node.child_head = first_child(); - collapsed_node.child_tail = last_child(); - child_head = NULL; - child_tail = NULL; - - this->h = rollout_height_pixels; - - glui->refresh(); -} - - -/**************************** GLUI_Rollout::mouse_down_handler() **********/ - - -int GLUI_Rollout::mouse_down_handler( int local_x, int local_y ) -{ - if ( local_y - y_abs > rollout_height_pixels ) { - initially_inside = currently_inside = false; - return false; - } - - currently_inside = true; - initially_inside = true; - redraw(); - - return false; -} - - -/**************************** GLUI_Rollout::mouse_held_down_handler() ****/ - -int GLUI_Rollout::mouse_held_down_handler( - int local_x, int local_y, - bool new_inside ) -{ - if ( NOT initially_inside ) - return false; - - if ( local_y - y_abs> rollout_height_pixels ) - new_inside = false; - - if (new_inside != currently_inside) { - currently_inside = new_inside; - redraw(); - } - - return false; -} - - -/**************************** GLUI_Rollout::mouse_down_handler() **********/ - -int GLUI_Rollout::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( currently_inside ) { - if ( is_open ) - close(); - else - open(); - } - - currently_inside = false; - initially_inside = false; - redraw(); - - return false; -} - - -/********************************* GLUI_Rollout::draw() ***********/ - -void GLUI_Rollout::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - if ( is_open ) - draw_emboss_box( 0, w, top+3, h ); - else - draw_emboss_box( 0, w, top+3, h-7 ); - - glui->draw_raised_box( left, top, w-left*2, 16 ); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1, bottom-1 ); - glEnd(); - - draw_name( left+8, top+11 ); - - if ( active ) - /*draw_active_box( left+4, left+string_width( name.c_str() )+12, */ - draw_active_box( left+4, right-17, - top+2, bottom-2 ); - - - /** Draw '+' or '-' **/ - - glBegin( GL_LINES ); - if ( is_open ) { - if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); - else glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(right-14,1+(top+bottom)/2);glVertex2i(right-5,1+(top+bottom)/2); - } - else - { - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(right-9,top+3); glVertex2i(right-9,bottom-4); - glVertex2i(right-14,(top+bottom)/2); glVertex2i(right-5,(top+bottom)/2); - - if ( enabled ) glColor3f( 0.0, 0.0, 0.0 ); - else glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(right-14,-1+(top+bottom)/2); - glVertex2i(right-5,-1+(top+bottom)/2); - glVertex2i(right-10,top+3); - glVertex2i(right-10,bottom-4); - } - glEnd(); - - glLineWidth( 1.0 ); - - if (currently_inside) {draw_pressed(); /* heavy black outline when pressed */ } -} - - -/***************************** GLUI_Rollout::update_size() **********/ - -void GLUI_Rollout::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if ( w < text_size + 36 ) - w = text_size + 36; -} - - -/**************************** GLUI_Rollout::draw_pressed() ***********/ - -void GLUI_Rollout::draw_pressed( void ) -{ - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - - glColor3f( 0.0, 0.0, 0.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left, top ); glVertex2i( right, top ); - glVertex2i( right, bottom ); glVertex2i( left,bottom ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); - glEnd(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rotation.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rotation.cpp deleted file mode 100644 index c69e28ccf..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_rotation.cpp +++ /dev/null @@ -1,480 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_rotation - GLUI_Rotation control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "arcball.h" -#include "algebra3.h" - -/*************************** GLUI_Rotation::iaction_mouse_down_handler() ***/ - -int GLUI_Rotation::iaction_mouse_down_handler( int local_x, int local_y ) -{ - copy_float_array_to_ball(); - - init_ball(); - - local_y = (int) floor(2.0 * ball->center[1] - local_y); - - ball->mouse_down( local_x, local_y ); - - /* printf( "%d %d - %f %f\n", local_x, local_y, ball->center[0], ball->center[1] ); */ - - copy_ball_to_float_array(); - - spinning = false; - - return false; -} - - -/*********************** GLUI_Rotation::iaction_mouse_up_handler() **********/ - -int GLUI_Rotation::iaction_mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - copy_float_array_to_ball(); - - ball->mouse_up(); - - return false; -} - - -/******************* GLUI_Rotation::iaction_mouse_held_down_handler() ******/ - -int GLUI_Rotation::iaction_mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - if ( NOT glui ) - return 0; - - copy_float_array_to_ball(); - - local_y = (int) floor(2.0 * ball->center[1] - local_y); - - /* printf( "%d %d\n", local_x, local_y ); */ - - ball->mouse_motion( local_x, local_y, 0, - (glui->curr_modifiers & GLUT_ACTIVE_ALT) != 0, - (glui->curr_modifiers & GLUT_ACTIVE_CTRL) != 0 ); - - copy_ball_to_float_array(); - - if ( can_spin ) - spinning = true; - - return false; -} - - -/******************** GLUI_Rotation::iaction_draw_active_area_persp() **************/ - -void GLUI_Rotation::iaction_draw_active_area_persp( void ) -{ - /********** arcball *******/ - copy_float_array_to_ball(); - - setup_texture(); - setup_lights(); - - glEnable(GL_CULL_FACE ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - - mat4 tmp_rot = *ball->rot_ptr; - glMultMatrixf( (float*) &tmp_rot[0][0] ); - - /*** Draw the checkered box ***/ - /*glDisable( GL_TEXTURE_2D ); */ - draw_ball(1.35); // 1.96 ); - - glPopMatrix(); - - glBindTexture(GL_TEXTURE_2D,0); /* unhook our checkerboard texture */ - glDisable( GL_TEXTURE_2D ); - glDisable( GL_LIGHTING ); - glDisable( GL_CULL_FACE ); -} - - -/******************** GLUI_Rotation::iaction_draw_active_area_ortho() **********/ - -void GLUI_Rotation::iaction_draw_active_area_ortho( void ) -{ - float radius; - radius = (float)(h-22)/2.0; /*MIN((float)w/2.0, (float)h/2.0); */ - - /********* Draw emboss circles around arcball control *********/ - int k; - glLineWidth( 1.0 ); - glBegin( GL_LINE_LOOP); - for( k=0; k<60; k++ ) { - float phi = 2*M_PI*(float)k/60.0; - vec2 p( cos(phi) * (2.0 + radius), sin(phi) * (2.0 + radius)); - if ( p[1] < -p[0] ) glColor3ub( 128,128,128 ); - else glColor3ub( 255,255,255 ); - glVertex2fv((float*)&p[0]); - } - glEnd(); - - glBegin( GL_LINE_LOOP); - for( k=0; k<60; k++ ) { - float phi = 2*M_PI*(float)k/60.0; - vec2 p( cos(phi) * (1.0 + radius), sin(phi) * (1.0 + radius)); - if ( enabled ) { - if ( p[1] < -p[0] ) glColor3ub( 0,0,0); - else glColor3ub( 192,192,192); - } - else - { - if ( p[1] < -p[0] ) glColor3ub( 180,180,180); - else glColor3ub( 192,192,192); - } - glVertex2fv((float*)&p[0]); - } - glEnd(); -} - - -/******************************** GLUI_Rotation::iaction_dump() **********/ - -void GLUI_Rotation::iaction_dump( FILE *output ) -{ -} - - -/******************** GLUI_Rotation::iaction_special_handler() **********/ - -int GLUI_Rotation::iaction_special_handler( int key,int modifiers ) -{ - - return false; -} - -/********************************** GLUI_Rotation::init_ball() **********/ - -void GLUI_Rotation::init_ball( void ) -{ - /*printf( "%f %f %f", float( MIN(w/2,h/2)), (float) w/2, (float) h/2 ); */ - - ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), - (float) 2.0*(h-18) ); - /*ball->set_damping( .05 ); */ - /*float( MIN(w/2,h/2))*2.0 ); */ - /* ball->reset_mouse(); */ -} - - -/****************************** GLUI_Rotation::setup_texture() *********/ - -void GLUI_Rotation::setup_texture( void ) -{ - static GLuint tex=0u; - GLenum t=GL_TEXTURE_2D; - glEnable(t); - glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glColor3f( 1.0, 1.0, 1.0 ); - if (tex!=0u) { - /* (OSL 2006/06) Just use glBindTexture to avoid having to re-upload the whole checkerboard every frame. */ - glBindTexture(t,tex); - return; - } /* Else need to make a new checkerboard texture */ - glGenTextures(1,&tex); - glBindTexture(t,tex); - glEnable(t); - - unsigned int i, j; - int dark, light; /*** Dark and light colors for ball checkerboard ***/ - -/* Note: you can change the number of checkers across there sphere in draw_ball */ -#define CHECKBOARD_SIZE 64 /* pixels across whole texture */ -#define CHECKBOARD_REPEAT 32u /* pixels across one black/white sector */ - unsigned char texture_image[CHECKBOARD_SIZE] [CHECKBOARD_SIZE] [3]; - unsigned char c; - for( i=0; iinit(); /** reset quaternion, etc. **/ - ball->set_params( vec2( (float)(w/2), (float)((h-18)/2)), - (float) 2.0*(h-18) ); - - set_spin( this->damping ); - - copy_ball_to_float_array(); - - translate_and_draw_front(); - - output_live(true); /*** Output live and draw main grx window ***/ -} - - -/****************************** GLUI_Rotation::needs_idle() *********/ - -bool GLUI_Rotation::needs_idle( void ) const -{ - return can_spin; -} - - -/****************************** GLUI_Rotation::idle() ***************/ - -void GLUI_Rotation::idle( void ) -{ - spinning = ball->is_spinning?true:false; - - if ( can_spin AND spinning ) { - copy_float_array_to_ball(); - ball->idle(); - - *ball->rot_ptr = *ball->rot_ptr * ball->rot_increment; - - mat4 tmp_rot; - tmp_rot = *ball->rot_ptr; - - copy_ball_to_float_array(); - - draw_active_area_only = true; - translate_and_draw_front(); - draw_active_area_only = false; - - output_live(true); /** output live and update gfx **/ - } - else { - } -} - - -/********************** GLUI_Rotation::copy_float_array_to_ball() *********/ - -void GLUI_Rotation::copy_float_array_to_ball( void ) -{ - int i; - float *fp_src, *fp_dst; - - fp_src = &float_array_val[0]; - fp_dst = &((*ball->rot_ptr)[0][0]); - - for( i=0; i<16; i++ ) { - *fp_dst = *fp_src; - - fp_src++; - fp_dst++; - } -} - - -/********************** GLUI_Rotation::copy_ball_to_float_array() *********/ - -void GLUI_Rotation::copy_ball_to_float_array( void ) -{ - mat4 tmp_rot; - tmp_rot = *ball->rot_ptr; - - set_float_array_val( (float*) &tmp_rot[0][0] ); -} - - -/************************ GLUI_Rotation::set_spin() **********************/ - -void GLUI_Rotation::set_spin( float damp_factor ) -{ - if ( damp_factor == 0.0 ) - can_spin = false; - else - can_spin = true; - - ball->set_damping( 1.0 - damp_factor ); - - this->damping = damp_factor; -} - - -/************** GLUI_Rotation::GLUI_Rotation() ********************/ - -GLUI_Rotation::GLUI_Rotation( GLUI_Node *parent, - const char *name, float *value_ptr, - int id, - GLUI_CB cb ) -{ - common_init(); - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - parent->add_control( this ); - init_live(); - - /*** Init the live 4x4 matrix. This is different than the standard - live variable behavior, since the original value of the 4x4 matrix - is ignored and reset to Identity ***/ -/* -NO! WVB - if ( value_ptr != NULL ) { - int i, j, index; - for( i=0; i<4; i++ ) { - for( j=0; j<4; j++ ) { - index = i*4+j; - if ( i==j ) - value_ptr[index] = 1.0; - else - value_ptr[index] = 0.0; - } - } - } -*/ - /*init_ball(); */ - - -} - - -/************** GLUI_Rotation::common_init() ********************/ - -void GLUI_Rotation::common_init( void ) -{ - glui_format_str( name, "Rotation: %p", this ); -// type = GLUI_CONTROL_ROTATION; - w = GLUI_ROTATION_WIDTH; - h = GLUI_ROTATION_HEIGHT; - can_activate = true; - live_type = GLUI_LIVE_FLOAT_ARRAY; - float_array_size = 16; - quadObj = NULL; - alignment = GLUI_ALIGN_CENTER; - can_spin = false; - spinning = false; - damping = 0.0; - ball = new Arcball; - - reset(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_scrollbar.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_scrollbar.cpp deleted file mode 100644 index d78f99273..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_scrollbar.cpp +++ /dev/null @@ -1,839 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_scrollbar.cpp - GLUI_Scrollbar class - - -------------------------------------------------- - - Copyright (c) 2004 John Kew, 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include -#include - -/*static int __debug=0; */ - -#define GLUI_SCROLL_GROWTH_STEPS 800 -#define GLUI_SCROLL_MIN_GROWTH_STEPS 100 -#define GLUI_SCROLL_CALLBACK_INTERVAL 1 /* Execute the user's callback every this many clicks */ - -enum { - GLUI_SCROLL_ARROW_UP, - GLUI_SCROLL_ARROW_DOWN, - GLUI_SCROLL_ARROW_LEFT, - GLUI_SCROLL_ARROW_RIGHT -}; - - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, no live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, data_type, NULL, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, int live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, - int horz_vert, - int *live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, GLUI_SCROLL_INT, live_var, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::GLUI_Scrollbar() **********/ -// Constructor, float live var -GLUI_Scrollbar::GLUI_Scrollbar( GLUI_Node *parent, const char *name, - int horz_vert, - float *live_var, - int id, GLUI_CB callback - /*,GLUI_Control *object - ,GLUI_InterObject_CB obj_cb*/ - ) -{ - common_construct(parent, name, horz_vert, GLUI_SCROLL_FLOAT, live_var, id, callback/*, object, obj_cb*/); -} - -/****************************** GLUI_Scrollbar::common_init() **********/ -void GLUI_Scrollbar::common_init(void) -{ - horizontal = true; - h = GLUI_SCROLL_ARROW_HEIGHT; - w = GLUI_TEXTBOX_WIDTH; - alignment = GLUI_ALIGN_CENTER; - x_off = 0; - y_off_top = 0; - y_off_bot = 0; - can_activate = true; - state = GLUI_SCROLL_STATE_NONE; - growth_exp = GLUI_SCROLL_DEFAULT_GROWTH_EXP; - callback_count = 0; - first_callback = true; - user_speed = 1.0; - float_min = 0.0; - float_max = 0.0; - int_min = 0; - int_max = 0; - associated_object = NULL; - last_update_time=0; - velocity_limit=50.0; /* Change value by at most 50 per second */ - box_length = 0; - box_start_position = 0; - box_end_position = 0; - track_length = 0; -} - -/****************************** GLUI_Scrollbar::common_construct() **********/ -void GLUI_Scrollbar::common_construct( - GLUI_Node *parent, - const char *name, - int horz_vert, - int data_type, - void *data, - int id, GLUI_CB callback - /*,GLUI_Control *object, - GLUI_InterObject_CB obj_cb*/ - ) -{ - common_init(); - - // make sure limits are wide enough to hold live value - if (data_type==GLUI_SCROLL_FLOAT) { - float lo = 0.0f, hi=1.0f; - if (data) { - float d = *(float*)(data); - lo = MIN(lo, d); - hi = MAX(hi, d); - } - this->set_float_limits(lo,hi); - this->set_float_val(lo); - this->live_type = GLUI_LIVE_FLOAT; - } else { - int lo = 0, hi=100; - if (data) { - int d = *(int*)(data); - lo = MIN(lo, d); - hi = MAX(hi, d); - } - this->set_int_limits(lo,hi); - this->set_int_val(0); - this->live_type = GLUI_LIVE_INT; - } - this->data_type = data_type; - this->set_ptr_val( data ); - this->set_name(name); - this->user_id = id; - this->callback = callback; - //this->associated_object = object; - //this->object_cb = obj_cb; - this->horizontal=(horz_vert==GLUI_SCROLL_HORIZONTAL); - if (this->horizontal) { - this->h = GLUI_SCROLL_ARROW_HEIGHT; - this->w = GLUI_TEXTBOX_WIDTH; - } else { - this->h = GLUI_TEXTBOX_HEIGHT; - this->w = GLUI_SCROLL_ARROW_WIDTH; - } - parent->add_control( this ); - this->init_live(); -} - -/****************************** GLUI_Scrollbar::mouse_down_handler() **********/ - -int GLUI_Scrollbar::mouse_down_handler( int local_x, int local_y ) -{ - last_update_time=GLUI_Time()-1.0; - this->state = find_arrow( local_x, local_y ); - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, - find_arrow( local_x, local_y )); - */ - - if ( state != GLUI_SCROLL_STATE_UP AND state != GLUI_SCROLL_STATE_DOWN) - return true; - - reset_growth(); - - /*** ints and floats behave a bit differently. When you click on - an int spinner, you expect the value to immediately go up by 1, whereas - for a float it'll go up only by a fractional amount. Therefore, we - go ahead and increment by one for int spinners ***/ -#if 1 - if ( data_type == GLUI_SCROLL_INT ) { - // Allow for possibility of reversed limits - int lo = MIN(int_min,int_max); - int hi = MAX(int_min,int_max); - int increase = int_min < int_max ? 1 : -1; - int new_val = int_val; - if ( state == GLUI_SCROLL_STATE_UP ) { - new_val += increase; - } else if ( state == GLUI_SCROLL_STATE_DOWN ) { - new_val -= increase; - } - if (new_val >= lo && new_val <= hi && new_val!=int_val) { - set_int_val(new_val); - do_callbacks(); - } - } -#endif - do_click(); - redraw(); - - return false; -} - - -/******************************** GLUI_Scrollbar::mouse_up_handler() **********/ - -int GLUI_Scrollbar::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - state = GLUI_SCROLL_STATE_NONE; - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ - - /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - - redraw(); - - /* do_callbacks(); --- stub */ - /* if ( callback ) */ - /* callback( this->user_id ); */ - - return false; -} - - -/***************************** GLUI_Scrollbar::mouse_held_down_handler() ******/ - -int GLUI_Scrollbar::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int new_state; - if ( state == GLUI_SCROLL_STATE_NONE ) - return false; - - /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, - new_inside); - */ - - if ( state == GLUI_SCROLL_STATE_SCROLL) { /* dragging? */ - do_drag( local_x-x_abs, local_y-y_abs ); - } - else { /* not dragging */ - new_state = find_arrow( local_x, local_y ); - - if ( new_state == state ) { - /** Still in same arrow **/ - do_click(); - } - } - redraw(); - - return false; -} - - -/****************************** GLUI_Scrollbar::key_handler() **********/ - -int GLUI_Scrollbar::key_handler( unsigned char key,int modifiers ) -{ - return true; -} - - -/****************************** GLUI_Scrollbar::draw() **********/ - -void GLUI_Scrollbar::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( horizontal ) { - draw_scroll_arrow(GLUI_SCROLL_ARROW_LEFT, 0, 0); - draw_scroll_arrow(GLUI_SCROLL_ARROW_RIGHT, w-GLUI_SCROLL_ARROW_WIDTH, 0); - } else { - draw_scroll_arrow(GLUI_SCROLL_ARROW_UP, 0, 0); - draw_scroll_arrow(GLUI_SCROLL_ARROW_DOWN, 0, h-GLUI_SCROLL_ARROW_HEIGHT); - } - draw_scroll(); -} - - -/****************************** GLUI_Scrollbar::draw_scroll_arrow() **********/ - -void GLUI_Scrollbar::draw_scroll_arrow(int arrowtype, int x, int y) -{ - float offset=0; - float L=3.5f,HC=7.f,R=10.5f; - float T=4.5f,VC=8.f,B=11.5; - const float verts[][6]={ - { L,10.5f, R, 10.5f, HC, 6.5f }, // up arrow - { L,6.5f, R, 6.5f, HC,10.5f }, // down arrow - { R-2,T, R-2, B, L+1, VC }, // left arrow - { L+2,T, L+2, B, R-1, VC } // right arrow - }; - - const float *tri = NULL; - - switch (arrowtype) - { - case GLUI_SCROLL_ARROW_UP: - tri = verts[0]; - if (state & GLUI_SCROLL_STATE_UP) offset = 1; - break; - - case GLUI_SCROLL_ARROW_DOWN: - tri = verts[1]; - if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; - break; - - case GLUI_SCROLL_ARROW_LEFT: - tri = verts[2]; - if (state & GLUI_SCROLL_STATE_DOWN) offset = 1; - break; - - case GLUI_SCROLL_ARROW_RIGHT: - tri = verts[3]; - if (state & GLUI_SCROLL_STATE_UP) offset = 1; - break; - - default: - return; /* tri is NULL */ - } - - glColor3ubv(&glui->bkgd_color.r); - glRecti(x,y,x+GLUI_SCROLL_ARROW_WIDTH,y+GLUI_SCROLL_ARROW_HEIGHT); - if (!offset) { - glui->draw_raised_box(x,y+1,GLUI_SCROLL_ARROW_WIDTH-1,GLUI_SCROLL_ARROW_HEIGHT-1); - } else { - glColor3ub(128,128,128); - glBegin(GL_LINE_LOOP); - int x2=x+GLUI_SCROLL_ARROW_WIDTH, y2=y+GLUI_SCROLL_ARROW_HEIGHT; - glVertex2i(x ,y); - glVertex2i(x2,y); - glVertex2i(x2,y2); - glVertex2i(x ,y2); - glEnd(); - } - - GLubyte black[]={0,0,0}; - GLubyte white[]={255,255,255}; - GLubyte gray[]={128,128,128}; - GLubyte *color=black; - if (!enabled) { - offset = 1; - color = white; - } - glTranslatef(x+offset,y+offset,0); - glColor3ubv(color); - glBegin(GL_TRIANGLES); - glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); - glEnd(); - glTranslatef(-(x+offset),-(y+offset),0); - - if (!enabled) { // once more! - glTranslatef(x,y,0); - glColor3ubv(gray); - glBegin(GL_TRIANGLES); - glVertex2fv(tri); glVertex2fv(tri+2), glVertex2fv(tri+4); - glEnd(); - glTranslatef(-x,-y,0); - } -} - - -void GLUI_Scrollbar::draw_scroll() { - update_scroll_parameters(); - - // Draw track using a checkerboard background - const unsigned char scroll_bg[] = { - 0xD4, 0xD0, 0xC8, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xD4, 0xD0, 0xC8 - }; - glColor3f( 1.0, 1.0, 1.0 ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - glEnable( GL_TEXTURE_2D); - glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, - scroll_bg); - - float y0 = horizontal? 0 : GLUI_SCROLL_ARROW_HEIGHT; - float y1 = horizontal? h : h-GLUI_SCROLL_ARROW_HEIGHT; - float x0 = horizontal? GLUI_SCROLL_ARROW_WIDTH : 0; - float x1 = horizontal? w-GLUI_SCROLL_ARROW_WIDTH : w; - x0-=0.5; y0+=0.5; - x1-=0.5; y1+=0.5; - float dy = y1-y0; - float dx = x1-x0; - glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex2f(x0,y0); - glTexCoord2f(dx*0.5f,0); glVertex2f(x1,y0); - glTexCoord2f(dx*0.5f,dy*0.5f); glVertex2f(x1,y1); - glTexCoord2f(0, dy*0.5f); glVertex2f(x0,y1); - glEnd(); - glDisable(GL_TEXTURE_2D); - - // Draw scroll box - int box = box_start_position; - if (horizontal) { - box += GLUI_SCROLL_ARROW_WIDTH; - draw_scroll_box(box,1,box_length,h); - } else { - box += GLUI_SCROLL_ARROW_HEIGHT+1; - draw_scroll_box(0,box,w,box_length); - } -} - -/****************************** GLUI_Scrollbar::draw_scroll_box() **********/ - -void GLUI_Scrollbar::draw_scroll_box(int x, int y, int w, int h) -{ - if (!enabled) return; - glColor3ubv(&glui->bkgd_color.r); - glRecti(x,y,x+w,y+h); - glui->draw_raised_box(x,y, w-1, h-1); - - if (active) { - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - glColor3f( 0., 0., 0. ); - glBegin(GL_LINE_LOOP); - int x1 = x+2, y1 = y+2, x2 = x+w-4, y2 = y+h-4; - glVertex2i(x1,y1); - glVertex2i(x2,y1); - glVertex2i(x2,y2); - glVertex2i(x1,y2); - glEnd(); - glDisable( GL_LINE_STIPPLE ); - } -} - - - -/**************************** update_scroll_parameters ***********/ - -void GLUI_Scrollbar::update_scroll_parameters() { - track_length = horizontal? - this->w-GLUI_SCROLL_ARROW_WIDTH*2 : - this->h-GLUI_SCROLL_ARROW_HEIGHT*2; - if (data_type==GLUI_SCROLL_INT) - { - if (int_max==int_min) - box_length=track_length; - else { - const int MIN_TAB = GLUI_SCROLL_BOX_STD_HEIGHT; - //box_length = int(track_length/float(visible_range)); - //if (box_length < MIN_TAB) - box_length = MIN_TAB; - } - float pixels_per_unit = (track_length-box_length)/float(int_max-int_min); - if (horizontal) - box_start_position = int((int_val-int_min)*pixels_per_unit); - else - box_start_position = int((int_max-int_val)*pixels_per_unit); - box_end_position = box_start_position+box_length; - } - else if (data_type==GLUI_SCROLL_FLOAT) - { - if (float_max==float_min) - box_length=track_length; - else { - box_length = GLUI_SCROLL_BOX_STD_HEIGHT; - } - float pixels_per_unit = (track_length-box_length)/float(float_max-float_min); - if (horizontal) - box_start_position = int((float_val-float_min)*pixels_per_unit); - else - box_start_position = int((float_max-float_val)*pixels_per_unit); - box_end_position = box_start_position+box_length; - } -} - - -/********************************* GLUI_Scrollbar::special_handler() **********/ - -int GLUI_Scrollbar::special_handler( int key,int modifiers ) -{ - if ( !horizontal && key == GLUT_KEY_UP ) { - mouse_down_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs + 1 ); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs + 1, true ); - } - else if ( !horizontal && key == GLUT_KEY_DOWN ) { - mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1+GLUI_SCROLL_ARROW_HEIGHT); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1 +GLUI_SCROLL_ARROW_HEIGHT, - true ); - } - if ( horizontal && key == GLUT_KEY_LEFT ) { - mouse_down_handler( x_abs + 1,y_abs + 1 ); - mouse_up_handler( x_abs + 1, y_abs + 1, true ); - } - else if ( horizontal && key == GLUT_KEY_RIGHT ) { - mouse_down_handler(x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1); - mouse_up_handler( x_abs + w - GLUI_SCROLL_ARROW_WIDTH + 1, - y_abs+1, - true ); - } - else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - - or increment by 10 **/ - } - else if ( key == GLUT_KEY_END ) { - } - - return true; -} - - -/************************************ GLUI_Scrollbar::update_size() **********/ - -void GLUI_Scrollbar::update_size( void ) -{ - if (horizontal) { - h = GLUI_SCROLL_ARROW_HEIGHT; - if (associated_object) { - this->w = ((GLUI_Control *)associated_object)->w; - } - } - else { - w = GLUI_SCROLL_ARROW_WIDTH; - if (associated_object) { - this->h = ((GLUI_Control *)associated_object)->h; - } - } -} - - -/************************************ GLUI_Scrollbar::find_arrow() ************/ - -int GLUI_Scrollbar::find_arrow( int local_x, int local_y ) -{ - - local_x = local_x-x_abs; - local_y = local_y-y_abs; - - if (horizontal) - { - if ( local_y >= h-GLUI_SCROLL_ARROW_HEIGHT-3 && local_y <= h) - { - update_scroll_parameters(); - if ( local_x >= 0 AND local_x <= (GLUI_SCROLL_ARROW_WIDTH+box_start_position) ) - { - return GLUI_SCROLL_STATE_DOWN; - } - if ( local_x >= (GLUI_SCROLL_ARROW_WIDTH+box_end_position) - AND local_x <= (w+GLUI_SCROLL_ARROW_WIDTH) ) - { - return GLUI_SCROLL_STATE_UP; - } - return GLUI_SCROLL_STATE_SCROLL; - } - } - else - { - if ( local_x >= w-GLUI_SCROLL_ARROW_WIDTH-3 && local_x <= w) - { - update_scroll_parameters(); - if ( local_y >= 0 AND local_y <= (GLUI_SCROLL_ARROW_HEIGHT+box_start_position) ) - { - return GLUI_SCROLL_STATE_UP; - } - if ( local_y >= (GLUI_SCROLL_ARROW_HEIGHT+box_end_position) - AND local_y <= (h+GLUI_SCROLL_ARROW_HEIGHT) ) - { - return GLUI_SCROLL_STATE_DOWN; - } - return GLUI_SCROLL_STATE_SCROLL; - } - } - - return GLUI_SCROLL_STATE_NONE; -} - -/***************************************** GLUI_Scrollbar::do_click() **********/ - -void GLUI_Scrollbar::do_click( void ) -{ - int direction = 0; - - if ( state == GLUI_SCROLL_STATE_UP ) - direction = +1; - else if ( state == GLUI_SCROLL_STATE_DOWN ) - direction = -1; - - if (data_type==GLUI_SCROLL_INT&&int_min>int_max) direction*=-1; - if (data_type==GLUI_SCROLL_FLOAT&&float_min>float_max) direction*=-1; - - increase_growth(); - - float modifier_factor = 1.0; - float incr = growth * modifier_factor * user_speed ; - - double frame_time=GLUI_Time()-last_update_time; - double frame_limit=velocity_limit*frame_time; - if (incr>frame_limit) incr=frame_limit; /* don't scroll faster than limit */ - last_update_time=GLUI_Time(); - - float new_val = float_val; - - new_val += direction * incr; - if (1 || data_type==GLUI_SCROLL_FLOAT) set_float_val(new_val); - if (0 && data_type==GLUI_SCROLL_INT) set_int_val((int)new_val); - //printf("do_click: incr %f val=%f float_val=%f\n",incr,new_val,float_val); - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ - callback_count++; - if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); - -} - - -/***************************************** GLUI_Scrollbar::do_drag() **********/ - -void GLUI_Scrollbar::do_drag( int x, int y ) -{ - int direction = 0; - float incr, modifier_factor; - /* int delta_x; */ - int new_int_val = int_val; - float new_float_val = float_val; - - int free_len = track_length-box_length; - if (free_len == 0) return; - - modifier_factor = 1.0; - if ( state == GLUI_SCROLL_STATE_SCROLL) { - update_scroll_parameters(); - - int hbox = box_length/2; - if (horizontal) { - int track_v = x-GLUI_SCROLL_ARROW_WIDTH; - new_int_val = int_min + (track_v-hbox)*(int_max-int_min)/free_len; - new_float_val = float_min + (track_v-hbox)*(float_max-float_min)/float(free_len); - } else { - int track_v = y-GLUI_SCROLL_ARROW_HEIGHT; - new_int_val = int_max - (track_v-hbox)*(int_max-int_min)/free_len; - new_float_val = float_max - (track_v-hbox)*(float_max-float_min)/float(free_len); - } - } - else { - if ( state == GLUI_SCROLL_STATE_UP ) - direction = +1; - else if ( state == GLUI_SCROLL_STATE_DOWN ) - direction = -1; - incr = growth * direction * modifier_factor * user_speed; - new_int_val += direction; - new_float_val += direction * (float_max-float_min)/free_len; - } - last_y = y; - last_x = x; - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SCROLL_CALLBACK_INTERVAL ****/ - if(data_type==GLUI_SCROLL_INT) - set_int_val(new_int_val); - else if (data_type==GLUI_SCROLL_FLOAT) - set_float_val(new_float_val); - - callback_count++; - if ( (callback_count % GLUI_SCROLL_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Scrollbar::needs_idle() ******/ - -bool GLUI_Scrollbar::needs_idle( void ) const -{ - if (state == GLUI_SCROLL_STATE_UP OR state == GLUI_SCROLL_STATE_DOWN ) { - return true; - } - else { - return false; - } -} - -/***************************************** GLUI_Scrollbar::idle() **********/ - -void GLUI_Scrollbar::idle( void ) -{ - if ( NOT needs_idle() ) - return; - else - do_click(); -} - - -/************************************ GLUI_Scrollbar::do_callbacks() **********/ - -void GLUI_Scrollbar::do_callbacks( void ) -{ - - /* *******************************************/ - - if ( NOT first_callback ) { - if ( data_type == GLUI_SCROLL_INT AND int_val == last_int_val ) { - return; - } - if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { - return; - } - } - - if (associated_object == NULL) { - this->execute_callback(); - } - else { // Use internal Callbacks - if (object_cb) { - //object_cb(associated_object, int_val); - object_cb(this); - } - } - last_int_val = int_val; - last_float_val = float_val; - first_callback = false; -} - - -/********************************** GLUI_Scrollbar::set_float_val() ************/ - -void GLUI_Scrollbar::set_float_val( float new_val ) -{ - // Allow for the possibility that the limits are reversed - float hi = MAX(float_min,float_max); - float lo = MIN(float_min,float_max); - if (new_val > hi) - new_val = hi; - if (new_val < lo) - new_val = lo; - last_float_val = float_val; - float_val = new_val; - int_val = (int)new_val; - - redraw(); - - /*** Now update the live variable ***/ - output_live(true); -} - - -/********************************** GLUI_Scrollbar::set_int_val() ************/ - -void GLUI_Scrollbar::set_int_val( int new_val ) -{ - // Allow for the possibility that the limits are reversed - int hi = MAX(int_min,int_max); - int lo = MIN(int_min,int_max); - if (new_val > hi) - new_val = hi; - if (new_val < lo) - new_val = lo; - last_int_val = int_val; - float_val = int_val = new_val; - - redraw(); - - /*** Now update the live variable ***/ - output_live(true); -} - -/*********************************** GLUI_Scrollbar::set_float_limits() *********/ - -void GLUI_Scrollbar::set_float_limits( float low, float high, int limit_type ) -{ - if (limit_type != GLUI_LIMIT_CLAMP) { - // error! - } - float_min = low; - float_max = high; - // Allow for possiblitly of reversed limits - float lo = MIN(low,high); - float hi = MAX(low,high); - if (float_valhi) set_float_val(hi); -} - - -/*********************************** GLUI_Scrollbar::set_int_limits() *********/ - -void GLUI_Scrollbar::set_int_limits( int low, int high, int limit_type ) -{ - if (limit_type != GLUI_LIMIT_CLAMP) { - // error! - } - int_min = low; - int_max = high; - // Allow for possiblitly of reversed limits - int lo = MIN(low,high); - int hi = MAX(low,high); - if (int_valhi) set_int_val(hi); - float_min = low; - float_max = high; -} - - -/*********************************** GLUI_Scrollbar::reset_growth() *************/ - -void GLUI_Scrollbar::reset_growth( void ) -{ - growth = fabs(float_max - float_min) / float(GLUI_SCROLL_GROWTH_STEPS); - if (data_type == GLUI_SCROLL_INT && growth<1) growth=1; -} - - -/******************************* GLUI_Scrollbar::increase_growth() *************/ - -void GLUI_Scrollbar::increase_growth( void ) -{ - float range=0; - if (data_type==GLUI_SCROLL_FLOAT) - range = fabs(float_max-float_min); - else - range = fabs(float(int_max-int_min)); - if ( growth < (range / float(GLUI_SCROLL_MIN_GROWTH_STEPS)) ) - growth *= growth_exp; - return; -} - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_separator.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_separator.cpp deleted file mode 100644 index dfca06297..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_separator.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_separator.cpp - GLUI_Separator control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_Separator::GLUI_Separator() **********/ - -GLUI_Separator::GLUI_Separator( GLUI_Node *parent ) -{ - common_init(); - parent->add_control( this ); -} - -/****************************** GLUI_Separator::draw() **********/ - -void GLUI_Separator::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - int width, indent; - int cont_x, cont_y, cont_w, cont_h, cont_x_off, cont_y_off; - - if ( parent() != NULL ) { - get_this_column_dims(&cont_x, &cont_y, &cont_w, &cont_h, - &cont_x_off, &cont_y_off); - - width = cont_w - cont_x_off*2; - } - else { - width = this->w; - } - - indent = (int) floor(width * .05); - - glLineWidth( 1.0 ); - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2-1 ); - glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2-1 ); - - glColor3f( 1., 1., 1. ); - glVertex2i( indent, GLUI_SEPARATOR_HEIGHT/2 ); - glVertex2i( width-indent, GLUI_SEPARATOR_HEIGHT/2 ); - glEnd(); -} - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_spinner.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_spinner.cpp deleted file mode 100644 index 90f6cbfe4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_spinner.cpp +++ /dev/null @@ -1,654 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_spinner.cpp - GLUI_Spinner class - - - notes: - spinner does not explicitly keep track of the current value - this is all - handled by the underlying edittext control - -> thus, spinner->sync_live() has no meaning, nor spinner->output_live - -> BUT, edittext will alter this spinner's float_val and int_val, - so that spinner->get/set will work - - -FIXME: there's a heck of a lot of duplication between this and glui_scrollbar.cpp. - (OSL, 2006/06) - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include -#include - -/*static int __debug=0; */ - -#define GLUI_SPINNER_GROWTH_STEPS 800 -#define GLUI_SPINNER_MIN_GROWTH_STEPS 100 -#define GLUI_SPINNER_CALLBACK_INTERVAL 1 - - -/****************************** spinner_edittext_callback() ******************/ -/* This function is not used anymore. It has been replaced by directly */ -/* Including an optional pointer to a spinner from an edittext box */ - -void spinner_edittext_callback( int id ) -{ - GLUI_Spinner *spinner; - - putchar( '.' ); flushout; - - spinner = (GLUI_Spinner*) id; - - if ( NOT spinner ) - return; - - spinner->do_callbacks(); -} - - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - int data_type, int id, GLUI_CB callback ) -{ - common_construct(parent, name, data_type, NULL, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - int *live_var, int id, GLUI_CB callback ) -{ - common_construct(parent, name, GLUI_SPINNER_INT, live_var, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node* parent, const char *name, - float *live_var, int id, GLUI_CB callback ) -{ - common_construct(parent, name, GLUI_SPINNER_FLOAT, live_var, id, callback); -} - -/****************************** GLUI_Spinner::GLUI_Spinner() ****************/ - -GLUI_Spinner::GLUI_Spinner( GLUI_Node *parent, const char *name, - int data_t, void *live_var, - int id, GLUI_CB callback ) -{ - common_construct(parent, name, data_t, live_var, id, callback); -} - -/****************************** GLUI_Spinner::common_construct() ************/ - -void GLUI_Spinner::common_construct( GLUI_Node* parent, const char *name, - int data_t, void *data, - int id, GLUI_CB cb ) -{ - common_init(); - - if ( NOT strcmp( name, "Spinner Test" )) - id=id; - - int text_type; - if ( data_t == GLUI_SPINNER_INT ) { - text_type = GLUI_EDITTEXT_INT; - } - else if ( data_t == GLUI_SPINNER_FLOAT ) { - text_type = GLUI_EDITTEXT_FLOAT; - } - else { - assert(0); /* Did not pass in a valid data type */ - } - - user_id = id; - data_type = data_t; - callback = cb; - set_name( name ); - //glui = parent->get_glui(); - - parent->add_control( this ); - - GLUI_EditText *txt = - new GLUI_EditText( this, name, text_type, data, id, cb); - - edittext = txt; /* Link the edittext to the spinner */ - /* control->ptr_val = data; */ - - edittext->spinner = this; /* Link the spinner to the edittext */ - -} - -/****************************** GLUI_Spinner::mouse_down_handler() **********/ - -int GLUI_Spinner::mouse_down_handler( int local_x, int local_y ) -{ - this->state = find_arrow( local_x, local_y ); - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf( "spinner: mouse down : %d/%d arrow:%d\n", local_x, local_y, - find_arrow( local_x, local_y )); - */ - - if ( state != GLUI_SPINNER_STATE_UP AND state != GLUI_SPINNER_STATE_DOWN ) - return true; - - reset_growth(); - redraw(); - - /*** ints and floats behave a bit differently. When you click on - an int spinner, you expect the value to immediately go up by 1, whereas - for a float it'll go up only by a fractional amount. Therefore, we - go ahead and increment by one for int spinners ***/ - if ( data_type == GLUI_SPINNER_INT ) { - if ( state == GLUI_SPINNER_STATE_UP ) - edittext->set_float_val( edittext->float_val + 1.0 ); - else if ( state == GLUI_SPINNER_STATE_DOWN ) - edittext->set_float_val( edittext->float_val - .9 ); - } - - do_click(); - - return false; -} - - -/******************************** GLUI_Spinner::mouse_up_handler() **********/ - -int GLUI_Spinner::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - state = GLUI_SPINNER_STATE_NONE; - GLUI_Master.glui_setIdleFuncIfNecessary(); - - /* printf("spinner: mouse up : %d/%d inside: %d\n",local_x,local_y,inside); */ - - /*glutSetCursor( GLUT_CURSOR_INHERIT ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - redraw(); - - /* do_callbacks(); --- stub */ - /* if ( callback ) */ - /* callback( this->user_id ); */ - - return false; -} - - -/***************************** GLUI_Spinner::mouse_held_down_handler() ******/ - -int GLUI_Spinner::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int new_state; - - if ( state == GLUI_SPINNER_STATE_NONE ) - return false; - - /* printf("spinner: mouse held: %d/%d inside: %d\n",local_x,local_y, - new_inside); - */ - - if ( state == GLUI_SPINNER_STATE_BOTH ) { /* dragging? */ - do_drag( local_x, local_y ); - } - else { /* not dragging */ - new_state = find_arrow( local_x, local_y ); - - if ( new_state == state ) { - /** Still in same arrow **/ - do_click(); - } - else { - if ( new_inside OR 1) { - /** The state changed, but we're still inside - that - means we moved off the arrow: begin dragging **/ - state = GLUI_SPINNER_STATE_BOTH; - } - else { - /*** Here check y of mouse position to determine whether to - drag ***/ - - /* ... */ - } - } - - /*** We switched to up/down dragging ***/ - if ( state == GLUI_SPINNER_STATE_BOTH ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - last_x = local_x; - last_y = local_y; - - /** If the spinner has limits, we reset the growth value, since - reset_growth() will compute a new growth value for dragging - vs. clicking. If the spinner has no limits, then we just let the - growth remain at whatever the user has incremented it up to **/ - if ( edittext->has_limits != GLUI_LIMIT_NONE ) - reset_growth(); - } - - redraw(); - } - - return false; -} - - -/****************************** GLUI_Spinner::key_handler() **********/ - -int GLUI_Spinner::key_handler( unsigned char key,int modifiers ) -{ - - - return true; -} - - -/****************************** GLUI_Spinner::draw() **********/ - -void GLUI_Spinner::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - if ( enabled ) { - /*** Draw the up arrow either pressed or unrpessed ***/ - if ( state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_BOTH ) - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_ON, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_OFF, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - - /*** Draw the down arrow either pressed or unrpessed ***/ - if (state == GLUI_SPINNER_STATE_DOWN OR state == GLUI_SPINNER_STATE_BOTH) - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_ON, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - else - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_OFF, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - } - else { /**** The spinner is disabled ****/ - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_UP_DIS, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_Y); - glui->std_bitmaps.draw( GLUI_STDBITMAP_SPINNER_DOWN_DIS, - w-GLUI_SPINNER_ARROW_WIDTH-1, - GLUI_SPINNER_ARROW_HEIGHT+GLUI_SPINNER_ARROW_Y); - } - - if ( active ) { - glColor3ub( 0, 0, 0 ); - glEnable( GL_LINE_STIPPLE ); - glLineStipple( 1, 0x5555 ); - } - else { - glColor3ub( glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b ); - } - - glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, 0 ); - glVertex2i( w, 0 ); - glVertex2i( w, h ); - glVertex2i( w-GLUI_SPINNER_ARROW_WIDTH-2, h ); - glEnd(); - glDisable( GL_LINE_STIPPLE ); - glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -} - - -/********************************* GLUI_Spinner::special_handler() **********/ - -int GLUI_Spinner::special_handler( int key,int modifiers ) -{ - if ( key == GLUT_KEY_UP ) { /** Simulate a click in the up arrow **/ - mouse_down_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs + GLUI_SPINNER_ARROW_Y+1 ); - mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs + GLUI_SPINNER_ARROW_Y+1, true ); - } - else if ( key == GLUT_KEY_DOWN ) { /** Simulate a click in the up arrow **/ - mouse_down_handler(x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs+GLUI_SPINNER_ARROW_Y+1+GLUI_SPINNER_ARROW_HEIGHT); - mouse_up_handler( x_abs + w - GLUI_SPINNER_ARROW_WIDTH + 1, - y_abs+GLUI_SPINNER_ARROW_Y+1 +GLUI_SPINNER_ARROW_HEIGHT, - true ); - } - else if ( key == GLUT_KEY_HOME ) { /** Set value to limit top - - or increment by 10 **/ - } - else if ( key == GLUT_KEY_END ) { - } - - return true; -} - - -/******************************* GLUI_Spinner::set_float_val() ************/ - -void GLUI_Spinner::set_float_val( float new_val ) -{ - if ( NOT edittext ) - return; - - edittext->set_float_val( new_val ); -} - - -/********************************** GLUI_Spinner::set_int_val() ************/ - -void GLUI_Spinner::set_int_val( int new_val ) -{ - if ( NOT edittext ) - return; - - edittext->set_int_val( new_val ); -} - - -/************************************ GLUI_Spinner::update_size() **********/ - -void GLUI_Spinner::update_size( void ) -{ - if (!edittext) return; - /*edittext->w = this->w - GLUI_SPINNER_ARROW_WIDTH-3; */ - this->w = edittext->w + GLUI_SPINNER_ARROW_WIDTH + 3; -} - - -/************************************ GLUI_Spinner::find_arrow() ************/ - -int GLUI_Spinner::find_arrow( int local_x, int local_y ) -{ - local_x -= x_abs; - local_y -= y_abs; - - if ( local_x >= (w - GLUI_SPINNER_ARROW_WIDTH) AND - local_x <= w ) { - - if ( local_y >= GLUI_SPINNER_ARROW_Y AND - local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT) ) - return GLUI_SPINNER_STATE_UP; - - if ( local_y >= GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT AND - local_y <= (GLUI_SPINNER_ARROW_Y+GLUI_SPINNER_ARROW_HEIGHT*2) ) - return GLUI_SPINNER_STATE_DOWN; - - } - - return GLUI_SPINNER_STATE_NONE; -} - - -/***************************************** GLUI_Spinner::do_click() **********/ - -void GLUI_Spinner::do_click( void ) -{ - int direction = 0; - float incr; - float modifier_factor; - - if ( state == GLUI_SPINNER_STATE_UP ) - direction = +1; - else if ( state == GLUI_SPINNER_STATE_DOWN ) - direction = -1; - - increase_growth(); - - modifier_factor = 1.0; - if ( glui ) { - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) - modifier_factor = 100.0f; - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) - modifier_factor = .01f; - } - - if ( this->data_type == GLUI_SPINNER_FLOAT OR 1) { - incr = growth * direction * modifier_factor * user_speed; - edittext->set_float_val( edittext->float_val + incr ); - /** Remember, edittext mirrors the float and int values ***/ - } - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ - callback_count++; - if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Spinner::do_drag() **********/ - -void GLUI_Spinner::do_drag( int x, int y ) -{ - int delta_y; - float incr, modifier_factor; - /* int delta_x; */ - - modifier_factor = 1.0f; - if ( glui ) { - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) - modifier_factor = 100.0f; - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) - modifier_factor = .01f; - } - - /* delta_x = x - last_x; */ - delta_y = -(y - last_y); - - if ( this->data_type == GLUI_SPINNER_FLOAT OR 1 ) { - incr = growth * delta_y * modifier_factor * user_speed; - edittext->set_float_val( edittext->float_val + incr ); - /** Remember, edittext mirrors the float and int values ***/ - } - - last_x = x; - last_y = y; - - /*** Now update live variable and do callback. We don't want - to do the callback on each iteration of this function, just on every - i^th iteration, where i is given by GLUI_SPINNER_CALLBACK_INTERVAL ****/ - - callback_count++; - if ( (callback_count % GLUI_SPINNER_CALLBACK_INTERVAL ) == 0 ) - do_callbacks(); -} - - -/***************************************** GLUI_Spinner::needs_idle() ******/ - -bool GLUI_Spinner::needs_idle( void ) const -{ - if (state == GLUI_SPINNER_STATE_UP OR state == GLUI_SPINNER_STATE_DOWN ) { - return true; - } - else { - return false; - } -} - -/***************************************** GLUI_Spinner::idle() **********/ - -void GLUI_Spinner::idle( void ) -{ - if ( NOT needs_idle() ) - return; - else - do_click(); -} - - -/************************************ GLUI_Spinner::do_callbacks() **********/ - -void GLUI_Spinner::do_callbacks( void ) -{ - /*** This is not necessary, b/c edittext automatically updates us ***/ - if ( NOT edittext ) - return; - this->float_val = edittext->float_val; - this->int_val = edittext->int_val; - /* *******************************************/ - - if ( NOT first_callback ) { - if ( data_type == GLUI_SPINNER_INT AND int_val == last_int_val ) { - return; - } - - if ( data_type == GLUI_SPINNER_FLOAT AND float_val == last_float_val ) { - return; - } - } - - this->execute_callback(); - - last_int_val = int_val; - last_float_val = float_val; - first_callback = false; -} - - -/********************************* GLUI_Spinner::set_float_limits() *********/ - -void GLUI_Spinner::set_float_limits( float low, float high, int limit_type ) -{ - if ( NOT edittext ) - return; - - edittext->set_float_limits( low, high, limit_type ); -} - - -/*********************************** GLUI_Spinner::set_int_limits() *********/ - -void GLUI_Spinner::set_int_limits( int low, int high, int limit_type ) -{ - if ( NOT edittext ) - return; - - edittext->set_int_limits( low, high, limit_type ); -} - - -/*********************************** GLUI_Spinner:reset_growth() *************/ - -void GLUI_Spinner::reset_growth( void ) -{ - float lo, hi; - - if ( edittext->has_limits == GLUI_LIMIT_NONE ) { - if ( data_type == GLUI_SPINNER_FLOAT ) - growth = sqrt(ABS(edittext->float_val)) * .05f; - else if ( data_type == GLUI_SPINNER_INT ) - growth = .4f; - } - else { - if ( data_type == GLUI_SPINNER_FLOAT ) { - lo = edittext->float_low; - hi = edittext->float_high; - growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; - } - else if ( data_type == GLUI_SPINNER_INT ) { - lo = (float) edittext->int_low; - hi = (float) edittext->int_high; - - growth = (hi-lo) / GLUI_SPINNER_GROWTH_STEPS; - } - } - - if ( growth == 0.0f ) - growth = .001f; -} - - -/******************************* GLUI_Spinner:increase_growth() *************/ - -void GLUI_Spinner::increase_growth( void ) -{ - float hi = 0.0,lo = 0.0; - - if ( data_type == GLUI_SPINNER_FLOAT ) { - lo = edittext->float_low; - hi = edittext->float_high; - } - else if ( data_type == GLUI_SPINNER_INT ) { - lo = (float) edittext->int_low; - hi = (float) edittext->int_high; - } - - if ( growth < (hi-lo) / GLUI_SPINNER_MIN_GROWTH_STEPS ) - growth *= growth_exp; - - /* printf( "growth: %f\n", growth ); */ -} - - -/*************************************** GLUI_Spinner:get_text() *************/ - -const char *GLUI_Spinner::get_text( void ) -{ - if (edittext) - return edittext->text.c_str(); - else - return ""; -} - - -/********************************** GLUI_Spinner:get_float_val() *************/ - -float GLUI_Spinner::get_float_val( void ) -{ - if (edittext) - return edittext->float_val; - else - return 0.0f; -} - - -/********************************** GLUI_Spinner:get_int_val() *************/ - -int GLUI_Spinner::get_int_val( void ) -{ - if (edittext) - return edittext->int_val; - else - return 0; -} - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_statictext.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_statictext.cpp deleted file mode 100644 index 83b96335b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_statictext.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_statictext.cpp - GLUI_StaticText Control - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" - -/****************************** GLUI_StaticText::GLUI_StaticText() **********/ -GLUI_StaticText::GLUI_StaticText( GLUI_Node *parent, const char *name ) -{ - common_init(); - set_name( name ); - parent->add_control( this ); -} - -/****************************** GLUI_StaticText::draw() **********/ - -void GLUI_StaticText::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - - draw_text(); -} - - -/****************************** GLUI_StaticText::set_text() **********/ - -void GLUI_StaticText::set_text( const char *text ) -{ - set_name( text ); - redraw(); -} - - -/************************************ GLUI_StaticText::update_size() **********/ - -void GLUI_StaticText::update_size( void ) -{ - int text_size; - - if ( NOT glui ) - return; - - text_size = string_width( name ); - - if ( w < text_size ) - w = text_size; -} - - -/****************************** GLUI_StaticText::draw_text() **********/ - -void GLUI_StaticText::draw_text( void ) -{ - if ( NOT can_draw() ) - return; - - erase_text(); - draw_name( 0, 9 ); -} - - -/****************************** GLUI_StaticText::erase_text() **********/ - -void GLUI_StaticText::erase_text( void ) -{ - if ( NOT can_draw() ) - return; - - set_to_bkgd_color(); - glDisable( GL_CULL_FACE ); - glBegin( GL_TRIANGLES ); - glVertex2i( 0,0 ); glVertex2i( w, 0 ); glVertex2i( w, h ); - glVertex2i( 0, 0 ); glVertex2i( w, h ); glVertex2i( 0, h ); - glEnd(); -} - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_string.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_string.cpp deleted file mode 100644 index 84d29b9d4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_string.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui.cpp - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher (this file, Bill Baxter 2005) - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA - - This program is -not- in the public domain. - -*****************************************************************************/ - -#include "GL/glui.h" -#include - -#ifdef _MSC_VER -#define vsnprintf _vsnprintf -#endif - -GLUI_String& glui_format_str(GLUI_String& str, const char* fmt, ...) -{ - const size_t ISIZE = 128; - char stackbuf[ISIZE]; - size_t bufsz = ISIZE; - char *buf = stackbuf; - str = ""; - va_list arg; - while (1) { - va_start(arg, fmt); - int ret = vsnprintf(buf,299,fmt,arg); - va_end(arg); - if (ret>=0) { - break; - } - // else make a bigger buf, try again - bufsz <<= 1; - if (buf==stackbuf) buf = (char*)malloc(sizeof(char)*bufsz); - else buf = (char*)realloc(buf, sizeof(char)*bufsz); - } - if (buf!=stackbuf) free(buf); - str=buf; - return str; -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_textbox.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_textbox.cpp deleted file mode 100644 index 1a8d84dfc..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_textbox.cpp +++ /dev/null @@ -1,1115 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_textbox.cpp - GLUI_TextBox control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher, 2004 John Kew - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "glui_internal_control.h" -#include - - -static const int LINE_HEIGHT = 15; - -/****************************** GLUI_TextBox::GLUI_TextBox() **********/ - -GLUI_TextBox::GLUI_TextBox(GLUI_Node *parent, GLUI_String &live_var, - bool scroll, int id, GLUI_CB callback ) -{ - common_construct(parent, &live_var, scroll, id, callback); -} - -/****************************** GLUI_TextBox::GLUI_TextBox() **********/ - -GLUI_TextBox::GLUI_TextBox( GLUI_Node *parent, bool scroll, int id, - GLUI_CB callback ) -{ - common_construct(parent, NULL, scroll, id, callback); -} - -/****************************** GLUI_TextBox::common_construct() **********/ -void GLUI_TextBox::common_construct( - GLUI_Node *parent, GLUI_String *data, - bool scroll, int id, GLUI_CB callback) -{ - common_init(); - - GLUI_Node *tb_panel = parent; - - if (scroll) { - GLUI_Panel *p = new GLUI_Panel(parent,"",GLUI_PANEL_NONE); - p->x_off = 1; - tb_panel = p; - } - this->ptr_val = data; - if (data) { - this->live_type = GLUI_LIVE_STRING; - } else { - this->live_type = GLUI_LIVE_NONE; - } - this->user_id = id; - this->callback = callback; - this->name = "textbox"; - tb_panel->add_control( this ); - if (scroll) { - new GLUI_Column(tb_panel, false); - scrollbar = - new GLUI_Scrollbar(tb_panel, - "scrollbar", - GLUI_SCROLL_VERTICAL, - GLUI_SCROLL_INT); - scrollbar->set_object_callback(GLUI_TextBox::scrollbar_callback, this); - scrollbar->set_alignment(GLUI_ALIGN_LEFT); - // scrollbar->can_activate = false; //kills ability to mouse drag too - } - init_live(); -} - -/****************************** GLUI_TextBox::mouse_down_handler() **********/ - -int GLUI_TextBox::mouse_down_handler( int local_x, int local_y ) -{ - int tmp_insertion_pt; - - if ( debug ) dump( stdout, "-> MOUSE DOWN" ); - - tmp_insertion_pt = find_insertion_pt( local_x, local_y ); - if ( tmp_insertion_pt == -1 ) { - if ( glui ) - glui->deactivate_current_control( ); - return false; - } - - insertion_pt = tmp_insertion_pt; - - sel_start = sel_end = insertion_pt; - - keygoal_x = insert_x; - - if ( can_draw()) - update_and_draw_text(); - - if ( debug ) dump( stdout, "<- MOUSE UP" ); - - return true; -} - - -/******************************** GLUI_TextBox::mouse_up_handler() **********/ - -int GLUI_TextBox::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - return false; -} - - -/***************************** GLUI_TextBox::mouse_held_down_handler() ******/ - -int GLUI_TextBox::mouse_held_down_handler( int local_x, int local_y, - bool new_inside) -{ - int tmp_pt; - - if ( NOT new_inside ) return false; - - if ( debug ) dump( stdout, "-> HELD DOWN" ); - - tmp_pt = find_insertion_pt( local_x, local_y ); - keygoal_x = insert_x; - - if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ - special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { - /* moved mouse past right edge */ - special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); - } - else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { - sel_end = insertion_pt = tmp_pt; - - update_and_draw_text(); - } - - if ( debug ) - dump( stdout, "<- HELD DOWN" ); - - return false; -} - - -/****************************** GLUI_TextBox::key_handler() **********/ -int GLUI_TextBox::key_handler( unsigned char key,int modifiers ) -{ - int regular_key; - /* int has_selection; */ - - if ( NOT glui ) - return false; - - if ( debug ) - dump( stdout, "-> KEY HANDLER" ); - - regular_key = false; - bool ctrl_down = (modifiers & GLUT_ACTIVE_CTRL)!=0; - /* has_selection = (sel_start != sel_end); */ - - if ( key == CTRL('[')) { /* ESCAPE */ - glui->deactivate_current_control(); - return true; - } - else if ( (key == 127 AND !ctrl_down) OR /* FORWARD DELETE */ - ( key == CTRL('d') AND modifiers == GLUT_ACTIVE_CTRL) ) - { - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt < (int)text.length() ) { - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( ((key == 127) AND ctrl_down) OR // Delete word forward - ((key == 'd') AND (modifiers == GLUT_ACTIVE_ALT)) ) - { - if ( sel_start == sel_end ) { /* no selection */ - sel_start = insertion_pt; - sel_end = find_word_break( insertion_pt, +1 ); - } - - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - else if ( key == CTRL('h') ) { /* BACKSPACE */ - if ( sel_start == sel_end ) { /* no selection */ - if ( insertion_pt > 0 ) { - insertion_pt--; - text.erase(insertion_pt,1); - } - } - else { /* There is a selection */ - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - } - else if ( modifiers == GLUT_ACTIVE_CTRL ) /* CTRL ONLY */ - { - /* Ctrl-key bindings */ - if ( key == CTRL('a') ) { - return special_handler( GLUT_KEY_HOME, 0 ); - } - else if ( key == CTRL('e') ) { - return special_handler( GLUT_KEY_END, 0 ); - } - else if ( key == CTRL('b') ) { - return special_handler( GLUT_KEY_LEFT, 0 ); - } - else if ( key == CTRL('f') ) { - return special_handler( GLUT_KEY_RIGHT, 0 ); - } - else if ( key == CTRL('p') ) { - return special_handler( GLUT_KEY_UP, 0 ); - } - else if ( key == CTRL('n') ) { - return special_handler( GLUT_KEY_DOWN, 0 ); - } - else if ( key == CTRL('u') ) { /* ERASE LINE */ - insertion_pt = 0; - text.erase(0,text.length()); - sel_start = sel_end = 0; - } - else if ( key == CTRL('k') ) { /* KILL TO END OF LINE */ - sel_start = sel_end = insertion_pt; - text.erase(insertion_pt,GLUI_String::npos); - } - } - else if ( modifiers == GLUT_ACTIVE_ALT ) /* ALT ONLY */ - { - if ( key == 'b' ) { // Backward word - return special_handler ( GLUT_KEY_LEFT, GLUT_ACTIVE_CTRL ); - } - if ( key == 'f' ) { // Forward word - return special_handler ( GLUT_KEY_RIGHT, GLUT_ACTIVE_CTRL ); - } - } - else if ( (modifiers & GLUT_ACTIVE_CTRL) OR - (modifiers & GLUT_ACTIVE_ALT) ) - { - /** ignore other keys with modifiers */ - return true; - } - else { /* Regular key */ - if ( key == 13 ) /* RETURNS are written as newlines*/ - key = '\n'; - - regular_key = true; - - /** This is just to get rid of warnings - the flag regular_key is - set if the key was not a backspace, return, whatever. But I - believe if we're here, we know it was a regular key anyway */ - if ( regular_key ) { - } - - /**** If there's a current selection, erase it ******/ - if ( sel_start != sel_end ) { - clear_substring( MIN(sel_start,sel_end), MAX(sel_start,sel_end )); - insertion_pt = MIN(sel_start,sel_end); - sel_start = sel_end = insertion_pt; - } - - /******** We insert the character into the string ***/ - - text.insert(insertion_pt,1,key); - - /******** Move the insertion point and substring_end one over ******/ - insertion_pt++; - substring_end++; - - sel_start = sel_end = insertion_pt; - } - - /******** Now redraw text ***********/ - /* Hack to prevent text box from being cleared first **/ - /** int substring_change = update_substring_bounds(); - draw_text_only = - (NOT substring_change AND NOT has_selection AND regular_key ); - */ - - draw_text_only = false; /** Well, hack is not yet working **/ - update_and_draw_text(); - draw_text_only = false; - - - if ( debug ) - dump( stdout, "<- KEY HANDLER" ); - - return true; -} - -/****************************** GLUI_TextBox::enable() **********/ - -void GLUI_TextBox::enable( void ) -{ - GLUI_Control::enable(); - scrollbar->enable(); -} - -/****************************** GLUI_TextBox::disable() **********/ - -void GLUI_TextBox::disable( void ) -{ - GLUI_Control::disable(); - scrollbar->disable(); -} - -/****************************** GLUI_TextBox::activate() **********/ - -void GLUI_TextBox::activate( int how ) -{ - if ( debug ) - dump( stdout, "-> ACTIVATE" ); - active = true; - - if ( how == GLUI_ACTIVATE_MOUSE ) - return; /* Don't select everything if activated with mouse */ - - orig_text = text; - - sel_start = 0; - sel_end = text.length(); - insertion_pt = 0; - if ( debug ) - dump( stdout, "<- ACTIVATE" ); -} - - -/****************************** GLUI_TextBox::deactivate() **********/ - -void GLUI_TextBox::deactivate( void ) -{ - active = false; - - if ( NOT glui ) - return; - - if ( debug ) - dump( stdout, "-> DISACTIVATE" ); - - sel_start = sel_end = insertion_pt = -1; - - /***** Retrieve the current value from the text *****/ - /***** The live variable will be updated by set_text() ****/ - set_text(text.c_str()); /* This will force callbacks and gfx refresh */ - - update_substring_bounds(); - - /******** redraw text without insertion point ***********/ - redraw(); - - /***** Now do callbacks if value changed ******/ - if ( orig_text != text ) { - this->execute_callback(); - - - } - - - if ( debug ) - dump( stdout, "<- DISACTIVATE" ); -} - -/****************************** GLUI_TextBox::draw() **********/ - -void GLUI_TextBox::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int line = 0; - int text_length; - int box_width; - int i; - - /* Bevelled Border */ - glBegin( GL_LINES ); - glColor3f( .5, .5, .5 ); - glVertex2i( 0, 0 ); glVertex2i( w, 0 ); - glVertex2i( 0, 0 ); glVertex2i( 0, h ); - - glColor3f( 1., 1., 1. ); - glVertex2i( 0, h ); glVertex2i( w, h ); - glVertex2i( w, h ); glVertex2i( w, 0 ); - - if ( enabled ) - glColor3f( 0., 0., 0. ); - else - glColor3f( .25, .25, .25 ); - glVertex2i( 1, 1 ); glVertex2i( w-1, 1 ); - glVertex2i( 1, 1 ); glVertex2i( 1, h-1 ); - - glColor3f( .75, .75, .75 ); - glVertex2i( 1, h-1 ); glVertex2i( w-1, h-1 ); - glVertex2i( w-1, h-1 ); glVertex2i( w-1, 1 ); - glEnd(); - - /* Draw Background if enabled*/ - if (enabled) { - glColor3f( 1., 1., 1. ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } else { - glColor3f( .8, .8, .8 ); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( 2, 2 ); glVertex2i( w-2, 2 ); - glVertex2i( w-2, h-2 ); glVertex2i(2, h-2 ); - glEnd(); - } - - /* Begin Drawing Lines of Text */ - substring_start = 0; - substring_end = 0; - text_length = text.length()-1; - - /* Figure out how wide the box is */ - box_width = get_box_width(); - - /* Get the first line substring */ - while (substring_width(substring_start, substring_end+1 ) < box_width && - substring_end < text_length && text[substring_end+1] != '\n') - substring_end++; - - /* Figure out which lines are visible*/ - - visible_lines = (int)(h-20)/LINE_HEIGHT; - if (start_line < (curr_line-visible_lines)) { - for (i = 0; ((curr_line-i)*LINE_HEIGHT+20) > h; i++); - start_line = i; - } else if ( start_line > curr_line) { - start_line = curr_line; - } - line = 0; - do { - if (line && substring_end < text_length) { - substring_start = substring_end+1; - while (substring_width(substring_start, substring_end+1 ) < box_width && - substring_end < text_length && text[substring_end+1] != '\n') - substring_end++; - } - if (text[substring_end+1] == '\n') { /* Skip newline */ - substring_end++; - } - if (line < start_line || (line > curr_line && curr_line > (start_line + visible_lines))) { - line++; - continue; - } - if ((line - start_line) <= visible_lines) - draw_text(0,(line - start_line)*LINE_HEIGHT); /* tabs and other nasties are handled by substring_width */ - line++; - } while (substring_end < text_length); - - num_lines = line; - - draw_insertion_pt(); - if (scrollbar) { - scrollbar->set_int_limits(MAX(0,num_lines/*-1*/-visible_lines),0); - glPushMatrix(); - glTranslatef(scrollbar->x_abs-x_abs, scrollbar->y_abs-y_abs,0.0); - scrollbar->draw_scroll(); - glPopMatrix(); - } -} - - - -/************************** GLUI_TextBox::update_substring_bounds() *********/ - -int GLUI_TextBox::update_substring_bounds( void ) -{ - int box_width; - int text_len = text.length(); - int old_start, old_end; - - old_start = substring_start; - old_end = substring_end; - - /*** Calculate the width of the usable area of the edit box ***/ - box_width = get_box_width(); - - CLAMP( substring_end, 0, MAX(text_len-1,0) ); - CLAMP( substring_start, 0, MAX(text_len-1,0) ); - - if ( debug ) dump( stdout, "-> UPDATE SS" ); - - if ( insertion_pt >= 0 AND - insertion_pt < substring_start ) { /* cursor moved left */ - substring_start = insertion_pt; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - } - else if ( insertion_pt > substring_end ) { /* cursor moved right */ - substring_end = insertion_pt-1; - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_start++; - } - else { /* cursor is within old substring bounds */ - if ( last_insertion_pt > insertion_pt ) { /* cursor moved left */ - } - else { - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - while(substring_width( substring_start, substring_end+1 ) <= box_width - AND substring_end < text_len-1 ) - substring_end++; - } - } - - while ( substring_width( substring_start, substring_end ) > box_width ) - substring_end--; - - last_insertion_pt = insertion_pt; - - /*** No selection if not enabled ***/ - if ( NOT enabled ) { - sel_start = sel_end = 0; - } - - if ( debug ) dump( stdout, "<- UPDATE SS" ); - - if ( substring_start == old_start AND substring_end == old_end ) - return false; /*** bounds did not change ***/ - else - return true; /*** bounds did change ***/ - -} - - -/********************************* GLUI_TextBox::update_x_offsets() *********/ - -void GLUI_TextBox::update_x_offsets( void ) -{ -} - - -/********************************* GLUI_TextBox::draw_text() ****************/ - -void GLUI_TextBox::draw_text( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int text_x, i, sel_lo, sel_hi, x_pos; - - if ( debug ) dump( stdout, "-> DRAW_TEXT" ); - - /** Find where to draw the text **/ - - text_x = 2 + GLUI_TEXTBOX_BOXINNERMARGINX; - - /** Find lower and upper selection bounds **/ - sel_lo = MIN(sel_start, sel_end ); - sel_hi = MAX(sel_start, sel_end ); - - int sel_x_start, sel_x_end, delta; - - /** Draw selection area dark **/ - if ( sel_start != sel_end ) { - sel_x_start = text_x; - sel_x_end = text_x; - delta = 0; - for( i=substring_start; sel_x_end < (w - text_x) && i<=substring_end; i++ ) { - delta = 0; - if (text[i] == '\t') // Character is a tab, go to next tab stop - while (((delta + sel_x_end) < (w - text_x)) && - (delta == 0 || delta % tab_width)) - delta++; - else - delta = char_width( text[i] ); - - if ( i < sel_lo ) { - sel_x_start += delta; - sel_x_end += delta; - } - else if ( i < sel_hi ) { - sel_x_end += delta; - } - } - - glColor3f( 0.0f, 0.0f, .6f ); - glRecti(sel_x_start, y+5, sel_x_end, y+20); - } - - - if ( sel_start == sel_end ) { // No current selection - x_pos = text_x; - if ( enabled ) - glColor3b( 0, 0, 0 ); - else - glColor3b( 32, 32, 32 ); - - glRasterPos2i( text_x, y+LINE_HEIGHT); - for( i=substring_start; i<=substring_end; i++ ) { - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab - } else { - glutBitmapCharacter( get_font(), this->text[i] ); - x_pos += char_width( this->text[i] ); - } - } - } - else { // There is a selection - x_pos = text_x; - for( i=substring_start; i<=substring_end; i++ ) { - if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { // This character is selected - glColor3f( 1., 1., 1. ); - glRasterPos2i( x_pos, y+LINE_HEIGHT); - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - } - else - glutBitmapCharacter( get_font(), this->text[i] ); - } - else { - glColor3f( 0., 0., 0. ); - glRasterPos2i( x_pos, y+LINE_HEIGHT); - if (this->text[i] == '\t') { // Character is a tab, go to next tab stop - x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; - glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab - } else - glutBitmapCharacter( get_font(), this->text[i] ); - } - - x_pos += char_width( text[i] ); - } - } - - if ( debug ) dump( stdout, "<- DRAW_TEXT" ); -} - - -/******************************** GLUI_TextBox::find_insertion_pt() *********/ -/* This function returns the character number *before which* the insertion */ -/* point goes */ - -int GLUI_TextBox::find_insertion_pt( int x, int y ) -{ - /*** See if we clicked outside box ***/ - if ( x < this->x_abs || y < this->y_abs) - return -1; - - /*** See if we clicked in an empty box ***/ - if ( text.empty() ) - return 0; - - /* update insert variables */ - insert_x = x; - insert_y = y; - - int text_length = text.length()-1; - int box_width = get_box_width(); - - int sol = 0; - int eol = 0; - int line = 0; - - int y_off = y - (y_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); - int x_off = x - (x_abs + 2 + GLUI_TEXTBOX_BOXINNERMARGINX); - - /* Find the line clicked, - The possibility of long lines getting wrapped complicates this. */ - while ((line-start_line+1)*LINE_HEIGHT < y_off && eol < text_length) - { - while (eol < text_length && text[eol] != '\n' && - substring_width(sol, eol+1) <= box_width) - { - eol++; - } - if (text[eol]=='\n' && eol=x_off) { - // did we go far enough? (see if click was >1/2 width of last char) - int decision_pt = prev_w+(total_w-prev_w)/2; - if (x_off>decision_pt) eol++; - } - return eol; - -#if 0 - while (eol < text_length && text[eol] != '\n' && - substring_width(sol, eol+1) < box_width ) - { - eol++; - } - - - /* We move from right to left, looking to see if the mouse was clicked - to the right of the ith character */ -#if 0 - int curr_x = this->x_abs - + substring_width( sol, eol ) - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ -#endif - - /** find mouse click in text **/ - - if (x_off > substring_width(sol, eol)) - return eol; - - for(i = sol; i <= eol+1; i++) { - if (x_off <= substring_width(sol, i)) - return i+1; - } - return 0; -#endif -} - - -int GLUI_TextBox::get_box_width() -{ - return MAX( this->w - - 4 /* 2 * the two-line box border */ - - 2 * GLUI_TEXTBOX_BOXINNERMARGINX, 0 ); - -} - -/******************************** GLUI_TextBox::draw_insertion_pt() *********/ - -void GLUI_TextBox::draw_insertion_pt( void ) -{ - int curr_x, box_width, text_length, eol, sol, line; - - if ( NOT can_draw() ) - return; - - /*** Don't draw insertion pt if control is disabled ***/ - if ( NOT enabled ) - return; - - if ( sel_start != sel_end OR insertion_pt < 0 ) { - return; /* Don't draw insertion point if there is a current selection */ - } - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); - - /* printf( "insertion pt: %d\n", insertion_pt ); */ - - box_width = get_box_width(); - - // This function is unable to distinguish whether an insertion - // point on a line break should be drawn on the line before or the line after. - // This depends on the sequence of operations used to get there, and this - // function just doesn't have that information. If curr_line were kept up - // to date elsewhere that could be used here to disambiguate, but arrow keys - // and such do not update it. - - sol = 0; - eol = 0; - text_length = text.length()-1; - - //while (eol < text_length && text[eol] != '\n' - // && substring_width(sol, eol + 1) < box_width ) - // eol++; - line = 0; - while (eol < insertion_pt && eol <= text_length) - { - if (text[eol] == '\n' || substring_width(sol, eol + 1) >= box_width) - { - eol++; - if (text[eol]=='\n'||eol!=insertion_pt - ||(eol==insertion_pt && eol>0 && text[eol-1]=='\n')) { - sol = eol; - line++; - } - } - else { - eol++; - } - } - - //glColor3f(1,0,0); - //glRecti(0, curr_line*LINE_HEIGHT, 3, (curr_line+1)*LINE_HEIGHT); - - curr_line = line; - - if (scrollbar) - scrollbar->set_int_val(start_line); - if (curr_line < start_line || curr_line > (start_line + visible_lines)) /* Insertion pt out of draw area */ - return; - - curr_x = this->x_abs - + 2 /* The edittext box has a 2-pixel margin */ - + GLUI_TEXTBOX_BOXINNERMARGINX; /** plus this many pixels blank space - between the text and the box **/ - - curr_x += substring_width(sol,insertion_pt-1); - if (insertion_pt == text.length() && text[text.length()-1] == '\n' - || curr_x-this->x_abs > (w - 2 - GLUI_TEXTBOX_BOXINNERMARGINX)) { // Insert on the next line - curr_x = this->x_abs + GLUI_TEXTBOX_BOXINNERMARGINX; - line++; - } - /* update insertion coordinates */ - insert_x = curr_x+5; /* I hate magic numbers too, these offset the imagined insertion point */ - insert_y = (curr_line-start_line+2)*LINE_HEIGHT; - - - glColor3f( 0.0, 0.0, 0.0 ); - glBegin( GL_LINE_LOOP ); - - curr_x -= x_abs; - glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 4 ); - glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 4 ); - glVertex2i( curr_x+1, (curr_line-start_line)*LINE_HEIGHT + 16 ); - glVertex2i( curr_x, (curr_line-start_line)*LINE_HEIGHT + 16 ); - glEnd(); - - - if ( debug ) dump( stdout, "-> DRAW_INS_PT" ); -} - - - - -/******************************** GLUI_TextBox::substring_width() *********/ -int GLUI_TextBox::substring_width( int start, int end, int initial_width ) -{ - // This function only works properly if start is really the start of a line. - // Otherwise tabs will be messed up. - int i, width = initial_width; - - for( i=start; i<=end; i++ ) - if (text[i] == '\t') { // Character is a tab, jump to next tab stop - width += tab_width-(width%tab_width); - //while (width == 0 || width % tab_width) - // width++; - } - else - width += char_width( text[i] ); - - return width; -} - - -/***************************** GLUI_TextBox::update_and_draw_text() ********/ - -void GLUI_TextBox::update_and_draw_text( void ) -{ - //update_substring_bounds(); - /* printf( "ss: %d/%d\n", substring_start, substring_end ); */ - - redraw(); -} - - -/********************************* GLUI_TextBox::special_handler() **********/ - -int GLUI_TextBox::special_handler( int key,int modifiers ) -{ - int tmp_insertion_pt; - if ( NOT glui ) - return false; - - if ( debug ) - printf( "SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", - key, modifiers, substring_start, substring_end,insertion_pt, - sel_start, sel_end ); - - if ( key == GLUT_KEY_DOWN ) { - if (insert_x == -1 || insert_y == -1) - return false; - tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y+LINE_HEIGHT); - if (tmp_insertion_pt < 0) - return false; - insertion_pt = tmp_insertion_pt; - sel_end = insertion_pt; - if (!(modifiers & GLUT_ACTIVE_SHIFT)) { - sel_start = sel_end; - } - if ( can_draw()) - update_and_draw_text(); - } else if ( key == GLUT_KEY_UP ) { - if (insert_x == -1 || insert_y == -1) - return false; - tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y-LINE_HEIGHT); - if (tmp_insertion_pt < 0) - return false; - insertion_pt = tmp_insertion_pt; - sel_end = insertion_pt; - if (!(modifiers & GLUT_ACTIVE_SHIFT)) { - sel_start = sel_end; - } - if ( can_draw()) - update_and_draw_text(); - } else if ( key == GLUT_KEY_LEFT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, -1 ); - } - else { - insertion_pt--; - } - // update keygoal_x! - } - else if ( key == GLUT_KEY_RIGHT ) { - if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { - insertion_pt = find_word_break( insertion_pt, +1 ); - } - else { - insertion_pt++; - } - // update keygoal_x! - } - else if ( key == GLUT_KEY_HOME ) { - insertion_pt = 0; - // update keygoal_x! - } - else if ( key == GLUT_KEY_END ) { - insertion_pt = text.length(); - // update keygoal_x! - } - - /*** Update selection if shift key is down ***/ - if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) - sel_end = insertion_pt; - else - sel_start = sel_end = insertion_pt; - - - CLAMP( insertion_pt, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_start, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - CLAMP( sel_end, 0, (int)text.length()); /* Make sure insertion_pt - is in bounds */ - - /******** Now redraw text ***********/ - if ( can_draw()) - update_and_draw_text(); - - return true; -} - - -/****************************** GLUI_TextBox::find_word_break() **********/ -/* It looks either left or right (depending on value of 'direction' */ -/* for the beginning of the next 'word', where word are characters */ -/* separated by one of the following tokens: " :-.," */ -/* If there is no next word in the specified direction, this returns */ -/* the beginning of 'text', or the very end. */ - -int GLUI_TextBox::find_word_break( int start, int direction ) -{ - int i, j; - char breaks[] = " \n\t:-.,"; - int num_break_chars = (int)strlen(breaks), text_len = text.length(); - int new_pt; - - /** If we're moving left, we have to start two back, in case we're either - already at the beginning of a word, or on a separating token. - Otherwise, this function would just return the word we're already at **/ - if ( direction == -1 ) { - start -= 2; - } - - /***** Iterate over text in the specified direction *****/ - for ( i=start; i >= 0 AND i < text_len; i += direction ) { - - /** For each character in text, iterate over list of separating tokens **/ - for( j=0; j 0 ) /* Return the end of string */ - return text_len; - else /* Return the beginning of the text */ - return 0; -} - - -/********************************** GLUI_TextBox::clear_substring() ********/ - -void GLUI_TextBox::clear_substring( int start, int end ) -{ - text.erase(start,end-start); -} - - - -/************************************ GLUI_TextBox::update_size() **********/ - -void GLUI_TextBox::update_size( void ) -{ - if ( NOT glui ) - return; - - if ( w < GLUI_TEXTBOX_MIN_TEXT_WIDTH ) - w = GLUI_TEXTBOX_MIN_TEXT_WIDTH; -} - - -/****************************** GLUI_TextBox::set_text() **********/ - -void GLUI_TextBox::set_text( const char *new_text ) -{ - text = new_text; - - substring_start = 0; - substring_end = text.length() - 1; - insertion_pt = -1; - sel_start = 0; - sel_end = 0; - visible_lines = 0; - start_line = 0; - curr_line = 0; - num_lines = 0; - - if ( can_draw() ) - update_and_draw_text(); - - /*** Now update the live variable ***/ - output_live(true); -} - - -/*************************************** GLUI_TextBox::dump() **************/ - -void GLUI_TextBox::dump( FILE *out, char *name ) -{ - fprintf( out, - "%s (edittext@%p): line:%d ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", - name, this, curr_line, - insertion_pt, substring_start, substring_end, sel_start, sel_end, - text.length()); -} - - -/**************************************** GLUI_TextBox::mouse_over() ********/ - -int GLUI_TextBox::mouse_over( int state, int x, int y ) -{ - if ( state && enabled) { - /* curr_cursor = GLUT_CURSOR_TEXT; */ - glutSetCursor( GLUT_CURSOR_TEXT ); - } - else { - /* printf( "OUT\n" ); */ - glutSetCursor( GLUT_CURSOR_LEFT_ARROW ); - } - - return true; -} - -void GLUI_TextBox::scrollbar_callback(GLUI_Control *my_scrollbar) { - GLUI_Scrollbar *sb = dynamic_cast(my_scrollbar); - if (!sb) return; - GLUI_TextBox* me = (GLUI_TextBox*) sb->associated_object; - if (me->scrollbar == NULL) - return; - int new_start_line = sb->get_int_val(); // ?? - me->start_line = new_start_line; - if (new_start_line < (me->curr_line - me->visible_lines)) - me->curr_line = new_start_line + me->visible_lines; - if (new_start_line > me->curr_line) - me->curr_line = new_start_line; - if ( me->can_draw() ) - me->update_and_draw_text(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_translation.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_translation.cpp deleted file mode 100644 index 5739b28cb..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_translation.cpp +++ /dev/null @@ -1,566 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_translation - GLUI_Translation control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#include "GL/glui.h" -#include "glui_internal.h" -#include "algebra3.h" - -/********************** GLUI_Translation::GLUI_Translation() ***/ - -GLUI_Translation::GLUI_Translation( - GLUI_Node *parent, const char *name, - int trans_t, float *value_ptr, - int id, GLUI_CB cb ) -{ - common_init(); - - set_ptr_val( value_ptr ); - user_id = id; - set_name( name ); - callback = cb; - parent->add_control( this ); - //init_live(); - - trans_type = trans_t; - - if ( trans_type == GLUI_TRANSLATION_XY ) { - float_array_size = 2; - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - float_array_size = 1; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - float_array_size = 1; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - float_array_size = 1; - } - init_live(); -} - -/********************** GLUI_Translation::iaction_mouse_down_handler() ***/ -/* These are really in local coords (5/10/99) */ - -int GLUI_Translation::iaction_mouse_down_handler( int local_x, - int local_y ) -{ - int center_x, center_y; - - down_x = local_x; - down_y = local_y; - - if ( trans_type == GLUI_TRANSLATION_XY ) { - orig_x = float_array_val[0]; - orig_y = float_array_val[1]; - - /** Check if the Alt key is down, which means lock to an axis **/ - - center_x = w/2; - center_y = (h-18)/2; - - if ( glui->curr_modifiers & GLUT_ACTIVE_ALT ) { - if ( ABS(local_y-center_y) > ABS(local_x-center_x) ) { - locked = GLUI_TRANSLATION_LOCK_Y; - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - } - else { - locked = GLUI_TRANSLATION_LOCK_X; - glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); - } - } - else { - locked = GLUI_TRANSLATION_LOCK_NONE; - glutSetCursor( GLUT_CURSOR_SPRAY ); - } - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - glutSetCursor( GLUT_CURSOR_LEFT_RIGHT ); - orig_x = float_array_val[0]; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - orig_y = float_array_val[0]; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - glutSetCursor( GLUT_CURSOR_UP_DOWN ); - orig_z = float_array_val[0]; - } - - trans_mouse_code = 1; - redraw(); - - return false; -} - - -/*********************** GLUI_Translation::iaction_mouse_up_handler() **********/ - -int GLUI_Translation::iaction_mouse_up_handler( int local_x, int local_y, - bool inside ) -{ - trans_mouse_code = GLUI_TRANSLATION_MOUSE_NONE; - locked = GLUI_TRANSLATION_LOCK_NONE; - - redraw(); - - return false; -} - - -/******************* GLUI_Translation::iaction_mouse_held_down_handler() ******/ - -int GLUI_Translation::iaction_mouse_held_down_handler( int local_x, int local_y, - bool inside) -{ - float x_off, y_off; - float off_array[2]; - - x_off = scale_factor * (float)(local_x - down_x); - y_off = -scale_factor * (float)(local_y - down_y); - - if ( glui->curr_modifiers & GLUT_ACTIVE_SHIFT ) { - x_off *= 100.0f; - y_off *= 100.0f; - } - else if ( glui->curr_modifiers & GLUT_ACTIVE_CTRL ) { - x_off *= .01f; - y_off *= .01f; - } - - - if ( trans_type == GLUI_TRANSLATION_XY ) { - - if ( locked == GLUI_TRANSLATION_LOCK_X ) - y_off = 0.0; - else if ( locked == GLUI_TRANSLATION_LOCK_Y ) - x_off = 0.0; - - off_array[0] = x_off + orig_x; - off_array[1] = y_off + orig_y; - } - else if ( trans_type == GLUI_TRANSLATION_X ) { - off_array[0] = x_off + orig_x; - } - else if ( trans_type == GLUI_TRANSLATION_Y ) { - off_array[0] = y_off + orig_y; - } - else if ( trans_type == GLUI_TRANSLATION_Z ) { - off_array[0] = y_off + orig_z; - } - - set_float_array_val( (float*) &off_array[0] ); - - return false; -} - - -/******************** GLUI_Translation::iaction_draw_active_area_persp() **************/ - -void GLUI_Translation::iaction_draw_active_area_persp( void ) -{ -} - - -/******************** GLUI_Translation::iaction_draw_active_area_ortho() **********/ - -void GLUI_Translation::iaction_draw_active_area_ortho( void ) -{ - /********* Draw emboss circles around arcball control *********/ - float radius; - radius = (float)(h-22)/2.0; /* MIN((float)w/2.0, (float)h/2.0); */ - glLineWidth( 1.0 ); - - draw_emboss_box( (int) -radius-2, (int)radius+2, - (int)-radius-2, (int)radius+2 ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glTranslatef( .5, .5, .5 ); - /* glScalef( radius-1.0, radius-1.0, radius-1.0 ); */ - if ( trans_type == GLUI_TRANSLATION_Z ) - draw_2d_z_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_XY ) - draw_2d_xy_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_X ) - draw_2d_x_arrows((int)radius-1); - else if ( trans_type == GLUI_TRANSLATION_Y ) - draw_2d_y_arrows((int)radius-1); - - glPopMatrix(); -} - - -/******************************** GLUI_Translation::iaction_dump() **********/ - -void GLUI_Translation::iaction_dump( FILE *output ) -{ -} - - -/******************** GLUI_Translation::iaction_special_handler() **********/ - -int GLUI_Translation::iaction_special_handler( int key,int modifiers ) -{ - - return false; -} - - - -/*************************** GLUI_Translation::draw_2d_z_arrows() **************/ - -void GLUI_Translation::draw_2d_z_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 2); - draw_2d_arrow(radius, true, 0); - } - else { - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, false, 0); - } -} - - -/*************************** GLUI_Translation::draw_2d_x_arrows() **************/ - -void GLUI_Translation::draw_2d_x_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 3); - } - else { - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 3); - } -} - - -/*************************** GLUI_Translation::draw_2d_y_arrows() **************/ - -void GLUI_Translation::draw_2d_y_arrows( int radius ) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 2); - } - else { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 2); - } -} - - -/************************** GLUI_Translation::draw_2d_xy_arrows() **************/ - -void GLUI_Translation::draw_2d_xy_arrows( int radius) -{ - if ( trans_mouse_code != GLUI_TRANSLATION_MOUSE_NONE ) { - if ( locked == GLUI_TRANSLATION_LOCK_X ) { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 3); - } - else if ( locked == GLUI_TRANSLATION_LOCK_Y ) { - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 3); - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 2); - } - else { - draw_2d_arrow(radius, true, 0); - draw_2d_arrow(radius, true, 1); - draw_2d_arrow(radius, true, 2); - draw_2d_arrow(radius, true, 3); - } - } - else { - draw_2d_arrow(radius, false, 0); - draw_2d_arrow(radius, false, 1); - draw_2d_arrow(radius, false, 2); - draw_2d_arrow(radius, false, 3); - } - - return; -} - - -/*************************** GLUI_Translation::draw_2d_arrow() **************/ -/* ori: 0=up, 1=left, 2=down, 3=right */ -/* */ -/* */ -/* 0, y2 */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* / \ */ -/* -x2,y1 -x1b,y1 x1b,y1 x2,y1 */ -/* | | */ -/* | | */ -/* | | */ -/* | | */ -/* | | */ -/* -x1a,y0 x1a,y0 */ -/* */ - - -void GLUI_Translation::draw_2d_arrow( int radius, int filled, int orientation ) -{ - float x1 = .2, x2 = .4, y1 = .54, y2 = .94, y0; - float x1a, x1b; -/* - vec3 col1( 0.0, 0.0, 0.0 ), col2( .45, .45, .45 ), - col3( .7, .7, .7 ), col4( 1.0, 1.0, 1.0 ); - vec3 c1, c2, c3, c4, c5, c6; -*/ - vec3 white(1.0,1.0,1.0), black(0.0,0.0,0.0), gray(.45,.45,.45), - bkgd(.7,.7,.7); - int c_off=0; /* color index offset */ - - if ( glui ) - bkgd.set(glui->bkgd_color_f[0], - glui->bkgd_color_f[1], - glui->bkgd_color_f[2]); - - /* bkgd[0] = 255.0; bkgd[1] = 0; */ - - /** The following 8 colors define the shading of an octagon, in - clockwise order, starting from the upstroke on the left **/ - /** This is for an outside and inside octagons **/ - vec3 colors_out[]={white, white, white, gray, black, black, black, gray}; - vec3 colors_in[] ={bkgd,white,bkgd,gray,gray,gray,gray,gray}; - -#define SET_COL_OUT(i) glColor3fv((float*) &colors_out[(i)%8][0]); -#define SET_COL_IN(i) glColor3fv((float*) &colors_in[(i)%8][0]); - - x1 = (float)radius * .2; - x2 = x1 * 2; - y1 = (float)radius * .54; - y2 = y1 + x2; - x1a = x1; - x1b = x1; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - -#define DRAW_SEG( xa,ya,xb,yb ) glVertex2f(xa,ya); glVertex2f(xb,yb); - - glScalef( -1.0, 1.0, 1.0 ); - - if ( orientation == 2 ) { - c_off = 4; - } - else if ( orientation == 0 ) { - c_off = 0; - glRotatef( 180.0, 0.0, 0.0, 1.0 ); - } - else if ( orientation == 1 ) { - c_off = 2; - glRotatef( 90.0, 0.0, 0.0, 1.0 ); - } - else if ( orientation == 3 ) { - c_off = 6; - glRotatef( -90.0, 0.0, 0.0, 1.0 ); - } - - if ( trans_type == GLUI_TRANSLATION_Z ) - y0 = 0.0; - else if ( trans_type == GLUI_TRANSLATION_XY ) - y0 = x1; - else - y0 = 0.0; - - - if ( trans_type == GLUI_TRANSLATION_Z ) { - if ( orientation == 0 ) { - y1 += 2.0; - y2 += 0.0; - - x1b -= 2.0; - x2 -= 2.0; - x1a += 2.0; - } - else if ( orientation == 2 ) { - y1 -= 6.0; - x1a += 2.0; - x1b += 4.0; - x2 += 6.0; - } - } - - /*** Fill in inside of arrow ***/ - if ( NOT filled ) { /*** Means button is up - control is not clicked ***/ - /*glColor3f( .8, .8, .8 ); */ - set_to_bkgd_color(); - glColor3f( bkgd[0]+.07, bkgd[1]+.07, bkgd[2]+.07 ); - } - else { /*** Button is down on control ***/ - glColor3f( .6, .6, .6 ); - c_off += 4; /* Indents the shadows - goes from a raised look to embossed */ - } - - /*** Check if control is enabled or not ***/ - if ( NOT enabled ) { - set_to_bkgd_color(); - /*c_off += 4; -- Indents the shadows - goes from a raised look to embossed */ - colors_out[0] = colors_out[1] = colors_out[2] = colors_out[7] = gray; - colors_out[3] = colors_out[4] = colors_out[5] = colors_out[6] = white; - colors_in[0] = colors_in[1] = colors_in[2] = colors_in[7] = white; - colors_in[3] = colors_in[4] = colors_in[5] = colors_in[6] = gray; - - } - - glBegin( GL_POLYGON ); - glVertex2f( 0.0, 0.0 ); glVertex2f( -x1a, 0.0 ); - glVertex2f( -x1a, 0.0 ); glVertex2f( -x1b, y1 ); - glVertex2f( x1b, y1); glVertex2f( x1a, 0.0 ); - glVertex2f( x1a, 0.0 ); glVertex2f( 0.0, 0.0 ); - glEnd(); - glBegin( GL_TRIANGLES ); - glVertex2f( -x2, y1 ); glVertex2f( 0.0, y2 ); glVertex2f( x2, y1 ); - glEnd(); - - glLineWidth( 1.0 ); - /*** Draw arrow outline ***/ - glBegin( GL_LINES ); - - SET_COL_IN(1+c_off); DRAW_SEG( 0.0, y2-1.0, -x2, y1-1.0 ); - SET_COL_IN(6+c_off); DRAW_SEG( -x2+2.0, y1+1.0, -x1b+1.0, y1+1.0 ); - SET_COL_IN(0+c_off); DRAW_SEG( -x1b+1.0, y1+1.0, -x1a+1.0, y0 ); - SET_COL_IN(3+c_off); DRAW_SEG( 0.0, y2-1.0, x2, y1-1.0 ); - SET_COL_IN(6+c_off); DRAW_SEG( x2-1.0, y1+1.0, x1b-1.0, y1+1.0 ); - SET_COL_IN(4+c_off); DRAW_SEG( x1b-1.0, y1+1.0, x1a-1.0, y0 ); - - SET_COL_OUT(0+c_off); DRAW_SEG( -x1a, y0, -x1b, y1 ); - SET_COL_OUT(6+c_off); DRAW_SEG( -x1b, y1, -x2, y1 ); - SET_COL_OUT(1+c_off); DRAW_SEG( -x2, y1, 0.0, y2 ); - SET_COL_OUT(3+c_off); DRAW_SEG( 0.0, y2, x2, y1 ); - SET_COL_OUT(6+c_off); DRAW_SEG( x2, y1, x1b, y1 ); - SET_COL_OUT(4+c_off); DRAW_SEG( x1b, y1, x1a, y0 ); - - glEnd(); - -#undef DRAW_SEG - - glPopMatrix(); -} - - -/*************************** GLUI_Translation::get_mouse_code() *************/ - -int GLUI_Translation::get_mouse_code( int x, int y ) -{ - if ( x == 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN; - else if ( x == 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_UP; - else if ( x > 0 AND y == 0 ) - return GLUI_TRANSLATION_MOUSE_LEFT; - else if ( x < 0 AND y == 0 ) - return GLUI_TRANSLATION_MOUSE_RIGHT; - else if ( x < 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN_LEFT; - else if ( x < 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_DOWN_RIGHT; - else if ( x > 0 AND y < 0 ) - return GLUI_TRANSLATION_MOUSE_UP_LEFT; - else if ( x > 0 AND y > 0 ) - return GLUI_TRANSLATION_MOUSE_UP_RIGHT; - - - return GLUI_TRANSLATION_MOUSE_NONE; -} - - -/*********************************** GLUI_Translation::set_x() ******/ - -void GLUI_Translation::set_x( float val ) -{ - set_one_val( val, 0 ); -} - - -/*********************************** GLUI_Translation::set_y() ******/ - -void GLUI_Translation::set_y( float val ) -{ - if ( trans_type == GLUI_TRANSLATION_XY ) - set_one_val( val, 1 ); - else - set_one_val( val, 0 ); -} - - -/*********************************** GLUI_Translation::set_z() ******/ - -void GLUI_Translation::set_z( float val ) -{ - set_one_val( val, 0 ); -} - - -/******************************* GLUI_Translation::set_one_val() ****/ - -void GLUI_Translation::set_one_val( float val, int index ) -{ - float *fp; - - float_array_val[index] = val; /* set value in array */ - - /*** The code below is like output_live, except it only operates on - a single member of the float array (given by 'index') instead of - outputting the entire array ****/ - - if ( ptr_val == NULL OR NOT live_inited ) - return; - - fp = (float*) ptr_val; - fp[index] = float_array_val[index]; - last_live_float_array[index] = float_array_val[index]; - - /** Update the main gfx window? **/ - if ( this->glui != NULL ) { - this->glui->post_update_main_gfx(); - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_tree.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_tree.cpp deleted file mode 100644 index 4385414c2..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_tree.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/**************************************************************************** - - GLUI User Interface Toolkit - --------------------------- - - glui_panel.cpp - GLUI_Panel control class - - - -------------------------------------------------- - - Copyright (c) 1998 Paul Rademacher - - This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. - -*****************************************************************************/ - -#include "glui_internal_control.h" - - -/****************************** GLUI_Tree::GLUI_Tree() **********/ -GLUI_Tree::GLUI_Tree(GLUI_Node *parent, const char *name, - int open, int inset) -{ - common_init(); - GLUI_StaticText *inset_label; - GLUI_Column *col; - - this->set_name( name ); - this->user_id = -1; - - if ( NOT open ) { - this->is_open = false; - this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - } - - parent->add_control( this ); - inset_label = new GLUI_StaticText(this,""); - inset_label->set_w(inset); - col = new GLUI_Column(this,true); - this->set_column(col); - this->set_alignment(GLUI_ALIGN_LEFT); -} - - -/****************************** GLUI_Tree::open() **********/ - -void GLUI_Tree::open( void ) -{ - if ( is_open ) - return; - is_open = true; - - GLUI_DRAWINGSENTINAL_IDIOM - - child_head = collapsed_node.child_head; - child_tail = collapsed_node.child_tail; - - collapsed_node.child_head = NULL; - collapsed_node.child_tail = NULL; - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->unhide_internal( true ); - } - - glui->refresh(); -} - - -/****************************** GLUI_Tree::close() **********/ - -void GLUI_Tree::close( void ) -{ - if ( NOT glui ) - return; - - if ( NOT is_open ) - return; - is_open = false; - - GLUI_DRAWINGSENTINAL_IDIOM - - if ( child_head != NULL ) { - ((GLUI_Control*) child_head)->hide_internal( true ); - } - - collapsed_node.child_head = first_child(); - collapsed_node.child_tail = last_child(); - - child_head = NULL; - child_tail = NULL; - - this->h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - - glui->refresh(); -} - - -/**************************** GLUI_Tree::mouse_down_handler() **********/ - - -int GLUI_Tree::mouse_down_handler( int local_x, int local_y ) -{ - if ( local_y - y_abs > 18 ) { - initially_inside = currently_inside = false; - return false; - } - - currently_inside = true; - initially_inside = true; - redraw(); - - return false; -} - -/**************************** GLUI_Tree::mouse_held_down_handler() ****/ - -int GLUI_Tree::mouse_held_down_handler( - int local_x, int local_y, - bool new_inside ) -{ - if ( NOT initially_inside ) - return false; - - if ( local_y - y_abs> 18 ) - new_inside = false; - - if (currently_inside != new_inside) - redraw(); - - return false; -} - - -/**************************** GLUI_Tree::mouse_down_handler() **********/ - -int GLUI_Tree::mouse_up_handler( int local_x, int local_y, bool inside ) -{ - if ( currently_inside ) { - if ( is_open ) - close(); - else - open(); - } - - currently_inside = false; - initially_inside = false; - redraw(); - - return false; -} - - -/********************************* GLUI_Tree::draw() ***********/ - -void GLUI_Tree::draw( int x, int y ) -{ - GLUI_DRAWINGSENTINAL_IDIOM - int left, right, top, bottom, delta_x; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - delta_x = 0; - - glui->draw_raised_box( left, top, 16, 16 ); - - if ( glui ) - glColor3ub(glui->bkgd_color.r,glui->bkgd_color.g,glui->bkgd_color.b); - glDisable( GL_CULL_FACE ); - glBegin( GL_QUADS ); - glVertex2i( left+17, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+17, bottom-1 ); - glEnd(); - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - delta_x = string_width( level_name ) + char_width(' '); - glColor3f( lred, lgreen, lblue); /* The hierarchy is drawn in bold */ - glRasterPos2i(left + 25, top + 11); - draw_string(level_name); - glRasterPos2i(left + 24, top + 11); - draw_string(level_name); - } - - draw_name( delta_x+left+24, top+11 ); - - if ( active ) - draw_active_box( left+22, delta_x+left+string_width( name )+32, - top, bottom-2 ); - - - /** Draw '+' or '-' **/ - - glBegin( GL_LINES ); - if ( is_open ) { - if ( enabled ) - if (is_current) - glColor3f( 0, 0, 1 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - else - glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); - - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(left+4,1+(top+bottom)/2);glVertex2i(left+13,1+(top+bottom)/2); - } - else - { - glColor3f( 1.0, 1.0, 1.0 ); - glVertex2i(left+9,top+3); glVertex2i(left+9,bottom-4); - glVertex2i(left+4,(top+bottom)/2); glVertex2i(left+13,(top+bottom)/2); - - if ( enabled ) - if (is_current) - glColor3f( 0, 0, 1 ); - else - glColor3f( 0.0, 0.0, 0.0 ); - else - glColor3f( 0.5, 0.5, 0.5 ); - glVertex2i(left+4,-1+(top+bottom)/2); - glVertex2i(left+13,-1+(top+bottom)/2); - glVertex2i(left+8,top+3); - glVertex2i(left+8,bottom-4); - } - glEnd(); - - glLineWidth( 1.0 ); - - if (currently_inside) draw_pressed(); -} - - -/***************************** GLUI_Tree::update_size() **********/ - -void GLUI_Tree::update_size( void ) -{ - int text_size = 0, delta_x = 0; - - if ( NOT glui ) - return; - - text_size = string_width(name); - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - delta_x = string_width( level_name ); - } - - if ( w < text_size + 36 + delta_x) - w = text_size + 36 + delta_x; -} - - -/**************************** GLUI_Tree::draw_pressed() ***********/ - -void GLUI_Tree::draw_pressed( void ) -{ - int left, right, top, bottom; - - left = 5; - right = w-left; - top = 3; - bottom = 3+16; - - glColor3f( 0.0, 0.0, 0.0 ); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left, top ); glVertex2i( right, top ); - glVertex2i( right, bottom ); glVertex2i( left,bottom ); - glEnd(); - - glBegin( GL_LINE_LOOP ); - glVertex2i( left+1, top+1 ); glVertex2i( right-1, top+1 ); - glVertex2i( right-1, bottom-1 ); glVertex2i( left+1,bottom-1 ); - glEnd(); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_treepanel.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_treepanel.cpp deleted file mode 100644 index 052aaca9c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_treepanel.cpp +++ /dev/null @@ -1,394 +0,0 @@ -#include "GL/glui.h" - - -/****************************** GLUI_TreePanel::GLUI_TreePanel() *********/ - -GLUI_TreePanel::GLUI_TreePanel(GLUI_Node *parent, const char *name, - bool open, int inset) -{ - common_init(); - - set_name( name ); - user_id = -1; - - if ( !open ) { - is_open = false; - h = GLUI_DEFAULT_CONTROL_HEIGHT + 7; - } - - parent->add_control( this ); -} - -/****************************** GLUI_TreePanel::set_color() *********/ - -void GLUI_TreePanel::set_color(float r, float g, float b) -{ - red = r; - green = g; - blue = b; - redraw(); -} - -/************************ GLUI_TreePanel::set_level_color() *********/ - -void GLUI_TreePanel::set_level_color(float r, float g, float b) -{ - lred = r; - lgreen = g; - lblue = b; - redraw(); -} - -/****************************** GLUI_TreePanel::ab() *********/ - -/* Adds branch to curr_root */ -GLUI_Tree *GLUI_TreePanel::ab(const char *name, GLUI_Tree *root) -{ - GLUI_Tree *temp; - - - if (root != NULL) { - resetToRoot(root); - } - - temp = new GLUI_Tree(curr_root, name); - initNode(temp); - formatNode(temp); - - curr_root = temp; - curr_branch = NULL; /* Currently at leaf */ - - if (dynamic_cast(temp)) - ((GLUI_Tree *)temp)->set_current(true); - //refresh(); - // glui->deactivate_current_control(); - //glui->activate_control( temp, GLUI_ACTIVATE_TAB ); - return temp; - -} - -/****************************** GLUI_TreePanel::fb() *********/ - -/* Goes up one level, resets curr_root and curr_branch to parents*/ -void GLUI_TreePanel::fb(GLUI_Tree *branch) -{ - if (((GLUI_Panel *)branch) == ((GLUI_Panel *)this)) - return; - - if (((GLUI_Panel *)curr_branch) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - if (((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - - if (branch != NULL) { - - if ( dynamic_cast(branch) ) - ((GLUI_Tree *)branch)->set_current(false); - - curr_branch = (GLUI_Tree *)branch->next(); - curr_root = (GLUI_Panel *)branch->parent(); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - if ( dynamic_cast(curr_root) ) - ((GLUI_Tree *)curr_root)->set_current(true); - - } else { - if (curr_root != NULL) { /* up one parent */ - - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->set_current(false); - - curr_branch = (GLUI_Tree *) curr_root->next(); - curr_root = (GLUI_Panel *) curr_root->parent(); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->set_current(true); - - } - - } - //refresh(); -} - - -/****************************** GLUI_TreePanel::refresh() *********/ - -void GLUI_TreePanel::refresh() -{ - glui->deactivate_current_control(); - glui->activate_control( curr_root, GLUI_ACTIVATE_TAB ); - - redraw(); -} - -/****************************** GLUI_TreePanel::initNode() *********/ - -void GLUI_TreePanel::initNode(GLUI_Tree *temp) -{ - if (temp == NULL) - return; - int level = temp->get_level(); - int child_number = 1; - - GLUI_Tree *ptree = dynamic_cast(temp->parent()); - if (ptree) { - level = ptree->get_level() + 1; - GLUI_Tree *prevTree = dynamic_cast(temp->prev()); - if (prevTree) { - child_number = prevTree->get_child_number() + 1; - } - } else if (dynamic_cast(temp) && - dynamic_cast(temp->parent())) { - child_number = ++root_children; - } - temp->set_id(uniqueID()); // -1 if unset - temp->set_level(level); - temp->set_child_number(child_number); -} - -/****************************** GLUI_TreePanel::formatNode() *********/ - -void GLUI_TreePanel::formatNode(GLUI_Tree *temp) -{ - if (temp == NULL) - return; - int level = temp->get_level(); - int child_number = temp->get_child_number(); - GLUI_String level_name=""; - GLUI_String full_name=""; - - temp->level_name == ""; - - if (format & GLUI_TREEPANEL_DISPLAY_HIERARCHY) { - if (format & GLUI_TREEPANEL_HIERARCHY_LEVEL_ONLY) { - glui_format_str(level_name, "%d", level); - } - if (format & GLUI_TREEPANEL_HIERARCHY_NUMERICDOT) { - if ( dynamic_cast(temp->parent()) ) - glui_format_str(level_name, "%s.%d", - ((GLUI_Tree *)(temp->parent()))->level_name.c_str(), - child_number); - else - glui_format_str(level_name, "%d", child_number); - } - } - - temp->set_level_color(lred, lgreen, lblue); - temp->set_format(format); - temp->level_name = level_name; - - if (format & GLUI_TREEPANEL_ALTERNATE_COLOR) { - switch (level%8) { - case (7): temp->set_color(.5,.5,.5); break; - case (6): temp->set_color(.3,.5,.5); break; - case (5): temp->set_color(.5,.3,.5); break; - case (4): temp->set_color(.3,.3,.5); break; - case (3): temp->set_color(.5,.5,.3); break; - case (2): temp->set_color(.3,.5,.3); break; - case (1): temp->set_color(.5,.3,.3); break; - default: temp->set_color(.3,.3,.3); - } - } else { - temp->set_color(red,green,blue); - } - - if (format & GLUI_TREEPANEL_DISABLE_BAR) { - temp->disable_bar(); - } else { - if (format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { - temp->disable_bar(); - if ( dynamic_cast(curr_root) ) - ((GLUI_Tree *)curr_root)->enable_bar(); - } else - if (format & GLUI_TREEPANEL_CONNECT_CHILDREN_ONLY) { - temp->disable_bar(); - if (temp->prev() && dynamic_cast(temp->prev()) ) - { - ((GLUI_Tree *)temp->prev())->enable_bar(); - } - } - } -} - -/****************************** GLUI_TreePanel::update_all() *********/ - -void GLUI_TreePanel::update_all() -{ - printf("GLUI_TreePanel::update_all() doesn't work yet. - JVK\n"); - return; - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - root_children = 0; - resetToRoot(this); - if (curr_branch && dynamic_cast(curr_branch)) - formatNode((GLUI_Tree *)curr_branch); - next(); - while (curr_root && curr_branch != this->first_child()) { - if (curr_branch && dynamic_cast(curr_branch)) { - formatNode((GLUI_Tree *)curr_branch); - } - next(); - } - curr_root = saved_root; - curr_branch = saved_branch; -} - -/****************************** GLUI_TreePanel::expand_all() *********/ - -void GLUI_TreePanel::expand_all() -{ - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - - resetToRoot(this); - if (dynamic_cast(curr_root)) - ((GLUI_Tree*)curr_root)->open(); - next(); - while (curr_root != NULL && curr_branch != this->first_child()) { - if (dynamic_cast(curr_root)) - ((GLUI_Tree*)curr_root)->open(); - next(); - } - - curr_root = saved_root; - curr_branch = saved_branch; -} - -/****************************** GLUI_TreePanel::collapse_all() *********/ - -void GLUI_TreePanel::collapse_all() -{ - GLUI_Panel *saved_root = curr_root; - GLUI_Tree *saved_branch = curr_branch; - - resetToRoot(this); - next(); - while (curr_root != NULL && curr_branch != this->first_child()) { - if (dynamic_cast(curr_root) && - curr_branch == NULL) { /* we want to close everything leaf-first */ - ((GLUI_Tree*)curr_root)->close(); - /* Rather than simply next(), we need to manually move the - curr_root because this node has been moved to the - collapsed_node list */ - curr_branch = (GLUI_Tree *)curr_root->next(); - curr_root = (GLUI_Panel *)curr_root->parent(); - } else - next(); - } - - curr_root = saved_root; - curr_branch = saved_branch; - -} - -/****************************** GLUI_TreePanel::db() *********/ - -/* Deletes the curr_root */ -void GLUI_TreePanel::db(GLUI_Tree *root) -{ - GLUI_Tree *temp_branch; - GLUI_Panel *temp_root; - - if (((GLUI_Control *)root) == ((GLUI_Control *)this)) - return; - - if (root != NULL) { - curr_root = (GLUI_Tree *)root; - curr_branch = NULL; - } - - if (curr_root == NULL || ((GLUI_Panel *)curr_root) == ((GLUI_Panel *)this)) { - resetToRoot(); - return; - } - - - temp_branch = (GLUI_Tree *)curr_root->next(); /* Next branch, if any */ - temp_root = (GLUI_Panel *)curr_root->parent(); /* new root */ - curr_root->unlink(); - delete curr_root; - curr_branch = (GLUI_Tree *) temp_branch; - curr_root = (GLUI_Panel *) temp_root; - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->open(); - - if ((format & GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) == GLUI_TREEPANEL_DISABLE_DEEPEST_BAR) { - if (dynamic_cast(curr_root) && ((GLUI_Tree *)curr_root->next()) == NULL) - ((GLUI_Tree *)curr_root)->disable_bar(); - } - //refresh(); -} - -/****************************** GLUI_TreePanel::descendBranch() *********/ - -/* Finds the very last branch of curr_root, resets vars */ -void GLUI_TreePanel::descendBranch(GLUI_Panel *root) { - if (root) - resetToRoot(root); - else - resetToRoot(curr_root); - if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->set_current(false); - descendBranch(curr_branch); - } -} - -/****************************** GLUI_TreePanel::next() *********/ - -void GLUI_TreePanel::next() -{ - if (curr_root == NULL) - resetToRoot(this); - - if (curr_branch == NULL && (curr_root->collapsed_node).first_child() != NULL) - curr_branch = (GLUI_Tree *)(curr_root->collapsed_node).first_child(); - - - if (curr_branch != NULL && curr_branch != ((GLUI_Panel *)this)) { /* Descend into branch */ - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->set_current(false); - resetToRoot(curr_branch); - } else if (curr_branch == NULL) { - fb(NULL); /* Backup and move on */ - } -} - -/****************************** GLUI_TreePanel::resetToRoot() *********/ - -/* Resets curr_root and curr branch to TreePanel and lastChild */ -void GLUI_TreePanel::resetToRoot(GLUI_Panel *new_root) -{ - GLUI_Panel *root = this; - if (new_root != NULL) - root = new_root; - curr_root = root; - if (dynamic_cast(curr_root)) - ((GLUI_Tree *)curr_root)->set_current(true); - curr_branch = (GLUI_Tree *)root->first_child(); - - /* since Trees are collapsable, we need to check the collapsed nodes - in case the curr_root is collapsed */ - if (curr_branch == NULL && (root->collapsed_node).first_child() != NULL) { - curr_branch = (GLUI_Tree *)(root->collapsed_node).first_child(); - } - while (curr_branch && dynamic_cast(curr_branch)) { - curr_branch=(GLUI_Tree *)curr_branch->next(); - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_window.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_window.cpp deleted file mode 100644 index da7acef83..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/glui_window.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - - glui_window.cpp - GLUI_Button control class - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - -#include "GL/glui.h" -#include "glui_internal.h" - -GLUI_Glut_Window::GLUI_Glut_Window() -: GLUI_Node(), - - glut_window_id(0), - glut_keyboard_CB(NULL), - glut_special_CB(NULL), - glut_reshape_CB(NULL), - glut_passive_motion_CB(NULL), - glut_mouse_CB(NULL), - glut_visibility_CB(NULL), - glut_motion_CB(NULL), - glut_display_CB(NULL), - glut_entry_CB(NULL) -{ -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.cpp b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.cpp deleted file mode 100644 index 9c9aa85d9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/*********************************************************************** - - quaternion.cpp - A quaternion class - - ------------------------------------------------------------------- - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -************************************************************************ - - Feb 1998, Paul Rademacher (rademach@cs.unc.edu) - Oct 2003, Nigel Stewart - GLUI Code Cleaning - -************************************************************************/ - -#include "quaternion.h" -#include -#include "glui_internal.h" - -/******************************************* constructors **************/ - -quat::quat() -{ - *this = quat_identity(); -} - -quat::quat(const float x, const float y, const float z, const float w) -{ - v.set( x, y, z ); - s = w; -} - -quat::quat(const vec3 &_v, const float _s) -{ - set( _v, _s ); -} - -quat::quat(const float _s, const vec3 &_v) -{ - set( _v, _s ); -} - -quat::quat(const float *d) -{ - v[0] = d[0]; - v[1] = d[1]; - v[2] = d[2]; - s = d[3]; -} - -quat::quat(const double *d) -{ - v[0] = (float) d[0]; - v[1] = (float) d[1]; - v[2] = (float) d[2]; - s = (float) d[3]; -} - -quat::quat(const quat &q) -{ - v = q.v; - s = q.s; -} - -void quat::set(const vec3 &_v, const float _s) -{ - v = _v; - s = _s; -} - -quat &quat::operator=(const quat &q) -{ - v = q.v; - s = q.s; - return *this; -} - -/******** quat friends ************/ - -quat operator + (const quat &a, const quat &b) -{ - return quat( a.s+b.s, a.v+b.v ); -} - -quat operator - (const quat &a, const quat &b) -{ - return quat( a.s-b.s, a.v-b.v ); -} - -quat operator - (const quat &a ) -{ - return quat( -a.s, -a.v ); -} - -quat operator * ( const quat &a, const quat &b) -{ - return quat( a.s*b.s - a.v*b.v, a.s*b.v + b.s*a.v + a.v^b.v ); -} - -quat operator * ( const quat &a, const float t) -{ - return quat( a.v * t, a.s * t ); -} - -quat operator * ( const float t, const quat &a ) -{ - return quat( a.v * t, a.s * t ); -} - -mat4 quat::to_mat4() const -{ - float xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; - - float t = 2.0f / (v*v + s*s); - - xs = v[VX]*t; ys = v[VY]*t; zs = v[VZ]*t; - wx = s*xs; wy = s*ys; wz = s*zs; - xx = v[VX]*xs; xy = v[VX]*ys; xz = v[VX]*zs; - yy = v[VY]*ys; yz = v[VY]*zs; zz = v[VZ]*zs; - - mat4 matrix( - 1.0f-(yy+zz), xy+wz, xz-wy, 0.0f, - xy-wz, 1.0f-(xx+zz), yz+wx, 0.0f, - xz+wy, yz-wx, 1.0f-(xx+yy), 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f ); - - return matrix; -} - -/************************************************* quat_identity() *****/ -/* Returns quaternion identity element */ - -quat quat_identity() -{ - return quat( vec3( 0.0, 0.0, 0.0 ), 1.0 ); -} - -/************************************************ quat_slerp() ********/ -/* Quaternion spherical interpolation */ - -quat quat_slerp(const quat &from, const quat &to, float t) -{ - quat to1; - float omega, cosom, sinom, scale0, scale1; - - /* calculate cosine */ - cosom = from.v * to.v + from.s + to.s; - - /* Adjust signs (if necessary) */ - if ( cosom < 0.0 ) - { - cosom = -cosom; - to1 = -to; - } - else - { - to1 = to; - } - - /* Calculate coefficients */ - if ((1.0 - cosom) > FUDGE ) - { - /* standard case (slerp) */ - omega = (float) acos( cosom ); - sinom = (float) sin( omega ); - scale0 = (float) sin((1.0 - t) * omega) / sinom; - scale1 = (float) sin(t * omega) / sinom; - } - else - { - /* 'from' and 'to' are very close - just do linear interpolation */ - scale0 = 1.0f - t; - scale1 = t; - } - - return scale0 * from + scale1 * to1; -} - -/********************************************** set_angle() ************/ -/* set rot angle (degrees) */ - -void quat::set_angle(float f) -{ - vec3 axis = get_axis(); - - s = (float) cos( DEG2RAD( f ) / 2.0 ); - - v = axis * (float) sin(DEG2RAD(f) / 2.0); -} - -/********************************************** scale_angle() ************/ -/* scale rot angle (degrees) */ - -void quat::scale_angle(float f) -{ - set_angle( f * get_angle() ); -} - -/********************************************** get_angle() ************/ -/* get rot angle (degrees). Assumes s is between -1 and 1 */ - -float quat::get_angle() const -{ - return (float) RAD2DEG( 2.0 * acos( s ) ); -} - -/********************************************* get_axis() **************/ - -vec3 quat::get_axis() const -{ - float scale = (float) sin( acos( s ) ); - - if ( scale < FUDGE AND scale > -FUDGE ) - return vec3( 0.0, 0.0, 0.0 ); - else - return v / scale; -} - -/******************************************* quat::print() ************/ - -void quat::print(FILE *dest, const char *name) const -{ - fprintf( dest, "%s: v:<%3.2f %3.2f %3.2f> s:%3.2f\n", - name, v[0], v[1], v[2], s ); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.h b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.h deleted file mode 100644 index caf072d58..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/quaternion.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** - - quaternion.h - A quaternion class - - GLUI User Interface Toolkit (LGPL) - Copyright (c) 1998 Paul Rademacher - - --------------------------------------------------------------------- - - WWW: http://sourceforge.net/projects/glui/ - Forums: http://sourceforge.net/forum/?group_id=92496 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -#ifndef GLUI_QUATERNION_H -#define GLUI_QUATERNION_H - -#include "algebra3.h" -#include - -/* this line defines a new type: pointer to a function which returns a */ -/* float and takes as argument a float */ -typedef float (*V_FCT_PTR)(float); - -/**************************************************************** - * Quaternion * - ****************************************************************/ - -class quat -{ - /*protected: */ -public: - - vec3 v; /* vector component */ - float s; /* scalar component */ - - /*public: */ - - /* Constructors */ - - quat(); - quat(float x, float y, float z, float w); - quat(const vec3 &v, float s); - quat(float s, const vec3 &v); - quat(const float *d); /* copy from four-element float array */ - quat(const double *f); /* copy from four-element double array */ - quat(const quat &q); /* copy from other quat */ - - /* Assignment operators */ - - quat &operator = (const quat &v); /* assignment of a quat */ - quat &operator += (const quat &v); /* incrementation by a quat */ - quat &operator -= (const quat &v); /* decrementation by a quat */ - quat &operator *= (float d); /* multiplication by a constant */ - quat &operator /= (float d); /* division by a constant */ - - /* special functions */ - - float length() const; /* length of a quat */ - float length2() const; /* squared length of a quat */ - quat &normalize(); /* normalize a quat */ - quat &apply(V_FCT_PTR fct); /* apply a func. to each component */ - vec3 xform(const vec3 &v ); /* q*v*q-1 */ - mat4 to_mat4() const; - void set_angle(float f); /* set rot angle (degrees) */ - void scale_angle(float f); /* scale rot angle (degrees) */ - float get_angle() const; /* set rot angle (degrees) */ - vec3 get_axis() const; /* get axis */ - - void print( FILE *file, const char *name ) const; /* print to a file */ - - float &operator [] (int i); /* indexing */ - const float &operator [] (int i) const; /* indexing */ - - void set(float x, float y, float z); /* set quat */ - void set(const vec3 &v, float s); /* set quat */ - - /* friends */ - - friend quat operator - (const quat &v); /* -q1 */ - friend quat operator + (const quat &a, const quat &b); /* q1 + q2 */ - friend quat operator - (const quat &a, const quat &b); /* q1 - q2 */ - friend quat operator * (const quat &a, float d); /* q1 * 3.0 */ - friend quat operator * (float d, const quat &a); /* 3.0 * q1 */ - friend quat operator * (const quat &a, const quat &b); /* q1 * q2 */ - friend quat operator / (const quat &a, float d); /* q1 / 3.0 */ - friend int operator == (const quat &a, const quat &b); /* q1 == q2 ? */ - friend int operator != (const quat &a, const quat &b); /* q1 != q2 ? */ - friend void swap(quat &a, quat &b); /* swap q1 &q2 */ - /*friend quat min(const quat &a, const quat &b); -- min(q1, q2) */ - /*friend quat max(const quat &a, const quat &b); -- max(q1, q2) */ - friend quat prod(const quat &a, const quat &b); /* term by term mult*/ -}; - -/* Utility functions */ - -quat quat_identity(); /* Returns quaternion identity element */ -quat quat_slerp(const quat &from, const quat &to, float t); - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/readme.txt b/Extensions/PhysicsBehavior/Box2D/Box2D/glui/readme.txt deleted file mode 100644 index 4cda867f6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Box2D/glui/readme.txt +++ /dev/null @@ -1,228 +0,0 @@ -Welcome to the GLUI User Interface Library, v2.3! -March 22, 2005 -------------------------------------------------- - -This distribution contains the latest community-maintained fork of the -GLUI Library. It is based on the GLUI v2.1 beta version from Paul -Rademacher (http://www.cs.unc.edu/~rademach/glui/) plus the -compatibility changes made by Nigel Stewart in his "GLUI v2.2" -(http://www.nigels.com/glt/glui) In accordance with the LGPL under -which the library is released (according to Paul's web page at least), -these changes are available to everyone in the community. - -WARNING: This version (2.3) introduces some incompatible changes with -previous versions!! - -CHANGES: - ----------------------------------- -- GLUI_String is now a std::string - This is the main source of most incopatibilities, but I felt it was - a necessary change, because the previous usage of a fixed-sized - buffer was just too unsafe. I myself was bitten a few times passing - a char* buffer of insufficient size into GLUI as a live variable. - It is still possible to use a char buffer, but it is not recommended. - - If you used GLUI_String before as a live var type, the easiest way - to get your code compiling again is to change those to "char - buf[300]". The better way, though, is to update your code to treat - it as a std::string. - - For instance, if you used to pass mystr to functions that take - 'const char*', now use mystr.c_str() method, instead. - If you used strcpy(mystr, b) to set the value, now just do mystr=b. - If you used sprintf(mystr,...) to set the value, now do - glui_format_string(mystr,...). - If you used to clear the string with mystr[0]='\0', now just clear - it with mystr="". - ----------------------------------- -- Enhanced GLUI_EditText - Control keys can be used for navigation and control. The bindings - are bash-like: Ctrl-B for previous char, Ctrl-F for forward char, etc. - bindings. Also control keys that aren't bound to commands are - simply ignored, whereas before they would be inserted as invisible - characters. - ----------------------------------- -- Added GLUI_CommandLine class - This is a GLUI_EditText with a history mechanism. - ----------------------------------- -- New, more object oriented construction API. - Now instead of calling - - glui->add_button_to_panel( panel, "my button", myid, mycallback ); - - you should just call the button constructor: - - new GLUI_Button( panel, "my button", myid, mycallback ); - - And similarly to add it to a GLUI instead of a panel, rather than: - - glui->add_button( glui, "my button", myid, mycallback ); - - just call the constructor with the GLUI as the first argument: - - new GLUI_Button( glui, "my button", myid, mycallback ); - - The old scheme is now deprecated, but still works. The benefit of - this new scheme is that now the GLUI class doesn't have to know - about all the different types of GLUI_Controls that exist. - Previously GLUI had to both know about all the controls, and know - how to initialize them. Now the responsibility for initialization - belongs to the GLUI_Control subclasses themselves, where it - belongs. Additionally it means that you can create your own - GLUI_Control subclasses which will be on equal footing with the - built-in controls, whereas before any user-created controls would - always be "second-class citizens" since they would have to be - constructed differently from the built-ins. - - ----------------------------------- -- Removed need for type-declaring arguments when argment type suffices. - This effects GLUI_Spinner and GLUI_EditText (and GLUI_CommandLine?). - - For example, instead of calling - - new GLUI_Spinner( glui, "myspin", GLUI_SPINNER_INT, &live_int_var ); - - you can just omit the GLUI_SPINNER_INT part, because the type of the - live_int_var tells the compiler which type you want. - - new GLUI_Spinner( glui, "myspin", &live_int_var ); - - If you're not using a live, var, you can still use the - GLUI_SPINNER_INT type argument. See glui.h for all the new - constructor signatures. Note this only works with the new - construction API, not with the old "add_blah_to_panel" style of - API. - ----------------------------------- -- GLUI_Rotation uses your matrix live-variable now. - GLUI used to ignore the matrix in your live variable. This version - doesn't ignore it, so you'll need to set it to the identity matrix - yourself if that's what you want it to start as. There could - probably be some improvements to this API, though. - ----------------------------------- -- Improvements to 'const' usage. - Most char*'s in GLUI functions used to be non-const even when the - functions did not modify the string. I changed everywhere - appropriate to use const char* instead. - ----------------------------------- -- Updated license info in the headers - Paul's web page says that GLUI is LGPL, but that wasn't declared in - the code itself. I've modified all the headers with the standard - LGPL notice. - ----------------------------------- -- Updated examples for the API changes - ----------------------------------- -- Created project files for Visual Studio .NET (MSVC7.1) - - -That's about it. Enjoy! - - -If you find yourself with too much time on your hands, the things I -think would be most useful for future improvements to GLUI would be: - -1. The GLUI_TextBox and GLUI_Tree definitely need some work, still. -2. Clipboard integration under Windows/X-Win. I have some code that - works on Win32 that I once integrated with GLUI, but I lost that - version somewhere. I still have the Win32 clipboard code, though - if anyone wants to work on integrating it. I have some X-Win - clipboard code, too, but I never got it working quite right. -3. Remove the dependency on GLUT, making the connection with window - system APIs into a more plug-in/adapter modular design. - So e.g. if you want to use GLUT, you'd link with the GLUI lib and a - GLUI_GLUT lib, and call one extra GLUI_glut_init() function or - something. - - -Definitly consider submitting a patch if you've made some nice improvements -to GLUI. Hopefully being an LGPL sourceforge project will attract some new -interest to the GLUI project. - -Bill Baxter -baxter -at -cs unc edu - -================================================= -JOHN KEW'S ADDITIONS (March 2005) -================================================= - -Thanks to John Kew of Natural Solutions Inc., -there are some new widgets. These are demonstrated in example6.cpp. - -The new widgets are: - -* GLUI_Scrollbar - A scrollbar slider widget -* GLUI_TextBox - A multi-line text widget -* GLUI_List - A static choice list -* GLUI_FileBrowser - A simple filebrowser based on GLUI_List -* GLUI_Tree - Hierarchical tree widget -* GLUI_TreePanel - Manager for the tree widget - -And one other change: - -* GLUI_Rollout has optional embossed border - -================================================= -PAUL'S ORIGINAL GLUI 2.0/2.1 README -================================================= - -Welcome to the GLUI User Interface Library, v2.0 beta! -------------------------------------------------- - -This distribution contains the full GLUI sources, as well as 5 example -programs. You'll find the full manual under "glui_manual.pdf". The -GLUI web page is at - - http://www.cs.unc.edu/~rademach/glui - - - ---------- Windows ---------- - -The directory 'msvc' contains a Visual C++ workspace entitled -'glui.dsw'. To recompile the library and examples, open this -workspace and run the menu command "Build:Batch Build:Build". The 3 -executables will be in the 'bin' directory, and the library in the -'lib' directory. - -To create a new Windows executable using GLUI, create a "Win32 Console -Application" in VC++, add the GLUI library (in 'msvc/lib/glui32.lib'), -and add the OpenGL libs: - - glui32.lib glut32.lib glu32.lib opengl32.lib (Microsoft OpenGL) - -Include the file "glui.h" in any file that uses the GLUI library. - - - ---------- Unix ---------- - -An SGI/HP makefile is found in the file 'makefile' (certain lines may need -to be commented/uncommented). - -To include GLUI in your own apps, add the glui library to your -makefile (before the glut library 'libglut.a'), and include "glui.h" -in your sources. - - - ----------------------------------------------------------------------- - -Please let me know what you think, what you'd like to change or add, -and especially what bugs you encounter. Also, please send me your -e-mail so I can add you to a mailing list for updates. - -Good luck, and thanks for trying this out! - -Paul Rademacher -rademach -at -cs unc edu \ No newline at end of file diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.cpp deleted file mode 100644 index bb8be8c5d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2BuoyancyController.h" -#include "../b2Fixture.h" - -b2BuoyancyController::b2BuoyancyController(const b2BuoyancyControllerDef* def) : b2Controller(def) -{ - normal = def->normal; - offset = def->offset; - density = def->density; - velocity = def->velocity; - linearDrag = def->linearDrag; - angularDrag = def->angularDrag; - useDensity = def->useDensity; - useWorldGravity = def->useWorldGravity; - gravity = def->gravity; -} - -void b2BuoyancyController::Step(const b2TimeStep& step) -{ - B2_NOT_USED(step); - if(!m_bodyList) - return; - if(useWorldGravity) - { - gravity = m_world->GetGravity(); - } - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody) - { - b2Body* body = i->body; - if(body->IsSleeping()) - { - //Buoyancy force is just a function of position, - //so unlike most forces, it is safe to ignore sleeping bodes - continue; - } - b2Vec2 areac(0,0); - b2Vec2 massc(0,0); - float32 area = 0; - float32 mass = 0; - for(b2Fixture* shape=body->GetFixtureList();shape;shape=shape->GetNext()) - { - b2Vec2 sc(0,0); - float32 sarea = shape->ComputeSubmergedArea(normal, offset, &sc); - area += sarea; - areac.x += sarea * sc.x; - areac.y += sarea * sc.y; - float shapeDensity = 0; - if(useDensity) - { - //TODO: Expose density publicly - shapeDensity=shape->GetDensity(); - } - else - { - shapeDensity = 1; - } - mass += sarea*shapeDensity; - massc.x += sarea * sc.x * shapeDensity; - massc.y += sarea * sc.y * shapeDensity; - } - areac.x/=area; - areac.y/=area; - b2Vec2 localCentroid = b2MulT(body->GetXForm(),areac); - massc.x/=mass; - massc.y/=mass; - if(areaApplyForce(buoyancyForce,massc); - //Linear drag - b2Vec2 dragForce = body->GetLinearVelocityFromWorldPoint(areac) - velocity; - dragForce *= -linearDrag*area; - body->ApplyForce(dragForce,areac); - //Angular drag - //TODO: Something that makes more physical sense? - body->ApplyTorque(-body->GetInertia()/body->GetMass()*area*body->GetAngularVelocity()*angularDrag); - - } -} - -void b2BuoyancyController::Draw(b2DebugDraw *debugDraw) -{ - float32 r = 1000; - b2Vec2 p1 = offset * normal + b2Cross(normal, r); - b2Vec2 p2 = offset * normal - b2Cross(normal, r); - - b2Color color(0,0,0.8f); - - debugDraw->DrawSegment(p1, p2, color); -} - -void b2BuoyancyController::Destroy(b2BlockAllocator* allocator) -{ - allocator->Free(this, sizeof(b2BuoyancyController)); -} - -b2BuoyancyController* b2BuoyancyControllerDef::Create(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2BuoyancyController)); - return new (mem) b2BuoyancyController(this); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.h deleted file mode 100644 index 8214bf0f3..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2BuoyancyController.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_BUOYANCYCONTROLLER_H -#define B2_BUOYANCYCONTROLLER_H - -#include "b2Controller.h" - -class b2BuoyancyControllerDef; - -/// Calculates buoyancy forces for fluids in the form of a half plane. -class b2BuoyancyController : public b2Controller{ -public: - /// The outer surface normal - b2Vec2 normal; - /// The height of the fluid surface along the normal - float32 offset; - /// The fluid density - float32 density; - /// Fluid velocity, for drag calculations - b2Vec2 velocity; - /// Linear drag co-efficient - float32 linearDrag; - /// Linear drag co-efficient - float32 angularDrag; - /// If false, bodies are assumed to be uniformly dense, otherwise use the shapes densities - bool useDensity; //False by default to prevent a gotcha - /// If true, gravity is taken from the world instead of the gravity parameter. - bool useWorldGravity; - /// Gravity vector, if the world's gravity is not used - b2Vec2 gravity; - - /// @see b2Controller::Step - void Step(const b2TimeStep& step); - - /// @see b2Controller::Draw - void Draw(b2DebugDraw *debugDraw); - -protected: - void Destroy(b2BlockAllocator* allocator); - -private: - friend class b2BuoyancyControllerDef; - b2BuoyancyController(const b2BuoyancyControllerDef* def); -}; - -/// This class is used to build buoyancy controllers -class b2BuoyancyControllerDef : public b2ControllerDef -{ -public: - /// The outer surface normal - b2Vec2 normal; - /// The height of the fluid surface along the normal - float32 offset; - /// The fluid density - float32 density; - /// Fluid velocity, for drag calculations - b2Vec2 velocity; - /// Linear drag co-efficient - float32 linearDrag; - /// Linear drag co-efficient - float32 angularDrag; - /// If false, bodies are assumed to be uniformly dense, otherwise use the shapes densities - bool useDensity; //False by default to prevent a gotcha - /// If true, gravity is taken from the world instead of the gravity parameter. - bool useWorldGravity; - /// Gravity vector, if the world's gravity is not used - b2Vec2 gravity; - - b2BuoyancyControllerDef(): - normal(0,1), - offset(0), - density(0), - velocity(0,0), - linearDrag(0), - angularDrag(0), - useDensity(false), - useWorldGravity(true), - gravity(0,0) - { - } - -private: - b2BuoyancyController* Create(b2BlockAllocator* allocator) const; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.cpp deleted file mode 100644 index eef28de7b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2ConstantAccelController.h" - -b2ConstantAccelController::b2ConstantAccelController(const b2ConstantAccelControllerDef* def) : b2Controller(def) -{ - A = def->A; -} - -void b2ConstantAccelController::Step(const b2TimeStep& step) -{ - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){ - b2Body* body = i->body; - if(body->IsSleeping()) - continue; - body->SetLinearVelocity(body->GetLinearVelocity()+step.dt*A); - } -} - -void b2ConstantAccelController::Destroy(b2BlockAllocator* allocator) -{ - allocator->Free(this, sizeof(b2ConstantAccelController)); -} - - -b2ConstantAccelController* b2ConstantAccelControllerDef::Create(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2ConstantAccelController)); - return new (mem) b2ConstantAccelController(this); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.h deleted file mode 100644 index c052386db..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantAccelController.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONSTANTACCELCONTROLLER_H -#define B2_CONSTANTACCELCONTROLLER_H - -#include "b2Controller.h" - -class b2ConstantAccelControllerDef; - -/// Applies a force every frame -class b2ConstantAccelController : public b2Controller{ -public: - /// The force to apply - b2Vec2 A; - - /// @see b2Controller::Step - void Step(const b2TimeStep& step); - -protected: - void Destroy(b2BlockAllocator* allocator); - -private: - friend class b2ConstantAccelControllerDef; - b2ConstantAccelController(const b2ConstantAccelControllerDef* def); - -}; - -/// This class is used to build constant acceleration controllers -class b2ConstantAccelControllerDef : public b2ControllerDef -{ -public: - /// The force to apply - b2Vec2 A; -private: - b2ConstantAccelController* Create(b2BlockAllocator* allocator) const; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.cpp deleted file mode 100644 index ca10a3fd6..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2ConstantForceController.h" - -b2ConstantForceController::b2ConstantForceController(const b2ConstantForceControllerDef* def) : b2Controller(def) -{ - F = def->F; -} - -void b2ConstantForceController::Step(const b2TimeStep& step) -{ - B2_NOT_USED(step); - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){ - b2Body* body = i->body; - if(body->IsSleeping()) - continue; - body->ApplyForce(F,body->GetWorldCenter()); - } -} - -void b2ConstantForceController::Destroy(b2BlockAllocator* allocator) -{ - allocator->Free(this, sizeof(b2ConstantForceController)); -} - - -b2ConstantForceController* b2ConstantForceControllerDef::Create(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2ConstantForceController)); - return new (mem) b2ConstantForceController(this); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.h deleted file mode 100644 index 6efe0902f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2ConstantForceController.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONSTANTFORCECONTROLLER_H -#define B2_CONSTANTFORCECONTROLLER_H - -#include "b2Controller.h" - -class b2ConstantForceControllerDef; - -/// Applies a force every frame -class b2ConstantForceController : public b2Controller -{ -public: - /// The force to apply - b2Vec2 F; - - /// @see b2Controller::Step - void Step(const b2TimeStep& step); - -protected: - void Destroy(b2BlockAllocator* allocator); - -private: - friend class b2ConstantForceControllerDef; - b2ConstantForceController(const b2ConstantForceControllerDef* def); -}; - -/// This class is used to build constant force controllers -class b2ConstantForceControllerDef : public b2ControllerDef -{ -public: - /// The force to apply - b2Vec2 F; -private: - b2ConstantForceController* Create(b2BlockAllocator* allocator) const; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.cpp deleted file mode 100644 index 2fdde4d7e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2Controller.h" -#include "../../Common/b2BlockAllocator.h" - - -b2Controller::~b2Controller() -{ - //Remove attached bodies - Clear(); -} - -void b2Controller::AddBody(b2Body* body) -{ - void* mem = m_world->m_blockAllocator.Allocate(sizeof(b2ControllerEdge)); - b2ControllerEdge* edge = new (mem) b2ControllerEdge; - - edge->body = body; - edge->controller = this; - - //Add edge to controller list - edge->nextBody = m_bodyList; - edge->prevBody = NULL; - if(m_bodyList) - m_bodyList->prevBody = edge; - m_bodyList = edge; - ++m_bodyCount; - - //Add edge to body list - edge->nextController = body->m_controllerList; - edge->prevController = NULL; - if(body->m_controllerList) - body->m_controllerList->prevController = edge; - body->m_controllerList = edge; -} - -void b2Controller::RemoveBody(b2Body* body) -{ - //Assert that the controller is not empty - b2Assert(m_bodyCount>0); - - //Find the corresponding edge - b2ControllerEdge* edge = m_bodyList; - while(edge && edge->body!=body) - edge = edge->nextBody; - - //Assert that we are removing a body that is currently attached to the controller - b2Assert(edge!=NULL); - - //Remove edge from controller list - if(edge->prevBody) - edge->prevBody->nextBody = edge->nextBody; - if(edge->nextBody) - edge->nextBody->prevBody = edge->prevBody; - if(edge == m_bodyList) - m_bodyList = edge->nextBody; - --m_bodyCount; - - //Remove edge from body list - if(edge->prevController) - edge->prevController->nextController = edge->nextController; - if(edge->nextController) - edge->nextController->prevController = edge->prevController; - if(edge == body->m_controllerList) - body->m_controllerList = edge->nextController; - - //Free the edge - m_world->m_blockAllocator.Free(edge, sizeof(b2ControllerEdge)); -} - -void b2Controller::Clear(){ - - while(m_bodyList) - { - b2ControllerEdge* edge = m_bodyList; - - //Remove edge from controller list - m_bodyList = edge->nextBody; - - //Remove edge from body list - if(edge->prevController) - edge->prevController->nextController = edge->nextController; - if(edge->nextController) - edge->nextController->prevController = edge->prevController; - if(edge == edge->body->m_controllerList) - edge->body->m_controllerList = edge->nextController; - - //Free the edge - m_world->m_blockAllocator.Free(edge, sizeof(b2ControllerEdge)); - } - - m_bodyCount = 0; -} - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.h deleted file mode 100644 index d56f66d0c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2Controller.h +++ /dev/null @@ -1,158 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_CONTROLLER_H -#define B2_CONTROLLER_H - -#include "../../Dynamics/b2World.h" -#include "../../Dynamics/b2Body.h" - -class b2Body; -class b2World; - -class b2Controller; - -/// A controller edge is used to connect bodies and controllers together -/// in a bipartite graph. -struct b2ControllerEdge -{ - b2Controller* controller; ///< provides quick access to other end of this edge. - b2Body* body; ///< the body - b2ControllerEdge* prevBody; ///< the previous controller edge in the controllers's joint list - b2ControllerEdge* nextBody; ///< the next controller edge in the controllers's joint list - b2ControllerEdge* prevController; ///< the previous controller edge in the body's joint list - b2ControllerEdge* nextController; ///< the next controller edge in the body's joint list -}; - -class b2ControllerDef; - -/// Base class for controllers. Controllers are a convience for encapsulating common -/// per-step functionality. -class b2Controller -{ -public: - virtual ~b2Controller(); - - /// Controllers override this to implement per-step functionality. - virtual void Step(const b2TimeStep& step) = 0; - - /// Controllers override this to provide debug drawing. - virtual void Draw(b2DebugDraw *debugDraw) {B2_NOT_USED(debugDraw);}; - - /// Adds a body to the controller list. - void AddBody(b2Body* body); - - /// Removes a body from the controller list. - void RemoveBody(b2Body* body); - - /// Removes all bodies from the controller list. - void Clear(); - - /// Get the next controller in the world's body list. - b2Controller* GetNext(); - const b2Controller* GetNext() const; - - /// Get the parent world of this body. - b2World* GetWorld(); - const b2World* GetWorld() const; - - /// Get the attached body list - b2ControllerEdge* GetBodyList(); - const b2ControllerEdge* GetBodyList() const; - - -protected: - friend class b2World; - - b2World* m_world; - - b2ControllerEdge* m_bodyList; - int32 m_bodyCount; - - b2Controller(const b2ControllerDef* def): - m_world(NULL), - m_bodyList(NULL), - m_bodyCount(0), - m_prev(NULL), - m_next(NULL) - - { - B2_NOT_USED(def); - } - virtual void Destroy(b2BlockAllocator* allocator) = 0; - -private: - b2Controller* m_prev; - b2Controller* m_next; - - static void Destroy(b2Controller* controller, b2BlockAllocator* allocator); -}; - -class b2ControllerDef -{ -public: - virtual ~b2ControllerDef() {}; - -private: - friend class b2World; - virtual b2Controller* Create(b2BlockAllocator* allocator) const = 0; -}; - -inline b2Controller* b2Controller::GetNext() -{ - return m_next; -} - -inline const b2Controller* b2Controller::GetNext() const -{ - return m_next; -} - -inline b2World* b2Controller::GetWorld() -{ - return m_world; -} - -inline const b2World* b2Controller::GetWorld() const -{ - return m_world; -} - -inline b2ControllerEdge* b2Controller::GetBodyList() -{ - return m_bodyList; -} - -inline const b2ControllerEdge* b2Controller::GetBodyList() const -{ - return m_bodyList; -} - -inline void b2Controller::Destroy(b2Controller* controller, b2BlockAllocator* allocator) -{ - controller->Destroy(allocator); -} - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.cpp deleted file mode 100644 index 5ca6e8b65..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2GravityController.h" - -b2GravityController::b2GravityController(const b2GravityControllerDef* def) : b2Controller(def) -{ - G = def->G; - invSqr = def->invSqr; -} - -void b2GravityController::Step(const b2TimeStep& step) -{ - B2_NOT_USED(step); - if(invSqr){ - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){ - b2Body* body1 = i->body; - for(b2ControllerEdge *j=m_bodyList;j!=i;j=j->nextBody){ - b2Body* body2 = j->body; - b2Vec2 d = body2->GetWorldCenter() - body1->GetWorldCenter(); - float32 r2 = d.LengthSquared(); - if(r2 < B2_FLT_EPSILON) - continue; - b2Vec2 f = G / r2 / sqrt(r2) * body1->GetMass() * body2->GetMass() * d; - body1->ApplyForce(f , body1->GetWorldCenter()); - body2->ApplyForce(-1.0f*f, body2->GetWorldCenter()); - } - } - }else{ - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){ - b2Body* body1 = i->body; - for(b2ControllerEdge *j=m_bodyList;j!=i;j=j->nextBody){ - b2Body* body2 = j->body; - b2Vec2 d = body2->GetWorldCenter() - body1->GetWorldCenter(); - float32 r2 = d.LengthSquared(); - if(r2 < B2_FLT_EPSILON) - continue; - b2Vec2 f = G / r2 * body1->GetMass() * body2->GetMass() * d; - body1->ApplyForce(f , body1->GetWorldCenter()); - body2->ApplyForce(-1.0f*f, body2->GetWorldCenter()); - } - } - } -} - -void b2GravityController::Destroy(b2BlockAllocator* allocator) -{ - allocator->Free(this, sizeof(b2GravityController)); -} - -b2GravityController* b2GravityControllerDef::Create(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2GravityController)); - return new (mem) b2GravityController(this); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.h deleted file mode 100644 index fca367136..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2GravityController.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_GRAVITYCONTROLLER_H -#define B2_GRAVITYCONTROLLER_H - -#include "b2Controller.h" - -class b2GravityControllerDef; - -/// Applies simplified gravity between every pair of bodies -class b2GravityController : public b2Controller{ -public: - /// Specifies the strength of the gravitiation force - float32 G; - /// If true, gravity is proportional to r^-2, otherwise r^-1 - bool invSqr; - - /// @see b2Controller::Step - void Step(const b2TimeStep& step); - -protected: - void Destroy(b2BlockAllocator* allocator); - -private: - friend class b2GravityControllerDef; - b2GravityController(const b2GravityControllerDef* def); - - -}; - -/// This class is used to build gravity controllers -class b2GravityControllerDef : public b2ControllerDef -{ -public: - /// Specifies the strength of the gravitiation force - float32 G; - /// If true, gravity is proportional to r^-2, otherwise r^-1 - bool invSqr; -private: - b2GravityController* Create(b2BlockAllocator* allocator) const; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.cpp deleted file mode 100644 index fed24ccdd..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "b2TensorDampingController.h" - -b2TensorDampingController::b2TensorDampingController(const b2TensorDampingControllerDef* def) : b2Controller(def) -{ - T = def->T; - maxTimestep = def->maxTimestep; -} - -void b2TensorDampingController::Step(const b2TimeStep& step) -{ - float32 timestep = step.dt; - if(timestep<=B2_FLT_EPSILON) - return; - if(timestep>maxTimestep && maxTimestep>0) - timestep = maxTimestep; - for(b2ControllerEdge *i=m_bodyList;i;i=i->nextBody){ - b2Body* body = i->body; - if(body->IsSleeping()) - continue; - b2Vec2 damping = body->GetWorldVector( - b2Mul(T, - body->GetLocalVector( - body->GetLinearVelocity() - ) - ) - ); - body->SetLinearVelocity(body->GetLinearVelocity() + timestep * damping); - } -} - -void b2TensorDampingControllerDef::SetAxisAligned(float32 xDamping, float32 yDamping) -{ - T.col1.x = -xDamping; - T.col1.y = 0; - T.col2.x = 0; - T.col2.y = -yDamping; - if(xDamping>0 || yDamping>0){ - maxTimestep = 1/b2Max(xDamping,yDamping); - }else{ - maxTimestep = 0; - } -} - -void b2TensorDampingController::Destroy(b2BlockAllocator* allocator) -{ - allocator->Free(this, sizeof(b2TensorDampingController)); -} - - -b2TensorDampingController* b2TensorDampingControllerDef::Create(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2TensorDampingController)); - return new (mem) b2TensorDampingController(this); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.h deleted file mode 100644 index eea5df158..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Controllers/b2TensorDampingController.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_TENSORDAMPINGCONTROLLER_H -#define B2_TENSORDAMPINGCONTROLLER_H - -#include "b2Controller.h" - -class b2TensorDampingControllerDef; - -/// Applies top down linear damping to the controlled bodies -/// The damping is calculated by multiplying velocity by a matrix in local co-ordinates. -class b2TensorDampingController : public b2Controller{ -public: - /// Tensor to use in damping model - b2Mat22 T; - /*Some examples (matrixes in format (row1; row2) ) - (-a 0;0 -a) Standard isotropic damping with strength a - (0 a;-a 0) Electron in fixed field - a force at right angles to velocity with proportional magnitude - (-a 0;0 -b) Differing x and y damping. Useful e.g. for top-down wheels. - */ - //By the way, tensor in this case just means matrix, don't let the terminology get you down. - - /// Set this to a positive number to clamp the maximum amount of damping done. - float32 maxTimestep; - // Typically one wants maxTimestep to be 1/(max eigenvalue of T), so that damping will never cause something to reverse direction - - /// @see b2Controller::Step - void Step(const b2TimeStep& step); - -protected: - void Destroy(b2BlockAllocator* allocator); - -private: - friend class b2TensorDampingControllerDef; - b2TensorDampingController(const b2TensorDampingControllerDef* def); - -}; - -/// This class is used to build tensor damping controllers -class b2TensorDampingControllerDef : public b2ControllerDef -{ -public: - /// Tensor to use in damping model - b2Mat22 T; - /// Set this to a positive number to clamp the maximum amount of damping done. - float32 maxTimestep; - /// Sets damping independantly along the x and y axes - void SetAxisAligned(float32 xDamping,float32 yDamping); -private: - b2TensorDampingController* Create(b2BlockAllocator* allocator) const; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/Fixed.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/Fixed.h deleted file mode 100644 index 2badbddba..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/Fixed.h +++ /dev/null @@ -1,484 +0,0 @@ -/* -Copyright (c) 2006 Henry Strickland & Ryan Seto - 2007-2008 Tobias Weyand (modifications and extensions) - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - - (* http://www.opensource.org/licenses/mit-license.php *) -*/ - -#ifndef _FIXED_H_ -#define _FIXED_H_ - -#include - -#ifdef TARGET_IS_NDS - -#include "nds.h" - -#endif - -#define FIXED_BP 16 -#define FIXED_MAX ((1<<(32-FIXED_BP-1))-1) -#define FIXED_MIN (-(1<<(32-FIXED_BP-1))) -#define FIXED_EPSILON (Fixed(0.00007f)) - -#define G_1_DIV_PI 20861 - -class Fixed { - - private: - - int g; // the guts - - const static int BP= FIXED_BP; // how many low bits are right of Binary Point - const static int BP2= BP*2; // how many low bits are right of Binary Point - const static int BPhalf= BP/2; // how many low bits are right of Binary Point - - double STEP(); // smallest step we can represent - - // for private construction via guts - enum FixedRaw { RAW }; - Fixed(FixedRaw, int guts); - - public: - - Fixed(); - Fixed(const Fixed &a); - Fixed(float a); - Fixed(double a); - Fixed(int a); - Fixed(long a); - - Fixed& operator =(const Fixed a); - Fixed& operator =(float a); - Fixed& operator =(double a); - Fixed& operator =(int a); - Fixed& operator =(long a); - - operator float(); - operator double(); - operator int(); - operator long(); - operator unsigned short(); - - operator float() const; - - Fixed operator +() const; - Fixed operator -() const; - - Fixed operator +(const Fixed a) const; - Fixed operator -(const Fixed a) const; -#if 1 - // more acurate, using long long - Fixed operator *(const Fixed a) const; -#else - // faster, but with only half as many bits right of binary point - Fixed operator *(const Fixed a) const; -#endif - Fixed operator /(const Fixed a) const; - - Fixed operator *(unsigned short a) const; - Fixed operator *(int a) const; - - Fixed operator +(float a) const; - Fixed operator -(float a) const; - Fixed operator *(float a) const; - Fixed operator /(float a) const; - - Fixed operator +(double a) const; - Fixed operator -(double a) const; - Fixed operator *(double a) const; - Fixed operator /(double a) const; - - Fixed operator >>(int a) const; - Fixed operator <<(int a) const; - - Fixed& operator +=(Fixed a); - Fixed& operator -=(Fixed a); - Fixed& operator *=(Fixed a); - Fixed& operator /=(Fixed a); - - Fixed& operator +=(int a); - Fixed& operator -=(int a); - Fixed& operator *=(int a); - Fixed& operator /=(int a); - - Fixed& operator +=(long a); - Fixed& operator -=(long a); - Fixed& operator *=(long a); - Fixed& operator /=(long a); - - Fixed& operator +=(float a); - Fixed& operator -=(float a); - Fixed& operator *=(float a); - Fixed& operator /=(float a); - - Fixed& operator +=(double a); - Fixed& operator -=(double a); - Fixed& operator *=(double a); - Fixed& operator /=(double a); - - bool operator ==(const Fixed a) const; - bool operator !=(const Fixed a) const; - bool operator <=(const Fixed a) const; - bool operator >=(const Fixed a) const; - bool operator <(const Fixed a) const; - bool operator >(const Fixed a) const; - - bool operator ==(float a) const; - bool operator !=(float a) const; - bool operator <=(float a) const; - bool operator >=(float a) const; - bool operator <(float a) const; - bool operator >(float a) const; - - bool operator ==(double a) const; - bool operator !=(double a) const; - bool operator <=(double a) const; - bool operator >=(double a) const; - bool operator <(double a) const; - bool operator >(double a) const; - - bool operator >(int a) const; - bool operator <(int a) const; - bool operator >=(int a) const; - bool operator <=(int a) const; - - Fixed abs(); - Fixed sqrt(); -#ifdef TARGET_IS_NDS - Fixed cosf(); - Fixed sinf(); - Fixed tanf(); -#endif -}; - -// -// Implementation -// - -inline double Fixed::STEP() { return 1.0 / (1<>BP; } -inline Fixed::operator long() { return g>>BP; } -#pragma warning(disable: 4244) //HARDWIRE added pragma to prevent VS2005 compilation error -inline Fixed::operator unsigned short() { return g>>BP; } -inline Fixed::operator float() const { return g / (float)(1<> BP)); } - -#elif 0 - -// check for overflow and figure out where. Must specify -rdynamic in linker -#include -#include -#include - -inline Fixed Fixed::operator *(const Fixed a) const { - long long x = ((long long)g * (long long)a.g ); - if(x > 0x7fffffffffffLL || x < -0x7fffffffffffLL) { - printf("overflow"); - void *array[2]; - int nSize = backtrace(array, 2); - char **symbols = backtrace_symbols(array, nSize); - for(int i=0; i>BP)); -} - -#else -// faster, but with only half as many bits right of binary point -inline Fixed Fixed::operator *(const Fixed a) const { return Fixed(RAW, (g>>BPhalf) * (a.g>>BPhalf) ); } -#endif - - -#ifdef TARGET_IS_NDS -// Division using the DS's maths coprocessor -inline Fixed Fixed::operator /(const Fixed a) const -{ - //printf("%d %d\n", (long long)g << BP, a.g); - return Fixed(RAW, int( div64((long long)g << BP, a.g) ) ); -} -#else -inline Fixed Fixed::operator /(const Fixed a) const -{ - return Fixed(RAW, int( (((long long)g << BP2) / (long long)(a.g)) >> BP) ); - //return Fixed(RAW, int( (((long long)g << BP) / (long long)(a.g)) ) ); -} -#endif - -inline Fixed Fixed::operator *(unsigned short a) const { return operator*(Fixed(a)); } -inline Fixed Fixed::operator *(int a) const { return operator*(Fixed(a)); } - -inline Fixed Fixed::operator +(float a) const { return Fixed(RAW, g + Fixed(a).g); } -inline Fixed Fixed::operator -(float a) const { return Fixed(RAW, g - Fixed(a).g); } -inline Fixed Fixed::operator *(float a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } -//inline Fixed Fixed::operator /(float a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } -inline Fixed Fixed::operator /(float a) const { return operator/(Fixed(a)); } - -inline Fixed Fixed::operator +(double a) const { return Fixed(RAW, g + Fixed(a).g); } -inline Fixed Fixed::operator -(double a) const { return Fixed(RAW, g - Fixed(a).g); } -inline Fixed Fixed::operator *(double a) const { return Fixed(RAW, (g>>BPhalf) * (Fixed(a).g>>BPhalf) ); } -//inline Fixed Fixed::operator /(double a) const { return Fixed(RAW, int( (((long long)g << BP2) / (long long)(Fixed(a).g)) >> BP) ); } -inline Fixed Fixed::operator /(double a) const { return operator/(Fixed(a)); } - -inline Fixed Fixed::operator >>(int a) const { return Fixed(RAW, g >> a); } -inline Fixed Fixed::operator <<(int a) const { return Fixed(RAW, g << a); } - -inline Fixed& Fixed::operator +=(Fixed a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(Fixed a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(Fixed a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(Fixed a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(Fixed a) { return *this = operator/(a); } - -inline Fixed& Fixed::operator +=(int a) { return *this = *this + (Fixed)a; } -inline Fixed& Fixed::operator -=(int a) { return *this = *this - (Fixed)a; } -inline Fixed& Fixed::operator *=(int a) { return *this = *this * (Fixed)a; } -//inline Fixed& Fixed::operator /=(int a) { return *this = *this / (Fixed)a; } -inline Fixed& Fixed::operator /=(int a) { return *this = operator/((Fixed)a); } - -inline Fixed& Fixed::operator +=(long a) { return *this = *this + (Fixed)a; } -inline Fixed& Fixed::operator -=(long a) { return *this = *this - (Fixed)a; } -inline Fixed& Fixed::operator *=(long a) { return *this = *this * (Fixed)a; } -//inline Fixed& Fixed::operator /=(long a) { return *this = *this / (Fixed)a; } -inline Fixed& Fixed::operator /=(long a) { return *this = operator/((Fixed)a); } - -inline Fixed& Fixed::operator +=(float a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(float a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(float a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(float a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(float a) { return *this = operator/(a); } - -inline Fixed& Fixed::operator +=(double a) { return *this = *this + a; } -inline Fixed& Fixed::operator -=(double a) { return *this = *this - a; } -inline Fixed& Fixed::operator *=(double a) { return *this = *this * a; } -//inline Fixed& Fixed::operator /=(double a) { return *this = *this / a; } -inline Fixed& Fixed::operator /=(double a) { return *this = operator/(a); } - -inline Fixed operator +(int a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(int a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(int a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(int a, const Fixed b) { return Fixed(a)/b; }; - -inline Fixed operator +(float a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(float a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(float a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(float a, const Fixed b) { return Fixed(a)/b; } - -inline bool Fixed::operator ==(const Fixed a) const { return g == a.g; } -inline bool Fixed::operator !=(const Fixed a) const { return g != a.g; } -inline bool Fixed::operator <=(const Fixed a) const { return g <= a.g; } -inline bool Fixed::operator >=(const Fixed a) const { return g >= a.g; } -inline bool Fixed::operator <(const Fixed a) const { return g < a.g; } -inline bool Fixed::operator >(const Fixed a) const { return g > a.g; } - -inline bool Fixed::operator ==(float a) const { return g == Fixed(a).g; } -inline bool Fixed::operator !=(float a) const { return g != Fixed(a).g; } -inline bool Fixed::operator <=(float a) const { return g <= Fixed(a).g; } -inline bool Fixed::operator >=(float a) const { return g >= Fixed(a).g; } -inline bool Fixed::operator <(float a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >(float a) const { return g > Fixed(a).g; } - -inline bool Fixed::operator ==(double a) const { return g == Fixed(a).g; } -inline bool Fixed::operator !=(double a) const { return g != Fixed(a).g; } -inline bool Fixed::operator <=(double a) const { return g <= Fixed(a).g; } -inline bool Fixed::operator >=(double a) const { return g >= Fixed(a).g; } -inline bool Fixed::operator <(double a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >(double a) const { return g > Fixed(a).g; } - -inline bool Fixed::operator >(int a) const { return g > Fixed(a).g; } -inline bool Fixed::operator <(int a) const { return g < Fixed(a).g; } -inline bool Fixed::operator >=(int a) const{ return g >= Fixed(a).g; }; -inline bool Fixed::operator <=(int a) const{ return g <= Fixed(a).g; }; - -inline bool operator ==(float a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(float a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(float a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(float a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(float a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(float a, const Fixed b) { return Fixed(a) > b; } - -inline Fixed operator +(double a, const Fixed b) { return Fixed(a)+b; } -inline Fixed operator -(double a, const Fixed b) { return Fixed(a)-b; } -inline Fixed operator *(double a, const Fixed b) { return Fixed(a)*b; } -inline Fixed operator /(double a, const Fixed b) { return Fixed(a)/b; } - -inline bool operator ==(double a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(double a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(double a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(double a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(double a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(double a, const Fixed b) { return Fixed(a) > b; } - -inline bool operator ==(int a, const Fixed b) { return Fixed(a) == b; } -inline bool operator !=(int a, const Fixed b) { return Fixed(a) != b; } -inline bool operator <=(int a, const Fixed b) { return Fixed(a) <= b; } -inline bool operator >=(int a, const Fixed b) { return Fixed(a) >= b; } -inline bool operator <(int a, const Fixed b) { return Fixed(a) < b; } -inline bool operator >(int a, const Fixed b) { return Fixed(a) > b; } - -inline int& operator +=(int& a, const Fixed b) { a = (Fixed)a + b; return a; } -inline int& operator -=(int& a, const Fixed b) { a = (Fixed)a - b; return a; } -inline int& operator *=(int& a, const Fixed b) { a = (Fixed)a * b; return a; } -inline int& operator /=(int& a, const Fixed b) { a = (Fixed)a / b; return a; } - -inline long& operator +=(long& a, const Fixed b) { a = (Fixed)a + b; return a; } -inline long& operator -=(long& a, const Fixed b) { a = (Fixed)a - b; return a; } -inline long& operator *=(long& a, const Fixed b) { a = (Fixed)a * b; return a; } -inline long& operator /=(long& a, const Fixed b) { a = (Fixed)a / b; return a; } - -inline float& operator +=(float& a, const Fixed b) { a = a + b; return a; } -inline float& operator -=(float& a, const Fixed b) { a = a - b; return a; } -inline float& operator *=(float& a, const Fixed b) { a = a * b; return a; } -inline float& operator /=(float& a, const Fixed b) { a = a / b; return a; } - -inline double& operator +=(double& a, const Fixed b) { a = a + b; return a; } -inline double& operator -=(double& a, const Fixed b) { a = a - b; return a; } -inline double& operator *=(double& a, const Fixed b) { a = a * b; return a; } -inline double& operator /=(double& a, const Fixed b) { a = a / b; return a; } - -inline Fixed Fixed::abs() { return (g>0) ? Fixed(RAW, g) : Fixed(RAW, -g); } -inline Fixed abs(Fixed f) { return f.abs(); } - -//inline Fixed atan2(Fixed a, Fixed b) { return atan2f((float) a, (float) b); } -inline Fixed atan2(Fixed y, Fixed x) -{ - Fixed abs_y = y.abs() + FIXED_EPSILON; // avoid 0/0 - Fixed r, angle; - - if(x >= 0.0f) { - r = (x - abs_y) / (x + abs_y); - angle = 3.1415926/4.0; - } else { - r = (x + abs_y) / (abs_y - x); - angle = 3.0*3.1415926/4.0; - } - angle += Fixed(0.1963) * (r * r * r) - Fixed(0.9817) * r; - return (y < 0) ? -angle : angle; -} - -#if TARGET_IS_NDS - -static inline long nds_sqrt64(long long a) -{ - SQRT_CR = SQRT_64; - while(SQRT_CR & SQRT_BUSY); - SQRT_PARAM64 = a; - while(SQRT_CR & SQRT_BUSY); - - return SQRT_RESULT32; -} - -static inline int32 div6464(int64 num, int64 den) -{ - DIV_CR = DIV_64_64; - while(DIV_CR & DIV_BUSY); - DIV_NUMERATOR64 = num; - DIV_DENOMINATOR64 = den; - while(DIV_CR & DIV_BUSY); - - return (DIV_RESULT32); -} - -inline Fixed Fixed::sqrt() -{ - return Fixed(RAW, nds_sqrt64(((long long)(g))<>= 2 ) - { - if ( ( left & -m ) > root ) - left -= ( root += m ), root += m; - root >>= 1; - } - return Fixed(RAW, root); -} -#endif - -inline Fixed sqrt(Fixed a) { return a.sqrt(); } -inline Fixed sqrtf(Fixed a) { return a.sqrt(); } - -#endif - -#ifdef TARGET_IS_NDS -// Use the libnds lookup tables for trigonometry functions -inline Fixed Fixed::cosf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, COS_bin[idx] << 4); -} -inline Fixed cosf(Fixed x) { return x.cosf(); } -inline Fixed Fixed::sinf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, SIN_bin[idx] << 4); -} -inline Fixed sinf(Fixed x) { return x.sinf(); } -inline Fixed Fixed::tanf() { - int idx = (((long long)g*(long long)G_1_DIV_PI)>>24)%512; - if(idx < 0) - idx += 512; - return Fixed(RAW, TAN_bin[idx] << 4); -} -inline Fixed tanf(Fixed x) { return x.tanf(); } - - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/jtypes.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/jtypes.h deleted file mode 100644 index 00b27c839..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/FixedPoint/jtypes.h +++ /dev/null @@ -1,146 +0,0 @@ -/*--------------------------------------------------------------------------------- - $Id: jtypes.h,v 1.17 2007/07/18 05:20:45 wntrmute Exp $ - - jtypes.h -- Common types (and a few useful macros) - - Copyright (C) 2005 - Michael Noland (joat) - Jason Rogers (dovoto) - Dave Murphy (WinterMute) - Chris Double (doublec) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - 3. This notice may not be removed or altered from any source - distribution. - ----------------------------------------------------------------------------------*/ -#ifndef NDS_JTYPES_INCLUDE -#define NDS_JTYPES_INCLUDE -//--------------------------------------------------------------------------------- - - -#define PACKED __attribute__ ((packed)) -#define packed_struct struct PACKED - -//--------------------------------------------------------------------------------- -// libgba compatible section macros -//--------------------------------------------------------------------------------- -#define ITCM_CODE __attribute__((section(".itcm"), long_call)) - -#define DTCM_DATA __attribute__((section(".dtcm"))) -#define DTCM_BSS __attribute__((section(".sbss"))) -#define ALIGN(m) __attribute__((aligned (m))) - -#define PACKED __attribute__ ((packed)) -#define packed_struct struct PACKED - -//--------------------------------------------------------------------------------- -// These are linked to the bin2o macro in the Makefile -//--------------------------------------------------------------------------------- -#define GETRAW(name) (name) -#define GETRAWSIZE(name) ((int)name##_size) -#define GETRAWEND(name) ((int)name##_end) - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#define BIT(n) (1 << (n)) - -// define libnds types in terms of stdint -#include - -typedef uint8_t uint8; -typedef uint16_t uint16; -typedef uint32_t uint32; -typedef uint64_t uint64; - -typedef int8_t int8; -typedef int16_t int16; -typedef int32_t int32; -typedef int64_t int64; - -//typedef float float32; -typedef double float64; - -typedef volatile uint8_t vuint8; -typedef volatile uint16_t vuint16; -typedef volatile uint32_t vuint32; -typedef volatile uint64_t vuint64; - -typedef volatile int8_t vint8; -typedef volatile int16_t vint16; -typedef volatile int32_t vint32; -typedef volatile int64_t vint64; - -typedef volatile float vfloat32; -typedef volatile float64 vfloat64; - -typedef uint8_t byte; - -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; - -typedef int8_t s8; -typedef int16_t s16; -typedef int32_t s32; -typedef int64_t s64; - -typedef volatile u8 vu8; -typedef volatile u16 vu16; -typedef volatile u32 vu32; -typedef volatile u64 vu64; - -typedef volatile s8 vs8; -typedef volatile s16 vs16; -typedef volatile s32 vs32; -typedef volatile s64 vs64; - -typedef struct touchPosition { - int16 x; - int16 y; - int16 px; - int16 py; - int16 z1; - int16 z2; -} touchPosition; - - -#ifndef __cplusplus -/** C++ compatible bool for C - -*/ -typedef enum { false, true } bool; -#endif - -// Handy function pointer typedefs -typedef void ( * IntFn)(void); -typedef void (* VoidFunctionPointer)(void); -typedef void (* fp)(void); - -//--------------------------------------------------------------------------------- -#endif -//--------------------------------------------------------------------------------- - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Shapes/capsule88.patch b/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Shapes/capsule88.patch deleted file mode 100644 index 2dbb3336a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Enhancements/Shapes/capsule88.patch +++ /dev/null @@ -1,1359 +0,0 @@ -Index: Box2D/Box2D/Box2D.h -=================================================================== ---- Box2D/Box2D/Box2D.h (revision 70) -+++ Box2D/Box2D/Box2D.h (working copy) -@@ -35,6 +35,7 @@ - - #include - #include -+#include - - #include - #include -Index: Box2D/Box2D/CMakeLists.txt -=================================================================== ---- Box2D/Box2D/CMakeLists.txt (revision 70) -+++ Box2D/Box2D/CMakeLists.txt (working copy) -@@ -15,10 +15,12 @@ - Collision/b2TimeOfImpact.h - ) - set(BOX2D_Shapes_SRCS -+ Collision/Shapes/b2CapsuleShape.cpp - Collision/Shapes/b2CircleShape.cpp - Collision/Shapes/b2PolygonShape.cpp - ) - set(BOX2D_Shapes_HDRS -+ Collision/Shapes/b2CapsuleShape.h - Collision/Shapes/b2CircleShape.h - Collision/Shapes/b2PolygonShape.h - Collision/Shapes/b2Shape.h -@@ -53,18 +55,24 @@ - Dynamics/b2WorldCallbacks.h - ) - set(BOX2D_Contacts_SRCS -+ Dynamics/Contacts/b2CapsuleAndCircleContact.cpp -+ Dynamics/Contacts/b2CapsuleContact.cpp - Dynamics/Contacts/b2CircleContact.cpp - Dynamics/Contacts/b2Contact.cpp - Dynamics/Contacts/b2ContactSolver.cpp -+ Dynamics/Contacts/b2PolygonAndCapsuleContact.cpp - Dynamics/Contacts/b2PolygonAndCircleContact.cpp - Dynamics/Contacts/b2PolygonContact.cpp - Dynamics/Contacts/b2TOISolver.cpp - ) - set(BOX2D_Contacts_HDRS -+ Dynamics/Contacts/b2CapsuleAndCircleContact.h -+ Dynamics/Contacts/b2CapsuleContact.h - Dynamics/Contacts/b2CircleContact.h - Dynamics/Contacts/b2Contact.h - Dynamics/Contacts/b2ContactSolver.h - Dynamics/Contacts/b2NullContact.h -+ Dynamics/Contacts/b2PolygonAndCapsuleContact.h - Dynamics/Contacts/b2PolygonAndCircleContact.h - Dynamics/Contacts/b2PolygonContact.h - Dynamics/Contacts/b2TOISolver.h -Index: Box2D/Box2D/Collision/b2Collision.cpp -=================================================================== ---- Box2D/Box2D/Collision/b2Collision.cpp (revision 70) -+++ Box2D/Box2D/Collision/b2Collision.cpp (working copy) -@@ -248,3 +248,220 @@ - - return output.distance < 10.0f * b2_epsilon; - } -+ -+ -+// Collision Detection in Interactive 3D Environments by Gino van den Bergen -+// From Section 3.4.1 -+// x = mu1 * p1 + mu2 * p2 -+// mu1 + mu2 = 1 && mu1 >= 0 && mu2 >= 0 -+// mu1 = 1 - mu2; -+// x = (1 - mu2) * p1 + mu2 * p2 -+// = p1 + mu2 * (p2 - p1) -+// x = s + a * r (s := start, r := end - start) -+// s + a * r = p1 + mu2 * d (d := p2 - p1) -+// -a * r + mu2 * d = b (b := s - p1) -+// [-r d] * [a; mu2] = b -+// Cramer's rule: -+// denom = det[-r d] -+// a = det[b d] / denom -+// mu2 = det[-r b] / denom -+bool b2RaycastSegment(b2RayCastOutput* output, const b2RayCastInput& input, const b2Vec2& p1, const b2Vec2& p2) -+{ -+ b2Vec2 s = input.p1; -+ b2Vec2 r = input.p2 - s; -+ b2Vec2 d = p2 - p1; -+ b2Vec2 n = b2Cross(d, 1.0f); -+ -+ const float32 k_slop = 100.0f * b2_epsilon; -+ float32 denom = -b2Dot(r, n); -+ -+ // Cull back facing collision and ignore parallel segments. -+ if (denom > k_slop) -+ { -+ // Does the segment intersect the infinite line associated with this segment? -+ b2Vec2 b = s - p1; -+ float32 a = b2Dot(b, n); -+ -+ if (0.0f <= a && a <= input.maxFraction * denom) -+ { -+ float32 mu2 = -r.x * b.y + r.y * b.x; -+ -+ // Does the segment intersect this segment? -+ if (-k_slop * denom <= mu2 && mu2 <= denom * (1.0f + k_slop)) -+ { -+ a /= denom; -+ n.Normalize(); -+ output->normal = n; -+ output->fraction = a; -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -+ -+ -+static void FindNearestPointOnLineSegment( b2Vec2* nearest, float32* parameter, -+ const b2Vec2& A1, const b2Vec2& L, const b2Vec2& B, -+ bool infinite_line ) -+{ -+ float32 D = L.LengthSquared(); -+ if (D < b2_epsilon * b2_epsilon) -+ { -+ *nearest = A1; -+ return; -+ } -+ -+ b2Vec2 AB = B - A1; -+ *parameter = b2Dot(L, AB) / D; -+ if (!infinite_line) -+ { -+ *parameter = b2Clamp(*parameter, 0.0f, 1.0f); -+ } -+ *nearest = A1 + *parameter * L; -+} -+ -+// Based on Game Programming Gems 2 -+// Fast, Robust Intersection of 3D Line Segments -+// Graham Rhodes, Applied Research Associates -+b2Vec2 b2NearestPointOnLine(const b2Vec2& point, const b2Vec2& p1, const b2Vec2& p2) -+{ -+ b2Vec2 result; -+ float32 unused; -+ FindNearestPointOnLineSegment(&result, &unused, p1, p2 - p1, point, false); -+ return result; -+} -+ -+static void FindNearestPointOfParallelLineSegments( b2Vec2* x1, b2Vec2* x2, -+ const b2Vec2& A1, const b2Vec2& A2, const b2Vec2& La, -+ const b2Vec2& B1, const b2Vec2& B2, const b2Vec2& Lb) -+{ -+ float32 s, t; -+ FindNearestPointOnLineSegment(x1, &s, A1, La, B1, true); -+ FindNearestPointOnLineSegment(x2, &t, A1, La, B2, true); -+ -+ if (s < 0.0f && t < 0.0f) -+ { -+ *x1 = A1; -+ if (s < t) -+ *x2 = B2; -+ else -+ *x2 = B1; -+ return; -+ } -+ -+ if (s > 1.0f && t > 1.0f) -+ { -+ *x1 = A2; -+ if (s < t) -+ *x2 = B1; -+ else -+ *x2 = B2; -+ return; -+ } -+ -+ float32 temp = 0.5f * (b2Clamp(s, 0.0f, 1.0f) + b2Clamp(t, 0.0f, 1.0f)); -+ *x1 = A1 + temp * La; -+ -+ float32 unused; -+ FindNearestPointOnLineSegment(x2, &unused, B1, Lb, *x1, true); -+} -+ -+static void AdjustNearestPoints(b2Vec2* x1, b2Vec2* x2, -+ const b2Vec2& A1, const b2Vec2& A2, const b2Vec2& La, -+ const b2Vec2& B1, const b2Vec2& B2, const b2Vec2& Lb, -+ float32 s, float32 t) -+{ -+ if ((s < 0.0f || s > 1.0f) && (t < 0.0f || t > 1.0f)) -+ { -+ s = b2Clamp(s, 0.0f, 1.0f); -+ *x1 = A1 + s * La; -+ FindNearestPointOnLineSegment(x2, &t, B1, Lb, *x1, true); -+ if (t < 0.0f || t > 1.0f) -+ { -+ t = b2Clamp(t, 0.0f, 1.0f); -+ *x2 = B1 + t * Lb; -+ FindNearestPointOnLineSegment(x1, &s, A1, La, *x2, false); -+ FindNearestPointOnLineSegment(x2, &t, B1, Lb, *x1, false); -+ } -+ return; -+ } -+ if (s < 0.0f || s > 1.0f) -+ { -+ s = b2Clamp(s, 0.0f, 1.0f); -+ *x1 = A1 + s * La; -+ FindNearestPointOnLineSegment(x2, &t, B1, Lb, *x1, false); -+ return; -+ } -+ b2Assert(t < 0.0f || t > 1.0f); -+ t = b2Clamp(t, 0.0f, 1.0f); -+ *x2 = B1 + t * Lb; -+ FindNearestPointOnLineSegment(x1, &s, A1, La, *x2, false); -+} -+ -+static void IntersectLineSegments( b2Vec2* x1, b2Vec2* x2, -+ const b2Vec2& A1, const b2Vec2& A2, -+ const b2Vec2& B1, const b2Vec2& B2) -+{ -+ float32 unused; -+ -+ b2Vec2 La = A2 - A1; -+ b2Vec2 Lb = B2 - B1; -+ float32 L11 = La.LengthSquared(); -+ float32 L22 = Lb.LengthSquared(); -+ -+ // Check for degenerate parameters -+ if (L11 < b2_epsilon * b2_epsilon) -+ { -+ *x1 = A1; -+ FindNearestPointOnLineSegment(x2, &unused, B1, Lb, A1, false); -+ return; -+ } -+ if (L22 < b2_epsilon * b2_epsilon) -+ { -+ *x2 = B1; -+ FindNearestPointOnLineSegment(x1, &unused, A1, La, B1, false); -+ return; -+ } -+ -+ b2Vec2 AB = B1 - A1; -+ float32 L12 = -b2Dot(La, Lb); -+ float32 DetL = L11 * L22 - L12 * L12; -+ -+ // parallel segments -+ if (b2Abs(DetL) < b2_epsilon) -+ { -+ FindNearestPointOfParallelLineSegments(x1, x2, A1, A2, La, B1, B2, Lb); -+ return; -+ } -+ -+ float32 ra = b2Dot(La, AB); -+ float32 rb = -b2Dot(Lb, AB); -+ -+ float32 t = (L11 * rb - ra * L12) / DetL; -+ float32 s = (ra - L12 * t) / L11; -+ -+ // These tests can't quite stay within B2_FLT_EPSILON -+ //b2Assert(b2Abs(s * L11 + t * L12 - ra) < .0001f); -+ //b2Assert(b2Abs(s * L12 + t * L22 - rb) < .0001f); -+ -+ *x1 = A1 + s * La; -+ *x2 = B1 + t * Lb; -+ -+ if (s < 0.0f || s > 1.0f || t < 0.0f || t > 1.0f) -+ { -+ AdjustNearestPoints(x1, x2, A1, A2, La, B1, B2, Lb, s, t); -+ } -+} -+ -+// Based on Game Programming Gems 2 -+// Fast, Robust Intersection of 3D Line Segments -+// Graham Rhodes, Applied Research Associates -+float32 b2DistanceBetweenLines( b2Vec2* x1, b2Vec2* x2, -+ const b2Vec2& A1, const b2Vec2& A2, -+ const b2Vec2& B1, const b2Vec2& B2) -+{ -+ IntersectLineSegments(x1, x2, A1, A2, B1, B2); -+ return (*x2 - *x1).Length(); -+} -\ No newline at end of file -Index: Box2D/Box2D/Collision/b2Collision.h -=================================================================== ---- Box2D/Box2D/Collision/b2Collision.h (revision 70) -+++ Box2D/Box2D/Collision/b2Collision.h (working copy) -@@ -27,6 +27,7 @@ - /// queries, and TOI queries. - - class b2Shape; -+class b2CapsuleShape; - class b2CircleShape; - class b2PolygonShape; - -@@ -212,6 +213,18 @@ - bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, - const b2Transform& xfA, const b2Transform& xfB); - -+/// Perform a raycast against a given line segment. -+bool b2RaycastSegment(b2RayCastOutput* output, const b2RayCastInput& input, const b2Vec2& p1, const b2Vec2& p2); -+ -+/// Find the nearest point on a line. -+b2Vec2 b2NearestPointOnLine(const b2Vec2& point, const b2Vec2& p1, const b2Vec2& p2); -+ -+/// Find the nearest points on between two different lines. -+float32 b2DistanceBetweenLines( b2Vec2* x1, b2Vec2* x2, -+ const b2Vec2& A1, const b2Vec2& A2, -+ const b2Vec2& B1, const b2Vec2& B2); -+ -+ - // ---------------- Inline Functions ------------------------------------------ - - inline bool b2AABB::IsValid() const -Index: Box2D/Box2D/Collision/b2Distance.cpp -=================================================================== ---- Box2D/Box2D/Collision/b2Distance.cpp (revision 70) -+++ Box2D/Box2D/Collision/b2Distance.cpp (working copy) -@@ -17,6 +17,7 @@ - */ - - #include -+#include - #include - #include - -@@ -44,6 +45,15 @@ - m_radius = polygon->m_radius; - } - break; -+ -+ case b2Shape::e_capsule: -+ { -+ const b2CapsuleShape* capsule = (b2CapsuleShape*)shape; -+ m_vertices = capsule->m_vertices; -+ m_count = 2; -+ m_radius = capsule->m_radius; -+ } -+ break; - - default: - b2Assert(false); -Index: Box2D/Box2D/Collision/Shapes/b2CapsuleShape.cpp -=================================================================== ---- Box2D/Box2D/Collision/Shapes/b2CapsuleShape.cpp (revision 0) -+++ Box2D/Box2D/Collision/Shapes/b2CapsuleShape.cpp (revision 0) -@@ -0,0 +1,194 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#include -+#include -+ -+void b2CapsuleShape::SetByExtentsX(float32 radius, float32 length) -+{ -+ m_radius = radius; -+ float32 half = length * 0.5f; -+ m_vertices[0] = b2Vec2(-half, 0.0f); -+ m_vertices[1] = b2Vec2(half, 0.0f); -+} -+ -+void b2CapsuleShape::SetByExtentsX(float32 radius, float32 length, -+ const b2Vec2& center, float32 angle) -+{ -+ SetByExtentsX(radius, length); -+ b2Transform xf; -+ xf.position = center; -+ xf.R.Set(angle); -+ -+ m_vertices[0] = b2Mul(xf, m_vertices[0]); -+ m_vertices[1] = b2Mul(xf, m_vertices[1]); -+} -+ -+ -+void b2CapsuleShape::SetByExtentsY(float32 radius, float32 height) -+{ -+ m_radius = radius; -+ float32 half = height * 0.5f; -+ m_vertices[0] = b2Vec2(0.0f, -half); -+ m_vertices[1] = b2Vec2(0.0f, half); -+} -+ -+void b2CapsuleShape::SetByExtentsY(float32 radius, float32 height, -+ const b2Vec2& center, float32 angle) -+{ -+ SetByExtentsY(radius, height); -+ b2Transform xf; -+ xf.position = center; -+ xf.R.Set(angle); -+ -+ m_vertices[0] = b2Mul(xf, m_vertices[0]); -+ m_vertices[1] = b2Mul(xf, m_vertices[1]); -+} -+ -+b2Shape* b2CapsuleShape::Clone(b2BlockAllocator* allocator) const -+{ -+ void* mem = allocator->Allocate(sizeof(b2CapsuleShape)); -+ b2CapsuleShape* clone = new (mem) b2CapsuleShape; -+ *clone = *this; -+ return clone; -+} -+ -+bool b2CapsuleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const -+{ -+ b2Vec2 local = b2MulT(transform, p); -+ b2Vec2 d = b2NearestPointOnLine(local, m_vertices[0], m_vertices[1]) - local; -+ return (d.LengthSquared() <= m_radius * m_radius); -+} -+ -+bool b2CapsuleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const -+{ -+ // Test for starting inside first significantly reduces complexity -+ if (TestPoint(transform, input.p1)) { -+ return false; -+ } -+ -+ // Project capsule to world -+ b2Vec2 capsule[2]; -+ capsule[0] = b2Mul(transform, m_vertices[0]); -+ capsule[1] = b2Mul(transform, m_vertices[1]); -+ b2Vec2 d = capsule[1] - capsule[0]; -+ -+ // Consider "cylinder" -+ -+ // Figure out signed distance from p1 to infinite capsule line -+ float32 ld = b2Cross(d, capsule[0] - input.p1); -+ -+ // Only bother if we don't start inside the infinite "cylinder" -+ if (!(ld * ld <= m_radius * m_radius * d.LengthSquared())) { -+ -+ // Find a perpendicular vector to the intersect, with length equal to radius -+ b2Vec2 perp = b2Cross(d, m_radius / d.Length()); -+ -+ // Push the capsule segment by that vector -+ // Must swap if coming from the other side -+ b2Vec2 boundary[2]; -+ if (ld < 0) { -+ boundary[0] = capsule[1] - perp; -+ boundary[1] = capsule[0] - perp; -+ } -+ else { -+ boundary[0] = capsule[0] + perp; -+ boundary[1] = capsule[1] + perp; -+ } -+ -+ // Check intersection against the adjusted segments. -+ if (b2RaycastSegment(output, input, boundary[0], boundary[1])) -+ return true; -+ } -+ -+ // Consider circular caps -+ -+ // Precompute some circle values -+ b2Vec2 r = input.p2 - input.p1; -+ float32 rr = r.LengthSquared(); -+ -+ // Check for short segment -+ if (rr < b2_epsilon) -+ { -+ return false; -+ } -+ -+ // Check the circle caps, starting with closer -+ int startingIndex = 0; -+ if ((capsule[1] - input.p1).LengthSquared() < (capsule[0] - input.p1).LengthSquared()) { -+ startingIndex = 1; -+ } -+ b2Vec2 center = capsule[startingIndex]; -+ for (int i = 0; i < 2; ++i) -+ { -+ b2Vec2 s = input.p1 - center; -+ float32 b = b2Dot(s, s) - m_radius * m_radius; -+ -+ // Should not start inside -+ b2Assert(!(b < 0.0f)); -+ -+ // Solve quadratic equation. -+ float32 c = b2Dot(s, r); -+ float32 sigma = c * c - rr * b; -+ -+ // Check for negative discriminant. -+ if (!(sigma < 0.0f)) -+ { -+ // Find the point of intersection of the line with the circle. -+ float32 a = -(c + b2Sqrt(sigma)); -+ -+ // Is the intersection point on the segment? -+ if (0.0f <= a && a <= input.maxFraction * rr) -+ { -+ a /= rr; -+ output->fraction = a; -+ output->normal = s + a * r; -+ output->normal.Normalize(); -+ return true; -+ } -+ } -+ center = capsule[!startingIndex]; -+ } -+ -+ return false; -+} -+ -+void b2CapsuleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform) const -+{ -+ b2Vec2 p1 = transform.position + b2Mul(transform.R, m_vertices[0]); -+ b2Vec2 p2 = transform.position + b2Mul(transform.R, m_vertices[1]); -+ b2Vec2 min = b2Min(p1, p2); -+ b2Vec2 max = b2Max(p1, p2); -+ aabb->lowerBound.Set(min.x - m_radius, min.y - m_radius); -+ aabb->upperBound.Set(max.x + m_radius, max.y + m_radius); -+} -+ -+void b2CapsuleShape::ComputeMass(b2MassData* massData, float32 density) const -+{ -+ // Area of rectangle + 2 half circles -+ float32 rectHeight = (m_vertices[1] - m_vertices[0]).Length(); -+ float32 rectMass = density * rectHeight * m_radius; -+ float32 circleMass = density * b2_pi * m_radius * m_radius; -+ massData->mass = rectMass + circleMass; -+ massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); -+ -+ // inertia about the local origin -+ float32 rectInertia = rectMass * (rectHeight * rectHeight + m_radius * m_radius) / 12.0f; -+ float32 circleInertia = circleMass * (0.5f * m_radius * m_radius + rectHeight * rectHeight * .25f); -+ massData->I = rectInertia + circleInertia + massData->mass * massData->center.LengthSquared(); -+} -Index: Box2D/Box2D/Collision/Shapes/b2CapsuleShape.h -=================================================================== ---- Box2D/Box2D/Collision/Shapes/b2CapsuleShape.h (revision 0) -+++ Box2D/Box2D/Collision/Shapes/b2CapsuleShape.h (revision 0) -@@ -0,0 +1,103 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#ifndef B2_CAPSULE_SHAPE_H -+#define B2_CAPSULE_SHAPE_H -+ -+#include -+ -+/// A circle shape. -+class b2CapsuleShape : public b2Shape -+{ -+public: -+ b2CapsuleShape(); -+ -+ /// Set to a capsule across the X axis, with given width between focii. -+ void SetByExtentsX(float32 radius, float32 width); -+ /// Set to a capsule across the X axis, rotated and transposed. -+ void SetByExtentsX(float32 radius, float32 width, -+ const b2Vec2& center, float32 angle); -+ -+ /// Set to a capsule across the Y axis, with given height between focii. -+ void SetByExtentsY(float32 radius, float32 height); -+ /// Set to a capsule across the Y axis, rotated and transposed. -+ void SetByExtentsY(float32 radius, float32 height, -+ const b2Vec2& center, float32 angle); -+ -+ /// Implement b2Shape. -+ b2Shape* Clone(b2BlockAllocator* allocator) const; -+ -+ /// Implement b2Shape. -+ bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; -+ -+ /// Implement b2Shape. -+ bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; -+ -+ /// @see b2Shape::ComputeAABB -+ void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; -+ -+ /// @see b2Shape::ComputeMass -+ void ComputeMass(b2MassData* massData, float32 density) const; -+ -+ /// Get the supporting vertex index in the given direction. -+ int32 GetSupport(const b2Vec2& d) const; -+ -+ /// Get the supporting vertex in the given direction. -+ const b2Vec2& GetSupportVertex(const b2Vec2& d) const; -+ -+ /// Get the vertex count. -+ int32 GetVertexCount() const { return 2; } -+ -+ /// Get a vertex by index. Used by b2Distance. -+ const b2Vec2& GetVertex(int32 index) const; -+ -+ /// Position of circle centers -+ b2Vec2 m_vertices[2]; -+}; -+ -+inline b2CapsuleShape::b2CapsuleShape() -+{ -+ m_type = e_capsule; -+ m_radius = 0.0f; -+ m_vertices[0].SetZero(); -+ m_vertices[1].SetZero(); -+} -+ -+ -+inline int32 b2CapsuleShape::GetSupport(const b2Vec2 &d) const -+{ -+ if ((m_vertices[0] - d).LengthSquared() <= (m_vertices[1] - d).LengthSquared()) { -+ return 0; -+ } -+ return 1; -+} -+ -+inline const b2Vec2& b2CapsuleShape::GetSupportVertex(const b2Vec2 &d) const -+{ -+ return GetVertex(GetSupport(d)); -+} -+ -+inline const b2Vec2& b2CapsuleShape::GetVertex(int32 index) const -+{ -+ b2Assert(index == 0 || index == 1); -+ return m_vertices[index]; -+} -+ -+ -+ -+#endif -Index: Box2D/Box2D/Collision/Shapes/b2Shape.h -=================================================================== ---- Box2D/Box2D/Collision/Shapes/b2Shape.h (revision 70) -+++ Box2D/Box2D/Collision/Shapes/b2Shape.h (working copy) -@@ -48,7 +48,8 @@ - e_unknown= -1, - e_circle = 0, - e_polygon = 1, -- e_typeCount = 2, -+ e_capsule = 2, -+ e_typeCount = 3, - }; - - b2Shape() { m_type = e_unknown; } -Index: Box2D/Box2D/Dynamics/b2Fixture.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/b2Fixture.cpp (revision 70) -+++ Box2D/Box2D/Dynamics/b2Fixture.cpp (working copy) -@@ -18,6 +18,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -82,6 +83,14 @@ - allocator->Free(s, sizeof(b2PolygonShape)); - } - break; -+ -+ case b2Shape::e_capsule: -+ { -+ b2CapsuleShape* s = (b2CapsuleShape*)m_shape; -+ s->~b2CapsuleShape(); -+ allocator->Free(s, sizeof(b2CapsuleShape)); -+ } -+ break; - - default: - b2Assert(false); -Index: Box2D/Box2D/Dynamics/b2World.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/b2World.cpp (revision 70) -+++ Box2D/Box2D/Dynamics/b2World.cpp (working copy) -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -907,6 +908,18 @@ - m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); - } - break; -+ -+ case b2Shape::e_capsule: -+ { -+ b2CapsuleShape* capsule = (b2CapsuleShape*)fixture->GetShape(); -+ -+ b2Vec2 p1 = b2Mul(xf, capsule->m_vertices[0]); -+ b2Vec2 p2 = b2Mul(xf, capsule->m_vertices[1]); -+ float32 radius = capsule->m_radius; -+ -+ m_debugDraw->DrawSolidCapsule(p1, p2, radius, color); -+ } -+ break; - } - } - -Index: Box2D/Box2D/Dynamics/b2WorldCallbacks.h -=================================================================== ---- Box2D/Box2D/Dynamics/b2WorldCallbacks.h (revision 70) -+++ Box2D/Box2D/Dynamics/b2WorldCallbacks.h (working copy) -@@ -206,6 +206,12 @@ - /// Draw a solid circle. - virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0; - -+ /// Draw a capsule. -+ virtual void DrawCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color) = 0; -+ -+ /// Draw a solid capsule. -+ virtual void DrawSolidCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color) = 0; -+ - /// Draw a line segment. - virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0; - -Index: Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.cpp (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.cpp (revision 0) -@@ -0,0 +1,63 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+b2Contact* b2CapsuleAndCircleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -+{ -+ void* mem = allocator->Allocate(sizeof(b2CapsuleAndCircleContact)); -+ return new (mem) b2CapsuleAndCircleContact(fixtureA, fixtureB); -+} -+ -+void b2CapsuleAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -+{ -+ ((b2CapsuleAndCircleContact*)contact)->~b2CapsuleAndCircleContact(); -+ allocator->Free(contact, sizeof(b2CapsuleAndCircleContact)); -+} -+ -+b2CapsuleAndCircleContact::b2CapsuleAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) -+ : b2Contact(fixtureA, fixtureB) -+{ -+ b2Assert(m_fixtureA->GetType() == b2Shape::e_capsule); -+ b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); -+} -+ -+void b2CapsuleAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -+{ -+ b2Body* bodyA = m_fixtureA->GetBody(); -+ b2Body* bodyB = m_fixtureB->GetBody(); -+ -+ b2CapsuleShape* capsule = (b2CapsuleShape*)m_fixtureA->GetShape(); -+ -+ b2PolygonShape polygon; -+ polygon.SetAsEdge(capsule->m_vertices[0], capsule->m_vertices[1]); -+ polygon.m_radius = capsule->m_radius; -+ -+ b2CollidePolygonAndCircle( manifold, -+ &polygon, xfA, -+ (b2CircleShape*)m_fixtureB->GetShape(), xfB); -+} -Index: Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.h -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.h (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2CapsuleAndCircleContact.h (revision 0) -@@ -0,0 +1,38 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#ifndef B2_CAPSULE_AND_CIRCLE_CONTACT_H -+#define B2_CAPSULE_AND_CIRCLE_CONTACT_H -+ -+#include -+ -+class b2BlockAllocator; -+ -+class b2CapsuleAndCircleContact : public b2Contact -+{ -+public: -+ static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); -+ static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); -+ -+ b2CapsuleAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); -+ ~b2CapsuleAndCircleContact() {} -+ -+ void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -+}; -+ -+#endif -Index: Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.cpp (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.cpp (revision 0) -@@ -0,0 +1,66 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+b2Contact* b2CapsuleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -+{ -+ void* mem = allocator->Allocate(sizeof(b2CapsuleContact)); -+ return new (mem) b2CapsuleContact(fixtureA, fixtureB); -+} -+ -+void b2CapsuleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -+{ -+ ((b2CapsuleContact*)contact)->~b2CapsuleContact(); -+ allocator->Free(contact, sizeof(b2CapsuleContact)); -+} -+ -+b2CapsuleContact::b2CapsuleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) -+ : b2Contact(fixtureA, fixtureB) -+{ -+ b2Assert(m_fixtureA->GetType() == b2Shape::e_capsule); -+ b2Assert(m_fixtureB->GetType() == b2Shape::e_capsule); -+} -+ -+void b2CapsuleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -+{ -+ b2Body* bodyA = m_fixtureA->GetBody(); -+ b2Body* bodyB = m_fixtureB->GetBody(); -+ -+ b2CapsuleShape* capsule1 = (b2CapsuleShape*)m_fixtureA->GetShape(); -+ b2CapsuleShape* capsule2 = (b2CapsuleShape*)m_fixtureB->GetShape(); -+ -+ b2PolygonShape polygon1, polygon2; -+ polygon1.SetAsEdge(capsule1->m_vertices[0], capsule1->m_vertices[1]); -+ polygon2.SetAsEdge(capsule2->m_vertices[0], capsule2->m_vertices[1]); -+ polygon1.m_radius = capsule1->m_radius; -+ polygon2.m_radius = capsule2->m_radius; -+ -+ b2CollidePolygons( manifold, -+ &polygon1, xfA, -+ &polygon2, xfB); -+} -Index: Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.h -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.h (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2CapsuleContact.h (revision 0) -@@ -0,0 +1,38 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#ifndef B2_CAPSULE_CONTACT_H -+#define B2_CAPSULE_CONTACT_H -+ -+#include -+ -+class b2BlockAllocator; -+ -+class b2CapsuleContact : public b2Contact -+{ -+public: -+ static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); -+ static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); -+ -+ b2CapsuleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); -+ ~b2CapsuleContact() {} -+ -+ void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -+}; -+ -+#endif -Index: Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp (revision 70) -+++ Box2D/Box2D/Dynamics/Contacts/b2Contact.cpp (working copy) -@@ -17,7 +17,10 @@ - */ - - #include -+#include -+#include - #include -+#include - #include - #include - #include -@@ -38,6 +41,10 @@ - AddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle); - AddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle); - AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon); -+ -+ AddType(b2CapsuleContact::Create, b2CapsuleContact::Destroy, b2Shape::e_capsule, b2Shape::e_capsule); -+ AddType(b2CapsuleAndCircleContact::Create, b2CapsuleAndCircleContact::Destroy, b2Shape::e_capsule, b2Shape::e_circle); -+ AddType(b2PolygonAndCapsuleContact::Create, b2PolygonAndCapsuleContact::Destroy, b2Shape::e_polygon, b2Shape::e_capsule); - } - - void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, -Index: Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.cpp -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.cpp (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.cpp (revision 0) -@@ -0,0 +1,63 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+b2Contact* b2PolygonAndCapsuleContact::Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator) -+{ -+ void* mem = allocator->Allocate(sizeof(b2PolygonAndCapsuleContact)); -+ return new (mem) b2PolygonAndCapsuleContact(fixtureA, fixtureB); -+} -+ -+void b2PolygonAndCapsuleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) -+{ -+ ((b2PolygonAndCapsuleContact*)contact)->~b2PolygonAndCapsuleContact(); -+ allocator->Free(contact, sizeof(b2PolygonAndCapsuleContact)); -+} -+ -+b2PolygonAndCapsuleContact::b2PolygonAndCapsuleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) -+ : b2Contact(fixtureA, fixtureB) -+{ -+ b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); -+ b2Assert(m_fixtureB->GetType() == b2Shape::e_capsule); -+} -+ -+void b2PolygonAndCapsuleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) -+{ -+ b2Body* bodyA = m_fixtureA->GetBody(); -+ b2Body* bodyB = m_fixtureB->GetBody(); -+ -+ b2CapsuleShape* capsule = (b2CapsuleShape*)m_fixtureB->GetShape(); -+ -+ b2PolygonShape polygon; -+ polygon.SetAsEdge(capsule->m_vertices[0], capsule->m_vertices[1]); -+ polygon.m_radius = capsule->m_radius; -+ -+ b2CollidePolygons( manifold, -+ (b2PolygonShape*)m_fixtureA->GetShape(), xfA, -+ &polygon, xfB); -+} -Index: Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.h -=================================================================== ---- Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.h (revision 0) -+++ Box2D/Box2D/Dynamics/Contacts/b2PolygonAndCapsuleContact.h (revision 0) -@@ -0,0 +1,38 @@ -+/* -+* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -+* -+* This software is provided 'as-is', without any express or implied -+* warranty. In no event will the authors be held liable for any damages -+* arising from the use of this software. -+* Permission is granted to anyone to use this software for any purpose, -+* including commercial applications, and to alter it and redistribute it -+* freely, subject to the following restrictions: -+* 1. The origin of this software must not be misrepresented; you must not -+* claim that you wrote the original software. If you use this software -+* in a product, an acknowledgment in the product documentation would be -+* appreciated but is not required. -+* 2. Altered source versions must be plainly marked as such, and must not be -+* misrepresented as being the original software. -+* 3. This notice may not be removed or altered from any source distribution. -+*/ -+ -+#ifndef B2_POLYGON_AND_CAPSULE_CONTACT_H -+#define B2_POLYGON_AND_CAPSULE_CONTACT_H -+ -+#include -+ -+class b2BlockAllocator; -+ -+class b2PolygonAndCapsuleContact : public b2Contact -+{ -+public: -+ static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator); -+ static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); -+ -+ b2PolygonAndCapsuleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); -+ ~b2PolygonAndCapsuleContact() {} -+ -+ void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); -+}; -+ -+#endif -Index: Box2D/Testbed/Framework/Render.cpp -=================================================================== ---- Box2D/Testbed/Framework/Render.cpp (revision 70) -+++ Box2D/Testbed/Framework/Render.cpp (working copy) -@@ -110,6 +110,83 @@ - glEnd(); - } - -+void DebugDraw::DrawCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color) -+{ -+ b2Vec2 displacement = p2 - p1; -+ displacement.Normalize(); -+ float32 startingAngle = atan2f(displacement.y, displacement.x) + b2_pi / 2; -+ -+ const float32 k_segments = 8.0f; -+ const float32 k_increment = b2_pi / k_segments; -+ float32 theta = startingAngle; -+ glColor3f(color.r, color.g, color.b); -+ glBegin(GL_LINE_LOOP); -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p1 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p2 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ glEnd(); -+} -+ -+void DebugDraw::DrawSolidCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color) -+{ -+ b2Vec2 displacement = p2 - p1; -+ displacement.Normalize(); -+ float32 startingAngle = atan2f(displacement.y, displacement.x) + b2_pi / 2; -+ -+ const float32 k_segments = 8.0f; -+ const float32 k_increment = b2_pi / k_segments; -+ float32 theta = startingAngle; -+ glEnable(GL_BLEND); -+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -+ glColor4f(0.5f * color.r, 0.5f * color.g, 0.5f * color.b, 0.5f); -+ glBegin(GL_TRIANGLE_FAN); -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p1 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p2 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ glEnd(); -+ glDisable(GL_BLEND); -+ -+ theta = startingAngle; -+ glColor4f(color.r, color.g, color.b, 1.0f); -+ glBegin(GL_LINE_LOOP); -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p1 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ for (int32 i = 0; i < k_segments; ++i) -+ { -+ b2Vec2 v = p2 + radius * b2Vec2(cosf(theta), sinf(theta)); -+ glVertex2f(v.x, v.y); -+ theta += k_increment; -+ } -+ glEnd(); -+ -+ glBegin(GL_LINES); -+ glVertex2f(p1.x, p1.y); -+ glVertex2f(p2.x, p2.y); -+ glEnd(); -+} -+ - void DebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) - { - glColor3f(color.r, color.g, color.b); -Index: Box2D/Testbed/Framework/Render.h -=================================================================== ---- Box2D/Testbed/Framework/Render.h (revision 70) -+++ Box2D/Testbed/Framework/Render.h (working copy) -@@ -36,6 +36,10 @@ - - void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color); - -+ void DrawCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color); -+ -+ void DrawSolidCapsule(const b2Vec2& p1, const b2Vec2& p2, float32 radius, const b2Color& color); -+ - void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color); - - void DrawTransform(const b2Transform& xf); -Index: Box2D/Testbed/Tests/PolyShapes.h -=================================================================== ---- Box2D/Testbed/Tests/PolyShapes.h (revision 70) -+++ Box2D/Testbed/Tests/PolyShapes.h (working copy) -@@ -74,6 +74,19 @@ - m_debugDraw->DrawPolygon(vertices, vertexCount, color); - } - break; -+ -+ case b2Shape::e_capsule: -+ { -+ b2CapsuleShape* capsule = (b2CapsuleShape*)fixture->GetShape(); -+ -+ b2Vec2 p1 = b2Mul(xf, capsule->m_vertices[0]); -+ b2Vec2 p2 = b2Mul(xf, capsule->m_vertices[1]); -+ float32 radius = capsule->m_radius; -+ -+ m_debugDraw->DrawCapsule(p1, p2, radius, color); -+ } -+ break; -+ - } - } - -@@ -163,6 +176,14 @@ - m_circle.m_radius = 0.5f; - } - -+ { -+ m_capsules[0].SetByExtentsX(0.5f, 0.5f); -+ } -+ -+ { -+ m_capsules[1].SetByExtentsY(0.1f, 1.8f, b2Vec2(0.0f, 1.0f), 0.0f); -+ } -+ - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - } -@@ -197,7 +218,7 @@ - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } -- else -+ else if (index == 4) - { - b2FixtureDef fd; - fd.shape = &m_circle; -@@ -206,6 +227,15 @@ - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } -+ else -+ { -+ b2FixtureDef fd; -+ fd.shape = m_capsules + (index - 5); -+ fd.density = 1.0f; -+ fd.friction = 0.3f; -+ -+ m_bodies[m_bodyIndex]->CreateFixture(&fd); -+ } - - m_bodyIndex = (m_bodyIndex + 1) % k_maxBodies; - } -@@ -232,6 +262,8 @@ - case '3': - case '4': - case '5': -+ case '6': -+ case '7': - Create(key - '1'); - break; - -@@ -270,7 +302,7 @@ - b2Color color(0.4f, 0.7f, 0.8f); - m_debugDraw.DrawCircle(callback.m_circle.m_p, callback.m_circle.m_radius, color); - -- m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff"); -+ m_debugDraw.DrawString(5, m_textLine, "Press 1-7 to drop stuff"); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Press 'a' to (de)activate some bodies"); - m_textLine += 15; -@@ -287,6 +319,7 @@ - b2Body* m_bodies[k_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; -+ b2CapsuleShape m_capsules[2]; - }; - - #endif -Index: Box2D/Testbed/Tests/RayCast.h -=================================================================== ---- Box2D/Testbed/Tests/RayCast.h (revision 70) -+++ Box2D/Testbed/Tests/RayCast.h (working copy) -@@ -211,6 +211,14 @@ - m_circle.m_radius = 0.5f; - } - -+ { -+ m_capsules[0].SetByExtentsX(0.5f, 0.5f); -+ } -+ -+ { -+ m_capsules[1].SetByExtentsY(0.1f, 1.8f, b2Vec2(0.0f, 1.0f), 0.0f); -+ } -+ - m_bodyIndex = 0; - memset(m_bodies, 0, sizeof(m_bodies)); - -@@ -251,7 +259,7 @@ - fd.friction = 0.3f; - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } -- else -+ else if (index == 4) - { - b2FixtureDef fd; - fd.shape = &m_circle; -@@ -259,6 +267,14 @@ - - m_bodies[m_bodyIndex]->CreateFixture(&fd); - } -+ else -+ { -+ b2FixtureDef fd; -+ fd.shape = m_capsules + (index - 5); -+ fd.friction = 0.3f; -+ -+ m_bodies[m_bodyIndex]->CreateFixture(&fd); -+ } - - m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; - } -@@ -285,6 +301,8 @@ - case '3': - case '4': - case '5': -+ case '6': -+ case '7': - Create(key - '1'); - break; - -@@ -311,7 +329,7 @@ - void Step(Settings* settings) - { - Test::Step(settings); -- m_debugDraw.DrawString(5, m_textLine, "Press 1-5 to drop stuff, m to change the mode"); -+ m_debugDraw.DrawString(5, m_textLine, "Press 1-7 to drop stuff, m to change the mode"); - m_textLine += 15; - m_debugDraw.DrawString(5, m_textLine, "Mode = %d", m_mode); - m_textLine += 15; -@@ -385,6 +403,7 @@ - int32 m_userData[e_maxBodies]; - b2PolygonShape m_polygons[4]; - b2CircleShape m_circle; -+ b2CapsuleShape m_capsules[2]; - - float32 m_angle; - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AABB.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AABB.cpp deleted file mode 100644 index 6a156191f..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AABB.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class AABB - { - public: - Vector ^lowerBound, ^upperBound; - - bool IsValid() - { - return getAABB().IsValid(); - } - - AABB(Vector^ min, Vector^ max) : lowerBound(gcnew Vector(min)), upperBound(gcnew Vector(max)) { } - AABB() : lowerBound(gcnew Vector()), upperBound(gcnew Vector()) { } - - b2AABB getAABB() - { - b2AABB returnme; - returnme.lowerBound = lowerBound->getVec2(); - returnme.upperBound = upperBound->getVec2(); - return returnme; - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AssemblyInfo.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AssemblyInfo.cpp deleted file mode 100644 index f2f772cfe..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/AssemblyInfo.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "stdafx.h" - -using namespace System; -using namespace System::Reflection; -using namespace System::Runtime::CompilerServices; -using namespace System::Runtime::InteropServices; -using namespace System::Security::Permissions; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly:AssemblyTitleAttribute("Box2DNet")]; -[assembly:AssemblyDescriptionAttribute("A .NET wrapper for the Box2D physics library")]; -[assembly:AssemblyConfigurationAttribute("")]; -[assembly:AssemblyCompanyAttribute("")]; -[assembly:AssemblyProductAttribute("Box2DNet")]; -[assembly:AssemblyCopyrightAttribute("Copyright (c) Jay Lemmon 2008")]; -[assembly:AssemblyTrademarkAttribute("")]; -[assembly:AssemblyCultureAttribute("")]; - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the value or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly:AssemblyVersionAttribute("1.0.*")]; - -[assembly:ComVisible(false)]; - -[assembly:CLSCompliantAttribute(true)]; - -[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Body.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Body.cpp deleted file mode 100644 index c3eab8f02..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Body.cpp +++ /dev/null @@ -1,250 +0,0 @@ -#pragma once - -#include "Stdafx.h" -#include "Vector.cpp" -#include "Shape.cpp" -#include "ShapeDef.cpp" - -namespace Box2D -{ - namespace Net - { - /// - /// A rigid body. Internal computation are done in terms - /// of the center of mass position. The center of mass may - /// be offset from the body's origin. - /// - public ref class Body - { - internal: - b2Body *body; - Body(b2Body *bodyRef) : body(bodyRef) { } - public: - - /// - /// Set the position of the body's origin and rotation (radians). - /// This breaks any contacts and wakes the other bodies. - /// - void SetXForm(Vector^ position, float32 rotation) - { - body->SetXForm(position->getVec2(), rotation); - } - - /// - /// Get the position of the body's origin. The body's origin does not - /// necessarily coincide with the center of mass. It depends on how the - /// shapes are created. - /// - XForm^ GetXForm() - { - return gcnew XForm(body->GetXForm()); - } - - ///Accesses the linear velocity of the center of mass. - property Vector^ LinearVelocity - { - Vector^ get() - { - return gcnew Vector(body->GetLinearVelocity()); - } - - void set(Vector^ value) - { - body->SetLinearVelocity(value->getVec2()); - } - } - - ///Accesses the angular velocity. - property float32 AngularVelocity - { - float32 get() - { - return body->GetAngularVelocity(); - } - - void set(float32 value) - { - body->SetAngularVelocity(value); - } - } - - /// Apply a force at a world point. Additive. - void ApplyForce(Vector^ Force, Vector^ Point) - { - body->ApplyForce(Force->getVec2(), Point->getVec2()); - } - - /// Apply a torque. Additive. - void ApplyTorque(float32 Torque) - { - body->ApplyTorque(Torque); - } - - /// Apply an impulse at a point. This immediately modifies the velocity. - void ApplyImpulse(Vector^ Impulse, Vector^ Point) - { - body->ApplyImpulse(Impulse->getVec2(), Point->getVec2()); - } - - ///Accesses the Mass. - property float32 Mass - { - float32 get() - { - return body->GetMass(); - } - } - - ///Accesses the Mass. - property float32 Inertia - { - float32 get() - { - return body->GetInertia(); - } - } - - /// - /// Get the world coordinates of a point give the local coordinates - /// relative to the body's center of mass. - /// - Vector^ GetWorldPoint(Vector^ LocalPoint) - { - return gcnew Vector(body->GetWorldPoint(LocalPoint->getVec2())); - } - - /// - /// Get the world coordinates of a vector given the local coordinates. - /// - Vector^ GetWorldVector(Vector^ LocalVector) - { - return gcnew Vector(body->GetWorldVector(LocalVector->getVec2())); - } - - /// - /// Returns a local point relative to the center of mass given a world point. - /// - Vector^ GetLocalPoint(Vector^ WorldPoint) - { - return gcnew Vector(body->GetLocalPoint(WorldPoint->getVec2())); - } - - /// - /// Returns a local vector given a world vector. - /// - Vector^ GetLocalVector(Vector^ WorldVector) - { - return gcnew Vector(body->GetLocalVector(WorldVector->getVec2())); - } - - ///Is this body static (immovable) - property bool Static - { - bool get() - { - return body->IsStatic(); - } - } - - ///Is this body frozen - property bool Frozen - { - bool get() - { - return body->IsFrozen(); - } - } - - ///Is this body sleeping - property bool Sleeping - { - bool get() - { - return body->IsSleeping(); - } - } - - ///You can disable sleeping on this particular body. - property bool AllowSleeping - { - bool get() - { - return body->IsSleeping(); - } - - void set(bool value) - { - body->AllowSleeping(value); - } - } - - property bool Bullet - { - bool get() - { - return body->IsBullet(); - } - - void set(bool value) - { - body->SetBullet(value); - } - } - - void WakeUp() - { - body->WakeUp(); - } - - /// Get the list of all shapes attached to this body. - property IList^ Shapes - { - IList^ get() - { - List^ list = gcnew List(); - for(b2Shape *shape = body->GetShapeList(); shape; shape = shape->GetNext()) - list->Add(gcnew Shape(shape)); - - return list; - } - } - - void CreateShape(ShapeDef^ def) - { - body->CreateShape(def->def); - } - - void DestroyShape(Shape^ shape) - { - body->DestroyShape(shape->shape); - } - - void SetMassFromShapes() - { - body->SetMassFromShapes(); - } - - //TODO: - //void* GetUserData(); - //const b2Mat22& GetRotationMatrix() const; - }; - } -} - -/* -TODO: - -public: - // Get the list of all contacts attached to this body. - b2ContactNode* GetContactList(); - - // Get the list of all joints attached to this body. - b2JointNode* GetJointList(); -*/ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/BodyDef.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/BodyDef.cpp deleted file mode 100644 index 4a62153c2..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/BodyDef.cpp +++ /dev/null @@ -1,175 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" -#include "ShapeDef.cpp" - -using namespace System::Collections::Generic; - -namespace Box2D -{ - namespace Net - { - /// The type of body. - public enum class BodyType - { - e_staticBody = ::b2BodyDef::e_staticBody, ///< A static body should not move and has infinite mass. - e_dynamicBody = ::b2BodyDef::e_dynamicBody ///< A regular moving body. - }; - - public ref class BodyDef - { - internal: - b2BodyDef *def; - - public: - BodyDef() : def(new b2BodyDef()) { } - virtual ~BodyDef() - { - delete def; - } - - property Vector^ Position - { - Vector^ get() - { - return gcnew Vector(def->position); - } - - void set(Vector^ value) - { - def->position = value->getVec2(); - } - } - - property float32 Angle - { - float32 get() - { - return def->angle; - } - - void set(float32 value) - { - def->angle = value; - } - } - - property float32 LinearDamping - { - float32 get() - { - return def->linearDamping; - } - - void set(float32 value) - { - def->linearDamping = value; - } - } - - property float32 AngularDamping - { - float32 get() - { - return def->angularDamping; - } - - void set(float32 value) - { - def->angularDamping = value; - } - } - - property bool AllowSleep - { - bool get() - { - return def->allowSleep; - } - - void set(bool value) - { - def->allowSleep = value; - } - } - - property bool IsBullet - { - bool get() - { - return def->isBullet; - } - - void set(bool value) - { - def->isBullet = value; - } - } - - property bool IsSleeping - { - bool get() - { - return def->isSleeping; - } - - void set(bool value) - { - def->isSleeping = value; - } - } - - property bool FixedRotation - { - bool get() - { - return def->fixedRotation; - } - - void set(bool value) - { - def->fixedRotation = value; - } - } - - property BodyType BodyType - { - Box2D::Net::BodyType get() - { - return (Box2D::Net::BodyType)def->type; - } - - void set(Box2D::Net::BodyType value) - { - def->type = ((::b2BodyDef::Type)value); - } - } - - //TODO: - /*property Object^ UserData - { - Object^ get() - { - Object^ ReturnMe; - - System::Runtime::InteropServices::Marshal::PtrToStructure((System::IntPtr)def->userData, ReturnMe); - - return ReturnMe; - } - - void set(Object^ value) - { - def->userData = value; - } - }*/ - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Box2D.Net.vcproj b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Box2D.Net.vcproj deleted file mode 100644 index b9a27ff0e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Box2D.Net.vcproj +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Contact.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Contact.cpp deleted file mode 100644 index 5d60ef7f8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Contact.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Shape.cpp" -#include "Manifold.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class Contact - { - internal: - b2Contact *contact; - Contact(b2Contact *contactRef) : contact(contactRef) { } - - public: - property Shape^ Shape1 - { - Shape^ get() - { - return gcnew Shape(contact->GetShape1()); - } - } - - property Shape^ Shape2 - { - Shape^ get() - { - return gcnew Shape(contact->GetShape2()); - } - } - - Contact^ GetNext() - { - return gcnew Contact(contact->GetNext()); - } - - Manifold^ GetManifolds() - { - return gcnew Manifold(contact->GetManifolds()); - } - - property int ManifoldCount - { - int get() - { - return contact->GetManifoldCount(); - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Delegates.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Delegates.cpp deleted file mode 100644 index 1a131cd32..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Delegates.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Joint.cpp" -#include "Body.cpp" - -namespace Box2D -{ - namespace Net - { - /// - /// If a body is destroyed, then any joints attached to it are also destroyed. - /// This prevents memory leaks, but you may unexpectedly be left with an - /// orphaned joint pointer. - /// Box2D will notify you when a joint is implicitly destroyed. - /// It is NOT called if you directly destroy a joint. - /// DO NOT modify the Box2D world inside this callback. - /// - public delegate void NotifyJointDestroyed(Joint); - - /// - /// Return true if collision calculations should be performed between shape1 and shape2 - /// Box2D has a default implementation for this, so only add a new delegate if you - /// want to override the default behavior. - /// - public delegate bool CollisionFilter(Shape shape1, Shape shape2); - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Joint.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Joint.cpp deleted file mode 100644 index 3ec13cc69..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Joint.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Body.cpp" -#include "JointDef.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class Joint - { - internal: - b2Joint *joint; - Joint(b2Joint *jointRef) : joint(jointRef) { } - public: - - property JointType JointType - { - Box2D::Net::JointType get() - { - return (Box2D::Net::JointType) joint->GetType(); - } - } - - property Body^ Body1 - { - Body^ get() - { - return gcnew Body(joint->GetBody1()); - } - } - - property Body^ Body2 - { - Body^ get() - { - return gcnew Body(joint->GetBody2()); - } - } - - property Vector^ Anchor1 - { - Vector^ get() - { - return gcnew Vector(joint->GetAnchor1()); - } - } - - property Vector^ Anchor2 - { - Vector^ get() - { - return gcnew Vector(joint->GetAnchor2()); - } - } - - Vector^ GetReactionForce() - { - return gcnew Vector(joint->GetReactionForce()); - } - - float32 GetReactionTorque() - { - return joint->GetReactionTorque(); - } - - Joint^ GetNext() - { - return gcnew Joint(joint->GetNext()); - } - - //TODO: - /* - void* GetUserData(); - */ - }; - - public ref class MouseJoint : public Joint - { - internal: - b2MouseJoint *mouseJoint; - MouseJoint(b2MouseJoint *joint) : Joint(joint), mouseJoint(joint) { } - public: - MouseJoint(Joint^ joint) : Joint(joint->joint), mouseJoint(0) - { - if(joint->JointType == Box2D::Net::JointType::e_mouseJoint && - reinterpret_cast(joint->joint)) - { - mouseJoint = reinterpret_cast(joint->joint); - } - else - { - throw gcnew System::Exception("Attempting to convert a Joint to a MouseJoint, " - "but the joint is not a mouse joint."); - } - } - - void SetTarget(Vector^ Target) - { - mouseJoint->SetTarget(Target->getVec2()); - } - - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/JointDef.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/JointDef.cpp deleted file mode 100644 index 001b28b10..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/JointDef.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Body.cpp" -#include "Vector.cpp" - -using namespace System::Runtime::InteropServices; - -namespace Box2D -{ - namespace Net - { - //TODO: is there a way to automatically include the b2JointType as an enum here? - public enum class JointType - { - e_unknownJoint = ::e_unknownJoint, - e_revoluteJoint = ::e_revoluteJoint, - e_prismaticJoint = ::e_prismaticJoint, - - e_distanceJoint = ::e_distanceJoint, - e_pulleyJoint = ::e_pulleyJoint, - e_mouseJoint = ::e_mouseJoint, - e_gearJoint = ::e_gearJoint - }; - - public ref class JointDef - { - internal: - b2JointDef *def; - JointDef() : def(new b2JointDef()) { } - JointDef(b2JointDef *justBuilt) : def(justBuilt) { } - virtual ~JointDef() - { - delete def; - } - - public: - property JointType Type - { - JointType get() - { - return (JointType)def->type; - } - - void set(JointType value) - { - def->type = (b2JointType)value; - } - } - - property Object^ UserData - { - Object^ get() - { - return System::Runtime::InteropServices::GCHandle::FromIntPtr((System::IntPtr)def->userData).Target; - } - - void set(Object^ value) - { - GCHandle^ gch = GCHandle::Alloc(value); - def->userData = (void *)gch->ToIntPtr(*gch); - } - } - - property Body^ Body1 - { - Body^ get() - { - return gcnew Body(def->body1); - } - - void set(Body^ value) - { - def->body1 = value->body; - } - } - - property Body^ Body2 - { - Body^ get() - { - return gcnew Body(def->body2); - } - - void set(Body^ value) - { - def->body2 = value->body; - } - } - - property bool CollideConnected - { - bool get() - { - return def->collideConnected; - } - - void set(bool value) - { - def->collideConnected = value; - } - } - }; - - public ref class MouseJointDef : public JointDef - { - internal: - b2MouseJointDef *mouseJoint; - public: - MouseJointDef() : JointDef(mouseJoint = new b2MouseJointDef()) { } - - property Vector^ Target - { - Vector^ get() - { - return gcnew Vector(mouseJoint->target); - } - - void set(Vector^ value) - { - mouseJoint->target = value->getVec2(); - } - } - - property float32 MaxForce - { - float32 get() - { - return mouseJoint->maxForce; - } - - void set(float32 value) - { - mouseJoint->maxForce = value; - } - } - - property float32 FrequencyHz - { - float32 get() - { - return mouseJoint->frequencyHz; - } - - void set(float32 value) - { - mouseJoint->frequencyHz = value; - } - } - - property float32 DampingRatio - { - float32 get() - { - return mouseJoint->dampingRatio; - } - - void set(float32 value) - { - mouseJoint->dampingRatio = value; - } - } - - property float32 TimeStep - { - float32 get() - { - return mouseJoint->timeStep; - } - - void set(float32 value) - { - mouseJoint->timeStep = value; - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Manifold.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Manifold.cpp deleted file mode 100644 index 823c6bdd7..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Manifold.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" -//#include "ContactPoint.cpp" -#include "ManifoldPoint.cpp" - -using namespace System::Collections::Generic; - -namespace Box2D -{ - namespace Net - { - public ref class Manifold - { - internal: - b2Manifold *fold; - Manifold(b2Manifold *foldRef) : fold(foldRef) { } - - public: - property Vector^ Normal - { - Vector^ get() - { - return gcnew Vector(fold->normal); - } - } - - property IList^ Points - { - IList^ get() - { - //TODO: implement - List^ list = gcnew List; - - for(int x = 0; x < fold->pointCount; ++x) - list->Add(gcnew ManifoldPoint(&fold->points[x])); - - return list; - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ManifoldPoint.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ManifoldPoint.cpp deleted file mode 100644 index 5aa4bcff8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ManifoldPoint.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" - -namespace Box2D -{ - namespace Net - { - //TODO: is this class really necessary for the public interface? - public ref class ManifoldPoint - { - internal: - b2ManifoldPoint *point; - ManifoldPoint(b2ManifoldPoint *pointRef) : point(pointRef) { } - public: - - property Vector^ LocalPoint1 - { - Vector^ get() - { - return gcnew Vector(point->localPoint1); - } - - void set(Vector^ value) - { - point->localPoint1 = value->getVec2(); - } - } - - property Vector^ LocalPoint2 - { - Vector^ get() - { - return gcnew Vector(point->localPoint2); - } - - void set(Vector^ value) - { - point->localPoint2 = value->getVec2(); - } - } - - property float32 Separation - { - float32 get() - { - return point->separation; - } - - void set(float32 value) - { - point->separation = value; - } - } - - property float32 NormalForce - { - float32 get() - { - return point->normalForce; - } - - void set(float32 value) - { - point->normalForce = value; - } - } - - property float32 TangentForce - { - float32 get() - { - return point->tangentForce; - } - - void set(float32 value) - { - point->tangentForce = value; - } - } - - //TODO: marshall b2ContactID - /* - property b2ContactID ID - { - b2ContactID get() - { - return point->id; - } - - void set(b2ContactID value) - { - point->id = value; - } - } - */ - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/MassData.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/MassData.cpp deleted file mode 100644 index d2101b1c5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/MassData.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class MassData - { - internal: - bool DeleteWhenDone; - b2MassData *data; - MassData(b2MassData *dataRef) : data(dataRef), DeleteWhenDone(false) { } - public: - MassData() : data(new b2MassData()), DeleteWhenDone(true) { } - virtual ~MassData() - { - if(DeleteWhenDone) - delete data; - } - - property float32 Mass - { - float32 get() - { - return data->mass; - } - - void set(float32 value) - { - data->mass = value; - } - } - - property float32 I - { - float32 get() - { - return data->I; - } - - void set(float32 value) - { - data->I = value; - } - } - - property Vector^ Center - { - Vector^ get() - { - return gcnew Vector(data->center); - } - - void set(Vector^ value) - { - data->center = value->getVec2(); - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Matrix.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Matrix.cpp deleted file mode 100644 index 9e74b96cd..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Matrix.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#pragma once - -#include "Stdafx.h" -#include "Vector.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class Matrix - { - internal: - Matrix(const b2Mat22 &matrix) : col1(gcnew Vector(matrix.col1)), col2(gcnew Vector(matrix.col2)) { } - b2Mat22 getMat22() - { - return b2Mat22(col1->getVec2(), col2->getVec2()); - } - public: - Vector ^col1, ^col2; - - Matrix() : col1(gcnew Vector()), col2(gcnew Vector()) {} - Matrix(Vector^ c1, Vector^ c2) : col1(gcnew Vector(c1)), col2(gcnew Vector(c2)) { } - explicit Matrix(float32 angle) - { - Set(angle); - } - - void Set(Vector^ c1, Vector^ c2) - { - col1->X = c1->X; - col1->Y = c1->Y; - - col2->X = c2->X; - col2->Y = c2->Y; - } - - void Set(float32 angle) - { - float32 c = cosf(angle), s = sinf(angle); - col1->X = c; col2->X = -s; - col1->Y = s; col2->Y = c; - } - - void SetIdentity() - { - col1->X = 1; col2->X = 0; - col1->Y = 0; col2->Y = 1; - } - - static Vector^ operator * (Matrix^ mat, Vector^ a) - { - return gcnew Vector(b2Mul(mat->getMat22(), a->getVec2())); - } - }; - } -} - -/* -struct b2Mat22 -{ - void SetZero() - { - col1.x = 0.0f; col2.x = 0.0f; - col1.y = 0.0f; col2.y = 0.0f; - } - - b2Mat22 Invert() const - { - float32 a = col1.x, b = col2.x, c = col1.y, d = col2.y; - b2Mat22 B; - float32 det = a * d - b * c; - b2Assert(det != 0.0f); - det = 1.0f / det; - B.col1.x = det * d; B.col2.x = -det * b; - B.col1.y = -det * c; B.col2.y = det * a; - return B; - } - - // Solve A * x = b - b2Vec2 Solve(const b2Vec2& b) const - { - float32 a11 = col1.x, a12 = col2.x, a21 = col1.y, a22 = col2.y; - float32 det = a11 * a22 - a12 * a21; - b2Assert(det != 0.0f); - det = 1.0f / det; - b2Vec2 x; - x.x = det * (a22 * b.x - a12 * b.y); - x.y = det * (a11 * b.y - a21 * b.x); - return x; - } - - b2Vec2 col1, col2; -}; -*/ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/RevoluteJoint.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/RevoluteJoint.cpp deleted file mode 100644 index 6a8f7c3f4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/RevoluteJoint.cpp +++ /dev/null @@ -1,197 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Joint.cpp" -#include "JointDef.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class RevoluteJointDef : public JointDef - { - public: - RevoluteJointDef() : JointDef(new b2RevoluteJointDef()) { } - - property Vector^ LocalAnchor1 - { - Vector^ get() - { - return gcnew Vector(reinterpret_cast(def)->localAnchor1); - } - - void set(Vector^ value) - { - reinterpret_cast(def)->localAnchor1 = value->getVec2(); - } - } - - property Vector^ LocalAnchor2 - { - Vector^ get() - { - return gcnew Vector(reinterpret_cast(def)->localAnchor2); - } - - void set(Vector^ value) - { - reinterpret_cast(def)->localAnchor2 = value->getVec2(); - } - } - - property float32 LowerAngle - { - float32 get() - { - return reinterpret_cast(def)->lowerAngle; - } - - void set(float32 value) - { - reinterpret_cast(def)->lowerAngle = value; - } - } - - property float32 UpperAngle - { - float32 get() - { - return reinterpret_cast(def)->upperAngle; - } - - void set(float32 value) - { - reinterpret_cast(def)->upperAngle = value; - } - } - - property float32 MotorTorque - { - float32 get() - { - return reinterpret_cast(def)->maxMotorTorque; - } - - void set(float32 value) - { - reinterpret_cast(def)->maxMotorTorque = value; - } - } - - property float32 MotorSpeed - { - float32 get() - { - return reinterpret_cast(def)->motorSpeed; - } - - void set(float32 value) - { - reinterpret_cast(def)->motorSpeed = value; - } - } - - property bool EnableLimit - { - bool get() - { - return reinterpret_cast(def)->enableLimit; - } - - void set(bool value) - { - reinterpret_cast(def)->enableLimit = value; - } - } - - property bool EnableMotor - { - bool get() - { - return reinterpret_cast(def)->enableMotor; - } - - void set(bool value) - { - reinterpret_cast(def)->enableMotor = value; - } - } - - void Initialize(Body^ body1, Body^ body2, Vector^ Anchor) - { - reinterpret_cast(def)->Initialize(body1->body, body2->body, Anchor->getVec2()); - } - }; - - public ref class RevoluteJoint : public Joint - { - internal: - RevoluteJoint(b2RevoluteJoint *jointRef) : Joint(jointRef) { } - - public: - property Vector^ Anchor1 - { - Vector^ get() - { - return gcnew Vector(reinterpret_cast(joint)->GetAnchor1()); - } - } - - property Vector^ Anchor2 - { - Vector^ get() - { - return gcnew Vector(reinterpret_cast(joint)->GetAnchor2()); - } - } - - Vector^ GetReactionForce() - { - return gcnew Vector(reinterpret_cast(joint)->GetReactionForce()); - } - - float32 GetReactionTorque() - { - return (reinterpret_cast(joint)->GetReactionTorque()); - } - - property float32 JointAngle - { - float32 get() - { - return (reinterpret_cast(joint)->GetJointAngle()); - } - } - - property float32 JointSpeed - { - float32 get() - { - return (reinterpret_cast(joint)->GetJointSpeed()); - } - } - - float32 GetMotorTorque() - { - return reinterpret_cast(joint)->GetMotorTorque(); - } - - void SetMotorSpeed(float32 speed) - { - reinterpret_cast(joint)->SetMotorSpeed(speed); - } - - void SetMotorTorque(float32 torque) - { - reinterpret_cast(joint)->SetMaxMotorTorque(torque); - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.cpp deleted file mode 100644 index 30c60c46e..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" -#include "Matrix.cpp" -#include "ShapeType.cpp" -#include "XForm.cpp" - -using namespace System::Collections::Generic; - -namespace Box2D -{ - namespace Net - { - ref class Body; - public ref class Shape - { - internal: - b2Shape *shape; - Shape(b2Shape *shapeRef) : shape(shapeRef) { } - - public: - bool TestPoint(XForm^ xf, Vector^ p) - { - return shape->TestPoint(xf->getXForm(), p->getVec2()); - } - - property ShapeType ShapeType - { - Box2D::Net::ShapeType get() - { - return (Box2D::Net::ShapeType)shape->GetType(); - } - } - - /// - /// Get the parent body of this shape. - /// - property Body^ Body - { - Box2D::Net::Body^ get(); - } - - /* - /// - /// Get the world position. - /// - property Vector^ Position - { - Vector^ get() - { - return gcnew Vector(shape->Get->GetPosition()); - } - } - */ - - /* - property Matrix^ Rotation - { - Matrix^ get() - { - return gcnew Matrix(shape->GetRotationMatrix()); - } - } - */ - - //TODO: - //void* GetUserData(); - // - // Remove and then add proxy from the broad-phase. - // This is used to refresh the collision filters. - //virtual void ResetProxy(b2BroadPhase* broadPhase) = 0; - - /// - /// Get the next shape in the parent body's shape list. - /// - Shape^ GetNext() - { - return gcnew Shape(shape->GetNext()); - } - }; - - public ref class CircleShape : public Shape - { - internal: - b2CircleShape *circleShape; - CircleShape(b2CircleShape *shapeRef) : Shape(shapeRef), circleShape(shapeRef) { } - - public: - CircleShape(Shape^ shape) : Shape(shape->shape), circleShape(0) - { - if(shape->ShapeType == Box2D::Net::ShapeType::e_circleShape && - reinterpret_cast(shape->shape)) - { - circleShape = reinterpret_cast(shape->shape); - } - else - { - throw gcnew System::Exception("Attempting to convert a Shape to a CircleShape," - "but the Shape is not a circle shape."); - } - } - - //TODO: this is not technically part of the "public" interface for CircleShape - property float32 Radius - { - float32 get() - { - return circleShape->m_radius; - } - - void set(float32 value) - { - circleShape->m_radius = value; - } - } - }; - - public ref class PolyShape : public Shape - { - internal: - b2PolygonShape *polyShape; - PolyShape(b2PolygonShape *shapeRef) : Shape(shapeRef), polyShape(shapeRef) { } - - public: - PolyShape(Shape^ shape) : Shape(shape->shape), polyShape(0) - { - if(shape->ShapeType == Box2D::Net::ShapeType::e_polygonShape && - reinterpret_cast(shape->shape)) - { - polyShape = reinterpret_cast(shape->shape); - } - else - { - throw gcnew System::Exception("Attempting to convert a Shape to a PolyShape," - "but the Shape is not a poly shape."); - } - } - - property IList^ Vertices - { - IList^ get() - { - List^ list = gcnew List(); - for(int x = 0; x < polyShape->m_vertexCount; ++x) - list->Add(gcnew Vector(polyShape->m_vertices[x])); - - return list; - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.h deleted file mode 100644 index 76b338fd9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Shape.h +++ /dev/null @@ -1,132 +0,0 @@ -#pragma once - -#include "stdafx.h" - -using namespace System::Collections::Generic; - -namespace Box2D -{ - namespace Net - { - ref class Body; - enum class ShapeType; - ref class Vector; - ref class Matrix; - - public ref class Shape - { - internal: - b2Shape *shape; - Shape(b2Shape *shapeRef) : shape(shapeRef) { } - - public: - bool TestPoint(Vector^ p); - - property ShapeType ShapeType - { - ShapeType get(); - } - - /// - /// Get the parent body of this shape. - /// - property Body^ Body; - - /// - /// Get the world position. - /// - property Vector^ Position; - - property Matrix^ Rotation; - - //TODO: - //void* GetUserData(); - // - // Remove and then add proxy from the broad-phase. - // This is used to refresh the collision filters. - //virtual void ResetProxy(b2BroadPhase* broadPhase) = 0; - - /// - /// Get the next shape in the parent body's shape list. - /// - Shape^ GetNext(); - }; - - public ref class CircleShape : public Shape - { - internal: - b2CircleShape *circleShape; - CircleShape(b2CircleShape *shapeRef) : Shape(shapeRef), circleShape(shapeRef) { } - - public: - CircleShape(Shape^ shape) : Shape(shape->shape), circleShape(0) - { - if(shape->ShapeType == Box2D::Net::ShapeType::e_circleShape && - reinterpret_cast(shape->shape)) - { - circleShape = reinterpret_cast(shape->shape); - } - else - { - throw gcnew System::Exception("Attempting to convert a Shape to a CircleShape," - "but the Shape is not a circle shape."); - } - } - - //TODO: this is not technically part of the "public" interface for CircleShape - property float32 Radius - { - float32 get() - { - return circleShape->m_radius; - } - - void set(float32 value) - { - circleShape->m_radius = value; - } - } - }; - - public ref class PolyShape : public Shape - { - internal: - b2PolyShape *polyShape; - PolyShape(b2PolyShape *shapeRef) : Shape(shapeRef), polyShape(shapeRef) { } - - public: - PolyShape(Shape^ shape) : Shape(shape->shape), polyShape(0) - { - if(shape->ShapeType == Box2D::Net::ShapeType::e_polyShape && - reinterpret_cast(shape->shape)) - { - polyShape = reinterpret_cast(shape->shape); - } - else - { - throw gcnew System::Exception("Attempting to convert a Shape to a PolyShape," - "but the Shape is not a poly shape."); - } - } - - property IList^ Vertices - { - IList^ get() - { - List^ list = gcnew List(); - for(int x = 0; x < polyShape->m_vertexCount; ++x) - list->Add(gcnew Vector(polyShape->m_vertices[x])); - - return list; - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeDef.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeDef.cpp deleted file mode 100644 index c285169d3..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeDef.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "MassData.cpp" -#include "ShapeType.cpp" - -using namespace System::Collections::Generic; - -namespace Box2D -{ - namespace Net - { - public ref class ShapeDef - { - internal: - bool DeleteOnDtor; - b2ShapeDef *def; - ShapeDef(b2ShapeDef *defRef) : def(defRef), DeleteOnDtor(false) { } - - //Needs to work for derivative types, too - b2ShapeDef GetShapeDef() - { - return *def; - } - - public: - virtual ~ShapeDef() - { - if(DeleteOnDtor) - delete def; - } - - property ShapeType ShapeType - { - Box2D::Net::ShapeType get() - { - return (Box2D::Net::ShapeType) def->type; - } - - void set(Box2D::Net::ShapeType value) - { - def->type = b2ShapeType(value); - } - } - - property float32 Friction - { - float32 get() - { - return def->friction; - } - - void set(float32 value) - { - def->friction = value; - } - } - - property float32 Restitution - { - float32 get() - { - return def->restitution; - } - - void set(float32 value) - { - def->restitution = value; - } - } - - property float32 Density - { - float32 get() - { - return def->density; - } - - void set(float32 value) - { - def->density = value; - } - } - - /// - /// The collision category bits. Normally you would just set one bit. - /// - property unsigned __int16 CategoryBits - { - unsigned __int16 get() - { - return def->categoryBits; - } - - void set(unsigned __int16 value) - { - def->categoryBits = value; - } - } - - /// - /// The collision mask bits. This states the categories that this - /// shape would accept for collision. - /// - property unsigned __int16 MaskBits - { - unsigned __int16 get() - { - return def->maskBits; - } - - void set(unsigned __int16 value) - { - def->maskBits = value; - } - } - - /// - /// Collision groups allow a certain group of objects to never collide (negative) - /// or always collide (positive). Zero means no collision group. Non-zero group - /// filtering always wins against the mask bits. - /// - property unsigned __int16 GroupIndex - { - unsigned __int16 get() - { - return def->groupIndex; - } - - void set(unsigned __int16 value) - { - def->groupIndex = value; - } - } - - //TODO: - //void* userData; - }; - - public ref class CircleDef : public ShapeDef - { - public: - CircleDef() : ShapeDef(new b2CircleDef()) - { - ShapeDef::DeleteOnDtor = (true); - } - - property float32 Radius - { - float32 get() - { - return reinterpret_cast(def)->radius; - } - - void set(float32 value) - { - reinterpret_cast(def)->radius = value; - } - } - }; - - public ref class PolygonDef : public ShapeDef - { - public: - PolygonDef() : ShapeDef(new b2PolygonDef()) - { - DeleteOnDtor = (true); - } - - void SetAsBox(float X, float Y) - { - reinterpret_cast(def)->SetAsBox(X, Y); - } - - void SetAsBox(float X, float Y, Vector^ Center, float Angle) - { - reinterpret_cast(def)->SetAsBox(X, Y, Center->getVec2(), Angle); - } - - property IList^ Verticies - { - IList^ get() - { - List^ list = gcnew List(); - for(int x = 0; x < reinterpret_cast(def)->vertexCount; ++x) - { - list->Add(gcnew Vector(reinterpret_cast(def)->vertices[x])); - } - return list; - } - - void set(IList^ value) - { - b2PolygonDef* Def = reinterpret_cast(def); - - for(int x = 0; x < value->Count; ++x) - Def->vertices[x] = value[x]->getVec2(); - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeType.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeType.cpp deleted file mode 100644 index be1c42f04..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/ShapeType.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "stdafx.h" - -namespace Box2D -{ - namespace Net - { - //TODO: is there a way to auto incorporate shape types? - public enum class ShapeType - { - e_unknownShape = ::e_unknownShape, - e_circleShape = ::e_circleShape, - e_polygonShape = ::e_polygonShape, - e_shapeTypeCount = ::e_shapeTypeCount - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Stdafx.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Stdafx.h deleted file mode 100644 index 9809510e4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Stdafx.h +++ /dev/null @@ -1,15 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - - -#include "Box2D.h" - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/VariousImplementations.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/VariousImplementations.cpp deleted file mode 100644 index f43da7136..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/VariousImplementations.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Shape.cpp" -#include "Body.cpp" - -namespace Box2D -{ - namespace Net - { - Body^ Shape::Body::get() - { - return gcnew Box2D::Net::Body(shape->GetBody()); - } - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Vector.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Vector.cpp deleted file mode 100644 index 11909f11b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/Vector.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "Stdafx.h" - -namespace Box2D -{ - namespace Net - { - public ref class Vector - { - internal: - b2Vec2 getVec2() - { - return b2Vec2(X, Y); - } - - public: - - //TODO: this needs to be read only outside the class, - //because if you have a vector as a get property, and - //try to set the X,Y components, it won't take to the - //original vector: - // - //ie: Shape.Extents.X += 10; - //won't behave like you think it should (or will it?) - float32 X, Y; - - Vector() : X(0), Y(0) { } - Vector(float32 x, float32 y) : X(x), Y(y) { } - Vector(Vector^ other) : X(other->X), Y(other->Y) { } - Vector(const b2Vec2 &other) : X(other.x), Y(other.y) { } - - /* - Vector^ Set(float32 x, float32 y) - { - X = x; - Y = y; - return this; - } - */ - - ///Defines basic vector addition - static Vector^ operator +(Vector^ a, Vector^ b) - { - return gcnew Vector(a->X + b->X, a->Y + b->Y); - } - - ///Negates a vector (that is, returns (-X, -Y) - static Vector^ operator - (Vector^ a) - { - return gcnew Vector(-a->X, -a->Y); - } - - ///Defines basic vector subtraction - static Vector^ operator - (Vector^ a, Vector^ b) - { - return gcnew Vector(a->X - b->X, a->Y - b->Y); - } - - ///Scalar multiplication for a vector - static Vector^ operator * (Vector^ a, float32 b) - { - return gcnew Vector(a->X * b, a->Y * b); - } - - /* - static Vector^ operator = (Vector^ a, Vector^ b) - { - a.X = b.X; - a.Y = b.Y; - } - */ - - ///Returns a string representation of this vector - virtual System::String^ ToString() override - { - return gcnew System::String("<" + X + ", " + Y + ">"); - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/World.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/World.cpp deleted file mode 100644 index 4c9a5761d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/World.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#pragma once - -#include "Stdafx.h" -#include "AABB.cpp" -#include "Body.cpp" -#include "BodyDef.cpp" -#include "Joint.cpp" -#include "JointDef.cpp" -#include "Contact.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class World - { - b2World *world; - public: - - World(AABB^ worldAABB, Vector^ gravity, bool doSleep) : world(new b2World( - worldAABB->getAABB(), gravity->getVec2(), doSleep)) { } - - ~World() - { - delete world; - } - - /// Create rigid body from a definition - Body^ CreateBody(BodyDef^ def) - { - return gcnew Body(world->CreateBody(def->def)); - } - - /// - /// Destroy rigid bodies. Destruction is deferred until the the next call to Step. - /// This is done so that bodies may be destroyed while you iterate through the contact list. - /// - void DestroyBody(Body^ body) - { - world->DestroyBody(body->body); - } - - /// - /// The world provides a single ground body with no collision shapes. You - /// can use this to simplify the creation of joints. - /// - Body^ GetGroundBody() - { - return gcnew Body(world->GetGroundBody()); - } - - void Step(float32 timeStep, int32 iterations) - { - world->Step(timeStep, iterations); - } - - Joint^ CreateJoint(JointDef^ def) - { - return gcnew Joint(world->CreateJoint(def->def)); - } - - void DestroyJoint(Joint^ joint) - { - world->DestroyJoint(joint->joint); - } - - property IList^ Bodies - { - IList^ get() - { - List^ list = gcnew List(); - for(b2Body *body = world->GetBodyList(); body; body = body->GetNext()) - list->Add(gcnew Body(body)); - - return list; - } - } - - property IList^ Joints - { - IList^ get() - { - List^ list = gcnew List(); - for(b2Joint *joint = world->GetJointList(); joint; joint = joint->GetNext()) - list->Add(gcnew Joint(joint)); - - return list; - } - } - - Joint^ GetJointList() - { - return gcnew Joint(world->GetJointList()); - } - - /// You can use these to iterate over all the bodies, joints, and contacts. - /* - Contact^ GetContactList() - { - return gcnew Contact(world->C>GetContactList()); - } - */ - - /// - /// Query the world for all shapes that potentially overlap the - /// provided AABB. You provide a shape pointer buffer of specified - /// size. The number of shapes found is returned. - /// - IList^ Query(AABB^ aabb) - { - const int32 k_maxCount = 25; - b2Shape* shapes[k_maxCount]; - int32 count = world->Query(aabb->getAABB(), shapes, k_maxCount); - - List^ list = gcnew List(); - for(int x = 0; x < count; ++x) - list->Add(gcnew Shape(shapes[x])); - - return list; - } - - static property bool PositionCorrection - { - bool get() - { - return b2World::s_enablePositionCorrection == 1; - } - - void set(bool value) - { - b2World::s_enablePositionCorrection = value ? 1 : 0; - } - } - - static property bool WarmStarting - { - bool get() - { - return b2World::s_enableWarmStarting == 1; - } - - void set(bool value) - { - b2World::s_enableWarmStarting = value ? 1 : 0; - } - } - }; - } -} - -/* -class b2World -{ -public: - // Register a world listener to receive important events that can - // help prevent your code from crashing. - void SetListener(b2WorldListener* listener); - - // Register a collision filter to provide specific control over collision. - // Otherwise the default filter is used (b2CollisionFilter). - void SetFilter(b2CollisionFilter* filter); -*/ - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/XForm.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/XForm.cpp deleted file mode 100644 index 65ee1edd9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.Net/XForm.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "stdafx.h" -#include "Vector.cpp" -#include "Matrix.cpp" - -namespace Box2D -{ - namespace Net - { - public ref class XForm - { - internal: - b2XForm *xform; - bool DeleteOnDtor; - XForm(b2XForm *XForm) : xform(XForm), DeleteOnDtor(false) { } - XForm(b2XForm XForm) : xform(new b2XForm(XForm)), DeleteOnDtor(false) { } - b2XForm getXForm() - { - return *xform; - } - public: - XForm() : xform(new b2XForm()), DeleteOnDtor(true) { } - ~XForm() - { - if(DeleteOnDtor) - delete xform; - } - - property Vector^ Position - { - Vector^ get() - { - return gcnew Vector(xform->position); - } - } - - property Matrix^ Rotation - { - Matrix^ get() - { - return gcnew Matrix(xform->R); - } - } - }; - } -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.XNA.zip b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.XNA.zip deleted file mode 100644 index 2a4f144a5..000000000 Binary files a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/Box2D.XNA.zip and /dev/null differ diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Box2D.workspace b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Box2D.workspace deleted file mode 100644 index be186b875..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Box2D.workspace +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Engine.cbp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Engine.cbp deleted file mode 100644 index e3cb312bd..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/Engine.cbp +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/FreeGLUT.cbp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/FreeGLUT.cbp deleted file mode 100644 index 15051ae77..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/FreeGLUT.cbp +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/GLUI.cbp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/GLUI.cbp deleted file mode 100644 index 85d51e42b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/GLUI.cbp +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/HelloWorld.cbp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/HelloWorld.cbp deleted file mode 100644 index 35186563b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/HelloWorld.cbp +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/TestBed.cbp b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/TestBed.cbp deleted file mode 100644 index 02f5fc660..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/CodeBlocks/TestBed.cbp +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.Designer.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.Designer.cs deleted file mode 100644 index 642970f2c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.Designer.cs +++ /dev/null @@ -1,220 +0,0 @@ -namespace TestBed.Net -{ - partial class MainWindow - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.panel1 = new System.Windows.Forms.Panel(); - this.OpenGLControl = new Tao.Platform.Windows.SimpleOpenGlControl(); - this.panel2 = new System.Windows.Forms.Panel(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); - this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); - this.checkBox2 = new System.Windows.Forms.CheckBox(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); - this.TestsComboBox = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.RedrawTimer = new System.Windows.Forms.Timer(this.components); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.Controls.Add(this.OpenGLControl); - this.panel1.Location = new System.Drawing.Point(12, 12); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(372, 242); - this.panel1.TabIndex = 3; - // - // OpenGLControl - // - this.OpenGLControl.AccumBits = ((byte)(0)); - this.OpenGLControl.AutoCheckErrors = true; - this.OpenGLControl.AutoFinish = true; - this.OpenGLControl.AutoMakeCurrent = true; - this.OpenGLControl.AutoSwapBuffers = true; - this.OpenGLControl.BackColor = System.Drawing.Color.Black; - this.OpenGLControl.ColorBits = ((byte)(32)); - this.OpenGLControl.DepthBits = ((byte)(16)); - this.OpenGLControl.Location = new System.Drawing.Point(106, 62); - this.OpenGLControl.Name = "OpenGLControl"; - this.OpenGLControl.Size = new System.Drawing.Size(137, 103); - this.OpenGLControl.StencilBits = ((byte)(0)); - this.OpenGLControl.TabIndex = 1; - this.OpenGLControl.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.OpenGLControl_PreviewKeyDown); - this.OpenGLControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OpenGLControl_MouseDown); - this.OpenGLControl.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OpenGLControl_MouseMove); - this.OpenGLControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OpenGLControl_MouseUp); - // - // panel2 - // - this.panel2.Controls.Add(this.label3); - this.panel2.Controls.Add(this.label2); - this.panel2.Controls.Add(this.numericUpDown2); - this.panel2.Controls.Add(this.numericUpDown1); - this.panel2.Controls.Add(this.checkBox2); - this.panel2.Controls.Add(this.checkBox1); - this.panel2.Controls.Add(this.TestsComboBox); - this.panel2.Controls.Add(this.label1); - this.panel2.Location = new System.Drawing.Point(390, 12); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(170, 242); - this.panel2.TabIndex = 4; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(18, 81); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(32, 13); - this.label3.TabIndex = 10; - this.label3.Text = "Hertz"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(18, 55); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(50, 13); - this.label2.TabIndex = 9; - this.label2.Text = "Iterations"; - // - // numericUpDown2 - // - this.numericUpDown2.Location = new System.Drawing.Point(71, 79); - this.numericUpDown2.Name = "numericUpDown2"; - this.numericUpDown2.Size = new System.Drawing.Size(71, 20); - this.numericUpDown2.TabIndex = 8; - this.numericUpDown2.Value = new decimal(new int[] { - 60, - 0, - 0, - 0}); - // - // numericUpDown1 - // - this.numericUpDown1.Location = new System.Drawing.Point(71, 53); - this.numericUpDown1.Name = "numericUpDown1"; - this.numericUpDown1.Size = new System.Drawing.Size(71, 20); - this.numericUpDown1.TabIndex = 7; - this.numericUpDown1.Value = new decimal(new int[] { - 60, - 0, - 0, - 0}); - // - // checkBox2 - // - this.checkBox2.AutoSize = true; - this.checkBox2.Checked = true; - this.checkBox2.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox2.Location = new System.Drawing.Point(21, 128); - this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(93, 17); - this.checkBox2.TabIndex = 6; - this.checkBox2.Text = "Warm Starting"; - this.checkBox2.UseVisualStyleBackColor = true; - // - // checkBox1 - // - this.checkBox1.AutoSize = true; - this.checkBox1.Checked = true; - this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBox1.Location = new System.Drawing.Point(21, 105); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(114, 17); - this.checkBox1.TabIndex = 5; - this.checkBox1.Text = "Position Correction"; - this.checkBox1.UseVisualStyleBackColor = true; - // - // TestsComboBox - // - this.TestsComboBox.FormattingEnabled = true; - this.TestsComboBox.Location = new System.Drawing.Point(21, 26); - this.TestsComboBox.Name = "TestsComboBox"; - this.TestsComboBox.Size = new System.Drawing.Size(121, 21); - this.TestsComboBox.TabIndex = 3; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(67, 10); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(33, 13); - this.label1.TabIndex = 4; - this.label1.Text = "Tests"; - // - // RedrawTimer - // - this.RedrawTimer.Enabled = true; - this.RedrawTimer.Interval = 30; - this.RedrawTimer.Tag = ""; - this.RedrawTimer.Tick += new System.EventHandler(this.RedrawTimer_Tick); - // - // MainWindow - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(572, 457); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Name = "MainWindow"; - this.Text = "MainWindow"; - this.Resize += new System.EventHandler(this.MainWindow_Resize); - this.Load += new System.EventHandler(this.MainWindow_Load); - this.panel1.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private Tao.Platform.Windows.SimpleOpenGlControl OpenGLControl; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox TestsComboBox; - private System.Windows.Forms.Timer RedrawTimer; - private System.Windows.Forms.CheckBox checkBox2; - private System.Windows.Forms.CheckBox checkBox1; - private System.Windows.Forms.NumericUpDown numericUpDown2; - private System.Windows.Forms.NumericUpDown numericUpDown1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - - - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.cs deleted file mode 100644 index 279c1f071..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using Tao.OpenGl; -using Box2D.Net; -using System.Reflection; - -namespace TestBed.Net -{ - public partial class MainWindow : Form - { - private Settings Settings = new Settings(); - private Test mCurrentTest; - public Test CurrentTest - { - get - { - return mCurrentTest; - } - - set - { - //Call code to reset current test - mCurrentTest = value; - } - } - - public MainWindow() - { - InitializeComponent(); - - //Find all Tests in this module - foreach (Type type in Assembly.GetExecutingAssembly().GetExportedTypes()) - { - Test test = new Test(); - if (type.IsSubclassOf(test.GetType())) - { - TestsComboBox.Items.Add(System.Activator.CreateInstance(type)); - } - } - TestsComboBox.SelectedIndex = 0; - CurrentTest = (Test)System.Activator.CreateInstance(TestsComboBox.SelectedItem.GetType()); - - OpenGLControl.Dock = DockStyle.Fill; - } - - private void MainWindow_Load(object sender, EventArgs e) - { - OpenGLControl.InitializeContexts(); - panel1.Dock = DockStyle.Fill; - panel2.Dock = DockStyle.Right; - MainWindow_Resize(null, null); - RedrawTimer.Interval = (int)(1000.0f / (float)Settings.Hz); - RedrawTimer.Start(); - } - - private void MainWindow_Resize(object sender, EventArgs e) - { - Size size = new Size(OpenGLControl.Size.Width - panel2.Width, OpenGLControl.Size.Height); - Renderer.InitOpenGL(size, CurrentTest.Zoom, CurrentTest.ViewOffset); - Renderer.OpenGLDraw(CurrentTest); - } - - private void OpenGLControl_Paint(object sender, PaintEventArgs e) - { - Renderer.OpenGLDraw(CurrentTest); - } - - private Vector RelativeCoordinates(Point MousePoint) - { - float Height = (float)OpenGLControl.Size.Height; - float Width = (float)(OpenGLControl.Size.Width - panel2.Width); - if(Height <= 0) - Height = 1; - - float AspectRatio = Width / Height; - - Vector relative = new Vector( - (float)MousePoint.X / Width, - (float)MousePoint.Y / Height); - - relative -= new Vector(.5f, .5f); - relative *= 2; - relative.Y *= -1; - relative.X *= AspectRatio; - return relative; - } - - private void OpenGLControl_MouseMove(object sender, MouseEventArgs e) - { - CurrentTest.MouseMove(RelativeCoordinates(e.Location)); - } - - private void OpenGLControl_MouseUp(object sender, MouseEventArgs e) - { - CurrentTest.MouseUp(RelativeCoordinates(e.Location)); - } - - private void OpenGLControl_MouseDown(object sender, MouseEventArgs e) - { - CurrentTest.MouseDown(RelativeCoordinates(e.Location)); - } - - private void RedrawTimer_Tick(object sender, EventArgs e) - { - CurrentTest.Step(Settings); - Renderer.OpenGLDraw(CurrentTest); - OpenGLControl.Draw(); - - int errorCode = 0; - if ((errorCode = Gl.glGetError()) > 0) - { - RedrawTimer.Stop(); - - //Handled by the OpenGLControl - //MessageBox.Show(Glu.gluErrorString(errorCode)); - } - } - - private void OpenGLControl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) - { - if(e.KeyCode == Keys.R) - CurrentTest = (Test)System.Activator.CreateInstance(CurrentTest.GetType()); - else - CurrentTest.KeyPress(e.KeyCode); - } - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.resx b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.resx deleted file mode 100644 index 5b417f269..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/MainWindow.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Program.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Program.cs deleted file mode 100644 index f4152d3c5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Program.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Box2D.Net; -using System.Windows.Forms; - -namespace TestBed.Net -{ - class Program - { - static void Main(string[] args) - { - Console.Title = "Box2D.Net Test Bed"; - Application.EnableVisualStyles(); - MainWindow win = new MainWindow(); - - Console.Write("Loading the OpenGL display window. Please be patient... "); - - //Show above the console - win.Show(); - win.BringToFront(); //Doesn't bring above the console? - win.TopMost = true; //Hacky fix instead: - win.TopMost = false; - - Console.WriteLine("DONE"); - - Application.Run(win); - } - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Properties/AssemblyInfo.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Properties/AssemblyInfo.cs deleted file mode 100644 index 67418df76..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TestBed.Net")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestBed.Net")] -[assembly: AssemblyCopyright("Copyright © 2008")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c08bf3be-733a-49ed-820b-ad4f13ff3a00")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Renderer.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Renderer.cs deleted file mode 100644 index 5e53d3e09..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Renderer.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Tao.OpenGl; -using Box2D.Net; -using System.Windows.Forms; - -namespace TestBed.Net -{ - static class Renderer - { - public static void InitOpenGL(System.Drawing.Size WidthHeight, float viewZoom, Vector ViewOffset) - { - int Width = WidthHeight.Width; - int Height = WidthHeight.Height; - Height = Height > 0 ? Height : 1; - - Gl.glDisable(Gl.GL_CULL_FACE); - Gl.glClearColor(.5f, .5f, .5f, 1); - - float AspectRatio = (float)Width / (float)Height; - Gl.glViewport(0, 0, Width, Height); - Gl.glMatrixMode(Gl.GL_PROJECTION); - - Gl.glLoadIdentity(); - Glu.gluOrtho2D(-AspectRatio, AspectRatio, -1, 1); - - Gl.glMatrixMode(Gl.GL_MODELVIEW); - } - - public static void OpenGLDraw(Test test) - { - Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); - Gl.glMatrixMode(Gl.GL_MODELVIEW); - Gl.glLoadIdentity(); - - Gl.glScalef(1.0f / test.Zoom, 1.0f / test.Zoom, 1.0f / test.Zoom); - Gl.glTranslatef(-test.ViewOffset.X, -test.ViewOffset.Y, 0); - Gl.glPushMatrix(); - - DrawBodies(test.world.Bodies); - DrawJoints(test.world.Joints); - - Gl.glPopMatrix(); - } - - public static void DrawJoints(IList joints) - { - foreach (Joint joint in joints) - { - DrawJoint(joint, System.Drawing.Color.LawnGreen); - } - } - - public static void DrawBodies(IList bodies) - { - foreach(Body body in bodies) - foreach (Shape shape in body.Shapes) - { - System.Drawing.Color color = System.Drawing.Color.White; - if (body.Static) - color = System.Drawing.Color.LightGreen; //Color(0.5f, 0.9f, 0.5f) - else if (body.Sleeping) - color = System.Drawing.Color.LightBlue; - //else if(body == bomb) - - DrawShape(body.GetXForm(), shape, System.Drawing.Color.White); - } - } - - public static void DrawShape(XForm xform, Shape shape, System.Drawing.Color c) - { - switch (shape.ShapeType) - { - case ShapeType.e_circleShape: - { - Vector x = xform.Position; - float r = (new CircleShape(shape)).Radius; - - float segments = 16; - double increment = 2 * Math.PI / segments; - - Gl.glColor3ub(c.R, c.G, c.B); - Gl.glBegin(Gl.GL_LINE_LOOP); - - for (double i = 0, theta = 0; i < segments; ++i, theta += increment) - { - Vector d = new Vector(r * (float)Math.Cos(theta), r * (float)Math.Sin(theta)); - Vector v = x + d; - Gl.glVertex2f(v.X, v.Y); - } - Gl.glEnd(); - - //Draw a line from the circle's center to it's right side - //so we can visually inspect rotations. - Gl.glBegin(Gl.GL_LINES); - Gl.glVertex2f(x.X, x.Y); - Vector ax = xform.Rotation.col1; - Gl.glVertex2f(x.X + r * ax.X, x.Y + r * ax.Y); - Gl.glEnd(); - } - break; - - case ShapeType.e_polygonShape: - { - Gl.glColor3ub(c.R, c.G, c.B); - Gl.glBegin(Gl.GL_LINE_LOOP); - - foreach (Vector vertex in (new PolyShape(shape)).Vertices) - { - Vector vertprime = xform.Rotation * vertex + xform.Position; - Gl.glVertex2f(vertprime.X, vertprime.Y); - } - - Gl.glEnd(); - } - break; - } - } - - public static void DrawAABB(AABB aabb, System.Drawing.Color c) - { - Gl.glColor3b(c.R, c.G, c.B); - Gl.glBegin(Gl.GL_LINE_LOOP); - Gl.glVertex2f(aabb.lowerBound.X, aabb.lowerBound.Y); - Gl.glVertex2f(aabb.upperBound.X, aabb.lowerBound.Y); - Gl.glVertex2f(aabb.upperBound.X, aabb.upperBound.Y); - Gl.glVertex2f(aabb.lowerBound.X, aabb.upperBound.Y); - Gl.glEnd(); - } - - public static void DrawJoint(Joint joint, System.Drawing.Color color) - { - Body b1 = joint.Body1; - Body b2 = joint.Body2; - Vector x1 = b1.GetXForm().Position; - Vector x2 = b2.GetXForm().Position; - Vector p1 = joint.Anchor2; - Vector p2 = joint.Anchor1; - - Gl.glColor3ub(color.R, color.G, color.B); - Gl.glBegin(Gl.GL_LINES); - - switch (joint.JointType) - { - case JointType.e_mouseJoint: - case JointType.e_distanceJoint: - Gl.glVertex2f(p1.X, p1.Y); - Gl.glVertex2f(p2.X, p2.Y); - break; - - /* - * case JointType.e_pulleyJoint: - { - b2PulleyJoint* pulley = (b2PulleyJoint*)joint; - b2Vec2 s1 = pulley->GetGroundPoint1(); - b2Vec2 s2 = pulley->GetGroundPoint2(); - glVertex2f(s1.x, s1.y); - glVertex2f(p1.x, p1.y); - glVertex2f(s2.x, s2.y); - glVertex2f(p2.x, p2.y); - } - break; - */ - default: - Gl.glVertex2f(x1.X, x1.Y); - Gl.glVertex2f(p1.X, p1.Y); - Gl.glVertex2f(x2.X, x2.Y); - Gl.glVertex2f(p2.X, p2.Y); - break; - } - - Gl.glEnd(); - } - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Settings.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Settings.cs deleted file mode 100644 index e75fbc5dc..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Settings.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace TestBed.Net -{ - public class Settings - { - public float Hz = 60; - public int IterationCount = 10; - public bool DrawStats = false; - public bool DrawContacts = false; - public bool DrawImpulses = false; - public bool DrawAABBs = false; - public bool DrawPairs = false; - public bool WarmStarting = true; - public bool PositionCorrection = true; - public bool Pause = false; - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Test.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Test.cs deleted file mode 100644 index d111abe01..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Test.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Box2D.Net; -using Tao.OpenGl; - -namespace TestBed.Net -{ - public class Test - { - public World world; - public MouseJoint mouseJoint; - public Body bomb; - public float Zoom = 20; - public Vector ViewOffset = new Vector(); - public Vector Mouse = null; - - public Test() - { - AABB worldAABB = new AABB(new Vector(-100.0f, -100.0f), new Vector(100.0f, 200.0f)); - Vector gravity = new Vector(0, -10); - bool doSleep = true; - world = new World(worldAABB, gravity, doSleep); - - //m_textLine = 30; - // - //m_listener.test = this; - //m_world->SetListener(&m_listener); - } - - public void Step(Settings settings) - { - if(settings.Pause) - return; - - float timeStep = settings.Hz > 0 ? 1.0f / settings.Hz : 0; - - World.WarmStarting = settings.WarmStarting; - World.PositionCorrection = settings.PositionCorrection; - - world.Step(timeStep, settings.IterationCount); - - //m_world->m_broadPhase->Validate(); - } - - Vector RelativeToWorld(Vector Relative) - { - Vector working = Relative; - working *= Zoom; - working -= ViewOffset; - return working; - } - - /// - /// Handles what happens when a user clicks the mouse - /// - /// - /// The position of the mouse click in relative coordinates. - /// - public void MouseDown(Vector point) - { - Vector p = RelativeToWorld(point); - - if (mouseJoint != null) - throw new Exception("ASSERT: mouseJoint should be null"); - - // Make a small box. - Vector d = new Vector(.001f, .001f); - AABB aabb = new AABB(p - d, p + d); - - // Query the world for overlapping shapes. - IList shapes = world.Query(aabb); - Body body = null; - foreach (Shape shape in shapes) - { - if (shape.Body.Static == false && - shape.TestPoint(shape.Body.GetXForm(), p)) - { - body = shape.Body; - break; - } - } - - if (body != null) - { - MouseJointDef md = new MouseJointDef(); - md.Body1 = world.GetGroundBody(); - md.Body2 = body; - md.Target = p; - md.MaxForce = 1000 * body.Mass; - mouseJoint = new MouseJoint(world.CreateJoint(md)); - body.WakeUp(); - } - } - - public void MouseUp(Vector point) - { - Vector p = RelativeToWorld(point); - - if (mouseJoint != null) - { - world.DestroyJoint(mouseJoint); - mouseJoint = null; - } - } - - public void MouseMove(Vector point) - { - Vector p = RelativeToWorld(point); - - if (mouseJoint != null) - mouseJoint.SetTarget(p); - } - - public void KeyPress(System.Windows.Forms.Keys key) - { - switch (key) - { - case System.Windows.Forms.Keys.Space: - LaunchBomb(); - break; - - case System.Windows.Forms.Keys.Left: - ViewOffset.X -= 1; - break; - - case System.Windows.Forms.Keys.Right: - ViewOffset.X += 1; - break; - - case System.Windows.Forms.Keys.Up: - ViewOffset.Y += 1; - break; - - case System.Windows.Forms.Keys.Down: - ViewOffset.Y -= 1; - break; - - case System.Windows.Forms.Keys.X: - Zoom -= 1; - break; - - case System.Windows.Forms.Keys.Z: - Zoom += 1; - break; - } - } - - void LaunchBomb() - { - if (bomb != null) - { - world.DestroyBody(bomb); - bomb = null; - } - - BodyDef bd = new BodyDef(); - bd.BodyType = BodyType.e_dynamicBody; - bd.AllowSleep = true; - Random rand = new Random(); - bd.Position = new Vector((float)rand.NextDouble() * 30 - 15, 30.0f); - bd.IsBullet = true; - bomb = world.CreateBody(bd); - bomb.LinearVelocity = bd.Position * -5; - - CircleDef sd = new CircleDef(); - sd.Radius = 0.3f; - sd.Density = 20.0f; - sd.Restitution = 0.1f; - bomb.CreateShape(sd); - bomb.SetMassFromShapes(); - } - - public override string ToString() - { - return GetType().Name; - } - }; -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/TestBed.Net.csproj b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/TestBed.Net.csproj deleted file mode 100644 index c82e088bf..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/TestBed.Net.csproj +++ /dev/null @@ -1,74 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {B2F62680-048C-46AA-B1B2-7731252E1304} - Exe - Properties - TestBed.Net - TestBed.Net - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - Form - - - MainWindow.cs - - - - - - - - - - - {0E95DBB9-EA97-407B-811C-810B225E79D2} - Box2D.Net - - - - - Designer - MainWindow.cs - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Tests/Bridge.cs b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Tests/Bridge.cs deleted file mode 100644 index aaf6185b4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/TestBed.Net/Tests/Bridge.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Box2D.Net; - -namespace TestBed.Net.Tests -{ - public class Bridge : TestBed.Net.Test - { - public Bridge() - { - Body ground; - { - PolygonDef sd = new PolygonDef(); - sd.ShapeType = ShapeType.e_polygonShape; - sd.SetAsBox(50.0f, 10.0f); - - BodyDef bd = new BodyDef(); - bd.Position = new Vector(0, -10); - - ground = world.CreateBody(bd); - ground.CreateShape(sd); - } - - { - PolygonDef sd = new PolygonDef(); - sd.SetAsBox(0.5f, 0.125f); - sd.Density = 20.0f; - sd.Friction = 0.2f; - - BodyDef bd = new BodyDef(); - bd.BodyType = BodyType.e_dynamicBody; - - RevoluteJointDef jd = new RevoluteJointDef(); - const float numPlanks = 30; - - Body prevBody = ground; - - for (float i = 0; i < numPlanks; ++i) - { - bd.Position = new Vector(-14.5f + i, 5); - Body body = world.CreateBody(bd); - body.CreateShape(sd); - body.SetMassFromShapes(); - - Vector anchor = new Vector(-15 + i, 5); - jd.Initialize(prevBody, body, anchor); - world.CreateJoint(jd); - - prevBody = body; - } - - Vector anchor2 = new Vector(-15 + numPlanks, 5); - jd.Initialize(prevBody, ground, anchor2); - world.CreateJoint(jd); - } - } - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D.xcodeproj/project.pbxproj b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D.xcodeproj/project.pbxproj deleted file mode 100644 index 8451e3188..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D.xcodeproj/project.pbxproj +++ /dev/null @@ -1,620 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* Box2DAppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* Box2DAppDelegate.mm */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; - 28FD14FE0DC6FC130079059D /* Box2DView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 28FD14FD0DC6FC130079059D /* Box2DView.mm */; }; - 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; - 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; }; - 506EE52D1031176E00A389B3 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4E71031176E00A389B3 /* b2BroadPhase.cpp */; }; - 506EE52E1031176E00A389B3 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4E91031176E00A389B3 /* b2CollideCircle.cpp */; }; - 506EE52F1031176E00A389B3 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4EA1031176E00A389B3 /* b2CollidePolygon.cpp */; }; - 506EE5301031176E00A389B3 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4EB1031176E00A389B3 /* b2Collision.cpp */; }; - 506EE5311031176E00A389B3 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4ED1031176E00A389B3 /* b2Distance.cpp */; }; - 506EE5321031176E00A389B3 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4EF1031176E00A389B3 /* b2DynamicTree.cpp */; }; - 506EE5331031176E00A389B3 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4F11031176E00A389B3 /* b2TimeOfImpact.cpp */; }; - 506EE5341031176E00A389B3 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4F41031176E00A389B3 /* b2CircleShape.cpp */; }; - 506EE5351031176E00A389B3 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4F61031176E00A389B3 /* b2PolygonShape.cpp */; }; - 506EE5361031176E00A389B3 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4FA1031176E00A389B3 /* b2BlockAllocator.cpp */; }; - 506EE5371031176E00A389B3 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4FC1031176E00A389B3 /* b2Math.cpp */; }; - 506EE5381031176E00A389B3 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE4FE1031176E00A389B3 /* b2Settings.cpp */; }; - 506EE5391031176E00A389B3 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5001031176E00A389B3 /* b2StackAllocator.cpp */; }; - 506EE53A1031176E00A389B3 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5031031176E00A389B3 /* b2Body.cpp */; }; - 506EE53B1031176E00A389B3 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5051031176E00A389B3 /* b2ContactManager.cpp */; }; - 506EE53C1031176E00A389B3 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5071031176E00A389B3 /* b2Fixture.cpp */; }; - 506EE53D1031176E00A389B3 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5091031176E00A389B3 /* b2Island.cpp */; }; - 506EE53E1031176E00A389B3 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE50C1031176E00A389B3 /* b2World.cpp */; }; - 506EE53F1031176E00A389B3 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE50E1031176E00A389B3 /* b2WorldCallbacks.cpp */; }; - 506EE5401031176E00A389B3 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5111031176E00A389B3 /* b2CircleContact.cpp */; }; - 506EE5411031176E00A389B3 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5131031176E00A389B3 /* b2Contact.cpp */; }; - 506EE5421031176E00A389B3 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5151031176E00A389B3 /* b2ContactSolver.cpp */; }; - 506EE5431031176E00A389B3 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5181031176E00A389B3 /* b2PolygonAndCircleContact.cpp */; }; - 506EE5441031176E00A389B3 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE51A1031176E00A389B3 /* b2PolygonContact.cpp */; }; - 506EE5451031176E00A389B3 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE51D1031176E00A389B3 /* b2DistanceJoint.cpp */; }; - 506EE5461031176E00A389B3 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE51F1031176E00A389B3 /* b2GearJoint.cpp */; }; - 506EE5471031176E00A389B3 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5211031176E00A389B3 /* b2Joint.cpp */; }; - 506EE5481031176E00A389B3 /* b2LineJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5231031176E00A389B3 /* b2LineJoint.cpp */; }; - 506EE5491031176E00A389B3 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5251031176E00A389B3 /* b2MouseJoint.cpp */; }; - 506EE54A1031176E00A389B3 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5271031176E00A389B3 /* b2PrismaticJoint.cpp */; }; - 506EE54B1031176E00A389B3 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE5291031176E00A389B3 /* b2PulleyJoint.cpp */; }; - 506EE54C1031176E00A389B3 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 506EE52B1031176E00A389B3 /* b2RevoluteJoint.cpp */; }; - BBA235F50F1E02D700608B4E /* iPhoneTestEntries.mm in Sources */ = {isa = PBXBuildFile; fileRef = BBA235F40F1E02D700608B4E /* iPhoneTestEntries.mm */; }; - BBA238AE0F1F437800608B4E /* TestEntriesViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = BBA238AD0F1F437800608B4E /* TestEntriesViewController.mm */; }; - BBA239050F1F453F00608B4E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBA239040F1F453F00608B4E /* CoreGraphics.framework */; }; - BBA23A2B0F1F671900608B4E /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BBA23A2A0F1F671900608B4E /* Icon.png */; }; - BBA500460F1DF39100D3CCCD /* GLES-Render.mm in Sources */ = {isa = PBXBuildFile; fileRef = BBA500420F1DF39100D3CCCD /* GLES-Render.mm */; }; - BBA500470F1DF39100D3CCCD /* iPhoneTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = BBA500440F1DF39100D3CCCD /* iPhoneTest.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* Box2DAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2DAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* Box2DAppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Box2DAppDelegate.mm; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* Box2D.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Box2D.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 28FD14FC0DC6FC130079059D /* Box2DView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2DView.h; sourceTree = ""; }; - 28FD14FD0DC6FC130079059D /* Box2DView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Box2DView.mm; sourceTree = ""; }; - 28FD14FF0DC6FC520079059D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - 28FD15070DC6FC5B0079059D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* Box2D_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D_Prefix.pch; sourceTree = ""; }; - 50181E5D106817E7008CE8B2 /* Confined.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Confined.h; sourceTree = ""; }; - 50181E5E106817E7008CE8B2 /* RayCast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RayCast.h; sourceTree = ""; }; - 50181E5F106817F0008CE8B2 /* Breakable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Breakable.h; sourceTree = ""; }; - 506EE4E51031176E00A389B3 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; - 506EE4E71031176E00A389B3 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; - 506EE4E81031176E00A389B3 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; - 506EE4E91031176E00A389B3 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; - 506EE4EA1031176E00A389B3 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; - 506EE4EB1031176E00A389B3 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; - 506EE4EC1031176E00A389B3 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; - 506EE4ED1031176E00A389B3 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; - 506EE4EE1031176E00A389B3 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; - 506EE4EF1031176E00A389B3 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; - 506EE4F01031176E00A389B3 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; - 506EE4F11031176E00A389B3 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; - 506EE4F21031176E00A389B3 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; - 506EE4F41031176E00A389B3 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; - 506EE4F51031176E00A389B3 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; - 506EE4F61031176E00A389B3 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; - 506EE4F71031176E00A389B3 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; - 506EE4F81031176E00A389B3 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; - 506EE4FA1031176E00A389B3 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; - 506EE4FB1031176E00A389B3 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; - 506EE4FC1031176E00A389B3 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; - 506EE4FD1031176E00A389B3 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; - 506EE4FE1031176E00A389B3 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; - 506EE4FF1031176E00A389B3 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; - 506EE5001031176E00A389B3 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; - 506EE5011031176E00A389B3 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; - 506EE5031031176E00A389B3 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; - 506EE5041031176E00A389B3 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; - 506EE5051031176E00A389B3 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; - 506EE5061031176E00A389B3 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; - 506EE5071031176E00A389B3 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; - 506EE5081031176E00A389B3 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; - 506EE5091031176E00A389B3 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; - 506EE50A1031176E00A389B3 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; - 506EE50B1031176E00A389B3 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; - 506EE50C1031176E00A389B3 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; - 506EE50D1031176E00A389B3 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; - 506EE50E1031176E00A389B3 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; - 506EE50F1031176E00A389B3 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; - 506EE5111031176E00A389B3 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; - 506EE5121031176E00A389B3 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; - 506EE5131031176E00A389B3 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; - 506EE5141031176E00A389B3 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; - 506EE5151031176E00A389B3 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; - 506EE5161031176E00A389B3 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; - 506EE5171031176E00A389B3 /* b2NullContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2NullContact.h; sourceTree = ""; }; - 506EE5181031176E00A389B3 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; - 506EE5191031176E00A389B3 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; - 506EE51A1031176E00A389B3 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; - 506EE51B1031176E00A389B3 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; - 506EE51D1031176E00A389B3 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; - 506EE51E1031176E00A389B3 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; - 506EE51F1031176E00A389B3 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; - 506EE5201031176E00A389B3 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; - 506EE5211031176E00A389B3 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; - 506EE5221031176E00A389B3 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - 506EE5231031176E00A389B3 /* b2LineJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LineJoint.cpp; sourceTree = ""; }; - 506EE5241031176E00A389B3 /* b2LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LineJoint.h; sourceTree = ""; }; - 506EE5251031176E00A389B3 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; - 506EE5261031176E00A389B3 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; - 506EE5271031176E00A389B3 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; - 506EE5281031176E00A389B3 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; - 506EE5291031176E00A389B3 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; - 506EE52A1031176E00A389B3 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; - 506EE52B1031176E00A389B3 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; - 506EE52C1031176E00A389B3 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; - 506EE54E103117B600A389B3 /* ApplyForce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplyForce.h; sourceTree = ""; }; - 506EE54F103117B600A389B3 /* Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridge.h; sourceTree = ""; }; - 506EE552103117B600A389B3 /* CCDTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCDTest.h; sourceTree = ""; }; - 506EE553103117B600A389B3 /* Chain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chain.h; sourceTree = ""; }; - 506EE554103117B600A389B3 /* CollisionFiltering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollisionFiltering.h; sourceTree = ""; }; - 506EE555103117B600A389B3 /* CollisionProcessing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollisionProcessing.h; sourceTree = ""; }; - 506EE556103117B600A389B3 /* CompoundShapes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompoundShapes.h; sourceTree = ""; }; - 506EE557103117B600A389B3 /* DistanceTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistanceTest.h; sourceTree = ""; }; - 506EE558103117B600A389B3 /* Dominos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dominos.h; sourceTree = ""; }; - 506EE559103117B600A389B3 /* DynamicTreeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicTreeTest.h; sourceTree = ""; }; - 506EE55A103117B600A389B3 /* ElasticBody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElasticBody.h; sourceTree = ""; }; - 506EE55B103117B600A389B3 /* Gears.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gears.h; sourceTree = ""; }; - 506EE55C103117B600A389B3 /* LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineJoint.h; sourceTree = ""; }; - 506EE55D103117B600A389B3 /* OneSidedPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneSidedPlatform.h; sourceTree = ""; }; - 506EE55E103117B600A389B3 /* PolyCollision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolyCollision.h; sourceTree = ""; }; - 506EE55F103117B600A389B3 /* PolyShapes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolyShapes.h; sourceTree = ""; }; - 506EE560103117B600A389B3 /* Prismatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prismatic.h; sourceTree = ""; }; - 506EE561103117B600A389B3 /* Pulleys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pulleys.h; sourceTree = ""; }; - 506EE562103117B600A389B3 /* Pyramid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pyramid.h; sourceTree = ""; }; - 506EE563103117B600A389B3 /* Revolute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Revolute.h; sourceTree = ""; }; - 506EE564103117B600A389B3 /* SensorTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SensorTest.h; sourceTree = ""; }; - 506EE565103117B600A389B3 /* ShapeEditing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeEditing.h; sourceTree = ""; }; - 506EE566103117B600A389B3 /* SliderCrank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderCrank.h; sourceTree = ""; }; - 506EE567103117B600A389B3 /* SphereStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SphereStack.h; sourceTree = ""; }; - 506EE569103117B600A389B3 /* TheoJansen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TheoJansen.h; sourceTree = ""; }; - 506EE56A103117B600A389B3 /* TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeOfImpact.h; sourceTree = ""; }; - 506EE56B103117B600A389B3 /* VaryingFriction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VaryingFriction.h; sourceTree = ""; }; - 506EE56C103117B600A389B3 /* VaryingRestitution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VaryingRestitution.h; sourceTree = ""; }; - 506EE56D103117B600A389B3 /* VerticalStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VerticalStack.h; sourceTree = ""; }; - 506EE56E103117B600A389B3 /* Web.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Web.h; sourceTree = ""; }; - 50CA8BDD10B6A8C60072E0D3 /* BodyTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BodyTypes.h; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BBA235F40F1E02D700608B4E /* iPhoneTestEntries.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhoneTestEntries.mm; sourceTree = ""; }; - BBA238AC0F1F437800608B4E /* TestEntriesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestEntriesViewController.h; sourceTree = ""; }; - BBA238AD0F1F437800608B4E /* TestEntriesViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TestEntriesViewController.mm; sourceTree = ""; }; - BBA239040F1F453F00608B4E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - BBA239A80F1F498800608B4E /* Delegates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Delegates.h; sourceTree = ""; }; - BBA23A2A0F1F671900608B4E /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; - BBA500420F1DF39100D3CCCD /* GLES-Render.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "GLES-Render.mm"; sourceTree = ""; }; - BBA500430F1DF39100D3CCCD /* GLES-Render.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GLES-Render.h"; sourceTree = ""; }; - BBA500440F1DF39100D3CCCD /* iPhoneTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iPhoneTest.mm; sourceTree = ""; }; - BBA500450F1DF39100D3CCCD /* iPhoneTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhoneTest.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */, - 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */, - BBA239050F1F453F00608B4E /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - BBA235F40F1E02D700608B4E /* iPhoneTestEntries.mm */, - BBA500420F1DF39100D3CCCD /* GLES-Render.mm */, - BBA500430F1DF39100D3CCCD /* GLES-Render.h */, - BBA500440F1DF39100D3CCCD /* iPhoneTest.mm */, - BBA500450F1DF39100D3CCCD /* iPhoneTest.h */, - 28FD14FC0DC6FC130079059D /* Box2DView.h */, - 28FD14FD0DC6FC130079059D /* Box2DView.mm */, - 1D3623240D0F684500981E51 /* Box2DAppDelegate.h */, - 1D3623250D0F684500981E51 /* Box2DAppDelegate.mm */, - BBA238AC0F1F437800608B4E /* TestEntriesViewController.h */, - BBA238AD0F1F437800608B4E /* TestEntriesViewController.mm */, - BBA239A80F1F498800608B4E /* Delegates.h */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Box2D.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - 506EE54D103117B600A389B3 /* Tests */, - 506EE4E41031176E00A389B3 /* Box2D */, - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* Box2D_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - BBA23A2A0F1F671900608B4E /* Icon.png */, - 28AD733E0D9D9553002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - BBA239040F1F453F00608B4E /* CoreGraphics.framework */, - 28FD15070DC6FC5B0079059D /* QuartzCore.framework */, - 28FD14FF0DC6FC520079059D /* OpenGLES.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 506EE4E41031176E00A389B3 /* Box2D */ = { - isa = PBXGroup; - children = ( - 506EE4E51031176E00A389B3 /* Box2D.h */, - 506EE4E61031176E00A389B3 /* Collision */, - 506EE4F91031176E00A389B3 /* Common */, - 506EE5021031176E00A389B3 /* Dynamics */, - ); - name = Box2D; - path = ../../../Box2D/Box2D; - sourceTree = SOURCE_ROOT; - }; - 506EE4E61031176E00A389B3 /* Collision */ = { - isa = PBXGroup; - children = ( - 506EE4E71031176E00A389B3 /* b2BroadPhase.cpp */, - 506EE4E81031176E00A389B3 /* b2BroadPhase.h */, - 506EE4E91031176E00A389B3 /* b2CollideCircle.cpp */, - 506EE4EA1031176E00A389B3 /* b2CollidePolygon.cpp */, - 506EE4EB1031176E00A389B3 /* b2Collision.cpp */, - 506EE4EC1031176E00A389B3 /* b2Collision.h */, - 506EE4ED1031176E00A389B3 /* b2Distance.cpp */, - 506EE4EE1031176E00A389B3 /* b2Distance.h */, - 506EE4EF1031176E00A389B3 /* b2DynamicTree.cpp */, - 506EE4F01031176E00A389B3 /* b2DynamicTree.h */, - 506EE4F11031176E00A389B3 /* b2TimeOfImpact.cpp */, - 506EE4F21031176E00A389B3 /* b2TimeOfImpact.h */, - 506EE4F31031176E00A389B3 /* Shapes */, - ); - path = Collision; - sourceTree = ""; - }; - 506EE4F31031176E00A389B3 /* Shapes */ = { - isa = PBXGroup; - children = ( - 506EE4F41031176E00A389B3 /* b2CircleShape.cpp */, - 506EE4F51031176E00A389B3 /* b2CircleShape.h */, - 506EE4F61031176E00A389B3 /* b2PolygonShape.cpp */, - 506EE4F71031176E00A389B3 /* b2PolygonShape.h */, - 506EE4F81031176E00A389B3 /* b2Shape.h */, - ); - path = Shapes; - sourceTree = ""; - }; - 506EE4F91031176E00A389B3 /* Common */ = { - isa = PBXGroup; - children = ( - 506EE4FA1031176E00A389B3 /* b2BlockAllocator.cpp */, - 506EE4FB1031176E00A389B3 /* b2BlockAllocator.h */, - 506EE4FC1031176E00A389B3 /* b2Math.cpp */, - 506EE4FD1031176E00A389B3 /* b2Math.h */, - 506EE4FE1031176E00A389B3 /* b2Settings.cpp */, - 506EE4FF1031176E00A389B3 /* b2Settings.h */, - 506EE5001031176E00A389B3 /* b2StackAllocator.cpp */, - 506EE5011031176E00A389B3 /* b2StackAllocator.h */, - ); - path = Common; - sourceTree = ""; - }; - 506EE5021031176E00A389B3 /* Dynamics */ = { - isa = PBXGroup; - children = ( - 506EE5031031176E00A389B3 /* b2Body.cpp */, - 506EE5041031176E00A389B3 /* b2Body.h */, - 506EE5051031176E00A389B3 /* b2ContactManager.cpp */, - 506EE5061031176E00A389B3 /* b2ContactManager.h */, - 506EE5071031176E00A389B3 /* b2Fixture.cpp */, - 506EE5081031176E00A389B3 /* b2Fixture.h */, - 506EE5091031176E00A389B3 /* b2Island.cpp */, - 506EE50A1031176E00A389B3 /* b2Island.h */, - 506EE50B1031176E00A389B3 /* b2TimeStep.h */, - 506EE50C1031176E00A389B3 /* b2World.cpp */, - 506EE50D1031176E00A389B3 /* b2World.h */, - 506EE50E1031176E00A389B3 /* b2WorldCallbacks.cpp */, - 506EE50F1031176E00A389B3 /* b2WorldCallbacks.h */, - 506EE5101031176E00A389B3 /* Contacts */, - 506EE51C1031176E00A389B3 /* Joints */, - ); - path = Dynamics; - sourceTree = ""; - }; - 506EE5101031176E00A389B3 /* Contacts */ = { - isa = PBXGroup; - children = ( - 506EE5111031176E00A389B3 /* b2CircleContact.cpp */, - 506EE5121031176E00A389B3 /* b2CircleContact.h */, - 506EE5131031176E00A389B3 /* b2Contact.cpp */, - 506EE5141031176E00A389B3 /* b2Contact.h */, - 506EE5151031176E00A389B3 /* b2ContactSolver.cpp */, - 506EE5161031176E00A389B3 /* b2ContactSolver.h */, - 506EE5171031176E00A389B3 /* b2NullContact.h */, - 506EE5181031176E00A389B3 /* b2PolygonAndCircleContact.cpp */, - 506EE5191031176E00A389B3 /* b2PolygonAndCircleContact.h */, - 506EE51A1031176E00A389B3 /* b2PolygonContact.cpp */, - 506EE51B1031176E00A389B3 /* b2PolygonContact.h */, - ); - path = Contacts; - sourceTree = ""; - }; - 506EE51C1031176E00A389B3 /* Joints */ = { - isa = PBXGroup; - children = ( - 506EE51D1031176E00A389B3 /* b2DistanceJoint.cpp */, - 506EE51E1031176E00A389B3 /* b2DistanceJoint.h */, - 506EE51F1031176E00A389B3 /* b2GearJoint.cpp */, - 506EE5201031176E00A389B3 /* b2GearJoint.h */, - 506EE5211031176E00A389B3 /* b2Joint.cpp */, - 506EE5221031176E00A389B3 /* b2Joint.h */, - 506EE5231031176E00A389B3 /* b2LineJoint.cpp */, - 506EE5241031176E00A389B3 /* b2LineJoint.h */, - 506EE5251031176E00A389B3 /* b2MouseJoint.cpp */, - 506EE5261031176E00A389B3 /* b2MouseJoint.h */, - 506EE5271031176E00A389B3 /* b2PrismaticJoint.cpp */, - 506EE5281031176E00A389B3 /* b2PrismaticJoint.h */, - 506EE5291031176E00A389B3 /* b2PulleyJoint.cpp */, - 506EE52A1031176E00A389B3 /* b2PulleyJoint.h */, - 506EE52B1031176E00A389B3 /* b2RevoluteJoint.cpp */, - 506EE52C1031176E00A389B3 /* b2RevoluteJoint.h */, - ); - path = Joints; - sourceTree = ""; - }; - 506EE54D103117B600A389B3 /* Tests */ = { - isa = PBXGroup; - children = ( - 50CA8BDD10B6A8C60072E0D3 /* BodyTypes.h */, - 50181E5F106817F0008CE8B2 /* Breakable.h */, - 50181E5D106817E7008CE8B2 /* Confined.h */, - 50181E5E106817E7008CE8B2 /* RayCast.h */, - 506EE54E103117B600A389B3 /* ApplyForce.h */, - 506EE54F103117B600A389B3 /* Bridge.h */, - 506EE552103117B600A389B3 /* CCDTest.h */, - 506EE553103117B600A389B3 /* Chain.h */, - 506EE554103117B600A389B3 /* CollisionFiltering.h */, - 506EE555103117B600A389B3 /* CollisionProcessing.h */, - 506EE556103117B600A389B3 /* CompoundShapes.h */, - 506EE557103117B600A389B3 /* DistanceTest.h */, - 506EE558103117B600A389B3 /* Dominos.h */, - 506EE559103117B600A389B3 /* DynamicTreeTest.h */, - 506EE55A103117B600A389B3 /* ElasticBody.h */, - 506EE55B103117B600A389B3 /* Gears.h */, - 506EE55C103117B600A389B3 /* LineJoint.h */, - 506EE55D103117B600A389B3 /* OneSidedPlatform.h */, - 506EE55E103117B600A389B3 /* PolyCollision.h */, - 506EE55F103117B600A389B3 /* PolyShapes.h */, - 506EE560103117B600A389B3 /* Prismatic.h */, - 506EE561103117B600A389B3 /* Pulleys.h */, - 506EE562103117B600A389B3 /* Pyramid.h */, - 506EE563103117B600A389B3 /* Revolute.h */, - 506EE564103117B600A389B3 /* SensorTest.h */, - 506EE565103117B600A389B3 /* ShapeEditing.h */, - 506EE566103117B600A389B3 /* SliderCrank.h */, - 506EE567103117B600A389B3 /* SphereStack.h */, - 506EE569103117B600A389B3 /* TheoJansen.h */, - 506EE56A103117B600A389B3 /* TimeOfImpact.h */, - 506EE56B103117B600A389B3 /* VaryingFriction.h */, - 506EE56C103117B600A389B3 /* VaryingRestitution.h */, - 506EE56D103117B600A389B3 /* VerticalStack.h */, - 506EE56E103117B600A389B3 /* Web.h */, - ); - name = Tests; - path = ../../../Box2D/Examples/Testbed/Tests; - sourceTree = SOURCE_ROOT; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* Box2D */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Box2D" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Box2D; - productName = Box2D; - productReference = 1D6058910D05DD3D006BFB54 /* Box2D.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Box2D" */; - compatibilityVersion = "Xcode 3.1"; - hasScannedForEncodings = 1; - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Box2D */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, - BBA23A2B0F1F671900608B4E /* Icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* Box2DAppDelegate.mm in Sources */, - 28FD14FE0DC6FC130079059D /* Box2DView.mm in Sources */, - BBA500460F1DF39100D3CCCD /* GLES-Render.mm in Sources */, - BBA500470F1DF39100D3CCCD /* iPhoneTest.mm in Sources */, - BBA235F50F1E02D700608B4E /* iPhoneTestEntries.mm in Sources */, - BBA238AE0F1F437800608B4E /* TestEntriesViewController.mm in Sources */, - 506EE52D1031176E00A389B3 /* b2BroadPhase.cpp in Sources */, - 506EE52E1031176E00A389B3 /* b2CollideCircle.cpp in Sources */, - 506EE52F1031176E00A389B3 /* b2CollidePolygon.cpp in Sources */, - 506EE5301031176E00A389B3 /* b2Collision.cpp in Sources */, - 506EE5311031176E00A389B3 /* b2Distance.cpp in Sources */, - 506EE5321031176E00A389B3 /* b2DynamicTree.cpp in Sources */, - 506EE5331031176E00A389B3 /* b2TimeOfImpact.cpp in Sources */, - 506EE5341031176E00A389B3 /* b2CircleShape.cpp in Sources */, - 506EE5351031176E00A389B3 /* b2PolygonShape.cpp in Sources */, - 506EE5361031176E00A389B3 /* b2BlockAllocator.cpp in Sources */, - 506EE5371031176E00A389B3 /* b2Math.cpp in Sources */, - 506EE5381031176E00A389B3 /* b2Settings.cpp in Sources */, - 506EE5391031176E00A389B3 /* b2StackAllocator.cpp in Sources */, - 506EE53A1031176E00A389B3 /* b2Body.cpp in Sources */, - 506EE53B1031176E00A389B3 /* b2ContactManager.cpp in Sources */, - 506EE53C1031176E00A389B3 /* b2Fixture.cpp in Sources */, - 506EE53D1031176E00A389B3 /* b2Island.cpp in Sources */, - 506EE53E1031176E00A389B3 /* b2World.cpp in Sources */, - 506EE53F1031176E00A389B3 /* b2WorldCallbacks.cpp in Sources */, - 506EE5401031176E00A389B3 /* b2CircleContact.cpp in Sources */, - 506EE5411031176E00A389B3 /* b2Contact.cpp in Sources */, - 506EE5421031176E00A389B3 /* b2ContactSolver.cpp in Sources */, - 506EE5431031176E00A389B3 /* b2PolygonAndCircleContact.cpp in Sources */, - 506EE5441031176E00A389B3 /* b2PolygonContact.cpp in Sources */, - 506EE5451031176E00A389B3 /* b2DistanceJoint.cpp in Sources */, - 506EE5461031176E00A389B3 /* b2GearJoint.cpp in Sources */, - 506EE5471031176E00A389B3 /* b2Joint.cpp in Sources */, - 506EE5481031176E00A389B3 /* b2LineJoint.cpp in Sources */, - 506EE5491031176E00A389B3 /* b2MouseJoint.cpp in Sources */, - 506EE54A1031176E00A389B3 /* b2PrismaticJoint.cpp in Sources */, - 506EE54B1031176E00A389B3 /* b2PulleyJoint.cpp in Sources */, - 506EE54C1031176E00A389B3 /* b2RevoluteJoint.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Box2D_Prefix.pch; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = Box2D; - USER_HEADER_SEARCH_PATHS = ../../../Box2D; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Box2D_Prefix.pch; - INFOPLIST_FILE = Info.plist; - PRODUCT_NAME = Box2D; - USER_HEADER_SEARCH_PATHS = ../../../Box2D; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-DTARGET_OS_IPHONE"; - PREBINDING = NO; - SDKROOT = iphoneos2.2; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - OTHER_CFLAGS = "-DTARGET_OS_IPHONE"; - PREBINDING = NO; - SDKROOT = iphoneos2.2; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Box2D" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Box2D" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D_Prefix.pch b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D_Prefix.pch deleted file mode 100644 index 12c45d7be..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Box2D_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'Box2D' target in the 'Box2D' project -// - -#ifdef __OBJC__ -#import -#import -#endif diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.h deleted file mode 100644 index e977f1045..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// Box2DAppDelegate.h -// Box2D -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - -#import -#import "TestEntriesViewController.h" -#import "Delegates.h" - -@class Box2DView; - -@interface Box2DAppDelegate : NSObject { - UIWindow *window; - Box2DView *glView; - TestEntriesViewController *testEntriesView; -} - -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet Box2DView *glView; - -@end - - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.mm deleted file mode 100644 index e04a09e54..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DAppDelegate.mm +++ /dev/null @@ -1,62 +0,0 @@ -// -// Box2DAppDelegate.m -// Box2D -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - -#import -#import "Box2DAppDelegate.h" -#import "Box2DView.h" - -@implementation Box2DAppDelegate - -@synthesize window; -@synthesize glView; - -- (void)applicationDidFinishLaunching:(UIApplication *)application { - [application setStatusBarHidden:true]; - - [glView removeFromSuperview]; - - glView.animationInterval = 1.0 / 60.0; - - testEntriesView=[[TestEntriesViewController alloc] initWithStyle:UITableViewStylePlain]; - [testEntriesView setDelegate:self]; - [glView setDelegate:self]; - - [window addSubview:[testEntriesView view]]; -} - --(void) selectTest:(int) testIndex -{ - [[testEntriesView view] removeFromSuperview]; - [window addSubview:glView]; - [glView startAnimation]; - [glView selectTestEntry:testIndex]; -} - --(void) leaveTest -{ - [glView stopAnimation]; - [glView removeFromSuperview]; - [window addSubview:[testEntriesView view]]; -} - -- (void)applicationWillResignActive:(UIApplication *)application { - glView.animationInterval = 1.0 / 5.0; -} - - -- (void)applicationDidBecomeActive:(UIApplication *)application { - glView.animationInterval = 1.0 / 60.0; -} - - -- (void)dealloc { - [window release]; - [glView release]; - [super dealloc]; -} - -@end diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.h deleted file mode 100644 index f58d94ace..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.h +++ /dev/null @@ -1,70 +0,0 @@ -// -// Box2DView.h -// Box2D OpenGL View -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - - -#import -#import -#import -#import - -#import "iPhoneTest.h" -#import "Delegates.h" - -/* -This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass. -The view content is basically an EAGL surface you render your OpenGL scene into. -Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. -*/ -@interface Box2DView : UIView { - -@private - /* The pixel dimensions of the backbuffer */ - GLint backingWidth; - GLint backingHeight; - - EAGLContext *context; - - /* OpenGL names for the renderbuffer and framebuffers used to render to this view */ - GLuint viewRenderbuffer, viewFramebuffer; - - /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */ - GLuint depthRenderbuffer; - - NSTimer *animationTimer; - NSTimeInterval animationInterval; - - TestEntry* entry; - Test* test; - - // Position offset and scale - float sceneScale; - CGPoint positionOffset; - CGPoint lastWorldTouch; - CGPoint lastScreenTouch; - - bool panning; - int doubleClickValidCountdown; - - id _delegate; - -} -@property(assign) id delegate; -@property NSTimeInterval animationInterval; - -- (void)startAnimation; -- (void)stopAnimation; -- (void)drawView; --(void) selectTestEntry:(int) testIndex; - -@end - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.mm deleted file mode 100644 index 11743b04a..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Box2DView.mm +++ /dev/null @@ -1,295 +0,0 @@ -// -// Box2DView.mm -// Box2D OpenGL View -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - -#import -#import - -#import "Box2DView.h" - -#define USE_DEPTH_BUFFER 0 -#define kAccelerometerFrequency 30 -#define FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK 10 - -Settings settings; - -// A class extension to declare private methods -@interface Box2DView () - -@property (nonatomic, retain) EAGLContext *context; -@property (nonatomic, assign) NSTimer *animationTimer; - -- (BOOL) createFramebuffer; -- (void) destroyFramebuffer; - -@end - - -@implementation Box2DView - -@synthesize context; -@synthesize animationTimer; -@synthesize animationInterval; -@synthesize delegate=_delegate; - -// You must implement this method -+ (Class)layerClass { - return [CAEAGLLayer class]; -} - - -//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder: -- (id)initWithCoder:(NSCoder*)coder { - - if ((self = [super initWithCoder:coder])) { - // Get the layer - CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; - - eaglLayer.opaque = YES; - eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; - - context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; - - if (!context || ![EAGLContext setCurrentContext:context]) { - [self release]; - return nil; - } - - animationInterval = 1.0 / 60.0; - sceneScale=10.0f; - positionOffset=CGPointMake(0, 0); - lastWorldTouch=CGPointMake(0, 0); - - [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)]; - [[UIAccelerometer sharedAccelerometer] setDelegate:self]; - } - - - return self; -} - --(void) selectTestEntry:(int) testIndex -{ - // Destroy existing scene - delete test; - - entry = g_testEntries + testIndex; - test = entry->createFcn(); - - doubleClickValidCountdown=0; - - sceneScale=10.0f; - positionOffset=CGPointMake(0, 0); - lastWorldTouch=CGPointMake(0, 0); -} - - - -- (void)drawView { - - - - if (doubleClickValidCountdown>0) doubleClickValidCountdown--; - - [EAGLContext setCurrentContext:context]; - - glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); - glViewport(0, 0, backingWidth, backingHeight); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glOrthof(-sceneScale, sceneScale, -sceneScale*1.5f, sceneScale*1.5f, -1.0f, 1.0f); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(positionOffset.x, positionOffset.y,0); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glEnableClientState(GL_VERTEX_ARRAY); - - test->Step(&settings); - - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - [context presentRenderbuffer:GL_RENDERBUFFER_OES]; -} - - -- (void)layoutSubviews { - [EAGLContext setCurrentContext:context]; - [self destroyFramebuffer]; - [self createFramebuffer]; - [self drawView]; -} - - -- (BOOL)createFramebuffer { - - glGenFramebuffersOES(1, &viewFramebuffer); - glGenRenderbuffersOES(1, &viewRenderbuffer); - - glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); - [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); - - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); - glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); - - if (USE_DEPTH_BUFFER) { - glGenRenderbuffersOES(1, &depthRenderbuffer); - glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); - glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); - glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); - } - - if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { - NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); - return NO; - } - - return YES; -} - - -- (void)destroyFramebuffer { - - glDeleteFramebuffersOES(1, &viewFramebuffer); - viewFramebuffer = 0; - glDeleteRenderbuffersOES(1, &viewRenderbuffer); - viewRenderbuffer = 0; - - if(depthRenderbuffer) { - glDeleteRenderbuffersOES(1, &depthRenderbuffer); - depthRenderbuffer = 0; - } -} - - -- (void)startAnimation { - self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES]; -} - - -- (void)stopAnimation { - self.animationTimer = nil; -} - - -- (void)setAnimationTimer:(NSTimer *)newTimer { - [animationTimer invalidate]; - animationTimer = newTimer; -} - - -- (void)setAnimationInterval:(NSTimeInterval)interval { - - animationInterval = interval; - if (animationTimer) { - [self stopAnimation]; - [self startAnimation]; - } -} - - -- (void)dealloc { - - [self stopAnimation]; - - if ([EAGLContext currentContext] == context) { - [EAGLContext setCurrentContext:nil]; - } - - [context release]; - [super dealloc]; -} - --(CGPoint) screenSpaceToWorldSpace:(CGPoint) screenLocation -{ - screenLocation.x-=160; - screenLocation.y-=240; - screenLocation.x/=160; - screenLocation.y/=160; - screenLocation.x*=sceneScale; - screenLocation.y*=-sceneScale; - - screenLocation.x-=positionOffset.x; - screenLocation.y-=positionOffset.y; - return screenLocation; -} - -- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event -{ - - if (doubleClickValidCountdown>0) - { - [_delegate leaveTest]; - return; - } - - doubleClickValidCountdown=FRAMES_BETWEEN_PRESSES_FOR_DOUBLE_CLICK; - - - panning=false; - for (UITouch *touch in touches) - { - CGPoint touchLocation=[touch locationInView:self]; - CGPoint worldPosition=[self screenSpaceToWorldSpace:touchLocation]; - //printf("Screen touched %f,%f -> %f,%f\n",touchLocation.x,touchLocation.y,worldPosition.x,worldPosition.y); - lastScreenTouch=touchLocation; - lastWorldTouch=worldPosition; - test->MouseDown(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); - - if (!test->m_mouseJoint) panning=true; - } -} - -- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event -{ - for (UITouch *touch in touches) - { - CGPoint touchLocation=[touch locationInView:self]; - CGPoint worldPosition=[self screenSpaceToWorldSpace:touchLocation]; - //printf("Screen touched %f,%f -> %f,%f\n",touchLocation.x,touchLocation.y,worldPosition.x,worldPosition.y); - - - CGPoint screenDistanceMoved=CGPointMake(touchLocation.x-lastScreenTouch.x,touchLocation.y-lastScreenTouch.y); - if (panning) - { - screenDistanceMoved.x/=160; - screenDistanceMoved.y/=160; - screenDistanceMoved.x*=sceneScale; - screenDistanceMoved.y*=-sceneScale; - positionOffset.x+=screenDistanceMoved.x; - positionOffset.y+=screenDistanceMoved.y; - } - - lastScreenTouch=touchLocation; - lastWorldTouch=worldPosition; - test->MouseMove(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); - - } -} -- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event -{ - test->MouseUp(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); -} - -- (void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration -{ - // Only run for valid values - if (acceleration.y!=0 && acceleration.x!=0) - { - if (test) test->SetGravity(acceleration.x,acceleration.y); - } -} - -@end diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Delegates.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Delegates.h deleted file mode 100644 index b6a7865e5..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/Delegates.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Delegates.h - * Box2D - * - * Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com - * - * - */ - -@protocol TestSelectDelegate - -(void) selectTest:(int) testIndex; - -(void) leaveTest; - -@end - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.h deleted file mode 100644 index 2d05372d4..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef RENDER_H -#define RENDER_H - -#import -#import -#import -#import - -#include - -struct b2AABB; - -// This class implements debug drawing callbacks that are invoked -// inside b2World::Step. -class GLESDebugDraw : public b2DebugDraw -{ -public: - void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); - - void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); - - void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color); - - void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color); - - void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color); - - void DrawTransform(const b2Transform& xf); - - void DrawPoint(const b2Vec2& p, float32 size, const b2Color& color); - - void DrawString(int x, int y, const char* string, ...); - - void DrawAABB(b2AABB* aabb, const b2Color& color); -}; - - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.mm deleted file mode 100644 index abf5c5708..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/GLES-Render.mm +++ /dev/null @@ -1,149 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "GLES-Render.h" - - -#include -#include - -#include - -void GLESDebugDraw::DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) -{ - glColor4f(color.r, color.g, color.b,1); - glVertexPointer(2, GL_FLOAT, 0, vertices); - glDrawArrays(GL_LINE_LOOP, 0, vertexCount); -} - -void GLESDebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) -{ - glVertexPointer(2, GL_FLOAT, 0, vertices); - - glColor4f(color.r, color.g, color.b,0.5f); - glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); - - glColor4f(color.r, color.g, color.b,1); - glDrawArrays(GL_LINE_LOOP, 0, vertexCount); -} - -void GLESDebugDraw::DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) -{ - const float32 k_segments = 16.0f; - int vertexCount=16; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - - GLfloat glVertices[vertexCount*2]; - for (int32 i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertices[i*2]=v.x; - glVertices[i*2+1]=v.y; - theta += k_increment; - } - - glColor4f(color.r, color.g, color.b,1); - glVertexPointer(2, GL_FLOAT, 0, glVertices); - - glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); -} - -void GLESDebugDraw::DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) -{ - const float32 k_segments = 16.0f; - int vertexCount=16; - const float32 k_increment = 2.0f * b2_pi / k_segments; - float32 theta = 0.0f; - - GLfloat glVertices[vertexCount*2]; - for (int32 i = 0; i < k_segments; ++i) - { - b2Vec2 v = center + radius * b2Vec2(cosf(theta), sinf(theta)); - glVertices[i*2]=v.x; - glVertices[i*2+1]=v.y; - theta += k_increment; - } - - glColor4f(color.r, color.g, color.b,0.5f); - glVertexPointer(2, GL_FLOAT, 0, glVertices); - glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); - glColor4f(color.r, color.g, color.b,1); - glDrawArrays(GL_LINE_LOOP, 0, vertexCount); - - // Draw the axis line - DrawSegment(center,center+radius*axis,color); -} - -void GLESDebugDraw::DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) -{ - glColor4f(color.r, color.g, color.b,1); - GLfloat glVertices[] = { - p1.x,p1.y,p2.x,p2.y - }; - glVertexPointer(2, GL_FLOAT, 0, glVertices); - glDrawArrays(GL_LINES, 0, 2); -} - -void GLESDebugDraw::DrawTransform(const b2Transform& xf) -{ - b2Vec2 p1 = xf.position, p2; - const float32 k_axisScale = 0.4f; - - p2 = p1 + k_axisScale * xf.R.col1; - DrawSegment(p1,p2,b2Color(1,0,0)); - - p2 = p1 + k_axisScale * xf.R.col2; - DrawSegment(p1,p2,b2Color(0,1,0)); -} - -void GLESDebugDraw::DrawPoint(const b2Vec2& p, float32 size, const b2Color& color) -{ - glColor4f(color.r, color.g, color.b,1); - glPointSize(size); - GLfloat glVertices[] = { - p.x,p.y - }; - glVertexPointer(2, GL_FLOAT, 0, glVertices); - glDrawArrays(GL_POINTS, 0, 1); - glPointSize(1.0f); -} - -void GLESDebugDraw::DrawString(int x, int y, const char *string, ...) -{ - - /* Unsupported as yet. Could replace with bitmap font renderer at a later date */ -} - -void GLESDebugDraw::DrawAABB(b2AABB* aabb, const b2Color& c) -{ - - glColor4f(c.r, c.g, c.b,1); - - GLfloat glVertices[] = { - aabb->lowerBound.x, aabb->lowerBound.y, - aabb->upperBound.x, aabb->lowerBound.y, - aabb->upperBound.x, aabb->upperBound.y, - aabb->lowerBound.x, aabb->upperBound.y - }; - glVertexPointer(2, GL_FLOAT, 0, glVertices); - glDrawArrays(GL_LINE_LOOP, 0, 8); - -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.h deleted file mode 100644 index d8e4b3705..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// TestEntriesViewController.h -// Box2D -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - -#import -#import "iPhoneTest.h" -#import "Delegates.h" - -@interface TestEntriesViewController : UITableViewController { - int32 testCount; - id _delegate; -} - -@property(assign) id delegate; - -@end - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.mm deleted file mode 100644 index 49eb94e82..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/TestEntriesViewController.mm +++ /dev/null @@ -1,75 +0,0 @@ -// -// TestEntriesViewController.m -// Box2D -// -// Box2D iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -// - -#import "TestEntriesViewController.h" - - -@implementation TestEntriesViewController - -@synthesize delegate=_delegate; - -- (id)initWithStyle:(UITableViewStyle)style { - if (self = [super initWithStyle:style]) { - testCount = 0; - TestEntry* e = g_testEntries; - while (e->createFcn) - { - ++testCount; - ++e; - } - } - return self; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark Table view methods - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - - -// Customize the number of rows in the table view. -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return testCount; -} - - -// Customize the appearance of table view cells. -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - - static NSString *CellIdentifier = @"Cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; - } - - // Set up the cell... - TestEntry* e = g_testEntries; - e+=indexPath.row; - - [cell setText:[NSString stringWithCString:e->name]]; - return cell; -} - - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [_delegate selectTest:indexPath.row]; -} - -- (void)dealloc { - [super dealloc]; -} - - -@end - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.h deleted file mode 100644 index a77c7f2cb..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.h +++ /dev/null @@ -1,192 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - - - -#ifndef TEST_H -#define TEST_H - -#import -#include -#include "GLES-Render.h" - -#include - -class Test; -struct Settings; - -typedef Test* TestCreateFcn(); - -#define RAND_LIMIT 32767 - -/// Random number in range [-1,1] -inline float32 RandomFloat() -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = 2.0f * r - 1.0f; - return r; -} - -/// Random floating point number in range [lo, hi] -inline float32 RandomFloat(float32 lo, float32 hi) -{ - float32 r = (float32)(rand() & (RAND_LIMIT)); - r /= RAND_LIMIT; - r = (hi - lo) * r + lo; - return r; -} - -/// Test settings. Some can be controlled in the GUI. -struct Settings -{ - Settings() : - hz(60.0f), - velocityIterations(10), - positionIterations(4), - drawStats(0), - drawShapes(1), - drawJoints(1), - drawAABBs(0), - drawPairs(0), - drawContactPoints(0), - drawContactNormals(0), - drawContactForces(0), - drawFrictionForces(0), - drawCOMs(0), - enableWarmStarting(1), - enableContinuous(1), - pause(0), - singleStep(0) - {} - - float32 hz; - int32 velocityIterations; - int32 positionIterations; - int32 drawShapes; - int32 drawJoints; - int32 drawAABBs; - int32 drawPairs; - int32 drawContactPoints; - int32 drawContactNormals; - int32 drawContactForces; - int32 drawFrictionForces; - int32 drawCOMs; - int32 drawStats; - int32 enableWarmStarting; - int32 enableContinuous; - int32 pause; - int32 singleStep; -}; - -struct TestEntry -{ - const char *name; - TestCreateFcn *createFcn; -}; - -extern TestEntry g_testEntries[]; -// This is called when a joint in the world is implicitly destroyed -// because an attached body is destroyed. This gives us a chance to -// nullify the mouse joint. -class DestructionListener : public b2DestructionListener - { - public: - void SayGoodbye(b2Fixture* fixture) { B2_NOT_USED(fixture); } - void SayGoodbye(b2Joint* joint); - - Test* test; - }; - -const int32 k_maxContactPoints = 2048; - -struct ContactPoint -{ - b2Fixture* fixtureA; - b2Fixture* fixtureB; - b2Vec2 normal; - b2Vec2 position; - b2PointState state; -}; - -class Test : public b2ContactListener - { - public: - - Test(); - virtual ~Test(); - - void SetGravity(float x,float y); - void SetTextLine(int32 line) { m_textLine = line; } - void DrawTitle(int x, int y, const char *string); - virtual void Step(Settings* settings); - virtual void Keyboard(unsigned char key) { B2_NOT_USED(key); } - void ShiftMouseDown(const b2Vec2& p); - virtual void MouseDown(const b2Vec2& p); - virtual void MouseUp(const b2Vec2& p); - void MouseMove(const b2Vec2& p); - void LaunchBomb(); - void LaunchBomb(const b2Vec2& position, const b2Vec2& velocity); - - void SpawnBomb(const b2Vec2& worldPt); - void CompleteBombSpawn(const b2Vec2& p); - - // Let derived tests know that a joint was destroyed. - virtual void JointDestroyed(b2Joint* joint) { B2_NOT_USED(joint); } - - // Callbacks for derived classes. - virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } - virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); - virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) - { - B2_NOT_USED(contact); - B2_NOT_USED(impulse); - } - - protected: - friend class DestructionListener; - friend class BoundaryListener; - friend class ContactListener; - - b2Body* m_groundBody; - b2AABB m_worldAABB; - ContactPoint m_points[k_maxContactPoints]; - int32 m_pointCount; - DestructionListener m_destructionListener; - GLESDebugDraw m_debugDraw; - int32 m_textLine; - b2World* m_world; - b2Body* m_bomb; - b2MouseJoint* m_mouseJoint; - b2Vec2 m_bombSpawnPoint; - bool m_bombSpawning; - b2Vec2 m_mouseWorld; - int32 m_stepCount; - }; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.mm deleted file mode 100644 index 663e9acbf..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTest.mm +++ /dev/null @@ -1,411 +0,0 @@ -/* -* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com -* -* iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "iPhoneTest.h" -#include "GLES-Render.h" - -#include - -void DestructionListener::SayGoodbye(b2Joint* joint) -{ - if (test->m_mouseJoint == joint) - { - test->m_mouseJoint = NULL; - } - else - { - test->JointDestroyed(joint); - } -} - -Test::Test() -: m_debugDraw() -{ - b2Vec2 gravity; - gravity.Set(0.0f, -10.0f); - bool doSleep = true; - m_world = new b2World(gravity, doSleep); - m_bomb = NULL; - m_textLine = 30; - m_mouseJoint = NULL; - m_pointCount = 0; - - m_destructionListener.test = this; - m_world->SetDestructionListener(&m_destructionListener); - m_world->SetContactListener(this); - m_world->SetDebugDraw(&m_debugDraw); - - m_bombSpawning = false; - - m_stepCount = 0; - - b2BodyDef bodyDef; - m_groundBody = m_world->CreateBody(&bodyDef); -} - -Test::~Test() -{ - // By deleting the world, we delete the bomb, mouse joint, etc. - delete m_world; - m_world = NULL; - -} - -void Test::SetGravity( float x, float y) -{ - float tVectorLength=sqrt(x*x+y*y); - float newGravityX=9.81f*x/tVectorLength; - float newGravityY=9.81f*y/tVectorLength; - m_world->SetGravity(b2Vec2(newGravityX,newGravityY)); -} - -void Test::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) -{ - const b2Manifold* manifold = contact->GetManifold(); - - if (manifold->m_pointCount == 0) - { - return; - } - - b2Fixture* fixtureA = contact->GetFixtureA(); - b2Fixture* fixtureB = contact->GetFixtureB(); - - b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints]; - b2GetPointStates(state1, state2, oldManifold, manifold); - - b2WorldManifold worldManifold; - contact->GetWorldManifold(&worldManifold); - - for (int32 i = 0; i < manifold->m_pointCount && m_pointCount < k_maxContactPoints; ++i) - { - ContactPoint* cp = m_points + m_pointCount; - cp->fixtureA = fixtureA; - cp->fixtureB = fixtureB; - cp->position = worldManifold.m_points[i]; - cp->normal = worldManifold.m_normal; - cp->state = state2[i]; - ++m_pointCount; - } -} - -void Test::DrawTitle(int x, int y, const char *string) -{ - m_debugDraw.DrawString(x, y, string); -} - -class QueryCallback : public b2QueryCallback - { - public: - QueryCallback(const b2Vec2& point) - { - m_point = point; - m_fixture = NULL; - } - - bool ReportFixture(b2Fixture* fixture) - { - b2Body* body = fixture->GetBody(); - if (body->GetType() == b2_dynamicBody) - { - bool inside = fixture->TestPoint(m_point); - if (inside) - { - m_fixture = fixture; - - // We are done, terminate the query. - return false; - } - } - - // Continue the query. - return true; - } - - b2Vec2 m_point; - b2Fixture* m_fixture; - }; - - -void Test::MouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != NULL) - { - return; - } - - // Make a small box. - b2AABB aabb; - b2Vec2 d; - d.Set(0.001f, 0.001f); - aabb.lowerBound = p - d; - aabb.upperBound = p + d; - - // Query the world for overlapping shapes. - QueryCallback callback(p); - m_world->QueryAABB(&callback, aabb); - - if (callback.m_fixture) - { - b2Body* body = callback.m_fixture->GetBody(); - b2MouseJointDef md; - md.bodyA = m_groundBody; - md.bodyB = body; - md.target = p; -#ifdef TARGET_FLOAT32_IS_FIXED - md.maxForce = (body->GetMass() < 16.0)? - (1000.0f * body->GetMass()) : float32(16000.0); -#else - md.maxForce = 1000.0f * body->GetMass(); -#endif - m_mouseJoint = (b2MouseJoint*)m_world->CreateJoint(&md); - body->SetAwake(true); - } -} - -void Test::SpawnBomb(const b2Vec2& worldPt) -{ - m_bombSpawnPoint = worldPt; - m_bombSpawning = true; -} - -void Test::CompleteBombSpawn(const b2Vec2& p) -{ - if (m_bombSpawning == false) - { - return; - } - - const float multiplier = 30.0f; - b2Vec2 vel = m_bombSpawnPoint - p; - vel *= multiplier; - LaunchBomb(m_bombSpawnPoint,vel); - m_bombSpawning = false; -} - -void Test::ShiftMouseDown(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint != NULL) - { - return; - } - - SpawnBomb(p); -} - -void Test::MouseUp(const b2Vec2& p) -{ - if (m_mouseJoint) - { - m_world->DestroyJoint(m_mouseJoint); - m_mouseJoint = NULL; - } - - if (m_bombSpawning) - { - CompleteBombSpawn(p); - } -} - -void Test::MouseMove(const b2Vec2& p) -{ - m_mouseWorld = p; - - if (m_mouseJoint) - { - m_mouseJoint->SetTarget(p); - } -} - -void Test::LaunchBomb() -{ - b2Vec2 p(RandomFloat(-15.0f, 15.0f), 30.0f); - b2Vec2 v = -5.0f * p; - LaunchBomb(p, v); -} - -void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) -{ - if (m_bomb) - { - m_world->DestroyBody(m_bomb); - m_bomb = NULL; - } - - b2BodyDef bd; - bd.type = b2_dynamicBody; - bd.position = position; - bd.bullet = true; - m_bomb = m_world->CreateBody(&bd); - m_bomb->SetLinearVelocity(velocity); - - b2CircleShape circle; - circle.m_radius = 0.3f; - - b2FixtureDef fd; - fd.shape = &circle; - fd.density = 20.0f; - fd.restitution = 0.1f; - - b2Vec2 minV = position - b2Vec2(0.3f,0.3f); - b2Vec2 maxV = position + b2Vec2(0.3f,0.3f); - - b2AABB aabb; - aabb.lowerBound = minV; - aabb.upperBound = maxV; - - m_bomb->CreateFixture(&fd); -} - -void Test::Step(Settings* settings) -{ - float32 timeStep = settings->hz > 0.0f ? 1.0f / settings->hz : float32(0.0f); - - if (settings->pause) - { - if (settings->singleStep) - { - settings->singleStep = 0; - } - else - { - timeStep = 0.0f; - } - - m_debugDraw.DrawString(5, m_textLine, "****PAUSED****"); - m_textLine += 15; - } - - uint32 flags = 0; - flags += settings->drawShapes * b2DebugDraw::e_shapeBit; - flags += settings->drawJoints * b2DebugDraw::e_jointBit; - flags += settings->drawAABBs * b2DebugDraw::e_aabbBit; - flags += settings->drawPairs * b2DebugDraw::e_pairBit; - flags += settings->drawCOMs * b2DebugDraw::e_centerOfMassBit; - m_debugDraw.SetFlags(flags); - - m_world->SetWarmStarting(settings->enableWarmStarting > 0); - m_world->SetContinuousPhysics(settings->enableContinuous > 0); - - m_pointCount = 0; - - m_world->Step(timeStep, settings->velocityIterations, settings->positionIterations, true); - - m_world->DrawDebugData(); - - if (timeStep > 0.0f) - { - ++m_stepCount; - } - - if (settings->drawStats) - { - m_debugDraw.DrawString(5, m_textLine, "bodies/contacts/joints/proxies = %d/%d/%d", - m_world->GetBodyCount(), m_world->GetContactCount(), m_world->GetJointCount(), m_world->GetProxyCount()); - m_textLine += 15; - - m_debugDraw.DrawString(5, m_textLine, "heap bytes = %d", b2_byteCount); - m_textLine += 15; - } - - if (m_mouseJoint) - { -// b2Body* body = m_mouseJoint->GetBodyB(); -// b2Vec2 p1 = body->GetWorldPoint(m_mouseJoint->m_localAnchor); -// b2Vec2 p2 = m_mouseJoint->m_target; -// -// glPointSize(4.0f); -// glColor3f(0.0f, 1.0f, 0.0f); -// glBegin(GL_POINTS); -// glVertex2f(p1.x, p1.y); -// glVertex2f(p2.x, p2.y); -// glEnd(); -// glPointSize(1.0f); -// -// glColor3f(0.8f, 0.8f, 0.8f); -// glBegin(GL_LINES); -// glVertex2f(p1.x, p1.y); -// glVertex2f(p2.x, p2.y); -// glEnd(); - } - - if (m_bombSpawning) - { -// glPointSize(4.0f); -// glColor3f(0.0f, 0.0f, 1.0f); -// glBegin(GL_POINTS); -// glColor3f(0.0f, 0.0f, 1.0f); -// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); -// glEnd(); -// -// glColor3f(0.8f, 0.8f, 0.8f); -// glBegin(GL_LINES); -// glVertex2f(m_mouseWorld.x, m_mouseWorld.y); -// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); -// glEnd(); - } - - if (settings->drawContactPoints) - { - //const float32 k_impulseScale = 0.1f; - const float32 k_axisScale = 0.3f; - - for (int32 i = 0; i < m_pointCount; ++i) - { - ContactPoint* point = m_points + i; - - if (point->state == b2_addState) - { - // Add - m_debugDraw.DrawPoint(point->position, 10.0f, b2Color(0.3f, 0.95f, 0.3f)); - } - else if (point->state == b2_persistState) - { - // Persist - m_debugDraw.DrawPoint(point->position, 5.0f, b2Color(0.3f, 0.3f, 0.95f)); - } - - if (settings->drawContactNormals == 1) - { - b2Vec2 p1 = point->position; - b2Vec2 p2 = p1 + k_axisScale * point->normal; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.4f, 0.9f, 0.4f)); - } - else if (settings->drawContactForces == 1) - { - //b2Vec2 p1 = point->position; - //b2Vec2 p2 = p1 + k_forceScale * point->normalForce * point->normal; - //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - - if (settings->drawFrictionForces == 1) - { - //b2Vec2 tangent = b2Cross(point->normal, 1.0f); - //b2Vec2 p1 = point->position; - //b2Vec2 p2 = p1 + k_forceScale * point->tangentForce * tangent; - //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); - } - } - } -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTestEntries.mm b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTestEntries.mm deleted file mode 100644 index 885d14623..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Classes/iPhoneTestEntries.mm +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - -#include "iPhoneTest.h" -//#include "GLES-Render.h" - -#include "ApplyForce.h" -#include "BodyTypes.h" - -#include "Breakable.h" -#include "Bridge.h" -#include "CCDTest.h" -#include "Chain.h" -#include "CollisionFiltering.h" -#include "CollisionProcessing.h" -#include "CompoundShapes.h" -#include "Confined.h" -#include "DistanceTest.h" -#include "Dominos.h" -#include "DynamicTreeTest.h" -#include "Gears.h" -#include "LineJoint.h" -#include "OneSidedPlatform.h" -#include "PolyCollision.h" -#include "PolyShapes.h" -#include "Prismatic.h" -#include "Pulleys.h" -#include "Pyramid.h" -#include "RayCast.h" -#include "Revolute.h" -#include "SensorTest.h" -#include "ShapeEditing.h" -#include "SliderCrank.h" -#include "SphereStack.h" -#include "TheoJansen.h" -#include "TimeOfImpact.h" -#include "VaryingFriction.h" -#include "VaryingRestitution.h" -#include "VerticalStack.h" -#include "Web.h" - -TestEntry g_testEntries[] = -{ -{"Body Types", BodyTypes::Create}, -{"CCD Test", CCDTest::Create}, -{"SphereStack", SphereStack::Create}, -{"Vertical Stack", VerticalStack::Create}, -{"Confined", Confined::Create}, -{"Bridge", Bridge::Create}, -{"Breakable", Breakable::Create}, -{"Varying Restitution", VaryingRestitution::Create}, -{"Ray-Cast", RayCast::Create}, -{"Pyramid", Pyramid::Create}, -{"PolyCollision", PolyCollision::Create}, -{"One-Sided Platform", OneSidedPlatform::Create}, -{"Apply Force", ApplyForce::Create}, -{"Chain", Chain::Create}, -{"Collision Filtering", CollisionFiltering::Create}, -{"Collision Processing", CollisionProcessing::Create}, -{"Compound Shapes", CompoundShapes::Create}, -{"Distance Test", DistanceTest::Create}, -{"Dominos", Dominos::Create}, -{"Dynamic Tree", DynamicTreeTest::Create}, -{"Gears", Gears::Create}, -{"Line Joint", LineJoint::Create}, -{"Polygon Shapes", PolyShapes::Create}, -{"Prismatic", Prismatic::Create}, -{"Pulleys", Pulleys::Create}, -{"Revolute", Revolute::Create}, -{"Sensor Test", SensorTest::Create}, -{"Shape Editing", ShapeEditing::Create}, -{"Slider Crank", SliderCrank::Create}, -{"Theo Jansen's Walker", TheoJansen::Create}, -{"Time of Impact", TimeOfImpact::Create}, -{"Varying Friction", VaryingFriction::Create}, -{"Web", Web::Create}, -{NULL, NULL} - -}; diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Icon.png b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Icon.png deleted file mode 100644 index fe81a5975..000000000 Binary files a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Icon.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Info.plist b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Info.plist deleted file mode 100644 index fdf834060..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/MainWindow.xib b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/MainWindow.xib deleted file mode 100644 index f2e35a979..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/MainWindow.xib +++ /dev/null @@ -1,232 +0,0 @@ - - - - 528 - 9G55 - 677 - 949.43 - 353.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1316 - - YES - - - 1298 - {320, 480} - - - 3 - MQA - - 2 - - - NO - - - - {320, 480} - - - 1 - MSAxIDEAA - - NO - YES - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - glView - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - 8 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 8.CustomClassName - 8.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{500, 343}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - Box2DAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - Box2DView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 9 - - - - YES - - Box2DAppDelegate - NSObject - - YES - - YES - glView - window - - - YES - Box2DView - UIWindow - - - - IBProjectSource - Classes/Box2DAppDelegate.h - - - - Box2DView - UIView - - IBProjectSource - Classes/Box2DView.h - - - - - 0 - Box2D.xcodeproj - 3 - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/main.m b/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/main.m deleted file mode 100644 index 1c484290c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Platforms/iPhone/main.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.m -// Box2D -// -// Created by Simon Oliver on 14/01/2009. -// Copyright HandCircus 2009. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; -} diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.cpp deleted file mode 100644 index 9310b0245..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#include "Biped.h" -#include "BipedDef.h" - -Biped::Biped(b2World* w, const b2Vec2& position) -{ - m_world = w; - - BipedDef def; - b2BodyDef bd; - - // create body parts - bd = def.LFootDef; - bd.position += position; - LFoot = w->CreateBody(&bd); - LFoot->CreateFixture(&def.LFootPoly); - LFoot->SetMassFromShapes(); - - bd = def.RFootDef; - bd.position += position; - RFoot = w->CreateBody(&bd); - RFoot->CreateFixture(&def.RFootPoly); - RFoot->SetMassFromShapes(); - - bd = def.LCalfDef; - bd.position += position; - LCalf = w->CreateBody(&bd); - LCalf->CreateFixture(&def.LCalfPoly); - LCalf->SetMassFromShapes(); - - bd = def.RCalfDef; - bd.position += position; - RCalf = w->CreateBody(&bd); - RCalf->CreateFixture(&def.RCalfPoly); - RCalf->SetMassFromShapes(); - - bd = def.LThighDef; - bd.position += position; - LThigh = w->CreateBody(&bd); - LThigh->CreateFixture(&def.LThighPoly); - LThigh->SetMassFromShapes(); - - bd = def.RThighDef; - bd.position += position; - RThigh = w->CreateBody(&bd); - RThigh->CreateFixture(&def.RThighPoly); - RThigh->SetMassFromShapes(); - - bd = def.PelvisDef; - bd.position += position; - Pelvis = w->CreateBody(&bd); - Pelvis->CreateFixture(&def.PelvisPoly); - Pelvis->SetMassFromShapes(); - - bd = def.StomachDef; - bd.position += position; - Stomach = w->CreateBody(&bd); - Stomach->CreateFixture(&def.StomachPoly); - Stomach->SetMassFromShapes(); - - bd = def.ChestDef; - bd.position += position; - Chest = w->CreateBody(&bd); - Chest->CreateFixture(&def.ChestPoly); - Chest->SetMassFromShapes(); - - bd = def.NeckDef; - bd.position += position; - Neck = w->CreateBody(&bd); - Neck->CreateFixture(&def.NeckPoly); - Neck->SetMassFromShapes(); - - bd = def.HeadDef; - bd.position += position; - Head = w->CreateBody(&bd); - Head->CreateFixture(&def.HeadCirc); - Head->SetMassFromShapes(); - - bd = def.LUpperArmDef; - bd.position += position; - LUpperArm = w->CreateBody(&bd); - LUpperArm->CreateFixture(&def.LUpperArmPoly); - LUpperArm->SetMassFromShapes(); - - bd = def.RUpperArmDef; - bd.position += position; - RUpperArm = w->CreateBody(&bd); - RUpperArm->CreateFixture(&def.RUpperArmPoly); - RUpperArm->SetMassFromShapes(); - - bd = def.LForearmDef; - bd.position += position; - LForearm = w->CreateBody(&bd); - LForearm->CreateFixture(&def.LForearmPoly); - LForearm->SetMassFromShapes(); - - bd = def.RForearmDef; - bd.position += position; - RForearm = w->CreateBody(&bd); - RForearm->CreateFixture(&def.RForearmPoly); - RForearm->SetMassFromShapes(); - - bd = def.LHandDef; - bd.position += position; - LHand = w->CreateBody(&bd); - LHand->CreateFixture(&def.LHandPoly); - LHand->SetMassFromShapes(); - - bd = def.RHandDef; - bd.position += position; - RHand = w->CreateBody(&bd); - RHand->CreateFixture(&def.RHandPoly); - RHand->SetMassFromShapes(); - - // link body parts - def.LAnkleDef.body1 = LFoot; - def.LAnkleDef.body2 = LCalf; - def.RAnkleDef.body1 = RFoot; - def.RAnkleDef.body2 = RCalf; - def.LKneeDef.body1 = LCalf; - def.LKneeDef.body2 = LThigh; - def.RKneeDef.body1 = RCalf; - def.RKneeDef.body2 = RThigh; - def.LHipDef.body1 = LThigh; - def.LHipDef.body2 = Pelvis; - def.RHipDef.body1 = RThigh; - def.RHipDef.body2 = Pelvis; - def.LowerAbsDef.body1 = Pelvis; - def.LowerAbsDef.body2 = Stomach; - def.UpperAbsDef.body1 = Stomach; - def.UpperAbsDef.body2 = Chest; - def.LowerNeckDef.body1 = Chest; - def.LowerNeckDef.body2 = Neck; - def.UpperNeckDef.body1 = Chest; - def.UpperNeckDef.body2 = Head; - def.LShoulderDef.body1 = Chest; - def.LShoulderDef.body2 = LUpperArm; - def.RShoulderDef.body1 = Chest; - def.RShoulderDef.body2 = RUpperArm; - def.LElbowDef.body1 = LForearm; - def.LElbowDef.body2 = LUpperArm; - def.RElbowDef.body1 = RForearm; - def.RElbowDef.body2 = RUpperArm; - def.LWristDef.body1 = LHand; - def.LWristDef.body2 = LForearm; - def.RWristDef.body1 = RHand; - def.RWristDef.body2 = RForearm; - - // create joints - LAnkle = (b2RevoluteJoint*)w->CreateJoint(&def.LAnkleDef); - RAnkle = (b2RevoluteJoint*)w->CreateJoint(&def.RAnkleDef); - LKnee = (b2RevoluteJoint*)w->CreateJoint(&def.LKneeDef); - RKnee = (b2RevoluteJoint*)w->CreateJoint(&def.RKneeDef); - LHip = (b2RevoluteJoint*)w->CreateJoint(&def.LHipDef); - RHip = (b2RevoluteJoint*)w->CreateJoint(&def.RHipDef); - LowerAbs = (b2RevoluteJoint*)w->CreateJoint(&def.LowerAbsDef); - UpperAbs = (b2RevoluteJoint*)w->CreateJoint(&def.UpperAbsDef); - LowerNeck = (b2RevoluteJoint*)w->CreateJoint(&def.LowerNeckDef); - UpperNeck = (b2RevoluteJoint*)w->CreateJoint(&def.UpperNeckDef); - LShoulder = (b2RevoluteJoint*)w->CreateJoint(&def.LShoulderDef); - RShoulder = (b2RevoluteJoint*)w->CreateJoint(&def.RShoulderDef); - LElbow = (b2RevoluteJoint*)w->CreateJoint(&def.LElbowDef); - RElbow = (b2RevoluteJoint*)w->CreateJoint(&def.RElbowDef); - LWrist = (b2RevoluteJoint*)w->CreateJoint(&def.LWristDef); - RWrist = (b2RevoluteJoint*)w->CreateJoint(&def.RWristDef); -} - - -Biped::~Biped(void) -{ - m_world->DestroyBody(LFoot); - m_world->DestroyBody(RFoot); - m_world->DestroyBody(LCalf); - m_world->DestroyBody(RCalf); - m_world->DestroyBody(LThigh); - m_world->DestroyBody(RThigh); - m_world->DestroyBody(Pelvis); - m_world->DestroyBody(Stomach); - m_world->DestroyBody(Chest); - m_world->DestroyBody(Neck); - m_world->DestroyBody(Head); - m_world->DestroyBody(LUpperArm); - m_world->DestroyBody(RUpperArm); - m_world->DestroyBody(LForearm); - m_world->DestroyBody(RForearm); - m_world->DestroyBody(LHand); - m_world->DestroyBody(RHand); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.h deleted file mode 100644 index 7db30623b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/Biped.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef BIPED_H -#define BIPED_H - -#include "Box2D.h" - -// Ragdoll class thanks to darkzerox. -class Biped -{ -public: - Biped(b2World*, const b2Vec2& position); - ~Biped(); - -private: - b2World* m_world; - - b2Body *LFoot, *RFoot, *LCalf, *RCalf, *LThigh, *RThigh, - *Pelvis, *Stomach, *Chest, *Neck, *Head, - *LUpperArm, *RUpperArm, *LForearm, *RForearm, *LHand, *RHand; - - b2RevoluteJoint *LAnkle, *RAnkle, *LKnee, *RKnee, *LHip, *RHip, - *LowerAbs, *UpperAbs, *LowerNeck, *UpperNeck, - *LShoulder, *RShoulder, *LElbow, *RElbow, *LWrist, *RWrist; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.cpp deleted file mode 100644 index 17099fe9d..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.cpp +++ /dev/null @@ -1,485 +0,0 @@ -#include "BipedDef.h" - -int16 BipedDef::count = 0; - -const float32 k_scale = 3.0f; - -BipedDef::BipedDef() -{ - SetMotorTorque(2.0f); - SetMotorSpeed(0.0f); - SetDensity(20.0f); - SetRestitution(0.0f); - SetLinearDamping(0.0f); - SetAngularDamping(0.005f); - SetGroupIndex(--count); - EnableMotor(); - EnableLimit(); - - DefaultVertices(); - DefaultPositions(); - DefaultJoints(); - - LFootPoly.friction = RFootPoly.friction = 0.85f; -} - -void BipedDef::IsFast(bool b) -{ - B2_NOT_USED(b); - /* - LFootDef.isFast = b; - RFootDef.isFast = b; - LCalfDef.isFast = b; - RCalfDef.isFast = b; - LThighDef.isFast = b; - RThighDef.isFast = b; - PelvisDef.isFast = b; - StomachDef.isFast = b; - ChestDef.isFast = b; - NeckDef.isFast = b; - HeadDef.isFast = b; - LUpperArmDef.isFast = b; - RUpperArmDef.isFast = b; - LForearmDef.isFast = b; - RForearmDef.isFast = b; - LHandDef.isFast = b; - RHandDef.isFast = b; - */ -} - -void BipedDef::SetGroupIndex(int16 i) -{ - LFootPoly.filter.groupIndex = i; - RFootPoly.filter.groupIndex = i; - LCalfPoly.filter.groupIndex = i; - RCalfPoly.filter.groupIndex = i; - LThighPoly.filter.groupIndex = i; - RThighPoly.filter.groupIndex = i; - PelvisPoly.filter.groupIndex = i; - StomachPoly.filter.groupIndex = i; - ChestPoly.filter.groupIndex = i; - NeckPoly.filter.groupIndex = i; - HeadCirc.filter.groupIndex = i; - LUpperArmPoly.filter.groupIndex = i; - RUpperArmPoly.filter.groupIndex = i; - LForearmPoly.filter.groupIndex = i; - RForearmPoly.filter.groupIndex = i; - LHandPoly.filter.groupIndex = i; - RHandPoly.filter.groupIndex = i; -} - -void BipedDef::SetLinearDamping(float f) -{ - LFootDef.linearDamping = f; - RFootDef.linearDamping = f; - LCalfDef.linearDamping = f; - RCalfDef.linearDamping = f; - LThighDef.linearDamping = f; - RThighDef.linearDamping = f; - PelvisDef.linearDamping = f; - StomachDef.linearDamping = f; - ChestDef.linearDamping = f; - NeckDef.linearDamping = f; - HeadDef.linearDamping = f; - LUpperArmDef.linearDamping = f; - RUpperArmDef.linearDamping = f; - LForearmDef.linearDamping = f; - RForearmDef.linearDamping = f; - LHandDef.linearDamping = f; - RHandDef.linearDamping = f; -} - -void BipedDef::SetAngularDamping(float f) -{ - LFootDef.angularDamping = f; - RFootDef.angularDamping = f; - LCalfDef.angularDamping = f; - RCalfDef.angularDamping = f; - LThighDef.angularDamping = f; - RThighDef.angularDamping = f; - PelvisDef.angularDamping = f; - StomachDef.angularDamping = f; - ChestDef.angularDamping = f; - NeckDef.angularDamping = f; - HeadDef.angularDamping = f; - LUpperArmDef.angularDamping = f; - RUpperArmDef.angularDamping = f; - LForearmDef.angularDamping = f; - RForearmDef.angularDamping = f; - LHandDef.angularDamping = f; - RHandDef.angularDamping = f; -} - -void BipedDef::SetMotorTorque(float f) -{ - LAnkleDef.maxMotorTorque = f; - RAnkleDef.maxMotorTorque = f; - LKneeDef.maxMotorTorque = f; - RKneeDef.maxMotorTorque = f; - LHipDef.maxMotorTorque = f; - RHipDef.maxMotorTorque = f; - LowerAbsDef.maxMotorTorque = f; - UpperAbsDef.maxMotorTorque = f; - LowerNeckDef.maxMotorTorque = f; - UpperNeckDef.maxMotorTorque = f; - LShoulderDef.maxMotorTorque = f; - RShoulderDef.maxMotorTorque = f; - LElbowDef.maxMotorTorque = f; - RElbowDef.maxMotorTorque = f; - LWristDef.maxMotorTorque = f; - RWristDef.maxMotorTorque = f; -} - -void BipedDef::SetMotorSpeed(float f) -{ - LAnkleDef.motorSpeed = f; - RAnkleDef.motorSpeed = f; - LKneeDef.motorSpeed = f; - RKneeDef.motorSpeed = f; - LHipDef.motorSpeed = f; - RHipDef.motorSpeed = f; - LowerAbsDef.motorSpeed = f; - UpperAbsDef.motorSpeed = f; - LowerNeckDef.motorSpeed = f; - UpperNeckDef.motorSpeed = f; - LShoulderDef.motorSpeed = f; - RShoulderDef.motorSpeed = f; - LElbowDef.motorSpeed = f; - RElbowDef.motorSpeed = f; - LWristDef.motorSpeed = f; - RWristDef.motorSpeed = f; -} - -void BipedDef::SetDensity(float f) -{ - LFootPoly.density = f; - RFootPoly.density = f; - LCalfPoly.density = f; - RCalfPoly.density = f; - LThighPoly.density = f; - RThighPoly.density = f; - PelvisPoly.density = f; - StomachPoly.density = f; - ChestPoly.density = f; - NeckPoly.density = f; - HeadCirc.density = f; - LUpperArmPoly.density = f; - RUpperArmPoly.density = f; - LForearmPoly.density = f; - RForearmPoly.density = f; - LHandPoly.density = f; - RHandPoly.density = f; -} - -void BipedDef::SetRestitution(float f) -{ - LFootPoly.restitution = f; - RFootPoly.restitution = f; - LCalfPoly.restitution = f; - RCalfPoly.restitution = f; - LThighPoly.restitution = f; - RThighPoly.restitution = f; - PelvisPoly.restitution = f; - StomachPoly.restitution = f; - ChestPoly.restitution = f; - NeckPoly.restitution = f; - HeadCirc.restitution = f; - LUpperArmPoly.restitution = f; - RUpperArmPoly.restitution = f; - LForearmPoly.restitution = f; - RForearmPoly.restitution = f; - LHandPoly.restitution = f; - RHandPoly.restitution = f; -} - -void BipedDef::EnableLimit() -{ - SetLimit(true); -} - -void BipedDef::DisableLimit() -{ - SetLimit(false); -} - -void BipedDef::SetLimit(bool b) -{ - LAnkleDef.enableLimit = b; - RAnkleDef.enableLimit = b; - LKneeDef.enableLimit = b; - RKneeDef.enableLimit = b; - LHipDef.enableLimit = b; - RHipDef.enableLimit = b; - LowerAbsDef.enableLimit = b; - UpperAbsDef.enableLimit = b; - LowerNeckDef.enableLimit = b; - UpperNeckDef.enableLimit = b; - LShoulderDef.enableLimit = b; - RShoulderDef.enableLimit = b; - LElbowDef.enableLimit = b; - RElbowDef.enableLimit = b; - LWristDef.enableLimit = b; - RWristDef.enableLimit = b; -} - -void BipedDef::EnableMotor() -{ - SetMotor(true); -} - -void BipedDef::DisableMotor() -{ - SetMotor(false); -} - -void BipedDef::SetMotor(bool b) -{ - LAnkleDef.enableMotor = b; - RAnkleDef.enableMotor = b; - LKneeDef.enableMotor = b; - RKneeDef.enableMotor = b; - LHipDef.enableMotor = b; - RHipDef.enableMotor = b; - LowerAbsDef.enableMotor = b; - UpperAbsDef.enableMotor = b; - LowerNeckDef.enableMotor = b; - UpperNeckDef.enableMotor = b; - LShoulderDef.enableMotor = b; - RShoulderDef.enableMotor = b; - LElbowDef.enableMotor = b; - RElbowDef.enableMotor = b; - LWristDef.enableMotor = b; - RWristDef.enableMotor = b; -} - -BipedDef::~BipedDef(void) -{ -} - -void BipedDef::DefaultVertices() -{ - { // feet - LFootPoly.vertexCount = RFootPoly.vertexCount = 5; - LFootPoly.vertices[0] = RFootPoly.vertices[0] = k_scale * b2Vec2(.033f,.143f); - LFootPoly.vertices[1] = RFootPoly.vertices[1] = k_scale * b2Vec2(.023f,.033f); - LFootPoly.vertices[2] = RFootPoly.vertices[2] = k_scale * b2Vec2(.267f,.035f); - LFootPoly.vertices[3] = RFootPoly.vertices[3] = k_scale * b2Vec2(.265f,.065f); - LFootPoly.vertices[4] = RFootPoly.vertices[4] = k_scale * b2Vec2(.117f,.143f); - } - { // calves - LCalfPoly.vertexCount = RCalfPoly.vertexCount = 4; - LCalfPoly.vertices[0] = RCalfPoly.vertices[0] = k_scale * b2Vec2(.089f,.016f); - LCalfPoly.vertices[1] = RCalfPoly.vertices[1] = k_scale * b2Vec2(.178f,.016f); - LCalfPoly.vertices[2] = RCalfPoly.vertices[2] = k_scale * b2Vec2(.205f,.417f); - LCalfPoly.vertices[3] = RCalfPoly.vertices[3] = k_scale * b2Vec2(.095f,.417f); - } - { // thighs - LThighPoly.vertexCount = RThighPoly.vertexCount = 4; - LThighPoly.vertices[0] = RThighPoly.vertices[0] = k_scale * b2Vec2(.137f,.032f); - LThighPoly.vertices[1] = RThighPoly.vertices[1] = k_scale * b2Vec2(.243f,.032f); - LThighPoly.vertices[2] = RThighPoly.vertices[2] = k_scale * b2Vec2(.318f,.343f); - LThighPoly.vertices[3] = RThighPoly.vertices[3] = k_scale * b2Vec2(.142f,.343f); - } - { // pelvis - PelvisPoly.vertexCount = 5; - PelvisPoly.vertices[0] = k_scale * b2Vec2(.105f,.051f); - PelvisPoly.vertices[1] = k_scale * b2Vec2(.277f,.053f); - PelvisPoly.vertices[2] = k_scale * b2Vec2(.320f,.233f); - PelvisPoly.vertices[3] = k_scale * b2Vec2(.112f,.233f); - PelvisPoly.vertices[4] = k_scale * b2Vec2(.067f,.152f); - } - { // stomach - StomachPoly.vertexCount = 4; - StomachPoly.vertices[0] = k_scale * b2Vec2(.088f,.043f); - StomachPoly.vertices[1] = k_scale * b2Vec2(.284f,.043f); - StomachPoly.vertices[2] = k_scale * b2Vec2(.295f,.231f); - StomachPoly.vertices[3] = k_scale * b2Vec2(.100f,.231f); - } - { // chest - ChestPoly.vertexCount = 4; - ChestPoly.vertices[0] = k_scale * b2Vec2(.091f,.042f); - ChestPoly.vertices[1] = k_scale * b2Vec2(.283f,.042f); - ChestPoly.vertices[2] = k_scale * b2Vec2(.177f,.289f); - ChestPoly.vertices[3] = k_scale * b2Vec2(.065f,.289f); - } - { // head - HeadCirc.radius = k_scale * .115f; - } - { // neck - NeckPoly.vertexCount = 4; - NeckPoly.vertices[0] = k_scale * b2Vec2(.038f,.054f); - NeckPoly.vertices[1] = k_scale * b2Vec2(.149f,.054f); - NeckPoly.vertices[2] = k_scale * b2Vec2(.154f,.102f); - NeckPoly.vertices[3] = k_scale * b2Vec2(.054f,.113f); - } - { // upper arms - LUpperArmPoly.vertexCount = RUpperArmPoly.vertexCount = 5; - LUpperArmPoly.vertices[0] = RUpperArmPoly.vertices[0] = k_scale * b2Vec2(.092f,.059f); - LUpperArmPoly.vertices[1] = RUpperArmPoly.vertices[1] = k_scale * b2Vec2(.159f,.059f); - LUpperArmPoly.vertices[2] = RUpperArmPoly.vertices[2] = k_scale * b2Vec2(.169f,.335f); - LUpperArmPoly.vertices[3] = RUpperArmPoly.vertices[3] = k_scale * b2Vec2(.078f,.335f); - LUpperArmPoly.vertices[4] = RUpperArmPoly.vertices[4] = k_scale * b2Vec2(.064f,.248f); - } - { // forearms - LForearmPoly.vertexCount = RForearmPoly.vertexCount = 4; - LForearmPoly.vertices[0] = RForearmPoly.vertices[0] = k_scale * b2Vec2(.082f,.054f); - LForearmPoly.vertices[1] = RForearmPoly.vertices[1] = k_scale * b2Vec2(.138f,.054f); - LForearmPoly.vertices[2] = RForearmPoly.vertices[2] = k_scale * b2Vec2(.149f,.296f); - LForearmPoly.vertices[3] = RForearmPoly.vertices[3] = k_scale * b2Vec2(.088f,.296f); - } - { // hands - LHandPoly.vertexCount = RHandPoly.vertexCount = 5; - LHandPoly.vertices[0] = RHandPoly.vertices[0] = k_scale * b2Vec2(.066f,.031f); - LHandPoly.vertices[1] = RHandPoly.vertices[1] = k_scale * b2Vec2(.123f,.020f); - LHandPoly.vertices[2] = RHandPoly.vertices[2] = k_scale * b2Vec2(.160f,.127f); - LHandPoly.vertices[3] = RHandPoly.vertices[3] = k_scale * b2Vec2(.127f,.178f); - LHandPoly.vertices[4] = RHandPoly.vertices[4] = k_scale * b2Vec2(.074f,.178f);; - } -} - -void BipedDef::DefaultJoints() -{ - //b.LAnkleDef.body1 = LFoot; - //b.LAnkleDef.body2 = LCalf; - //b.RAnkleDef.body1 = RFoot; - //b.RAnkleDef.body2 = RCalf; - { // ankles - b2Vec2 anchor = k_scale * b2Vec2(-.045f,-.75f); - LAnkleDef.localAnchor1 = RAnkleDef.localAnchor1 = anchor - LFootDef.position; - LAnkleDef.localAnchor2 = RAnkleDef.localAnchor2 = anchor - LCalfDef.position; - LAnkleDef.referenceAngle = RAnkleDef.referenceAngle = 0.0f; - LAnkleDef.lowerAngle = RAnkleDef.lowerAngle = -0.523598776f; - LAnkleDef.upperAngle = RAnkleDef.upperAngle = 0.523598776f; - } - - //b.LKneeDef.body1 = LCalf; - //b.LKneeDef.body2 = LThigh; - //b.RKneeDef.body1 = RCalf; - //b.RKneeDef.body2 = RThigh; - { // knees - b2Vec2 anchor = k_scale * b2Vec2(-.030f,-.355f); - LKneeDef.localAnchor1 = RKneeDef.localAnchor1 = anchor - LCalfDef.position; - LKneeDef.localAnchor2 = RKneeDef.localAnchor2 = anchor - LThighDef.position; - LKneeDef.referenceAngle = RKneeDef.referenceAngle = 0.0f; - LKneeDef.lowerAngle = RKneeDef.lowerAngle = 0; - LKneeDef.upperAngle = RKneeDef.upperAngle = 2.61799388f; - } - - //b.LHipDef.body1 = LThigh; - //b.LHipDef.body2 = Pelvis; - //b.RHipDef.body1 = RThigh; - //b.RHipDef.body2 = Pelvis; - { // hips - b2Vec2 anchor = k_scale * b2Vec2(.005f,-.045f); - LHipDef.localAnchor1 = RHipDef.localAnchor1 = anchor - LThighDef.position; - LHipDef.localAnchor2 = RHipDef.localAnchor2 = anchor - PelvisDef.position; - LHipDef.referenceAngle = RHipDef.referenceAngle = 0.0f; - LHipDef.lowerAngle = RHipDef.lowerAngle = -2.26892803f; - LHipDef.upperAngle = RHipDef.upperAngle = 0; - } - - //b.LowerAbsDef.body1 = Pelvis; - //b.LowerAbsDef.body2 = Stomach; - { // lower abs - b2Vec2 anchor = k_scale * b2Vec2(.035f,.135f); - LowerAbsDef.localAnchor1 = anchor - PelvisDef.position; - LowerAbsDef.localAnchor2 = anchor - StomachDef.position; - LowerAbsDef.referenceAngle = 0.0f; - LowerAbsDef.lowerAngle = -0.523598776f; - LowerAbsDef.upperAngle = 0.523598776f; - } - - //b.UpperAbsDef.body1 = Stomach; - //b.UpperAbsDef.body2 = Chest; - { // upper abs - b2Vec2 anchor = k_scale * b2Vec2(.045f,.320f); - UpperAbsDef.localAnchor1 = anchor - StomachDef.position; - UpperAbsDef.localAnchor2 = anchor - ChestDef.position; - UpperAbsDef.referenceAngle = 0.0f; - UpperAbsDef.lowerAngle = -0.523598776f; - UpperAbsDef.upperAngle = 0.174532925f; - } - - //b.LowerNeckDef.body1 = Chest; - //b.LowerNeckDef.body2 = Neck; - { // lower neck - b2Vec2 anchor = k_scale * b2Vec2(-.015f,.575f); - LowerNeckDef.localAnchor1 = anchor - ChestDef.position; - LowerNeckDef.localAnchor2 = anchor - NeckDef.position; - LowerNeckDef.referenceAngle = 0.0f; - LowerNeckDef.lowerAngle = -0.174532925f; - LowerNeckDef.upperAngle = 0.174532925f; - } - - //b.UpperNeckDef.body1 = Chest; - //b.UpperNeckDef.body2 = Head; - { // upper neck - b2Vec2 anchor = k_scale * b2Vec2(-.005f,.630f); - UpperNeckDef.localAnchor1 = anchor - ChestDef.position; - UpperNeckDef.localAnchor2 = anchor - HeadDef.position; - UpperNeckDef.referenceAngle = 0.0f; - UpperNeckDef.lowerAngle = -0.610865238f; - UpperNeckDef.upperAngle = 0.785398163f; - } - - //b.LShoulderDef.body1 = Chest; - //b.LShoulderDef.body2 = LUpperArm; - //b.RShoulderDef.body1 = Chest; - //b.RShoulderDef.body2 = RUpperArm; - { // shoulders - b2Vec2 anchor = k_scale * b2Vec2(-.015f,.545f); - LShoulderDef.localAnchor1 = RShoulderDef.localAnchor1 = anchor - ChestDef.position; - LShoulderDef.localAnchor2 = RShoulderDef.localAnchor2 = anchor - LUpperArmDef.position; - LShoulderDef.referenceAngle = RShoulderDef.referenceAngle = 0.0f; - LShoulderDef.lowerAngle = RShoulderDef.lowerAngle = -1.04719755f; - LShoulderDef.upperAngle = RShoulderDef.upperAngle = 3.14159265f; - } - - //b.LElbowDef.body1 = LForearm; - //b.LElbowDef.body2 = LUpperArm; - //b.RElbowDef.body1 = RForearm; - //b.RElbowDef.body2 = RUpperArm; - { // elbows - b2Vec2 anchor = k_scale * b2Vec2(-.005f,.290f); - LElbowDef.localAnchor1 = RElbowDef.localAnchor1 = anchor - LForearmDef.position; - LElbowDef.localAnchor2 = RElbowDef.localAnchor2 = anchor - LUpperArmDef.position; - LElbowDef.referenceAngle = RElbowDef.referenceAngle = 0.0f; - LElbowDef.lowerAngle = RElbowDef.lowerAngle = -2.7925268f; - LElbowDef.upperAngle = RElbowDef.upperAngle = 0; - } - - //b.LWristDef.body1 = LHand; - //b.LWristDef.body2 = LForearm; - //b.RWristDef.body1 = RHand; - //b.RWristDef.body2 = RForearm; - { // wrists - b2Vec2 anchor = k_scale * b2Vec2(-.010f,.045f); - LWristDef.localAnchor1 = RWristDef.localAnchor1 = anchor - LHandDef.position; - LWristDef.localAnchor2 = RWristDef.localAnchor2 = anchor - LForearmDef.position; - LWristDef.referenceAngle = RWristDef.referenceAngle = 0.0f; - LWristDef.lowerAngle = RWristDef.lowerAngle = -0.174532925f; - LWristDef.upperAngle = RWristDef.upperAngle = 0.174532925f; - } -} - -void BipedDef::DefaultPositions() -{ - LFootDef.position = RFootDef.position = k_scale * b2Vec2(-.122f,-.901f); - LCalfDef.position = RCalfDef.position = k_scale * b2Vec2(-.177f,-.771f); - LThighDef.position = RThighDef.position = k_scale * b2Vec2(-.217f,-.391f); - LUpperArmDef.position = RUpperArmDef.position = k_scale * b2Vec2(-.127f,.228f); - LForearmDef.position = RForearmDef.position = k_scale * b2Vec2(-.117f,-.011f); - LHandDef.position = RHandDef.position = k_scale * b2Vec2(-.112f,-.136f); - PelvisDef.position = k_scale * b2Vec2(-.177f,-.101f); - StomachDef.position = k_scale * b2Vec2(-.142f,.088f); - ChestDef.position = k_scale * b2Vec2(-.132f,.282f); - NeckDef.position = k_scale * b2Vec2(-.102f,.518f); - HeadDef.position = k_scale * b2Vec2(.022f,.738f); -} - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.h deleted file mode 100644 index 704e6890c..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedDef.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef BIPED_DEF_H -#define BIPED_DEF_H - -#include "Box2D.h" - -class BipedDef -{ -public: - BipedDef(); - ~BipedDef(void); - - void SetMotorTorque(float); - void SetMotorSpeed(float); - void SetDensity(float); - void SetFriction(float); - void SetRestitution(float); - void SetLinearDamping(float); - void SetAngularDamping(float); - void EnableLimit(); - void DisableLimit(); - void SetLimit(bool); - void EnableMotor(); - void DisableMotor(); - void SetMotor(bool); - void SetGroupIndex(int16); - void SetPosition(float, float); - void SetPosition(b2Vec2); - void IsFast(bool); - - static int16 count; - - b2BodyDef LFootDef, RFootDef, LCalfDef, RCalfDef, LThighDef, RThighDef, - PelvisDef, StomachDef, ChestDef, NeckDef, HeadDef, - LUpperArmDef, RUpperArmDef, LForearmDef, RForearmDef, LHandDef, RHandDef; - - b2PolygonDef LFootPoly, RFootPoly, LCalfPoly, RCalfPoly, LThighPoly, RThighPoly, - PelvisPoly, StomachPoly, ChestPoly, NeckPoly, - LUpperArmPoly, RUpperArmPoly, LForearmPoly, RForearmPoly, LHandPoly, RHandPoly; - - b2CircleDef HeadCirc; - - b2RevoluteJointDef LAnkleDef, RAnkleDef, LKneeDef, RKneeDef, LHipDef, RHipDef, - LowerAbsDef, UpperAbsDef, LowerNeckDef, UpperNeckDef, - LShoulderDef, RShoulderDef, LElbowDef, RElbowDef, LWristDef, RWristDef; - - void DefaultVertices(); - void DefaultPositions(); - void DefaultJoints(); -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedTest.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedTest.h deleted file mode 100644 index 0d541abc9..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BipedTest.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BIPED_TEST_H -#define BIPED_TEST_H - -#include "Biped.h" - -class BipedTest : public Test -{ -public: - - BipedTest() - { - const float32 k_restitution = 1.4f; - - { - b2BodyDef bd; - bd.position.Set(0.0f, 20.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonDef sd; - sd.density = 0.0f; - sd.restitution = k_restitution; - - sd.SetAsBox(0.1f, 10.0f, b2Vec2(-10.0f, 0.0f), 0.0f); - body->CreateFixture(&sd); - - sd.SetAsBox(0.1f, 10.0f, b2Vec2(10.0f, 0.0f), 0.0f); - body->CreateFixture(&sd); - - sd.SetAsBox(0.1f, 10.0f, b2Vec2(0.0f, -10.0f), 0.5f * b2_pi); - body->CreateFixture(&sd); - - sd.SetAsBox(0.1f, 10.0f, b2Vec2(0.0f, 10.0f), -0.5f * b2_pi); - body->CreateFixture(&sd); - } - - m_biped = new Biped(m_world, b2Vec2(0.0f, 20.0f)); - - for (int32 i = 0; i < 8; ++i) - { - b2BodyDef bd; - bd.position.Set(5.0f, 20.0f + i); - bd.isBullet = true; - b2Body* body = m_world->CreateBody(&bd); - body->SetLinearVelocity(b2Vec2(0.0f, -100.0f)); - body->SetAngularVelocity(RandomFloat(-50.0f, 50.0f)); - - b2CircleDef sd; - sd.radius = 0.25f; - sd.density = 15.0f; - sd.restitution = k_restitution; - body->CreateFixture(&sd); - body->SetMassFromShapes(); - } - } - - ~BipedTest() - { - delete m_biped; - } - - static Test* Create() - { - return new BipedTest; - } - - Biped* m_biped; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BreakableBody.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BreakableBody.h deleted file mode 100644 index 42bdd32f2..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/BreakableBody.h +++ /dev/null @@ -1,610 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -/* Testbed example showing deformable and breakable bodies using the soft - * b2DistanceJoint and a small,liteweight triangle mesher. - * 2008-05-09 / nimodo - */ -#ifndef BREAKABLE_BODY_H -#define BREAKABLE_BODY_H - -#include "TriangleMesh.h" - -/// utility macro -#define H(x) (x)/2.0f -#define N_MAXVERTEX 256 - -class BreakableBody : public Test -{ - -public: - BreakableBody() - { - /// geometries - float32 gx = 100.0f, gy = 1.0f, - dx = 34.0f, br = 0.3f; - float32 sx=-dx-H(dx), sy = 30.f; - /// break joint, if the reactionforce exceeds: - maxAllowableForce = 100.0f; - m_drawMode = m_staticBodies = false; - m_drawCount = 0; - /// ground - { - b2PolygonDef sd; - b2BodyDef bd; - b2Body* ground; - bd.position.Set(0.0f, 0.0f); - ground = m_world->CreateBody(&bd); - /// bottom - sd.SetAsBox( H(gx), H(gy) ); - ground->CreateFixture(&sd); - sd.SetAsBox( H(dx), H(gy), b2Vec2(-dx,sy-1.0f), 0.0f ); - ground->CreateFixture(&sd); - } - /// dyn bodies - { - b2PolygonDef pd; - b2DistanceJointDef dj; - - dj.dampingRatio = 0.0f; - dj.collideConnected = true; - - ExampleData('B'); - dj.frequencyHz = 20.f; - pd.density = 1.0f/70.0f; - pd.friction = 0.4f; - pd.restitution = 0.01f; - CreateSoftBody( b2Vec2(sx,sy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - ExampleData('@'); - dj.frequencyHz = 20.f; - pd.density = 1.0f/36.0f; - pd.friction = 0.1f; - pd.restitution = 0.5f; - CreateSoftBody( b2Vec2(sx+6.f,sy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - ExampleData('x'); - dj.frequencyHz = 20.0f; - pd.density = 1.0f/60.0f; - pd.friction = 0.6f; - pd.restitution = 0.0f; - CreateSoftBody( b2Vec2(sx+13.f,sy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - ExampleData('2'); - pd.density = 0.01f; - pd.friction = 0.3f; - pd.restitution = 0.3f; - CreateSoftBody( b2Vec2(sx+20.f,sy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - ExampleData('D'); - CreateSoftBody( b2Vec2(sx+28.f,sy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - ExampleData('b'); - dj.frequencyHz = 10.0f; - dj.dampingRatio = 20.0f; - pd.friction = 0.9f; - pd.restitution = 0.01f; - pd.density = 0.01f; - CreateSoftBody( b2Vec2(-5.f,5.f*gy), 0, 0, pd, dj, - nodes,n_nodes, segments,n_segments, holes,n_holes) ; - - b2CircleDef cd; - b2BodyDef bd; - b2Body* b; - cd.radius = br; - cd.density= 0.001f; - bd.position.Set(0.0f,10.0f*gy); - for (int32 i=0; i<60; i++ ) - { - b = m_world->CreateBody(&bd); - b->CreateFixture (&cd); - b->SetMassFromShapes(); - } - - } - } - - /// Create compound (soft) body using a triangle mesh - /// If meshDensity is 0, a minimal grid is generated. - /// Actually pd and dj define the behaviour for all triangles - void CreateSoftBody(b2Vec2 pos, int32 meshDensity,int32 options, - b2PolygonDef pd, b2DistanceJointDef dj, - tmVertex* nodes,int32 n_nodes, - tmSegmentId *segments=NULL, int32 n_segments=0, - tmVertex* holes=NULL, int32 n_holes=0) - { - int32 i; - /// TriangleMesh defs - tmTriangle *triangles; - TriangleMesh md; - /// box2d defs - b2BodyDef bd; - b2Body *b; - /// in case of meshDensit>3 ... - md.SetMaxVertexCount(meshDensity); - if (options>0) md.SetOptions(options); - /// triangulator main - md.Mesh( nodes, n_nodes, segments,n_segments, holes, n_holes ); - md.PrintData(); - /// bodies (triangles) - triangles = md.GetTriangles(); - if ( triangles==NULL ) return; - pd.vertexCount = 3; - for ( i=0; i b2PolygonDef - pd.vertices[0].Set(triangles[i].v[0]->x, triangles[i].v[0]->y); - pd.vertices[1].Set(triangles[i].v[1]->x, triangles[i].v[1]->y); - pd.vertices[2].Set(triangles[i].v[2]->x, triangles[i].v[2]->y); - bd.position.Set(pos.x,pos.y); - b = m_world->CreateBody(&bd); - b->CreateFixture(&pd); - b->SetMassFromShapes(); - /// we need the body pointer in the triangles for the joints later - triangles[i].userData = (void *)b; - } - } - /// joints - /// for each triangle-pair in edges, connect with a distance joint - tmEdge *edges; - tmTriangle *t0,*t1; - b2Body *b1,*b2; - edges = md.GetEdges(); - for ( i=0; iinside==false) || (t1->inside==false) ) continue; - - /// Get bodies - b1 = (b2Body*)t0->userData; - b2 = (b2Body*)t1->userData; - if ( b1==NULL || b2==NULL ) continue; - - dj.Initialize( b1,b2, b1->GetWorldCenter(), b2->GetWorldCenter()); - m_world->CreateJoint(&dj); - } - /// clean TriangleMesh - md.FreeMemory(); - } - - /// maybe here to check for maximal reaction forces to break a body - void Step(Settings* settings) - { - b2Joint *jStressed=NULL; - float32 F=0.0f, tmp; - - Test::Step(settings); - - for (b2Joint* j = m_world->GetJointList(); j; j = j->GetNext()) - { - tmp = j->GetReactionForce(settings->hz).Length(); - if ( tmp>F ) - { - F = tmp; - jStressed = j; - } - } - if ( jStressed && (F>maxAllowableForce) ) - { - m_world->DestroyJoint(jStressed); - } - - m_debugDraw.DrawString(1, m_textLine,"max.reactionforce=%.0f allowable=%.0f change:-+", (float)F,(float)maxAllowableForce); - m_textLine += 12; - - m_debugDraw.DrawString(1, m_textLine,"drawmode(%s):d mesh:m static(%s):s", (m_drawMode)?"on":"off", (m_staticBodies)?"on":"off"); - m_textLine += 12; - - for ( int32 i=0; i0 ) - { - b2PolygonDef pd; - b2DistanceJointDef dj; - dj.collideConnected = true; - dj.frequencyHz = 20.f; - dj.dampingRatio = 10.0f; - pd.density = (m_staticBodies) ? 0.0f : 1.0f/32.0f; - pd.friction = 0.99f; - pd.restitution = 0.01f; - CreateSoftBody( b2Vec2(0.0f,0.0f), 0, tmO_SEGMENTBOUNDARY|tmO_GRADING, - pd, dj, m_drawVertices, m_drawCount) ; - - m_drawCount = 0; - m_drawMode = false; - } - break; - } - } - - void MouseDown(const b2Vec2& p) - { - if ( m_drawMode && (m_drawCountCreateBody(&bd); - m_vehicle->CreateFixture(&poly1); - m_vehicle->CreateFixture(&poly2); - m_vehicle->SetMassFromShapes(); - } - - { // vehicle wheels - b2CircleDef circ; - circ.density = 40.0f; - circ.radius = 0.38608f; - circ.friction = 0.8f; - circ.filter.groupIndex = -1; - - b2BodyDef bd; - bd.allowSleep = false; - bd.position.Set(-33.8f, 2.0f); - - m_rightWheel = m_world->CreateBody(&bd); - m_rightWheel->CreateFixture(&circ); - m_rightWheel->SetMassFromShapes(); - - bd.position.Set(-36.2f, 2.0f); - m_leftWheel = m_world->CreateBody(&bd); - m_leftWheel->CreateFixture(&circ); - m_leftWheel->SetMassFromShapes(); - } - - { // join wheels to chassis - b2Vec2 anchor; - b2RevoluteJointDef jd; - jd.Initialize(m_vehicle, m_leftWheel, m_leftWheel->GetWorldCenter()); - jd.collideConnected = false; - jd.enableMotor = true; - jd.maxMotorTorque = 10.0f; - jd.motorSpeed = 0.0f; - m_leftJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - - jd.Initialize(m_vehicle, m_rightWheel, m_rightWheel->GetWorldCenter()); - jd.collideConnected = false; - m_rightJoint = (b2RevoluteJoint*)m_world->CreateJoint(&jd); - } - - { // ground - b2PolygonDef box; - box.SetAsBox(19.5f, 0.5f); - box.friction = 0.62f; - - b2BodyDef bd; - bd.position.Set(-25.0f, 1.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - - { // more ground - b2PolygonDef box; - b2BodyDef bd; - - box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, 0.1f * b2_pi); - box.friction = 0.62f; - bd.position.Set(27.0f - 30.0f, 3.1f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - - { // more ground - b2PolygonDef box; - b2BodyDef bd; - - box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, -0.1f * b2_pi); - box.friction = 0.62f; - bd.position.Set(55.0f - 30.0f, 3.1f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - - { // more ground - b2PolygonDef box; - b2BodyDef bd; - - box.SetAsBox(9.5f, 0.5f, b2Vec2_zero, 0.03f * b2_pi); - box.friction = 0.62f; - bd.position.Set(41.0f, 2.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - - { // more ground - b2PolygonDef box; - b2BodyDef bd; - - box.SetAsBox(5.0f, 0.5f, b2Vec2_zero, 0.15f * b2_pi); - box.friction = 0.62f; - bd.position.Set(50.0f, 4.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - - { // more ground - b2PolygonDef box; - b2BodyDef bd; - - box.SetAsBox(20.0f, 0.5f); - box.friction = 0.62f; - bd.position.Set(85.0f, 2.0f); - - b2Body* ground = m_world->CreateBody(&bd); - ground->CreateFixture(&box); - } - } - - void Step(Settings* settings) - { - m_debugDraw.DrawString(5, m_textLine, "Keys: left = a, brake = s, right = d"); - m_textLine += 15; - - Test::Step(settings); - } - - void Keyboard(unsigned char key) - { - switch (key) - { - case 'a': - m_leftJoint->SetMaxMotorTorque(800.0f); - m_leftJoint->SetMotorSpeed(12.0f); - break; - - case 's': - m_leftJoint->SetMaxMotorTorque(100.0f); - m_leftJoint->SetMotorSpeed(0.0f); - break; - - case 'd': - m_leftJoint->SetMaxMotorTorque(1200.0f); - m_leftJoint->SetMotorSpeed(-36.0f); - break; - } - } - - static Test* Create() - { - return new Car; - } - - b2Body* m_leftWheel; - b2Body* m_rightWheel; - b2Body* m_vehicle; - b2RevoluteJoint* m_leftJoint; - b2RevoluteJoint* m_rightJoint; -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ContactCallbackTest.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ContactCallbackTest.h deleted file mode 100644 index 1e29e3019..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ContactCallbackTest.h +++ /dev/null @@ -1,267 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -// Contributed by caspin. - -#ifndef CONTACT_CB_H -#define CONTACT_CB_H - -#include -#include -#include -#include -#include - -bool key_comp( const ContactPoint& lhs, const ContactPoint& rhs ) -{ - if( lhs.fixtureA < rhs.fixtureA ) return true; - if( lhs.fixtureA == rhs.fixtureA && lhs.fixtureB < rhs.fixtureB ) return true; - if( lhs.fixtureA == rhs.fixtureA && lhs.fixtureB == rhs.fixtureB && lhs.id.key < rhs.id.key ) return true; - return false; -} - -class ContactCB : public Test -{ -public: - - ContactCB() - : m_set(&key_comp) - { - b2PolygonDef sd; - sd.friction = 0; - sd.vertexCount = 3; - - sd.vertices[0].Set(10,10); - sd.vertices[1].Set(9,7); - sd.vertices[2].Set(10,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(9,7); - sd.vertices[1].Set(8,0); - sd.vertices[2].Set(10,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(9,7); - sd.vertices[1].Set(8,5); - sd.vertices[2].Set(8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(8,5); - sd.vertices[1].Set(7,4); - sd.vertices[2].Set(8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(7,4); - sd.vertices[1].Set(5,0); - sd.vertices[2].Set(8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(7,4); - sd.vertices[1].Set(5,3); - sd.vertices[2].Set(5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(5,3); - sd.vertices[1].Set(2,2); - sd.vertices[2].Set(5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(2,2); - sd.vertices[1].Set(0,0); - sd.vertices[2].Set(5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[0].Set(2,2); - sd.vertices[1].Set(-2,2); - sd.vertices[2].Set(0,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-2,2); - sd.vertices[1].Set(0,0); - sd.vertices[0].Set(-5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-5,3); - sd.vertices[1].Set(-2,2); - sd.vertices[0].Set(-5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-7,4); - sd.vertices[1].Set(-5,3); - sd.vertices[0].Set(-5,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-7,4); - sd.vertices[1].Set(-5,0); - sd.vertices[0].Set(-8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-8,5); - sd.vertices[1].Set(-7,4); - sd.vertices[0].Set(-8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-9,7); - sd.vertices[1].Set(-8,5); - sd.vertices[0].Set(-8,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-9,7); - sd.vertices[1].Set(-8,0); - sd.vertices[0].Set(-10,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.vertices[2].Set(-10,10); - sd.vertices[1].Set(-9,7); - sd.vertices[0].Set(-10,0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.SetAsBox(.5,6,b2Vec2(10.5,6),0); - m_world->GetGroundBody()->CreateFixture(&sd); - - sd.SetAsBox(.5,6,b2Vec2(-10.5,6),0); - m_world->GetGroundBody()->CreateFixture(&sd); - - b2BodyDef bd; - bd.position.Set(9.5,60); - b2Body* m_ball = m_world->CreateBody( &bd ); - -#if 1 - b2PolygonDef cd; - cd.vertexCount = 8; - float32 w = 0.95f; - float32 b = w / (2.0f + sqrtf(2.0f)); - float32 s = sqrtf(2.0f) * b; - cd.vertices[0].Set(0.5f * s, 0.0f); - cd.vertices[1].Set(0.5f * w, b); - cd.vertices[2].Set(0.5f * w, b + s); - cd.vertices[3].Set(0.5f * s, w); - cd.vertices[4].Set(-0.5f * s, w); - cd.vertices[5].Set(-0.5f * w, b + s); - cd.vertices[6].Set(-0.5f * w, b); - cd.vertices[7].Set(-0.5f * s, 0.0f); - cd.density = 1.0f; -#else - b2CircleDef cd; - cd.radius = 0.33f; - cd.friction = 0; - cd.density = 1; -#endif - - m_ball_shape = m_ball->CreateFixture(&cd); - m_ball->SetMassFromShapes(); - } - - void Step(Settings* settings) - { - Test::Step(settings); - std::ostringstream oss; - oss << std::hex; - - for (int32 i=0; i< m_pointCount; ++i) - { -#if 0 - if (m_points[i].shape1 > m_points[i].shape2) - { - b2Swap(m_points[i].shape1, m_points[i].shape2); - m_points[i].normal *= -1.0f; - m_points[i].velocity *= -1.0f; - } -#endif - oss.str(""); - switch( m_points[i].state ) - { - case e_contactAdded: - { - if( ! m_set.insert( m_points[i] ).second ) - { - oss << "ERROR "; - } - else - { - oss << " "; - } - oss << "added: " << m_points[i].fixtureA << " -> " << m_points[i].fixtureB; - oss << " : " << m_points[i].id.key; - m_strings.push_back( oss.str() ); - std::cout << oss.str() << std::endl; - break; - } - case e_contactRemoved: - { - if( m_set.find( m_points[i] ) == m_set.end() ) - { - oss << "ERROR "; - } - else - { - oss << " "; - } - oss << "removed: " << m_points[i].fixtureA << " -> " << m_points[i].fixtureB; - oss << " : " << m_points[i].id.key; - m_strings.push_back( oss.str() ); - std::cout << oss.str() << std::endl; - m_set.erase( m_points[i] ); - break; - } - case e_contactPersisted: - { - if( m_set.find( m_points[i] ) == m_set.end() ) - { - oss << "ERROR persist: " << m_points[i].fixtureA << " -> "; - oss << m_points[i].fixtureB << " : " << m_points[i].id.key; - m_strings.push_back( oss.str() ); - std::cout << oss.str() << std::endl; - } - break; - } - } - } - while( m_strings.size() > 15 ) - { - m_strings.pop_front(); - } - - for( unsigned i=0; i m_set; - std::deque m_strings; - -}; - -#endif // CONTACT_CB_H - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/DynamicEdges.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/DynamicEdges.h deleted file mode 100644 index a80f39332..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/DynamicEdges.h +++ /dev/null @@ -1,301 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef DYNAMIC_EDGES_H -#define DYNAMIC_EDGES_H - -class DynamicEdges : public Test -{ -public: - DynamicEdges() - { - { - b2BodyDef bd; - bd.position.Set(0.0f, -10.0f); - b2Body* body = m_world->CreateBody(&bd); - - b2PolygonDef sd; - sd.SetAsBox(50.0f, 10.0f); - body->CreateFixture(&sd); - } - - { - b2CircleDef sd1; - sd1.radius = 0.5f; - sd1.localPosition.Set(-0.5f, 0.5f); - sd1.density = 2.0f; - - b2CircleDef sd2; - sd2.radius = 0.5f; - sd2.localPosition.Set(0.5f, 0.5f); - sd2.density = 0.0f; // massless - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x + 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - b2PolygonDef sd1; - sd1.SetAsBox(0.25f, 0.5f); - sd1.density = 2.0f; - - b2PolygonDef sd2; - sd2.SetAsBox(0.25f, 0.5f, b2Vec2(0.0f, -0.5f), 0.5f * b2_pi); - sd2.density = 2.0f; - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x - 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - b2XForm xf1; - xf1.R.Set(0.3524f * b2_pi); - xf1.position = b2Mul(xf1.R, b2Vec2(1.0f, 0.0f)); - - b2PolygonDef sd1; - sd1.vertexCount = 3; - sd1.vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - sd1.vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - sd1.vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - sd1.density = 2.0f; - - b2XForm xf2; - xf2.R.Set(-0.3524f * b2_pi); - xf2.position = b2Mul(xf2.R, b2Vec2(-1.0f, 0.0f)); - - b2PolygonDef sd2; - sd2.vertexCount = 3; - sd2.vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - sd2.vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - sd2.vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - sd2.density = 2.0f; - - for (int32 i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x, 2.05f + 2.5f * i); - bd.angle = 0.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - b2PolygonDef sd_bottom; - sd_bottom.SetAsBox( 1.5f, 0.15f ); - sd_bottom.density = 4.0f; - - b2PolygonDef sd_left; - sd_left.SetAsBox(0.15f, 2.7f, b2Vec2(-1.45f, 2.35f), 0.2f); - sd_left.density = 4.0f; - - b2PolygonDef sd_right; - sd_right.SetAsBox(0.15f, 2.7f, b2Vec2(1.45f, 2.35f), -0.2f); - sd_right.density = 4.0f; - - b2BodyDef bd; - bd.position.Set( 0.0f, 2.0f ); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd_bottom); - body->CreateFixture(&sd_left); - body->CreateFixture(&sd_right); - body->SetMassFromShapes(); - } - - { - float32 loop1[] = - { - 0.063134534f,8.3695248f, - 0.94701801f,9.3165428f, - 0.0f,9.0640047f, - -0.12626907f,10.326695f, - 1.4520943f,11.77879f, - 2.2728432f,10.137292f, - 2.3991123f,11.147444f, - 3.5986685f,10.958041f, - 3.9143411f,7.3593722f, - 4.1668793f,9.4428119f, - 5.4295699f,9.3165428f, - 6.2503189f,8.3063903f, - 6.6922606f,10.137292f, - 4.9876282f,9.8216191f, - 4.7350901f,10.958041f, - 7.2604714f,11.652521f, - 10.732871f,11.147444f, - 10.480333f,10.642368f, - 10.732871f,9.8216191f, - 11.55362f,9.4428119f, - 12.374369f,9.3796773f, - 13.005714f,9.8216191f, - 13.195118f,10.38983f, - 13.005714f,10.768637f, - 12.626907f,10.894906f, - 12.753176f,11.526252f, - 13.573925f,11.715655f, - 14.836616f,11.399982f, - 16.351844f,10.768637f, - 17.867073f,11.399982f, - 17.803939f,10.263561f, - 17.361997f,8.3063903f, - 17.803939f,8.1801212f, - 18.056477f,9.5059464f, - 18.182746f,11.336848f, - 18.561553f,11.210579f, - 18.561553f,9.6322155f, - 18.561553f,7.7381795f, - 18.687822f,5.5284708f, - 19.382302f,5.6547398f, - 19.066629f,8.1801212f, - 19.003495f,10.263561f, - 19.066629f,11.463117f, - 19.887378f,11.841924f, - 20.708127f,11.273713f, - 21.0238f,10.011023f, - 20.708127f,7.2962377f, - 21.086934f,6.2860852f, - 21.150069f,3.7607038f, - 20.392455f,2.5611476f, - 18.624688f,2.5611476f, - 20.771262f,2.1192059f, - 20.771262f,0.22516988f, - 18.624688f,-0.2799064f, - 13.826463f,0.16203534f, - 14.015867f,1.7403987f, - 13.195118f,2.1823404f, - 12.626907f,1.5509951f, - 12.879445f,0.85651522f, - 12.626907f,0.35143895f, - 10.543467f,1.298457f, - 11.490485f,3.9501074f, - 13.889598f,3.6344347f, - 13.889598f,2.9399549f, - 14.584077f,3.8869729f, - 11.932427f,5.2127981f, - 9.7227183f,4.0132419f, - 10.796005f,3.5081657f, - 9.7858528f,3.2556275f, - 10.796005f,2.4980131f, - 7.9549513f,1.7403987f, - 9.6595837f,1.424726f, - 9.217642f,0.66711162f, - 8.270624f,-0.090502792f, - 7.0079333f,0.85651522f, - 6.1240498f,-0.15363733f, - 6.1240498f,3.192493f, - 5.6821081f,2.4348786f, - 4.9876282f,2.1192059f, - 4.1037447f,1.8666678f, - 3.0304576f,1.8666678f, - 2.0834396f,2.245475f, - 1.6414979f,2.6242822f, - 1.3258252f,3.5081657f, - 1.2626907f,0.47770802f, - 0.63134534f,0.035766276f, - 0.063134534f,0.98278429f - }; - - float32 loop2[] = - { - 8.270624f,6.1598161f, - 8.270624f,5.3390672f, - 8.7757003f,5.086529f, - 9.4701801f,5.5284708f, - 9.217642f,6.033547f, - 8.7757003f,6.4123542f - }; - - b2Vec2 b2Loop1[87]; - b2Vec2 b2Loop2[6]; - - for (int32 i = 86; i >= 0; i--) { - b2Loop1[86 - i].Set(loop1[i*2] + 10.0f, loop1[i*2 + 1] + 1.0f); - } - /*for (int32 i = 0; i < 87; i++) { - b2Loop1[i].Set(loop1[i*2] + 10.0f, loop1[i*2 + 1] + 1.0f); - }*/ - - for (int32 i = 0; i < 6; i++) { - b2Loop2[i].Set(loop2[i*2], loop2[i*2 + 1]); - } - - b2BodyDef bd; - bd.position.Set( 0.0f, 0.0f ); - b2Body* body = m_world->CreateBody(&bd); - - b2CircleDef weight; - weight.filter.maskBits = 0x0000; - weight.density = 4.0f; - weight.radius = 0.5f; - weight.localPosition.Set(8.9f, 5.75f); - body->CreateFixture(&weight); - - b2EdgeChainDef edgeDef; - edgeDef.vertexCount = 6; - edgeDef.vertices = b2Loop2; - b2CreateEdgeChain(body, &edgeDef); - - body->SetMassFromShapes(); - - body = m_world->CreateBody(&bd); - weight.radius = 5.0f; - weight.localPosition.Set(20.5f, 7.0f); - body->CreateFixture(&weight); - - edgeDef.vertexCount = 87; - edgeDef.vertices = b2Loop1; - b2CreateEdgeChain(body, &edgeDef); - - body->SetMassFromShapes(); - } - } - - static Test* Create() - { - return new DynamicEdges; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ElasticBody.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ElasticBody.h deleted file mode 100644 index 26e9796b8..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/ElasticBody.h +++ /dev/null @@ -1,472 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef ELASTIC_BODY_H -#define ELASTIC_BODY_H - -class ElasticBody : public Test -{ -public: - b2Body* bodies[64]; - b2Body* m_ground; - b2Body* m_elev; - b2PrismaticJoint* m_joint_elev; - /// Main... - ElasticBody() - { - /// Bottom static body - { - b2PolygonDef sd; - sd.SetAsBox(50.0f, 2.0f); - sd.friction = 0.1f; - sd.restitution = 0.1f; - b2BodyDef bd; - bd.position.Set(-1.0f, -7.5f); - m_ground = m_world->CreateBody(&bd); - m_ground->CreateFixture(&sd); - } - /// Upper static body - { - b2PolygonDef sd; - sd.SetAsBox(20.0f, 0.50f,b2Vec2(0.f,0.f),0.047f*b2_pi); - sd.friction = 0.01f; - sd.restitution = 0.001f; - b2BodyDef bd; - bd.position.Set(-20.f, 93.0f); - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - sd.SetAsBox(15.f, 0.50f,b2Vec2(-15.0f,12.5f),0.0f); - g->CreateFixture(&sd); - - sd.SetAsBox(20.f,0.5f,b2Vec2(0.0f,-25.0f),-0.5f); - g->CreateFixture(&sd); - } - /// Left channel left wall - { - b2PolygonDef sd; - sd.SetAsBox(0.7f, 55.0f); - sd.friction = 0.1f; - sd.restitution = 0.1f; - b2BodyDef bd; - bd.position.Set(-49.3f, 50.0f); - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - } - /// Right wall - { - b2PolygonDef sd; - sd.SetAsBox(0.7f, 55.0f); - sd.friction = 0.1f; - sd.restitution = 0.1f; - b2BodyDef bd; - bd.position.Set(45.f, 50.0f); - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - } - /// Left channel right upper wall - { - b2PolygonDef sd; - sd.SetAsBox(0.5f, 20.0f); - sd.friction = 0.05f; - sd.restitution = 0.01f; - b2BodyDef bd; - bd.position.Set(-42.0f, 70.0f); - bd.angle = -0.03f*b2_pi; - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - } - /// Left channel right lower wall - { - b2PolygonDef sd; - sd.SetAsBox(0.50f, 23.0f); - sd.friction = 0.05f; - sd.restitution = 0.01f; - b2BodyDef bd; - bd.position.Set(-44.0f, 27.0f); - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - /// Bottom motors - b2CircleDef cd; - cd.radius = 3.0f; - cd.density = 15.0f; - cd.friction = 1.f; - cd.restitution = 0.2f; - /// 1. - bd.position.Set(-40.0f,2.5f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - b2RevoluteJointDef jr; - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - jr.maxMotorTorque = 30000.f; - jr.enableMotor = true; - jr.motorSpeed = 20.f; - m_world->CreateJoint(&jr); - /// 1. left down - bd.position.Set(-46.0f,-2.5f); - cd. radius = 1.5f; jr.motorSpeed = -20.f; - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - sd.SetAsBox(2.0f, 0.50f); - body->CreateFixture(&sd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()); - m_world->CreateJoint(&jr); - /// 2. - cd.radius = 3.0f; jr.motorSpeed = 20.f; - bd.position.Set(-32.0f,2.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 3. - jr.motorSpeed = 20.f; - bd.position.Set(-24.0f,1.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 4. - bd.position.Set(-16.0f,0.8f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 5. - bd.position.Set(-8.0f,0.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 6. - bd.position.Set(0.0f,0.1f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 7. - bd.position.Set(8.0f,-0.5f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&cd); - sd.SetAsBox(3.7f, 0.5f); - body->CreateFixture(&sd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()+b2Vec2(0.f,1.f)); - m_world->CreateJoint(&jr); - /// 8. right rotator - sd.SetAsBox(5.f, 0.5f); - sd.density = 2.0f; - bd.position.Set(18.0f,1.f); - b2Body* rightmotor = m_world->CreateBody(&bd); - rightmotor->CreateFixture(&sd); - sd.SetAsBox(4.5f, 0.5f, b2Vec2(0.f,0.f),b2_pi/3.f); - rightmotor->CreateFixture(&sd); - sd.SetAsBox(4.5f, 0.5f, b2Vec2(0.f,0.f),b2_pi*2.f/3.f); - rightmotor->CreateFixture(&sd); - cd.radius = 4.2f; - rightmotor->CreateFixture(&cd); - rightmotor->SetMassFromShapes(); - jr.Initialize (g,rightmotor,rightmotor->GetWorldCenter()); - jr.maxMotorTorque = 70000.f; - jr.motorSpeed = -4.f; - m_world->CreateJoint(&jr); - /// 9. left rotator - sd.SetAsBox(8.5f, 0.5f); - sd.density = 2.0f; - bd.position.Set(-34.0f,17.f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&sd); - sd.SetAsBox(8.5f, 0.5f, b2Vec2(0.f,0.f),b2_pi*.5f); - body->CreateFixture(&sd); - cd.radius = 7.f; - cd.friction = 0.9f; - body->CreateFixture(&cd); - body->SetMassFromShapes(); - jr.Initialize (g,body,body->GetWorldCenter()); - jr.maxMotorTorque = 100000.f; - jr.motorSpeed = -5.f; - m_world->CreateJoint(&jr); - /// big compressor - sd.SetAsBox(3.0f,4.f); - sd.density = 10.0f; - bd.position.Set(-16.0f,17.f); - b2Body *hammerleft = m_world->CreateBody(&bd); - hammerleft->CreateFixture(&sd); - hammerleft->SetMassFromShapes(); - b2DistanceJointDef jd; - jd.Initialize(body, hammerleft, body->GetWorldCenter()+b2Vec2(0.f,6.f), hammerleft->GetWorldCenter() ); - m_world->CreateJoint(&jd); - - bd.position.Set(4.0f,17.f); - b2Body *hammerright = m_world->CreateBody(&bd); - hammerright->CreateFixture(&sd); - hammerright->SetMassFromShapes(); - jd.Initialize(body, hammerright, body->GetWorldCenter()-b2Vec2(0.f,6.f), hammerright->GetWorldCenter() ); - m_world->CreateJoint(&jd); - /// pusher - sd.SetAsBox(6.f,0.75f); - bd.position.Set(-21.0f,9.f); - b2Body* pusher = m_world->CreateBody(&bd); - pusher->CreateFixture(&sd); - sd.SetAsBox(2.f,1.5f,b2Vec2(-5.f,0.f),0.f); - pusher->SetMassFromShapes(); - pusher->CreateFixture(&sd); - jd.Initialize(rightmotor,pusher,rightmotor->GetWorldCenter()+b2Vec2(-8.0f,0.f), - pusher->GetWorldCenter()+b2Vec2(5.0f,0.f) ); - m_world->CreateJoint(&jd); - } - /// Static bodies above motors - { - b2PolygonDef sd; - b2CircleDef cd; - sd.SetAsBox(9.0f, 0.5f); - sd.friction = 0.05f; - sd.restitution = 0.01f; - b2BodyDef bd; - bd.position.Set(-15.5f, 12.f); - bd.angle = 0.0; - b2Body* g = m_world->CreateBody(&bd); - g->CreateFixture(&sd); - - sd.SetAsBox(8.f, 0.5f, b2Vec2(23.f,0.f),0.f); - g->CreateFixture(&sd); - /// compressor statics - sd.SetAsBox(7.0f, 0.5f, b2Vec2(-2.f,9.f),0.f); - g->CreateFixture(&sd); - sd.SetAsBox(9.0f, 0.5f, b2Vec2(22.f,9.f),0.f); - g->CreateFixture(&sd); - - sd.SetAsBox(19.0f, 0.5f, b2Vec2(-9.f,15.f),-0.05f); - g->CreateFixture(&sd); - sd.SetAsBox(4.7f, 0.5f, b2Vec2(15.f,11.5f),-0.5f); - g->CreateFixture(&sd); - /// below compressor - sd.SetAsBox(26.0f, 0.3f, b2Vec2(17.f,-4.4f),-0.02f); - g->CreateFixture(&sd); - cd.radius = 1.0f; cd.friction = 1.0; - cd.localPosition = b2Vec2(29.f,-6.f); - g->CreateFixture(&cd); - cd.radius = 0.7f; - cd.localPosition = b2Vec2(-2.f,-4.5f); - g->CreateFixture(&cd); - } - /// Elevator - { - b2BodyDef bd; - b2CircleDef cd; - b2PolygonDef sd; - - bd.position.Set(40.0f,4.0f); - m_elev = m_world->CreateBody(&bd); - - sd.SetAsBox(0.5f, 2.5f,b2Vec2(3.0f,-3.0f), 0.f); - sd.density = 1.f; - sd.friction = 0.01f; - m_elev->CreateFixture(&sd); - sd.SetAsBox(7.0f, 0.5f, b2Vec2(-3.5f,-5.5f), 0.f); - m_elev->CreateFixture(&sd); - sd.SetAsBox(0.5f, 2.5f, b2Vec2(-11.f,-3.5f), 0.f); - m_elev->CreateFixture(&sd); - m_elev->SetMassFromShapes(); - - b2PrismaticJointDef jp; - jp.Initialize(m_ground,m_elev, bd.position, b2Vec2(0.0f, 1.0f)); - jp.lowerTranslation = 0.0f; - jp.upperTranslation = 100.0f; - jp.enableLimit = true; - jp.enableMotor = true; - jp.maxMotorForce = 10000.f; - jp.motorSpeed = 0.f; - m_joint_elev = (b2PrismaticJoint*)m_world->CreateJoint(&jp); - - /// Korb - sd.SetAsBox(2.3f, 0.5f,b2Vec2(1.f,0.0f), 0.0f); - sd.density = 0.5f; - bd.position.Set(29.0f,6.5f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd); - sd.SetAsBox(2.5f, 0.5f,b2Vec2(3.0f,-2.f), b2_pi/2.f); - body->CreateFixture(&sd); - sd.SetAsBox(4.6f, 0.5f,b2Vec2(7.8f,-4.0f), 0.f); - body->CreateFixture(&sd); - sd.SetAsBox(0.5f, 4.5f,b2Vec2(12.f,0.0f), 0.f); - body->CreateFixture(&sd); - - sd.SetAsBox(0.5f, 0.5f,b2Vec2(13.f,4.0f), 0.f); - body->CreateFixture(&sd); - - cd.radius = 0.7f; cd.density = 1.f; cd.friction = 0.01f; - cd.localPosition = b2Vec2(0.f,0.f); - body->CreateFixture(&cd); - body->SetMassFromShapes(); - - b2RevoluteJointDef jr; - jr.Initialize(m_elev,body, bd.position); - jr.enableLimit = true; - jr.lowerAngle = -0.2f; - jr.upperAngle = b2_pi*1.1f; - jr.collideConnected = true; - m_world->CreateJoint(&jr); - /// upper body exit - sd.SetAsBox(14.0f, 0.5f,b2Vec2(-3.5f,-10.0f), 0.0f); - bd.position.Set(17.5f,96.0f); - body = m_world->CreateBody(&bd); - body->CreateFixture(&sd); - } - /// "Elastic body" 64 bodies - something like a lin. elastic compound - /// connected via dynamic forces (springs) - { - b2PolygonDef sd; - sd.SetAsBox(0.55f, 0.55f); - sd.density = 1.5f; - sd.friction = 0.01f; - sd.filter.groupIndex = -1; - b2Vec2 startpoint(30.f,20.f); - b2BodyDef bd; - bd.isBullet = false; - bd.allowSleep = false; - for (int i = 0; i < 8; ++i) - { - for (int j = 0; j < 8; ++j) - { - bd.position.Set(j*1.02f, 2.51f + 1.02f * i); - bd.position += startpoint; - b2Body* body = m_world->CreateBody(&bd); - bodies[8*i+j] = body; - body->CreateFixture(&sd); - body->SetMassFromShapes(); - } - } - } - } - /// Apply dynamic forces (springs) and check elevator state - void Step(Settings* settings) - { - Test::Step(settings); - for (int i=0; i<8; ++i){ - for (int j=0; j<8; ++j){ - b2Vec2 zero(0.0f,0.0f); - b2Vec2 down(0.0f, -0.5f); - b2Vec2 up(0.0f, 0.5f); - b2Vec2 right(0.5f, 0.0f); - b2Vec2 left(-0.5f, 0.0f); - int ind = i*8+j; - int indr = ind+1; - int indd = ind+8; - float32 spring = 500.0f; - float32 damp = 5.0f; - if (j<7) { - AddSpringForce(*(bodies[ind]),zero,*(bodies[indr]),zero,spring, damp, 1.0f); - AddSpringForce(*(bodies[ind]),right,*(bodies[indr]),left,0.5f*spring, damp, 0.0f); - } - if (i<7) { - AddSpringForce(*(bodies[ind]),zero,*(bodies[indd]),zero,spring, damp, 1.0f); - AddSpringForce(*(bodies[ind]),up,*(bodies[indd]),down,0.5f*spring,damp,0.0f); - } - int inddr = indd + 1; - int inddl = indd - 1; - float32 drdist = sqrtf(2.0f); - if (i < 7 && j < 7){ - AddSpringForce(*(bodies[ind]),zero,*(bodies[inddr]),zero,spring, damp, drdist); - } - if (i < 7 && j > 0){ - AddSpringForce(*(bodies[ind]),zero,*(bodies[inddl]),zero,spring, damp, drdist); - } - - indr = ind+2; - indd = ind+8*2; - if (j<6) { - AddSpringForce(*(bodies[ind]),zero,*(bodies[indr]),zero,spring, damp, 2.0f); - } - if (i<6) { - AddSpringForce(*(bodies[ind]),zero,*(bodies[indd]),zero,spring,damp,2.0f); - } - - inddr = indd + 2; - inddl = indd - 2; - drdist = sqrtf(2.0f)*2.0f; - if (i < 6 && j < 6){ - AddSpringForce(*(bodies[ind]),zero,*(bodies[inddr]),zero,spring, damp, drdist); - } - if (i < 6 && j > 1){ - AddSpringForce(*(bodies[ind]),zero,*(bodies[inddl]),zero,spring, damp, drdist); - } - } - } - /// Check if bodies are near elevator - /// Look if the body to lift is near the elevator - b2Vec2 p1 = bodies[0]->GetWorldCenter(); - b2Vec2 p2 = bodies[63]->GetWorldCenter(); - /// m_elev: elevator prism. joint - b2Vec2 e = m_elev->GetWorldCenter() + b2Vec2(0.f,7.f); - // maybe not the best way to do it... - // Bodies reached the elevator side - if ( p1.x>e.x || p2.x>e.x ) { - // go up - if ( ( p1.yGetJointTranslation()<=m_joint_elev->GetLowerLimit()+1.f ) ) - { - m_joint_elev->SetMotorSpeed(20.f); - //printf("lift goes up trans: %G\n",m_joint_elev->GetJointTranslation()); - } - } - // go down - if ( (m_joint_elev->GetJointTranslation()>=m_joint_elev->GetUpperLimit()-2.f) ) - { - m_joint_elev->SetMotorSpeed(-15.f); - //printf("lift goes down: %G\n",m_joint_elev->GetJointTranslation()); - } - } - /// Add a spring force - void AddSpringForce(b2Body& bA, b2Vec2& localA, b2Body& bB, b2Vec2& localB, float32 k, float32 friction, float32 desiredDist) - { - b2Vec2 pA = bA.GetWorldPoint(localA); - b2Vec2 pB = bB.GetWorldPoint(localB); - b2Vec2 diff = pB - pA; - //Find velocities of attach points - b2Vec2 vA = bA.GetLinearVelocity() - b2Cross(bA.GetWorldVector(localA), bA.GetAngularVelocity()); - b2Vec2 vB = bB.GetLinearVelocity() - b2Cross(bB.GetWorldVector(localB), bB.GetAngularVelocity()); - b2Vec2 vdiff = vB-vA; - float32 dx = diff.Normalize(); //normalizes diff and puts length into dx - float32 vrel = vdiff.x*diff.x + vdiff.y*diff.y; - float32 forceMag = -k*(dx-desiredDist) - friction*vrel; - diff *= forceMag; // diff *= forceMag - bB.ApplyForce(diff, bA.GetWorldPoint(localA)); - diff *= -1.0f; - bA.ApplyForce(diff, bB.GetWorldPoint(localB)); - } - /// Default constructor - static Test* Create() - { - return new ElasticBody; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/PyramidStaticEdges.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/PyramidStaticEdges.h deleted file mode 100644 index dd18e9444..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/PyramidStaticEdges.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef PYRAMID_STATIC_EDGES_H -#define PYRAMID_STATIC_EDGES_H - -class PyramidStaticEdges : public Test -{ -public: - PyramidStaticEdges() - { - { - float32 coords[] = - { - 50.0f,0.0f, - -50.0f,0.0f - }; - - b2Vec2 verts[2]; - - for (int32 i = 0; i < 2; i++) - { - verts[i].Set(coords[i*2], coords[i*2 + 1]); - } - - b2BodyDef bd; - bd.position.Set( 0.0f, 0.0f ); - b2Body* body = m_world->CreateBody(&bd); - b2EdgeDef edgeDef; - edgeDef.vertex1 = verts[0]; - edgeDef.vertex2 = verts[1]; - body->CreateFixture(&edgeDef); - - //body->SetMassFromShapes(); - } - - { - b2PolygonDef sd; - float32 a = 0.5f; - sd.SetAsBox(a, a); - sd.density = 5.0f; - - b2Vec2 x(-10.0f, 1.0f); - b2Vec2 y; - b2Vec2 deltaX(0.5625f, 2.0f); - b2Vec2 deltaY(1.125f, 0.0f); - - const int32 N = 2; - - for (int32 i = 0; i < N; ++i) - { - y = x; - - for (int32 j = i; j < N; ++j) - { - b2BodyDef bd; - bd.position = y; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd); - body->SetMassFromShapes(); - - y += deltaY; - } - - x += deltaX; - } - } - } - - static Test* Create() - { - return new PyramidStaticEdges; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/StaticEdges.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/StaticEdges.h deleted file mode 100644 index 694a8e17b..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Tests/StaticEdges.h +++ /dev/null @@ -1,285 +0,0 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef STATIC_EDGES_H -#define STATIC_EDGES_H - -class StaticEdges : public Test -{ -public: - StaticEdges() - { -#if 0 - { - b2CircleDef sd; - sd.radius = 0.5f; - sd.localPosition.SetZero(); - sd.density = 2.0f; - - b2BodyDef bd; - bd.position.Set(0.0f, 2.0f); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd); - body->SetMassFromShapes(); - } -#endif - - { - b2CircleDef sd1; - sd1.radius = 0.5f; - sd1.localPosition.Set(-0.5f, 0.5f); - sd1.density = 2.0f; - - b2CircleDef sd2; - sd2.radius = 0.5f; - sd2.localPosition.Set(0.5f, 0.5f); - sd2.density = 0.0f; // massless - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x + 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - b2PolygonDef sd1; - sd1.SetAsBox(0.25f, 0.5f); - sd1.density = 2.0f; - - b2PolygonDef sd2; - sd2.SetAsBox(0.25f, 0.5f, b2Vec2(0.0f, -0.5f), 0.5f * b2_pi); - sd2.density = 2.0f; - - for (int i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x - 5.0f, 1.05f + 2.5f * i); - bd.angle = RandomFloat(-b2_pi, b2_pi); - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - b2XForm xf1; - xf1.R.Set(0.3524f * b2_pi); - xf1.position = b2Mul(xf1.R, b2Vec2(1.0f, 0.0f)); - - b2PolygonDef sd1; - sd1.vertexCount = 3; - sd1.vertices[0] = b2Mul(xf1, b2Vec2(-1.0f, 0.0f)); - sd1.vertices[1] = b2Mul(xf1, b2Vec2(1.0f, 0.0f)); - sd1.vertices[2] = b2Mul(xf1, b2Vec2(0.0f, 0.5f)); - sd1.density = 2.0f; - - b2XForm xf2; - xf2.R.Set(-0.3524f * b2_pi); - xf2.position = b2Mul(xf2.R, b2Vec2(-1.0f, 0.0f)); - - b2PolygonDef sd2; - sd2.vertexCount = 3; - sd2.vertices[0] = b2Mul(xf2, b2Vec2(-1.0f, 0.0f)); - sd2.vertices[1] = b2Mul(xf2, b2Vec2(1.0f, 0.0f)); - sd2.vertices[2] = b2Mul(xf2, b2Vec2(0.0f, 0.5f)); - sd2.density = 2.0f; - - for (int32 i = 0; i < 10; ++i) - { - float32 x = RandomFloat(-0.1f, 0.1f); - b2BodyDef bd; - bd.position.Set(x, 2.05f + 2.5f * i); - bd.angle = 0.0f; - b2Body* body = m_world->CreateBody(&bd); - body->CreateFixture(&sd1); - body->CreateFixture(&sd2); - body->SetMassFromShapes(); - } - } - - { - float32 loop1[] = - { - 0.063134534f,8.3695248f, - 0.94701801f,9.3165428f, - 0.0f,9.0640047f, - -0.12626907f,10.326695f, - 1.4520943f,11.77879f, - 2.2728432f,10.137292f, - 2.3991123f,11.147444f, - 3.5986685f,10.958041f, - 3.9143411f,7.3593722f, - 4.1668793f,9.4428119f, - 5.4295699f,9.3165428f, - 6.2503189f,8.3063903f, - 6.6922606f,10.137292f, - 4.9876282f,9.8216191f, - 4.7350901f,10.958041f, - 7.2604714f,11.652521f, - 10.732871f,11.147444f, - 10.480333f,10.642368f, - 10.732871f,9.8216191f, - 11.55362f,9.4428119f, - 12.374369f,9.3796773f, - 13.005714f,9.8216191f, - 13.195118f,10.38983f, - 13.005714f,10.768637f, - 12.626907f,10.894906f, - 12.753176f,11.526252f, - 13.573925f,11.715655f, - 14.836616f,11.399982f, - 16.351844f,10.768637f, - 17.867073f,11.399982f, - 17.803939f,10.263561f, - 17.361997f,8.3063903f, - 17.803939f,8.1801212f, - 18.056477f,9.5059464f, - 18.182746f,11.336848f, - 18.561553f,11.210579f, - 18.561553f,9.6322155f, - 18.561553f,7.7381795f, - 18.687822f,5.5284708f, - 19.382302f,5.6547398f, - 19.066629f,8.1801212f, - 19.003495f,10.263561f, - 19.066629f,11.463117f, - 19.887378f,11.841924f, - 20.708127f,11.273713f, - 21.0238f,10.011023f, - 20.708127f,7.2962377f, - 21.086934f,6.2860852f, - 21.150069f,3.7607038f, - 20.392455f,2.5611476f, - 18.624688f,2.5611476f, - 20.771262f,2.1192059f, - 20.771262f,0.22516988f, - 18.624688f,-0.2799064f, - 13.826463f,0.16203534f, - 14.015867f,1.7403987f, - 13.195118f,2.1823404f, - 12.626907f,1.5509951f, - 12.879445f,0.85651522f, - 12.626907f,0.35143895f, - 10.543467f,1.298457f, - 11.490485f,3.9501074f, - 13.889598f,3.6344347f, - 13.889598f,2.9399549f, - 14.584077f,3.8869729f, - 11.932427f,5.2127981f, - 9.7227183f,4.0132419f, - 10.796005f,3.5081657f, - 9.7858528f,3.2556275f, - 10.796005f,2.4980131f, - 7.9549513f,1.7403987f, - 9.6595837f,1.424726f, - 9.217642f,0.66711162f, - 8.270624f,-0.090502792f, - 7.0079333f,0.85651522f, - 6.1240498f,-0.15363733f, - 6.1240498f,3.192493f, - 5.6821081f,2.4348786f, - 4.9876282f,2.1192059f, - 4.1037447f,1.8666678f, - 3.0304576f,1.8666678f, - 2.0834396f,2.245475f, - 1.6414979f,2.6242822f, - 1.3258252f,3.5081657f, - 1.2626907f,0.47770802f, - 0.63134534f,0.035766276f, - 0.063134534f,0.98278429f - }; - - float32 loop2[] = - { - 8.270624f,6.1598161f, - 8.270624f,5.3390672f, - 8.7757003f,5.086529f, - 9.4701801f,5.5284708f, - 9.217642f,6.033547f, - 8.7757003f,6.4123542f - }; - - float32 loop3[] = - { - -5.0f, 10.0f, - 5.0f, 10.0f, - 5.0f, 0.0f, - -5.0f, 0.0f, - }; - - b2Vec2 pointLoop1[87]; - b2Vec2 pointLoop2[6]; - b2Vec2 pointLoop3[4]; - - for (int32 i = 0; i < 87; i++) - { - pointLoop1[i].Set(loop1[i*2] - 10.0f, loop1[i*2 + 1]); - } - - for (int32 i = 0; i < 6; i++) - { - pointLoop2[i].Set(loop2[i*2] - 10.0f, loop2[i*2 + 1]); - } - - for (int32 i = 0; i < 4; i++) - { - pointLoop3[i].Set(loop3[i*2], loop3[i*2 + 1]); - } - - b2BodyDef bd; - bd.position.Set( 0.0f, 0.0f ); - b2Body* body = m_world->CreateBody(&bd); - - b2EdgeChainDef edgeDef; - edgeDef.vertexCount = 87; - edgeDef.vertices = pointLoop1; - b2CreateEdgeChain(body, &edgeDef); - - edgeDef.vertexCount = 6; - edgeDef.vertices = pointLoop2; - b2CreateEdgeChain(body, &edgeDef); - - //edgeDef.vertexCount = 4; - //edgeDef.vertices = pointLoop3; - //b2CreateEdgeChain(body, &edgeDef); - } - } - - static Test* Create() - { - return new StaticEdges; - } -}; - -#endif - - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Polygon.cpp b/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Polygon.cpp deleted file mode 100644 index de48dcf95..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Polygon.cpp +++ /dev/null @@ -1,1586 +0,0 @@ -/* - * Copyright (c) 2007 Eric Jordan - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - -// This utility works with Box2d version 2.0 (or higher), and not with 1.4.3 - -#include "b2Triangle.h" -#include "b2Polygon.h" - -#include -#include - -static bool B2_POLYGON_REPORT_ERRORS = false; - -//If you're using 1.4.3, b2_toiSlop won't exist, so set this equal to 0 -static const float32 toiSlop = 0.0f; - -/* - * Check if the lines a0->a1 and b0->b1 cross. - * If they do, intersectionPoint will be filled - * with the point of crossing. - * - * Grazing lines should not return true. - */ -bool intersect(const b2Vec2& a0, const b2Vec2& a1, - const b2Vec2& b0, const b2Vec2& b1, - b2Vec2& intersectionPoint) { - - if (a0 == b0 || a0 == b1 || a1 == b0 || a1 == b1) return false; - float x1 = a0.x; float y1 = a0.y; - float x2 = a1.x; float y2 = a1.y; - float x3 = b0.x; float y3 = b0.y; - float x4 = b1.x; float y4 = b1.y; - - //AABB early exit - if (b2Max(x1,x2) < b2Min(x3,x4) || b2Max(x3,x4) < b2Min(x1,x2) ) return false; - if (b2Max(y1,y2) < b2Min(y3,y4) || b2Max(y3,y4) < b2Min(y1,y2) ) return false; - - float ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)); - float ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)); - float denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); - if (b2Abs(denom) < FLT_EPSILON) { - //Lines are too close to parallel to call - return false; - } - ua /= denom; - ub /= denom; - - if ((0 < ua) && (ua < 1) && (0 < ub) && (ub < 1)) { - //if (intersectionPoint){ - intersectionPoint.x = (x1 + ua * (x2 - x1)); - intersectionPoint.y = (y1 + ua * (y2 - y1)); - //} - //printf("%f, %f -> %f, %f crosses %f, %f -> %f, %f\n",x1,y1,x2,y2,x3,y3,x4,y4); - return true; - } - - return false; -} - -/* - * True if line from a0->a1 intersects b0->b1 - */ -bool intersect(const b2Vec2& a0, const b2Vec2& a1, - const b2Vec2& b0, const b2Vec2& b1) { - b2Vec2 myVec(0.0f,0.0f); - return intersect(a0, a1, b0, b1, myVec); -} - -b2Polygon::b2Polygon(float32* _x, float32* _y, int32 nVert) { - nVertices = nVert; - x = new float32[nVertices]; - y = new float32[nVertices]; - for (int32 i = 0; i < nVertices; ++i) { - x[i] = _x[i]; - y[i] = _y[i]; - } - areaIsSet = false; -} - -b2Polygon::b2Polygon(b2Vec2* v, int32 nVert) { - nVertices = nVert; - x = new float32[nVertices]; - y = new float32[nVertices]; - for (int32 i = 0; i < nVertices; ++i) { - x[i] = v[i].x; - y[i] = v[i].y; - - } - areaIsSet = false; -} - -b2Polygon::b2Polygon() { - x = NULL; - y = NULL; - nVertices = 0; - areaIsSet = false; -} - -b2Polygon::~b2Polygon() { - //printf("About to delete poly with %d vertices\n",nVertices); - delete[] x; - delete[] y; -} - -float32 b2Polygon::GetArea() { - // TODO: fix up the areaIsSet caching so that it can be used - //if (areaIsSet) return area; - area = 0.0f; - - //First do wraparound - area += x[nVertices-1]*y[0]-x[0]*y[nVertices-1]; - for (int i=0; i 0.0f); -} - -void b2Polygon::MergeParallelEdges(float32 tolerance) { - if (nVertices <= 3) return; //Can't do anything useful here to a triangle - bool* mergeMe = new bool[nVertices]; - int32 newNVertices = nVertices; - for (int32 i = 0; i < nVertices; ++i) { - int32 lower = (i == 0) ? (nVertices - 1) : (i - 1); - int32 middle = i; - int32 upper = (i == nVertices - 1) ? (0) : (i + 1); - float32 dx0 = x[middle] - x[lower]; - float32 dy0 = y[middle] - y[lower]; - float32 dx1 = x[upper] - x[middle]; - float32 dy1 = y[upper] - y[middle]; - float32 norm0 = sqrtf(dx0*dx0+dy0*dy0); - float32 norm1 = sqrtf(dx1*dx1+dy1*dy1); - if ( !(norm0 > 0.0f && norm1 > 0.0f) && newNVertices > 3 ) { - //Merge identical points - mergeMe[i] = true; - --newNVertices; - } - dx0 /= norm0; dy0 /= norm0; - dx1 /= norm1; dy1 /= norm1; - float32 cross = dx0 * dy1 - dx1 * dy0; - float32 dot = dx0 * dx1 + dy0 * dy1; - if (fabs(cross) < tolerance && dot > 0 && newNVertices > 3) { - mergeMe[i] = true; - --newNVertices; - } else { - mergeMe[i] = false; - } - } - if(newNVertices == nVertices || newNVertices == 0) { - delete[] mergeMe; - return; - } - float32* newx = new float32[newNVertices]; - float32* newy = new float32[newNVertices]; - int32 currIndex = 0; - for (int32 i=0; i < nVertices; ++i) { - if (mergeMe[i] || newNVertices == 0 || currIndex == newNVertices) continue; - b2Assert(currIndex < newNVertices); - newx[currIndex] = x[i]; - newy[currIndex] = y[i]; - ++currIndex; - } - delete[] x; - delete[] y; - delete[] mergeMe; - x = newx; - y = newy; - nVertices = newNVertices; -// printf("%d \n", newNVertices); -} - - /* - * Allocates and returns pointer to vector vertex array. - * Length of array is nVertices. - */ -b2Vec2* b2Polygon::GetVertexVecs() { - b2Vec2* out = new b2Vec2[nVertices]; - for (int32 i = 0; i < nVertices; ++i) { - out[i].Set(x[i], y[i]); - } - return out; -} - -b2Polygon::b2Polygon(b2Triangle& t) { - nVertices = 3; - x = new float[nVertices]; - y = new float[nVertices]; - for (int32 i = 0; i < nVertices; ++i) { - x[i] = t.x[i]; - y[i] = t.y[i]; - } -} - -void b2Polygon::Set(const b2Polygon& p) { - if (nVertices != p.nVertices){ - nVertices = p.nVertices; - if (x) delete[] x; - if (y) delete[] y; - x = new float32[nVertices]; - y = new float32[nVertices]; - } - - for (int32 i = 0; i < nVertices; ++i) { - x[i] = p.x[i]; - y[i] = p.y[i]; - } - areaIsSet = false; -} - - /* - * Assuming the polygon is simple, checks if it is convex. - */ -bool b2Polygon::IsConvex() { - bool isPositive = false; - for (int32 i = 0; i < nVertices; ++i) { - int32 lower = (i == 0) ? (nVertices - 1) : (i - 1); - int32 middle = i; - int32 upper = (i == nVertices - 1) ? (0) : (i + 1); - float32 dx0 = x[middle] - x[lower]; - float32 dy0 = y[middle] - y[lower]; - float32 dx1 = x[upper] - x[middle]; - float32 dy1 = y[upper] - y[middle]; - float32 cross = dx0 * dy1 - dx1 * dy0; - // Cross product should have same sign - // for each vertex if poly is convex. - bool newIsP = (cross >= 0) ? true : false; - if (i == 0) { - isPositive = newIsP; - } - else if (isPositive != newIsP) { - return false; - } - } - return true; -} - -/* - * Pulled from b2Shape.cpp, assertions removed - */ -static b2Vec2 PolyCentroid(const b2Vec2* vs, int32 count) -{ - b2Vec2 c; c.Set(0.0f, 0.0f); - float32 area = 0.0f; - - const float32 inv3 = 1.0f / 3.0f; - b2Vec2 pRef(0.0f, 0.0f); - for (int32 i = 0; i < count; ++i) - { - // Triangle vertices. - b2Vec2 p1 = pRef; - b2Vec2 p2 = vs[i]; - b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; - - b2Vec2 e1 = p2 - p1; - b2Vec2 e2 = p3 - p1; - - float32 D = b2Cross(e1, e2); - - float32 triangleArea = 0.5f * D; - area += triangleArea; - - // Area weighted centroid - c += triangleArea * inv3 * (p1 + p2 + p3); - } - - // Centroid - c *= 1.0f / area; - return c; -} - - -/* - * Checks if polygon is valid for use in Box2d engine. - * Last ditch effort to ensure no invalid polygons are - * added to world geometry. - * - * Performs a full check, for simplicity, convexity, - * orientation, minimum angle, and volume. This won't - * be very efficient, and a lot of it is redundant when - * other tools in this section are used. - */ -bool b2Polygon::IsUsable(bool printErrors){ - int32 error = -1; - bool noError = true; - if (nVertices < 3 || nVertices > b2_maxPolygonVertices) {noError = false; error = 0;} - if (!IsConvex()) {noError = false; error = 1;} - if (!IsSimple()) {noError = false; error = 2;} - if (GetArea() < FLT_EPSILON) {noError = false; error = 3;} - - //Compute normals - b2Vec2* normals = new b2Vec2[nVertices]; - b2Vec2* vertices = new b2Vec2[nVertices]; - for (int32 i = 0; i < nVertices; ++i){ - vertices[i].Set(x[i],y[i]); - int32 i1 = i; - int32 i2 = i + 1 < nVertices ? i + 1 : 0; - b2Vec2 edge(x[i2]-x[i1],y[i2]-y[i1]); - normals[i] = b2Cross(edge, 1.0f); - normals[i].Normalize(); - } - - //Required side checks - for (int32 i=0; i= -b2_linearSlop){ - noError = false; - error = 5; - } - } - - - b2Vec2 centroid = PolyCentroid(vertices,nVertices); - b2Vec2 n1 = normals[iminus]; - b2Vec2 n2 = normals[i]; - b2Vec2 v = vertices[i] - centroid;; - - b2Vec2 d; - d.x = b2Dot(n1, v) - toiSlop; - d.y = b2Dot(n2, v) - toiSlop; - - // Shifting the edge inward by b2_toiSlop should - // not cause the plane to pass the centroid. - if ((d.x < 0.0f)||(d.y < 0.0f)){ - noError = false; - error = 6; - } - - } - delete[] vertices; - delete[] normals; - - if (!noError && printErrors){ - printf("Found invalid polygon, "); - switch(error){ - case 0: - printf("must have between 3 and %d vertices.\n",b2_maxPolygonVertices); - break; - case 1: - printf("must be convex.\n"); - break; - case 2: - printf("must be simple (cannot intersect itself).\n"); - break; - case 3: - printf("area is too small.\n"); - break; - case 4: - printf("sides are too close to parallel.\n"); - break; - case 5: - printf("polygon is too thin.\n"); - break; - case 6: - printf("core shape generation would move edge past centroid (too thin).\n"); - break; - default: - printf("don't know why.\n"); - } - } - return noError; -} - - -bool b2Polygon::IsUsable(){ - return IsUsable(B2_POLYGON_REPORT_ERRORS); -} - -//Check for edge crossings -bool b2Polygon::IsSimple() { - for (int32 i=0; i nVertices-1)?0:i+1; - b2Vec2 a1(x[i],y[i]); - b2Vec2 a2(x[iplus],y[iplus]); - for (int32 j=i+1; j nVertices-1)?0:j+1; - b2Vec2 b1(x[j],y[j]); - b2Vec2 b2(x[jplus],y[jplus]); - if (intersect(a1,a2,b1,b2)){ - return false; - } - } - } - return true; -} - - /* - * Tries to add a triangle to the polygon. Returns null if it can't connect - * properly, otherwise returns a pointer to the new Polygon. Assumes bitwise - * equality of joined vertex positions. - * - * Remember to delete the pointer afterwards. - * Todo: Make this return a b2Polygon instead - * of a pointer to a heap-allocated one. - * - * For internal use. - */ -b2Polygon* b2Polygon::Add(b2Triangle& t) { -// float32 equalTol = .001f; - // First, find vertices that connect - int32 firstP = -1; - int32 firstT = -1; - int32 secondP = -1; - int32 secondT = -1; - for (int32 i = 0; i < nVertices; i++) { - if (t.x[0] == x[i] && t.y[0] == y[i]) { - if (firstP == -1) { - firstP = i; - firstT = 0; - } - else { - secondP = i; - secondT = 0; - } - } - else if (t.x[1] == x[i] && t.y[1] == y[i]) { - if (firstP == -1) { - firstP = i; - firstT = 1; - } - else { - secondP = i; - secondT = 1; - } - } - else if (t.x[2] == x[i] && t.y[2] == y[i]) { - if (firstP == -1) { - firstP = i; - firstT = 2; - } - else { - secondP = i; - secondT = 2; - } - } - else { - } - } - // Fix ordering if first should be last vertex of poly - if (firstP == 0 && secondP == nVertices - 1) { - firstP = nVertices - 1; - secondP = 0; - } - - // Didn't find it - if (secondP == -1) { - return NULL; - } - - // Find tip index on triangle - int32 tipT = 0; - if (tipT == firstT || tipT == secondT) - tipT = 1; - if (tipT == firstT || tipT == secondT) - tipT = 2; - - float32* newx = new float[nVertices + 1]; - float32* newy = new float[nVertices + 1]; - int32 currOut = 0; - for (int32 i = 0; i < nVertices; i++) { - newx[currOut] = x[i]; - newy[currOut] = y[i]; - if (i == firstP) { - ++currOut; - newx[currOut] = t.x[tipT]; - newy[currOut] = t.y[tipT]; - } - ++currOut; - } - b2Polygon* result = new b2Polygon(newx, newy, nVertices+1); - delete[] newx; - delete[] newy; - return result; -} - - /** - * Adds this polygon to a PolyDef. - */ -void b2Polygon::AddTo(b2FixtureDef& pd) { - if (nVertices < 3) return; - - b2Assert(nVertices <= b2_maxPolygonVertices); - - b2Vec2* vecs = GetVertexVecs(); - b2Vec2* vecsToAdd = new b2Vec2[nVertices]; - - int32 offset = 0; - - b2PolygonShape *polyShape = new b2PolygonShape; - int32 ind; - - for (int32 i = 0; i < nVertices; ++i) { - - //Omit identical neighbors (including wraparound) - ind = i - offset; - if (vecs[i].x==vecs[remainder(i+1,nVertices)].x && - vecs[i].y==vecs[remainder(i+1,nVertices)].y){ - offset++; - continue; - } - - vecsToAdd[ind] = vecs[i]; - - } - - polyShape->Set((const b2Vec2*)vecsToAdd, ind+1); - pd.shape = polyShape; - - delete[] vecs; - delete[] vecsToAdd; -} - - /** - * Finds and fixes "pinch points," points where two polygon - * vertices are at the same point. - * - * If a pinch point is found, pin is broken up into poutA and poutB - * and true is returned; otherwise, returns false. - * - * Mostly for internal use. - */ -bool ResolvePinchPoint(const b2Polygon& pin, b2Polygon& poutA, b2Polygon& poutB){ - if (pin.nVertices < 3) return false; - float32 tol = .001f; - bool hasPinchPoint = false; - int32 pinchIndexA = -1; - int32 pinchIndexB = -1; - for (int i=0; i 3) { - // Find an ear - int32 earIndex = -1; - //float32 earVolume = -1.0f; - float32 earMaxMinCross = -10.0f; - for (int32 i = 0; i < vNum; ++i) { - if (IsEar(i, xrem, yrem, vNum)) { - int32 lower = remainder(i-1,vNum); - int32 upper = remainder(i+1,vNum); - b2Vec2 d1(xrem[upper]-xrem[i],yrem[upper]-yrem[i]); - b2Vec2 d2(xrem[i]-xrem[lower],yrem[i]-yrem[lower]); - b2Vec2 d3(xrem[lower]-xrem[upper],yrem[lower]-yrem[upper]); - - d1.Normalize(); - d2.Normalize(); - d3.Normalize(); - float32 cross12 = b2Abs( b2Cross(d1,d2) ); - float32 cross23 = b2Abs( b2Cross(d2,d3) ); - float32 cross31 = b2Abs( b2Cross(d3,d1) ); - //Find the maximum minimum angle - float32 minCross = b2Min(cross12, b2Min(cross23,cross31)); - if (minCross > earMaxMinCross){ - earIndex = i; - earMaxMinCross = minCross; - } - - /*//This bit chooses the ear with greatest volume first - float32 testVol = b2Abs( d1.x*d2.y-d2.x*d1.y ); - if (testVol > earVolume){ - earIndex = i; - earVolume = testVol; - }*/ - } - } - - // If we still haven't found an ear, we're screwed. - // Note: sometimes this is happening because the - // remaining points are collinear. Really these - // should just be thrown out without halting triangulation. - if (earIndex == -1){ - if (B2_POLYGON_REPORT_ERRORS){ - b2Polygon dump(xrem,yrem,vNum); - printf("Couldn't find an ear, dumping remaining poly:\n"); - dump.printFormatted(); - printf("Please submit this dump to ewjordan at Box2d forums\n"); - } - for (int32 i = 0; i < bufferSize; i++) { - results[i].Set(buffer[i]); - } - - delete[] buffer; - - if (bufferSize > 0) return bufferSize; - else return -1; - } - - // Clip off the ear: - // - remove the ear tip from the list - - --vNum; - float32* newx = new float32[vNum]; - float32* newy = new float32[vNum]; - int32 currDest = 0; - for (int32 i = 0; i < vNum; ++i) { - if (currDest == earIndex) ++currDest; - newx[i] = xrem[currDest]; - newy[i] = yrem[currDest]; - ++currDest; - } - - // - add the clipped triangle to the triangle list - int32 under = (earIndex == 0) ? (vNum) : (earIndex - 1); - int32 over = (earIndex == vNum) ? 0 : (earIndex + 1); - b2Triangle toAdd = b2Triangle(xrem[earIndex], yrem[earIndex], xrem[over], yrem[over], xrem[under], yrem[under]); - buffer[bufferSize].Set(toAdd); - ++bufferSize; - - // - replace the old list with the new one - delete[] xrem; - delete[] yrem; - xrem = newx; - yrem = newy; - } - - b2Triangle toAdd = b2Triangle(xrem[1], yrem[1], xrem[2], yrem[2], - xrem[0], yrem[0]); - buffer[bufferSize].Set(toAdd); - ++bufferSize; - - delete[] xrem; - delete[] yrem; - - b2Assert(bufferSize == xremLength-2); - - for (int32 i = 0; i < bufferSize; i++) { - results[i].Set(buffer[i]); - } - - delete[] buffer; - - return bufferSize; -} - - /** - * Turns a list of triangles into a list of convex polygons. Very simple - * method - start with a seed triangle, keep adding triangles to it until - * you can't add any more without making the polygon non-convex. - * - * Returns an integer telling how many polygons were created. Will fill - * polys array up to polysLength entries, which may be smaller or larger - * than the return value. - * - * Takes O(N*P) where P is the number of resultant polygons, N is triangle - * count. - * - * The final polygon list will not necessarily be minimal, though in - * practice it works fairly well. - */ -int32 PolygonizeTriangles(b2Triangle* triangulated, int32 triangulatedLength, b2Polygon* polys, int32 polysLength) { - int32 polyIndex = 0; - - if (triangulatedLength <= 0) { - return 0; - } - else { - int* covered = new int[triangulatedLength]; - for (int32 i = 0; i < triangulatedLength; ++i) { - covered[i] = 0; - //Check here for degenerate triangles - if ( ( (triangulated[i].x[0] == triangulated[i].x[1]) && (triangulated[i].y[0] == triangulated[i].y[1]) ) - || ( (triangulated[i].x[1] == triangulated[i].x[2]) && (triangulated[i].y[1] == triangulated[i].y[2]) ) - || ( (triangulated[i].x[0] == triangulated[i].x[2]) && (triangulated[i].y[0] == triangulated[i].y[2]) ) ) { - covered[i] = 1; - } - } - - bool notDone = true; - while (notDone) { - int32 currTri = -1; - for (int32 i = 0; i < triangulatedLength; ++i) { - if (covered[i]) - continue; - currTri = i; - break; - } - if (currTri == -1) { - notDone = false; - } - else { - b2Polygon poly(triangulated[currTri]); - covered[currTri] = 1; - int32 index = 0; - for (int32 i = 0; i < 2*triangulatedLength; ++i,++index) { - while (index >= triangulatedLength) index -= triangulatedLength; - if (covered[index]) { - continue; - } - b2Polygon* newP = poly.Add(triangulated[index]); - if (!newP) { - continue; - } - if (newP->nVertices > b2Polygon::maxVerticesPerPolygon) { - delete newP; - newP = NULL; - continue; - } - if (newP->IsConvex()) { //Or should it be IsUsable? Maybe re-write IsConvex to apply the angle threshold from Box2d - poly.Set(*newP); - delete newP; - newP = NULL; - covered[index] = 1; - } else { - delete newP; - newP = NULL; - } - } - if (polyIndex < polysLength){ - poly.MergeParallelEdges(b2_angularSlop); - //If identical points are present, a triangle gets - //borked by the MergeParallelEdges function, hence - //the vertex number check - if (poly.nVertices >= 3) polys[polyIndex].Set(poly); - //else printf("Skipping corrupt poly\n"); - } - if (poly.nVertices >= 3) polyIndex++; //Must be outside (polyIndex < polysLength) test - } - //printf("MEMCHECK: %d\n",_CrtCheckMemory()); - } - delete[] covered; - } - return polyIndex; -} - - /** - * Checks if vertex i is the tip of an ear in polygon defined by xv[] and - * yv[]. - * - * Assumes clockwise orientation of polygon...ick - */ -bool IsEar(int32 i, float32* xv, float32* yv, int32 xvLength) { - float32 dx0, dy0, dx1, dy1; - dx0 = dy0 = dx1 = dy1 = 0; - if (i >= xvLength || i < 0 || xvLength < 3) { - return false; - } - int32 upper = i + 1; - int32 lower = i - 1; - if (i == 0) { - dx0 = xv[0] - xv[xvLength - 1]; - dy0 = yv[0] - yv[xvLength - 1]; - dx1 = xv[1] - xv[0]; - dy1 = yv[1] - yv[0]; - lower = xvLength - 1; - } - else if (i == xvLength - 1) { - dx0 = xv[i] - xv[i - 1]; - dy0 = yv[i] - yv[i - 1]; - dx1 = xv[0] - xv[i]; - dy1 = yv[0] - yv[i]; - upper = 0; - } - else { - dx0 = xv[i] - xv[i - 1]; - dy0 = yv[i] - yv[i - 1]; - dx1 = xv[i + 1] - xv[i]; - dy1 = yv[i + 1] - yv[i]; - } - float32 cross = dx0 * dy1 - dx1 * dy0; - if (cross > 0) - return false; - b2Triangle myTri(xv[i], yv[i], xv[upper], yv[upper], - xv[lower], yv[lower]); - for (int32 j = 0; j < xvLength; ++j) { - if (j == i || j == lower || j == upper) - continue; - if (myTri.IsInside(xv[j], yv[j])) - return false; - } - return true; -} - -void ReversePolygon(b2Polygon& p){ - ReversePolygon(p.x,p.y,p.nVertices); -} - -void ReversePolygon(float* x, float* y, int n) { - if (n == 1) - return; - int32 low = 0; - int32 high = n - 1; - while (low < high) { - float32 buffer = x[low]; - x[low] = x[high]; - x[high] = buffer; - buffer = y[low]; - y[low] = y[high]; - y[high] = buffer; - ++low; - --high; - } -} - - /** - * Decomposes a non-convex polygon into a number of convex polygons, up - * to maxPolys (remaining pieces are thrown out, but the total number - * is returned, so the return value can be greater than maxPolys). - * - * Each resulting polygon will have no more than maxVerticesPerPolygon - * vertices (set to b2MaxPolyVertices by default, though you can change - * this). - * - * Returns -1 if operation fails (usually due to self-intersection of - * polygon). - */ -int32 DecomposeConvex(b2Polygon* p, b2Polygon* results, int32 maxPolys) { - if (p->nVertices < 3) return 0; - - b2Triangle* triangulated = new b2Triangle[p->nVertices - 2]; - int32 nTri; - if (p->IsCCW()) { - //printf("It is ccw \n"); - b2Polygon tempP; - tempP.Set(*p); - ReversePolygon(tempP.x, tempP.y, tempP.nVertices); - nTri = TriangulatePolygon(tempP.x, tempP.y, tempP.nVertices, triangulated); -// ReversePolygon(p->x, p->y, p->nVertices); //reset orientation - } else { - //printf("It is not ccw \n"); - nTri = TriangulatePolygon(p->x, p->y, p->nVertices, triangulated); - } - if (nTri < 1) { - //Still no luck? Oh well... - return -1; - } - int32 nPolys = PolygonizeTriangles(triangulated, nTri, results, maxPolys); - delete[] triangulated; - return nPolys; -} - - /** - * Decomposes a polygon into convex polygons and adds all pieces to a b2BodyDef - * using a prototype b2PolyDef. All fields of the prototype are used for every - * shape except the vertices (friction, restitution, density, etc). - * - * If you want finer control, you'll have to add everything by hand. - * - * This is the simplest method to add a complicated polygon to a body. - * - * Until Box2D's b2BodyDef behavior changes, this method returns a pointer to - * a heap-allocated array of b2PolyDefs, which must be deleted by the user - * after the b2BodyDef is added to the world. - */ -void DecomposeConvexAndAddTo(b2Polygon* p, b2Body* bd, b2FixtureDef* prototype) { - - if (p->nVertices < 3) return; - b2Polygon* decomposed = new b2Polygon[p->nVertices - 2]; //maximum number of polys - int32 nPolys = DecomposeConvex(p, decomposed, p->nVertices - 2); -// printf("npolys: %d",nPolys); - b2FixtureDef* pdarray = new b2FixtureDef[2*p->nVertices];//extra space in case of splits - int32 extra = 0; - for (int32 i = 0; i < nPolys; ++i) { - b2FixtureDef* toAdd = &pdarray[i+extra]; - *toAdd = *prototype; - //Hmm, shouldn't have to do all this... - /* - toAdd->type = prototype->type; - toAdd->friction = prototype->friction; - toAdd->restitution = prototype->restitution; - toAdd->density = prototype->density; - toAdd->userData = prototype->userData; - toAdd->categoryBits = prototype->categoryBits; - toAdd->maskBits = prototype->maskBits; - toAdd->groupIndex = prototype->groupIndex;//*/ - //decomposed[i].print(); - b2Polygon curr = decomposed[i]; - //TODO ewjordan: move this triangle handling to a better place so that - //it happens even if this convenience function is not called. - if (curr.nVertices == 3){ - //Check here for near-parallel edges, since we can't - //handle this in merge routine - for (int j=0; j<3; ++j){ - int32 lower = (j == 0) ? (curr.nVertices - 1) : (j - 1); - int32 middle = j; - int32 upper = (j == curr.nVertices - 1) ? (0) : (j + 1); - float32 dx0 = curr.x[middle] - curr.x[lower]; float32 dy0 = curr.y[middle] - curr.y[lower]; - float32 dx1 = curr.x[upper] - curr.x[middle]; float32 dy1 = curr.y[upper] - curr.y[middle]; - float32 norm0 = sqrtf(dx0*dx0+dy0*dy0); float32 norm1 = sqrtf(dx1*dx1+dy1*dy1); - if ( !(norm0 > 0.0f && norm1 > 0.0f) ) { - //Identical points, don't do anything! - goto Skip; - } - dx0 /= norm0; dy0 /= norm0; - dx1 /= norm1; dy1 /= norm1; - float32 cross = dx0 * dy1 - dx1 * dy0; - float32 dot = dx0*dx1 + dy0*dy1; - if (fabs(cross) < b2_angularSlop && dot > 0) { - //Angle too close, split the triangle across from this point. - //This is guaranteed to result in two triangles that satify - //the tolerance (one of the angles is 90 degrees) - float32 dx2 = curr.x[lower] - curr.x[upper]; float32 dy2 = curr.y[lower] - curr.y[upper]; - float32 norm2 = sqrtf(dx2*dx2+dy2*dy2); - if (norm2 == 0.0f) { - goto Skip; - } - dx2 /= norm2; dy2 /= norm2; - float32 thisArea = curr.GetArea(); - float32 thisHeight = 2.0f * thisArea / norm2; - float32 buffer2 = dx2; - dx2 = dy2; dy2 = -buffer2; - //Make two new polygons - //printf("dx2: %f, dy2: %f, thisHeight: %f, middle: %d\n",dx2,dy2,thisHeight,middle); - float32 newX1[3] = { curr.x[middle]+dx2*thisHeight, curr.x[lower], curr.x[middle] }; - float32 newY1[3] = { curr.y[middle]+dy2*thisHeight, curr.y[lower], curr.y[middle] }; - float32 newX2[3] = { newX1[0], curr.x[middle], curr.x[upper] }; - float32 newY2[3] = { newY1[0], curr.y[middle], curr.y[upper] }; - b2Polygon p1(newX1,newY1,3); - b2Polygon p2(newX2,newY2,3); - if (p1.IsUsable()){ - p1.AddTo(*toAdd); - - - bd->CreateFixture(toAdd); - ++extra; - } else if (B2_POLYGON_REPORT_ERRORS){ - printf("Didn't add unusable polygon. Dumping vertices:\n"); - p1.print(); - } - if (p2.IsUsable()){ - p2.AddTo(pdarray[i+extra]); - - bd->CreateFixture(toAdd); - } else if (B2_POLYGON_REPORT_ERRORS){ - printf("Didn't add unusable polygon. Dumping vertices:\n"); - p2.print(); - } - goto Skip; - } - } - - } - if (decomposed[i].IsUsable()){ - decomposed[i].AddTo(*toAdd); - - bd->CreateFixture((const b2FixtureDef*)toAdd); - } else if (B2_POLYGON_REPORT_ERRORS){ - printf("Didn't add unusable polygon. Dumping vertices:\n"); - decomposed[i].print(); - } -Skip: - ; - } - delete[] pdarray; - delete[] decomposed; - return;// pdarray; //needs to be deleted after body is created -} - - - /** - * Find the convex hull of a point cloud using "Gift-wrap" algorithm - start - * with an extremal point, and walk around the outside edge by testing - * angles. - * - * Runs in O(N*S) time where S is number of sides of resulting polygon. - * Worst case: point cloud is all vertices of convex polygon -> O(N^2). - * - * There may be faster algorithms to do this, should you need one - - * this is just the simplest. You can get O(N log N) expected time if you - * try, I think, and O(N) if you restrict inputs to simple polygons. - * - * Returns null if number of vertices passed is less than 3. - * - * Results should be passed through convex decomposition afterwards - * to ensure that each shape has few enough points to be used in Box2d. - * - * FIXME?: May be buggy with colinear points on hull. Couldn't find a test - * case that resulted in wrong behavior. If one turns up, the solution is to - * supplement angle check with an equality resolver that always picks the - * longer edge. I think the current solution is working, though it sometimes - * creates an extra edge along a line. - */ - -b2Polygon ConvexHull(b2Vec2* v, int nVert) { - float32* cloudX = new float32[nVert]; - float32* cloudY = new float32[nVert]; - for (int32 i = 0; i < nVert; ++i) { - cloudX[i] = v[i].x; - cloudY[i] = v[i].y; - } - b2Polygon result = ConvexHull(cloudX, cloudY, nVert); - delete[] cloudX; - delete[] cloudY; - return result; -} - -b2Polygon ConvexHull(float32* cloudX, float32* cloudY, int32 nVert) { - b2Assert(nVert > 2); - int32* edgeList = new int32[nVert]; - int32 numEdges = 0; - - float32 minY = FLT_MAX; - int32 minYIndex = nVert; - for (int32 i = 0; i < nVert; ++i) { - if (cloudY[i] < minY) { - minY = cloudY[i]; - minYIndex = i; - } - } - - int32 startIndex = minYIndex; - int32 winIndex = -1; - float32 dx = -1.0f; - float32 dy = 0.0f; - while (winIndex != minYIndex) { - float32 newdx = 0.0f; - float32 newdy = 0.0f; - float32 maxDot = -2.0f; - for (int32 i = 0; i < nVert; ++i) { - if (i == startIndex) - continue; - newdx = cloudX[i] - cloudX[startIndex]; - newdy = cloudY[i] - cloudY[startIndex]; - float32 nrm = sqrtf(newdx * newdx + newdy * newdy); - nrm = (nrm == 0.0f) ? 1.0f : nrm; - newdx /= nrm; - newdy /= nrm; - - //Cross and dot products act as proxy for angle - //without requiring inverse trig. - //FIXED: don't need cross test - //float32 newCross = newdx * dy - newdy * dx; - float32 newDot = newdx * dx + newdy * dy; - if (newDot > maxDot) {//newCross >= 0.0f && newDot > maxDot) { - maxDot = newDot; - winIndex = i; - } - } - edgeList[numEdges++] = winIndex; - dx = cloudX[winIndex] - cloudX[startIndex]; - dy = cloudY[winIndex] - cloudY[startIndex]; - float32 nrm = sqrtf(dx * dx + dy * dy); - nrm = (nrm == 0.0f) ? 1.0f : nrm; - dx /= nrm; - dy /= nrm; - startIndex = winIndex; - } - - float32* xres = new float32[numEdges]; - float32* yres = new float32[numEdges]; - for (int32 i = 0; i < numEdges; i++) { - xres[i] = cloudX[edgeList[i]]; - yres[i] = cloudY[edgeList[i]]; - //("%f, %f\n",xres[i],yres[i]); - } - - b2Polygon returnVal(xres, yres, numEdges); - - delete[] xres; - delete[] yres; - delete[] edgeList; - returnVal.MergeParallelEdges(b2_angularSlop); - return returnVal; -} - - -/* - * Given sines and cosines, tells if A's angle is less than B's on -Pi, Pi - * (in other words, is A "righter" than B) - */ -bool IsRighter(float32 sinA, float32 cosA, float32 sinB, float32 cosB){ - if (sinA < 0){ - if (sinB > 0 || cosA <= cosB) return true; - else return false; - } else { - if (sinB < 0 || cosA <= cosB) return false; - else return true; - } -} - -//Fix for obnoxious behavior for the % operator for negative numbers... -int32 remainder(int32 x, int32 modulus){ - int32 rem = x % modulus; - while (rem < 0){ - rem += modulus; - } - return rem; -} - -/* -Method: -Start at vertex with minimum y (pick maximum x one if there are two). -We aim our "lastDir" vector at (1.0, 0) -We look at the two rays going off from our start vertex, and follow whichever -has the smallest angle (in -Pi -> Pi) wrt lastDir ("rightest" turn) - -Loop until we hit starting vertex: - -We add our current vertex to the list. -We check the seg from current vertex to next vertex for intersections - - if no intersections, follow to next vertex and continue - - if intersections, pick one with minimum distance - - if more than one, pick one with "rightest" next point (two possibilities for each) - -*/ - -b2Polygon TraceEdge(b2Polygon* p){ - b2PolyNode* nodes = new b2PolyNode[p->nVertices*p->nVertices];//overkill, but sufficient (order of mag. is right) - int32 nNodes = 0; - - //Add base nodes (raw outline) - for (int32 i=0; i < p->nVertices; ++i){ - b2Vec2 pos(p->x[i],p->y[i]); - nodes[i].position = pos; - ++nNodes; - int32 iplus = (i==p->nVertices-1)?0:i+1; - int32 iminus = (i==0)?p->nVertices-1:i-1; - nodes[i].AddConnection(nodes[iplus]); - nodes[i].AddConnection(nodes[iminus]); - } - - //Process intersection nodes - horribly inefficient - bool dirty = true; - int counter = 0; - while (dirty){ - dirty = false; - for (int32 i=0; i < nNodes; ++i){ - for (int32 j=0; j < nodes[i].nConnected; ++j){ - for (int32 k=0; k < nNodes; ++k){ - if (k==i || &nodes[k] == nodes[i].connected[j]) continue; - for (int32 l=0; l < nodes[k].nConnected; ++l){ - - if ( nodes[k].connected[l] == nodes[i].connected[j] || - nodes[k].connected[l] == &nodes[i]) continue; - //Check intersection - b2Vec2 intersectPt; - //if (counter > 100) printf("checking intersection: %d, %d, %d, %d\n",i,j,k,l); - bool crosses = intersect(nodes[i].position,nodes[i].connected[j]->position, - nodes[k].position,nodes[k].connected[l]->position, - intersectPt); - if (crosses){ - /*if (counter > 100) { - printf("Found crossing at %f, %f\n",intersectPt.x, intersectPt.y); - printf("Locations: %f,%f - %f,%f | %f,%f - %f,%f\n", - nodes[i].position.x, nodes[i].position.y, - nodes[i].connected[j]->position.x, nodes[i].connected[j]->position.y, - nodes[k].position.x,nodes[k].position.y, - nodes[k].connected[l]->position.x,nodes[k].connected[l]->position.y); - printf("Memory addresses: %d, %d, %d, %d\n",(int)&nodes[i],(int)nodes[i].connected[j],(int)&nodes[k],(int)nodes[k].connected[l]); - }*/ - dirty = true; - //Destroy and re-hook connections at crossing point - b2PolyNode* connj = nodes[i].connected[j]; - b2PolyNode* connl = nodes[k].connected[l]; - nodes[i].connected[j]->RemoveConnection(nodes[i]); - nodes[i].RemoveConnection(*connj); - nodes[k].connected[l]->RemoveConnection(nodes[k]); - nodes[k].RemoveConnection(*connl); - nodes[nNodes] = b2PolyNode(intersectPt); - nodes[nNodes].AddConnection(nodes[i]); - nodes[i].AddConnection(nodes[nNodes]); - nodes[nNodes].AddConnection(nodes[k]); - nodes[k].AddConnection(nodes[nNodes]); - nodes[nNodes].AddConnection(*connj); - connj->AddConnection(nodes[nNodes]); - nodes[nNodes].AddConnection(*connl); - connl->AddConnection(nodes[nNodes]); - ++nNodes; - goto SkipOut; - } - } - } - } - } - SkipOut: - ++counter; - //if (counter > 100) printf("Counter: %d\n",counter); - } - - /* - // Debugging: check for connection consistency - for (int32 i=0; inConnected == 0) b2Assert(false); - b2PolyNode* connect = nodes[i].connected[j]; - bool found = false; - for (int32 k=0; knConnected; ++k) { - if (connect->connected[k] == &nodes[i]) found = true; - } - b2Assert(found); - } - }*/ - - //Collapse duplicate points - bool foundDupe = true; - int nActive = nNodes; - while (foundDupe){ - foundDupe = false; - for (int32 i=0; i < nNodes; ++i){ - if (nodes[i].nConnected == 0) continue; - for (int32 j=i+1; j < nNodes; ++j){ - if (nodes[j].nConnected == 0) continue; - b2Vec2 diff = nodes[i].position - nodes[j].position; - if (diff.LengthSquared() <= COLLAPSE_DIST_SQR){ - if (nActive <= 3) return b2Polygon(); - //printf("Found dupe, %d left\n",nActive); - --nActive; - foundDupe = true; - b2PolyNode* inode = &nodes[i]; - b2PolyNode* jnode = &nodes[j]; - //Move all of j's connections to i, and orphan j - int32 njConn = jnode->nConnected; - for (int32 k=0; k < njConn; ++k){ - b2PolyNode* knode = jnode->connected[k]; - b2Assert(knode != jnode); - if (knode != inode) { - inode->AddConnection(*knode); - knode->AddConnection(*inode); - } - knode->RemoveConnection(*jnode); - //printf("knode %d on node %d now has %d connections\n",k,j,knode->nConnected); - //printf("Found duplicate point.\n"); - } - //printf("Orphaning node at address %d\n",(int)jnode); - //for (int32 k=0; kconnected[k]->IsConnectedTo(*jnode)) printf("Problem!!!\n"); - //} - /* - for (int32 k=0; k < njConn; ++k){ - jnode->RemoveConnectionByIndex(k); - }*/ - jnode->nConnected = 0; - } - } - } - } - - /* - // Debugging: check for connection consistency - for (int32 i=0; inConnected == 0) { - printf("Problem with node %d connection at address %d\n",i,(int)(nodes[i].connected[j])); - b2Assert(false); - } - b2PolyNode* connect = nodes[i].connected[j]; - bool found = false; - for (int32 k=0; knConnected; ++k) { - if (connect->connected[k] == &nodes[i]) found = true; - } - if (!found) printf("Connection %d (of %d) on node %d (of %d) did not have reciprocal connection.\n",j,nConn,i,nNodes); - b2Assert(found); - } - }//*/ - - //Now walk the edge of the list - - //Find node with minimum y value (max x if equal) - float32 minY = FLT_MAX; - float32 maxX = -FLT_MAX; - int32 minYIndex = -1; - for (int32 i = 0; i < nNodes; ++i) { - if (nodes[i].position.y < minY && nodes[i].nConnected > 1) { - minY = nodes[i].position.y; - minYIndex = i; - maxX = nodes[i].position.x; - } else if (nodes[i].position.y == minY && nodes[i].position.x > maxX && nodes[i].nConnected > 1) { - minYIndex = i; - maxX = nodes[i].position.x; - } - } - - b2Vec2 origDir(1.0f,0.0f); - b2Vec2* resultVecs = new b2Vec2[4*nNodes];// nodes may be visited more than once, unfortunately - change to growable array! - int32 nResultVecs = 0; - b2PolyNode* currentNode = &nodes[minYIndex]; - b2PolyNode* startNode = currentNode; - b2Assert(currentNode->nConnected > 0); - b2PolyNode* nextNode = currentNode->GetRightestConnection(origDir); - if (!nextNode) goto CleanUp; // Borked, clean up our mess and return - resultVecs[0] = startNode->position; - ++nResultVecs; - while (nextNode != startNode){ - if (nResultVecs > 4*nNodes){ - /* - printf("%d, %d, %d\n",(int)startNode,(int)currentNode,(int)nextNode); - printf("%f, %f -> %f, %f\n",currentNode->position.x,currentNode->position.y, nextNode->position.x, nextNode->position.y); - p->printFormatted(); - printf("Dumping connection graph: \n"); - for (int32 i=0; iposition.x, i,j,nodes[i].connected[j]->position.y); - } - } - printf("Dumping results thus far: \n"); - for (int32 i=0; iposition; - b2PolyNode* oldNode = currentNode; - currentNode = nextNode; - //printf("Old node connections = %d; address %d\n",oldNode->nConnected, (int)oldNode); - //printf("Current node connections = %d; address %d\n",currentNode->nConnected, (int)currentNode); - nextNode = currentNode->GetRightestConnection(oldNode); - if (!nextNode) goto CleanUp; // There was a problem, so jump out of the loop and use whatever garbage we've generated so far - //printf("nextNode address: %d\n",(int)nextNode); - } - - CleanUp: - - float32* xres = new float32[nResultVecs]; - float32* yres = new float32[nResultVecs]; - for (int32 i=0; iposition){ - isFound = true; - foundIndex = i; - break; - } - } - b2Assert(isFound); - --nConnected; - //printf("nConnected: %d\n",nConnected); - for (int32 i=foundIndex; i < nConnected; ++i){ - connected[i] = connected[i+1]; - } -} -void b2PolyNode::RemoveConnectionByIndex(int32 index){ - --nConnected; - //printf("New nConnected = %d\n",nConnected); - for (int32 i=index; i < nConnected; ++i){ - connected[i] = connected[i+1]; - } -} -bool b2PolyNode::IsConnectedTo(b2PolyNode& me){ - bool isFound = false; - for (int32 i=0; iposition){ - isFound = true; - break; - } - } - return isFound; -} -b2PolyNode* b2PolyNode::GetRightestConnection(b2PolyNode* incoming){ - if (nConnected == 0) b2Assert(false); // This means the connection graph is inconsistent - if (nConnected == 1) { - //b2Assert(false); - // Because of the possibility of collapsing nearby points, - // we may end up with "spider legs" dangling off of a region. - // The correct behavior here is to turn around. - return incoming; - } - b2Vec2 inDir = position - incoming->position; - float32 inLength = inDir.Normalize(); - b2Assert(inLength > FLT_EPSILON); - - b2PolyNode* result = NULL; - for (int32 i=0; iposition - position; - float32 testLengthSqr = testDir.LengthSquared(); - testDir.Normalize(); - /* - if (testLengthSqr < COLLAPSE_DIST_SQR) { - printf("Problem with connection %d\n",i); - printf("This node has %d connections\n",nConnected); - printf("That one has %d\n",connected[i]->nConnected); - if (this == connected[i]) printf("This points at itself.\n"); - }*/ - b2Assert (testLengthSqr >= COLLAPSE_DIST_SQR); - float32 myCos = b2Dot(inDir,testDir); - float32 mySin = b2Cross(inDir,testDir); - if (result){ - b2Vec2 resultDir = result->position - position; - resultDir.Normalize(); - float32 resCos = b2Dot(inDir,resultDir); - float32 resSin = b2Cross(inDir,resultDir); - if (IsRighter(mySin,myCos,resSin,resCos)){ - result = connected[i]; - } - } else{ - result = connected[i]; - } - } - if (B2_POLYGON_REPORT_ERRORS && !result) { - printf("nConnected = %d\n",nConnected); - for (int32 i=0; i0); - if (ccw){ - x[0] = x1; x[1] = x2; x[2] = x3; - y[0] = y1; y[1] = y2; y[2] = y3; - } else{ - x[0] = x1; x[1] = x3; x[2] = x2; - y[0] = y1; y[1] = y3; y[2] = y2; - } -} - -b2Triangle::b2Triangle(){ - x = new float32[3]; - y = new float32[3]; -} - -b2Triangle::~b2Triangle(){ - delete[] x; - delete[] y; -} - -void b2Triangle::Set(const b2Triangle& toMe) { - for (int32 i=0; i<3; ++i) { - x[i] = toMe.x[i]; - y[i] = toMe.y[i]; - } -} - -bool b2Triangle::IsInside(float32 _x, float32 _y){ - if (_x < x[0] && _x < x[1] && _x < x[2]) return false; - if (_x > x[0] && _x > x[1] && _x > x[2]) return false; - if (_y < y[0] && _y < y[1] && _y < y[2]) return false; - if (_y > y[0] && _y > y[1] && _y > y[2]) return false; - - float32 vx2 = _x-x[0]; float32 vy2 = _y-y[0]; - float32 vx1 = x[1]-x[0]; float32 vy1 = y[1]-y[0]; - float32 vx0 = x[2]-x[0]; float32 vy0 = y[2]-y[0]; - - float32 dot00 = vx0*vx0+vy0*vy0; - float32 dot01 = vx0*vx1+vy0*vy1; - float32 dot02 = vx0*vx2+vy0*vy2; - float32 dot11 = vx1*vx1+vy1*vy1; - float32 dot12 = vx1*vx2+vy1*vy2; - float32 invDenom = 1.0f / (dot00*dot11 - dot01*dot01); - float32 u = (dot11*dot02 - dot01*dot12)*invDenom; - float32 v = (dot00*dot12 - dot01*dot02)*invDenom; - - return ((u>=0)&&(v>=0)&&(u+v<=1)); -} - - - - - - diff --git a/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Triangle.h b/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Triangle.h deleted file mode 100644 index 82de16ed1..000000000 --- a/Extensions/PhysicsBehavior/Box2D/Contributions/Utilities/ConvexDecomposition/b2Triangle.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2007 Eric Jordan - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - -#ifndef B2_TRIANGLE_H -#define B2_TRIANGLE_H - -#include "b2Math.h" - -class b2Triangle{ -public: - float* x; - float* y; - b2Triangle(); - b2Triangle(float32 x1, float32 y1, float32 x2, float32 y2, float32 x3, float32 y3); - ~b2Triangle(); - bool IsInside(float32 _x, float32 _y); - void Set(const b2Triangle& toMe); - -}; - -#endif - - - - - - diff --git a/Extensions/PhysicsBehavior/CMakeLists.txt b/Extensions/PhysicsBehavior/CMakeLists.txt index 45727d2db..73c5f33f7 100644 --- a/Extensions/PhysicsBehavior/CMakeLists.txt +++ b/Extensions/PhysicsBehavior/CMakeLists.txt @@ -10,19 +10,12 @@ gd_add_extension_definitions(PhysicsBehavior) #The targets ### -include_directories(Box2D/Box2D) -file(GLOB_RECURSE box2d_source_files Box2D/Box2D/Box2D/*) -file(GLOB source_files * Box2D/Box2D/Box2D/* Triangulation/* ${box2d_source_files}) -file(GLOB formatted_source_files *.cpp *.h Triangulation/*.cpp Triangulation/*.h) -gd_add_clang_utils(PhysicsBehavior "${formatted_source_files}") - +include_directories(.) +file(GLOB source_files *.cpp *.h) +gd_add_clang_utils(PhysicsBehavior "${source_files}") gd_add_extension_target(PhysicsBehavior "${source_files}") -gdcpp_add_runtime_extension_target(PhysicsBehavior_Runtime "${source_files}") + #Linker files for the IDE extension ### gd_extension_link_libraries(PhysicsBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(PhysicsBehavior_Runtime) diff --git a/Extensions/PhysicsBehavior/ContactListener.cpp b/Extensions/PhysicsBehavior/ContactListener.cpp deleted file mode 100644 index e2e66fe32..000000000 --- a/Extensions/PhysicsBehavior/ContactListener.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#include "ContactListener.h" -#include "PhysicsRuntimeBehavior.h" - -void ContactListener::BeginContact(b2Contact *contact) { - if (!contact->GetFixtureA()->GetBody() || !contact->GetFixtureB()->GetBody()) - return; - - PhysicsRuntimeBehavior *behavior1 = static_cast( - contact->GetFixtureA()->GetBody()->GetUserData()); - PhysicsRuntimeBehavior *behavior2 = static_cast( - contact->GetFixtureB()->GetBody()->GetUserData()); - behavior1->currentContacts.insert(behavior2); - behavior2->currentContacts.insert(behavior1); -} - -void ContactListener::EndContact(b2Contact *contact) { - if (!contact->GetFixtureA()->GetBody() || !contact->GetFixtureB()->GetBody()) - return; - - PhysicsRuntimeBehavior *behavior1 = static_cast( - contact->GetFixtureA()->GetBody()->GetUserData()); - PhysicsRuntimeBehavior *behavior2 = static_cast( - contact->GetFixtureB()->GetBody()->GetUserData()); - behavior1->currentContacts.erase(behavior2); - behavior2->currentContacts.erase(behavior1); -} diff --git a/Extensions/PhysicsBehavior/ContactListener.h b/Extensions/PhysicsBehavior/ContactListener.h deleted file mode 100644 index 121ebd60d..000000000 --- a/Extensions/PhysicsBehavior/ContactListener.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#ifndef CONTACTLISTENER_H -#define CONTACTLISTENER_H - -#include "Box2D/Box2D.h" - -class ContactListener : public b2ContactListener { - public: - ContactListener() : b2ContactListener() {} - virtual ~ContactListener(){}; - - virtual void BeginContact(b2Contact* contact); - virtual void EndContact(b2Contact* contact); - - protected: - private: -}; - -#endif // CONTACTLISTENER_H diff --git a/Extensions/PhysicsBehavior/Extension.cpp b/Extensions/PhysicsBehavior/Extension.cpp index 8765363c0..b63f07b65 100644 --- a/Extensions/PhysicsBehavior/Extension.cpp +++ b/Extensions/PhysicsBehavior/Extension.cpp @@ -9,11 +9,10 @@ This project is released under the MIT License. * Victor Levasseur (Collisions using custom polygons, fixed time step fix) */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "PhysicsBehavior.h" -#include "PhysicsRuntimeBehavior.h" #include "ScenePhysicsDatas.h" -#include "RuntimeScenePhysicsDatas.h" void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -659,41 +658,3 @@ void DeclarePhysicsBehaviorExtension(gd::PlatformExtension& extension) { #endif } } - -/** - * \brief This class declares information about the extension. - */ -class PhysicsBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - PhysicsBehaviorCppExtension() { - DeclarePhysicsBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("PhysicsBehavior::PhysicsBehavior"), - "PhysicsRuntimeBehavior"); - GetBehaviorMetadata("PhysicsBehavior::PhysicsBehavior") - .SetIncludeFile("PhysicsBehavior/PhysicsRuntimeBehavior.h"); - - AddBehaviorsRuntimeSharedData( - GetBehaviorMetadata("PhysicsBehavior::PhysicsBehavior")); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppPhysicsBehaviorExtension() { - return new PhysicsBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new PhysicsBehaviorCppExtension; -} -#endif diff --git a/Extensions/PhysicsBehavior/PhysicsBehavior.cpp b/Extensions/PhysicsBehavior/PhysicsBehavior.cpp index 4427dd72a..492a80c7a 100644 --- a/Extensions/PhysicsBehavior/PhysicsBehavior.cpp +++ b/Extensions/PhysicsBehavior/PhysicsBehavior.cpp @@ -8,9 +8,8 @@ This project is released under the MIT License. #include "PhysicsBehavior.h" #include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "Triangulation/triangulate.h" +#include "GDCore/Project/Project.h" +#include "GDCore/Serialization/SerializerElement.h" #if defined(GD_IDE_ONLY) #include #include "GDCore/Project/PropertyDescriptor.h" diff --git a/Extensions/PhysicsBehavior/PhysicsBehavior.h b/Extensions/PhysicsBehavior/PhysicsBehavior.h index fea950f47..6b56bb5a7 100644 --- a/Extensions/PhysicsBehavior/PhysicsBehavior.h +++ b/Extensions/PhysicsBehavior/PhysicsBehavior.h @@ -11,8 +11,8 @@ This project is released under the MIT License. #include #include #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" #include "SFML/System/Vector2.hpp" namespace gd { class Project; diff --git a/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.cpp b/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.cpp deleted file mode 100644 index 7d7f46d82..000000000 --- a/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.cpp +++ /dev/null @@ -1,729 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "PhysicsRuntimeBehavior.h" -#include -#include "Box2D/Box2D.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "RuntimeScenePhysicsDatas.h" -#include "Triangulation/triangulate.h" - -#undef GetObject - -PhysicsRuntimeBehavior::PhysicsRuntimeBehavior( - const gd::SerializerElement &behaviorContent) - : RuntimeBehavior(behaviorContent), - shapeType(Box), - dynamic(true), - fixedRotation(false), - isBullet(false), - massDensity(1), - averageFriction(0.8), - averageRestitution(0), - linearDamping(0.1), - angularDamping(0.1), - body(NULL), - runtimeScenesPhysicsDatas(NULL) { - polygonHeight = 200; - polygonWidth = 200; - automaticResizing = false; - polygonPositioning = OnCenter; - polygonScaleX = 1; - polygonScaleY = 1; - - dynamic = behaviorContent.GetBoolAttribute("dynamic"); - fixedRotation = behaviorContent.GetBoolAttribute("fixedRotation"); - isBullet = behaviorContent.GetBoolAttribute("isBullet"); - massDensity = behaviorContent.GetDoubleAttribute("massDensity"); - averageFriction = behaviorContent.GetDoubleAttribute("averageFriction"); - averageRestitution = behaviorContent.GetDoubleAttribute("averageRestitution"); - - linearDamping = behaviorContent.GetDoubleAttribute("linearDamping"); - angularDamping = behaviorContent.GetDoubleAttribute("angularDamping"); - - gd::String shape = behaviorContent.GetStringAttribute("shapeType"); - if (shape == "Circle") - shapeType = Circle; - else if (shape == "CustomPolygon") - shapeType = CustomPolygon; - else - shapeType = Box; - - if (behaviorContent.GetStringAttribute("positioning", "OnOrigin") == - "OnOrigin") - polygonPositioning = OnOrigin; - else - polygonPositioning = OnCenter; - - automaticResizing = behaviorContent.GetBoolAttribute("autoResizing", false); - polygonWidth = behaviorContent.GetDoubleAttribute("polygonWidth"); - polygonHeight = behaviorContent.GetDoubleAttribute("polygonHeight"); - - gd::String coordsStr = behaviorContent.GetStringAttribute("coordsList"); - SetPolygonCoords( - PhysicsRuntimeBehavior::GetCoordsVectorFromString(coordsStr, '/', ';')); -} - -PhysicsRuntimeBehavior::~PhysicsRuntimeBehavior() { - if (runtimeScenesPhysicsDatas != NULL && body) - runtimeScenesPhysicsDatas->world->DestroyBody(body); -} - -/** - * Called at each frame before events : - * Simulate the world if necessary and update body positions. - */ -void PhysicsRuntimeBehavior::DoStepPreEvents(RuntimeScene &scene) { - if (!body) CreateBody(scene); - - if (!runtimeScenesPhysicsDatas - ->stepped) // Simulate the world, once at each frame - { - runtimeScenesPhysicsDatas->StepWorld( - static_cast(scene.GetTimeManager().GetElapsedTime()) / - 1000000.0, - 6, - 10); - runtimeScenesPhysicsDatas->stepped = true; - } - - // Update object position according to Box2D body - b2Vec2 position = body->GetPosition(); - object->SetX(position.x * runtimeScenesPhysicsDatas->GetScaleX() - - object->GetWidth() / 2 + object->GetX() - - object->GetDrawableX()); - object->SetY(-position.y * runtimeScenesPhysicsDatas->GetScaleY() - - object->GetHeight() / 2 + object->GetY() - - object->GetDrawableY()); // Y axis is inverted - object->SetAngle(-body->GetAngle() * 180.0f / b2_pi); // Angles are inverted - - objectOldX = object->GetX(); - objectOldY = object->GetY(); - objectOldAngle = object->GetAngle(); -}; - -/** - * Called at each frame after events : - * Update Box2D body if necessary - */ -void PhysicsRuntimeBehavior::DoStepPostEvents(RuntimeScene &scene) { - if (!body) CreateBody(scene); - - // Note: Strange bug here, using SpriteObject, the tests objectOldWidth != - // newWidth and objectOldHeight != newHeight keeps being true even if the two - // values were exactly the same. Maybe a floating point round error ( the - // values were integer yet in my tests! ) so we cast the values to int to - // ensure that the body is not continuously recreated. - float newWidth = object->GetWidth(); - float newHeight = object->GetHeight(); - if ((int)objectOldWidth != (int)newWidth || - (int)objectOldHeight != (int)newHeight) { - double oldAngularVelocity = body->GetAngularVelocity(); - b2Vec2 oldVelocity = body->GetLinearVelocity(); - - runtimeScenesPhysicsDatas->world->DestroyBody(body); - CreateBody(scene); - - body->SetAngularVelocity(oldAngularVelocity); - body->SetLinearVelocity(oldVelocity); - } - - runtimeScenesPhysicsDatas->stepped = false; // Prepare for a new simulation - - if (objectOldX == object->GetX() && objectOldY == object->GetY() && - objectOldAngle == object->GetAngle()) - return; - - b2Vec2 oldPos; - oldPos.x = (object->GetDrawableX() + object->GetWidth() / 2) * - runtimeScenesPhysicsDatas->GetInvScaleX(); - oldPos.y = -(object->GetDrawableY() + object->GetHeight() / 2) * - runtimeScenesPhysicsDatas->GetInvScaleY(); // Y axis is inverted - body->SetTransform( - oldPos, -object->GetAngle() * b2_pi / 180.0f); // Angles are inverted - body->SetAwake(true); -} - -/** - * Prepare Box2D body, and set up also runtimeScenePhysicsDatasPtr. - */ -void PhysicsRuntimeBehavior::CreateBody(const RuntimeScene &scene) { - if (runtimeScenesPhysicsDatas == NULL) - runtimeScenesPhysicsDatas = static_cast( - scene.GetBehaviorSharedData(name).get()); - - // Create body from object - b2BodyDef bodyDef; - bodyDef.type = dynamic ? b2_dynamicBody : b2_staticBody; - bodyDef.position.Set((object->GetDrawableX() + object->GetWidth() / 2) * - runtimeScenesPhysicsDatas->GetInvScaleX(), - -(object->GetDrawableY() + object->GetHeight() / 2) * - runtimeScenesPhysicsDatas->GetInvScaleY()); - bodyDef.angle = -object->GetAngle() * b2_pi / 180.0f; // Angles are inverted - bodyDef.angularDamping = angularDamping > 0.0f ? angularDamping : 0.0f; - bodyDef.linearDamping = linearDamping > 0.0f ? linearDamping : 0.0f; - bodyDef.bullet = isBullet; - bodyDef.fixedRotation = fixedRotation; - body = runtimeScenesPhysicsDatas->world->CreateBody(&bodyDef); - body->SetUserData(this); - - // Setup body - if (shapeType == Circle) { - b2FixtureDef fixtureDef; - - b2CircleShape circle; - circle.m_radius = - (object->GetWidth() * runtimeScenesPhysicsDatas->GetInvScaleX() + - object->GetHeight() * runtimeScenesPhysicsDatas->GetInvScaleY()) / - 4; // Radius is based on the average of height and width - if (circle.m_radius <= 0) circle.m_radius = 1; - fixtureDef.shape = &circle; - fixtureDef.density = massDensity; - fixtureDef.friction = averageFriction; - fixtureDef.restitution = averageRestitution; - - body->CreateFixture(&fixtureDef); - } else if (shapeType == CustomPolygon && polygonCoords.size() > 2) { - // Make a polygon triangulation to make possible to use a concave polygon - // and more than 8 edged polygons - std::vector resultOfTriangulation; - - Triangulate::Process(polygonCoords, resultOfTriangulation); - - // Iterate over all triangles - for (std::size_t i = 0; i < resultOfTriangulation.size() / 3; i++) { - b2FixtureDef fixtureDef; - b2PolygonShape dynamicBox; - - // Create vertices - b2Vec2 vertices[3]; - - std::size_t b = 0; - for (int a = 2; a >= 0; a--) // Box2D use another direction for vertices - { - if (polygonPositioning == OnOrigin) { - vertices[b].Set( - (resultOfTriangulation.at(i * 3 + a).x * GetPolygonScaleX() - - object->GetWidth() / 2 - - (object->GetDrawableX() - object->GetX())) * - runtimeScenesPhysicsDatas->GetInvScaleX(), - (((object->GetHeight() - - (resultOfTriangulation.at(i * 3 + a).y * GetPolygonScaleY())) - - object->GetHeight() / 2 + - (object->GetDrawableY() - object->GetY())) * - runtimeScenesPhysicsDatas->GetInvScaleY())); - } - /*else if(polygonPositioning == OnTopLeftCorner) - { - vertices[b].Set((resultOfTriangulation.at(i*3 + a).x * - GetPolygonScaleX() - object->GetWidth()/2 ) * - runtimeScenesPhysicsDatas->GetInvScaleX(), - (((object->GetHeight() - - (resultOfTriangulation.at(i*3 + a).y * GetPolygonScaleY())) - - object->GetHeight()/2) * - runtimeScenesPhysicsDatas->GetInvScaleY())); - }*/ - else if (polygonPositioning == OnCenter) { - vertices[b].Set( - (resultOfTriangulation.at(i * 3 + a).x * GetPolygonScaleX()) * - runtimeScenesPhysicsDatas->GetInvScaleX(), - (((object->GetHeight() - - (resultOfTriangulation.at(i * 3 + a).y * GetPolygonScaleY())) - - object->GetHeight()) * - runtimeScenesPhysicsDatas->GetInvScaleY())); - } - - b++; - } - - dynamicBox.Set(vertices, 3); - - fixtureDef.shape = &dynamicBox; - fixtureDef.density = massDensity; - fixtureDef.friction = averageFriction; - fixtureDef.restitution = averageRestitution; - - body->CreateFixture(&fixtureDef); - } - } else { - b2FixtureDef fixtureDef; - - b2PolygonShape dynamicBox; - dynamicBox.SetAsBox((object->GetWidth() > 0 ? object->GetWidth() : 1.0f) * - runtimeScenesPhysicsDatas->GetInvScaleX() / 2, - (object->GetHeight() > 0 ? object->GetHeight() : 1.0f) * - runtimeScenesPhysicsDatas->GetInvScaleY() / 2); - fixtureDef.shape = &dynamicBox; - fixtureDef.density = massDensity; - fixtureDef.friction = averageFriction; - fixtureDef.restitution = averageRestitution; - - body->CreateFixture(&fixtureDef); - } - - objectOldWidth = object->GetWidth(); - objectOldHeight = object->GetHeight(); -} - -void PhysicsRuntimeBehavior::OnDeActivate() { - if (runtimeScenesPhysicsDatas && body) { - runtimeScenesPhysicsDatas->world->DestroyBody(body); - body = NULL; // Of course: body can ( and will ) be reused: Make sure we - // nullify the pointer as the body was destroyed. - } -} - -/** - * Set a body to be static - */ -void PhysicsRuntimeBehavior::SetStatic(RuntimeScene &scene) { - dynamic = false; - - if (!body) CreateBody(scene); - body->SetType(b2_staticBody); -} - -/** - * Set a body to be dynamic - */ -void PhysicsRuntimeBehavior::SetDynamic(RuntimeScene &scene) { - dynamic = true; - - if (!body) CreateBody(scene); - body->SetType(b2_dynamicBody); - body->SetAwake(true); -} - -/** - * Set rotation to be fixed - */ -void PhysicsRuntimeBehavior::SetFixedRotation(RuntimeScene &scene) { - fixedRotation = true; - - if (!body) CreateBody(scene); - body->SetFixedRotation(true); -} - -/** - * Set rotation to be free - */ -void PhysicsRuntimeBehavior::SetFreeRotation(RuntimeScene &scene) { - fixedRotation = false; - - if (!body) CreateBody(scene); - body->SetFixedRotation(false); -} - -/** - * Consider object as bullet, for better collision handling - */ -void PhysicsRuntimeBehavior::SetAsBullet(RuntimeScene &scene) { - isBullet = true; - - if (!body) CreateBody(scene); - body->SetBullet(true); -} - -/** - * Don't consider object as bullet, for faster collision handling - */ -void PhysicsRuntimeBehavior::DontSetAsBullet(RuntimeScene &scene) { - isBullet = false; - - if (!body) CreateBody(scene); - body->SetBullet(false); -} - -/** - * Apply an impulse - */ -void PhysicsRuntimeBehavior::ApplyImpulse(double xCoordinate, - double yCoordinate, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->ApplyLinearImpulse(b2Vec2(xCoordinate, -yCoordinate), - body->GetPosition()); -} - -/** - * Apply a impulse - */ -void PhysicsRuntimeBehavior::ApplyImpulseUsingPolarCoordinates( - float angle, float length, RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->ApplyLinearImpulse(b2Vec2(cos(angle * b2_pi / 180.0f) * length, - -sin(angle * b2_pi / 180.0f) * length), - body->GetPosition()); -} - -/** - * Apply a impulse - */ -void PhysicsRuntimeBehavior::ApplyImpulseTowardPosition(float xPosition, - float yPosition, - float length, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - float angle = atan2(yPosition * runtimeScenesPhysicsDatas->GetInvScaleY() + - body->GetPosition().y, - xPosition * runtimeScenesPhysicsDatas->GetInvScaleX() - - body->GetPosition().x); - - body->ApplyLinearImpulse(b2Vec2(cos(angle) * length, -sin(angle) * length), - body->GetPosition()); -} - -/** - * Apply a force - */ -void PhysicsRuntimeBehavior::ApplyForce(double xCoordinate, - double yCoordinate, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->ApplyForce(b2Vec2(xCoordinate, -yCoordinate), body->GetPosition()); -} - -/** - * Apply a force - */ -void PhysicsRuntimeBehavior::ApplyForceUsingPolarCoordinates( - float angle, float length, RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->ApplyForce(b2Vec2(cos(angle * b2_pi / 180.0f) * length, - -sin(angle * b2_pi / 180.0f) * length), - body->GetPosition()); -} - -/** - * Apply a force - */ -void PhysicsRuntimeBehavior::ApplyForceTowardPosition(float xPosition, - float yPosition, - float length, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - float angle = atan2(yPosition * runtimeScenesPhysicsDatas->GetInvScaleY() + - body->GetPosition().y, - xPosition * runtimeScenesPhysicsDatas->GetInvScaleX() - - body->GetPosition().x); - - body->ApplyForce(b2Vec2(cos(angle) * length, -sin(angle) * length), - body->GetPosition()); -} - -/** - * Apply a torque - */ -void PhysicsRuntimeBehavior::ApplyTorque(double torque, RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->ApplyTorque(torque); -} - -/** - * Change linear velocity - */ -void PhysicsRuntimeBehavior::SetLinearVelocity(double xVelocity, - double yVelocity, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->SetLinearVelocity(b2Vec2(xVelocity, -yVelocity)); -} - -/** - * Change angular velocity - */ -void PhysicsRuntimeBehavior::SetAngularVelocity(double angularVelocity, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->SetAngularVelocity(angularVelocity); -} - -/** - * Change linear damping - */ -void PhysicsRuntimeBehavior::SetLinearDamping(float linearDamping_, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->SetLinearDamping(linearDamping_); -} - -/** - * Change angular damping - */ -void PhysicsRuntimeBehavior::SetAngularDamping(float angularDamping_, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - body->SetAngularDamping(angularDamping_); -} - -/** - * Add an hinge between two objects - */ -void PhysicsRuntimeBehavior::AddRevoluteJointBetweenObjects( - RuntimeObject *object, - RuntimeScene &scene, - float xPosRelativeToMassCenter, - float yPosRelativeToMassCenter) { - if (!body) CreateBody(scene); - - if (object == NULL || !object->HasBehaviorNamed(name)) return; - b2Body *otherBody = - static_cast(object->GetBehaviorRawPointer(name)) - ->GetBox2DBody(scene); - - if (body == otherBody) return; - - b2RevoluteJointDef jointDef; - jointDef.Initialize( - body, - otherBody, - body->GetWorldCenter() + - b2Vec2(xPosRelativeToMassCenter * - runtimeScenesPhysicsDatas->GetInvScaleX(), - yPosRelativeToMassCenter * - runtimeScenesPhysicsDatas->GetInvScaleY())); - runtimeScenesPhysicsDatas->world->CreateJoint(&jointDef); -} - -/** - * Add an hinge to an object - */ -void PhysicsRuntimeBehavior::AddRevoluteJoint(float xPosition, - float yPosition, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - b2RevoluteJointDef jointDef; - jointDef.Initialize( - body, - runtimeScenesPhysicsDatas->staticBody, - b2Vec2(xPosition * runtimeScenesPhysicsDatas->GetInvScaleX(), - -yPosition * runtimeScenesPhysicsDatas->GetInvScaleY())); - - runtimeScenesPhysicsDatas->world->CreateJoint(&jointDef); -} - -/** - * Change gravity - */ -void PhysicsRuntimeBehavior::SetGravity(float xGravity, - float yGravity, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - runtimeScenesPhysicsDatas->world->SetGravity(b2Vec2(xGravity, -yGravity)); -} - -/** - * Add a gear joint between two objects - */ -void PhysicsRuntimeBehavior::AddGearJointBetweenObjects(RuntimeObject *object, - float ratio, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - if (object == NULL || !object->HasBehaviorNamed(name)) return; - b2Body *otherBody = - static_cast(object->GetBehaviorRawPointer(name)) - ->GetBox2DBody(scene); - - if (body == otherBody) return; - - // Gear joint need a revolute joint to the ground for the two objects - b2RevoluteJointDef jointDef1; - jointDef1.Initialize( - runtimeScenesPhysicsDatas->staticBody, body, body->GetWorldCenter()); - - b2RevoluteJointDef jointDef2; - jointDef2.Initialize(runtimeScenesPhysicsDatas->staticBody, - otherBody, - otherBody->GetWorldCenter()); - - b2GearJointDef jointDef; - jointDef.bodyA = body; - jointDef.bodyB = otherBody; - jointDef.joint1 = runtimeScenesPhysicsDatas->world->CreateJoint(&jointDef1); - jointDef.joint2 = runtimeScenesPhysicsDatas->world->CreateJoint(&jointDef2); - jointDef.ratio = ratio * b2_pi; - - runtimeScenesPhysicsDatas->world->CreateJoint(&jointDef); -} - -void PhysicsRuntimeBehavior::SetLinearVelocityX(double xVelocity, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - body->SetLinearVelocity(b2Vec2(xVelocity, body->GetLinearVelocity().y)); -} -void PhysicsRuntimeBehavior::SetLinearVelocityY(double yVelocity, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - body->SetLinearVelocity(b2Vec2(body->GetLinearVelocity().x, -yVelocity)); -} -float PhysicsRuntimeBehavior::GetLinearVelocityX(RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return body->GetLinearVelocity().x; -} -float PhysicsRuntimeBehavior::GetLinearVelocityY(RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return -body->GetLinearVelocity().y; -} -float PhysicsRuntimeBehavior::GetLinearVelocity(RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return sqrt(body->GetLinearVelocity().x * body->GetLinearVelocity().x + - body->GetLinearVelocity().y * body->GetLinearVelocity().y); -} -double PhysicsRuntimeBehavior::GetAngularVelocity(const RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return body->GetAngularVelocity(); -} -double PhysicsRuntimeBehavior::GetLinearDamping(const RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return body->GetLinearDamping(); -} -double PhysicsRuntimeBehavior::GetAngularDamping(const RuntimeScene &scene) { - if (!body) CreateBody(scene); - - return body->GetAngularDamping(); -} - -/** - * Test if there is a contact with another object - */ -bool PhysicsRuntimeBehavior::CollisionWith( - std::map *> otherObjectsLists, - RuntimeScene &scene) { - if (!body) CreateBody(scene); - - // Getting a list of all objects which are tested - std::vector objects; - for (std::map *>::const_iterator it = - otherObjectsLists.begin(); - it != otherObjectsLists.end(); - ++it) { - if (it->second != NULL) { - objects.reserve(objects.size() + it->second->size()); - std::copy( - it->second->begin(), it->second->end(), std::back_inserter(objects)); - } - } - - // Test if an object of the list is in collision with our object. - std::vector::const_iterator obj_end = objects.end(); - for (std::vector::iterator obj = objects.begin(); - obj != obj_end; - ++obj) { - std::set::const_iterator it = - currentContacts.begin(); - std::set::const_iterator end = - currentContacts.end(); - for (; it != end; ++it) { - if ((*it)->GetObject() == (*obj)) return true; - } - } - - return false; -} - -bool PhysicsRuntimeBehavior::IsStatic() { return !dynamic; } - -bool PhysicsRuntimeBehavior::IsDynamic() { return dynamic; } - -void PhysicsRuntimeBehavior::SetPolygonCoords( - const std::vector &vec) { - polygonCoords = vec; -} - -const std::vector &PhysicsRuntimeBehavior::GetPolygonCoords() - const { - return polygonCoords; -} - -bool PhysicsRuntimeBehavior::HasAutomaticResizing() const { - return automaticResizing; -} - -void PhysicsRuntimeBehavior::SetAutomaticResizing(bool b) { - automaticResizing = b; -} - -float PhysicsRuntimeBehavior::GetPolygonScaleX() const { - if (automaticResizing) - return object->GetWidth() / polygonWidth; - else - return polygonScaleX; -} - -void PhysicsRuntimeBehavior::SetPolygonScaleX(float scX, RuntimeScene &scene) { - polygonScaleX = scX; - - runtimeScenesPhysicsDatas->world->DestroyBody(body); - CreateBody(scene); -} - -float PhysicsRuntimeBehavior::GetPolygonScaleY() const { - if (automaticResizing) - return object->GetHeight() / polygonHeight; - else - return polygonScaleY; -} - -void PhysicsRuntimeBehavior::SetPolygonScaleY(float scY, RuntimeScene &scene) { - polygonScaleY = scY; - - runtimeScenesPhysicsDatas->world->DestroyBody(body); - CreateBody(scene); -} - -gd::String PhysicsRuntimeBehavior::GetStringFromCoordsVector( - const std::vector &vec, - char32_t coordsSep, - char32_t composantSep) { - gd::String coordsStr; - - for (std::size_t a = 0; a < vec.size(); a++) { - coordsStr += gd::String::From(vec.at(a).x); - coordsStr.push_back(composantSep); - coordsStr += gd::String::From(vec.at(a).y); - if (a != vec.size() - 1) coordsStr.push_back(coordsSep); - } - - return coordsStr; -} - -std::vector PhysicsRuntimeBehavior::GetCoordsVectorFromString( - const gd::String &str, char32_t coordsSep, char32_t composantSep) { - std::vector coordsVec; - - std::vector coordsDecomposed = str.Split(coordsSep); - - for (std::size_t a = 0; a < coordsDecomposed.size(); a++) { - std::vector coordXY = - coordsDecomposed.at(a).Split(composantSep); - - if (coordXY.size() != 2) continue; - - sf::Vector2f newCoord(coordXY.at(0).To(), coordXY.at(1).To()); - coordsVec.push_back(newCoord); - } - - return coordsVec; -} diff --git a/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.h b/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.h deleted file mode 100644 index c198375a0..000000000 --- a/Extensions/PhysicsBehavior/PhysicsRuntimeBehavior.h +++ /dev/null @@ -1,195 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PHYSICSRUNTIMEBEHAVIOR_H -#define PHYSICSRUNTIMEBEHAVIOR_H -#include -#include -#include -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "SFML/Config.hpp" -#include "SFML/System/Vector2.hpp" -namespace gd { -class Project; -class Layout; -class SerializerElement; -} -class RuntimeScene; -class b2Body; -class RuntimeScenePhysicsDatas; - -namespace sf { -class Clock; -} - -class GD_EXTENSION_API PhysicsRuntimeBehavior : public RuntimeBehavior { - public: - PhysicsRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~PhysicsRuntimeBehavior(); - virtual PhysicsRuntimeBehavior *Clone() const { return new PhysicsRuntimeBehavior(*this); } - - enum Positioning { OnOrigin = 0, OnCenter = 2 }; - - /** - * Destroy Box2D body if behavior is deactivated - */ - virtual void OnDeActivate(); - - b2Body *GetBox2DBody(const RuntimeScene &scene) { - if (!body) CreateBody(scene); - return body; - } - inline RuntimeObject *GetObject() { return object; }; - inline const RuntimeObject *GetObject() const { return object; }; - - std::set - currentContacts; ///< List of other bodies that are in contact with this - ///< body. - - void SetStatic(RuntimeScene &scene); - void SetDynamic(RuntimeScene &scene); - bool IsStatic(); - bool IsDynamic(); - void SetFixedRotation(RuntimeScene &scene); - void SetFreeRotation(RuntimeScene &scene); - void SetAsBullet(RuntimeScene &scene); - void DontSetAsBullet(RuntimeScene &scene); - void ApplyForce(double xCoordinate, double yCoordinate, RuntimeScene &scene); - void ApplyForceUsingPolarCoordinates(float angle, - float length, - RuntimeScene &scene); - void ApplyForceTowardPosition(float xPosition, - float yPosition, - float length, - RuntimeScene &scene); - void ApplyImpulse(double xCoordinate, - double yCoordinate, - RuntimeScene &scene); - void ApplyImpulseUsingPolarCoordinates(float angle, - float length, - RuntimeScene &scene); - void ApplyImpulseTowardPosition(float xPosition, - float yPosition, - float length, - RuntimeScene &scene); - void ApplyTorque(double torque, RuntimeScene &scene); - void SetLinearVelocity(double xVelocity, - double yVelocity, - RuntimeScene &scene); - void SetAngularVelocity(double angularVelocity, RuntimeScene &scene); - void SetLinearDamping(float linearDamping_, RuntimeScene &scene); - void SetAngularDamping(float angularDamping_, RuntimeScene &scene); - void AddRevoluteJointBetweenObjects(RuntimeObject *object, - RuntimeScene &scene, - float xPosRelativeToMassCenter, - float yPosRelativeToMassCenter); - void AddRevoluteJoint(float xPosition, float yPosition, RuntimeScene &scene); - void SetGravity(float xGravity, float yGravity, RuntimeScene &scene); - void AddGearJointBetweenObjects(RuntimeObject *object, - float ratio, - RuntimeScene &scene); - - void SetLinearVelocityX(double xVelocity, RuntimeScene &scene); - void SetLinearVelocityY(double yVelocity, RuntimeScene &scene); - float GetLinearVelocityX(RuntimeScene &scene); - float GetLinearVelocityY(RuntimeScene &scene); - float GetLinearVelocity(RuntimeScene &scene); - double GetAngularVelocity(const RuntimeScene &scene); - double GetLinearDamping(const RuntimeScene &scene); - double GetAngularDamping(const RuntimeScene &scene); - - void SetPolygonCoords(const std::vector &); - const std::vector &GetPolygonCoords() const; - - bool HasAutomaticResizing() const; - void SetAutomaticResizing(bool); - - float GetPolygonScaleX() const; - void SetPolygonScaleX(float, RuntimeScene &); - - float GetPolygonScaleY() const; - void SetPolygonScaleY(float, RuntimeScene &); - - /** - Return a string representing the coordinates vector. - \param vec the vector containing coordinates - \param coordsSep the separator between coordinates - \param composantSep the separator between the X and Y composant of a - coordinate \return a gd::String representing the vector - */ - static gd::String GetStringFromCoordsVector( - const std::vector &vec, - char32_t coordsSep = U'\n', - char32_t composantSep = U';'); - - /** - Return a vector created with a string containing coordinates - \param str the string - \param coordsSep the separator between coordinates - \param composantSep the separator between the X and Y composant of a - coordinate \return a std::vector< sf::Vector2f > - */ - static std::vector GetCoordsVectorFromString( - const gd::String &str, - char32_t coordsSep = U'\n', - char32_t composantSep = U';'); - - bool CollisionWith( - std::map *> otherObjectsLists, - RuntimeScene &scene); - - private: - virtual void DoStepPreEvents(RuntimeScene &scene); - virtual void DoStepPostEvents(RuntimeScene &scene); - void CreateBody(const RuntimeScene &scene); - - enum ShapeType { - Box, - Circle, - CustomPolygon - } shapeType; ///< the kind of hitbox -> Box, Circle or CustomPolygon - Positioning polygonPositioning; - std::vector - polygonCoords; ///< The list of coordinates of the collision polygon - - bool automaticResizing; - float polygonWidth; ///< ONLY for automatic resizing, used to define a scale - ///< with automatic resizing - float polygonHeight; ///< ONLY for automatic resizing, used to define a scale - ///< with automatic resizing - - float polygonScaleX; ///< ONLY for non-automatic resizing -> Use - ///< GetPolygonScaleX() instead to be sure to get a - ///< correct value - float polygonScaleY; ///< ONLY for non-automatic resizing -> Use - ///< GetPolygonScaleY() instead to be sure to get a - ///< correct value - - bool dynamic; ///< Is the object static or dynamic - bool fixedRotation; ///< Is the rotation fixed or not - bool isBullet; ///< True if the object as to be considered as a bullet ( for - ///< better collision handling ) - float massDensity; - float averageFriction; - float averageRestitution; - float linearDamping; - float angularDamping; - - float objectOldX; - float objectOldY; - float objectOldAngle; - float objectOldWidth; - float objectOldHeight; - - sf::Clock *stepClock; - - b2Body *body; ///< Box2D body, representing the object in the Box2D world - RuntimeScenePhysicsDatas *runtimeScenesPhysicsDatas; -}; - -#endif // PHYSICSRUNTIMEBEHAVIOR_H diff --git a/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.cpp b/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.cpp deleted file mode 100644 index 7ddd89afb..000000000 --- a/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "RuntimeScenePhysicsDatas.h" -#include -#include "Box2D/Box2D.h" -#include "ContactListener.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "ScenePhysicsDatas.h" - -RuntimeScenePhysicsDatas::RuntimeScenePhysicsDatas( - const gd::SerializerElement& behaviorSharedDataContent) - : BehaviorsRuntimeSharedData(behaviorSharedDataContent), - world(new b2World( - b2Vec2(behaviorSharedDataContent.GetDoubleAttribute("gravityX"), - -behaviorSharedDataContent.GetDoubleAttribute("gravityY")), - true)), - contactListener(new ContactListener), - staticBody(NULL), - stepped(false), - scaleX(behaviorSharedDataContent.GetDoubleAttribute("scaleX")), - scaleY(behaviorSharedDataContent.GetDoubleAttribute("scaleY")), - invScaleX(1 / scaleX), - invScaleY(1 / scaleY), - fixedTimeStep(1.f / 60.f), - maxSteps(5), - totalTime(0) { - world->SetContactListener(contactListener); - world->SetAutoClearForces(false); - - b2BodyDef bodyWithoutFixture; - staticBody = world->CreateBody(&bodyWithoutFixture); -} - -void RuntimeScenePhysicsDatas::StepWorld(float dt, int v, int p) { - totalTime += dt; - - if (totalTime > fixedTimeStep) { - std::size_t numberOfSteps(std::floor(totalTime / fixedTimeStep)); - totalTime -= numberOfSteps * fixedTimeStep; - - std::size_t numberOfStepToProcess = std::min(numberOfSteps, maxSteps); - - for (std::size_t a = 0; a < numberOfStepToProcess; a++) { - world->Step(fixedTimeStep, v, p); - world->ClearForces(); - } - } -} - -RuntimeScenePhysicsDatas::~RuntimeScenePhysicsDatas() { - delete world; - delete contactListener; -} diff --git a/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.h b/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.h deleted file mode 100644 index fb2424d35..000000000 --- a/Extensions/PhysicsBehavior/RuntimeScenePhysicsDatas.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - -GDevelop - Physics Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef RUNTIMESCENEPHYSICSDATAS_H -#define RUNTIMESCENEPHYSICSDATAS_H -namespace gd { -class SerializerElement; -} -class b2World; -class b2Body; -#include "GDCpp/Runtime/BehaviorsRuntimeSharedData.h" -class ScenePhysicsDatas; -class ContactListener; - -/** - * Datas shared by Physics Behavior at runtime - */ -class RuntimeScenePhysicsDatas : public BehaviorsRuntimeSharedData { - public: - RuntimeScenePhysicsDatas( - const gd::SerializerElement& behaviorSharedDataContent); - virtual ~RuntimeScenePhysicsDatas(); - virtual std::shared_ptr Clone() const { - return std::shared_ptr( - new RuntimeScenePhysicsDatas(*this)); - } - - b2World* world; - ContactListener* contactListener; - b2Body* - staticBody; ///< A simple static body with no fixture. Used for joints. - bool stepped; ///< Used to be sure that Step is called only once at each - ///< frame. - - /** - * Get the scale between world coordinates and scene pixels in x axis - */ - inline float GetScaleX() const { return scaleX; } - - /** - * Get the scale between world coordinates and scene pixels in y axis - */ - inline float GetScaleY() const { return scaleY; } - - /** - * Get inverse of scale X - */ - inline float GetInvScaleX() const { return invScaleX; } - - /** - * Get inverse of scale Y - */ - inline float GetInvScaleY() const { return invScaleY; } - - /** - * Call world->Step(), ensuring that the timeStep passed to Step() is fixed. - * This method is to be called once a frame ( by PhysicsBehavior ). - */ - void StepWorld(float dt, int v, int p); - - private: - float scaleX; - float scaleY; - float invScaleX; - float invScaleY; - - float - fixedTimeStep; ///< Time step between to call to world->Step(...). Box2D - ///< need a fixed time step to ensure reliable simulation. - std::size_t - maxSteps; ///< Maximum steps per frames, to prevent slow down (a slow - ///< down will force the computer to make more steps which will - ///< force it to make even more steps...) - - float totalTime; -}; - -#endif // RUNTIMESCENEPHYSICSDATAS_H diff --git a/Extensions/PhysicsBehavior/ScenePhysicsDatas.h b/Extensions/PhysicsBehavior/ScenePhysicsDatas.h index e76e3db94..e5066f67f 100644 --- a/Extensions/PhysicsBehavior/ScenePhysicsDatas.h +++ b/Extensions/PhysicsBehavior/ScenePhysicsDatas.h @@ -8,8 +8,7 @@ This project is released under the MIT License. #ifndef SCENEPHYSICSDATAS_H #define SCENEPHYSICSDATAS_H -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" -#include "RuntimeScenePhysicsDatas.h" +#include "GDCore/Project/BehaviorsSharedData.h" /** * \brief Handle the data shared by Physics Behavior diff --git a/Extensions/PhysicsBehavior/Triangulation/triangulate.cpp b/Extensions/PhysicsBehavior/Triangulation/triangulate.cpp deleted file mode 100644 index 896b9b590..000000000 --- a/Extensions/PhysicsBehavior/Triangulation/triangulate.cpp +++ /dev/null @@ -1,147 +0,0 @@ -#include -#include -#include -#include - -#include "triangulate.h" - -static const float EPSILON = 0.0000000001f; - -float Triangulate::Area(const Vector2fVector &contour) { - int n = contour.size(); - - float A = 0.0f; - - for (int p = n - 1, q = 0; q < n; p = q++) { - A += contour[p].x * contour[q].y - contour[q].x * contour[p].y; - } - return A * 0.5f; -} - -/* - InsideTriangle decides if a point P is Inside of the triangle - defined by A, B, C. -*/ -bool Triangulate::InsideTriangle(float Ax, - float Ay, - float Bx, - float By, - float Cx, - float Cy, - float Px, - float Py) - -{ - float ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy; - float cCROSSap, bCROSScp, aCROSSbp; - - ax = Cx - Bx; - ay = Cy - By; - bx = Ax - Cx; - by = Ay - Cy; - cx = Bx - Ax; - cy = By - Ay; - apx = Px - Ax; - apy = Py - Ay; - bpx = Px - Bx; - bpy = Py - By; - cpx = Px - Cx; - cpy = Py - Cy; - - aCROSSbp = ax * bpy - ay * bpx; - cCROSSap = cx * apy - cy * apx; - bCROSScp = bx * cpy - by * cpx; - - return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); -}; - -bool Triangulate::Snip( - const Vector2fVector &contour, int u, int v, int w, int n, int *V) { - int p; - float Ax, Ay, Bx, By, Cx, Cy, Px, Py; - - Ax = contour[V[u]].x; - Ay = contour[V[u]].y; - - Bx = contour[V[v]].x; - By = contour[V[v]].y; - - Cx = contour[V[w]].x; - Cy = contour[V[w]].y; - - if (EPSILON > (((Bx - Ax) * (Cy - Ay)) - ((By - Ay) * (Cx - Ax)))) - return false; - - for (p = 0; p < n; p++) { - if ((p == u) || (p == v) || (p == w)) continue; - Px = contour[V[p]].x; - Py = contour[V[p]].y; - if (InsideTriangle(Ax, Ay, Bx, By, Cx, Cy, Px, Py)) return false; - } - - return true; -} - -bool Triangulate::Process(const Vector2fVector &contour, - Vector2fVector &result) { - /* allocate and initialize list of Vertices in polygon */ - - int n = contour.size(); - if (n < 3) return false; - - int *V = new int[n]; - - /* we want a counter-clockwise polygon in V */ - - if (0.0f < Area(contour)) - for (int v = 0; v < n; v++) V[v] = v; - else - for (int v = 0; v < n; v++) V[v] = (n - 1) - v; - - int nv = n; - - /* remove nv-2 Vertices, creating 1 triangle every time */ - int count = 2 * nv; /* error detection */ - - for (int m = 0, v = nv - 1; nv > 2;) { - /* if we loop, it is probably a non-simple polygon */ - if (0 >= (count--)) { - //** Triangulate: ERROR - probable bad polygon! - return false; - } - - /* three consecutive vertices in current polygon, */ - int u = v; - if (nv <= u) u = 0; /* previous */ - v = u + 1; - if (nv <= v) v = 0; /* new v */ - int w = v + 1; - if (nv <= w) w = 0; /* next */ - - if (Snip(contour, u, v, w, nv, V)) { - int a, b, c, s, t; - - /* true names of the vertices */ - a = V[u]; - b = V[v]; - c = V[w]; - - /* output Triangle */ - result.push_back(contour[a]); - result.push_back(contour[b]); - result.push_back(contour[c]); - - m++; - - /* remove v from remaining polygon */ - for (s = v, t = v + 1; t < nv; s++, t++) V[s] = V[t]; - nv--; - - /* resest error detection counter */ - count = 2 * nv; - } - } - delete V; - - return true; -} diff --git a/Extensions/PhysicsBehavior/Triangulation/triangulate.h b/Extensions/PhysicsBehavior/Triangulation/triangulate.h deleted file mode 100644 index 981c1ea1d..000000000 --- a/Extensions/PhysicsBehavior/Triangulation/triangulate.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef TRIANGULATE_H - -#define TRIANGULATE_H - -/*****************************************************************/ -/** Static class to triangulate any contour/polygon efficiently **/ -/** You should replace Vector2d with whatever your own Vector **/ -/** class might be. Does not support polygons with holes. **/ -/** Uses STL vectors to represent a dynamic array of vertices. **/ -/** This code snippet was submitted to FlipCode.com by **/ -/** John W. Ratcliff (jratcliff@verant.com) on July 22, 2000 **/ -/** I did not write the original code/algorithm for this **/ -/** this triangulator, in fact, I can't even remember where I **/ -/** found it in the first place. However, I did rework it into **/ -/** the following black-box static class so you can make easy **/ -/** use of it in your own code. Simply replace Vector2d with **/ -/** whatever your own Vector implementation might be. **/ -/*****************************************************************/ - -#include // Include STL vector class. -#include "SFML/Config.hpp" -#include "SFML/System/Vector2.hpp" - -// Typedef an STL vector of vertices which are used to represent -// a polygon/contour and a series of triangles. -typedef std::vector Vector2fVector; - -class Triangulate { - public: - // triangulate a contour/polygon, places results in STL vector - // as series of triangles. - static bool Process(const Vector2fVector &contour, Vector2fVector &result); - - // compute area of a contour/polygon - static float Area(const Vector2fVector &contour); - - // decide if point Px/Py is inside triangle defined by - // (Ax,Ay) (Bx,By) (Cx,Cy) - static bool InsideTriangle(float Ax, - float Ay, - float Bx, - float By, - float Cx, - float Cy, - float Px, - float Py); - - private: - static bool Snip( - const Vector2fVector &contour, int u, int v, int w, int n, int *V); -}; - -#endif diff --git a/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.autosave.gdg b/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.autosave.gdg deleted file mode 100644 index b2179a7c7..000000000 --- a/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.autosave.gdg +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.gdg b/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.gdg deleted file mode 100644 index b2179a7c7..000000000 --- a/Extensions/PhysicsBehavior/test/examplePhysicsEnhanced.gdg +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/test/grass.png b/Extensions/PhysicsBehavior/test/grass.png deleted file mode 100644 index 289329970..000000000 Binary files a/Extensions/PhysicsBehavior/test/grass.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/test/testComplex.png b/Extensions/PhysicsBehavior/test/testComplex.png deleted file mode 100644 index 9d3f57ebc..000000000 Binary files a/Extensions/PhysicsBehavior/test/testComplex.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/test/testConcave.png b/Extensions/PhysicsBehavior/test/testConcave.png deleted file mode 100644 index 5aa588d13..000000000 Binary files a/Extensions/PhysicsBehavior/test/testConcave.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/test/testCoords.txt b/Extensions/PhysicsBehavior/test/testCoords.txt deleted file mode 100644 index 3724285b3..000000000 --- a/Extensions/PhysicsBehavior/test/testCoords.txt +++ /dev/null @@ -1,14 +0,0 @@ -//TRIANGLE -100;0 -200;200 -0;200 - -//POLYGONE -0;0 -500;0 -500;90 -150;90 -150;415 -500;415 -500;500 -0;500 \ No newline at end of file diff --git a/Extensions/PhysicsBehavior/test/testPhysics.autosave.gdg b/Extensions/PhysicsBehavior/test/testPhysics.autosave.gdg deleted file mode 100644 index aeca9cb33..000000000 --- a/Extensions/PhysicsBehavior/test/testPhysics.autosave.gdg +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/test/testPhysics.gdg b/Extensions/PhysicsBehavior/test/testPhysics.gdg deleted file mode 100644 index a1eb6fba6..000000000 --- a/Extensions/PhysicsBehavior/test/testPhysics.gdg +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Extensions/PhysicsBehavior/test/testTri.png b/Extensions/PhysicsBehavior/test/testTri.png deleted file mode 100644 index b80d270eb..000000000 Binary files a/Extensions/PhysicsBehavior/test/testTri.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/test/triangleFunctionnal.png b/Extensions/PhysicsBehavior/test/triangleFunctionnal.png deleted file mode 100644 index ebbb3f244..000000000 Binary files a/Extensions/PhysicsBehavior/test/triangleFunctionnal.png and /dev/null differ diff --git a/Extensions/PhysicsBehavior/test/triangleFunctionnal2.png b/Extensions/PhysicsBehavior/test/triangleFunctionnal2.png deleted file mode 100644 index 94660ae27..000000000 Binary files a/Extensions/PhysicsBehavior/test/triangleFunctionnal2.png and /dev/null differ diff --git a/Extensions/PlatformBehavior/CMakeLists.txt b/Extensions/PlatformBehavior/CMakeLists.txt index 2ef804822..0476c4c02 100644 --- a/Extensions/PlatformBehavior/CMakeLists.txt +++ b/Extensions/PlatformBehavior/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(PlatformBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(PlatformBehavior "${source_files}") - gd_add_extension_target(PlatformBehavior "${source_files}") -gdcpp_add_runtime_extension_target(PlatformBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### -gd_extension_link_libraries(PlatformBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(PlatformBehavior_Runtime) +gd_extension_link_libraries(PlatformBehavior) \ No newline at end of file diff --git a/Extensions/PlatformBehavior/Extension.cpp b/Extensions/PlatformBehavior/Extension.cpp index 8799e9951..7577a4f52 100644 --- a/Extensions/PlatformBehavior/Extension.cpp +++ b/Extensions/PlatformBehavior/Extension.cpp @@ -7,11 +7,10 @@ This project is released under the MIT License. #include "PlatformBehavior.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "PlatformRuntimeBehavior.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" +#include "GDCore/Project/BehaviorsSharedData.h" #include "PlatformerObjectBehavior.h" -#include "PlatformerObjectRuntimeBehavior.h" -#include "ScenePlatformObjectsManager.h" void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -764,58 +763,3 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) { #endif } } - -/** - * \brief This class declares information about the extension. - */ -class PlatformBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - PlatformBehaviorCppExtension() { - DeclarePlatformBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("PlatformBehavior::PlatformBehavior"), - "PlatformRuntimeBehavior"); - GetBehaviorMetadata("PlatformBehavior::PlatformBehavior") - .SetIncludeFile("PlatformBehavior/PlatformRuntimeBehavior.h"); - AddRuntimeBehavior( - GetBehaviorMetadata("PlatformBehavior::PlatformerObjectBehavior"), - "PlatformerObjectRuntimeBehavior"); - GetBehaviorMetadata("PlatformBehavior::PlatformerObjectBehavior") - .SetIncludeFile("PlatformBehavior/PlatformerObjectRuntimeBehavior.h"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; - - /** - * \brief Initialize platforms list of the scene - */ - virtual void SceneLoaded(RuntimeScene& scene) { - ScenePlatformObjectsManager emptyManager; - ScenePlatformObjectsManager::managers[&scene] = emptyManager; - } - - /** - * \brief Destroy platforms list of the scene - */ - virtual void SceneUnloaded(RuntimeScene& scene) { - ScenePlatformObjectsManager::managers.erase(&scene); - } -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppPlatformBehaviorExtension() { - return new PlatformBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new PlatformBehaviorCppExtension; -} -#endif diff --git a/Extensions/PlatformBehavior/JsExtension.cpp b/Extensions/PlatformBehavior/JsExtension.cpp index e743cea14..7ef3d844d 100644 --- a/Extensions/PlatformBehavior/JsExtension.cpp +++ b/Extensions/PlatformBehavior/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "GDCore/Tools/Localization.h" diff --git a/Extensions/PlatformBehavior/PlatformBehavior.cpp b/Extensions/PlatformBehavior/PlatformBehavior.cpp index 9c40ab36c..b076d0924 100644 --- a/Extensions/PlatformBehavior/PlatformBehavior.cpp +++ b/Extensions/PlatformBehavior/PlatformBehavior.cpp @@ -8,12 +8,9 @@ This project is released under the MIT License. #include "PlatformBehavior.h" #include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "ScenePlatformObjectsManager.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/Layout.h" +#include "GDCore/Serialization/SerializerElement.h" #if defined(GD_IDE_ONLY) #include #include diff --git a/Extensions/PlatformBehavior/PlatformBehavior.h b/Extensions/PlatformBehavior/PlatformBehavior.h index d60eeef3c..433c50076 100644 --- a/Extensions/PlatformBehavior/PlatformBehavior.h +++ b/Extensions/PlatformBehavior/PlatformBehavior.h @@ -7,8 +7,8 @@ This project is released under the MIT License. #ifndef PLATFORMBEHAVIOR_H #define PLATFORMBEHAVIOR_H -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" class ScenePlatformObjectsManager; class RuntimeScene; namespace gd { @@ -27,7 +27,7 @@ class Layout; * \brief Behavior that mark object as being a platform for objects using * PlatformerObject behavior. */ -class GD_EXTENSION_API PlatformBehavior : public Behavior { +class GD_EXTENSION_API PlatformBehavior : public gd::Behavior { public: PlatformBehavior(){}; virtual ~PlatformBehavior(){}; diff --git a/Extensions/PlatformBehavior/PlatformRuntimeBehavior.cpp b/Extensions/PlatformBehavior/PlatformRuntimeBehavior.cpp deleted file mode 100644 index 515152607..000000000 --- a/Extensions/PlatformBehavior/PlatformRuntimeBehavior.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/** - -GDevelop - Platform Behavior Extension -Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "PlatformRuntimeBehavior.h" -#include -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "ScenePlatformObjectsManager.h" - -PlatformRuntimeBehavior::PlatformRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - parentScene(NULL), - sceneManager(NULL), - registeredInManager(false), - platformType(NormalPlatform), - canBeGrabbed(true), - yGrabOffset(0) { - gd::String platformTypeStr = - behaviorContent.GetStringAttribute("platformType"); - platformType = - platformTypeStr == "Ladder" - ? Ladder - : (platformTypeStr == "Jumpthru" ? Jumpthru : NormalPlatform); - canBeGrabbed = behaviorContent.GetBoolAttribute("canBeGrabbed", true); - yGrabOffset = behaviorContent.GetDoubleAttribute("yGrabOffset"); -} - -PlatformRuntimeBehavior::~PlatformRuntimeBehavior() { - if (sceneManager && registeredInManager) sceneManager->RemovePlatform(this); -} - -void PlatformRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - if (sceneManager) // Remove the object from any old scene manager. - sceneManager->RemovePlatform(this); - - parentScene = &scene; - sceneManager = - parentScene ? &ScenePlatformObjectsManager::managers[&scene] : NULL; - registeredInManager = false; - } - - if (!activated && registeredInManager) { - if (sceneManager) sceneManager->RemovePlatform(this); - registeredInManager = false; - } else if (activated && !registeredInManager) { - if (sceneManager) { - sceneManager->AddPlatform(this); - registeredInManager = true; - } - } -} - -void PlatformRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) {} - -void PlatformRuntimeBehavior::ChangePlatformType( - const gd::String& platformType_) { - if (platformType_ == "Ladder") - platformType = Ladder; - else if (platformType_ == "Jumpthru") - platformType = Jumpthru; - else - platformType = NormalPlatform; -} - -void PlatformRuntimeBehavior::OnActivate() { - if (sceneManager) { - sceneManager->AddPlatform(this); - registeredInManager = true; - } -} - -void PlatformRuntimeBehavior::OnDeActivate() { - if (sceneManager) sceneManager->RemovePlatform(this); - - registeredInManager = false; -} diff --git a/Extensions/PlatformBehavior/PlatformRuntimeBehavior.h b/Extensions/PlatformBehavior/PlatformRuntimeBehavior.h deleted file mode 100644 index 448326d57..000000000 --- a/Extensions/PlatformBehavior/PlatformRuntimeBehavior.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - -GDevelop - Platform Behavior Extension -Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PLATFORMRUNTIMEBEHAVIOR_H -#define PLATFORMRUNTIMEBEHAVIOR_H -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class ScenePlatformObjectsManager; -class RuntimeScene; -namespace gd { -class SerializerElement; -} - -/** - * \brief Behavior that mark object as being a platform for objects using - * PlatformerObject behavior. - */ -class GD_EXTENSION_API PlatformRuntimeBehavior : public RuntimeBehavior { - public: - PlatformRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~PlatformRuntimeBehavior(); - virtual RuntimeBehavior* Clone() const { return new PlatformRuntimeBehavior(*this); } - - /** - * \brief Return the object owning this behavior. - */ - RuntimeObject* GetObject() const { return object; } - - /** - * \brief The different types of platforms. - */ - enum PlatformType { NormalPlatform, Jumpthru, Ladder }; - - /** - * \brief Return the object owning this behavior. - */ - PlatformType GetPlatformType() const { return platformType; } - - /** - * \brief Change the platform type - * \param platformType The new platform type ("Platform", "Jumpthru" or - * "Ladder"). - */ - void ChangePlatformType(const gd::String& platformType_); - - /** - * \brief Return true if the platform can be grabbed by platformer objects. - */ - bool CanBeGrabbed() const { return canBeGrabbed; } - - /** - * \brief Return the offset applied when testing if an object is at the - * right position on Y axis to grab the platform ledge. - */ - double GetYGrabOffset() const { return yGrabOffset; } - - private: - virtual void OnActivate(); - virtual void OnDeActivate(); - - virtual void DoStepPreEvents(RuntimeScene& scene); - virtual void DoStepPostEvents(RuntimeScene& scene); - - RuntimeScene* parentScene; ///< The scene the object belongs to. - ScenePlatformObjectsManager* - sceneManager; ///< The platform objects manager associated to the scene. - bool registeredInManager; ///< True if the behavior is registered in the list - ///< of platforms of the scene. - PlatformType platformType; - bool canBeGrabbed; ///< True if the platform ledges can be grabbed by - ///< platformer objects. - double yGrabOffset; -}; - -#endif // PLATFORMRUNTIMEBEHAVIOR_H diff --git a/Extensions/PlatformBehavior/PlatformerObjectBehavior.cpp b/Extensions/PlatformBehavior/PlatformerObjectBehavior.cpp index 0945af611..095882bf9 100644 --- a/Extensions/PlatformBehavior/PlatformerObjectBehavior.cpp +++ b/Extensions/PlatformBehavior/PlatformerObjectBehavior.cpp @@ -7,26 +7,16 @@ This project is released under the MIT License. #include "PlatformerObjectBehavior.h" -#include -#include -#include #include #include - -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "PlatformBehavior.h" -#include "ScenePlatformObjectsManager.h" -#if defined(GD_IDE_ONLY) -#include #include +#include "GDCore/Tools/Localization.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/Layout.h" +#include "GDCore/Serialization/SerializerElement.h" #include "GDCore/Project/PropertyDescriptor.h" -#endif +#include "PlatformBehavior.h" void PlatformerObjectBehavior::InitializeContent( gd::SerializerElement& behaviorContent) { diff --git a/Extensions/PlatformBehavior/PlatformerObjectBehavior.h b/Extensions/PlatformBehavior/PlatformerObjectBehavior.h index 55aaa3b27..e776c0083 100644 --- a/Extensions/PlatformBehavior/PlatformerObjectBehavior.h +++ b/Extensions/PlatformBehavior/PlatformerObjectBehavior.h @@ -9,8 +9,8 @@ This project is released under the MIT License. #define PLATFORMEROBJECTBEHAVIOR_H #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" namespace gd { class SerializerElement; } @@ -18,7 +18,7 @@ class SerializerElement; /** * \brief Allows objects to jump and stand on platforms. */ -class GD_EXTENSION_API PlatformerObjectBehavior : public Behavior { +class GD_EXTENSION_API PlatformerObjectBehavior : public gd::Behavior { public: PlatformerObjectBehavior(){}; virtual ~PlatformerObjectBehavior(){}; diff --git a/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.cpp b/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.cpp deleted file mode 100644 index 8024d56d5..000000000 --- a/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.cpp +++ /dev/null @@ -1,673 +0,0 @@ -/** - -GDevelop - Platform Behavior Extension -Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "PlatformerObjectRuntimeBehavior.h" -#include -#include -#include -#include -#include -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "PlatformRuntimeBehavior.h" -#include "ScenePlatformObjectsManager.h" - -PlatformerObjectRuntimeBehavior::PlatformerObjectRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - ignoreTouchingEdges(true), - roundCoordinates(true), - gravity(1000), - maxFallingSpeed(700), - ladderClimbingSpeed(150), - acceleration(1500), - deceleration(1500), - maxSpeed(250), - jumpSpeed(600), - canGrabPlatforms(false), - yGrabOffset(0), - xGrabTolerance(10), - parentScene(NULL), - sceneManager(NULL), - isOnFloor(false), - isOnLadder(false), - floorPlatform(NULL), - currentFallSpeed(0), - currentSpeed(0), - jumping(false), - currentJumpSpeed(0), - canJump(false), - hasReallyMoved(false), - isGrabbingPlatform(false), - grabbedPlatform(NULL), - grabbedPlatformLastX(0), - grabbedPlatformLastY(0), - trackSize(true), - ignoreDefaultControls(false), - leftKey(false), - rightKey(false), - ladderKey(false), - upKey(false), - downKey(false), - jumpKey(false), - releaseKey(false) { - SetSlopeMaxAngle(60); - - roundCoordinates = - behaviorContent.GetBoolAttribute("roundCoordinates", false); - gravity = behaviorContent.GetDoubleAttribute("gravity"); - maxFallingSpeed = behaviorContent.GetDoubleAttribute("maxFallingSpeed"); - ladderClimbingSpeed = behaviorContent.GetDoubleAttribute("ladderClimbingSpeed"); - acceleration = behaviorContent.GetDoubleAttribute("acceleration"); - deceleration = behaviorContent.GetDoubleAttribute("deceleration"); - maxSpeed = behaviorContent.GetDoubleAttribute("maxSpeed"); - jumpSpeed = behaviorContent.GetDoubleAttribute("jumpSpeed"); - ignoreDefaultControls = - behaviorContent.GetBoolAttribute("ignoreDefaultControls"); - SetSlopeMaxAngle(behaviorContent.GetDoubleAttribute("slopeMaxAngle")); - canGrabPlatforms = - behaviorContent.GetBoolAttribute("canGrabPlatforms", false); - yGrabOffset = behaviorContent.GetDoubleAttribute("yGrabOffset"); - xGrabTolerance = behaviorContent.GetDoubleAttribute("xGrabTolerance", 10); -} - -PlatformerObjectRuntimeBehavior::~PlatformerObjectRuntimeBehavior() {} - -void PlatformerObjectRuntimeBehavior::OnOwnerChanged() { - oldHeight = object->GetHeight(); -} - -bool PlatformerObjectRuntimeBehavior::SetSlopeMaxAngle(double newMaxAngle) { - if (newMaxAngle < 0 || newMaxAngle >= 90) return false; - - slopeMaxAngle = newMaxAngle; - if (slopeMaxAngle == 45) - slopeClimbingFactor = 1; // Avoid rounding errors - else - slopeClimbingFactor = tan(slopeMaxAngle * 3.1415926 / 180); - - return true; -} - -void PlatformerObjectRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - parentScene = &scene; - sceneManager = - parentScene ? &ScenePlatformObjectsManager::managers[&scene] : NULL; - floorPlatform = NULL; - } - - if (!sceneManager) return; - - double timeDelta = - static_cast(object->GetElapsedTime(scene)) / 1000000.0; - - // 0.1) Get the player input: - - double requestedDeltaX = 0; - double requestedDeltaY = 0; - - // Change the speed according to the player's input. - leftKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Left"); - rightKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Right"); - if (leftKey) currentSpeed -= acceleration * timeDelta; - if (rightKey) currentSpeed += acceleration * timeDelta; - - // Take deceleration into account only if no key is pressed. - if (leftKey == rightKey) { - bool wasPositive = currentSpeed > 0; - currentSpeed -= deceleration * timeDelta * (wasPositive ? 1.0 : -1.0); - - // Set the speed to 0 if the speed was top low. - if (wasPositive && currentSpeed < 0) currentSpeed = 0; - if (!wasPositive && currentSpeed > 0) currentSpeed = 0; - } - - if (currentSpeed > maxSpeed) currentSpeed = maxSpeed; - if (currentSpeed < -maxSpeed) currentSpeed = -maxSpeed; - requestedDeltaX += currentSpeed * timeDelta; - - // Compute the list of the objects that will be used - std::set potentialObjects = - GetPotentialCollidingObjects(std::max(requestedDeltaX, maxFallingSpeed)); - std::set overlappedJumpThru = - GetJumpthruCollidingWith(potentialObjects); - - // Check that the floor object still exists and is near the object. - if (isOnFloor && - potentialObjects.find(floorPlatform) == potentialObjects.end()) { - isOnFloor = false; - floorPlatform = NULL; - } - - // Check that the grabbed platform object still exists and is near the object. - if (isGrabbingPlatform && - potentialObjects.find(grabbedPlatform) == potentialObjects.end()) { - ReleaseGrabbedPlatform(); - } - - // 0.2) Track changes in object size - - // Stick the object to the floor if its height has changed. - if (trackSize && isOnFloor && oldHeight != object->GetHeight() && - !scene.GetTimeManager().IsFirstLoop()) { - object->SetY(floorLastY - object->GetHeight() + - (object->GetY() - object->GetDrawableY()) - 1); - } - - oldHeight = object->GetHeight(); - - // 1) X axis: - - // Shift the object according to the floor movement. - if (isOnFloor) { - requestedDeltaX += floorPlatform->GetObject()->GetX() - floorLastX; - requestedDeltaY += floorPlatform->GetObject()->GetY() - floorLastY; - } - - // Shift the object according to the grabbed platform movement. - if (isGrabbingPlatform) { - // This erases any other movement - requestedDeltaX = - grabbedPlatform->GetObject()->GetX() - grabbedPlatformLastX; - requestedDeltaY = - grabbedPlatform->GetObject()->GetY() - grabbedPlatformLastY; - } - - // Ensure the object is not stuck - if (SeparateFromPlatforms(potentialObjects, true)) { - canJump = - true; // After being unstuck, the object must be able to jump again. - } - - // Move the object on x axis. - double oldX = object->GetX(); - if (requestedDeltaX != 0) { - object->SetX(object->GetX() + requestedDeltaX); - bool tryRounding = true; - // Colliding: Try to push out from the solid. - // Note that jump thru are never obstacle on X axis. - while (IsCollidingWith( - potentialObjects, floorPlatform, /*excludeJumpthrus=*/true)) { - if ((requestedDeltaX > 0 && object->GetX() <= oldX) || - (requestedDeltaX < 0 && object->GetX() >= oldX)) { - object->SetX(oldX); // Unable to move the object without being stuck in - // an obstacle. - break; - } - - // If on floor: try get up a bit to bypass not perfectly aligned floors. - if (isOnFloor) { - object->SetY(object->GetY() - 1); - if (!IsCollidingWith( - potentialObjects, floorPlatform, /*excludeJumpthrus=*/true)) - break; - object->SetY(object->GetY() + 1); - } - - if (tryRounding) { - // First try rounding the position as this might be sufficient to get - // the object out of the wall. - object->SetX(GDRound(object->GetX())); - tryRounding = false; - } else { - object->SetX(GDRound(object->GetX()) + (requestedDeltaX > 0 ? -1 : 1)); - } - currentSpeed = 0; // Collided with a wall - } - } - - // 2) Y axis: - - // Go on a ladder - ladderKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Up"); - if (ladderKey && IsOverlappingLadder(potentialObjects)) { - canJump = true; - isOnFloor = false; - floorPlatform = NULL; - currentJumpSpeed = 0; - currentFallSpeed = 0; - isOnLadder = true; - } - - if (isOnLadder) { - upKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Up"); - downKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Down"); - if (upKey) requestedDeltaY -= ladderClimbingSpeed * timeDelta; - if (downKey) requestedDeltaY += ladderClimbingSpeed * timeDelta; - - // Coming to an extremity of a ladder - if (!IsOverlappingLadder(potentialObjects)) { - isOnLadder = false; - } - } - - // Fall - if (!isOnFloor && !isOnLadder && !isGrabbingPlatform) { - currentFallSpeed += gravity * timeDelta; - if (currentFallSpeed > maxFallingSpeed) currentFallSpeed = maxFallingSpeed; - - requestedDeltaY += currentFallSpeed * timeDelta; - requestedDeltaY = std::min(requestedDeltaY, maxFallingSpeed * timeDelta); - } - - // Grabbing a platform - if (canGrabPlatforms && requestedDeltaX != 0 && !isOnLadder && !isOnFloor) { - bool tryGrabbingPlatform = false; - - object->SetX(object->GetX() + - (requestedDeltaX > 0 ? xGrabTolerance : -xGrabTolerance)); - auto collidingObjects = - GetPlatformsCollidingWith(potentialObjects, overlappedJumpThru); - if (!collidingObjects.empty() && - CanGrab(*collidingObjects.begin(), requestedDeltaY)) { - tryGrabbingPlatform = true; - } - object->SetX(object->GetX() + - (requestedDeltaX > 0 ? -xGrabTolerance : xGrabTolerance)); - - // Check if we can grab the collided platform - if (tryGrabbingPlatform) { - double oldY = object->GetY(); - PlatformRuntimeBehavior* collidingPlatform = *collidingObjects.begin(); - object->SetY(collidingPlatform->GetObject()->GetY() + - collidingPlatform->GetYGrabOffset() - yGrabOffset); - if (!IsCollidingWith(potentialObjects, NULL, /*excludeJumpthrus=*/true)) { - isGrabbingPlatform = true; - grabbedPlatform = collidingPlatform; - requestedDeltaY = 0; - } else { - object->SetY(oldY); - } - } - } - - releaseKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Down"); - if (isGrabbingPlatform && !releaseKey) { - canJump = true; - currentJumpSpeed = 0; - currentFallSpeed = 0; - grabbedPlatformLastX = grabbedPlatform->GetObject()->GetX(); - grabbedPlatformLastY = grabbedPlatform->GetObject()->GetY(); - } - if (releaseKey) ReleaseGrabbedPlatform(); - - // Jumping - jumpKey |= !ignoreDefaultControls && - (scene.GetInputManager().IsKeyPressed("LShift") || - scene.GetInputManager().IsKeyPressed("RShift") || - scene.GetInputManager().IsKeyPressed("Space")); - if (canJump && jumpKey) { - jumping = true; - canJump = false; - // isOnFloor = false; If floor is a very steep slope, the object could go - // into it. - isOnLadder = false; - currentJumpSpeed = jumpSpeed; - currentFallSpeed = 0; - isGrabbingPlatform = false; - // object->SetY(object->GetY()-1); - } - - if (jumping) { - // TODO: Port the jump sustain feature - requestedDeltaY -= currentJumpSpeed * timeDelta; - currentJumpSpeed -= gravity * timeDelta; - if (currentJumpSpeed < 0) { - currentJumpSpeed = 0; - jumping = false; - } - } - - // Follow the floor - if (isOnFloor) { - if (object->IsCollidingWith(floorPlatform->GetObject(), - ignoreTouchingEdges)) { - // Floor is getting up, as the object is colliding with it. - double oldY = object->GetY(); - int step = 0; - bool stillInFloor = false; - do { - if (step >= - floor(std::abs( - requestedDeltaX * - slopeClimbingFactor))) // Slope is too step ( > max angle ) - { - object->SetY(object->GetY() - - (std::abs(requestedDeltaX * slopeClimbingFactor) - - (double)step)); // Try to add the decimal part. - if (object->IsCollidingWith(floorPlatform->GetObject(), - ignoreTouchingEdges)) - stillInFloor = true; // Too steep. - - break; - } - - // Try to get out of the floor. - object->SetY(object->GetY() - 1); - step++; - } while (object->IsCollidingWith(floorPlatform->GetObject(), - ignoreTouchingEdges)); - - if (stillInFloor) { - object->SetY(oldY); // Unable to follow the floor ( too steep ): Go - // back to the original position. - object->SetX(oldX); // And also revert the shift on X axis. - } - } else { - // Floor is flat or get down. - double oldY = object->GetY(); - double tentativeStartY = object->GetY() + 1; - object->SetY(roundCoordinates ? GDRound(tentativeStartY) - : tentativeStartY); - int step = 0; - bool noMoreOnFloor = false; - while (!IsCollidingWith(potentialObjects)) { - if (step > - std::abs(requestedDeltaX * - slopeClimbingFactor)) // Slope is too step ( > 50% ) - { - noMoreOnFloor = true; - break; - } - - // Object was on floor, but no more: Maybe a slope, try to follow it. - object->SetY(object->GetY() + 1); - step++; - } - if (noMoreOnFloor) - object->SetY(oldY); // Unable to follow the floor: Go back to the - // original position. Fall will be triggered next - // tick. - else - object->SetY(object->GetY() - - 1); // Floor touched: Go back 1 pixel over. - } - } - - // Move the object on Y axis - if (requestedDeltaY != 0) { - double oldY = object->GetY(); - object->SetY(object->GetY() + requestedDeltaY); - - // Stop when colliding with an obstacle. - while ((requestedDeltaY < 0 && - IsCollidingWith(potentialObjects, - NULL, - /*excludeJumpThrus=*/true)) // Jumpthru = obstacle - // <=> Never when going - // up - || (requestedDeltaY > 0 && - IsCollidingWith(potentialObjects, - overlappedJumpThru))) // Jumpthru = obstacle <=> - // Only if not already - // overlapped when goign - // down - { - jumping = false; - currentJumpSpeed = 0; - if ((requestedDeltaY > 0 && object->GetY() <= oldY) || - (requestedDeltaY < 0 && object->GetY() >= oldY)) { - object->SetY(oldY); // Unable to move the object without being stuck in - // an obstacle. - break; - } - - object->SetY(floor(object->GetY()) + (requestedDeltaY > 0 ? -1 : 1)); - } - } - - // 3) Update the current floor data for the next tick: - overlappedJumpThru = GetJumpthruCollidingWith(potentialObjects); - if (!isOnLadder) { - // Check if the object is on a floor: - // In priority, check if the last floor platform is still the floor. - double oldY = object->GetY(); - object->SetY(object->GetY() + 1); - if (isOnFloor && object->IsCollidingWith(floorPlatform->GetObject(), - ignoreTouchingEdges)) { - // Still on the same floor - floorLastX = floorPlatform->GetObject()->GetX(); - floorLastY = floorPlatform->GetObject()->GetY(); - } else { - // Avoid landing on a platform if the object is not going down. - // (which could happen for a jumpthru, when the object jump and pass just - // at the top of a jumpthru, it could be considered as landing if not for - // this extra check). - bool canLand = requestedDeltaY >= 0; - - // Check if landing on a new floor: (Exclude already overlapped jump thru) - std::set collidingObjects = - GetPlatformsCollidingWith(potentialObjects, overlappedJumpThru); - if (canLand && !collidingObjects.empty()) { // Just landed on floor - isOnFloor = true; - canJump = true; - jumping = false; - currentJumpSpeed = 0; - currentFallSpeed = 0; - - floorPlatform = *collidingObjects.begin(); - floorLastX = floorPlatform->GetObject()->GetX(); - floorLastY = floorPlatform->GetObject()->GetY(); - - ReleaseGrabbedPlatform(); // Ensure nothing is grabbed. - } else { // In the air - canJump = false; - isOnFloor = false; - floorPlatform = NULL; - } - } - object->SetY(oldY); - } - - // 4) Do not forget to reset pressed keys - leftKey = false; - rightKey = false; - ladderKey = false; - upKey = false; - downKey = false; - jumpKey = false; - releaseKey = false; - - // 5) Track the movement - hasReallyMoved = std::abs(object->GetX() - oldX) >= 1; -} - -bool PlatformerObjectRuntimeBehavior::CanGrab(PlatformRuntimeBehavior* platform, - double requestedDeltaY) const { - double y1 = object->GetY() + yGrabOffset; - double y2 = object->GetY() + yGrabOffset + requestedDeltaY; - double platformY = platform->GetObject()->GetY() + platform->GetYGrabOffset(); - - return (platform->CanBeGrabbed() && ((y1 < platformY && platformY < y2) || - (y2 < platformY && platformY < y1))); -} - -void PlatformerObjectRuntimeBehavior::SetCanGrabPlatforms(bool enable) { - canGrabPlatforms = enable; - if (!enable) ReleaseGrabbedPlatform(); -} - -void PlatformerObjectRuntimeBehavior::ReleaseGrabbedPlatform() { - isGrabbingPlatform = false; // Ensure nothing is grabbed. - grabbedPlatform = nullptr; -} - -bool PlatformerObjectRuntimeBehavior::SeparateFromPlatforms( - const std::set& candidates, - bool excludeJumpThrus) { - std::vector objects; - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if ((*it)->GetPlatformType() == PlatformRuntimeBehavior::Ladder) continue; - if (excludeJumpThrus && - (*it)->GetPlatformType() == PlatformRuntimeBehavior::Jumpthru) - continue; - - objects.push_back((*it)->GetObject()); - } - - return object->SeparateFromObjects(objects, ignoreTouchingEdges); -} - -std::set -PlatformerObjectRuntimeBehavior::GetPlatformsCollidingWith( - const std::set& candidates, - const std::set& exceptTheseOnes) { - // TODO: This function could be refactored to return only the first colliding - // platform. - std::set result; - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if (exceptTheseOnes.find(*it) != exceptTheseOnes.end()) continue; - if ((*it)->GetPlatformType() == PlatformRuntimeBehavior::Ladder) continue; - - if (object->IsCollidingWith((*it)->GetObject(), ignoreTouchingEdges)) - result.insert(*it); - } - - return result; -} - -bool PlatformerObjectRuntimeBehavior::IsCollidingWith( - const std::set& candidates, - PlatformRuntimeBehavior* exceptThisOne, - bool excludeJumpThrus) { - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if (*it == exceptThisOne) continue; - if ((*it)->GetPlatformType() == PlatformRuntimeBehavior::Ladder) continue; - if (excludeJumpThrus && - (*it)->GetPlatformType() == PlatformRuntimeBehavior::Jumpthru) - continue; - - if (object->IsCollidingWith((*it)->GetObject(), ignoreTouchingEdges)) - return true; - } - - return false; -} - -bool PlatformerObjectRuntimeBehavior::IsCollidingWith( - const std::set& candidates, - const std::set& exceptTheseOnes) { - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if (exceptTheseOnes.find(*it) != exceptTheseOnes.end()) continue; - if ((*it)->GetPlatformType() == PlatformRuntimeBehavior::Ladder) continue; - - if (object->IsCollidingWith((*it)->GetObject(), ignoreTouchingEdges)) - return true; - } - - return false; -} - -std::set -PlatformerObjectRuntimeBehavior::GetJumpthruCollidingWith( - const std::set& candidates) { - std::set result; - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if ((*it)->GetPlatformType() != PlatformRuntimeBehavior::Jumpthru) continue; - - if (object->IsCollidingWith((*it)->GetObject(), ignoreTouchingEdges)) - result.insert(*it); - } - - return result; -} - -bool PlatformerObjectRuntimeBehavior::IsOverlappingLadder( - const std::set& candidates) { - for (std::set::iterator it = candidates.begin(); - it != candidates.end(); - ++it) { - if ((*it)->GetPlatformType() != PlatformRuntimeBehavior::Ladder) continue; - if (object->IsCollidingWith((*it)->GetObject(), ignoreTouchingEdges)) - return true; - } - - return false; -} - -std::set -PlatformerObjectRuntimeBehavior::GetPotentialCollidingObjects( - double maxMovementLength) { - // Compute the "bounding circle" radius of the object. - float o1w = object->GetWidth(); - float o1h = object->GetHeight(); - float obj1BoundingRadius = - sqrt(o1w * o1w + o1h * o1h) / 2.0 + - maxMovementLength / 2.0; // Add to it the maximum magnitude of movement. - - std::set potentialObjects; - for (std::set::iterator it = - sceneManager->GetAllPlatforms().begin(); - it != sceneManager->GetAllPlatforms().end(); - ++it) { - // First check if bounding circle are too far. - RuntimeObject* obj2 = (*it)->GetObject(); - float o2w = obj2->GetWidth(); - float o2h = obj2->GetHeight(); - - float x = object->GetDrawableX() + object->GetCenterX() - - (obj2->GetDrawableX() + obj2->GetCenterX()); - float y = object->GetDrawableY() + object->GetCenterY() - - (obj2->GetDrawableY() + obj2->GetCenterY()); - float obj2BoundingRadius = sqrt(o2w * o2w + o2h * o2h) / 2.0; - - if (sqrt(x * x + y * y) <= obj1BoundingRadius + obj2BoundingRadius) { - potentialObjects.insert(*it); - } - } - - return potentialObjects; -} - -void PlatformerObjectRuntimeBehavior::DoStepPostEvents(RuntimeScene& scene) { - if (parentScene != &scene) // Parent scene has changed - { - parentScene = &scene; - sceneManager = - parentScene ? &ScenePlatformObjectsManager::managers[&scene] : NULL; - floorPlatform = NULL; - } -} - -void PlatformerObjectRuntimeBehavior::SimulateControl(const gd::String& input) { - if (input == "Left") - leftKey = true; - else if (input == "Right") - rightKey = true; - else if (input == "Up") - upKey = true; - else if (input == "Down") - downKey = true; - else if (input == "Ladder") - ladderKey = true; - else if (input == "Jump") - jumpKey = true; - else if (input == "Release") - releaseKey = true; -} diff --git a/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.h b/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.h deleted file mode 100644 index ddb450eef..000000000 --- a/Extensions/PlatformBehavior/PlatformerObjectRuntimeBehavior.h +++ /dev/null @@ -1,247 +0,0 @@ -/** - -GDevelop - Platform Behavior Extension -Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef PLATFORMEROBJECTRUNTIMEBEHAVIOR_H -#define PLATFORMEROBJECTRUNTIMEBEHAVIOR_H -#include -#include -#include -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeObject.h" -namespace gd { -class SerializerElement; -} -class RuntimeScene; -class PlatformRuntimeBehavior; -class ScenePlatformObjectsManager; - -/** - * \brief Allows objects to jump and stand on platforms. - */ -class GD_EXTENSION_API PlatformerObjectRuntimeBehavior - : public RuntimeBehavior { - public: - PlatformerObjectRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~PlatformerObjectRuntimeBehavior(); - virtual RuntimeBehavior* Clone() const { - return new PlatformerObjectRuntimeBehavior(*this); - } - - double GetGravity() const { return gravity; }; - double GetMaxFallingSpeed() const { return maxFallingSpeed; }; - double GetLadderClimbingSpeed() const { return ladderClimbingSpeed; }; - double GetAcceleration() const { return acceleration; }; - double GetDeceleration() const { return deceleration; }; - double GetMaxSpeed() const { return maxSpeed; }; - double GetJumpSpeed() const { return jumpSpeed; }; - double GetCurrentFallSpeed() const { return currentFallSpeed; }; - double GetCurrentSpeed() const { return currentSpeed; }; - double GetCurrentJumpSpeed() const { return currentJumpSpeed; }; - double GetSlopeMaxAngle() const { return slopeMaxAngle; }; - bool CanGrabPlatforms() const { return canGrabPlatforms; }; - bool CanJump() const { return canJump; }; - - void SetGravity(double gravity_) { gravity = gravity_; }; - void SetMaxFallingSpeed(double maxFallingSpeed_) { - maxFallingSpeed = maxFallingSpeed_; - }; - void SetLadderClimbingSpeed(double ladderClimbingSpeed_) { ladderClimbingSpeed = ladderClimbingSpeed_; }; - void SetAcceleration(double acceleration_) { acceleration = acceleration_; }; - void SetDeceleration(double deceleration_) { deceleration = deceleration_; }; - void SetMaxSpeed(double maxSpeed_) { maxSpeed = maxSpeed_; }; - void SetJumpSpeed(double jumpSpeed_) { jumpSpeed = jumpSpeed_; }; - bool SetSlopeMaxAngle(double slopeMaxAngle_); - void SetCanJump() { canJump = true; }; - void SetCanGrabPlatforms(bool enable); - - void IgnoreDefaultControls(bool ignore = true) { - ignoreDefaultControls = ignore; - }; - void SimulateControl(const gd::String& input); - void SimulateLeftKey() { leftKey = true; }; - void SimulateRightKey() { rightKey = true; }; - void SimulateLadderKey() { ladderKey = true; }; - void SimulateUpKey() { upKey = true; }; - void SimulateDownKey() { downKey = true; }; - void SimulateJumpKey() { jumpKey = true; }; - void SimulateReleaseKey() { releaseKey = true; }; - - bool IsOnFloor() const { return isOnFloor; } - bool IsOnLadder() const { return isOnLadder; } - bool IsJumping() const { return jumping; } - bool IsFalling() const { - return !isOnFloor && !isGrabbingPlatform && !isOnLadder && - (!jumping || currentJumpSpeed < currentFallSpeed); - } - bool IsMoving() const { - return (currentSpeed != 0 && hasReallyMoved) || currentJumpSpeed != 0 || - currentFallSpeed != 0; - } - bool IsGrabbingPlatform() const { return isGrabbingPlatform; } - - virtual void OnOwnerChanged(); - - private: - virtual void DoStepPreEvents(RuntimeScene& scene); - virtual void DoStepPostEvents(RuntimeScene& scene); - - /** - * \brief Return a list of all the platforms that could be colliding with the - * object if it is moved. \param maxMovementLength The maximum length of any - * movement that could be done by the object, in pixels. \warning sceneManager - * must be valid and not NULL. - */ - std::set GetPotentialCollidingObjects( - double maxMovementLength); - - /** - * \brief Separate the object from all platforms passed as parameter, except - * ladders. \param candidates The platform to be tested for collision \param - * excludeJumpThrus If set to true, the jump thru platform will be excluded. - */ - bool SeparateFromPlatforms( - const std::set& candidates, - bool excludeJumpThrus); - - /** - * \brief Among the platforms passed in parameter, return a list of the - * platforms colliding with the object. \note Ladders are *always* excluded - * from the test. \param candidates The platform to be tested for collision - * \param exceptTheseOnes The platforms to be excluded from the test - */ - std::set GetPlatformsCollidingWith( - const std::set& candidates, - const std::set& exceptTheseOnes); - - /** - * \brief Among the platforms passed in parameter, return true if there is a - * platform colliding with the object. \note Ladders are *always* excluded - * from the test. \param candidates The platform to be tested for collision - * \param exceptThisOne If not NULL, this platform won't be tested for - * collision. \param excludeJumpThrus If set to true, the jump thru platform - * will be excluded. - */ - bool IsCollidingWith(const std::set& candidates, - PlatformRuntimeBehavior* exceptThisOne = NULL, - bool excludeJumpThrus = false); - - /** - * \brief Among the platforms passed in parameter, return true if there is a - * platform colliding with the object. \note Ladders are *always* excluded - * from the test. \param candidates The platforms to be tested for collision - * \param exceptTheseOnes The platforms to be excluded from the test - */ - bool IsCollidingWith( - const std::set& candidates, - const std::set& exceptTheseOnes); - - /** - * \brief Among the platforms passed in parameter, return true if the object - * is overlapping a ladder. \param candidates The platform to be tested for - * collision - */ - bool IsOverlappingLadder( - const std::set& candidates); - - /** - * \brief Among the platforms passed in parameter, return a list of the jump - * thru platforms colliding with the object. \param candidates The platform to - * be tested for collision - */ - std::set GetJumpthruCollidingWith( - const std::set& candidates); - - /** - * \brief Return true if the object owning the behavior can grab the specified - * platform. There must be a collision between the object and the platform. - * \param platform The platform the object is in collision with - * \param y Grabbing will be allowed if the object is above the platform but - * the distance is less than this parameter. - */ - bool CanGrab(PlatformRuntimeBehavior* platform, double y) const; - - /** - * \brief Mark the platformer object has not being grabbing any platform. - */ - void ReleaseGrabbedPlatform(); - - bool ignoreTouchingEdges; // To achieve pixel-perfect precision when - // positioning object on platform or handling - // collision with "walls", edges of the hitboxes - // must be ignored during collision checks, so that - // two overlapping edges are not considered as - // colliding. For example, if a character is 10px - // width and is at position (0, 0), it must not be - // considered as colliding with a platform which is - // at position (10, 0). Edges will still be - // overlapping (because character hitbox right edge - // is at X position 10 and platform hitbox left - // edge is also at X position 10). This parameter - // "ignoreTouchingEdges" will be passed to all - // collision handling functions. - bool roundCoordinates; ///< true to round coordinates when trying to move on - ///< X and Y axis. - double gravity; ///< In pixels.seconds^-2 - double maxFallingSpeed; ///< In pixels.seconds^-1 - double ladderClimbingSpeed; /// - ScenePlatformObjectsManager::managers; - -ScenePlatformObjectsManager::~ScenePlatformObjectsManager() { - for (std::set::iterator it = allPlatforms.begin(); - it != allPlatforms.end();) { - (*it++)->Activate(false); - } -} - -void ScenePlatformObjectsManager::AddPlatform(PlatformRuntimeBehavior* platform) { - allPlatforms.insert(platform); -} -void ScenePlatformObjectsManager::RemovePlatform(PlatformRuntimeBehavior* platform) { - allPlatforms.erase(platform); -} diff --git a/Extensions/PlatformBehavior/ScenePlatformObjectsManager.h b/Extensions/PlatformBehavior/ScenePlatformObjectsManager.h deleted file mode 100644 index 3fa07a9c3..000000000 --- a/Extensions/PlatformBehavior/ScenePlatformObjectsManager.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - -GDevelop - Platform Behavior Extension -Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#ifndef SCENEPLATFORMOBJECTSMANAGER_H -#define SCENEPLATFORMOBJECTSMANAGER_H -#include -#include -#include "GDCpp/Runtime/RuntimeScene.h" -class PlatformRuntimeBehavior; - -/** - * \brief Contains lists of all platform related objects of a scene. - * - * \note Could be drastically improved by using spatial hashing (see JS - * implementation). - */ -class ScenePlatformObjectsManager { - public: - /** - * \brief Map containing, for each RuntimeScene, its associated - * ScenePlatformObjectsManager. - */ - static std::map managers; - - ScenePlatformObjectsManager(){}; - virtual ~ScenePlatformObjectsManager(); - - /** - * \brief Notify the manager that there is a new platform on the scene. - * \param platform The new platform - */ - void AddPlatform(PlatformRuntimeBehavior* platform); - - /** - * \brief Notify the manager that a platform was removed from the scene. - * \param platform The removed platform - */ - void RemovePlatform(PlatformRuntimeBehavior* platform); - - /** - * \brief Get a read only access to the list of all platforms - */ - const std::set& GetAllPlatforms() { - return allPlatforms; - } - - private: - std::set - allPlatforms; ///< The list of all platforms of the scene. -}; - -#endif diff --git a/Extensions/PrimitiveDrawing/CMakeLists.txt b/Extensions/PrimitiveDrawing/CMakeLists.txt index ce79501f9..ce6441b5b 100644 --- a/Extensions/PrimitiveDrawing/CMakeLists.txt +++ b/Extensions/PrimitiveDrawing/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(PrimitiveDrawing) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(PrimitiveDrawing "${source_files}") - gd_add_extension_target(PrimitiveDrawing "${source_files}") -gdcpp_add_runtime_extension_target(PrimitiveDrawing_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(PrimitiveDrawing) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(PrimitiveDrawing_Runtime) diff --git a/Extensions/PrimitiveDrawing/Extension.cpp b/Extensions/PrimitiveDrawing/Extension.cpp index 8c40923dc..3504181a2 100644 --- a/Extensions/PrimitiveDrawing/Extension.cpp +++ b/Extensions/PrimitiveDrawing/Extension.cpp @@ -5,7 +5,8 @@ Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "ShapePainterObject.h" void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) { @@ -633,127 +634,3 @@ void DeclarePrimitiveDrawingExtension(gd::PlatformExtension& extension) { #endif } - -/** - * \brief This class declares information about the extension. - */ -class Extension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - Extension() { - DeclarePrimitiveDrawingExtension(*this); - AddRuntimeObject( - GetObjectMetadata("PrimitiveDrawing::Drawer"), - "RuntimeShapePainterObject"); - -#if defined(GD_IDE_ONLY) - AddAction("CopyImageOnAnother", - _("Copy an image on another"), - _("Copy an image on another.\nNote that the source image must be " - "preferably kept loaded in memory."), - _("Copy the image _PARAM1_ on _PARAM0_ at _PARAM2_;_PARAM3_"), - _("Images"), - "res/copy24.png", - "res/copyicon.png") - - .AddParameter("string", _("Name of the image to modify")) - .AddParameter("string", _("Name of the source image")) - .AddParameter("expression", _("X position")) - .AddParameter("expression", _("Y position")) - .AddParameter( - "yesorno", - _("Should the copy take in account the source transparency\?")) - .AddCodeOnlyParameter("currentScene", "") - - .SetFunctionName("GDpriv::PrimitiveDrawingTools::CopyImageOnAnother") - .SetIncludeFile("PrimitiveDrawing/PrimitiveDrawingTools.h"); - - AddAction("CaptureScreen", - _("Capture the screen"), - _("Capture the screen and save it into the specified folder " - "and/or\nin the specified image."), - _("Capture the screen ( Save it in file _PARAM1_ and/or in image " - "_PARAM2_ )"), - _("Images"), - "res/imageicon24.png", - "res/imageicon.png") - - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("string", _("File where save capture"), "", true) - .SetDefaultValue("") - .AddParameter("string", - _("Name of the image where capture must be saved"), - "", - true) - .SetDefaultValue("") - - .SetFunctionName("GDpriv::PrimitiveDrawingTools::CaptureScreen") - .SetIncludeFile("PrimitiveDrawing/PrimitiveDrawingTools.h"); - - AddAction("CreateSFMLTexture", - _("Create an image in memory"), - _("Create an image in memory."), - _("Create image _PARAM1_ in memory ( Width: _PARAM2_, Height: " - "_PARAM3_, Color: _PARAM4_ )"), - _("Images"), - "res/imageicon24.png", - "res/imageicon.png") - - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("string", _("Name of the image")) - .AddParameter("expression", _("Width"), "", true) - .AddParameter("expression", _("Height"), "", true) - .AddParameter("color", _("Initial color"), "", true) - .SetDefaultValue("0;0;0") - - .SetFunctionName("GDpriv::PrimitiveDrawingTools::CreateSFMLTexture") - .SetIncludeFile("PrimitiveDrawing/PrimitiveDrawingTools.h"); - - AddAction("OpenSFMLTextureFromFile", - _("Open an image from a file"), - _("Load in memory an image from a file."), - _("Load in memory file _PARAM1_ inside image _PARAM2_"), - _("Images"), - "res/imageicon24.png", - "res/imageicon.png") - - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("file", _("File")) - .AddParameter("string", _("Name of the image")) - - .SetFunctionName( - "GDpriv::PrimitiveDrawingTools::OpenSFMLTextureFromFile") - .SetIncludeFile("PrimitiveDrawing/PrimitiveDrawingTools.h"); - - AddAction("SaveSFMLTextureToFile", - _("Save an image to a file"), - _("Save an image to a file"), - _("Save image _PARAM2_ to file _PARAM1_"), - _("Images"), - "res/imageicon24.png", - "res/imageicon.png") - - .AddCodeOnlyParameter("currentScene", "") - .AddParameter("file", _("File")) - .AddParameter("string", _("Name of the image")) - - .SetFunctionName("GDpriv::PrimitiveDrawingTools::SaveSFMLTextureToFile") - .SetIncludeFile("PrimitiveDrawing/PrimitiveDrawingTools.h"); - -#endif - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new Extension; -} -#endif diff --git a/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.cpp b/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.cpp deleted file mode 100644 index 017d3ea74..000000000 --- a/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** - -GDevelop - Primitive Drawing Extension -Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#include "PrimitiveDrawingTools.h" -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -namespace GDpriv { -namespace PrimitiveDrawingTools { - -void GD_EXTENSION_API CopyImageOnAnother(const gd::String& destName, - const gd::String& srcName, - float destX, - float destY, - bool useTransparency, - RuntimeScene& scene) { - if (!scene.GetImageManager()->HasLoadedSFMLTexture(destName)) return; - if (!scene.GetImageManager()->HasLoadedSFMLTexture(srcName)) return; - - std::shared_ptr dest = - scene.GetImageManager()->GetSFMLTexture(destName); - - // Make sure the coordinates are correct. - if (destX < 0 || static_cast(destX) >= dest->texture.getSize().x) - return; - if (destY < 0 || static_cast(destY) >= dest->texture.getSize().y) - return; - - dest->image.copy(scene.GetImageManager()->GetSFMLTexture(srcName)->image, - destX, - destY, - sf::IntRect(0, 0, 0, 0), - useTransparency); - dest->texture.loadFromImage(dest->image); -} - -void GD_EXTENSION_API CaptureScreen(RuntimeScene& scene, - const gd::String& destFileName, - const gd::String& destImageName) { - if (!scene.renderWindow) return; - sf::Image capture = scene.renderWindow->capture(); - - if (!destFileName.empty()) capture.saveToFile(destFileName.ToLocale()); - if (!destImageName.empty() && - scene.GetImageManager()->HasLoadedSFMLTexture(destImageName)) { - std::shared_ptr sfmlTexture = - scene.GetImageManager()->GetSFMLTexture(destImageName); - sfmlTexture->image = capture; - sfmlTexture->texture.loadFromImage( - sfmlTexture->image); // Do not forget to update the associated texture - } -} - -namespace {} - -void GD_EXTENSION_API CreateSFMLTexture(RuntimeScene& scene, - const gd::String& imageName, - unsigned int width, - unsigned int height, - const gd::String& colorStr) { - // Get or create the texture in memory - std::shared_ptr newTexture; - if (!scene.GetImageManager()->HasLoadedSFMLTexture(imageName)) - newTexture = std::make_shared(); - else - newTexture = scene.GetImageManager()->GetSFMLTexture(imageName); - - // Get the color - sf::Color color; - bool colorIsOk = false; - std::vector colors = colorStr.Split(U';'); - if (colors.size() == 3) { - colorIsOk = true; - color = sf::Color( - colors[0].To(), colors[1].To(), colors[2].To()); - } - - // Create the SFML image and the SFML texture - if (width != 0 && height != 0 && colorIsOk) - newTexture->image.create(width, height, color); - - newTexture->texture.loadFromImage( - newTexture->image); // Do not forget to update the associated texture - - scene.GetImageManager()->SetSFMLTextureAsPermanentlyLoaded( - imageName, newTexture); // Otherwise -} - -void GD_EXTENSION_API OpenSFMLTextureFromFile(RuntimeScene& scene, - const gd::String& fileName, - const gd::String& imageName) { - // Get or create the texture in memory - std::shared_ptr newTexture; - if (!scene.GetImageManager()->HasLoadedSFMLTexture(imageName)) - newTexture = std::make_shared(); - else - newTexture = scene.GetImageManager()->GetSFMLTexture(imageName); - - // Open the SFML image and the SFML texture - newTexture->image.loadFromFile(fileName.ToLocale()); - newTexture->texture.loadFromImage( - newTexture->image); // Do not forget to update the associated texture - - scene.GetImageManager()->SetSFMLTextureAsPermanentlyLoaded(imageName, - newTexture); -} - -void GD_EXTENSION_API SaveSFMLTextureToFile(RuntimeScene& scene, - const gd::String& fileName, - const gd::String& imageName) { - if (!scene.GetImageManager()->HasLoadedSFMLTexture(imageName)) return; - - scene.GetImageManager()->GetSFMLTexture(imageName)->image.saveToFile( - fileName.ToLocale()); -} - -} // namespace PrimitiveDrawingTools -} // namespace GDpriv diff --git a/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.h b/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.h deleted file mode 100644 index acbd694d5..000000000 --- a/Extensions/PrimitiveDrawing/PrimitiveDrawingTools.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - -GDevelop - Primitive Drawing Extension -Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ -#ifndef PRIMITIVEDRAWINGTOOLS_H -#define PRIMITIVEDRAWINGTOOLS_H -#include -class RuntimeScene; -namespace sf { -class Color; -} -namespace gd { -class String; -} - -namespace GDpriv { -namespace PrimitiveDrawingTools { - -void GD_EXTENSION_API CopyImageOnAnother(const gd::String& destName, - const gd::String& srcName, - float destX, - float destY, - bool useTransparency, - RuntimeScene& scene); -void GD_EXTENSION_API CaptureScreen(RuntimeScene& scene, - const gd::String& destFileName, - const gd::String& destImageName); -void GD_EXTENSION_API CreateSFMLTexture(RuntimeScene& scene, - const gd::String& imageName, - unsigned int width, - unsigned int height, - const gd::String& color); -void GD_EXTENSION_API OpenSFMLTextureFromFile(RuntimeScene& scene, - const gd::String& fileName, - const gd::String& imageName); -void GD_EXTENSION_API SaveSFMLTextureToFile(RuntimeScene& scene, - const gd::String& fileName, - const gd::String& imageName); - -} // namespace PrimitiveDrawingTools -} // namespace GDpriv - -#endif // PRIMITIVEDRAWINGTOOLS_H diff --git a/Extensions/PrimitiveDrawing/ShapePainterObject.cpp b/Extensions/PrimitiveDrawing/ShapePainterObject.cpp index dbda4c151..811b72eed 100644 --- a/Extensions/PrimitiveDrawing/ShapePainterObject.cpp +++ b/Extensions/PrimitiveDrawing/ShapePainterObject.cpp @@ -5,21 +5,16 @@ Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/InitialInstance.h" +#include "GDCore/Project/Object.h" +#include "GDCore/Project/Project.h" +#include "GDCore/Serialization/SerializerElement.h" #include "ShapePainterObject.h" #if defined(GD_IDE_ONLY) -#include "GDCpp/Runtime/CommonTools.h" +#include "GDCore/CommonTools.h" #endif using namespace std; @@ -39,12 +34,6 @@ ShapePainterObjectBase::ShapePainterObjectBase() ShapePainterObject::ShapePainterObject(gd::String name_) : gd::Object(name_) {} -RuntimeShapePainterObject::RuntimeShapePainterObject( - RuntimeScene& scene, const ShapePainterObject& shapePainterObject) - : RuntimeObject(scene, shapePainterObject) { - ShapePainterObjectBase::operator=(shapePainterObject); -} - void ShapePainterObjectBase::DoUnserializeFrom( const gd::SerializerElement& element) { fillOpacity = @@ -104,80 +93,6 @@ void ShapePainterObject::DoSerializeTo(gd::SerializerElement& element) const { } #endif -/** - * Render object at runtime - */ -bool RuntimeShapePainterObject::Draw(sf::RenderTarget& renderTarget) { - // Don't draw anything if hidden - if (hidden) { - shapesToDraw.clear(); - return true; - } - - for (std::size_t i = 0; i < shapesToDraw.size(); ++i) { - renderTarget.draw(shapesToDraw[i].rectangleShape); - renderTarget.draw(shapesToDraw[i].circleShape); - } - - shapesToDraw.clear(); - - return true; -} - -#if defined(GD_IDE_ONLY) -void RuntimeShapePainterObject::GetPropertyForDebugger( - std::size_t propertyNb, gd::String& name, gd::String& value) const { - if (propertyNb == 0) { - name = _("Fill color"); - value = gd::String::From(GetFillColorR()) + ";" + - gd::String::From(GetFillColorG()) + ";" + - gd::String::From(GetFillColorB()); - } else if (propertyNb == 1) { - name = _("Fill opacity"); - value = gd::String::From(GetFillOpacity()); - } else if (propertyNb == 2) { - name = _("Outline size"); - value = gd::String::From(GetOutlineSize()); - } else if (propertyNb == 3) { - name = _("Outline color"); - value = gd::String::From(GetOutlineColorR()) + ";" + - gd::String::From(GetOutlineColorG()) + ";" + - gd::String::From(GetOutlineColorB()); - } else if (propertyNb == 4) { - name = _("Outline opacity"); - value = gd::String::From(GetOutlineOpacity()); - } -} - -bool RuntimeShapePainterObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - std::vector colors = newValue.Split(U';'); - if (colors.size() < 3) return false; // Color is not valid - - SetFillColor(colors[0].To(), colors[1].To(), colors[2].To()); - } else if (propertyNb == 1) { - SetFillOpacity(newValue.To()); - } else if (propertyNb == 2) { - SetOutlineSize(newValue.To()); - } else if (propertyNb == 3) { - std::vector colors = newValue.Split(U';'); - if (colors.size() < 3) return false; // Color is not valid - - SetOutlineColor( - colors[0].To(), colors[1].To(), colors[2].To()); - } else if (propertyNb == 4) { - SetOutlineOpacity(newValue.To()); - } - - return true; -} - -std::size_t RuntimeShapePainterObject::GetNumberOfProperties() const { - return 5; -} -#endif - /** * Change the color filter of the sprite object */ @@ -241,63 +156,3 @@ void ShapePainterObjectBase::SetOutlineColor(const gd::String& color) { outlineColorG = colors[1].To(); outlineColorB = colors[2].To(); } - -void RuntimeShapePainterObject::DrawRectangle(float x, - float y, - float x2, - float y2) { - float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); - float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); - - DrawingCommand command(sf::RectangleShape(sf::Vector2f(x2 - x, y2 - y))); - command.rectangleShape.setPosition(x + Xgap, y + Ygap); - command.rectangleShape.setFillColor(sf::Color( - GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); - command.rectangleShape.setOutlineThickness(GetOutlineSize()); - command.rectangleShape.setOutlineColor(sf::Color(GetOutlineColorR(), - GetOutlineColorG(), - GetOutlineColorB(), - GetOutlineOpacity())); - - shapesToDraw.push_back(command); -} - -void RuntimeShapePainterObject::DrawLine( - float x, float y, float x2, float y2, float thickness) { - float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); - float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); - - float length = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); - DrawingCommand command(sf::RectangleShape(sf::Vector2f(length, thickness))); - command.rectangleShape.setPosition((x + x2) / 2 + Xgap, (y + y2) / 2 + Ygap); - command.rectangleShape.setOrigin(length / 2, thickness / 2); - command.rectangleShape.setRotation(atan2(y2 - y, x2 - x) * 180 / 3.14159); - command.rectangleShape.setFillColor(sf::Color( - GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); - command.rectangleShape.setOutlineThickness(GetOutlineSize()); - command.rectangleShape.setOutlineColor(sf::Color(GetOutlineColorR(), - GetOutlineColorG(), - GetOutlineColorB(), - GetOutlineOpacity())); - - shapesToDraw.push_back(command); -} - -void RuntimeShapePainterObject::DrawCircle(float x, float y, float radius) { - float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); - float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); - - sf::CircleShape circle(radius); - DrawingCommand command(circle); - command.circleShape.setPosition(x + Xgap, y + Ygap); - command.circleShape.setOrigin(radius, radius); - command.circleShape.setFillColor(sf::Color( - GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); - command.circleShape.setOutlineThickness(GetOutlineSize()); - command.circleShape.setOutlineColor(sf::Color(GetOutlineColorR(), - GetOutlineColorG(), - GetOutlineColorB(), - GetOutlineOpacity())); - - shapesToDraw.push_back(command); -} diff --git a/Extensions/PrimitiveDrawing/ShapePainterObject.h b/Extensions/PrimitiveDrawing/ShapePainterObject.h index 981db0645..4b7e869ae 100644 --- a/Extensions/PrimitiveDrawing/ShapePainterObject.h +++ b/Extensions/PrimitiveDrawing/ShapePainterObject.h @@ -5,42 +5,15 @@ Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#ifndef DRAWEROBJECT_H -#define DRAWEROBJECT_H - -#include -#include +#ifndef SHAPEPAINTEROBJECT_H +#define SHAPEPAINTEROBJECT_H #include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -namespace sf { -class Sprite; -class Texture; -} // namespace sf -class RuntimeScene; +#include "GDCore/Project/Object.h" namespace gd { class Object; class InitialInstance; -} // namespace gd -#if defined(GD_IDE_ONLY) -namespace gd { class Project; } -#endif - -/** - * \brief Internal class to define a shape to be drawn - */ -class GD_EXTENSION_API DrawingCommand { - public: - DrawingCommand(const sf::RectangleShape& rectangleShape_) - : rectangleShape(rectangleShape_){}; - DrawingCommand(const sf::CircleShape& circleShape_) - : circleShape(circleShape_){}; - - sf::RectangleShape rectangleShape; - sf::CircleShape circleShape; -}; /** * \brief Base object storing the setup of a drawer object. @@ -129,39 +102,4 @@ class GD_EXTENSION_API ShapePainterObject : public gd::Object, #endif }; -class GD_EXTENSION_API RuntimeShapePainterObject - : public RuntimeObject, - public ShapePainterObjectBase { - public: - RuntimeShapePainterObject(RuntimeScene& scene, - const ShapePainterObject& shapePainterObject); - virtual ~RuntimeShapePainterObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool Draw(sf::RenderTarget& renderTarget); - - virtual float GetWidth() const { return 32; }; - virtual float GetHeight() const { return 32; }; - - virtual bool SetAngle(float newAngle) { return false; }; - virtual float GetAngle() const { return 0; }; - - void DrawRectangle(float x, float y, float x2, float y2); - void DrawLine(float x, float y, float x2, float y2, float thickness); - void DrawCircle(float x, float y, float radius); - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - private: - std::vector shapesToDraw; -}; - -#endif // DRAWEROBJECT_H +#endif // SHAPEPAINTEROBJECT_H diff --git a/Extensions/SystemInfo/CMakeLists.txt b/Extensions/SystemInfo/CMakeLists.txt index 4b95291af..fda8af756 100644 --- a/Extensions/SystemInfo/CMakeLists.txt +++ b/Extensions/SystemInfo/CMakeLists.txt @@ -2,7 +2,6 @@ cmake_minimum_required(VERSION 2.6) cmake_policy(SET CMP0015 NEW) project(SystemInfo) - gd_add_extension_includes() #Defines @@ -14,14 +13,8 @@ gd_add_extension_definitions(SystemInfo) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(SystemInfo "${source_files}") - gd_add_extension_target(SystemInfo "${source_files}") -gdcpp_add_runtime_extension_target(SystemInfo_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(SystemInfo) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(SystemInfo_Runtime) diff --git a/Extensions/SystemInfo/Extension.cpp b/Extensions/SystemInfo/Extension.cpp index 92ca5aebf..9da20da78 100644 --- a/Extensions/SystemInfo/Extension.cpp +++ b/Extensions/SystemInfo/Extension.cpp @@ -5,7 +5,8 @@ Copyright (c) 2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" void DeclareSystemInfoExtension(gd::PlatformExtension& extension) { extension.SetExtensionInformation( @@ -71,32 +72,3 @@ void DeclareSystemInfoExtension(gd::PlatformExtension& extension) { .AddCodeOnlyParameter("currentScene", ""); #endif } - -/** - * \brief This class declares information about the extension. - */ -class SystemInfoCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - SystemInfoCppExtension() { - DeclareSystemInfoExtension(*this); - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppSystemInfoExtension() { - return new SystemInfoCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new SystemInfoCppExtension; -} -#endif diff --git a/Extensions/SystemInfo/JsExtension.cpp b/Extensions/SystemInfo/JsExtension.cpp index fb2ed3e94..cded48553 100644 --- a/Extensions/SystemInfo/JsExtension.cpp +++ b/Extensions/SystemInfo/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "GDCore/Tools/Localization.h" diff --git a/Extensions/TextEntryObject/CMakeLists.txt b/Extensions/TextEntryObject/CMakeLists.txt index 4a9ca1602..06deff52f 100644 --- a/Extensions/TextEntryObject/CMakeLists.txt +++ b/Extensions/TextEntryObject/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(TextEntryObject) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(TextEntryObject "${source_files}") - gd_add_extension_target(TextEntryObject "${source_files}") -gdcpp_add_runtime_extension_target(TextEntryObject_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(TextEntryObject) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(TextEntryObject_Runtime) diff --git a/Extensions/TextEntryObject/Extension.cpp b/Extensions/TextEntryObject/Extension.cpp index fb1a5d256..07a830ff9 100644 --- a/Extensions/TextEntryObject/Extension.cpp +++ b/Extensions/TextEntryObject/Extension.cpp @@ -5,7 +5,8 @@ Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "TextEntryObject.h" void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) { @@ -92,32 +93,3 @@ void DeclareTextEntryObjectExtension(gd::PlatformExtension& extension) { .SetIncludeFile("TextObject/TextObject.h"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class Extension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - Extension() { - DeclareTextEntryObjectExtension(*this); - AddRuntimeObject( - GetObjectMetadata("TextEntryObject::TextEntry"), - "RuntimeTextEntryObject"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new Extension; -} -#endif diff --git a/Extensions/TextEntryObject/TextEntryObject.cpp b/Extensions/TextEntryObject/TextEntryObject.cpp index 376700baa..b904cc174 100644 --- a/Extensions/TextEntryObject/TextEntryObject.cpp +++ b/Extensions/TextEntryObject/TextEntryObject.cpp @@ -5,76 +5,9 @@ Copyright (c) 2011-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include -#include -#include "GDCore/Tools/Localization.h" -#include "GDCore/Utf8/utf8.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/Project/Object.h" #include "TextEntryObject.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -#include "GDCpp/Runtime/CommonTools.h" -#endif using namespace std; TextEntryObject::TextEntryObject(gd::String name_) : Object(name_) {} - -RuntimeTextEntryObject::RuntimeTextEntryObject( - RuntimeScene& scene_, const TextEntryObject& textEntryObject) - : RuntimeObject(scene_, textEntryObject), text(), activated(true) {} - -/** - * \brief Used to update input - */ -void RuntimeTextEntryObject::Update(const RuntimeScene& scene) { - if (!activated) return; - - // Retrieve text entered - const auto& characters = scene.GetInputManager().GetCharactersEntered(); - for (std::size_t i = 0; i < characters.size(); ++i) { - // Skip some non displayable characters - if (characters[i] > 30 && (characters[i] < 127 || characters[i] > 159)) { - text += static_cast(characters[i]); - } else if (characters[i] == 8) { - // Backspace : find the previous codepoint and remove it - if (text.empty()) continue; - - text.pop_back(); - } - } -} - -#if defined(GD_IDE_ONLY) -void RuntimeTextEntryObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - if (propertyNb == 0) { - name = _("Text in memory"); - value = GetString(); - } else if (propertyNb == 1) { - name = _("Activated \?"); - value = activated ? _("Yes") : _("No"); - } -} - -bool RuntimeTextEntryObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - SetString(newValue); - return true; - } else if (propertyNb == 1) { - activated = (newValue != _("No")); - return true; - } - - return true; -} - -std::size_t RuntimeTextEntryObject::GetNumberOfProperties() const { return 2; } -#endif diff --git a/Extensions/TextEntryObject/TextEntryObject.h b/Extensions/TextEntryObject/TextEntryObject.h index f77bb7ce1..ab2df14a2 100644 --- a/Extensions/TextEntryObject/TextEntryObject.h +++ b/Extensions/TextEntryObject/TextEntryObject.h @@ -7,9 +7,7 @@ This project is released under the MIT License. #ifndef TEXTENTRYOBJECT_H #define TEXTENTRYOBJECT_H -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class RuntimeScene; +#include "GDCore/Project/Object.h" /** * \brief Simple object which stores user keyboard input. @@ -25,34 +23,4 @@ class GD_EXTENSION_API TextEntryObject : public gd::Object { private: }; -class GD_EXTENSION_API RuntimeTextEntryObject : public RuntimeObject { - public: - RuntimeTextEntryObject(RuntimeScene& scene, - const TextEntryObject& textEntryObject); - virtual ~RuntimeTextEntryObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - virtual void Update(const RuntimeScene& scene); - - inline void SetString(gd::String str) { text = str; }; - const gd::String& GetString() const { return text; }; - - void Activate(bool activate = true) { activated = activate; }; - bool IsActivated() const { return activated; }; - - private: - gd::String text; - bool activated; -}; - #endif // TEXTENTRYOBJECT_H diff --git a/Extensions/TextObject/CMakeLists.txt b/Extensions/TextObject/CMakeLists.txt index d897d36e6..07e907461 100644 --- a/Extensions/TextObject/CMakeLists.txt +++ b/Extensions/TextObject/CMakeLists.txt @@ -12,23 +12,9 @@ gd_add_extension_definitions(TextObject) ### include_directories(.) file(GLOB source_files *.cpp *.h) -file(GLOB gui_only_files Dialogs/*.cpp Dialogs/*.h) - -IF(NO_GUI) - SET(ide_source_files "${source_files}") -ELSE() - SET(ide_source_files "${source_files};${gui_only_files}") -ENDIF() - - -gd_add_clang_utils(TextObject "${ide_source_files}") -gd_add_extension_target(TextObject "${ide_source_files}") -gdcpp_add_runtime_extension_target(TextObject_Runtime "${source_files}") +gd_add_clang_utils(TextObject "${source_files}") +gd_add_extension_target(TextObject "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(TextObject) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(TextObject_Runtime) diff --git a/Extensions/TextObject/Extension.cpp b/Extensions/TextObject/Extension.cpp index 69f1281d1..d2b43925e 100644 --- a/Extensions/TextObject/Extension.cpp +++ b/Extensions/TextObject/Extension.cpp @@ -10,7 +10,7 @@ This project is released under the MIT License. */ #include "GDCore/Extensions/PlatformExtension.h" -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Tools/Localization.h" #include "TextObject.h" void DeclareTextObjectExtension(gd::PlatformExtension& extension) { @@ -546,35 +546,3 @@ void DeclareTextObjectExtension(gd::PlatformExtension& extension) { .SetIncludeFile("TextObject/TextObject.h"); #endif } - -/** - * \brief This class declares information about the C++ extension. - */ -class Extension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - Extension() { - DeclareTextObjectExtension(*this); - AddRuntimeObject( - GetObjectMetadata("TextObject::Text"), "RuntimeTextObject"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppTextObjectExtension() { - return new Extension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new Extension; -} -#endif diff --git a/Extensions/TextObject/JsExtension.cpp b/Extensions/TextObject/JsExtension.cpp index 52bb808f9..1ce093679 100644 --- a/Extensions/TextObject/JsExtension.cpp +++ b/Extensions/TextObject/JsExtension.cpp @@ -6,6 +6,7 @@ This project is released under the MIT License. */ #if defined(GD_IDE_ONLY) #include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "TextObject.h" diff --git a/Extensions/TextObject/TextObject.cpp b/Extensions/TextObject/TextObject.cpp index cc9999b58..f25ef279c 100644 --- a/Extensions/TextObject/TextObject.cpp +++ b/Extensions/TextObject/TextObject.cpp @@ -5,23 +5,16 @@ Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/InitialInstance.h" +#include "GDCore/Project/Object.h" +#include "GDCore/Serialization/SerializerElement.h" #include "TextObject.h" #if defined(GD_IDE_ONLY) #include "GDCore/IDE/AbstractFileSystem.h" #include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -namespace gd { -class MainFrameWrapper; -} #endif using namespace std; @@ -80,230 +73,3 @@ void TextObject::ExposeResources(gd::ArbitraryResourceWorker& worker) { worker.ExposeFont(fontName); } #endif - -/* RuntimeTextObject : */ - -RuntimeTextObject::RuntimeTextObject(RuntimeScene& scene, - const TextObject& textObject) - : RuntimeObject(scene, textObject), opacity(255), angle(0) { - ChangeFont(textObject.GetFontName()); - SetSmooth(textObject.IsSmoothed()); - SetColor( - textObject.GetColorR(), textObject.GetColorG(), textObject.GetColorB()); - SetString(textObject.GetString()); - SetCharacterSize(textObject.GetCharacterSize()); - SetAngle(0); - SetBold(textObject.IsBold()); - SetItalic(textObject.IsItalic()); - SetUnderlined(textObject.IsUnderlined()); -} - -bool RuntimeTextObject::Draw(sf::RenderTarget& renderTarget) { - if (hidden) return true; // Don't draw anything if hidden - - renderTarget.draw(text); - return true; -} - -void RuntimeTextObject::OnPositionChanged() { - text.setPosition(GetX() + text.getOrigin().x, GetY() + text.getOrigin().y); -} - -/** - * RuntimeTextObject provides a basic bounding box. - */ -std::vector RuntimeTextObject::GetHitBoxes() const { - std::vector mask; - Polygon2d rectangle = Polygon2d::CreateRectangle(GetWidth(), GetHeight()); - rectangle.Rotate(GetAngle() / 180 * 3.14159); - rectangle.Move(GetX() + GetCenterX(), GetY() + GetCenterY()); - - mask.push_back(rectangle); - return mask; -} - -/** - * Get the real X position of the sprite - */ -float RuntimeTextObject::GetDrawableX() const { - return text.getPosition().x - text.getOrigin().x; -} - -/** - * Get the real Y position of the text - */ -float RuntimeTextObject::GetDrawableY() const { - return text.getPosition().y - text.getOrigin().y; -} - -/** - * Width is the width of the current sprite. - */ -float RuntimeTextObject::GetWidth() const { - return text.getLocalBounds().width; -} - -/** - * Height is the height of the current sprite. - */ -float RuntimeTextObject::GetHeight() const { - return text.getLocalBounds().height + text.getLocalBounds().top; -} - -void RuntimeTextObject::SetString(const gd::String& str) { - text.setString(str); - text.setOrigin(text.getLocalBounds().width / 2, - text.getLocalBounds().height / 2); -} - -gd::String RuntimeTextObject::GetString() const { return text.getString(); } - -/** - * Change the color filter of the sprite object - */ -void RuntimeTextObject::SetColor(unsigned int r, - unsigned int g, - unsigned int b) { - text.setFillColor(sf::Color(r, g, b, opacity)); -} - -void RuntimeTextObject::SetColor(const gd::String& colorStr) { - std::vector colors = colorStr.Split(U';'); - - if (colors.size() < 3) return; // La couleur est incorrecte - - SetColor(colors[0].To(), colors[1].To(), colors[2].To()); -} - -void RuntimeTextObject::SetOpacity(float val) { - if (val > 255) - val = 255; - else if (val < 0) - val = 0; - - opacity = val; - const sf::Color& currentColor = text.getFillColor(); - text.setFillColor( - sf::Color(currentColor.r, currentColor.g, currentColor.b, opacity)); -} - -void RuntimeTextObject::ChangeFont(const gd::String& fontName_) { - if (!text.getFont() || fontName_ != fontName) { - fontName = fontName_; - text.setFont(*FontManager::Get()->GetFont(fontName)); - text.setOrigin(text.getLocalBounds().width / 2, - text.getLocalBounds().height / 2); - OnPositionChanged(); - SetSmooth(smoothed); // Ensure texture smoothing is up to date. - } -} - -void RuntimeTextObject::SetFontStyle(int style) { text.setStyle(style); } - -int RuntimeTextObject::GetFontStyle() { return text.getStyle(); } - -bool RuntimeTextObject::HasFontStyle(sf::Text::Style style) { - return (text.getStyle() & style) != 0; -} - -bool RuntimeTextObject::IsBold() { return HasFontStyle(sf::Text::Bold); } - -void RuntimeTextObject::SetBold(bool bold) { - SetFontStyle((bold ? sf::Text::Bold : 0) | - (IsItalic() ? sf::Text::Italic : 0) | - (IsUnderlined() ? sf::Text::Underlined : 0)); -} - -bool RuntimeTextObject::IsItalic() { return HasFontStyle(sf::Text::Italic); } - -void RuntimeTextObject::SetItalic(bool italic) { - SetFontStyle((IsBold() ? sf::Text::Bold : 0) | - (italic ? sf::Text::Italic : 0) | - (IsUnderlined() ? sf::Text::Underlined : 0)); -} - -bool RuntimeTextObject::IsUnderlined() { - return HasFontStyle(sf::Text::Underlined); -} - -void RuntimeTextObject::SetUnderlined(bool underlined) { - SetFontStyle((IsBold() ? sf::Text::Bold : 0) | - (IsItalic() ? sf::Text::Italic : 0) | - (underlined ? sf::Text::Underlined : 0)); -} - -void RuntimeTextObject::SetSmooth(bool smooth) { - smoothed = smooth; - - if (text.getFont()) - const_cast(text.getFont()->getTexture(GetCharacterSize())) - .setSmooth(smooth); -} - -#if defined(GD_IDE_ONLY) -void RuntimeTextObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - if (propertyNb == 0) { - name = _("Text"); - value = GetString(); - } else if (propertyNb == 1) { - name = _("Font"); - value = GetFontName(); - } else if (propertyNb == 2) { - name = _("Font Size"); - value = gd::String::From(GetCharacterSize()); - } else if (propertyNb == 3) { - name = _("Color"); - value = gd::String::From(GetColorR()) + ";" + - gd::String::From(GetColorG()) + ";" + gd::String::From(GetColorB()); - } else if (propertyNb == 4) { - name = _("Opacity"); - value = gd::String::From(GetOpacity()); - } else if (propertyNb == 5) { - name = _("Smoothing"); - value = smoothed ? _("Yes") : _("No"); - } -} - -bool RuntimeTextObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - SetString(newValue); - return true; - } else if (propertyNb == 1) { - ChangeFont(newValue); - } else if (propertyNb == 2) { - SetCharacterSize(std::max(1, newValue.To())); - } else if (propertyNb == 3) { - gd::String r, gb, g, b; - { - size_t separationPos = newValue.find(";"); - - if (separationPos > newValue.length()) return false; - - r = newValue.substr(0, separationPos); - gb = newValue.substr(separationPos + 1, newValue.length()); - } - - { - size_t separationPos = gb.find(";"); - - if (separationPos > gb.length()) return false; - - g = gb.substr(0, separationPos); - b = gb.substr(separationPos + 1, gb.length()); - } - - SetColor(r.To(), g.To(), b.To()); - } else if (propertyNb == 4) { - SetOpacity(std::min(std::max(0.0f, newValue.To()), 255.0f)); - } else if (propertyNb == 5) { - SetSmooth(!(newValue == _("No"))); - } - - return true; -} - -std::size_t RuntimeTextObject::GetNumberOfProperties() const { return 6; } -#endif diff --git a/Extensions/TextObject/TextObject.h b/Extensions/TextObject/TextObject.h index a4ad56d0a..6a8b61604 100644 --- a/Extensions/TextObject/TextObject.h +++ b/Extensions/TextObject/TextObject.h @@ -7,12 +7,7 @@ This project is released under the MIT License. #ifndef TEXTOBJECT_H #define TEXTOBJECT_H - -#include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/String.h" -class RuntimeScene; +#include "GDCore/Project/Object.h" namespace gd { class Project; class Object; @@ -94,88 +89,4 @@ class GD_EXTENSION_API TextObject : public gd::Object { unsigned int colorB; }; -class GD_EXTENSION_API RuntimeTextObject : public RuntimeObject { - public: - RuntimeTextObject(RuntimeScene& scene, const TextObject& textObject); - virtual ~RuntimeTextObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool Draw(sf::RenderTarget& renderTarget); - - virtual void OnPositionChanged(); - - virtual float GetWidth() const; - virtual float GetHeight() const; - - virtual float GetDrawableX() const; - virtual float GetDrawableY() const; - - virtual bool SetAngle(float newAngle) { - angle = newAngle; - text.setRotation(angle); - return true; - }; - virtual float GetAngle() const { return angle; }; - - void SetString(const gd::String& str); - gd::String GetString() const; - - inline void SetCharacterSize(float size) { - text.setCharacterSize(size); - text.setOrigin(text.getLocalBounds().width / 2, - text.getLocalBounds().height / 2); - }; - inline float GetCharacterSize() const { return text.getCharacterSize(); }; - - /** \brief Change the text object font filename and reload the font - */ - void ChangeFont(const gd::String& fontFilename); - - /** \brief Return the font resource name. - */ - inline gd::String GetFontName() const { return fontName; }; - - void SetFontStyle(int style); - int GetFontStyle(); - bool HasFontStyle(sf::Text::Style style); - - bool IsBold(); - void SetBold(bool bold); - bool IsItalic(); - void SetItalic(bool italic); - bool IsUnderlined(); - void SetUnderlined(bool underlined); - - void SetSmooth(bool smooth); - bool IsSmoothed() const { return smoothed; }; - - void SetOpacity(float val); - float GetOpacity() const { return opacity; }; - - void SetColor(unsigned int r, unsigned int g, unsigned int b); - void SetColor(const gd::String& colorStr); - unsigned int GetColorR() const { return text.getFillColor().r; }; - unsigned int GetColorG() const { return text.getFillColor().g; }; - unsigned int GetColorB() const { return text.getFillColor().b; }; - - virtual std::vector GetHitBoxes() const; - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - private: - sf::Text text; - gd::String fontName; - float opacity; - bool smoothed; - float angle; -}; - #endif // TEXTOBJECT_H diff --git a/Extensions/TiledSpriteObject/CMakeLists.txt b/Extensions/TiledSpriteObject/CMakeLists.txt index 4022cb946..07a1d6246 100644 --- a/Extensions/TiledSpriteObject/CMakeLists.txt +++ b/Extensions/TiledSpriteObject/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(TiledSpriteObject) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(TiledSpriteObject "${source_files}") - gd_add_extension_target(TiledSpriteObject "${source_files}") -gdcpp_add_runtime_extension_target(TiledSpriteObject_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(TiledSpriteObject) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(TiledSpriteObject_Runtime) diff --git a/Extensions/TiledSpriteObject/Extension.cpp b/Extensions/TiledSpriteObject/Extension.cpp index 90ca3f7d7..2e241ebf9 100644 --- a/Extensions/TiledSpriteObject/Extension.cpp +++ b/Extensions/TiledSpriteObject/Extension.cpp @@ -8,7 +8,8 @@ This project is released under the MIT License. #include -#include "GDCpp/Extensions/ExtensionBase.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Tools/Localization.h" #include "TiledSpriteObject.h" void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) { @@ -219,36 +220,3 @@ void DeclareTiledSpriteObjectExtension(gd::PlatformExtension& extension) { .SetIncludeFile("TiledSpriteObject/TiledSpriteObject.h"); #endif } - -/** - * \brief This class declares information about the extension. - */ -class TiledSpriteObjectCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - TiledSpriteObjectCppExtension() { - DeclareTiledSpriteObjectExtension(*this); - AddRuntimeObject( - GetObjectMetadata("TiledSpriteObject::TiledSprite"), - "RuntimeTiledSpriteObject"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppTiledSpriteObjectExtension() { - return new TiledSpriteObjectCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new TiledSpriteObjectCppExtension; -} -#endif diff --git a/Extensions/TiledSpriteObject/TiledSpriteObject.cpp b/Extensions/TiledSpriteObject/TiledSpriteObject.cpp index 7c0a6d96c..c060e1503 100644 --- a/Extensions/TiledSpriteObject/TiledSpriteObject.cpp +++ b/Extensions/TiledSpriteObject/TiledSpriteObject.cpp @@ -6,18 +6,12 @@ Copyright (c) 2014-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include #include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/InitialInstance.h" +#include "GDCore/Project/Object.h" +#include "GDCore/Project/Project.h" +#include "GDCore/Serialization/SerializerElement.h" #include "TiledSpriteObject.h" #if defined(GD_IDE_ONLY) @@ -42,176 +36,8 @@ void TiledSpriteObject::DoSerializeTo(gd::SerializerElement& element) const { element.SetAttribute("width", width); element.SetAttribute("height", height); } -#endif -namespace { -sf::Vector2f RotatePoint(sf::Vector2f point, float angle) { - float t, cosa = cos(-angle), - sina = sin(-angle); // We want a clockwise rotation - - t = point.x; - point.x = t * cosa + point.y * sina; - point.y = -t * sina + point.y * cosa; - - return point; -} -} // namespace - -RuntimeTiledSpriteObject::RuntimeTiledSpriteObject( - RuntimeScene& scene, const TiledSpriteObject& tiledSpriteObject) - : RuntimeObject(scene, tiledSpriteObject), - width(32), - height(32), - xOffset(0), - yOffset(), - angle(0) { - SetWidth(tiledSpriteObject.GetWidth()); - SetHeight(tiledSpriteObject.GetHeight()); - - textureName = tiledSpriteObject.textureName; - ChangeAndReloadImage(textureName, scene); -} - -void RuntimeTiledSpriteObject::ChangeAndReloadImage(const gd::String& txtName, - const RuntimeScene& scene) { - textureName = txtName; - texture = scene.GetImageManager()->GetSFMLTexture(textureName); -} - -/** - * Render object at runtime - */ -bool RuntimeTiledSpriteObject::Draw(sf::RenderTarget& window) { - // Don't draw anything if hidden - if (hidden) return true; - if (!texture) return true; - -#if defined(ANDROID) - const unsigned int textureWidth = texture->texture.getSize().x; - const unsigned int textureHeight = texture->texture.getSize().y; - std::vector vertices; - vertices.resize((static_cast(GetWidth() / textureWidth) + 1u) * - (static_cast(GetHeight() / textureHeight) + 1u) * - 6); - for (unsigned int i = 0; - i < (static_cast(GetWidth() / textureWidth) + 1u); - i++) { - for (unsigned int j = 0; - j < (static_cast(GetHeight() / textureHeight) + 1u); - j++) { - // Create the four vertices - sf::Vector2f textureEndPosition( - (i < static_cast(GetWidth() / textureWidth)) - ? textureWidth - : (GetWidth() - i * textureWidth), - (j < static_cast(GetHeight() / textureHeight)) - ? textureHeight - : (GetHeight() - j * textureHeight)); - - sf::Vertex topLeftCorner( - sf::Vector2f(i * textureWidth, j * textureHeight), - sf::Vector2f(0.f, 0.f)); - sf::Vertex topRightCorner( - sf::Vector2f(i * textureWidth + textureEndPosition.x, - j * textureHeight), - sf::Vector2f(textureEndPosition.x, 0.f)); - sf::Vertex bottomRightCorner( - sf::Vector2f(i * textureWidth + textureEndPosition.x, - j * textureHeight + textureEndPosition.y), - sf::Vector2f(textureEndPosition.x, textureEndPosition.y)); - sf::Vertex bottomLeftCorner( - sf::Vector2f(i * textureWidth, - j * textureHeight + textureEndPosition.y), - sf::Vector2f(0.f, textureEndPosition.y)); - - // Insert them to create two triangles - const unsigned int firstVerticePos = - (j * (static_cast(GetWidth() / textureWidth) + 1u) + i) * - 6; - vertices[firstVerticePos] = topLeftCorner; - vertices[firstVerticePos + 1u] = topRightCorner; - vertices[firstVerticePos + 2u] = bottomRightCorner; - vertices[firstVerticePos + 3u] = topLeftCorner; - vertices[firstVerticePos + 4u] = bottomRightCorner; - vertices[firstVerticePos + 5u] = bottomLeftCorner; - } - } - - sf::Transform transform; - transform.translate(-GetWidth() / 2.f, -GetHeight() / 2.f); - transform.rotate(angle); - transform.translate(GetX() + GetWidth() / 2.f, GetY() + GetHeight() / 2.f); - - window.draw( - vertices.data(), - vertices.size(), - sf::Triangles, - sf::RenderStates(sf::BlendAlpha, transform, &texture->texture, nullptr)); -#else - sf::Vector2f centerPosition = - sf::Vector2f(GetX() + GetCenterX(), GetY() + GetCenterY()); - float angleInRad = angle * 3.14159 / 180.0; - - texture->texture.setRepeated(true); - sf::Vertex vertices[] = { - sf::Vertex( - centerPosition + - RotatePoint(sf::Vector2f(-width / 2, -height / 2), angleInRad), - sf::Vector2f(0 + xOffset, 0 + yOffset)), - sf::Vertex( - centerPosition + - RotatePoint(sf::Vector2f(+width / 2, -height / 2), angleInRad), - sf::Vector2f(width + xOffset, 0 + yOffset)), - sf::Vertex( - centerPosition + - RotatePoint(sf::Vector2f(-width / 2, +height / 2), angleInRad), - sf::Vector2f(0 + xOffset, height + yOffset)), - sf::Vertex( - centerPosition + - RotatePoint(sf::Vector2f(+width / 2, +height / 2), angleInRad), - sf::Vector2f(width + xOffset, height + yOffset))}; - - window.draw(vertices, 4, sf::TrianglesStrip, &texture->texture); - texture->texture.setRepeated(false); -#endif - - return true; -} - -#if defined(GD_IDE_ONLY) void TiledSpriteObject::ExposeResources(gd::ArbitraryResourceWorker& worker) { worker.ExposeImage(textureName); } - -void RuntimeTiledSpriteObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - if (propertyNb == 0) { - name = _("Width"); - value = gd::String::From(width); - } else if (propertyNb == 1) { - name = _("Height"); - value = gd::String::From(height); - } else if (propertyNb == 2) { - name = _("Angle"); - value = gd::String::From(angle); - } -} - -bool RuntimeTiledSpriteObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - width = newValue.To(); - } else if (propertyNb == 1) { - height = newValue.To(); - } else if (propertyNb == 2) { - angle = newValue.To(); - } - - return true; -} - -std::size_t RuntimeTiledSpriteObject::GetNumberOfProperties() const { - return 3; -} -#endif +#endif \ No newline at end of file diff --git a/Extensions/TiledSpriteObject/TiledSpriteObject.h b/Extensions/TiledSpriteObject/TiledSpriteObject.h index e249f74f2..89c963727 100644 --- a/Extensions/TiledSpriteObject/TiledSpriteObject.h +++ b/Extensions/TiledSpriteObject/TiledSpriteObject.h @@ -8,18 +8,11 @@ This project is released under the MIT License. #ifndef TILEDSPRITEOBJECT_H #define TILEDSPRITEOBJECT_H #include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class SFMLTextureWrapper; -class RuntimeScene; +#include "GDCore/Project/Object.h" namespace gd { class InitialInstance; -} -#if defined(GD_IDE_ONLY) -namespace gd { class Project; } -#endif /** * TiledSprite Object @@ -59,60 +52,6 @@ class GD_EXTENSION_API TiledSpriteObject : public gd::Object { float width; float height; bool smooth; - - std::shared_ptr texture; -}; - -class GD_EXTENSION_API RuntimeTiledSpriteObject : public RuntimeObject { - public: - RuntimeTiledSpriteObject(RuntimeScene &scene, - const TiledSpriteObject &tiledSpriteObject); - virtual ~RuntimeTiledSpriteObject(){}; - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool Draw(sf::RenderTarget &renderTarget); - - virtual float GetWidth() const { return width; }; - virtual float GetHeight() const { return height; }; - - virtual float GetAngle() const { return angle; }; - virtual bool SetAngle(float ang) { - angle = ang; - return true; - }; - - virtual void SetWidth(float newWidth) { width = newWidth; }; - virtual void SetHeight(float newHeight) { height = newHeight; }; - - void SetXOffset(float xOffset_) { xOffset = xOffset_; }; - float GetXOffset() const { return xOffset; }; - void SetYOffset(float yOffset_) { yOffset = yOffset_; }; - float GetYOffset() const { return yOffset; }; - - void ChangeAndReloadImage(const gd::String &texture, - const RuntimeScene &scene); - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String &name, - gd::String &value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - gd::String textureName; - - private: - float width; - float height; - float angle; - bool smooth; - float xOffset; - float yOffset; - - std::shared_ptr texture; }; #endif // TILEDSPRITEOBJECT_H diff --git a/Extensions/TopDownMovementBehavior/CMakeLists.txt b/Extensions/TopDownMovementBehavior/CMakeLists.txt index 6402cf89d..6978c0710 100644 --- a/Extensions/TopDownMovementBehavior/CMakeLists.txt +++ b/Extensions/TopDownMovementBehavior/CMakeLists.txt @@ -13,14 +13,8 @@ gd_add_extension_definitions(TopDownMovementBehavior) include_directories(.) file(GLOB source_files *.cpp *.h) gd_add_clang_utils(TopDownMovementBehavior "${source_files}") - gd_add_extension_target(TopDownMovementBehavior "${source_files}") -gdcpp_add_runtime_extension_target(TopDownMovementBehavior_Runtime "${source_files}") #Linker files for the IDE extension ### gd_extension_link_libraries(TopDownMovementBehavior) - -#Linker files for the GD C++ Runtime extension -### -gdcpp_runtime_extension_link_libraries(TopDownMovementBehavior_Runtime) diff --git a/Extensions/TopDownMovementBehavior/Extension.cpp b/Extensions/TopDownMovementBehavior/Extension.cpp index b8393a039..175d76f67 100644 --- a/Extensions/TopDownMovementBehavior/Extension.cpp +++ b/Extensions/TopDownMovementBehavior/Extension.cpp @@ -5,10 +5,11 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" +#include "GDCore/Extensions/PlatformExtension.h" +#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h" +#include "GDCore/Tools/Localization.h" +#include "GDCore/Project/BehaviorsSharedData.h" #include "TopDownMovementBehavior.h" -#include "TopDownMovementRuntimeBehavior.h" void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) { extension @@ -540,40 +541,4 @@ void DeclareTopDownMovementBehaviorExtension(gd::PlatformExtension& extension) { .AddParameter("behavior", _("Behavior"), "TopDownMovementBehavior") .UseStandardParameters("number"); #endif -} - -/** - * \brief This class declares information about the extension. - */ -class TopDownMovementBehaviorCppExtension : public ExtensionBase { - public: - /** - * Constructor of an extension declares everything the extension contains: - * objects, actions, conditions and expressions. - */ - TopDownMovementBehaviorCppExtension() { - DeclareTopDownMovementBehaviorExtension(*this); - AddRuntimeBehavior( - GetBehaviorMetadata("TopDownMovementBehavior::TopDownMovementBehavior"), - "TopDownMovementRuntimeBehavior"); - GetBehaviorMetadata("TopDownMovementBehavior::TopDownMovementBehavior") - .SetIncludeFile( - "TopDownMovementBehavior/TopDownMovementRuntimeBehavior.h"); - - GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); - }; -}; - -#if defined(ANDROID) -extern "C" ExtensionBase* CreateGDCppTopDownMovementBehaviorExtension() { - return new TopDownMovementBehaviorCppExtension; -} -#elif !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the extension class - * -- Do not need to be modified. -- - */ -extern "C" ExtensionBase* GD_EXTENSION_API CreateGDExtension() { - return new TopDownMovementBehaviorCppExtension; -} -#endif +} \ No newline at end of file diff --git a/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.cpp b/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.cpp index aee27eab9..d7a4cd205 100644 --- a/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.cpp +++ b/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.cpp @@ -15,12 +15,9 @@ This project is released under the MIT License. #include "GDCore/CommonTools.h" #include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" +#include "GDCore/CommonTools.h" +#include "GDCore/Project/Layout.h" +#include "GDCore/Serialization/SerializerElement.h" #if defined(GD_IDE_ONLY) #include diff --git a/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.h b/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.h index 1d5072184..9348d3a69 100644 --- a/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.h +++ b/Extensions/TopDownMovementBehavior/TopDownMovementBehavior.h @@ -8,8 +8,8 @@ This project is released under the MIT License. #ifndef TOPDOWNMOVEMENTBEHAVIOR_H #define TOPDOWNMOVEMENTBEHAVIOR_H #include -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" +#include "GDCore/Project/Behavior.h" +#include "GDCore/Project/Object.h" namespace gd { class SerializerElement; } // namespace gd @@ -17,7 +17,7 @@ class SerializerElement; /** * \brief Allow to move an object in 4 or 8 directions. */ -class GD_EXTENSION_API TopDownMovementBehavior : public Behavior { +class GD_EXTENSION_API TopDownMovementBehavior : public gd::Behavior { public: TopDownMovementBehavior(){}; virtual ~TopDownMovementBehavior(){}; diff --git a/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.cpp b/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.cpp deleted file mode 100644 index 5ada2ed83..000000000 --- a/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/** - -GDevelop - Top-down movement Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#include "TopDownMovementRuntimeBehavior.h" -#include -#include -#include -#include -#include -#include -#include "GDCore/CommonTools.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" - -TopDownMovementRuntimeBehavior::TopDownMovementRuntimeBehavior( - const gd::SerializerElement& behaviorContent) - : RuntimeBehavior(behaviorContent), - allowDiagonals(true), - acceleration(400), - deceleration(800), - maxSpeed(200), - angularMaxSpeed(180), - rotateObject(true), - angleOffset(0), - xVelocity(0), - yVelocity(0), - angularSpeed(0), - angle(0), - ignoreDefaultControls(false), - leftKey(false), - rightKey(false), - upKey(false), - downKey(false) { - allowDiagonals = behaviorContent.GetBoolAttribute("allowDiagonals"); - acceleration = behaviorContent.GetDoubleAttribute("acceleration"); - deceleration = behaviorContent.GetDoubleAttribute("deceleration"); - maxSpeed = behaviorContent.GetDoubleAttribute("maxSpeed"); - angularMaxSpeed = behaviorContent.GetDoubleAttribute("angularMaxSpeed"); - rotateObject = behaviorContent.GetBoolAttribute("rotateObject"); - angleOffset = behaviorContent.GetDoubleAttribute("angleOffset"); - ignoreDefaultControls = - behaviorContent.GetBoolAttribute("ignoreDefaultControls"); -} - -float TopDownMovementRuntimeBehavior::GetSpeed() const { - return sqrt(xVelocity * xVelocity + yVelocity * yVelocity); -} - -void TopDownMovementRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) { - // Get the player input: - leftKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Left"); - rightKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Right"); - downKey |= - !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Down"); - upKey |= !ignoreDefaultControls && scene.GetInputManager().IsKeyPressed("Up"); - - int direction = -1; - float directionInRad = 0; - float directionInDeg = 0; - if (!allowDiagonals) { - if (upKey && !downKey) - direction = 6; - else if (!upKey && downKey) - direction = 2; - - if (!upKey && !downKey) { - if (leftKey && !rightKey) - direction = 4; - else if (!leftKey && rightKey) - direction = 0; - } - } else { - if (upKey && !downKey) { - if (leftKey && !rightKey) - direction = 5; - else if (!leftKey && rightKey) - direction = 7; - else - direction = 6; - } else if (!upKey && downKey) { - if (leftKey && !rightKey) - direction = 3; - else if (!leftKey && rightKey) - direction = 1; - else - direction = 2; - } else { - if (leftKey && !rightKey) - direction = 4; - else if (!leftKey && rightKey) - direction = 0; - } - } - - // Update the speed of the object - float timeDelta = - static_cast(object->GetElapsedTime(scene)) / 1000000.0; - if (direction != -1) { - directionInRad = static_cast(direction) * gd::Pi() / 4.0; - directionInDeg = static_cast(direction) * 45; - - xVelocity += acceleration * timeDelta * cos(directionInRad); - yVelocity += acceleration * timeDelta * sin(directionInRad); - } else { - directionInRad = atan2(yVelocity, xVelocity); - directionInDeg = atan2(yVelocity, xVelocity) * 180.0 / gd::Pi(); - - bool xVelocityWasPositive = xVelocity >= 0; - bool yVelocityWasPositive = yVelocity >= 0; - xVelocity -= deceleration * timeDelta * cos(directionInRad); - yVelocity -= deceleration * timeDelta * sin(directionInRad); - if ((xVelocity > 0) ^ xVelocityWasPositive) xVelocity = 0; - if ((yVelocity > 0) ^ yVelocityWasPositive) yVelocity = 0; - } - - float speed = sqrt(xVelocity * xVelocity + yVelocity * yVelocity); - if (speed > maxSpeed) { - xVelocity = maxSpeed * cos(directionInRad); - yVelocity = maxSpeed * sin(directionInRad); - } - angularSpeed = angularMaxSpeed; // No acceleration for angular speed for now - - // Position object - object->SetX(object->GetX() + xVelocity * timeDelta); - object->SetY(object->GetY() + yVelocity * timeDelta); - - // Also update angle if needed - if ((xVelocity != 0 || yVelocity != 0)) { - angle = directionInDeg; - - if (rotateObject) { - float angularDiff = GDpriv::MathematicalTools::angleDifference( - object->GetAngle(), directionInDeg + angleOffset); - bool diffWasPositive = angularDiff >= 0; - - float newAngle = object->GetAngle() + (diffWasPositive ? -1.0 : 1.0) * - angularSpeed * timeDelta; - if ((GDpriv::MathematicalTools::angleDifference( - newAngle, directionInDeg + angleOffset) > 0) ^ - diffWasPositive) - newAngle = directionInDeg + angleOffset; - object->SetAngle(newAngle); - - if (object->GetAngle() != - newAngle) // Objects like sprite in 8 directions - // does not handle small increments... - object->SetAngle( - directionInDeg + - angleOffset); //...so force them to be in the path angle anyway. - } - } - - leftKey = false; - rightKey = false; - upKey = false; - downKey = false; -} - -void TopDownMovementRuntimeBehavior::SimulateControl(const gd::String& input) { - if (input == "Left") - leftKey = true; - else if (input == "Right") - rightKey = true; - else if (input == "Up") - upKey = true; - else if (input == "Down") - downKey = true; -} diff --git a/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.h b/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.h deleted file mode 100644 index d06270e63..000000000 --- a/Extensions/TopDownMovementBehavior/TopDownMovementRuntimeBehavior.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - -GDevelop - Top-down movement Behavior Extension -Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com) -This project is released under the MIT License. -*/ - -#ifndef TOPDOWNMOVEMENTRUNTIMEBEHAVIOR_H -#define TOPDOWNMOVEMENTRUNTIMEBEHAVIOR_H -#include -#include -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeObject.h" -class RuntimeScene; -namespace gd { -class SerializerElement; -} - -/** - * \brief Allow to move an object in 4 or 8 directions. - */ -class GD_EXTENSION_API TopDownMovementRuntimeBehavior : public RuntimeBehavior { - public: - TopDownMovementRuntimeBehavior(const gd::SerializerElement& behaviorContent); - virtual ~TopDownMovementRuntimeBehavior(){}; - virtual TopDownMovementRuntimeBehavior* Clone() const { - return new TopDownMovementRuntimeBehavior(*this); - } - - // Configuration: - bool DiagonalsAllowed() const { return allowDiagonals; }; - float GetAcceleration() const { return acceleration; }; - float GetDeceleration() const { return deceleration; }; - float GetMaxSpeed() const { return maxSpeed; }; - float GetAngularMaxSpeed() const { return angularMaxSpeed; }; - bool IsObjectRotated() const { return rotateObject; } - float GetAngleOffset() const { return angleOffset; }; - - void SetAllowDiagonals(bool allowDiagonals_) { - allowDiagonals = allowDiagonals_; - }; - void SetAcceleration(float acceleration_) { acceleration = acceleration_; }; - void SetDeceleration(float deceleration_) { deceleration = deceleration_; }; - void SetMaxSpeed(float maxSpeed_) { maxSpeed = maxSpeed_; }; - void SetAngularMaxSpeed(float angularMaxSpeed_) { - angularMaxSpeed = angularMaxSpeed_; - }; - void SetRotateObject(bool rotateObject_) { rotateObject = rotateObject_; }; - void SetAngleOffset(float angleOffset_) { angleOffset = angleOffset_; }; - - bool IsMoving() const { return xVelocity != 0 || yVelocity != 0; }; - float GetSpeed() const; - float GetXVelocity() const { return xVelocity; }; - float GetYVelocity() const { return yVelocity; }; - float GetAngle() const { return angle; }; - - void IgnoreDefaultControls(bool ignore = true) { - ignoreDefaultControls = ignore; - }; - void SimulateControl(const gd::String& input); - void SimulateLeftKey() { leftKey = true; }; - void SimulateRightKey() { rightKey = true; }; - void SimulateUpKey() { upKey = true; }; - void SimulateDownKey() { downKey = true; }; - - private: - virtual void DoStepPreEvents(RuntimeScene& scene); - - // Behavior configuration: - bool allowDiagonals; - float acceleration; - float deceleration; - float maxSpeed; - float angularMaxSpeed; - bool rotateObject; ///< If true, the object is rotated according to the - ///< current segment's angle. - float angleOffset; ///< Angle offset (added to the angle calculated with the - ///< segment) - - // Attributes used when moving - float xVelocity; - float yVelocity; - float angularSpeed; - float angle; // The latest angle of movement, in degrees. - - bool ignoreDefaultControls; ///< If set to true, do not track the default - ///< inputs. - bool leftKey; - bool rightKey; - bool upKey; - bool downKey; -}; -#endif // TOPDOWNMOVEMENTRUNTIMEBEHAVIOR_H diff --git a/GDCpp/CMakeLists.txt b/GDCpp/CMakeLists.txt deleted file mode 100644 index cecef9d27..000000000 --- a/GDCpp/CMakeLists.txt +++ /dev/null @@ -1,151 +0,0 @@ -cmake_minimum_required(VERSION 2.6) -cmake_policy(SET CMP0015 NEW) - -project(GDCpp) - -#Define common directories: -set(GDCpp_include_dir ${GD_base_dir}/GDCpp PARENT_SCOPE) -set(GDCpp_lib_dir ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME} PARENT_SCOPE) -set(GDCpp_Runtime_lib_dir ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Runtime PARENT_SCOPE) - -#Dependencies on external libraries: -### -include_directories(${sfml_include_dir}) -include_directories(${GDCORE_include_dir}) - -#Defines -### -set(GDCpp_extra_definitions "${GDCpp_extra_definitions} GD_IDE_ONLY=1;") -IF (EMSCRIPTEN) - add_definitions( -DEMSCRIPTEN ) -ENDIF() -IF(CMAKE_BUILD_TYPE MATCHES "Debug") - add_definitions( -DDEBUG ) -ELSE() - add_definitions( -DRELEASE ) -ENDIF() - -IF(WIN32) - add_definitions( -DWINDOWS ) - set(GDCpp_extra_definitions "${GDCpp_extra_definitions} GD_CORE_API=__declspec(dllimport);") - set(GDCpp_extra_definitions "${GDCpp_extra_definitions} GD_API=__declspec(dllexport);") - set(GDCpp_Runtime_extra_definitions "${GDCpp_Runtime_extra_definitions} GD_CORE_API=__declspec(dllexport);") - set(GDCpp_Runtime_extra_definitions "${GDCpp_Runtime_extra_definitions} GD_API=__declspec(dllexport);") - set(GDCpp_Runtime_exe_extra_definitions "${GDCpp_Runtime_exe_extra_definitions} GD_CORE_API=__declspec(dllimport);") - set(GDCpp_Runtime_exe_extra_definitions "${GDCpp_Runtime_exe_extra_definitions} GD_API=__declspec(dllimport);") - - add_definitions( -D__GNUWIN32__ ) -ELSE() - IF(APPLE) - add_definitions( -DMACOS ) - ELSE() - add_definitions( -DLINUX ) - ENDIF() - add_definitions( -DGD_API= ) - add_definitions( -DGD_CORE_API= ) -ENDIF(WIN32) - - -#The targets -### -include_directories(.) - -file(GLOB_RECURSE source_gdcpp_builtin GDCpp/Extensions/*) -file(GLOB_RECURSE source_gdcpp_events GDCpp/Events/*) -file(GLOB source_gdcpp_ide GDCpp/IDE/*) -file(GLOB_RECURSE source_gdcpp_ide_dialogs GDCpp/IDE/Dialogs/*) -file(GLOB_RECURSE source_gdcpp_runtime GDCpp/Runtime/*) - -set(source_files ${source_gdcpp_builtin} ${source_gdcpp_runtime}) -set(ide_source_files ${source_files} ${source_gdcpp_events} ${source_gdcpp_ide}) - -file(GLOB_RECURSE formatted_gdcpp_source_files tests/*.cpp GDCpp/Events/* GDCpp/Extensions/* GDCpp/IDE/*.cpp) -list(REMOVE_ITEM formatted_gdcpp_source_files "${CMAKE_CURRENT_SOURCE_DIR}/GDCpp/IDE/Dialogs/GDCppDialogs.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GDCpp/IDE/Dialogs/GDCppDialogs.h" "${CMAKE_CURRENT_SOURCE_DIR}/GDCpp/IDE/Dialogs/GDCppDialogs_dialogs_bitmaps.cpp") -file(GLOB formatted_gdcpp_runtime_source_files GDCpp/Runtime/*.cpp GDCpp/Runtime/*.h GDCpp/Runtime/Tools/*.cpp GDCpp/Runtime/Tools/*.h GDCpp/Runtime/Serialization/*.cpp GDCpp/Runtime/Serialization/*.h GDCpp/Runtime/Project/*.cpp GDCpp/Runtime/Project/*.h) -set(formatted_source_files ${formatted_gdcpp_source_files} ${formatted_gdcpp_runtime_source_files}) -gd_add_clang_utils(GDCpp "${formatted_source_files}") - -file(GLOB exe_source_files Runtime/*) - -add_library(GDCpp SHARED ${ide_source_files}) -set_target_properties(GDCpp PROPERTIES COMPILE_DEFINITIONS "${GDCpp_extra_definitions}") -set_target_properties(GDCpp PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/") -set_target_properties(GDCpp PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/") -set_target_properties(GDCpp PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/") - -IF(EMSCRIPTEN) - set_target_properties(GDCpp PROPERTIES SUFFIX ".bc") -ELSE() - add_library(GDCpp_Runtime SHARED ${source_files}) - add_dependencies(GDCpp_Runtime GDVersion) - add_executable(GDCpp_Runtime_exe WIN32 ${exe_source_files}) - set_target_properties(GDCpp_Runtime PROPERTIES COMPILE_DEFINITIONS "${GDCpp_Runtime_extra_definitions}") - set_target_properties(GDCpp_Runtime_exe PROPERTIES COMPILE_DEFINITIONS "${GDCpp_Runtime_exe_extra_definitions}") - set_target_properties(GDCpp_Runtime PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Runtime") - set_target_properties(GDCpp_Runtime PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Runtime") - set_target_properties(GDCpp_Runtime PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Runtime") - set_target_properties(GDCpp_Runtime PROPERTIES RUNTIME_OUTPUT_NAME "GDCpp") - set_target_properties(GDCpp_Runtime PROPERTIES ARCHIVE_OUTPUT_NAME "GDCpp") - set_target_properties(GDCpp_Runtime PROPERTIES LIBRARY_OUTPUT_NAME "GDCpp") - set_target_properties(GDCpp_Runtime_exe PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/Runtime") - IF(WIN32) - set_target_properties(GDCpp_Runtime_exe PROPERTIES RUNTIME_OUTPUT_NAME "PlayWin") - set_target_properties(GDCpp PROPERTIES PREFIX "") - set_target_properties(GDCpp_Runtime PROPERTIES PREFIX "") - ELSE() - set_target_properties(GDCpp_Runtime_exe PROPERTIES RUNTIME_OUTPUT_NAME "ExeLinux") - set_target_properties(GDCpp PROPERTIES PREFIX "lib") - set_target_properties(GDCpp_Runtime PROPERTIES PREFIX "lib") - ENDIF(WIN32) -ENDIF() - -#Linker files for GDCpp -### -IF(EMSCRIPTEN) - #Nothing. -ELSE() - target_link_libraries(GDCpp GDCore) - target_link_libraries(GDCpp ${sfml_LIBRARIES}) -ENDIF() - -#Linker files for Runtime -### -IF(EMSCRIPTEN) - #Nothing. -ELSE() - target_link_libraries(GDCpp_Runtime_exe GDCpp_Runtime) - target_link_libraries(GDCpp_Runtime ${sfml_LIBRARIES}) - target_link_libraries(GDCpp_Runtime_exe ${sfml_LIBRARIES}) -ENDIF() - -#Post build tasks -### -IF(EMSCRIPTEN) - #Nothing. -ELSE() - IF(WIN32) - add_custom_target(GDCpp_IDE_Headers - ALL - COMMAND "${GD_base_dir}/GDCpp/scripts/CopyHeadersToGD.bat" "${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform") - ELSE() - add_custom_target(GDCpp_IDE_Headers - ALL - COMMAND sh "CopyHeadersToGD.sh" ${GD_base_dir}/Binaries/Output/${CMAKE_BUILD_TYPE}_${CMAKE_SYSTEM_NAME}/CppPlatform/ - WORKING_DIRECTORY ${GD_base_dir}/GDCpp/scripts) - ENDIF() -ENDIF() - -#Tests -### -if(BUILD_TESTS) - file( - GLOB_RECURSE - test_source_files - tests/* - ) - add_executable(GDCpp_tests ${test_source_files}) - set_target_properties(GDCpp_tests PROPERTIES COMPILE_DEFINITIONS "${GDCpp_Runtime_exe_extra_definitions}") - set_target_properties(GDCpp_tests PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE) #Allow finding dependencies directly from build path on Mac OS X. - target_link_libraries(GDCpp_tests GDCpp_Runtime) - target_link_libraries(GDCpp_tests ${sfml_LIBRARIES}) -endif() diff --git a/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.cpp b/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.cpp deleted file mode 100644 index 0c931a336..000000000 --- a/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) -#include "CppCodeEvent.h" -#include "GDCore/Events/Serialization.h" -#include "GDCore/Events/Tools/EventsCodeNameMangler.h" -#include "GDCore/Project/Layout.h" -#include "GDCore/Project/Project.h" -#include "GDCore/Project/SourceFile.h" -#include "GDCore/Serialization/SerializerElement.h" -#include "GDCore/Tools/FileStream.h" -#include "GDCore/Tools/Localization.h" -#include "GDCore/Tools/Log.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -using namespace std; - -void CppCodeEvent::SerializeTo(gd::SerializerElement& element) const { - element.SetAttribute("functionToCall", functionToCall); - element.SetAttribute("functionNameAutogenerated", functionNameAutogenerated); - element.SetAttribute("inlineCode", inlineCode); - element.SetAttribute("associatedGDManagedSourceFile", - associatedGDManagedSourceFile); - - element.SetAttribute("passSceneAsParameter", passSceneAsParameter); - element.SetAttribute("passObjectListAsParameter", passObjectListAsParameter); - element.SetAttribute("objectToPassAsParameter", objectToPassAsParameter); - - element.SetAttribute("codeDisplayedInEditor", codeDisplayedInEditor); - element.SetAttribute("displayedName", displayedName); - element.SetAttribute("lastChangeTimeStamp", (int)lastChangeTimeStamp); - - gd::SerializerElement& includesElement = element.AddChild("includes"); - includesElement.ConsiderAsArrayOf("include"); - for (std::size_t i = 0; i < includeFiles.size(); ++i) - includesElement.AddChild("include").SetValue(includeFiles[i]); - - gd::SerializerElement& dependenciesElement = element.AddChild("dependencies"); - dependenciesElement.ConsiderAsArrayOf("dependency"); - for (std::size_t i = 0; i < dependencies.size(); ++i) - dependenciesElement.AddChild("dependency") - .SetAttribute("sourceFile", dependencies[i]); -} - -void CppCodeEvent::UnserializeFrom(gd::Project& project, - const gd::SerializerElement& element) { - functionToCall = - element.GetStringAttribute("functionToCall", "", "FunctionToCall"); - functionNameAutogenerated = element.GetBoolAttribute( - "functionNameAutogenerated", false, "FunctionNameAutogenerated"), - inlineCode = element.GetStringAttribute("inlineCode", "", "InlineCode"); - associatedGDManagedSourceFile = element.GetStringAttribute( - "associatedGDManagedSourceFile", "", "AssociatedGDManagedSourceFile"); - - passSceneAsParameter = element.GetBoolAttribute( - "passSceneAsParameter", false, "PassSceneAsParameter"); - passObjectListAsParameter = element.GetBoolAttribute( - "passObjectListAsParameter", false, "PassObjectListAsParameter"); - objectToPassAsParameter = element.GetStringAttribute( - "objectToPassAsParameter", "", "ObjectToPassAsParameter"); - - codeDisplayedInEditor = element.GetBoolAttribute( - "codeDisplayedInEditor", true, "CodeDisplayedInEditor"); - displayedName = - element.GetStringAttribute("displayedName", "", "DisplayedName"); - lastChangeTimeStamp = element.GetIntAttribute("lastChangeTimeStamp"); - - includeFiles.clear(); - gd::SerializerElement& includesElement = - element.GetChild("includes", 0, "Includes"); - includesElement.ConsiderAsArrayOf("include", "Include"); - for (std::size_t i = 0; i < includesElement.GetChildrenCount(); ++i) - includeFiles.push_back(includesElement.GetChild(i).GetValue().GetString()); - - dependencies.clear(); - gd::SerializerElement& dependenciesElement = - element.GetChild("dependencies", 0, "Dependencies"); - dependenciesElement.ConsiderAsArrayOf("dependency", "Dependency"); - for (std::size_t i = 0; i < dependenciesElement.GetChildrenCount(); ++i) - dependencies.push_back( - dependenciesElement.GetChild(i).GetStringAttribute("sourceFile")); -} - -void CppCodeEvent::AutogenerateFunctionName() const { - std::shared_ptr event = originalEvent.lock(); - if (!functionNameAutogenerated) return; - - if (event != std::shared_ptr()) - functionToCall = - "GDCppCode" + - gd::String::From(event.get()); // The name refers to the original event - // being in the original scene. - else - functionToCall = - "GDCppCode" + - gd::String::From(this); // We are the original event: Create the name - // using our address. -} - -const gd::String& CppCodeEvent::GetFunctionToCall() const { - if (functionNameAutogenerated && functionToCall.empty()) - AutogenerateFunctionName(); - - return functionToCall; -}; - -/** - * Initialize from another CppCodeEvent. - * Used by copy ctor and assignement operator - */ -void CppCodeEvent::Init(const CppCodeEvent& event) { - includeFiles = event.includeFiles; - dependencies = event.dependencies; - functionToCall = event.functionToCall; - functionNameAutogenerated = event.functionNameAutogenerated; - inlineCode = event.inlineCode; - associatedGDManagedSourceFile = event.associatedGDManagedSourceFile; - lastChangeTimeStamp = 0; - - passSceneAsParameter = event.passSceneAsParameter; - passObjectListAsParameter = event.passObjectListAsParameter; - objectToPassAsParameter = event.objectToPassAsParameter; - - codeDisplayedInEditor = event.codeDisplayedInEditor; - displayedName = event.displayedName; -} - -/** - * Custom copy operator - */ -CppCodeEvent::CppCodeEvent(const CppCodeEvent& event) : BaseEvent(event) { - Init(event); -} - -/** - * Custom assignement operator - */ -CppCodeEvent& CppCodeEvent::operator=(const CppCodeEvent& event) { - if (this != &event) { - BaseEvent::operator=(event); - Init(event); - } - - return *this; -} - -CppCodeEvent::CppCodeEvent() - : BaseEvent(), - functionNameAutogenerated(true), - inlineCode("scene.SetBackgroundColor(100,100,240);\n"), - lastChangeTimeStamp(0), - passSceneAsParameter(true), - passObjectListAsParameter(false), - codeDisplayedInEditor(true) { - includeFiles.push_back(""); - includeFiles.push_back("\"GDCpp/Runtime/CommonTools.h\""); -} - -#endif diff --git a/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.h b/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.h deleted file mode 100644 index 7380f744b..000000000 --- a/GDCpp/GDCpp/Events/Builtin/CppCodeEvent.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) - -#ifndef CPPCODEEVENT_H -#define CPPCODEEVENT_H -#include "GDCore/Events/Event.h" -namespace gd { -class Instruction; -class Project; -class SerializerElement; -class Layout; -} - -/** - * \brief Builtin internal event that pick an object of a list each time it is - * repeated - */ -class CppCodeEvent : public gd::BaseEvent { - public: - CppCodeEvent(); - CppCodeEvent(const CppCodeEvent& event); - virtual ~CppCodeEvent(){}; - - CppCodeEvent& operator=(const CppCodeEvent& event); - virtual CppCodeEvent* Clone() const { return new CppCodeEvent(*this); } - - virtual bool IsExecutable() const { return true; } - virtual bool CanHaveSubEvents() const { return false; } - - void EnsureAssociatedSourceFileIsUpToDate(gd::Project& parentGame) const; - - const std::vector& GetIncludeFiles() const { - return includeFiles; - }; - void SetIncludeFiles(const std::vector& include_) { - includeFiles = include_; - }; - - const gd::String& GetInlineCode() const { return inlineCode; }; - void SetInlineCode(const gd::String& code) { inlineCode = code; }; - - const gd::String& GetFunctionToCall() const; - void SetFunctionToCall(const gd::String& functionToCall_) { - functionToCall = functionToCall_; - }; - - bool IsFunctionNameAutoGenerated() const { - return functionNameAutogenerated; - }; - void SetFunctionNameAutoGenerated(bool autogenerate) { - functionNameAutogenerated = autogenerate; - }; - - const gd::String& GetAssociatedGDManagedSourceFile( - gd::Project& parentGame) const { - return associatedGDManagedSourceFile; - }; - - void SetLastChangeTimeStamp(time_t lastChangeTimeStamp_) { - lastChangeTimeStamp = lastChangeTimeStamp_; - } - - const std::vector& GetSourceFileDependencies() const { - return dependencies; - }; - void SetDependencies(const std::vector& dependencies_) { - dependencies = dependencies_; - }; - - bool GetPassSceneAsParameter() const { return passSceneAsParameter; }; - void SetPassSceneAsParameter(bool passScene) { - passSceneAsParameter = passScene; - }; - - bool GetPassObjectListAsParameter() const { - return passObjectListAsParameter; - }; - void SetPassObjectListAsParameter(bool passObjectList) { - passObjectListAsParameter = passObjectList; - }; - - gd::String GetObjectToPassAsParameter() const { - return objectToPassAsParameter; - }; - void SetObjectToPassAsParameter(gd::String objectName) { - objectToPassAsParameter = objectName; - }; - - bool IsCodeDisplayedInEditor() const { return codeDisplayedInEditor; }; - void EnableCodeDisplayedInEditor(bool enable) { - codeDisplayedInEditor = enable; - }; - - const gd::String& GetDisplayedName() const { return displayedName; }; - void SetDisplayedName(const gd::String& displayedName_) { - displayedName = displayedName_; - }; - - virtual void SerializeTo(gd::SerializerElement& element) const; - virtual void UnserializeFrom(gd::Project& project, - const gd::SerializerElement& element); - - private: - void Init(const CppCodeEvent& event); - void AutogenerateFunctionName() const; - - std::vector includeFiles; - std::vector - dependencies; ///< List of source files that must be compiled and loaded - ///< at the same time as the C++ event function. - mutable gd::String - functionToCall; ///< The name of the function to call ( Typically located - ///< in the include file ) - bool functionNameAutogenerated; ///< If true, the name of the function being - ///< called ( and containing the inline code - ///< ) will be automatically generated. - gd::String - inlineCode; ///< Contains the C++ code of the event, which is inserted - ///< into the associated GD-managed source file - mutable gd::String - associatedGDManagedSourceFile; ///< "Inline" C++ code is simulated by a - ///< call to a function containing the - ///< code, function located in a separate - ///< source file managed by GD. - time_t - lastChangeTimeStamp; ///< Time of the last change. Used to check if the - ///< associated source file must be regenerated. - - bool passSceneAsParameter; - bool passObjectListAsParameter; - gd::String objectToPassAsParameter; - - bool codeDisplayedInEditor; - gd::String displayedName; - - bool objectsToPickSelected; -}; - -#endif // CPPCODEEVENT_H - -#endif diff --git a/GDCpp/GDCpp/Events/Builtin/ProfileEvent.cpp b/GDCpp/GDCpp/Events/Builtin/ProfileEvent.cpp deleted file mode 100644 index 50614717c..000000000 --- a/GDCpp/GDCpp/Events/Builtin/ProfileEvent.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) && !defined(EMSCRIPTEN) - -#include "ProfileEvent.h" -#include -#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h" -#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCpp/Extensions/Builtin/ProfileTools.h" -#include "GDCpp/IDE/BaseProfiler.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" - -ProfileEvent::ProfileEvent() : BaseEvent(), index(0) {} - -ProfileEvent::~ProfileEvent() {} - -gd::String ProfileEvent::GenerateEventCode( - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - if (!codeGenerator.HasProjectAndLayout()) return "/*Profiler not supported when generating code without layout*/"; - const gd::Layout& scene = codeGenerator.GetLayout(); - codeGenerator.AddIncludeFile("GDCpp/Extensions/Builtin/ProfileTools.h"); - - ProfileLink profileLink; - profileLink.originalEvent = originalEvent; - std::cout << scene.GetProfiler() << std::endl; - if (scene.GetProfiler()) // Should always be not NULL - { - scene.GetProfiler()->profileEventsInformation.push_back(profileLink); - index = scene.GetProfiler()->profileEventsInformation.size() - 1; - } - gd::String code; - - if (previousProfileEvent) - code += "EndProfileTimer(*runtimeContext->scene, " + - gd::String::From(previousProfileEvent->index) + ");\n"; - - code += "StartProfileTimer(*runtimeContext->scene, " + - gd::String::From(index) + ");\n"; - - return code; -} - -/** - * Initialize from another ProfileEvent. - * Used by copy ctor and assignement operator - */ -void ProfileEvent::Init(const ProfileEvent& event) { - previousProfileEvent = event.previousProfileEvent; -} - -/** - * Custom copy operator - */ -ProfileEvent::ProfileEvent(const ProfileEvent& event) : BaseEvent(event) { - Init(event); -} - -/** - * Custom assignement operator - */ -ProfileEvent& ProfileEvent::operator=(const ProfileEvent& event) { - if (this != &event) { - BaseEvent::operator=(event); - Init(event); - } - - return *this; -} - -#endif diff --git a/GDCpp/GDCpp/Events/Builtin/ProfileEvent.h b/GDCpp/GDCpp/Events/Builtin/ProfileEvent.h deleted file mode 100644 index e1d39cc3f..000000000 --- a/GDCpp/GDCpp/Events/Builtin/ProfileEvent.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) && !defined(EMSCRIPTEN) - -#ifndef PROFILEEVENT_H -#define PROFILEEVENT_H -#include "GDCore/Events/Event.h" -#include "GDCpp/Runtime/profile.h" - -/** - * \brief Event used internally by GD C++ Platform to profile events. - */ -class GD_API ProfileEvent : public gd::BaseEvent { - public: - ProfileEvent(); - ProfileEvent(const ProfileEvent& event); - virtual ~ProfileEvent(); - - ProfileEvent& operator=(const ProfileEvent& event); - virtual ProfileEvent* Clone() const { return new ProfileEvent(*this); } - - void SetPreviousProfileEvent( - std::shared_ptr previousProfileEvent_) { - previousProfileEvent = previousProfileEvent_; - } - - virtual bool IsExecutable() const { return true; } - virtual gd::String GenerateEventCode( - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context); - - std::size_t index; - - private: - void Init(const ProfileEvent& event); - - std::shared_ptr previousProfileEvent; -}; - -#endif // PROFILEEVENT_H - -#endif diff --git a/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.cpp b/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.cpp deleted file mode 100644 index 58519b37a..000000000 --- a/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) -#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCore/CommonTools.h" -#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h" -#include "GDCore/Events/Tools/EventsCodeNameMangler.h" -#include "GDCore/Extensions/Metadata/EventMetadata.h" -#include "GDCore/Extensions/Metadata/ExpressionMetadata.h" -#include "GDCore/Extensions/Metadata/InstructionMetadata.h" -#include "GDCore/IDE/DependenciesAnalyzer.h" -#include "GDCore/Project/ExternalEvents.h" -#include "GDCore/Project/Layout.h" -#include "GDCore/Project/Project.h" -#include "GDCpp/Events/Builtin/ProfileEvent.h" -#include "GDCpp/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/IDE/BaseProfiler.h" -#include "GDCpp/Runtime/SceneNameMangler.h" - -using namespace std; - -gd::String EventsCodeGenerator::GenerateObjectFunctionCall( - gd::String objectListName, - const gd::ObjectMetadata& objMetadata, - const gd::ExpressionCodeGenerationInformation& codeInfo, - gd::String parametersStr, - gd::String defaultOutput, - gd::EventsCodeGenerationContext& context) { - bool castNeeded = !objMetadata.className.empty(); - - if (codeInfo.staticFunction) { - if (!castNeeded) - return "(RuntimeObject::" + codeInfo.functionCallName + "(" + - parametersStr + "))"; - else - return "(" + objMetadata.className + "::" + codeInfo.functionCallName + - "(" + parametersStr + "))"; - } else if (context.GetCurrentObject() == objectListName && - !context.GetCurrentObject().empty()) { - if (!castNeeded) - return "(" + ManObjListName(objectListName) + "[i]->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - else - return "(static_cast<" + objMetadata.className + "*>(" + - ManObjListName(objectListName) + "[i])->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - } else { - if (!castNeeded) - return "(( " + ManObjListName(objectListName) + ".empty() ) ? " + - defaultOutput + " :" + ManObjListName(objectListName) + "[0]->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - else - return "(( " + ManObjListName(objectListName) + ".empty() ) ? " + - defaultOutput + " : " + "static_cast<" + objMetadata.className + - "*>(" + ManObjListName(objectListName) + "[0])->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - } -} - -gd::String EventsCodeGenerator::GenerateObjectBehaviorFunctionCall( - gd::String objectListName, - gd::String behaviorName, - const gd::BehaviorMetadata& autoInfo, - const gd::ExpressionCodeGenerationInformation& codeInfo, - gd::String parametersStr, - gd::String defaultOutput, - gd::EventsCodeGenerationContext& context) { - bool castNeeded = !autoInfo.className.empty(); - - if (codeInfo.staticFunction) { - if (!castNeeded) - return "(gd::Behavior::" + codeInfo.functionCallName + "(" + - parametersStr + "))"; - else - return "(" + autoInfo.className + "::" + codeInfo.functionCallName + "(" + - parametersStr + "))"; - } else if (context.GetCurrentObject() == objectListName && - !context.GetCurrentObject().empty()) { - if (!castNeeded) - return "(" + ManObjListName(objectListName) + - "[i]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + ")->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - else - return "(static_cast<" + autoInfo.className + "*>(" + - ManObjListName(objectListName) + "[i]->GetBehaviorRawPointer(\"" + - behaviorName + "\"))->" + codeInfo.functionCallName + "(" + - parametersStr + "))"; - } else { - if (!castNeeded) - return "(( " + ManObjListName(objectListName) + ".empty() ) ? " + - defaultOutput + " :" + ManObjListName(objectListName) + - "[0]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + ")->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - else - return "(( " + ManObjListName(objectListName) + ".empty() ) ? " + - defaultOutput + " : " + "static_cast<" + autoInfo.className + - "*>(" + ManObjListName(objectListName) + - "[0]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + "))->" + - codeInfo.functionCallName + "(" + parametersStr + "))"; - } -} - -gd::String EventsCodeGenerator::GenerateObjectCondition( - const gd::String& objectName, - const gd::ObjectMetadata& objInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - const gd::String& returnBoolean, - bool conditionInverted, - gd::EventsCodeGenerationContext& context) { - gd::String conditionCode; - - // Prepare call - // Add a static_cast if necessary - gd::String objectFunctionCallNamePart = - (!instrInfos.parameters[0].supplementaryInformation.empty()) - ? "static_cast<" + objInfo.className + "*>(" + - ManObjListName(objectName) + "[i])->" + - instrInfos.codeExtraInformation.functionCallName - : ManObjListName(objectName) + "[i]->" + - instrInfos.codeExtraInformation.functionCallName; - - // Create call - gd::String predicat; - if ((instrInfos.codeExtraInformation.type == "number" || - instrInfos.codeExtraInformation.type == "string")) { - predicat = GenerateRelationalOperatorCall( - instrInfos, arguments, objectFunctionCallNamePart, 1); - } else { - predicat = objectFunctionCallNamePart + "(" + - GenerateArgumentsList(arguments, 1) + ")"; - } - if (conditionInverted) predicat = GenerateNegatedPredicat(predicat); - - // Generate whole condition code - conditionCode += - "for(std::size_t i = 0;i < " + ManObjListName(objectName) + ".size();)\n"; - conditionCode += "{\n"; - conditionCode += " if ( " + predicat + " )\n"; - conditionCode += " {\n"; - conditionCode += " " + returnBoolean + " = true;\n"; - conditionCode += " ++i;\n"; - conditionCode += " }\n"; - conditionCode += " else\n"; - conditionCode += " {\n"; - conditionCode += " " + ManObjListName(objectName) + ".erase(" + - ManObjListName(objectName) + ".begin()+i);\n"; - conditionCode += " }\n"; - conditionCode += "}\n"; - - return conditionCode; -} - -gd::String EventsCodeGenerator::GenerateBehaviorCondition( - const gd::String& objectName, - const gd::String& behaviorName, - const gd::BehaviorMetadata& autoInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - const gd::String& returnBoolean, - bool conditionInverted, - gd::EventsCodeGenerationContext& context) { - gd::String conditionCode; - - // Prepare call - // Add a static_cast if necessary - gd::String objectFunctionCallNamePart = - (!instrInfos.parameters[1].supplementaryInformation.empty()) - ? "static_cast<" + autoInfo.className + "*>(" + - ManObjListName(objectName) + "[i]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + "))->" + - instrInfos.codeExtraInformation.functionCallName - : ManObjListName(objectName) + "[i]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + ")->" + - instrInfos.codeExtraInformation.functionCallName; - - // Create call - gd::String predicat; - if ((instrInfos.codeExtraInformation.type == "number" || - instrInfos.codeExtraInformation.type == "string")) { - predicat = GenerateRelationalOperatorCall( - instrInfos, arguments, objectFunctionCallNamePart, 2); - } else { - predicat = objectFunctionCallNamePart + "(" + - GenerateArgumentsList(arguments, 2) + ")"; - } - if (conditionInverted) predicat = GenerateNegatedPredicat(predicat); - - // Verify that object has behavior. - vector behaviors = gd::GetBehaviorsOfObject( - GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName); - if (find(behaviors.begin(), behaviors.end(), behaviorName) == - behaviors.end()) { - cout << "Error: bad behavior \"" << behaviorName - << "\" requested for object \'" << objectName - << "\" (condition: " << instrInfos.GetFullName() << ")." << endl; - } else { - conditionCode += "for(std::size_t i = 0;i < " + ManObjListName(objectName) + - ".size();)\n"; - conditionCode += "{\n"; - conditionCode += " if ( " + predicat + " )\n"; - conditionCode += " {\n"; - conditionCode += " " + returnBoolean + " = true;\n"; - conditionCode += " ++i;\n"; - conditionCode += " }\n"; - conditionCode += " else\n"; - conditionCode += " {\n"; - conditionCode += " " + ManObjListName(objectName) + ".erase(" + - ManObjListName(objectName) + ".begin()+i);\n"; - conditionCode += " }\n"; - conditionCode += "}"; - } - - return conditionCode; -} - -gd::String EventsCodeGenerator::GenerateObjectAction( - const gd::String& objectName, - const gd::ObjectMetadata& objInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - gd::EventsCodeGenerationContext& context) { - gd::String actionCode; - - // Prepare call - // Add a static_cast if necessary - gd::String objectPart = - (!instrInfos.parameters[0].supplementaryInformation.empty()) - ? "static_cast<" + objInfo.className + "*>(" + - ManObjListName(objectName) + "[i])->" - : ManObjListName(objectName) + "[i]->"; - - // Create call - gd::String call; - if (instrInfos.codeExtraInformation.type == "number" || - instrInfos.codeExtraInformation.type == "string") { - if (instrInfos.codeExtraInformation.accessType == - gd::InstructionMetadata::ExtraInformation::MutatorAndOrAccessor) - call = GenerateOperatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - objectPart + - instrInfos.codeExtraInformation.optionalAssociatedInstruction, - 1); - else if (instrInfos.codeExtraInformation.accessType == - gd::InstructionMetadata::ExtraInformation::Mutators) - call = GenerateMutatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - 1); - else - call = GenerateCompoundOperatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - 1); - } else { - call = objectPart + instrInfos.codeExtraInformation.functionCallName + "(" + - GenerateArgumentsList(arguments, 1) + ")"; - } - - actionCode += "for(std::size_t i = 0;i < " + ManObjListName(objectName) + - ".size();++i)\n"; - actionCode += "{\n"; - actionCode += " " + call + ";\n"; - actionCode += "}\n"; - - return actionCode; -} - -gd::String EventsCodeGenerator::GenerateBehaviorAction( - const gd::String& objectName, - const gd::String& behaviorName, - const gd::BehaviorMetadata& autoInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - gd::EventsCodeGenerationContext& context) { - gd::String actionCode; - - // Prepare call - // Add a static_cast if necessary - gd::String objectPart = - (!instrInfos.parameters[1].supplementaryInformation.empty()) - ? "static_cast<" + autoInfo.className + "*>(" + - ManObjListName(objectName) + "[i]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + "))->" - : ManObjListName(objectName) + "[i]->GetBehaviorRawPointer(" + - GenerateGetBehaviorNameCode(behaviorName) + ")->"; - - // Create call - gd::String call; - if ((instrInfos.codeExtraInformation.type == "number" || - instrInfos.codeExtraInformation.type == "string")) { - if (instrInfos.codeExtraInformation.accessType == - gd::InstructionMetadata::ExtraInformation::MutatorAndOrAccessor) - call = GenerateOperatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - objectPart + - instrInfos.codeExtraInformation.optionalAssociatedInstruction, - 2); - else if (instrInfos.codeExtraInformation.accessType == - gd::InstructionMetadata::ExtraInformation::Mutators) - call = GenerateMutatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - 2); - else - call = GenerateCompoundOperatorCall( - instrInfos, - arguments, - objectPart + instrInfos.codeExtraInformation.functionCallName, - 2); - } else { - call = objectPart + instrInfos.codeExtraInformation.functionCallName + "(" + - GenerateArgumentsList(arguments, 2) + ")"; - } - - // Verify that object has behavior. - vector behaviors = gd::GetBehaviorsOfObject( - GetGlobalObjectsAndGroups(), GetObjectsAndGroups(), objectName); - if (find(behaviors.begin(), behaviors.end(), behaviorName) == - behaviors.end()) { - cout << "Error: bad behavior \"" << behaviorName - << "\" requested for object \'" << objectName - << "\" (action: " << instrInfos.GetFullName() << ")." << endl; - } else { - actionCode += "for(std::size_t i = 0;i < " + ManObjListName(objectName) + - ".size();++i)\n"; - actionCode += "{\n"; - actionCode += " " + call + ";\n"; - actionCode += "}\n"; - } - - return actionCode; -} - -gd::String EventsCodeGenerator::GenerateParameterCodes( - const gd::String& parameter, - const gd::ParameterMetadata& metadata, - gd::EventsCodeGenerationContext& context, - const gd::String& lastObjectName, - std::vector >* - supplementaryParametersTypes) { - gd::String argOutput; - - // Code only parameter type - if (metadata.type == "currentScene" || metadata.type == "objectsContext") { - argOutput += "*runtimeContext->scene"; - } else { - argOutput += gd::EventsCodeGenerator::GenerateParameterCodes( - parameter, - metadata, - context, - lastObjectName, - supplementaryParametersTypes); - } - - return argOutput; -} - -gd::String EventsCodeGenerator::GenerateGetBehaviorNameCode( - const gd::String& behaviorName) { - if (HasProjectAndLayout()) { - return ConvertToStringExplicit(behaviorName); - } else { - // No support for events function in C++ generated code. - // See GDJS for an example of proper implementation. - return ConvertToStringExplicit(behaviorName) + " /* unsupported */ "; - } -} - -gd::String EventsCodeGenerator::GenerateObject( - const gd::String& objectName, - const gd::String& type, - gd::EventsCodeGenerationContext& context) { - gd::String output; - if (type == "objectList") { - std::vector realObjects = - ExpandObjectsName(objectName, context); - - output += "runtimeContext->ClearObjectListsMap()"; - for (std::size_t i = 0; i < realObjects.size(); ++i) { - context.ObjectsListNeeded(realObjects[i]); - output += ".AddObjectListToMap(\"" + ConvertToString(realObjects[i]) + - "\", " + ManObjListName(realObjects[i]) + ")"; - } - output += ".ReturnObjectListsMap()"; - } else if (type == "objectListWithoutPicking") { - std::vector realObjects = - ExpandObjectsName(objectName, context); - - output += "runtimeContext->ClearObjectListsMap()"; - for (std::size_t i = 0; i < realObjects.size(); ++i) { - context.ObjectsListWithoutPickingNeeded(realObjects[i]); - output += ".AddObjectListToMap(\"" + ConvertToString(realObjects[i]) + - "\", " + ManObjListName(realObjects[i]) + ")"; - } - output += ".ReturnObjectListsMap()"; - } else if (type == "objectPtr") { - std::vector realObjects = - ExpandObjectsName(objectName, context); - - if (find(realObjects.begin(), - realObjects.end(), - context.GetCurrentObject()) != realObjects.end() && - !context.GetCurrentObject().empty()) { - // If object currently used by instruction is available, use it directly. - output += ManObjListName(context.GetCurrentObject()) + "[i]"; - } else { - for (std::size_t i = 0; i < realObjects.size(); ++i) { - context.ObjectsListNeeded(realObjects[i]); - output += "(!" + ManObjListName(realObjects[i]) + ".empty() ? " + - ManObjListName(realObjects[i]) + "[0] : "; - } - output += GenerateBadObject(); - for (std::size_t i = 0; i < realObjects.size(); ++i) output += ")"; - } - } - - return output; -} - -gd::String EventsCodeGenerator::GenerateGetVariable( - const gd::String& variableName, - const VariableScope& scope, - gd::EventsCodeGenerationContext& context, - const gd::String& objectName) { - gd::String output; - const gd::VariablesContainer* variables = NULL; - if (scope == LAYOUT_VARIABLE) { - output = "runtimeContext->GetSceneVariables()"; - - if (HasProjectAndLayout()) { - variables = &GetLayout().GetVariables(); - } - } else if (scope == PROJECT_VARIABLE) { - output = "runtimeContext->GetGameVariables()"; - - if (HasProjectAndLayout()) { - variables = &GetProject().GetVariables(); - } - } else { - std::vector realObjects = - ExpandObjectsName(objectName, context); - - output = "RuntimeVariablesContainer::GetBadVariablesContainer()"; - for (std::size_t i = 0; i < realObjects.size(); ++i) { - context.ObjectsListNeeded(realObjects[i]); - - // Generate the call to GetVariables() method. - if (context.GetCurrentObject() == realObjects[i] && - !context.GetCurrentObject().empty()) - output = - GetObjectListName(realObjects[i], context) + "[i]->GetVariables()"; - else - output = "((" + GetObjectListName(realObjects[i], context) + - ".empty() ) ? " + output + " : " + - GetObjectListName(realObjects[i], context) + - "[0]->GetVariables())"; - } - - if (HasProjectAndLayout()) { - if (GetLayout().HasObjectNamed( - objectName)) // We check first layout's objects' list. - variables = &GetLayout().GetObject(objectName).GetVariables(); - else if (GetProject().HasObjectNamed( - objectName)) // Then the global objects list. - variables = &GetProject().GetObject(objectName).GetVariables(); - } - } - - // Optimize the lookup of the variable when the variable is declared. - //(In this case, it is stored in an array at runtime and we know its - // position.) - if (variables && variables->Has(variableName)) { - std::size_t index = variables->GetPosition(variableName); - if (index < variables->Count()) { - output += ".Get(" + gd::String::From(index) + ")"; - return output; - } - } - - output += ".Get(" + ConvertToStringExplicit(variableName) + ")"; - return output; -} - -gd::String EventsCodeGenerator::GenerateSceneEventsCompleteCode( - gd::Project& project, - gd::Layout& scene, - const gd::EventsList& events, - bool compilationForRuntime) { - // Preprocessing then code generation can make changes to the events, so we - // need to do the work on a copy of the events. - gd::EventsList generatedEvents = events; - - gd::String output; - - // Prepare the global context ( Used to get needed header files ) - gd::EventsCodeGenerationContext context; - EventsCodeGenerator codeGenerator(project, scene); - - // Generate whole events code - codeGenerator.SetGenerateCodeForRuntime(compilationForRuntime); - codeGenerator.PreprocessEventList(generatedEvents); - gd::String wholeEventsCode = - codeGenerator.GenerateEventsListCode(generatedEvents, context); - - // Generate default code around events: - // Includes - output += - "#include \n#include \n#include \n#include " - "\n#include \n#include " - "\n#include \n#include " - "\"GDCpp/Runtime/RuntimeContext.h\"\n#include " - "\"GDCpp/Runtime/RuntimeObject.h\"\n"; - for (set::iterator include = - codeGenerator.GetIncludeFiles().begin(); - include != codeGenerator.GetIncludeFiles().end(); - ++include) - output += "#include \"" + *include + "\"\n"; - - // Extra declarations needed by events - for (set::iterator declaration = - codeGenerator.GetCustomGlobalDeclaration().begin(); - declaration != codeGenerator.GetCustomGlobalDeclaration().end(); - ++declaration) - output += *declaration + "\n"; - - output += codeGenerator.GetCustomCodeOutsideMain() + - "\n" - "extern \"C\" int GDSceneEvents" + - gd::SceneNameMangler::Get()->GetMangledSceneName(scene.GetName()) + - "(RuntimeContext * runtimeContext)\n" - "{\n" + - "runtimeContext->StartNewFrame();\n" + wholeEventsCode + - "return 0;\n" - "}\n"; - - return output; -} - -gd::String EventsCodeGenerator::GenerateExternalEventsCompleteCode( - gd::Project& project, - gd::ExternalEvents& events, - bool compilationForRuntime) { - DependenciesAnalyzer analyzer(project, events); - gd::String associatedSceneName = - analyzer.ExternalEventsCanBeCompiledForAScene(); - if (associatedSceneName.empty() || - !project.HasLayoutNamed(associatedSceneName)) { - std::cout << "ERROR: Cannot generate code for an external event: No unique " - "associated scene." - << std::endl; - return ""; - } - gd::Layout& associatedScene = - project.GetLayout(project.GetLayoutPosition(associatedSceneName)); - - gd::String output; - - // Prepare the global context ( Used to get needed header files ) - gd::EventsCodeGenerationContext context; - EventsCodeGenerator codeGenerator(project, associatedScene); - codeGenerator.PreprocessEventList(events.GetEvents()); - codeGenerator.SetGenerateCodeForRuntime(compilationForRuntime); - - // Generate whole events code - gd::String wholeEventsCode = - codeGenerator.GenerateEventsListCode(events.GetEvents(), context); - - // Generate default code around events: - // Includes - output += - "#include \n#include \n#include \n#include " - "\n#include \n#include " - "\n#include \n#include " - "\"GDCpp/Runtime/RuntimeContext.h\"\n#include " - "\"GDCpp/Runtime/RuntimeObject.h\"\n"; - for (set::iterator include = - codeGenerator.GetIncludeFiles().begin(); - include != codeGenerator.GetIncludeFiles().end(); - ++include) - output += "#include \"" + *include + "\"\n"; - - // Extra declarations needed by events - for (set::iterator declaration = - codeGenerator.GetCustomGlobalDeclaration().begin(); - declaration != codeGenerator.GetCustomGlobalDeclaration().end(); - ++declaration) - output += *declaration + "\n"; - - output += codeGenerator.GetCustomCodeOutsideMain() + - "\n" - "void " + - EventsCodeNameMangler::Get()->GetExternalEventsFunctionMangledName( - events.GetName()) + - "(RuntimeContext * runtimeContext)\n" - "{\n" + - wholeEventsCode + - "return;\n" - "}\n"; - - return output; -} - -EventsCodeGenerator::EventsCodeGenerator(gd::Project& project, - const gd::Layout& layout) - : gd::EventsCodeGenerator(project, layout, CppPlatform::Get()) {} - -EventsCodeGenerator::~EventsCodeGenerator() {} - -void EventsCodeGenerator::PreprocessEventList(gd::EventsList& eventsList) { - if (!HasProjectAndLayout()) return; - - for (std::size_t i = 0; i < eventsList.size(); ++i) { - eventsList[i].Preprocess(*this, eventsList, i); - if (i < eventsList.size()) { // Be sure that that there is still an event! - // ( Preprocess can remove it. ) - if (eventsList[i].CanHaveSubEvents()) - PreprocessEventList(eventsList[i].GetSubEvents()); - } - } -} - -#endif diff --git a/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.h b/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.h deleted file mode 100644 index ce5700b30..000000000 --- a/GDCpp/GDCpp/Events/CodeGeneration/EventsCodeGenerator.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) - -#ifndef EventsCodeGenerator_H -#define EventsCodeGenerator_H -#include -#include -#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCore/Events/Event.h" -namespace gd { -class ObjectMetadata; -class BehaviorMetadata; -class InstructionMetadata; -class ExpressionCodeGenerationInformation; -} // namespace gd - -class GD_API EventsCodeGenerator : public gd::EventsCodeGenerator { - friend class VariableCodeGenerationCallbacks; - - public: - /** - * Generate complete C++ file for compiling events of a scene - * - * \param project Game used - * \param scene Scene used - * \param events events of the scene - * \param compilationForRuntime Set this to true if the code is generated for - * runtime. \return C++ code - */ - static gd::String GenerateSceneEventsCompleteCode( - gd::Project& project, - gd::Layout& scene, - const gd::EventsList& events, - bool compilationForRuntime = false); - - /** - * Generate complete C++ file for compiling external events. - * \note If events.AreCompiled() == false, no code is generated. - * - * \param project Game used - * \param events External events used. - * \param compilationForRuntime Set this to true if the code is generated for - * runtime. \return C++ code - */ - static gd::String GenerateExternalEventsCompleteCode( - gd::Project& project, - gd::ExternalEvents& events, - bool compilationForRuntime = false); - - /** - * \brief GD C++ Platform has a specific processing function so as to handle - * profiling. - */ - void PreprocessEventList(gd::EventsList& listEvent); - - /** - * \note This is unused for C++ code generation. - */ - virtual gd::String GetCodeNamespaceAccessor() { return ""; }; - - /** - * \brief Get the namespace to be used to store code generated - * objects/values/functions. \note This is unused for C++ code generation. - */ - virtual gd::String GetCodeNamespace() { return ""; }; - - protected: - virtual gd::String GenerateParameterCodes( - const gd::String& parameter, - const gd::ParameterMetadata& metadata, - gd::EventsCodeGenerationContext& context, - const gd::String& lastObjectName, - std::vector >* - supplementaryParametersTypes); - - virtual gd::String GenerateObjectFunctionCall( - gd::String objectListName, - const gd::ObjectMetadata& objMetadata, - const gd::ExpressionCodeGenerationInformation& codeInfo, - gd::String parametersStr, - gd::String defaultOutput, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateObjectBehaviorFunctionCall( - gd::String objectListName, - gd::String behaviorName, - const gd::BehaviorMetadata& autoInfo, - const gd::ExpressionCodeGenerationInformation& codeInfo, - gd::String parametersStr, - gd::String defaultOutput, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateObjectCondition( - const gd::String& objectName, - const gd::ObjectMetadata& objInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - const gd::String& returnBoolean, - bool conditionInverted, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateBehaviorCondition( - const gd::String& objectName, - const gd::String& behaviorName, - const gd::BehaviorMetadata& autoInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - const gd::String& returnBoolean, - bool conditionInverted, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateObjectAction( - const gd::String& objectName, - const gd::ObjectMetadata& objInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateBehaviorAction( - const gd::String& objectName, - const gd::String& behaviorName, - const gd::BehaviorMetadata& autoInfo, - const std::vector& arguments, - const gd::InstructionMetadata& instrInfos, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateGetVariable( - const gd::String& variableName, - const VariableScope& scope, - gd::EventsCodeGenerationContext& context, - const gd::String& objectName); - - virtual gd::String GenerateVariableAccessor(gd::String childName) { - return ".GetChild(" + ConvertToStringExplicit(childName) + ")"; - }; - - virtual gd::String GenerateVariableBracketAccessor( - gd::String expressionCode) { - return ".GetChild(" + expressionCode + ")"; - }; - - virtual gd::String GenerateBadVariable() { - return "runtimeContext->GetGameVariables().GetBadVariable()"; - } - - virtual gd::String GenerateBadObject() { return "NULL"; } - - virtual gd::String GenerateObject(const gd::String& objectName, - const gd::String& type, - gd::EventsCodeGenerationContext& context); - - virtual gd::String GenerateGetBehaviorNameCode(const gd::String& behaviorName); - - /** - * \brief Construct a code generator for the specified project and layout. - */ - EventsCodeGenerator(gd::Project& project, const gd::Layout& layout); - virtual ~EventsCodeGenerator(); -}; - -#endif // EventsCodeGenerator_H -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.cpp deleted file mode 100644 index 5ff83bec5..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/AdvancedExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/AdvancedExtension.cpp" -#endif - -AdvancedExtension::AdvancedExtension() { - gd::BuiltinExtensionsImplementer::ImplementsAdvancedExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["Toujours"] - .SetFunctionName("GDpriv::CommonInstructions::LogicalNegation") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.h b/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.h deleted file mode 100644 index 17cdd8aba..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AdvancedExtension.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef ADVANCEDEXTENSION_H -#define ADVANCEDEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing advanced or special features. - * - * \ingroup BuiltinExtensions - */ -class AdvancedExtension : public ExtensionBase { - public: - AdvancedExtension(); - virtual ~AdvancedExtension(){}; -}; - -#endif // ADVANCEDEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.cpp deleted file mode 100644 index 4863f5e83..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/AudioExtension.h" -#include -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/SoundManager.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/Events/Instruction.h" -#include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -#endif -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/AudioExtension.cpp" -#endif - -AudioExtension::AudioExtension() { - gd::BuiltinExtensionsImplementer::ImplementsAudioExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllActions()["PlaySoundCanal"] - .SetFunctionName("PlaySoundOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["StopSoundCanal"] - .SetFunctionName("StopSoundOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["PauseSoundCanal"] - .SetFunctionName("PauseSoundOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["RePlaySoundCanal"] - .SetFunctionName("RePlaySoundOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["PlayMusicCanal"] - .SetFunctionName("PlayMusicOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["StopMusicCanal"] - .SetFunctionName("StopMusicOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["PauseMusicCanal"] - .SetFunctionName("PauseMusicOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["RePlayMusicCanal"] - .SetFunctionName("RePlayMusicOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModVolumeSoundCanal"] - .SetFunctionName("SetSoundVolumeOnChannel") - .SetManipulatedType("number") - .SetGetter("GetSoundVolumeOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModVolumeMusicCanal"] - .SetFunctionName("SetMusicVolumeOnChannel") - .SetManipulatedType("number") - .SetGetter("GetMusicVolumeOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModGlobalVolume"] - .SetFunctionName("SetGlobalVolume") - .SetGetter("GetGlobalVolume") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModPitchSoundChannel"] - .SetFunctionName("SetSoundPitchOnChannel") - .SetGetter("GetSoundPitchOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModPitchMusicChannel"] - .SetFunctionName("SetMusicPitchOnChannel") - .SetGetter("GetMusicPitchOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModPlayingOffsetSoundChannel"] - .SetFunctionName("SetSoundPlayingOffsetOnChannel") - .SetGetter("GetSoundPlayingOffsetOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["ModPlayingOffsetMusicChannel"] - .SetFunctionName("SetMusicPlayingOffsetOnChannel") - .SetGetter("GetMusicPlayingOffsetOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["PlaySound"] - .SetFunctionName("PlaySound") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllActions()["PlayMusic"] - .SetFunctionName("PlayMusic") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - - GetAllConditions()["MusicPlaying"] - .SetFunctionName("MusicPlaying") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["MusicPaused"] - .SetFunctionName("MusicPaused") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["MusicStopped"] - .SetFunctionName("MusicStopped") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundPlaying"] - .SetFunctionName("SoundPlaying") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundPaused"] - .SetFunctionName("SoundPaused") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundStopped"] - .SetFunctionName("SoundStopped") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundCanalVolume"] - .SetFunctionName("GetSoundVolumeOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["MusicCanalVolume"] - .SetFunctionName("GetMusicVolumeOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["GlobalVolume"] - .SetFunctionName("GetGlobalVolume") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundChannelPitch"] - .SetFunctionName("GetSoundPitchOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["MusicChannelPitch"] - .SetFunctionName("GetMusicPitchOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["SoundChannelPlayingOffset"] - .SetFunctionName("GetSoundPlayingOffsetOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllConditions()["MusicChannelPlayingOffset"] - .SetFunctionName("GetMusicPlayingOffsetOnChannel") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - - GetAllExpressions()["SoundChannelPlayingOffset"] - .SetFunctionName("GetSoundPlayingOffsetOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["MusicChannelPlayingOffset"] - .SetFunctionName("GetMusicPlayingOffsetOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["SoundChannelVolume"] - .SetFunctionName("GetSoundVolumeOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["MusicChannelVolume"] - .SetFunctionName("GetMusicVolumeOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["SoundChannelPitch"] - .SetFunctionName("GetSoundPitchOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["MusicChannelPitch"] - .SetFunctionName("GetMusicPitchOnChannel") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); - GetAllExpressions()["GlobalVolume"] - .SetFunctionName("GetGlobalVolume") - .SetIncludeFile("GDCpp/Extensions/Builtin/AudioTools.h"); -#endif -} - -#if defined(GD_IDE_ONLY) -void AudioExtension::ExposeActionsResources( - gd::Instruction& action, gd::ArbitraryResourceWorker& worker) { - if (action.GetType() == "PlaySound" || action.GetType() == "PlaySoundCanal" || - action.GetType() == "PlayMusic" || action.GetType() == "PlayMusicCanal") { - gd::String parameter = action.GetParameter(1).GetPlainString(); - worker.ExposeAudio(parameter); - action.SetParameter(1, parameter); - } -} - -void AudioExtension::GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - SoundManager& manager = scene.game->GetSoundManager(); - - if (propertyNb == 0) { - name = _("Global volume:"); - value = gd::String::From(manager.GetGlobalVolume()); - } else if (propertyNb < 1 + manager.sounds.size() * 3) { - std::size_t soundNb = ((propertyNb - 1) - (propertyNb - 1) % 3) / 3; - if (soundNb >= manager.sounds.size()) return; - - if (propertyNb % 3 == 1) { - sf::Sound::Status soundStatus = manager.sounds[soundNb]->GetStatus(); - - if (soundStatus == sf::Sound::Playing) - name = _("Sound played:"); - else if (soundStatus == sf::Sound::Stopped) - name = _("Sound stopped:"); - else if (soundStatus == sf::Sound::Paused) - name = _("Paused sound:"); - - value = manager.sounds[soundNb]->file; - } else if (propertyNb % 3 == 2) { - name = _(" -Volume/Pitch:"); - value = gd::String::From(manager.sounds[soundNb]->GetVolume()) + "/" + - gd::String::From(manager.sounds[soundNb]->GetPitch()); - } else { - name = _(" -Progress (seconds) :"); - value = gd::String::From(manager.sounds[soundNb]->GetPlayingOffset()); - } - - } else if (propertyNb < - 1 + manager.sounds.size() * 3 + manager.musics.size() * 3) { - std::size_t musicNb = ((propertyNb - 1 - manager.sounds.size() * 3) - - (propertyNb - 1 - manager.sounds.size() * 3) % 3) / - 3; - if (musicNb >= manager.musics.size()) return; - - if (propertyNb % 3 == 1) { - sf::Sound::Status soundStatus = manager.musics[musicNb]->GetStatus(); - - if (soundStatus == sf::Sound::Playing) - name = _("Played music:"); - else if (soundStatus == sf::Sound::Stopped) - name = _("Stopped music:"); - else if (soundStatus == sf::Sound::Paused) - name = _("Paused music:"); - - value = manager.musics[musicNb]->file; - } else if (propertyNb % 3 == 2) { - name = _(" -Volume/Pitch:"); - value = gd::String::From(manager.musics[musicNb]->GetVolume()) + "/" + - gd::String::From(manager.musics[musicNb]->GetPitch()); - } else { - name = _(" -Progress (seconds) :"); - value = gd::String::From(manager.musics[musicNb]->GetPlayingOffset()); - } - } -} - -bool AudioExtension::ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue) { - SoundManager& manager = scene.game->GetSoundManager(); - - if (propertyNb == 0) { - manager.SetGlobalVolume(newValue.To()); - return true; - } else if (propertyNb < 1 + manager.sounds.size() * 3) { - std::size_t soundNb = ((propertyNb - 1) - (propertyNb - 1) % 3) / 3; - if (soundNb >= manager.sounds.size()) return false; - - if (propertyNb % 3 == 1) { - return false; - } else if (propertyNb % 3 == 2) { - std::vector values = newValue.Split(U'/'); - if (values.size() < 2) return false; - - manager.sounds[soundNb]->SetVolume(values[0].To(), - manager.GetGlobalVolume()); - manager.sounds[soundNb]->SetPitch(values[1].To()); - return true; - } else { - manager.sounds[soundNb]->SetPlayingOffset(newValue.To()); - return true; - } - - } else if (propertyNb < - 1 + manager.sounds.size() * 3 + manager.musics.size() * 3) { - std::size_t musicNb = ((propertyNb - 1 - manager.sounds.size() * 3) - - (propertyNb - 1 - manager.sounds.size() * 3) % 3) / - 3; - if (musicNb >= manager.musics.size()) return false; - - if (propertyNb % 3 == 1) { - return false; - } else if (propertyNb % 3 == 2) { - std::vector values = newValue.Split(U'/'); - if (values.size() < 2) return false; - - manager.musics[musicNb]->SetVolume(values[0].To(), - manager.GetGlobalVolume()); - manager.musics[musicNb]->SetPitch(values[1].To()); - return true; - } else { - manager.musics[musicNb]->SetPlayingOffset(newValue.To()); - return true; - } - } - - return false; -} - -std::size_t AudioExtension::GetNumberOfProperties(RuntimeScene& scene) const { - SoundManager& manager = scene.game->GetSoundManager(); - - return 1 + manager.musics.size() * 3 + manager.sounds.size() * 3; -} - -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.h b/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.h deleted file mode 100644 index a00e2c0de..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AudioExtension.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef AUDIOEXTENSION_H -#define AUDIOEXTENSION_H -#include "GDCpp/Extensions/ExtensionBase.h" -namespace gd { -class Instruction; -} -namespace gd { -class ArbitraryResourceWorker; -} - -/** - * \brief Standard extension providing audio features. - * - * \ingroup BuiltinExtensions - */ -class AudioExtension : public ExtensionBase { - public: - AudioExtension(); - virtual ~AudioExtension(){}; - -#if defined(GD_IDE_ONLY) - virtual void ExposeActionsResources(gd::Instruction& action, - gd::ArbitraryResourceWorker& worker); - - bool HasDebuggingProperties() const { return true; }; - void GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - bool ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue); - std::size_t GetNumberOfProperties(RuntimeScene& scene) const; -#endif -}; - -#endif // AUDIOEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/AudioTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/AudioTools.cpp deleted file mode 100644 index 83dc3ba8f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AudioTools.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "AudioTools.h" -#include -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/SoundManager.h" -#undef PlaySound // Avoid a nasty macro from polluting everything - -/** - * Test if a music is played - */ -bool GD_API MusicPlaying(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetMusicOnChannel(channel)->GetStatus() == - sf::Music::Playing); -} - -/** - * Test if a music is paused - */ -bool GD_API MusicPaused(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetMusicOnChannel(channel)->GetStatus() == - sf::Music::Paused); -} - -/** - * Test if a music is stopped - */ -bool GD_API MusicStopped(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetMusicOnChannel(channel)->GetStatus() == - sf::Music::Stopped); -} - -/** - * Test if a sound is stopped - */ -bool GD_API SoundPlaying(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetSoundOnChannel(channel)->GetStatus() == - sf::Sound::Playing); -} - -/** - * Test if a sound is stopped - */ -bool GD_API SoundPaused(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetSoundOnChannel(channel)->GetStatus() == - sf::Sound::Paused); -} - -/** - * Test if a sound is stopped - */ -bool GD_API SoundStopped(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return false; - - return ( - scene.game->GetSoundManager().GetSoundOnChannel(channel)->GetStatus() == - sf::Sound::Stopped); -} - -void GD_API PlaySoundOnChannel(RuntimeScene& scene, - const gd::String& file, - unsigned int channel, - bool repeat, - float volume, - float pitch) { - sf::Clock latency; - - scene.game->GetSoundManager().PlaySoundOnChannel( - file, channel, repeat, volume, pitch); - - scene.GetTimeManager().NotifyPauseWasMade( - latency.getElapsedTime().asMicroseconds()); -} - -void GD_API PlaySound(RuntimeScene& scene, - const gd::String& file, - bool repeat, - float volume, - float pitch) { - sf::Clock latency; - - scene.game->GetSoundManager().PlaySound(file, repeat, volume, pitch); - - scene.GetTimeManager().NotifyPauseWasMade( - latency.getElapsedTime().asMicroseconds()); -} - -void GD_API StopSoundOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->sound.stop(); -} - -void GD_API PauseSoundOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->sound.pause(); -} - -void GD_API RePlaySoundOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->sound.play(); -} - -void GD_API PlayMusic(RuntimeScene& scene, - const gd::String& file, - bool repeat, - float volume, - float pitch) { - scene.game->GetSoundManager().PlayMusic(file, repeat, volume, pitch); -} - -void GD_API PlayMusicOnChannel(RuntimeScene& scene, - const gd::String& file, - unsigned int channel, - bool repeat, - float volume, - float pitch) { - scene.game->GetSoundManager().PlayMusicOnChannel( - file, channel, repeat, volume, pitch); -} - -void GD_API StopMusicOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->Stop(); -} - -void GD_API PauseMusicOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->Pause(); -} - -void GD_API RePlayMusicOnChannel(RuntimeScene& scene, unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->Play(); -} - -void GD_API SetSoundVolumeOnChannel(RuntimeScene& scene, - unsigned int channel, - float volume) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->SetVolume( - volume, scene.game->GetSoundManager().GetGlobalVolume()); -} - -void GD_API SetMusicVolumeOnChannel(RuntimeScene& scene, - unsigned int channel, - float volume) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->SetVolume( - volume, scene.game->GetSoundManager().GetGlobalVolume()); -} - -double GD_API GetSoundVolumeOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return 0; - - return scene.game->GetSoundManager().GetSoundOnChannel(channel)->GetVolume(); -} - -double GD_API GetMusicVolumeOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return 0; - - return scene.game->GetSoundManager().GetMusicOnChannel(channel)->GetVolume(); -} - -void GD_API SetGlobalVolume(RuntimeScene& scene, float volume) { - scene.game->GetSoundManager().SetGlobalVolume(volume); -} - -double GD_API GetGlobalVolume(RuntimeScene& scene) { - return scene.game->GetSoundManager().GetGlobalVolume(); -} - -void GD_API SetSoundPitchOnChannel(RuntimeScene& scene, - unsigned int channel, - float pitch) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->SetPitch(pitch); -} - -void GD_API SetMusicPitchOnChannel(RuntimeScene& scene, - unsigned int channel, - float pitch) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->SetPitch(pitch); -} - -double GD_API GetSoundPitchOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return 0; - - return scene.game->GetSoundManager().GetSoundOnChannel(channel)->GetPitch(); -} - -double GD_API GetMusicPitchOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return 0; - - return scene.game->GetSoundManager().GetMusicOnChannel(channel)->GetPitch(); -} - -void GD_API SetSoundPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetSoundOnChannel(channel)->SetPlayingOffset( - playingOffset); -} - -void GD_API SetMusicPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return; - - scene.game->GetSoundManager().GetMusicOnChannel(channel)->SetPlayingOffset( - playingOffset); -} - -double GD_API GetSoundPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetSoundOnChannel(channel) == - std::shared_ptr()) - return 0; - - return static_cast(scene.game->GetSoundManager() - .GetSoundOnChannel(channel) - ->GetPlayingOffset()); -} - -double GD_API GetMusicPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel) { - if (scene.game->GetSoundManager().GetMusicOnChannel(channel) == - std::shared_ptr()) - return 0; - - return static_cast(scene.game->GetSoundManager() - .GetMusicOnChannel(channel) - ->GetPlayingOffset()); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/AudioTools.h b/GDCpp/GDCpp/Extensions/Builtin/AudioTools.h deleted file mode 100644 index 394a04a81..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/AudioTools.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef AUDIOTOOLS_H -#define AUDIOTOOLS_H - -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; - -bool GD_API MusicPlaying(RuntimeScene& scene, unsigned int channel); -bool GD_API MusicPaused(RuntimeScene& scene, unsigned int channel); -bool GD_API MusicStopped(RuntimeScene& scene, unsigned int channel); -bool GD_API SoundPlaying(RuntimeScene& scene, unsigned int channel); -bool GD_API SoundPaused(RuntimeScene& scene, unsigned int channel); -bool GD_API SoundStopped(RuntimeScene& scene, unsigned int channel); -void GD_API PlaySound(RuntimeScene& scene, - const gd::String& file, - bool repeat, - float volume, - float pitch); -void GD_API PlaySoundOnChannel(RuntimeScene& scene, - const gd::String& file, - unsigned int channel, - bool repeat, - float volume, - float pitch); -void GD_API StopSoundOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API PauseSoundOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API RePlaySoundOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API PlayMusic(RuntimeScene& scene, - const gd::String& file, - bool repeat, - float volume, - float pitch); -void GD_API PlayMusicOnChannel(RuntimeScene& scene, - const gd::String& file, - unsigned int channel, - bool repeat, - float volume, - float pitch); -void GD_API StopMusicOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API PauseMusicOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API RePlayMusicOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API SetSoundVolumeOnChannel(RuntimeScene& scene, - unsigned int channel, - float pitch); -void GD_API SetMusicVolumeOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset); -double GD_API GetSoundVolumeOnChannel(RuntimeScene& scene, - unsigned int channel); -double GD_API GetMusicVolumeOnChannel(RuntimeScene& scene, - unsigned int channel); -void GD_API SetGlobalVolume(RuntimeScene& scene, float volume); -double GD_API GetGlobalVolume(RuntimeScene& scene); -void GD_API SetSoundPitchOnChannel(RuntimeScene& scene, - unsigned int channel, - float pitch); -void GD_API SetMusicPitchOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset); -double GD_API GetSoundPitchOnChannel(RuntimeScene& scene, unsigned int channel); -double GD_API GetMusicPitchOnChannel(RuntimeScene& scene, unsigned int channel); -void GD_API SetSoundPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset); -void GD_API SetMusicPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel, - float playingOffset); -double GD_API GetSoundPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel); -double GD_API GetMusicPlayingOffsetOnChannel(RuntimeScene& scene, - unsigned int channel); - -#endif // AUDIOTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.cpp deleted file mode 100644 index 83e36106f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.cpp +++ /dev/null @@ -1,197 +0,0 @@ -#include "GDCpp/Extensions/Builtin/BaseObjectExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/BaseObjectExtension.cpp" -#endif - -BaseObjectExtension::BaseObjectExtension() { - gd::BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(*this); - - gd::ObjectMetadata& obj = GetObjectMetadata(""); - AddRuntimeObject(obj, ""); - -#if defined(GD_IDE_ONLY) - std::map& objectActions = - GetAllActionsForObject(""); - std::map& objectConditions = - GetAllConditionsForObject(""); - std::map& objectExpressions = - GetAllExpressionsForObject(""); - std::map& objectStrExpressions = - GetAllStrExpressionsForObject(""); - - objectConditions["PosX"].SetFunctionName("GetX").SetManipulatedType("number"); - objectActions["MettreX"] - .SetFunctionName("SetX") - .SetManipulatedType("number") - .SetGetter("GetX"); - objectConditions["PosY"].SetFunctionName("GetY").SetManipulatedType("number"); - objectActions["MettreY"] - .SetFunctionName("SetY") - .SetManipulatedType("number") - .SetGetter("GetY"); - objectActions["MettreXY"].SetFunctionName("SetXY"); - objectConditions["Angle"].SetFunctionName("GetAngle"); - - objectActions["SetAngle"] - .SetFunctionName("SetAngle") - .SetManipulatedType("number") - .SetGetter("GetAngle"); - objectActions["Rotate"].SetFunctionName("Rotate"); - objectActions["RotateTowardAngle"].SetFunctionName("RotateTowardAngle"); - objectActions["RotateTowardPosition"].SetFunctionName("RotateTowardPosition"); - - objectActions["MettreAutourPos"].SetFunctionName("PutAroundAPosition"); - objectActions["AddForceXY"].SetFunctionName("AddForce"); - objectActions["AddForceAL"].SetFunctionName("AddForceUsingPolarCoordinates"); - objectActions["AddForceVersPos"].SetFunctionName("AddForceTowardPosition"); - objectActions["AddForceTournePos"].SetFunctionName("AddForceToMoveAround"); - objectActions["Arreter"].SetFunctionName("ClearForce"); - objectActions["Delete"].SetFunctionName("DeleteFromScene"); - objectActions["ChangePlan"] - .SetFunctionName("SetZOrder") - .SetGetter("GetZOrder") - .SetManipulatedType("number"); - objectActions["ChangeLayer"].SetFunctionName("SetLayer"); - - objectActions["ModVarObjet"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number"); - objectActions["ModVarObjetTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string"); - objectConditions["ObjectVariableChildExists"].SetFunctionName( - "VariableChildExists"); - objectActions["ObjectVariableRemoveChild"].SetFunctionName( - "VariableRemoveChild"); - objectActions["ObjectVariableClearChildren"].SetFunctionName( - "VariableClearChildren"); - - objectActions["Cache"].SetFunctionName("SetHidden"); - objectActions["Montre"].SetFunctionName("SetHidden"); - - objectConditions["Plan"] - .SetFunctionName("GetZOrder") - .SetManipulatedType("number"); - objectConditions["Layer"].SetFunctionName("IsOnLayer"); - objectConditions["Visible"].SetFunctionName("IsVisible"); - objectConditions["Invisible"].SetFunctionName("IsHidden"); - objectConditions["Arret"].SetFunctionName("IsStopped"); - objectConditions["Vitesse"] - .SetFunctionName("TotalForceLength") - .SetManipulatedType("number"); - objectConditions["AngleOfDisplacement"].SetFunctionName( - "TestAngleOfDisplacement"); - objectConditions["VarObjet"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number"); - objectConditions["VarObjetTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string"); - objectConditions["VarObjetDef"].SetFunctionName("VariableExists"); - objectConditions["BehaviorActivated"].SetFunctionName("BehaviorActivated"); - objectActions["ActivateBehavior"].SetFunctionName("ActivateBehavior"); - objectActions["AddForceVers"] - .SetFunctionName("AddForceTowardObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectActions["AddForceTourne"] - .SetFunctionName("AddForceToMoveAroundObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectActions["MettreAutour"] - .SetFunctionName("PutAroundObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectActions["Rebondir"] - .SetFunctionName("SeparateObjectsWithForces") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectActions["Ecarter"] - .SetFunctionName("SeparateObjectsWithoutForces") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectActions["SeparateFromObjects"] - .SetFunctionName("SeparateFromObjects") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - objectConditions["CollisionPoint"].SetFunctionName("IsCollidingWithPoint"); - - objectExpressions["X"].SetFunctionName("GetX"); - objectExpressions["Y"].SetFunctionName("GetY"); - objectExpressions["ForceX"].SetFunctionName("TotalForceX"); - objectExpressions["ForceY"].SetFunctionName("TotalForceY"); - objectExpressions["ForceAngle"].SetFunctionName("TotalForceAngle"); - objectExpressions["Angle"].SetFunctionName("GetAngle"); - objectExpressions["ForceLength"].SetFunctionName("TotalForceLength"); - objectExpressions["Longueur"].SetFunctionName("TotalForceLength"); - objectExpressions["Width"].SetFunctionName("GetWidth"); - objectExpressions["Largeur"].SetFunctionName("GetWidth"); - objectExpressions["Height"].SetFunctionName("GetHeight"); - objectExpressions["Hauteur"].SetFunctionName("GetHeight"); - objectExpressions["ZOrder"].SetFunctionName("GetZOrder"); - objectExpressions["Plan"].SetFunctionName("GetZOrder"); - objectExpressions["Distance"].SetFunctionName("GetDistanceWithObject"); - objectExpressions["SqDistance"].SetFunctionName("GetSqDistanceWithObject"); - objectExpressions["Variable"].SetFunctionName("GetVariableValue").SetStatic(); - objectStrExpressions["VariableString"] - .SetFunctionName("GetVariableString") - .SetStatic(); - objectExpressions["VariableChildCount"].SetFunctionName( - "GetVariableChildCount"); - objectStrExpressions["ObjectName"].SetFunctionName("GetName"); - objectStrExpressions["Layer"].SetFunctionName("GetLayer"); - - GetAllActions()["Create"] - .SetFunctionName("CreateObjectOnScene") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["CreateByName"] - .SetFunctionName("CreateObjectFromGroupOnScene") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["AjoutObjConcern"] - .SetFunctionName("PickAllObjects") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["AjoutHasard"] - .SetFunctionName("PickRandomObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["MoveObjects"] - .SetFunctionName("MoveObjects") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["SeDirige"] - .SetFunctionName("MovesToward") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - GetAllConditions()["Distance"] - .SetFunctionName("DistanceBetweenObjects") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - GetAllConditions()["AjoutObjConcern"] - .SetFunctionName("PickAllObjects") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["AjoutHasard"] - .SetFunctionName("PickRandomObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["PickNearest"] - .SetFunctionName("PickNearestObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["NbObjet"] - .SetFunctionName("PickedObjectsCount") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - GetAllConditions()["CollisionNP"] - .SetFunctionName("HitBoxesCollision") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - GetAllConditions()["EstTourne"] - .SetFunctionName("ObjectsTurnedToward") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - GetAllConditions()["Raycast"] - .SetFunctionName("RaycastObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["RaycastToPosition"] - .SetFunctionName("RaycastObjectToPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["SourisSurObjet"] - .SetFunctionName("CursorOnObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); - - GetAllExpressions()["Count"] - .SetFunctionName("PickedObjectsCount") - .SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.h b/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.h deleted file mode 100644 index aca513baf..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/BaseObjectExtension.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef BUILTINEXTENSION_H -#define BUILTINEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing features for all objects - * - * \ingroup BuiltinExtensions - */ -class GD_API BaseObjectExtension : public ExtensionBase { - public: - BaseObjectExtension(); - virtual ~BaseObjectExtension(){}; -}; - -#endif // BUILTINEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.cpp deleted file mode 100644 index aab154182..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/CameraExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/CameraExtension.cpp" -#endif - -CameraExtension::CameraExtension() { - gd::BuiltinExtensionsImplementer::ImplementsCameraExtension(*this); - -#if defined(GD_IDE_ONLY) - - GetAllConditions()["CameraX"] - .SetFunctionName("GetCameraX") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllConditions()["CameraY"] - .SetFunctionName("GetCameraY") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["SetCameraX"] - .SetFunctionName("SetCameraX") - .SetManipulatedType("number") - .SetGetter("GetCameraX") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllActions()["SetCameraY"] - .SetFunctionName("SetCameraY") - .SetManipulatedType("number") - .SetGetter("GetCameraY") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllActions()["CameraX"] // Deprecated - .SetFunctionName("SetCameraX") - .SetManipulatedType("number") - .SetGetter("GetCameraX") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllActions()["CameraY"] // Deprecated - .SetFunctionName("SetCameraY") - .SetManipulatedType("number") - .SetGetter("GetCameraY") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllConditions()["CameraWidth"] - .SetFunctionName("GetCameraWidth") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllConditions()["CameraHeight"] - .SetFunctionName("GetCameraHeight") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllConditions()["CameraAngle"] - .SetFunctionName("GetCameraAngle") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["SetCameraAngle"] - .SetFunctionName("SetCameraAngle") - .SetGetter("GetCameraAngle") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["RotateCamera"] // Deprecated - .SetFunctionName("SetCameraAngle") - .SetGetter("GetCameraAngle") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["AddCamera"] - .SetFunctionName("AddCamera") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["DeleteCamera"] - .SetFunctionName("DeleteCamera") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["CameraSize"] - .SetFunctionName("SetCameraSize") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["CameraViewport"] - .SetFunctionName("SetCameraViewport") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["ZoomCamera"] - .SetFunctionName("SetCameraZoom") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["FixCamera"] - .SetFunctionName("CenterCameraOnObjectWithLimits") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["CentreCamera"] - .SetFunctionName("CenterCameraOnObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllActions()["ShowLayer"] - .SetFunctionName("ShowLayer") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllActions()["HideLayer"] - .SetFunctionName("HideLayer") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - ; - - GetAllConditions()["LayerVisible"] - .SetFunctionName("LayerVisible") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["LayerTimeScale"] - .SetFunctionName("GetLayerTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllActions()["ChangeLayerTimeScale"] - .SetFunctionName("SetLayerTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["LayerTimeScale"] - .SetFunctionName("GetLayerTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - - GetAllExpressions()["CameraWidth"] - .SetFunctionName("GetCameraWidth") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraHeight"] - .SetFunctionName("GetCameraHeight") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraViewportLeft"] - .SetFunctionName("GetCameraViewportLeft") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraViewportTop"] - .SetFunctionName("GetCameraViewportTop") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraViewportRight"] - .SetFunctionName("GetCameraViewportRight") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraViewportBottom"] - .SetFunctionName("GetCameraViewportBottom") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraX"] - .SetFunctionName("GetCameraX") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["VueX"] - .SetFunctionName("GetCameraX") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraY"] - .SetFunctionName("GetCameraY") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["VueY"] - .SetFunctionName("GetCameraY") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraAngle"] - .SetFunctionName("GetCameraRotation") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["CameraRotation"] - .SetFunctionName("GetCameraRotation") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - GetAllExpressions()["VueRotation"] - .SetFunctionName("GetCameraRotation") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h"); - -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.h b/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.h deleted file mode 100644 index 2d0e86e19..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CameraExtension.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef CAMERAEXTENSION_H -#define CAMERAEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing features concerning cameras. - * - * \ingroup BuiltinExtensions - */ -class CameraExtension : public ExtensionBase { - public: - CameraExtension(); - virtual ~CameraExtension(){}; - - protected: - private: -}; - -#endif // CAMERAEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.cpp deleted file mode 100644 index 97aed43f3..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "GDCpp/Extensions/Builtin/CommonConversionsExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/CommonConversionsExtension.cpp" -#endif - -CommonConversionsExtension::CommonConversionsExtension() { - gd::BuiltinExtensionsImplementer::ImplementsCommonConversionsExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllExpressions()["ToNumber"] - .SetFunctionName("GDpriv::CommonInstructions::ToDouble") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllStrExpressions()["ToString"] - .SetFunctionName("GDpriv::CommonInstructions::ToString") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllStrExpressions()["LargeNumberToString"] - .SetFunctionName("GDpriv::CommonInstructions::LargeNumberToString") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["ToRad"] - .SetFunctionName("GDpriv::CommonInstructions::ToRad") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["ToDeg"] - .SetFunctionName("GDpriv::CommonInstructions::ToDeg") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.h b/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.h deleted file mode 100644 index 31adda0f8..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonConversionsExtension.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef COMMONCONVERSIONSEXTENSION_H -#define COMMONCONVERSIONSEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing conversion ( ToString/ToNumber ) - * features. - * - * \ingroup BuiltinExtensions - */ -class CommonConversionsExtension : public ExtensionBase { - public: - CommonConversionsExtension(); - virtual ~CommonConversionsExtension(){}; - - protected: - private: -}; - -#endif // COMMONCONVERSIONSEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.cpp deleted file mode 100644 index 6d071687d..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.cpp +++ /dev/null @@ -1,698 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include -#include -#include - -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/Events/Builtin/CommentEvent.h" -#include "GDCore/Events/Builtin/ForEachEvent.h" -#include "GDCore/Events/Builtin/LinkEvent.h" -#include "GDCore/Events/Builtin/RepeatEvent.h" -#include "GDCore/Events/Builtin/StandardEvent.h" -#include "GDCore/Events/Builtin/WhileEvent.h" -#include "GDCore/Events/Event.h" -#endif -#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h" -#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCore/Events/CodeGeneration/ExpressionCodeGenerator.h" -#include "GDCore/Events/Tools/EventsCodeNameMangler.h" -#include "GDCore/Extensions/Platform.h" -#include "GDCore/IDE/DependenciesAnalyzer.h" -#include "GDCore/Project/ExternalEvents.h" -#include "GDCore/Project/Layout.h" -#include "GDCore/Project/ObjectGroup.h" -#include "GDCore/Project/Project.h" -#include "GDCpp/Events/Builtin/CppCodeEvent.h" -#include "GDCpp/Extensions/Builtin/CommonInstructionsExtension.h" -#include "GDCpp/Extensions/Builtin/CommonInstructionsTools.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/CommonTools.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/CommonInstructionsExtension.cpp" -#endif - -using namespace std; - -CommonInstructionsExtension::CommonInstructionsExtension() { - gd::BuiltinExtensionsImplementer::ImplementsCommonInstructionsExtension( - *this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["BuiltinCommonInstructions::Or"] - .codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - // Conditions code - gd::String conditionsCode; - gd::InstructionsList& conditions = instruction.GetSubInstructions(); - - //"OR" condition must declare objects list, but without picking the - // objects from the scene. Lists are either empty or come from a - // parent event. - set emptyListsNeeded; - for (std::size_t cId = 0; cId < conditions.size(); ++cId) { - // Each condition inherits the context from the "Or" condition: - // For example, two sub conditions using an object called - // "MyObject" will both have to declare a "MyObject" object list. - gd::EventsCodeGenerationContext context; - context.InheritsFrom(parentContext); - context.ForbidReuse(); // TODO: This may not be necessary - - gd::String conditionCode = codeGenerator.GenerateConditionCode( - conditions[cId], - "condition" + gd::String::From(cId) + "IsTrue", - context); - - conditionsCode += "{\n"; - - // Create new objects lists and generate condition - conditionsCode += - codeGenerator.GenerateObjectsDeclarationCode(context); - if (!conditions[cId].GetType().empty()) - conditionsCode += conditionCode; - - // If the condition is true : merge all objects picked in the - // final object lists. - conditionsCode += - "if( condition" + gd::String::From(cId) + "IsTrue ) {\n"; - conditionsCode += " conditionTrue = true;\n"; - std::set objectsListsToBeDeclared = - context.GetAllObjectsToBeDeclared(); - for (set::iterator it = - objectsListsToBeDeclared.begin(); - it != objectsListsToBeDeclared.end(); - ++it) { - emptyListsNeeded.insert(*it); - conditionsCode += " for(std::size_t i = 0;i<" + - ManObjListName(*it) + ".size();++i)\n"; - conditionsCode += " {\n"; - conditionsCode += " if ( find(" + ManObjListName(*it) + - "final.begin(), " + ManObjListName(*it) + - "final.end(), " + ManObjListName(*it) + - "[i]) == " + ManObjListName(*it) + - "final.end())\n"; - conditionsCode += " " + ManObjListName(*it) + - "final.push_back(" + ManObjListName(*it) + - "[i]);\n"; - conditionsCode += " }\n"; - } - conditionsCode += "}\n"; - - conditionsCode += "}\n"; - } - - gd::String declarationsCode; - - // Declarations code - for (set::iterator it = emptyListsNeeded.begin(); - it != emptyListsNeeded.end(); - ++it) { - //"OR" condition must declare objects list, but without getting - // the objects from the scene. Lists are either empty or come from - // a parent event. - parentContext.ObjectsListWithoutPickingNeeded(*it); - // We need to duplicate the object lists : The "final" ones will - // be filled with objects by conditions, but they will have no - // incidence on further conditions, as conditions use "normal" - // ones. - declarationsCode += "std::vector " + - ManObjListName(*it) + "final;\n"; - } - for (std::size_t i = 0; i < conditions.size(); ++i) - declarationsCode += - "bool condition" + gd::String::From(i) + "IsTrue = false;\n"; - - // Generate code - gd::String code; - code += declarationsCode; - code += conditionsCode; - - // When condition is finished, "final" objects lists become the - // "normal" ones. - code += "{\n"; - for (set::iterator it = emptyListsNeeded.begin(); - it != emptyListsNeeded.end(); - ++it) - code += ManObjListName(*it) + " = " + ManObjListName(*it) + - "final;\n"; - code += "}\n"; - - return code; - }); - - GetAllConditions()["BuiltinCommonInstructions::And"] - .codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - gd::String outputCode; - - outputCode += codeGenerator.GenerateConditionsListCode( - instruction.GetSubInstructions(), parentContext); - - gd::String ifPredicat = "true"; - for (std::size_t i = 0; i < instruction.GetSubInstructions().size(); - ++i) - ifPredicat += " && condition" + gd::String::From(i) + "IsTrue"; - - outputCode += "conditionTrue = (" + ifPredicat + ");\n"; - - return outputCode; - }); - - GetAllConditions()["BuiltinCommonInstructions::Not"] - .codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - gd::InstructionsList& conditions = instruction.GetSubInstructions(); - gd::String outputCode; - - for (std::size_t i = 0; i < conditions.size(); ++i) - outputCode += - "bool condition" + gd::String::From(i) + "IsTrue = false;\n"; - - for (std::size_t cId = 0; cId < conditions.size(); ++cId) { - gd::String conditionCode = codeGenerator.GenerateConditionCode( - conditions[cId], - "condition" + gd::String::From(cId) + "IsTrue", - parentContext); - - if (!conditions[cId].GetType().empty()) { - for (std::size_t i = 0; i < cId; - ++i) // Skip conditions if one condition is true. //TODO : - // Can be optimized - { - if (i == 0) - outputCode += "if ( "; - else - outputCode += " && "; - outputCode += "!condition" + gd::String::From(i) + "IsTrue"; - if (i == cId - 1) outputCode += ") "; - } - - outputCode += "{\n" + conditionCode + "}\n"; - } - } - - gd::String ifPredicat = "true"; - for (std::size_t i = 0; i < conditions.size(); ++i) - ifPredicat += " && !condition" + gd::String::From(i) + "IsTrue"; - - outputCode += "conditionTrue = (" + ifPredicat + ");\n"; - - return outputCode; - }); - - GetAllConditions()["BuiltinCommonInstructions::Once"] - .codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - size_t uniqueId = codeGenerator.GenerateSingleUsageUniqueIdFor( - instruction.GetOriginalInstruction().lock().get()); - return "conditionTrue = runtimeContext->TriggerOnce(" + - gd::String::From(uniqueId) + ");\n"; - }); - - GetAllEvents()["BuiltinCommonInstructions::Standard"].SetCodeGenerator( - [](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context) { - gd::StandardEvent& event = dynamic_cast(event_); - - gd::String conditionsCode = codeGenerator.GenerateConditionsListCode( - event.GetConditions(), context); - gd::String ifPredicat; - for (std::size_t i = 0; i < event.GetConditions().size(); ++i) { - if (i != 0) ifPredicat += " && "; - ifPredicat += "condition" + gd::String::From(i) + "IsTrue"; - } - - gd::EventsCodeGenerationContext actionsContext; - actionsContext.Reuse(context); - gd::String actionsCode = codeGenerator.GenerateActionsListCode( - event.GetActions(), actionsContext); - if (event.HasSubEvents()) // Sub events - { - actionsCode += "\n{ //Subevents\n"; - actionsCode += codeGenerator.GenerateEventsListCode( - event.GetSubEvents(), actionsContext); - actionsCode += "} //End of subevents\n"; - } - gd::String actionsDeclarationsCode = - codeGenerator.GenerateObjectsDeclarationCode(actionsContext); - - gd::String outputCode; - outputCode += conditionsCode; - if (!ifPredicat.empty()) outputCode += "if (" + ifPredicat + ")\n"; - outputCode += "{\n"; - outputCode += actionsDeclarationsCode; - outputCode += actionsCode; - outputCode += "}\n"; - - return outputCode; - }); - - GetAllEvents()["BuiltinCommonInstructions::Link"] - .SetCodeGenerator([](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context) { - if (!codeGenerator.HasProjectAndLayout()) { - return gd::String( - "/*Link not supported when generating code without a layout*/"); - }; - gd::LinkEvent& event = dynamic_cast(event_); - - // This function is called only when the link refers to external events - // compiled separately (see below). We must generate code to call these - // external events. - gd::String outputCode; - - gd::String functionCall = - EventsCodeNameMangler::Get()->GetExternalEventsFunctionMangledName( - event.GetTarget()) + - "(runtimeContext);"; - gd::String functionDeclaration = - "void " + - EventsCodeNameMangler::Get()->GetExternalEventsFunctionMangledName( - event.GetTarget()) + - "(RuntimeContext * context);"; - outputCode += functionCall + "\n"; - codeGenerator.AddGlobalDeclaration(functionDeclaration); - - return outputCode; - }) - .SetPreprocessing([](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsList& eventList, - std::size_t indexOfTheEventInThisList) { - if (!codeGenerator.HasProjectAndLayout()) return; - - gd::LinkEvent& event = dynamic_cast(event_); - gd::Project& project = codeGenerator.GetProject(); - const gd::Layout& scene = codeGenerator.GetLayout(); - - // Find if the link refers to externals events... - if (project.HasExternalEventsNamed(event.GetTarget()) && - event.GetIncludeConfig() == gd::LinkEvent::INCLUDE_ALL) { - gd::ExternalEvents& linkedExternalEvents = - project.GetExternalEvents(event.GetTarget()); - - //...and check if the external events can be compiled separately - DependenciesAnalyzer analyzer(project, linkedExternalEvents); - if (analyzer.ExternalEventsCanBeCompiledForAScene() == - scene.GetName()) // Check if the link refers to events - { // compiled separately. - // There is nothing more to do for now: - // The code calling the external events will be generated during - // code generation (see above) - return; - } - } - - // If the link does not refers to separately compiled external events, - // just replace it by the linked events. - event.ReplaceLinkByLinkedEvents( - codeGenerator.GetProject(), eventList, indexOfTheEventInThisList); - }); - - GetAllEvents()["BuiltinCommonInstructions::While"].SetCodeGenerator( - [](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - gd::String outputCode; - gd::WhileEvent& event = dynamic_cast(event_); - - // Context is "reset" each time the event is repeated (i.e. objects are - // picked again) - gd::EventsCodeGenerationContext context; - context.InheritsFrom(parentContext); - context.ForbidReuse(); - if (event.HasInfiniteLoopWarning() && - !codeGenerator.GenerateCodeForRuntime()) - codeGenerator.AddIncludeFile( - "GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - // Prepare codes - gd::String whileConditionsStr = - codeGenerator.GenerateConditionsListCode(event.GetWhileConditions(), - context); - gd::String whileIfPredicat = "true"; - for (std::size_t i = 0; i < event.GetWhileConditions().size(); ++i) - whileIfPredicat += " && condition" + gd::String::From(i) + "IsTrue"; - gd::String conditionsCode = codeGenerator.GenerateConditionsListCode( - event.GetConditions(), context); - gd::String actionsCode = - codeGenerator.GenerateActionsListCode(event.GetActions(), context); - gd::String ifPredicat = "true"; - for (std::size_t i = 0; i < event.GetConditions().size(); ++i) - ifPredicat += " && condition" + gd::String::From(i) + "IsTrue"; - - // Write final code - outputCode += "bool stopDoWhile = false;"; - outputCode += "do"; - outputCode += "{\n"; - outputCode += codeGenerator.GenerateObjectsDeclarationCode(context); - outputCode += whileConditionsStr; - outputCode += "if (" + whileIfPredicat + ")\n"; - outputCode += "{\n"; - outputCode += conditionsCode; - outputCode += "if (" + ifPredicat + ")\n"; - outputCode += "{\n"; - outputCode += actionsCode; - outputCode += "\n{ //Subevents: \n"; - outputCode += - codeGenerator.GenerateEventsListCode(event.GetSubEvents(), context); - outputCode += "} //Subevents end.\n"; - outputCode += "}\n"; - outputCode += "} else stopDoWhile = true; \n"; - - outputCode += "} while ( !stopDoWhile );\n"; - - return outputCode; - }); - - GetAllEvents()["BuiltinCommonInstructions::Repeat"].SetCodeGenerator( - [](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - gd::String outputCode; - gd::RepeatEvent& event = dynamic_cast(event_); - - gd::String repeatNumberExpression = event.GetRepeatExpression(); - - // Prepare expression containing how many times event must be repeated - gd::String repeatCountCode = - gd::ExpressionCodeGenerator::GenerateExpressionCode( - codeGenerator, parentContext, "number", repeatNumberExpression); - - // Context is "reset" each time the event is repeated (i.e. objects are - // picked again) - gd::EventsCodeGenerationContext context; - context.InheritsFrom(parentContext); - context.ForbidReuse(); - - // Prepare conditions/actions codes - gd::String conditionsCode = codeGenerator.GenerateConditionsListCode( - event.GetConditions(), context); - gd::String actionsCode = - codeGenerator.GenerateActionsListCode(event.GetActions(), context); - gd::String ifPredicat = "true"; - for (std::size_t i = 0; i < event.GetConditions().size(); ++i) - ifPredicat += " && condition" + gd::String::From(i) + "IsTrue"; - - // Prepare object declaration and sub events - gd::String subevents = - codeGenerator.GenerateEventsListCode(event.GetSubEvents(), context); - gd::String objectDeclaration = - codeGenerator.GenerateObjectsDeclarationCode(context) + "\n"; - - // Write final code - outputCode += "int repeatCount = " + repeatCountCode + ";\n"; - outputCode += - "for(std::size_t repeatIndex = 0;repeatIndex < " - "repeatCount;++repeatIndex)\n"; - outputCode += "{\n"; - outputCode += objectDeclaration; - outputCode += conditionsCode; - outputCode += "if (" + ifPredicat + ")\n"; - outputCode += "{\n"; - outputCode += actionsCode; - if (event.HasSubEvents()) { - outputCode += "\n{ //Subevents: \n"; - outputCode += subevents; - outputCode += "} //Subevents end.\n"; - } - outputCode += "}\n"; - - outputCode += "}\n"; - - return outputCode; - }); - - GetAllEvents()["BuiltinCommonInstructions::ForEach"].SetCodeGenerator( - [](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - gd::String outputCode; - gd::ForEachEvent& event = dynamic_cast(event_); - - std::vector realObjects = codeGenerator.ExpandObjectsName( - event.GetObjectToPick(), parentContext); - - if (realObjects.empty()) return gd::String(""); - for (std::size_t i = 0; i < realObjects.size(); ++i) - parentContext.ObjectsListNeeded(realObjects[i]); - - // Context is "reset" each time the event is repeated (i.e. objects are - // picked again) - gd::EventsCodeGenerationContext context; - context.InheritsFrom(parentContext); - context.ForbidReuse(); - - // Prepare conditions/actions codes - gd::String conditionsCode = codeGenerator.GenerateConditionsListCode( - event.GetConditions(), context); - gd::String actionsCode = - codeGenerator.GenerateActionsListCode(event.GetActions(), context); - gd::String ifPredicat = "true"; - for (std::size_t i = 0; i < event.GetConditions().size(); ++i) - ifPredicat += " && condition" + gd::String::From(i) + "IsTrue"; - - // Prepare object declaration and sub events - gd::String subevents = - codeGenerator.GenerateEventsListCode(event.GetSubEvents(), context); - - gd::String objectDeclaration = - codeGenerator.GenerateObjectsDeclarationCode(context) + "\n"; - - if (realObjects.size() != - 1) //(We write a slighty more simple ( and optimized ) output code - // when only one object list is used.) - { - outputCode += "std::size_t forEachTotalCount = 0;"; - outputCode += "std::vector forEachObjects;"; - for (std::size_t i = 0; i < realObjects.size(); ++i) { - outputCode += "std::size_t forEachCount" + gd::String::From(i) + - " = " + ManObjListName(realObjects[i]) + - ".size(); forEachTotalCount += forEachCount" + - gd::String::From(i) + ";"; - outputCode += "forEachObjects.insert(" + - gd::String(i == 0 ? "forEachObjects.begin()" - : "forEachObjects.end()") + - ", " + ManObjListName(realObjects[i]) + ".begin(), " + - ManObjListName(realObjects[i]) + ".end());"; - } - } - - // Write final code : - - // For loop declaration - if (realObjects.size() == - 1) // We write a slighty more simple ( and optimized ) output code - // when only one object list is used. - outputCode += "for(std::size_t forEachIndex = 0;forEachIndex < " + - ManObjListName(realObjects[0]) + - ".size();++forEachIndex)\n"; - else - outputCode += - "for(std::size_t forEachIndex = 0;forEachIndex < " - "forEachTotalCount;++forEachIndex)\n"; - - outputCode += "{\n"; - - // Clear all concerned objects lists and keep only one object - if (realObjects.size() == 1) { - outputCode += - "std::vector temporaryForEachList; " - "temporaryForEachList.push_back(" + - ManObjListName(realObjects[0]) + "[forEachIndex]);"; - outputCode += "std::vector " + - ManObjListName(realObjects[0]) + - " = temporaryForEachList;\n"; - } else { - // Declare all lists of concerned objects empty - for (std::size_t j = 0; j < realObjects.size(); ++j) - outputCode += "std::vector " + - ManObjListName(realObjects[j]) + ";\n"; - - for (std::size_t i = 0; i < realObjects.size(); - ++i) // Pick then only one object - { - gd::String count; - for (std::size_t j = 0; j <= i; ++j) { - if (j != 0) count += "+"; - count += "forEachCount" + gd::String::From(j); - } - - if (i != 0) outputCode += "else "; - outputCode += "if (forEachIndex < " + count + ") {\n"; - outputCode += " " + ManObjListName(realObjects[i]) + - ".push_back(forEachObjects[forEachIndex]);\n"; - outputCode += "}\n"; - } - } - - outputCode += "{"; // This scope is used as the for loop modified the - // objects list. - outputCode += objectDeclaration; - - outputCode += conditionsCode; - outputCode += "if (" + ifPredicat + ")\n"; - outputCode += "{\n"; - outputCode += actionsCode; - if (event.HasSubEvents()) { - outputCode += "\n{ //Subevents: \n"; - outputCode += subevents; - outputCode += "} //Subevents end.\n"; - } - outputCode += "}\n"; - - outputCode += "}"; - - outputCode += "}\n"; // End of for loop - - return outputCode; - }); - - GetAllEvents()["BuiltinCommonInstructions::Group"].SetCodeGenerator( - [](gd::BaseEvent& event, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context) { - return codeGenerator.GenerateEventsListCode(event.GetSubEvents(), - context); - }); - - AddEvent("CppCode", - _("C++ code (Experimental)"), - _("Execute C++ code"), - "", - "res/source_cpp16.png", - std::shared_ptr(new CppCodeEvent)) - .SetCodeGenerator([](gd::BaseEvent& event_, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& parentContext) { - CppCodeEvent& event = dynamic_cast(event_); - - // Note: The associated source file is compiled separately ( it is - // recognized as a Source File dependency by DependenciesAnalyzer and - // compiled by CodeCompilationHelpers); - - // Generate the code to call the associated source file - gd::String functionPrototype = - "void " + event.GetFunctionToCall() + "(" + - (event.GetPassSceneAsParameter() ? "RuntimeScene & scene" : "") + - ((event.GetPassSceneAsParameter() && - event.GetPassObjectListAsParameter()) - ? ", " - : "") + - (event.GetPassObjectListAsParameter() - ? "std::vector objectsList" - : "") + - ");"; - codeGenerator.AddGlobalDeclaration(functionPrototype + "\n"); - - gd::String outputCode; - outputCode += "{"; - - // Prepare objects list if needed - if (event.GetPassObjectListAsParameter()) { - std::vector realObjects = codeGenerator.ExpandObjectsName( - event.GetObjectToPassAsParameter(), parentContext); - - outputCode += "std::vector functionObjects;"; - for (std::size_t i = 0; i < realObjects.size(); ++i) { - parentContext.ObjectsListNeeded(realObjects[i]); - outputCode += "functionObjects.insert(" + - gd::String(i == 0 ? "functionObjects.begin()" - : "functionObjects.end()") + - ", " + ManObjListName(realObjects[i]) + ".begin(), " + - ManObjListName(realObjects[i]) + ".end());"; - } - } - - gd::String functionCall = - event.GetFunctionToCall() + "(" + - (event.GetPassSceneAsParameter() ? "*runtimeContext->scene" : "") + - ((event.GetPassSceneAsParameter() && - event.GetPassObjectListAsParameter()) - ? ", " - : "") + - (event.GetPassObjectListAsParameter() ? "functionObjects" : "") + - ");"; - outputCode += "" + functionCall + "\n"; - - outputCode += "}"; - return outputCode; - }); - - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "sfml-audio-2.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "sfml-graphics-2.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "sfml-network-2.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "sfml-window-2.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "sfml-system-2.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "libsndfile-1.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "openal32.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "mingwm10.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "libgcc_s_sjlj-1.dll")); - supplementaryRuntimeFiles.push_back( - std::pair("Windows", "libstdc++-6.dll")); - - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libFLAC.so.8")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libfreetype.so.6")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libGLEW.so.1.5")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libGLEW.so.1.8")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libGLEW.so.1.10")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libopenal.so.0")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libopenal.so.1")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsfml-audio.so.2")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsfml-graphics.so.2")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsfml-network.so.2")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsfml-system.so.2")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsfml-window.so.2")); - supplementaryRuntimeFiles.push_back( - std::pair("Linux", "libsndfile.so.1")); - - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "libsfml-audio.2.0.dylib")); - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "libsfml-graphics.2.0.dylib")); - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "libsfml-network.2.0.dylib")); - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "libsfml-system.2.0.dylib")); - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "libsfml-window.2.0.dylib")); - supplementaryRuntimeFiles.push_back( - std::pair("Mac", "sndfile")); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.h b/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.h deleted file mode 100644 index 704189ed6..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsExtension.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef COMMONINSTRUCTIONSEXTENSION_H -#define COMMONINSTRUCTIONSEXTENSION_H -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing common events and conditions/actions. - * - * \ingroup BuiltinExtensions - */ -class CommonInstructionsExtension : public ExtensionBase { - public: - CommonInstructionsExtension(); - virtual ~CommonInstructionsExtension(){}; - - protected: - private: -}; - -#endif // COMMONINSTRUCTIONSEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.cpp deleted file mode 100644 index 523be6972..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Extensions/Builtin/CommonInstructionsTools.h" -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/profile.h" - -namespace GDpriv { - -namespace CommonInstructions { - -namespace { -/** - * Create and initialize the random engine. - * If the system provides a undeterministic random_device, it's used to get - * a totally random seed for the pseudo-random engine. Otherwise, the time - * since epoch is used - */ -std::mt19937 InitializeRandomEngine() { - std::random_device randomDevice; - return std::mt19937(randomDevice.entropy() > 0 - ? randomDevice() - : std::chrono::high_resolution_clock::now() - .time_since_epoch() - .count()); -} - -// Global variable storing the current seed -std::mt19937 randomEngine = InitializeRandomEngine(); -} // namespace - -double GD_API Random(int end) { - if (end <= 0) return 0; - - std::uniform_int_distribution randomDist(0, end); - return randomDist(randomEngine); -} - -double GD_API RandomInRange(int min, int max) { - return min + Random(max - min); // return min if min >= max -} - -double GD_API RandomFloat(float end) { - if (end <= 0) return 0; - - std::uniform_real_distribution randomDist(0, end); - return randomDist(randomEngine); -} - -double GD_API RandomFloatInRange(float min, float max) { - return min + RandomFloat(max - min); // return min if min >= max -} - -double GD_API RandomWithStep(float min, float max, float step) { - if (step <= 0) return min + Random(max - min); - return min + Random(std::floor((max - min) / step)) * step; // return min if min >= max -} - -bool GD_API LogicalNegation(bool param) { return !param; } - -double GD_API ToDouble(const gd::String& str) { return str.To(); } - -gd::String GD_API ToString(double number) { return gd::String::From(number); } - -gd::String GD_API LargeNumberToString(double number) { - std::ostringstream oss; - oss.setf(std::ios::fixed); - oss << number; - std::string formattedStr = oss.str(); - - // Delete trailing zero if needed - size_t pointPos = formattedStr.find('.'); - if (pointPos < formattedStr.length()) { - size_t searchPos = formattedStr.length() - 1; - while (formattedStr[searchPos] == '0') searchPos--; - if (formattedStr[searchPos] == '.') searchPos--; - - formattedStr.resize(searchPos + 1); - } - - return gd::String::FromUTF8(formattedStr); -} - -double GD_API ToRad(double angle) { return angle * 3.1415926 / 180.0; } - -double GD_API ToDeg(double angle) { return angle * 180.0 / 3.1415926; } - -} // namespace CommonInstructions - -} // namespace GDpriv diff --git a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.h b/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.h deleted file mode 100644 index 29990634b..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/CommonInstructionsTools.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef COMMONINSTRUCTIONS_H -#define COMMONINSTRUCTIONS_H - -#include -#include "GDCpp/Runtime/String.h" - -namespace GDpriv { - -namespace CommonInstructions { - -/** - * Generate a random integer between 0 and max - */ -double GD_API Random(int max); - -/** - * Generate a random integer between min and max - */ -double GD_API RandomInRange(int min, int max); - -/** - * Generate a random float between 0 and max - */ -double GD_API RandomFloat(float max); - -/** - * Generate a random float between min and max - */ -double GD_API RandomFloatInRange(float min, float max); - -/** - * Generate a random number between min and max in steps - */ -double GD_API RandomWithStep(float min, float max, float step); - -/** - * Logical negation - * \return !param - */ -bool GD_API LogicalNegation(bool param); - -/** - * Convert the string to a double. - * \warning This function is meant to be used only in GD events generated code. - */ -double GD_API ToDouble(const gd::String& str); - -/** - * Convert the double to a string. - * \warning This function is meant to be used only in GD events generated code. - */ -gd::String GD_API ToString(double number); - -/** - * Convert the double to a string, disabling scientific notation. - * \warning This function is meant to be used only in GD events generated code. - */ -gd::String GD_API LargeNumberToString(double number); - -/** - * Convert the angle from degrees to radians - * \warning This function is meant to be used only in GD events generated code. - */ -double GD_API ToRad(double angle); - -/** - * Convert the angle from radians to degrees. - * \warning This function is meant to be used only in GD events generated code. - */ -double GD_API ToDeg(double angle); - -} // namespace CommonInstructions - -} // namespace GDpriv -#endif // COMMONINSTRUCTIONS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.cpp deleted file mode 100644 index 4729371ce..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "ExternalLayoutsExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/ExternalLayoutsExtension.cpp" -#endif - -ExternalLayoutsExtension::ExternalLayoutsExtension() { - gd::BuiltinExtensionsImplementer::ImplementsExternalLayoutsExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllActions()["BuiltinExternalLayouts::CreateObjectsFromExternalLayout"] - .SetFunctionName("ExternalLayoutsTools::CreateObjectsFromExternalLayout") - .SetIncludeFile("GDCpp/Extensions/Builtin/ExternalLayoutsTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.h b/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.h deleted file mode 100644 index 46a8fdb72..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsExtension.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef EXTERNALLAYOUTSEXTENSION_H -#define EXTERNALLAYOUTSEXTENSION_H -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing features related to external layouts. - */ -class ExternalLayoutsExtension : public ExtensionBase { - public: - ExternalLayoutsExtension(); - virtual ~ExternalLayoutsExtension(){}; -}; - -#endif // EXTERNALLAYOUTSEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.cpp deleted file mode 100644 index 62ec21324..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "ExternalLayoutsTools.h" -#include "GDCpp/Runtime/Project/ExternalLayout.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -namespace ExternalLayoutsTools { - -void GD_API -CreateObjectsFromExternalLayout(RuntimeScene& scene, - const gd::String& externalLayoutName, - float xOffset, - float yOffset) { - for (std::size_t i = 0; i < scene.game->GetExternalLayoutsCount(); ++i) { - if (scene.game->GetExternalLayout(i).GetName() == externalLayoutName) - scene.CreateObjectsFrom( - scene.game->GetExternalLayout(i).GetInitialInstances(), - xOffset, - yOffset); - } -} - -} // namespace ExternalLayoutsTools diff --git a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.h b/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.h deleted file mode 100644 index fe906007d..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ExternalLayoutsTools.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef EXTERNALLAYOUTSTOOLS_H -#define EXTERNALLAYOUTSTOOLS_H - -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; - -namespace ExternalLayoutsTools { -void GD_API -CreateObjectsFromExternalLayout(RuntimeScene& scene, - const gd::String& externalLayoutName, - float xOffset, - float yOffset); -}; - -#endif // EXTERNALLAYOUTSTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/FileExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/FileExtension.cpp deleted file mode 100644 index 46f2d0ca5..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/FileExtension.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "GDCpp/Extensions/Builtin/FileExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Runtime/XmlFilesHelper.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/FileExtension.cpp" -#endif - -FileExtension::FileExtension() { - gd::BuiltinExtensionsImplementer::ImplementsFileExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["GroupExists"] - .SetFunctionName("GroupExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["LoadFile"] - .SetFunctionName("LoadFileInMemory") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["UnloadFile"] - .SetFunctionName("UnloadFileFromMemory") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["EcrireFichierExp"] - .SetFunctionName("WriteValueInFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["EcrireFichierTxt"] - .SetFunctionName("WriteStringInFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["LireFichierExp"] - .SetFunctionName("ReadValueFromFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["LireFichierTxt"] - .SetFunctionName("ReadStringFromFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["DeleteGroupFichier"] - .SetFunctionName("DeleteGroupFromFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["DeleteFichier"] - .SetFunctionName("GDDeleteFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllConditions()["FileExists"] - .SetFunctionName("FileExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["LaunchFile"] - .SetFunctionName("LaunchFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); - GetAllActions()["ExecuteCmd"] - .SetFunctionName("ExecuteCmd") - .SetIncludeFile("GDCpp/Extensions/Builtin/FileTools.h"); -#endif -} - -#if defined(GD_IDE_ONLY) -void FileExtension::GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - const std::map >& openedFiles = - XmlFilesManager::GetOpenedFilesList(); - - std::size_t i = 0; - std::map >::const_iterator end = - openedFiles.end(); - for (std::map >::const_iterator iter = - openedFiles.begin(); - iter != end; - ++iter) { - if (propertyNb == i) { - name = _("Opened file:"); - value = iter->first; - - return; - } - - ++i; - } -} - -bool FileExtension::ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue) { - return false; -} - -std::size_t FileExtension::GetNumberOfProperties(RuntimeScene& scene) const { - return XmlFilesManager::GetOpenedFilesList().size(); -} -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/FileExtension.h b/GDCpp/GDCpp/Extensions/Builtin/FileExtension.h deleted file mode 100644 index 4e9df606f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/FileExtension.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef FILEEXTENSION_H -#define FILEEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing files features. - * - * \ingroup FileExtension - */ -class FileExtension : public ExtensionBase { - public: - FileExtension(); - virtual ~FileExtension(){}; - -#if defined(GD_IDE_ONLY) - bool HasDebuggingProperties() const { return true; }; - void GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - bool ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue); - std::size_t GetNumberOfProperties(RuntimeScene& scene) const; -#endif -}; - -#endif // FILEEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/FileTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/FileTools.cpp deleted file mode 100644 index dcd658b37..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/FileTools.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "FileTools.h" -#include -#include -#include -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Variable.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/XmlFilesHelper.h" - -using namespace std; - -bool GD_API FileExists(const gd::String& file) { - TiXmlDocument doc; - if (!gd::LoadXmlFromFile(doc, file) && doc.ErrorId() == 2) return false; - - return true; -} - -bool GD_API GroupExists(const gd::String& filename, const gd::String& group) { - std::shared_ptr file = XmlFilesManager::GetFile(filename); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string str; - vector groups; - while (std::getline(groupsStr, str, '/')) - groups.push_back(gd::String::FromUTF8(str)); - - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - // On avance petit � petit dans le fichier - for (std::size_t i = 0; i < groups.size(); i++) { - if (!hdl.FirstChildElement(groups.at(i).c_str()).ToElement()) return false; - - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - return true; -} - -/** - * Launch a file - */ -void GD_API LaunchFile(const gd::String& file) { -#ifdef WINDOWS - // Cr�ation de l'adresse internet � lancer - gd::String appel = "start \"\" \"" + file + "\""; // quotes are important - - system(appel.ToLocale().c_str()); -#elif defined(LINUX) - // N�cessite le paquet xdg-utils - gd::String appel = "xdg-open \"" + file + "\""; - - system(appel.ToLocale().c_str()); -#elif defined(MACOS) - gd::String appel = "open \"" + file + "\""; - - system(appel.ToLocale().c_str()); -#endif - - return; -} - -/** - * Execute a system-specific command - */ -void GD_API ExecuteCmd(const gd::String& cmd) { - system(cmd.ToLocale().c_str()); - - return; -} - -/** - * Delete a file - */ -void GD_API GDDeleteFile(const gd::String& filename) { - remove(filename.ToLocale().c_str()); - - return; -} - -/** - * Load a file in memory - */ -void GD_API LoadFileInMemory(const gd::String& filename) { - XmlFilesManager::LoadFile(filename); - - return; -} - -/** - * Unload a file from memory - */ -void GD_API UnloadFileFromMemory(const gd::String& filename) { - XmlFilesManager::UnloadFile(filename); - - return; -} - -void GD_API DeleteGroupFromFile(const gd::String& filename, - const gd::String& group) { - std::shared_ptr file = XmlFilesManager::GetFile(filename); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string str; - vector groups; - while (std::getline(groupsStr, str, '/')) { - groups.push_back(gd::String::FromUTF8(str)); - } - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - if (groups.empty()) return; - groups.push_back(""); - - // A chaque fois, on v�rifie si le groupe voulu existe - for (std::size_t i = 0; i < groups.size(); i++) { - if (hdl.FirstChildElement(groups.at(i).c_str()).Element() == NULL) return; - - // Si on arrive au groupe parent du groupe - //� supprimer - if (i >= (groups.size() - 1) - 1) { - hdl.ToNode()->RemoveChild( - hdl.FirstChildElement(groups.at(i).c_str()).ToNode()); - return; - } - - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - return; -} - -void GD_API WriteValueInFile(const gd::String& filename, - const gd::String& group, - double value) { - std::shared_ptr file = XmlFilesManager::GetFile(filename); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string str; - vector groups; - while (std::getline(groupsStr, str, '/')) { - groups.push_back(gd::String::FromUTF8(str)); - } - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - if (groups.empty()) return; - - // Insertion de la d�claration - TiXmlDeclaration decl("1.0", "UTF-8", ""); - if (hdl.FirstChildElement().Element() != NULL) { - // Il y a d�j� un noeud, on v�rifie que c'est pas une d�claration - if (hdl.FirstChild().ToNode()->ToDeclaration() == NULL) - file->GetTinyXmlDocument().InsertBeforeChild( - hdl.FirstChildElement().Element(), decl); - } else - file->GetTinyXmlDocument().InsertEndChild( - decl); // Il n'y a rien, on peut ins�rer notre d�claration - - // Cr�ation si besoin est de la racine - if (hdl.FirstChildElement(groups.at(0).c_str()).Element() == NULL) { - TiXmlElement root(groups.at(0).c_str()); - file->GetTinyXmlDocument().InsertEndChild(root); - } - - // A chaque fois, on v�rifie si le groupe voulu existe, si non on le cr��, - // et on se d�place dedans. - for (std::size_t i = 0; i < groups.size(); i++) { - if (hdl.FirstChildElement(groups.at(i).c_str()).Element() == NULL) { - TiXmlElement le_nouveau(groups.at(i).c_str()); - hdl.Element()->InsertEndChild(le_nouveau); - } - - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - // Ecriture dans le groupe - if (hdl.Element() != NULL) hdl.Element()->SetDoubleAttribute("value", value); - - return; -} - -void GD_API WriteStringInFile(const gd::String& filename, - const gd::String& group, - const gd::String& str) { - std::shared_ptr file = XmlFilesManager::GetFile(filename); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string gstr; - vector groups; - while (std::getline(groupsStr, gstr, '/')) { - groups.push_back(gd::String::FromUTF8(gstr)); - } - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - if (groups.empty()) return; - - // Insertion de la d�claration - TiXmlDeclaration decl("1.0", "ISO-8859-1", ""); - if (hdl.FirstChildElement().Element() != NULL) { - // Il y a d�j� un noeud, on v�rifie que c'est pas une d�claration - if (hdl.FirstChild().ToNode()->ToDeclaration() == NULL) - file->GetTinyXmlDocument().InsertBeforeChild( - hdl.FirstChildElement().Element(), decl); - } else - file->GetTinyXmlDocument().InsertEndChild( - decl); // Il n'y a rien, on peut ins�rer notre d�claration - - // Cr�ation si besoin est de la racine - if (hdl.FirstChildElement(groups.at(0).c_str()).Element() == NULL) { - TiXmlElement root(groups.at(0).c_str()); - file->GetTinyXmlDocument().InsertEndChild(root); - } - - // A chaque fois, on v�rifie si le groupe voulu existe, si non on le cr��, - // et on se d�place dedans. - for (std::size_t i = 0; i < groups.size(); i++) { - if (hdl.FirstChildElement(groups.at(i).c_str()).Element() == NULL) { - TiXmlElement le_nouveau(groups.at(i).c_str()); - hdl.Element()->InsertEndChild(le_nouveau); - } - - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - // Ecriture dans le groupe - if (hdl.Element() != NULL) hdl.Element()->SetAttribute("texte", str.c_str()); - - return; -} - -void GD_API ReadValueFromFile(const gd::String& filename, - const gd::String& group, - RuntimeScene& scene, - gd::Variable& variable) { - std::shared_ptr file = XmlFilesManager::GetFile(filename, false); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string str; - vector groups; - while (std::getline(groupsStr, str, '/')) { - groups.push_back(gd::String::FromUTF8(str)); - } - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - // On avance petit � petit dans le fichier - for (std::size_t i = 0; i < groups.size(); i++) { - if (!hdl.FirstChildElement(groups.at(i).c_str()).ToElement()) { - return; - } - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - // On stocke la valeur - if (hdl.ToElement()->Attribute("value") == NULL) return; - double value; - hdl.ToElement()->Attribute("value", &value); - - // Update variable value - variable.SetValue(value); - - return; -} - -void GD_API ReadStringFromFile(const gd::String& filename, - const gd::String& group, - RuntimeScene& scene, - gd::Variable& variable) { - std::shared_ptr file = XmlFilesManager::GetFile(filename, false); - TiXmlHandle hdl(&file->GetTinyXmlDocument()); - - // D�coupage des groupes - istringstream groupsStr(group.Raw()); - std::string str; - vector groups; - while (std::getline(groupsStr, str, '/')) { - groups.push_back(gd::String::FromUTF8(str)); - } - groups.erase(std::remove_if(groups.begin(), groups.end(), StringEmpty()), - groups.end()); - - // On avance petit � petit dans le fichier - for (std::size_t i = 0; i < groups.size(); i++) { - if (!hdl.FirstChildElement(groups.at(i).c_str()).ToElement()) { - return; - } - hdl = hdl.FirstChildElement(groups.at(i).c_str()); - } - - // On stocke la valeur - if (hdl.ToElement()->Attribute("texte") == NULL) return; - - // Update variable texte - variable.SetString(hdl.ToElement()->Attribute("texte")); - - return; -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/FileTools.h b/GDCpp/GDCpp/Extensions/Builtin/FileTools.h deleted file mode 100644 index ec5142c22..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/FileTools.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef FILETOOLS_H -#define FILETOOLS_H - -#include -class RuntimeScene; -namespace gd { -class Variable; -class String; -}; // namespace gd - -bool GD_API FileExists(const gd::String& file); -bool GD_API GroupExists(const gd::String& file, const gd::String& group); -void GD_API LaunchFile(const gd::String& file); -void GD_API ExecuteCmd(const gd::String& cmd); -void GD_API GDDeleteFile(const gd::String& filename); -void GD_API LoadFileInMemory(const gd::String& filename); -void GD_API UnloadFileFromMemory(const gd::String& filename); -void GD_API DeleteGroupFromFile(const gd::String& filename, - const gd::String& group); -void GD_API WriteValueInFile(const gd::String& filename, - const gd::String& group, - double value); -void GD_API WriteStringInFile(const gd::String& filename, - const gd::String& group, - const gd::String& str); -void GD_API ReadValueFromFile(const gd::String& filename, - const gd::String& group, - RuntimeScene& scene, - gd::Variable& variable); -void GD_API ReadStringFromFile(const gd::String& filename, - const gd::String& group, - RuntimeScene& scene, - gd::Variable& variable); - -#endif // FILETOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.cpp deleted file mode 100644 index ec2ce5850..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Extensions/Builtin/JoystickExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/JoystickExtension.cpp" -#endif - -JoystickExtension::JoystickExtension() { - gd::BuiltinExtensionsImplementer::ImplementsJoystickExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["JoystickButtonDown"] - .SetFunctionName("JoystickButtonDown") - .SetIncludeFile("GDCpp/Extensions/Builtin/JoystickTools.h"); - GetAllConditions()["JoystickAxis"] - .SetFunctionName("GetJoystickAxisValue") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/JoystickTools.h"); - - GetAllActions()["GetJoystickAxis"] - .SetFunctionName("JoystickAxisValueToVariable") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/JoystickTools.h"); - - GetAllExpressions()["GetJoystickAxis"] - .SetFunctionName("GetJoystickAxisValue") - .SetIncludeFile("GDCpp/Extensions/Builtin/JoystickTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.h b/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.h deleted file mode 100644 index 566b5309e..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/JoystickExtension.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef JOYSTICKEXTENSION_H -#define JOYSTICKEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing joysticks features - * - * \ingroup BuiltinExtensions - */ -class JoystickExtension : public ExtensionBase { - public: - JoystickExtension(); - virtual ~JoystickExtension(){}; - - protected: - private: -}; - -#endif // JOYSTICKEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.cpp deleted file mode 100644 index d1e764e51..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "JoystickTools.h" -#include -#include -#include "GDCpp/Runtime/Project/Variable.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -bool GD_API JoystickButtonDown(RuntimeScene& scene, - unsigned int joystick, - unsigned int button) { - return sf::Joystick::isButtonPressed(joystick, button); -} - -double GD_API GetJoystickAxisValue(RuntimeScene& scene, - unsigned int joystick, - const gd::String& axisStr) { - sf::Joystick::Axis axis; - if (axisStr == "AxisX") - axis = sf::Joystick::X; - else if (axisStr == "AxisY") - axis = sf::Joystick::Y; - else if (axisStr == "AxisZ") - axis = sf::Joystick::Z; - else if (axisStr == "AxisR") - axis = sf::Joystick::R; - else if (axisStr == "AxisU") - axis = sf::Joystick::U; - else if (axisStr == "AxisV") - axis = sf::Joystick::V; - else if (axisStr == "AxisPOV") - axis = sf::Joystick::PovX; // Deprecated - else if (axisStr == "AxisPovX") - axis = sf::Joystick::PovX; - else if (axisStr == "AxisPovY") - axis = sf::Joystick::PovY; - else - return 0; - - return sf::Joystick::getAxisPosition(joystick, axis); -} - -void GD_API JoystickAxisValueToVariable(RuntimeScene& scene, - unsigned int joystick, - const gd::String& axisStr, - gd::Variable& variable) { - // Obtain axis and joystick - sf::Joystick::Axis axis; - if (axisStr == "AxisX") - axis = sf::Joystick::X; - else if (axisStr == "AxisY") - axis = sf::Joystick::Y; - else if (axisStr == "AxisZ") - axis = sf::Joystick::Z; - else if (axisStr == "AxisR") - axis = sf::Joystick::R; - else if (axisStr == "AxisU") - axis = sf::Joystick::U; - else if (axisStr == "AxisV") - axis = sf::Joystick::V; - else if (axisStr == "AxisPOV") - axis = sf::Joystick::PovX; // Deprecated - else if (axisStr == "AxisPovX") - axis = sf::Joystick::PovX; - else if (axisStr == "AxisPovY") - axis = sf::Joystick::PovY; - else - return; - - // Update variable value - variable.SetValue(sf::Joystick::getAxisPosition(joystick, axis)); - - return; -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.h b/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.h deleted file mode 100644 index cde9b96a9..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/JoystickTools.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef JOYSTICKTOOLS_H -#define JOYSTICKTOOLS_H - -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; -namespace gd { -class Variable; -} - -bool GD_API JoystickButtonDown(RuntimeScene& scene, - unsigned int joystick, - unsigned int button); -double GD_API GetJoystickAxisValue(RuntimeScene& scene, - unsigned int joystick, - const gd::String& axisStr); -void GD_API JoystickAxisValueToVariable(RuntimeScene& scene, - unsigned int joystick, - const gd::String& axisStr, - gd::Variable& variable); - -#endif // JOYSTICKTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.cpp deleted file mode 100644 index 85f864a73..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/KeyboardExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/KeyboardExtension.cpp" -#endif - -KeyboardExtension::KeyboardExtension() { - gd::BuiltinExtensionsImplementer::ImplementsKeyboardExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["KeyPressed"] - .SetFunctionName("IsKeyPressed") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); - GetAllConditions()["KeyReleased"] - .SetFunctionName("WasKeyReleased") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); - GetAllConditions()["KeyFromTextPressed"] - .SetFunctionName("IsKeyPressed") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); - GetAllConditions()["KeyFromTextReleased"] - .SetFunctionName("WasKeyReleased") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); - GetAllConditions()["AnyKeyPressed"] - .SetFunctionName("AnyKeyIsPressed") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); - GetAllStrExpressions()["LastPressedKey"] - .SetFunctionName("LastPressedKey") - .SetIncludeFile("GDCpp/Extensions/Builtin/KeyboardTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.h b/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.h deleted file mode 100644 index 1154f53d9..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/KeyboardExtension.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef KEYBOARDEXTENSION_H -#define KEYBOARDEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing keyboard features - * - * \ingroup BuiltinExtensions - */ -class KeyboardExtension : public ExtensionBase { - public: - KeyboardExtension(); - virtual ~KeyboardExtension(){}; - - protected: - private: -}; - -#endif // KEYBOARDEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.cpp deleted file mode 100644 index 1c2fc926c..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Extensions/Builtin/KeyboardTools.h" -#include -#include -#include "GDCpp/Runtime/RuntimeScene.h" - -using namespace std; - -bool GD_API IsKeyPressed(RuntimeScene& scene, gd::String key) { - return scene.GetInputManager().IsKeyPressed(key); -} - -bool GD_API WasKeyReleased(RuntimeScene& scene, gd::String key) { - return scene.GetInputManager().WasKeyReleased(key); -} - -bool GD_API AnyKeyIsPressed(RuntimeScene& scene) { - return scene.GetInputManager().AnyKeyIsPressed(); -} - -gd::String GD_API LastPressedKey(RuntimeScene& scene) { - return scene.GetInputManager().GetLastPressedKey(); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.h b/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.h deleted file mode 100644 index 5c8941245..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/KeyboardTools.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef KEYBOARDTOOLS_H -#define KEYBOARDTOOLS_H - -#include -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; - -bool IsKeyPressed(RuntimeScene& scene, gd::String key); -bool WasKeyReleased(RuntimeScene& scene, gd::String key); -bool AnyKeyIsPressed(RuntimeScene& scene); -gd::String LastPressedKey(RuntimeScene& scene); - -#endif // KEYBOARDTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.cpp deleted file mode 100644 index 5e11a7ab4..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include -#include "GDCpp/Runtime/CommonTools.h" - -namespace GDpriv { -namespace MathematicalTools { - -double GD_API normalize(double expression, double min, double max) { - return (min == max ? max : ((expression - min) / (max - min))); -} - -double GD_API clamp(double expression, double min, double max) { - return std::min(std::max(expression, min), max); -} - -double GD_API Minimal(double expression1, double expression2) { - return std::min(expression1, expression2); -} - -double GD_API Maximal(double expression1, double expression2) { - return std::max(expression1, expression2); -} - -double GD_API abs(double expression) { return ::fabs(expression); } - -double GD_API acos(double expression) { return ::acos(expression); } -double GD_API asin(double expression) { return ::asin(expression); } - -double GD_API acosh(double expression) { return ::acosh(expression); } -double GD_API asinh(double expression) { return ::asinh(expression); } -double GD_API atan(double expression) { return ::atan(expression); } -double GD_API atan2(double y, double x) { return ::atan2(y, x); } -double GD_API atanh(double expression) { return ::atanh(expression); } -double GD_API cbrt(double expression) { return ::cbrt(expression); } -double GD_API ceil(double expression) { return ::ceil(expression); } -double GD_API floor(double expression) { return ::floor(expression); } -double GD_API cos(double expression) { return ::cos(expression); } -double GD_API cosh(double expression) { return ::cosh(expression); } -double GD_API cot(double expression) { return 1 / ::tan(expression); } -double GD_API csc(double expression) { return 1.0 / ::sin(expression); } -double GD_API sec(double expression) { return 1.0 / ::cos(expression); } -double GD_API exp(double expression) { return ::exp(expression); } -double GD_API Round(double expression) { return GDRound(expression); } -double GD_API log(double expression) { return ::log(expression); } -double GD_API log2(double expression) { -#if defined(ANDROID) - return log(expression) / log(2); -#else - return ::log2(expression); -#endif -} -double GD_API log10(double expression) { return ::log10(expression); } -double GD_API nthroot(double expression, double n) { - return ::pow(expression, 1.0 / n); -} -double GD_API pow(double expression, double n) { return ::pow(expression, n); } -double GD_API sin(double expression) { return ::sin(expression); } -double GD_API sinh(double expression) { return ::sinh(expression); } -double GD_API sign(double expression) { - if (expression == 0) return 0; - - return (expression > 0 ? +1 : -1); -} -double GD_API sqrt(double expression) { return ::sqrt(expression); } -double GD_API tan(double expression) { return ::tan(expression); } -double GD_API tanh(double expression) { return ::tanh(expression); } -double GD_API trunc(double expression) { return ::trunc(expression); } -double GD_API mod(double x, double y) { return x - y * ::floor(x / y); } - -double GD_API angleDifference(double angle1, double angle2) { - return mod(mod(angle1 - angle2, 360.0) + 180.0, 360.0) - 180.0; -} - -double GD_API lerp(double a, double b, double x) { return a + (b - a) * x; } - -} // namespace MathematicalTools -} // namespace GDpriv diff --git a/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.h b/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.h deleted file mode 100644 index dbf499a82..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MathematicalTools.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef MATHEMATICALTOOLS_H -#define MATHEMATICALTOOLS_H - -namespace GDpriv { - -/** - * \brief Mathematical tools only used by GD events generated code. - */ -namespace MathematicalTools { - -double GD_API normalize(double expression, double min, double max); -double GD_API clamp(double expression, double min, double max); -double GD_API Minimal(double expression1, double expression2); -double GD_API Maximal(double expression1, double expression2); -double GD_API abs(double expression); -double GD_API acos(double expression); -double GD_API asin(double expression); -double GD_API acosh(double expression); -double GD_API asinh(double expression); -double GD_API atan(double expression); -double GD_API atan2(double y, double x); -double GD_API atanh(double expression); -double GD_API cbrt(double expression); -double GD_API ceil(double expression); -double GD_API floor(double expression); -double GD_API cos(double expression); -double GD_API cosh(double expression); -double GD_API cot(double expression); -double GD_API sec(double expression); -double GD_API csc(double expression); -double GD_API exp(double expression); -double GD_API Round(double expression); -double GD_API log(double expression); -double GD_API log2(double expression); -double GD_API log10(double expression); -double GD_API nthroot(double expression, double n); -double GD_API pow(double expression, double n); -double GD_API sin(double expression); -double GD_API sinh(double expression); -double GD_API sign(double expression); -double GD_API sqrt(double expression); -double GD_API tan(double expression); -double GD_API tanh(double expression); -double GD_API trunc(double expression); -double GD_API mod(double x, double y); -double GD_API angleDifference(double angle1, double angle2); -double GD_API lerp(double a, double b, double x); - -} // namespace MathematicalTools -} // namespace GDpriv - -#endif // MATHEMATICALTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.cpp deleted file mode 100644 index b83a99b34..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "MathematicalToolsExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/MathematicalToolsExtension.cpp" -#endif - -MathematicalToolsExtension::MathematicalToolsExtension() { - gd::BuiltinExtensionsImplementer::ImplementsMathematicalToolsExtension(*this); - -#if defined(GD_IDE_ONLY) - - GetAllExpressions()["normalize"] - .SetFunctionName("GDpriv::MathematicalTools::normalize") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["clamp"] - .SetFunctionName("GDpriv::MathematicalTools::clamp") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["AngleDifference"] - .SetFunctionName("GDpriv::MathematicalTools::angleDifference") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["mod"] - .SetFunctionName("GDpriv::MathematicalTools::mod") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["min"] - .SetFunctionName("GDpriv::MathematicalTools::Minimal") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["max"] - .SetFunctionName("GDpriv::MathematicalTools::Maximal") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["abs"] - .SetFunctionName("GDpriv::MathematicalTools::abs") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["acos"] - .SetFunctionName("GDpriv::MathematicalTools::acos") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["acosh"] - .SetFunctionName("GDpriv::MathematicalTools::acosh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["asin"] - .SetFunctionName("GDpriv::MathematicalTools::asin") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["asinh"] - .SetFunctionName("GDpriv::MathematicalTools::asinh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["atan"] - .SetFunctionName("GDpriv::MathematicalTools::atan") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["atan2"] - .SetFunctionName("GDpriv::MathematicalTools::atan2") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["atanh"] - .SetFunctionName("GDpriv::MathematicalTools::atanh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["cbrt"] - .SetFunctionName("GDpriv::MathematicalTools::cbrt") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["ceil"] - .SetFunctionName("GDpriv::MathematicalTools::ceil") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["floor"] - .SetFunctionName("GDpriv::MathematicalTools::floor") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["cos"] - .SetFunctionName("GDpriv::MathematicalTools::cos") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["cosh"] - .SetFunctionName("GDpriv::MathematicalTools::cosh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["cot"] - .SetFunctionName("GDpriv::MathematicalTools::cot") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["csc"] - .SetFunctionName("GDpriv::MathematicalTools::csc") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["int"] - .SetFunctionName("GDpriv::MathematicalTools::Round") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["rint"] - .SetFunctionName("GDpriv::MathematicalTools::Round") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["round"] - .SetFunctionName("GDpriv::MathematicalTools::Round") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["exp"] - .SetFunctionName("GDpriv::MathematicalTools::exp") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["log"] - .SetFunctionName("GDpriv::MathematicalTools::log") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["ln"] - .SetFunctionName("GDpriv::MathematicalTools::log") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["log2"] - .SetFunctionName("GDpriv::MathematicalTools::log2") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["log10"] - .SetFunctionName("GDpriv::MathematicalTools::log10") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["nthroot"] - .SetFunctionName("GDpriv::MathematicalTools::nthroot") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["pow"] - .SetFunctionName("GDpriv::MathematicalTools::pow") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["sec"] - .SetFunctionName("GDpriv::MathematicalTools::sec") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["sign"] - .SetFunctionName("GDpriv::MathematicalTools::sign") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["sin"] - .SetFunctionName("GDpriv::MathematicalTools::sin") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["sinh"] - .SetFunctionName("GDpriv::MathematicalTools::sinh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["sqrt"] - .SetFunctionName("GDpriv::MathematicalTools::sqrt") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["tan"] - .SetFunctionName("GDpriv::MathematicalTools::tan") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["tanh"] - .SetFunctionName("GDpriv::MathematicalTools::tanh") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["trunc"] - .SetFunctionName("GDpriv::MathematicalTools::trunc") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - GetAllExpressions()["lerp"] - .SetFunctionName("GDpriv::MathematicalTools::lerp") - .SetIncludeFile("GDCpp/Extensions/Builtin/MathematicalTools.h"); - -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.h b/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.h deleted file mode 100644 index 9c80f593e..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MathematicalToolsExtension.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef MATHEMATICALTOOLSEXTENSION_H -#define MATHEMATICALTOOLSEXTENSION_H -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing mathematical features. - * - * \ingroup BuiltinExtensions - */ -class MathematicalToolsExtension : public ExtensionBase { - public: - MathematicalToolsExtension(); - virtual ~MathematicalToolsExtension(){}; - - private: -}; - -#endif // MATHEMATICALTOOLSEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.cpp deleted file mode 100644 index 033b7ab89..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/MouseExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/MouseExtension.cpp" -#endif - -MouseExtension::MouseExtension() { - gd::BuiltinExtensionsImplementer::ImplementsMouseExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllActions()["CentreSourisX"] - .SetFunctionName("CenterCursorHorizontally") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllActions()["CentreSourisY"] - .SetFunctionName("CenterCursorVertically") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllActions()["CacheSouris"] - .SetFunctionName("HideCursor") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllActions()["MontreSouris"] - .SetFunctionName("ShowCursor") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllActions()["SetSourisXY"] - .SetFunctionName("SetCursorPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllActions()["CentreSouris"] - .SetFunctionName("CenterCursor") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - - GetAllConditions()["MouseX"] - .SetFunctionName("GetCursorXPosition") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["MouseY"] - .SetFunctionName("GetCursorYPosition") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["SourisX"] // Deprecated - .SetFunctionName("GetCursorXPosition") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["SourisY"] // Deprecated - .SetFunctionName("GetCursorYPosition") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["MouseButtonPressed"] - .SetFunctionName("MouseButtonPressed") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["SourisBouton"] // Deprecated - .SetFunctionName("MouseButtonPressed") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["MouseButtonReleased"] - .SetFunctionName("MouseButtonReleased") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["IsMouseWheelScrollingUp"] - .SetFunctionName("IsMouseWheelScrollingUp") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllConditions()["IsMouseWheelScrollingDown"] - .SetFunctionName("IsMouseWheelScrollingDown") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - - GetAllExpressions()["MouseX"] - .SetFunctionName("GetCursorXPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllExpressions()["SourisX"] // Deprecated - .SetFunctionName("GetCursorXPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllExpressions()["MouseY"] - .SetFunctionName("GetCursorYPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllExpressions()["SourisY"] // Deprecated - .SetFunctionName("GetCursorYPosition") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - GetAllExpressions()["MouseWheelDelta"] - .SetFunctionName("GetMouseWheelDelta") - .SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h"); - - StripUnimplementedInstructionsAndExpressions(); // Touch support is not - // implemented -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.h b/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.h deleted file mode 100644 index 62b49d3b0..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MouseExtension.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef MOUSEEXTENSION_H -#define MOUSEEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing mouse features. - * - * \ingroup BuiltinExtensions - */ -class MouseExtension : public ExtensionBase { - public: - MouseExtension(); - virtual ~MouseExtension(){}; - - protected: - private: -}; - -#endif // MOUSEEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/MouseTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/MouseTools.cpp deleted file mode 100644 index 02c240710..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MouseTools.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "GDCpp/Extensions/Builtin/MouseTools.h" -#include -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -void GD_API CenterCursor(RuntimeScene &scene) { - sf::Mouse::setPosition(sf::Vector2i(scene.renderWindow->getSize().x / 2, - scene.renderWindow->getSize().y / 2), - *scene.renderWindow); -} - -void GD_API CenterCursorHorizontally(RuntimeScene &scene) { - sf::Mouse::setPosition( - sf::Vector2i(scene.renderWindow->getSize().x / 2, - scene.GetInputManager().GetMousePosition().y), - *scene.renderWindow); -} - -void GD_API CenterCursorVertically(RuntimeScene &scene) { - sf::Mouse::setPosition( - sf::Vector2i(scene.GetInputManager().GetMousePosition().x, - scene.renderWindow->getSize().y / 2), - *scene.renderWindow); -} - -void GD_API SetCursorPosition(RuntimeScene &scene, float newX, float newY) { - sf::Mouse::setPosition(sf::Vector2i(newX, newY), *scene.renderWindow); -} - -void GD_API HideCursor(RuntimeScene &scene) { - scene.renderWindow->setMouseCursorVisible(false); -} - -void GD_API ShowCursor(RuntimeScene &scene) { - scene.renderWindow->setMouseCursorVisible(true); -} - -double GD_API GetCursorXPosition(RuntimeScene &scene, - const gd::String &layer, - std::size_t camera) { - if (scene.GetRuntimeLayer(layer).GetCameraCount() == 0) return 0; - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) camera = 0; - - // Get view, and compute mouse position - const sf::View &view = - scene.GetRuntimeLayer(layer).GetCamera(camera).GetSFMLView(); - return scene.renderWindow - ->mapPixelToCoords(scene.GetInputManager().GetMousePosition(), view) - .x; -} - -double GD_API GetCursorYPosition(RuntimeScene &scene, - const gd::String &layer, - std::size_t camera) { - if (scene.GetRuntimeLayer(layer).GetCameraCount() == 0) return 0; - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) camera = 0; - - // Get view, and compute mouse position - const sf::View &view = - scene.GetRuntimeLayer(layer).GetCamera(camera).GetSFMLView(); - return scene.renderWindow - ->mapPixelToCoords(scene.GetInputManager().GetMousePosition(), view) - .y; -} - -bool GD_API MouseButtonPressed(RuntimeScene &scene, const gd::String &button) { - return scene.GetInputManager().IsMouseButtonPressed(button); -} - -bool GD_API MouseButtonReleased(RuntimeScene &scene, const gd::String &button) { - return scene.GetInputManager().IsMouseButtonReleased(button); -} - -int GD_API GetMouseWheelDelta(RuntimeScene &scene) { - return scene.GetInputManager().GetMouseWheelDelta(); -} - -bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene) { - return scene.GetInputManager().IsScrollingUp(); -} - -bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene) { - return scene.GetInputManager().IsScrollingDown(); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/MouseTools.h b/GDCpp/GDCpp/Extensions/Builtin/MouseTools.h deleted file mode 100644 index 86cf731e7..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/MouseTools.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef MOUSETOOLS_H -#define MOUSETOOLS_H - -#include -#include -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; -class RuntimeObject; - -void GD_API CenterCursor(RuntimeScene &scene); -void GD_API CenterCursorHorizontally(RuntimeScene &scene); -void GD_API CenterCursorVertically(RuntimeScene &scene); -void GD_API SetCursorPosition(RuntimeScene &scene, float newX, float newY); -void GD_API HideCursor(RuntimeScene &scene); -void GD_API ShowCursor(RuntimeScene &scene); -double GD_API GetCursorXPosition(RuntimeScene &scene, - const gd::String &layer, - std::size_t camera); -double GD_API GetCursorYPosition(RuntimeScene &scene, - const gd::String &layer, - std::size_t camera); -bool GD_API MouseButtonPressed(RuntimeScene &scene, const gd::String &key); -bool GD_API MouseButtonReleased(RuntimeScene &scene, const gd::String &key); -int GD_API GetMouseWheelDelta(RuntimeScene &scene); -bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene); -bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene); - -#endif // MOUSETOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.cpp deleted file mode 100644 index 9c8536439..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/NetworkExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/NetworkExtension.cpp" -#endif - -NetworkExtension::NetworkExtension() { - gd::BuiltinExtensionsImplementer::ImplementsNetworkExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllActions()["SendRequest"] - .SetFunctionName("SendHttpRequest") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllActions()["DownloadFile"] - .SetFunctionName("DownloadFile") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllActions()["JSONToVariableStructure"] - .SetFunctionName("JSONToVariableStructure") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllActions()["JSONToGlobalVariableStructure"] - .SetFunctionName("JSONToVariableStructure") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllActions()["JSONToObjectVariableStructure"] - .SetFunctionName("JSONToObjectVariableStructure") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - - GetAllStrExpressions()["ToJSON"] - .SetFunctionName("VariableStructureToJSON") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllStrExpressions()["GlobalVarToJSON"] - .SetFunctionName("VariableStructureToJSON") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); - GetAllStrExpressions()["ObjectVarToJSON"] - .SetFunctionName("ObjectVariableStructureToJSON") - .SetIncludeFile("GDCpp/Extensions/Builtin/NetworkTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.h b/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.h deleted file mode 100644 index d9f864271..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/NetworkExtension.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef NETWORKEXTENSION_H -#define NETWORKEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing very basic network features. - * - * \ingroup BuiltinExtensions - */ -class NetworkExtension : public ExtensionBase { - public: - NetworkExtension(); - virtual ~NetworkExtension(){}; - - protected: - private: -}; - -#endif // NETWORKEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.cpp deleted file mode 100644 index 7844d861a..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.cpp +++ /dev/null @@ -1,440 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Extensions/Builtin/NetworkTools.h" - -#include -#include -#include -#include -#include - -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Variable.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -using namespace std; - -void GD_API SendHttpRequest(const gd::String& host, - const gd::String& uri, - const gd::String& body, - const gd::String& method, - const gd::String& contentType, - gd::Variable& responseVar) { - // Separate the host and the port number - auto hostInfo = host.Split(U':'); - - if (hostInfo.size() < 2) - return; // Invalid address (there should be two elements: "http" and - // "//the.domain.com") - - // Create Http - sf::Http http; - http.setHost(hostInfo[0].ToUTF8() + ":" + hostInfo[1].ToUTF8(), - hostInfo.size() > 2 ? hostInfo[2].To() : 0); - - // Create request - sf::Http::Request request; - request.setMethod(method == "POST" ? sf::Http::Request::Post - : sf::Http::Request::Get); - request.setField("Content-Type", - contentType.empty() ? "application/x-www-form-urlencoded" - : contentType.ToUTF8()); - request.setUri(uri.ToUTF8()); - request.setBody(body.ToUTF8()); - - // Send request & Get response - sf::Http::Response response = http.sendRequest(request); - - if (response.getStatus() == sf::Http::Response::Ok) { - responseVar.SetString(gd::String::FromUTF8(response.getBody())); - } - // else request failed. -} - -void GD_API DownloadFile(const gd::String& host, - const gd::String& uri, - const gd::String& outputfilename) { - // Separate the host and the port number - auto hostInfo = host.Split(U':'); - - if (hostInfo.size() < 2) - return; // Invalid address (there should be two elements: "http" and - // "//the.domain.com") - - // Create Http - sf::Http http; - http.setHost(hostInfo[0].ToUTF8() + ":" + hostInfo[1].ToUTF8(), - hostInfo.size() > 2 ? hostInfo[2].To() : 0); - - // Create request - sf::Http::Request Request; - Request.setMethod(sf::Http::Request::Get); - Request.setUri(uri.ToUTF8()); - - // Send request & Get response - sf::Http::Response datas = http.sendRequest(Request); - - ofstream ofile(outputfilename.ToLocale().c_str(), ios_base::binary); - if (ofile.is_open()) { - ofile.write(datas.getBody().c_str(), datas.getBody().size()); - ofile.close(); - - return; - } - - cout << "Downloading file : Unable to open output file " << outputfilename; - return; -} - -// Private functions for JSON reading -namespace { -/** - * Adapted from public domain library "jsoncpp" - * (http://sourceforge.net/projects/jsoncpp/). - */ -static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } - -/** - * Adapted from public domain library "jsoncpp" - * (http://sourceforge.net/projects/jsoncpp/). - */ -static bool containsControlCharacter(const char* str) { - while (*str) { - if (isControlCharacter(*(str++))) return true; - } - return false; -} - -/** - * Tool function converting a string to a quoted string that can be inserted - * into a JSON file. Adapted from public domain library "jsoncpp" - * (http://sourceforge.net/projects/jsoncpp/). - */ -std::string StringToQuotedJSONString(const char* value) { - if (value == NULL) return ""; - // Not sure how to handle unicode... - if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && - !containsControlCharacter(value)) - return std::string("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to std::string is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - std::string::size_type maxsize = - strlen(value) * 2 + 3; // allescaped+quotes+NULL - std::string result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - for (const char* c = value; *c != 0; ++c) { - switch (*c) { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - // case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something. - // blep notes: actually escaping \/ may be useful in javascript to avoid - // (*c); - result += oss.str(); - } else { - result += *c; - } - break; - } - } - result += "\""; - return result; -} -} // namespace - -gd::String GD_API VariableStructureToJSON(const gd::Variable& variable) { - if (variable.GetType() == gd::Variable::Type::Number) - return gd::String::From(variable.GetValue()); - else if (variable.GetType() == gd::Variable::Type::String) - return gd::String::FromUTF8( - StringToQuotedJSONString(variable.GetString().c_str())); - else if (variable.GetType() == gd::Variable::Type::Boolean) { - gd::String str = variable.GetBool() ? "true" : "false"; - return str; - } - else if (variable.GetType() == gd::Variable::Type::Structure) { - gd::String str = "{"; - bool firstChild = true; - for (auto i = variable.GetAllChildren().begin(); - i != variable.GetAllChildren().end(); - ++i) { - if (!firstChild) str += ","; - str += gd::String::FromUTF8(StringToQuotedJSONString(i->first.c_str())) + - ": " + VariableStructureToJSON(*i->second); - - firstChild = false; - } - - str += "}"; - return str; - } else { - gd::String str = "["; - bool firstChild = true; - for (auto i = variable.GetAllChildrenArray().begin(); - i != variable.GetAllChildrenArray().end(); - ++i) { - if (!firstChild) str += ","; - str += VariableStructureToJSON(**i); - - firstChild = false; - } - - str += "]"; - return str; - }; -} - -gd::String GD_API ObjectVariableStructureToJSON(RuntimeObject* object, - const gd::Variable& variable) { - return VariableStructureToJSON(variable); -} - -// Private functions for JSON parsing -namespace { -size_t SkipBlankChar(const std::string& str, size_t pos) { - const std::string blankChar = " \n"; - return str.find_first_not_of(blankChar, pos); -} - -/** - * Adapted from https://github.com/hjiang/jsonxx - */ -std::string DecodeString(const std::string& original) { - std::string value; - value.reserve(original.size()); - std::istringstream input("\"" + original + "\""); - - char ch = '\0', delimiter = '"'; - input.get(ch); - if (ch != delimiter) return ""; - - while (!input.eof() && input.good()) { - input.get(ch); - if (ch == delimiter) { - break; - } - if (ch == '\\') { - input.get(ch); - switch (ch) { - case '\\': - case '/': - value.push_back(ch); - break; - case 'b': - value.push_back('\b'); - break; - case 'f': - value.push_back('\f'); - break; - case 'n': - value.push_back('\n'); - break; - case 'r': - value.push_back('\r'); - break; - case 't': - value.push_back('\t'); - break; - case 'u': { - int i; - std::stringstream ss; - for (i = 0; (!input.eof() && input.good()) && i < 4; ++i) { - input.get(ch); - ss << ch; - } - if (input.good() && (ss >> i)) value.push_back(i); - } break; - default: - if (ch != delimiter) { - value.push_back('\\'); - value.push_back(ch); - } else - value.push_back(ch); - break; - } - } else { - value.push_back(ch); - } - } - if (input && ch == delimiter) { - return value; - } else { - return ""; - } -} - -/** - * Return the position of the end of the string. Blank are skipped if - * necessary - * @param str The string to be used - * @param startPos The start position - * @param strContent A reference to a string that will be filled with the - * string content. - */ -size_t SkipString(const std::string& str, - size_t startPos, - std::string& strContent) { - startPos = SkipBlankChar(str, startPos); - if (startPos >= str.length()) return std::string::npos; - - size_t endPos = startPos; - - if (str[startPos] == '"') { - if (startPos + 1 >= str.length()) return std::string::npos; - - while (endPos == startPos || (str[endPos - 1] == '\\')) { - endPos = str.find_first_of('\"', endPos + 1); - if (endPos == std::string::npos) - return std::string::npos; // Invalid string - } - - strContent = DecodeString(str.substr(startPos + 1, endPos - 1 - startPos)); - return endPos; - } - - endPos = str.find_first_of(" \n,:"); - if (endPos >= str.length()) return std::string::npos; // Invalid string - - strContent = DecodeString(str.substr(startPos, endPos - 1 - startPos)); - return endPos - 1; -} - -/** - * Parse a JSON string, starting from pos, and storing the result into the - * specified variable. Note that the parsing is stopped as soon as a valid - * object is parsed. \return The position at the end of the valid object - * stored into the variable. - */ -size_t ParseJSONObject(const std::string& jsonStr, - size_t startPos, - gd::Variable& variable) { - size_t pos = SkipBlankChar(jsonStr, startPos); - if (pos >= jsonStr.length()) return std::string::npos; - - if (jsonStr[pos] == '{') // Object - { - bool firstChild = true; - while (firstChild || jsonStr[pos] == ',') { - pos++; - if (pos < jsonStr.length() && jsonStr[pos] == '}') break; - - std::string childName; - pos = SkipString(jsonStr, pos, childName); - - pos++; - pos = SkipBlankChar(jsonStr, pos); - if (pos >= jsonStr.length() || jsonStr[pos] != ':') - return std::string::npos; - - pos++; - pos = ::ParseJSONObject( - jsonStr, pos, variable.GetChild(gd::String::FromUTF8(childName))); - - pos = SkipBlankChar(jsonStr, pos); - if (pos >= jsonStr.length()) return std::string::npos; - firstChild = false; - } - - if (jsonStr[pos] != '}') { - std::cout << "Parsing error: Object not properly formed."; - return std::string::npos; - } - return pos + 1; - } else if (jsonStr[pos] == - '[') // Array are translated into child named 0,1,2... - { - std::size_t index = 0; - while (index == 0 || jsonStr[pos] == ',') { - pos++; - if (pos < jsonStr.length() && jsonStr[pos] == ']') break; - pos = ::ParseJSONObject( - jsonStr, pos, variable.GetChild(gd::String::From(index))); - - pos = SkipBlankChar(jsonStr, pos); - if (pos >= jsonStr.length()) { - std::cout << "Parsing error: element of array not properly formed."; - return std::string::npos; - } - index++; - } - - if (jsonStr[pos] != ']') { - std::cout << "Parsing error: array not properly ended"; - return std::string::npos; - } - return pos + 1; - } else if (jsonStr[pos] == '"') // String - { - std::string str; - pos = SkipString(jsonStr, pos, str); - if (pos >= jsonStr.length()) { - std::cout << "Parsing error: Invalid string"; - return std::string::npos; - } - - variable.SetString(gd::String::FromUTF8(str)); - return pos + 1; - } else { - std::string str; - size_t endPos = pos; - const std::string separators = " \n,}"; - while (endPos < jsonStr.length() && - separators.find_first_of(jsonStr[endPos]) == std::string::npos) { - endPos++; - } - - str = jsonStr.substr(pos, endPos - pos); - if (str == "true") - variable.SetValue(1); - else if (str == "false") - variable.SetValue(0); - else - variable.SetValue(gd::String::FromUTF8(str).To()); - return endPos; - } -} -} // namespace - -void GD_API JSONToVariableStructure(const gd::String& jsonStr, - gd::Variable& variable) { - if (jsonStr.empty()) return; - ::ParseJSONObject(jsonStr.c_str(), 0, variable); -} - -void GD_API JSONToObjectVariableStructure(const gd::String& JSON, - RuntimeObject* object, - gd::Variable& variable) { - JSONToVariableStructure(JSON, variable); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.h b/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.h deleted file mode 100644 index 1f14fb7ff..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/NetworkTools.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef NETWORKTOOLS_H -#define NETWORKTOOLS_H - -#include -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/String.h" - -namespace gd { -class Variable; -} - -void GD_API SendHttpRequest(const gd::String& host, - const gd::String& uri, - const gd::String& body, - const gd::String& method, - const gd::String& contentType, - gd::Variable& response); -void GD_API DownloadFile(const gd::String& host, - const gd::String& uri, - const gd::String& outputfilename); - -gd::String GD_API VariableStructureToJSON(const gd::Variable& variable); -gd::String GD_API ObjectVariableStructureToJSON(RuntimeObject* object, - const gd::Variable& variable); -void GD_API JSONToVariableStructure(const gd::String& JSON, - gd::Variable& variable); -void GD_API JSONToObjectVariableStructure(const gd::String& JSON, - RuntimeObject* object, - gd::Variable& variable); - -#endif // NETWORKTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.cpp deleted file mode 100644 index f5e9a7e8a..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "ObjectTools.h" -#include -#include -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/PolygonCollision.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeObjectsListsTools.h" -#include "MathematicalTools.h" - -using namespace std; - -double GD_API PickedObjectsCount( - std::map *> objectsLists) { - std::size_t size = 0; - std::map *>::const_iterator it = - objectsLists.begin(); - for (; it != objectsLists.end(); ++it) { - if (it->second == NULL) continue; - - size += (it->second)->size(); - } - - return size; -} - -bool GD_API HitBoxesCollision( - std::map *> objectsLists1, - std::map *> objectsLists2, - bool conditionInverted, - RuntimeScene & /*scene*/, - bool ignoreTouchingEdges) { - return TwoObjectListsTest( - objectsLists1, - objectsLists2, - conditionInverted, - [ignoreTouchingEdges](RuntimeObject *obj1, RuntimeObject *obj2) { - return obj1->IsCollidingWith(obj2, ignoreTouchingEdges); - }); -} - -bool GD_API ObjectsTurnedToward( - std::map *> objectsLists1, - std::map *> objectsLists2, - float tolerance, - bool conditionInverted) { - return TwoObjectListsTest( - objectsLists1, - objectsLists2, - conditionInverted, - [tolerance](RuntimeObject *obj1, RuntimeObject *obj2) { - double objAngle = - atan2(obj2->GetDrawableY() + obj2->GetCenterY() - - (obj1->GetDrawableY() + obj1->GetCenterY()), - obj2->GetDrawableX() + obj2->GetCenterX() - - (obj1->GetDrawableX() + obj1->GetCenterX())); - objAngle *= 180.0 / 3.14159; - - return abs(GDpriv::MathematicalTools::angleDifference( - obj1->GetAngle(), objAngle)) <= tolerance / 2; - }); -} - -float GD_API DistanceBetweenObjects( - std::map *> objectsLists1, - std::map *> objectsLists2, - float length, - bool conditionInverted) { - length *= length; - return TwoObjectListsTest( - objectsLists1, - objectsLists2, - conditionInverted, - [length](RuntimeObject *obj1, RuntimeObject *obj2) { - float X = obj1->GetDrawableX() + obj1->GetCenterX() - - (obj2->GetDrawableX() + obj2->GetCenterX()); - float Y = obj1->GetDrawableY() + obj1->GetCenterY() - - (obj2->GetDrawableY() + obj2->GetCenterY()); - - return (X * X + Y * Y) <= length; - }); -} - -bool GD_API -MovesToward(std::map *> objectsLists1, - std::map *> objectsLists2, - float tolerance, - bool conditionInverted) { - return TwoObjectListsTest( - objectsLists1, - objectsLists2, - conditionInverted, - [tolerance](RuntimeObject *obj1, RuntimeObject *obj2) { - if (obj1->TotalForceLength() == 0) return false; - - double objAngle = - atan2(obj2->GetDrawableY() + obj2->GetCenterY() - - (obj1->GetDrawableY() + obj1->GetCenterY()), - obj2->GetDrawableX() + obj2->GetCenterX() - - (obj1->GetDrawableX() + obj1->GetCenterX())); - objAngle *= 180.0 / 3.14159; - - return abs(GDpriv::MathematicalTools::angleDifference( - obj1->TotalForceAngle(), objAngle)) <= tolerance / 2; - }); -} - -bool GD_API CursorOnObject( - std::map *> objectsLists, - RuntimeScene &scene, - bool precise, - bool conditionInverted) { - return PickObjectsIf( - objectsLists, conditionInverted, [&scene, precise](RuntimeObject *obj) { - return obj->CursorOnObject(scene, precise); - }); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.h b/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.h deleted file mode 100644 index c2ec4b85b..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ObjectTools.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef OBJECTTOOLS_H -#define OBJECTTOOLS_H - -#include -#include -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; -class RuntimeObject; - -/** - * Only used internally by GD events generated code. - */ -bool GD_API ObjectsTurnedToward( - std::map *> objectsLists1, - std::map *> objectsLists2, - float tolerance, - bool conditionInverted); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API HitBoxesCollision( - std::map *> objectsLists1, - std::map *> objectsLists2, - bool conditionInverted, - RuntimeScene &scene, - bool ignoreTouchingEdges = false); - -/** - * Only used internally by GD events generated code. - */ -double GD_API PickedObjectsCount( - std::map *> objectsLists); - -/** - * Only used internally by GD events generated code. - */ -float GD_API DistanceBetweenObjects( - std::map *> objectsLists1, - std::map *> objectsLists2, - float length, - bool conditionInverted); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API -MovesToward(std::map *> objectsLists1, - std::map *> objectsLists2, - float tolerance, - bool conditionInverted); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API CursorOnObject( - std::map *> objectsLists, - RuntimeScene &scene, - bool precise, - bool conditionInverted); - -#endif // OBJECTTOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.cpp deleted file mode 100644 index 3f2e56e1d..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#if defined(GD_IDE_ONLY) && !defined(EMSCRIPTEN) - -#include "ProfileTools.h" -#include -#include "GDCpp/Events/Builtin/ProfileEvent.h" -#include "GDCpp/IDE/BaseProfiler.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -void GD_API StartProfileTimer(RuntimeScene& scene, std::size_t id) { - scene.GetProfiler()->profileEventsInformation[id].Reset(); -} - -void GD_API EndProfileTimer(RuntimeScene& scene, std::size_t id) { - scene.GetProfiler()->profileEventsInformation[id].Stop(); -} - -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.h b/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.h deleted file mode 100644 index 09bbb8345..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/ProfileTools.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#if defined(GD_IDE_ONLY) - -#ifndef PROFILETOOLS_H -#define PROFILETOOLS_H -#include -#include -class ProfileEvent; -namespace gd { -class Layout; -} -class RuntimeScene; - -void GD_API StartProfileTimer(RuntimeScene& scene, std::size_t id); -void GD_API EndProfileTimer(RuntimeScene& scene, std::size_t id); - -#endif // PROFILETOOLS_H - -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.cpp deleted file mode 100644 index 42aef2433..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "RuntimeSceneCameraTools.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -float GD_API GetCameraX(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - const sf::View& view = - scene.GetRuntimeLayer(layer).GetCamera(camera).GetSFMLView(); - return view.getCenter().x; -} - -float GD_API GetCameraY(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - const sf::View& view = - scene.GetRuntimeLayer(layer).GetCamera(camera).GetSFMLView(); - return view.getCenter().y; -} - -void GD_API SetCameraX(RuntimeScene& scene, - float x, - const gd::String& layer, - std::size_t cameraId) { - if (cameraId >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - RuntimeCamera& camera = scene.GetRuntimeLayer(layer).GetCamera(cameraId); - camera.SetViewCenter(sf::Vector2f(x, camera.GetViewCenter().y)); -} - -void GD_API SetCameraY(RuntimeScene& scene, - float y, - const gd::String& layer, - std::size_t cameraId) { - if (cameraId >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - RuntimeCamera& camera = scene.GetRuntimeLayer(layer).GetCamera(cameraId); - camera.SetViewCenter(sf::Vector2f(camera.GetViewCenter().x, y)); -} - -double GD_API GetCameraAngle(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - return scene.GetRuntimeLayer(layer).GetCamera(camera).GetRotation(); -} - -void GD_API SetCameraAngle(RuntimeScene& scene, - float newValue, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - return scene.GetRuntimeLayer(layer).GetCamera(camera).SetRotation(newValue); -} - -void GD_API SetCameraZoom(RuntimeScene& scene, - float newZoom, - const gd::String& layer, - std::size_t cameraNb) { - if (cameraNb >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - scene.GetRuntimeLayer(layer).GetCamera(cameraNb).SetZoom(newZoom); -} - -double GD_API GetCameraWidth(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - return scene.GetRuntimeLayer(layer).GetCamera(camera).GetWidth(); -} - -double GD_API GetCameraHeight(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - return scene.GetRuntimeLayer(layer).GetCamera(camera).GetHeight(); -} - -double GD_API GetCameraViewportLeft(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - return scene.GetRuntimeLayer(layer) - .GetCamera(camera) - .GetSFMLView() - .getViewport() - .left; -} - -double GD_API GetCameraViewportTop(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - return scene.GetRuntimeLayer(layer) - .GetCamera(camera) - .GetSFMLView() - .getViewport() - .top; -} - -double GD_API GetCameraViewportRight(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - const sf::FloatRect& sfmlViewport = scene.GetRuntimeLayer(layer) - .GetCamera(camera) - .GetSFMLView() - .getViewport(); - - return sfmlViewport.left + sfmlViewport.width; -} - -double GD_API GetCameraViewportBottom(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return 0.f; - - const sf::FloatRect& sfmlViewport = scene.GetRuntimeLayer(layer) - .GetCamera(camera) - .GetSFMLView() - .getViewport(); - - return sfmlViewport.top + sfmlViewport.height; -} - -/** - * Change the size of a camera and reset the zoom factor. - */ -void GD_API SetCameraSize(RuntimeScene& scene, - const gd::String& layer, - std::size_t cameraNb, - float width, - float height) { - if (cameraNb >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - scene.GetRuntimeLayer(layer).GetCamera(cameraNb).SetZoom(1); - scene.GetRuntimeLayer(layer).GetCamera(cameraNb).SetSize(width, height); -} - -void GD_API CenterCameraOnObjectWithLimits(RuntimeScene& scene, - RuntimeObject* object, - float left, - float top, - float right, - float bottom, - bool anticipateObjectMove, - const gd::String& layer, - std::size_t camera) { - if (object == NULL) return; - - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - float xOffset = 0; - float yOffset = 0; - double elapsedTime = - static_cast(object->GetElapsedTime(scene)) / 1000000.0; - if (anticipateObjectMove) { - xOffset = object->TotalForceX() * elapsedTime; - yOffset = object->TotalForceY() * elapsedTime; - } - - RuntimeCamera& cam = scene.GetRuntimeLayer(layer).GetCamera(camera); - - double newX = - std::min(std::max(object->GetDrawableX() + object->GetCenterX() + xOffset, - left + cam.GetWidth() / 2), - right - cam.GetWidth() / 2); - double newY = - std::min(std::max(object->GetDrawableY() + object->GetCenterY() + yOffset, - top + cam.GetHeight() / 2), - bottom - cam.GetHeight() / 2); - - cam.SetViewCenter(sf::Vector2f(newX, newY)); - - return; -} - -void GD_API CenterCameraOnObject(RuntimeScene& scene, - RuntimeObject* object, - bool anticipateObjectMove, - const gd::String& layer, - std::size_t camera) { - if (object == NULL) return; - - if (camera >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - float xOffset = 0; - float yOffset = 0; - double elapsedTime = - static_cast(object->GetElapsedTime(scene)) / 1000000.0; - if (anticipateObjectMove) { - xOffset = object->TotalForceX() * elapsedTime; - yOffset = object->TotalForceY() * elapsedTime; - } - - scene.GetRuntimeLayer(layer).GetCamera(camera).SetViewCenter( - sf::Vector2f(object->GetDrawableX() + object->GetCenterX() + xOffset, - object->GetDrawableY() + object->GetCenterY() + yOffset)); - - return; -} - -/** - * Delete a camera of a layer - */ -void GD_API ActDeleteCamera(RuntimeScene& scene, - const gd::String& layerName, - std::size_t camera) { - if (camera >= scene.GetRuntimeLayer(layerName).GetCameraCount()) return; - - scene.GetRuntimeLayer(layerName).DeleteCamera(camera); -} - -/** - * Add a camera to a layer - */ -void GD_API AddCamera(RuntimeScene& scene, - const gd::String& layerName, - float width, - float height, - float viewportLeft, - float viewportTop, - float viewportRight, - float viewportBottom) { - // Create the new view - const sf::RenderWindow* window = scene.renderWindow; - sf::View view = window ? window->getDefaultView() : sf::View(); - - // Setup the viewport and the view - if (viewportBottom != 0 && viewportLeft != 0 && viewportRight != 0 && - viewportTop != 0) { - sf::FloatRect newViewport(viewportLeft, - viewportTop, - viewportRight - viewportLeft, - viewportBottom - viewportTop); - view.setViewport(newViewport); - } - if (width != 0 || height != 0) { - view.setSize(sf::Vector2f(width, height)); - } - - // Add the runtime camera to the layer - scene.GetRuntimeLayer(layerName).AddCamera(RuntimeCamera(view)); - return; -} - -void GD_API SetCameraViewport(RuntimeScene& scene, - const gd::String& layer, - std::size_t cameraNb, - float viewportLeft, - float viewportTop, - float viewportRight, - float viewportBottom) { - if (cameraNb >= scene.GetRuntimeLayer(layer).GetCameraCount()) return; - - RuntimeCamera& camera = scene.GetRuntimeLayer(layer).GetCamera(cameraNb); - camera.SetViewport(viewportLeft, viewportTop, viewportRight, viewportBottom); -} - -double GD_API GetLayerTimeScale(RuntimeScene& scene, const gd::String& layer) { - return scene.GetRuntimeLayer(layer).GetTimeScale(); -} - -void GD_API SetLayerTimeScale(RuntimeScene& scene, - const gd::String& layer, - double timeScale) { - scene.GetRuntimeLayer(layer).SetTimeScale(timeScale); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h b/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h deleted file mode 100644 index 9dab4ba95..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneCameraTools.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef RUNTIMESCENECAMERATOOLS_H -#define RUNTIMESCENECAMERATOOLS_H - -#include -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeObject; -class RuntimeScene; - -float GD_API GetCameraX(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -float GD_API GetCameraY(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -void GD_API SetCameraX(RuntimeScene& scene, - float x, - const gd::String& layer, - std::size_t camera); -void GD_API SetCameraY(RuntimeScene& scene, - float y, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraAngle(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -void GD_API SetCameraAngle(RuntimeScene& scene, - float newValue, - const gd::String& layer, - std::size_t camera); -void GD_API SetCameraZoom(RuntimeScene& scene, - float newZoom, - const gd::String& layer, - std::size_t cameraNb); -double GD_API GetCameraWidth(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraHeight(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraViewportLeft(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraViewportTop(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraViewportRight(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -double GD_API GetCameraViewportBottom(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -void GD_API SetCameraSize(RuntimeScene& scene, - const gd::String& layer, - std::size_t cameraNb, - float width, - float height); -void GD_API CenterCameraOnObjectWithLimits(RuntimeScene& scene, - RuntimeObject* object, - float left, - float top, - float right, - float bottom, - bool anticipateObjectMove, - const gd::String& layer, - std::size_t camera); -void GD_API CenterCameraOnObject(RuntimeScene& scene, - RuntimeObject* object, - bool anticipateObjectMove, - const gd::String& layer, - std::size_t camera); -void GD_API ActDeleteCamera(RuntimeScene& scene, - const gd::String& layer, - std::size_t camera); -void GD_API AddCamera(RuntimeScene& scene, - const gd::String& layer, - float width, - float height, - float viewportLeft, - float viewportTop, - float viewportRight, - float viewportBottom); -void GD_API SetCameraViewport(RuntimeScene& scene, - const gd::String& layer, - std::size_t cameraNb, - float viewportLeft, - float viewportTop, - float viewportRight, - float viewportBottom); -double GD_API GetLayerTimeScale(RuntimeScene& scene, const gd::String& layer); -void GD_API SetLayerTimeScale(RuntimeScene& scene, - const gd::String& layer, - double timeScale); - -#endif // RUNTIMESCENECAMERATOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.cpp deleted file mode 100644 index 72cada61f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.cpp +++ /dev/null @@ -1,458 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include -#include - -#include "GDCore/Tools/Log.h" -#include "GDCpp/Extensions/Builtin/CommonInstructionsTools.h" -#include "GDCpp/Extensions/Builtin/RuntimeSceneTools.h" -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/PolygonCollision.h" -#include "GDCpp/Runtime/Project/Variable.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeObjectHelpers.h" -#include "GDCpp/Runtime/RuntimeObjectsListsTools.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/profile.h" - -gd::String GD_API GetSceneName(RuntimeScene &scene) { return scene.GetName(); } - -bool GD_API LayerVisible(RuntimeScene &scene, const gd::String &layer) { - return scene.GetRuntimeLayer(layer).GetVisibility(); -} - -void GD_API ShowLayer(RuntimeScene &scene, const gd::String &layer) { - scene.GetRuntimeLayer(layer).SetVisibility(true); -} - -void GD_API HideLayer(RuntimeScene &scene, const gd::String &layer) { - scene.GetRuntimeLayer(layer).SetVisibility(false); -} - -void GD_API ChangeSceneBackground(RuntimeScene &scene, gd::String newColor) { - std::vector colors = newColor.Split(U';'); - if (colors.size() > 2) - scene.SetBackgroundColor( - colors[0].To(), colors[1].To(), colors[2].To()); - - return; -} - -void GD_API StopGame(RuntimeScene &scene) { - scene.RequestChange(RuntimeScene::SceneChange::STOP_GAME); -} - -void GD_API ReplaceScene(RuntimeScene &scene, - gd::String newSceneName, - bool clearOthers) { - if (!scene.game->HasLayoutNamed(newSceneName)) return; - scene.RequestChange(clearOthers ? RuntimeScene::SceneChange::CLEAR_SCENES - : RuntimeScene::SceneChange::REPLACE_SCENE, - newSceneName); -} - -void GD_API PushScene(RuntimeScene &scene, gd::String newSceneName) { - if (!scene.game->HasLayoutNamed(newSceneName)) return; - scene.RequestChange(RuntimeScene::SceneChange::PUSH_SCENE, newSceneName); -} - -void GD_API PopScene(RuntimeScene &scene) { - scene.RequestChange(RuntimeScene::SceneChange::POP_SCENE); -} - -bool GD_API SceneJustBegins(RuntimeScene &scene) { - return scene.GetTimeManager().IsFirstLoop(); -} - -void GD_API MoveObjects(RuntimeScene &scene) { - RuntimeObjNonOwningPtrList allObjects = - scene.objectsInstances.GetAllObjects(); - - for (std::size_t id = 0; id < allObjects.size(); ++id) { - double elapsedTime = - static_cast(allObjects[id]->GetElapsedTime(scene)) / 1000000.0; - allObjects[id]->SetX(allObjects[id]->GetX() + - allObjects[id]->TotalForceX() * elapsedTime); - allObjects[id]->SetY(allObjects[id]->GetY() + - allObjects[id]->TotalForceY() * elapsedTime); - - allObjects[id]->UpdateForce(elapsedTime); - } - - return; -} - -namespace { - -void DoCreateObjectOnScene( - RuntimeScene &scene, - gd::String objectName, - std::map *> pickedObjectLists, - float positionX, - float positionY, - const gd::String &layer) { - if (pickedObjectLists.empty()) return; - - // Find the object to be created - std::vector::const_iterator sceneObject = - std::find_if(scene.GetObjects().begin(), - scene.GetObjects().end(), - std::bind2nd(ObjectHasName(), objectName)); - std::vector::const_iterator globalObject = - std::find_if(scene.game->GetObjects().begin(), - scene.game->GetObjects().end(), - std::bind2nd(ObjectHasName(), objectName)); - - RuntimeObjSPtr newObject = std::unique_ptr(); - - if (sceneObject != - scene.GetObjects().end()) // We check first scene's objects' list. - newObject = CppPlatform::Get().CreateRuntimeObject(scene, **sceneObject); - else if (globalObject != - scene.game->GetObjects().end()) // Then the global object list - newObject = CppPlatform::Get().CreateRuntimeObject(scene, **globalObject); - - if (newObject == std::unique_ptr()) - return; // Unable to create the object - - // Set up the object - newObject->SetX(positionX); - newObject->SetY(positionY); - newObject->SetLayer(layer); - - // Add object to scene and let it be concerned by futures actions - pickedObjectLists[objectName]->push_back( - scene.objectsInstances.AddObject(std::move(newObject))); -} - -} // namespace - -void GD_API CreateObjectOnScene( - RuntimeScene &scene, - std::map *> pickedObjectLists, - float positionX, - float positionY, - const gd::String &layer) { - if (pickedObjectLists.empty()) return; - - ::DoCreateObjectOnScene(scene, - pickedObjectLists.begin()->first, - pickedObjectLists, - positionX, - positionY, - layer); -} - -void GD_API CreateObjectFromGroupOnScene( - RuntimeScene &scene, - std::map *> pickedObjectLists, - const gd::String &objectWanted, - float positionX, - float positionY, - const gd::String &layer) { - if (pickedObjectLists[objectWanted] == nullptr) - return; // Bail out if the object is not present in the specified group - - ::DoCreateObjectOnScene( - scene, objectWanted, pickedObjectLists, positionX, positionY, layer); -} - -bool GD_API PickAllObjects( - RuntimeScene &scene, - std::map *> pickedObjectLists) { - for (auto it = pickedObjectLists.begin(); it != pickedObjectLists.end(); - ++it) { - if (it->second != nullptr) { - std::vector objectsOnScene = - scene.objectsInstances.GetObjectsRawPointers(it->first); - - for (std::size_t j = 0; j < objectsOnScene.size(); ++j) { - if (find(it->second->begin(), it->second->end(), objectsOnScene[j]) == - it->second->end()) - it->second->push_back(objectsOnScene[j]); - } - } - } - - return true; -} - -bool GD_API PickRandomObject( - RuntimeScene &, - std::map *> pickedObjectLists) { - // Create a list with all objects - std::vector allObjects; - for (auto it = pickedObjectLists.begin(); it != pickedObjectLists.end(); - ++it) { - if (it->second != nullptr) - std::copy(it->second->begin(), - it->second->end(), - std::back_inserter(allObjects)); - } - - if (allObjects.empty()) return false; - - std::size_t id = GDpriv::CommonInstructions::Random(allObjects.size() - 1); - PickOnly(pickedObjectLists, allObjects[id]); - return true; -} - -bool GD_API PickNearestObject( - std::map *> pickedObjectLists, - double x, - double y, - bool inverted) { - double best = 0; - bool first = true; - RuntimeObject *bestObject = NULL; - for (auto it = pickedObjectLists.begin(); it != pickedObjectLists.end(); - ++it) { - if (it->second == NULL) continue; - auto list = *it->second; - - for (std::size_t i = 0; i < list.size(); ++i) { - double value = list[i]->GetSqDistanceTo(x, y); - if (first || ((value < best) ^ inverted)) { - bestObject = list[i]; - best = value; - } - - first = false; - } - } - - if (!bestObject) return false; - - PickOnly(pickedObjectLists, bestObject); - return true; -} - -bool GD_API RaycastObject( - std::map *> pickedObjectLists, - float x, - float y, - float angle, - float dist, - gd::Variable &varX, - gd::Variable &varY, - bool inverted) { - return RaycastObjectToPosition(pickedObjectLists, - x, - y, - x + dist * cos(angle * 3.14159 / 180.0), - y + dist * sin(angle * 3.14159 / 180.0), - varX, - varY, - inverted); -} - -bool GD_API RaycastObjectToPosition( - std::map *> pickedObjectLists, - float x, - float y, - float endX, - float endY, - gd::Variable &varX, - gd::Variable &varY, - bool inverted) { - RuntimeObject *matchObject = NULL; - float testSqDist = - inverted ? 0 : (endX - x) * (endX - x) + (endY - y) * (endY - y); - float resultX = 0.0f; - float resultY = 0.0f; - for (auto it = pickedObjectLists.begin(); it != pickedObjectLists.end(); - ++it) { - if (it->second == NULL) continue; - auto list = *it->second; - - for (std::size_t i = 0; i < list.size(); ++i) { - RaycastResult result = list[i]->RaycastTest(x, y, endX, endY, !inverted); - - if (result.collision) { - if (!inverted && (result.closeSqDist <= testSqDist)) { - testSqDist = result.closeSqDist; - matchObject = list[i]; - resultX = result.closePoint.x; - resultY = result.closePoint.y; - } else if (inverted && (result.farSqDist >= testSqDist)) { - testSqDist = result.farSqDist; - matchObject = list[i]; - resultX = result.farPoint.x; - resultY = result.farPoint.y; - } - } - } - } - - if (!matchObject) return false; - - PickOnly(pickedObjectLists, matchObject); - varX.SetValue(resultX); - varY.SetValue(resultY); - return true; -} - -bool GD_API SceneVariableExists(RuntimeScene &scene, - const gd::String &variable) { - return scene.GetVariables().Has(variable); -} - -bool GD_API GlobalVariableExists(RuntimeScene &scene, - const gd::String &variable) { - return scene.game->GetVariables().Has(variable); -} - -gd::Variable &GD_API ReturnVariable(gd::Variable &variable) { - return variable; -}; - -bool GD_API VariableChildExists(const gd::Variable &variable, - const gd::String &childName) { - return variable.HasChild(childName); -} - -void GD_API VariableRemoveChild(gd::Variable &variable, - const gd::String &childName) { - variable.RemoveChild(childName); -} - -void GD_API VariableClearChildren(gd::Variable &variable) { - variable.ClearChildren(); -} - -unsigned int GD_API GetVariableChildCount(gd::Variable &variable) { - if (gd::Variable::IsPrimitive(variable.GetType())) return 0; - return variable.GetChildrenCount(); -} - -double GD_API GetVariableValue(const gd::Variable &variable) { - return variable.GetValue(); -}; - -const gd::String &GD_API GetVariableString(const gd::Variable &variable) { - return variable.GetString(); -}; - -void GD_API SetWindowIcon(RuntimeScene &scene, const gd::String &imageName) { - // Retrieve the image - std::shared_ptr image = - scene.GetImageManager()->GetSFMLTexture(imageName); - if (image == std::shared_ptr()) return; - - scene.renderWindow->setIcon(image->image.getSize().x, - image->image.getSize().y, - image->image.getPixelsPtr()); -} - -void GD_API SetWindowTitle(RuntimeScene &scene, const gd::String &newName) { - scene.SetWindowDefaultTitle(newName); - if (scene.renderWindow != NULL) - scene.renderWindow->setTitle(scene.GetWindowDefaultTitle()); -} - -const gd::String &GD_API GetWindowTitle(RuntimeScene &scene) { - return scene.GetWindowDefaultTitle(); -} - -void GD_API SetWindowSize(RuntimeScene &scene, - int windowWidth, - int windowHeight, - bool useTheNewSizeForCameraDefaultSize) { -#if !defined(GD_IDE_ONLY) - if (useTheNewSizeForCameraDefaultSize) // Change future cameras default size - // if wanted. - { - scene.game->SetGameResolutionSize(windowWidth, windowHeight); - } - - // Avoid recreating every tick a new window if the size has not changed! - if (windowWidth == scene.renderWindow->getSize().x && - windowHeight == scene.renderWindow->getSize().y) - return; - -#if defined(ANDROID) - return; // The size of the window is always the same. -#endif - - scene.renderWindow->create( - sf::VideoMode(windowWidth, windowHeight, 32), - scene.GetWindowDefaultTitle(), - sf::Style::Close | - (scene.RenderWindowIsFullScreen() ? sf::Style::Fullscreen : 0)); - scene.ChangeRenderWindow(scene.renderWindow); -#endif -} - -void GD_API SetFullScreen(RuntimeScene &scene, bool fullscreen, bool) { -#if !defined(GD_IDE_ONLY) - if (fullscreen && !scene.RenderWindowIsFullScreen()) { - scene.SetRenderWindowIsFullScreen(); - scene.renderWindow->create( - sf::VideoMode(scene.game->GetGameResolutionWidth(), - scene.game->GetGameResolutionHeight(), - 32), - scene.GetWindowDefaultTitle(), - sf::Style::Close | sf::Style::Fullscreen); - scene.ChangeRenderWindow(scene.renderWindow); - } else if (!fullscreen && scene.RenderWindowIsFullScreen()) { - scene.SetRenderWindowIsFullScreen(false); - scene.renderWindow->create( - sf::VideoMode(scene.game->GetGameResolutionWidth(), - scene.game->GetGameResolutionHeight(), - 32), - scene.GetWindowDefaultTitle(), - sf::Style::Close); - scene.ChangeRenderWindow(scene.renderWindow); - } -#endif -} -unsigned int GD_API GetSceneWindowWidth(RuntimeScene &scene) { -#if defined(ANDROID) - return scene.game->GetGameResolutionWidth(); -#else - if (scene.renderWindow != NULL) return scene.renderWindow->getSize().x; - - return 0; -#endif -} - -unsigned int GD_API GetSceneWindowHeight(RuntimeScene &scene) { -#if defined(ANDROID) - return scene.game->GetGameResolutionHeight(); -#else - if (scene.renderWindow != NULL) return scene.renderWindow->getSize().y; - - return 0; -#endif -} - -unsigned int GD_API GetScreenWidth() { - sf::VideoMode videoMode = sf::VideoMode::getDesktopMode(); - - return videoMode.width; -} - -unsigned int GD_API GetScreenHeight() { - sf::VideoMode videoMode = sf::VideoMode::getDesktopMode(); - - return videoMode.height; -} - -unsigned int GD_API GetScreenColorDepth() { - sf::VideoMode videoMode = sf::VideoMode::getDesktopMode(); - - return videoMode.bitsPerPixel; -} - -void GD_API DisableInputWhenFocusIsLost(RuntimeScene &scene, bool disable) { - scene.DisableInputWhenFocusIsLost(disable); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.h b/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.h deleted file mode 100644 index f669e1bbd..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/RuntimeSceneTools.h +++ /dev/null @@ -1,252 +0,0 @@ -#ifndef RUNTIMESCENETOOLS_H -#define RUNTIMESCENETOOLS_H - -#include -#include -#include -class RuntimeScene; -namespace gd { -class Variable; -} -class RuntimeObject; - -/** - * Only used internally by GD events generated code. - */ -gd::String GD_API GetSceneName(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API LayerVisible(RuntimeScene &scene, const gd::String &layer); - -/** - * Only used internally by GD events generated code. - */ -void GD_API ShowLayer(RuntimeScene &scene, const gd::String &layer); - -/** - * Only used internally by GD events generated code. - */ -void GD_API HideLayer(RuntimeScene &scene, const gd::String &layer); - -/** - * Only used internally by GD events generated code. - */ -void GD_API StopGame(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -void GD_API ReplaceScene(RuntimeScene &scene, - gd::String newSceneName, - bool clearOthers); - -/** - * Only used internally by GD events generated code. - */ -void GD_API PushScene(RuntimeScene &scene, gd::String newSceneName); - -/** - * Only used internally by GD events generated code. - */ -void GD_API PopScene(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API SceneJustBegins(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -void GD_API MoveObjects(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -void GD_API DisableInputWhenFocusIsLost(RuntimeScene &scene, bool disable); - -/** - * Only used internally by GD events generated code. - */ -void GD_API CreateObjectOnScene( - RuntimeScene &scene, - std::map *> pickedObjectLists, - float positionX, - float positionY, - const gd::String &layer); - -/** - * Only used internally by GD events generated code. - */ -void GD_API CreateObjectFromGroupOnScene( - RuntimeScene &scene, - std::map *> pickedObjectLists, - const gd::String &objectWanted, - float positionX, - float positionY, - const gd::String &layer); - -/** - * Only used internally by GD events generated code. - * - * \return true ( always ) - */ -bool GD_API PickAllObjects( - RuntimeScene &scene, - std::map *> pickedObjectLists); - -/** - * Only used internally by GD events generated code. - * - * \return true if an object was picked, false otherwise - */ -bool GD_API PickRandomObject( - RuntimeScene &scene, - std::map *> pickedObjectLists); - -/** - * Only used internally by GD events generated code. - * - * \return true if an object was picked, false otherwise - */ -bool GD_API PickNearestObject( - std::map *> pickedObjectLists, - double x, - double y, - bool inverted); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API RaycastObject( - std::map *> pickedObjectLists, - float x, - float y, - float angle, - float dist, - gd::Variable &varX, - gd::Variable &varY, - bool inverted); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API RaycastObjectToPosition( - std::map *> pickedObjectLists, - float x, - float y, - float targetX, - float targetY, - gd::Variable &varX, - gd::Variable &varY, - bool inverted); - -/** - * Only used internally by GD events generated code. - */ -void GD_API ChangeSceneBackground(RuntimeScene &scene, gd::String newColor); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API SceneVariableExists(RuntimeScene &scene, - const gd::Variable &variable); -/** - * Only used internally by GD events generated code. - */ -bool GD_API GlobalVariableExists(RuntimeScene &scene, - const gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -bool GD_API VariableChildExists(const gd::Variable &variable, - const gd::String &childName); - -/** - * Only used internally by GD events generated code. - */ -void GD_API VariableRemoveChild(gd::Variable &variable, - const gd::String &childName); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetVariableChildCount(gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -void GD_API VariableClearChildren(gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -gd::Variable &GD_API ReturnVariable(gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -double GD_API GetVariableValue(const gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -const gd::String &GD_API GetVariableString(const gd::Variable &variable); - -/** - * Only used internally by GD events generated code. - */ -void GD_API SetFullScreen(RuntimeScene &scene, bool fullscreen, bool); - -/** - * Only used internally by GD events generated code. - */ -void GD_API SetWindowSize(RuntimeScene &scene, - int width, - int height, - bool useTheNewSizeForCameraDefaultSize); - -/** - * Only used internally by GD events generated code. - */ -void GD_API SetWindowIcon(RuntimeScene &scene, const gd::String &imageName); - -/** - * Only used internally by GD events generated code. - */ -void GD_API SetWindowTitle(RuntimeScene &scene, const gd::String &newName); - -/** - * Only used internally by GD events generated code. - */ -const gd::String &GD_API GetWindowTitle(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetSceneWindowWidth(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetSceneWindowHeight(RuntimeScene &scene); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetScreenWidth(); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetScreenHeight(); - -/** - * Only used internally by GD events generated code. - */ -unsigned int GD_API GetScreenColorDepth(); - -#endif // RUNTIMESCENETOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.cpp deleted file mode 100644 index b1e74598a..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/SceneExtension.h" -#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h" -#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h" -#include "GDCore/Events/CodeGeneration/ExpressionCodeGenerator.h" -#include "GDCore/Events/Tools/EventsCodeNameMangler.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/Project/Project.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/SceneExtension.cpp" -#endif - -SceneExtension::SceneExtension() { - gd::BuiltinExtensionsImplementer::ImplementsSceneExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllExpressions()["Random"] - .SetFunctionName("GDpriv::CommonInstructions::Random") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["RandomInRange"] - .SetFunctionName("GDpriv::CommonInstructions::RandomInRange") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["RandomFloat"] - .SetFunctionName("GDpriv::CommonInstructions::RandomFloat") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["RandomFloatInRange"] - .SetFunctionName("GDpriv::CommonInstructions::RandomFloatInRange") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllExpressions()["RandomWithStep"] - .SetFunctionName("GDpriv::CommonInstructions::RandomWithStep") - .SetIncludeFile("GDCpp/Extensions/Builtin/CommonInstructionsTools.h"); - GetAllStrExpressions()["CurrentSceneName"] - .SetFunctionName("GetSceneName") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["DepartScene"] - .SetFunctionName("SceneJustBegins") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["Scene"] - .SetFunctionName("ReplaceScene") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["PushScene"] - .SetFunctionName("PushScene") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["PopScene"] - .SetFunctionName("PopScene") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["Quit"] - .SetFunctionName("StopGame") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["SceneBackground"] - .SetFunctionName("ChangeSceneBackground") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["DisableInputWhenFocusIsLost"] - .SetFunctionName("DisableInputWhenFocusIsLost") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["Egal"].codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context) { - gd::String value1Code = - gd::ExpressionCodeGenerator::GenerateExpressionCode( - codeGenerator, - context, - "number", - instruction.GetParameters()[0].GetPlainString()); - - gd::String value2Code = - gd::ExpressionCodeGenerator::GenerateExpressionCode( - codeGenerator, - context, - "number", - instruction.GetParameters()[2].GetPlainString()); - - if (instruction.GetParameters()[1].GetPlainString() == "=" || - instruction.GetParameters()[1].GetPlainString().empty()) - return "conditionTrue = (" + value1Code + " == " + value2Code + - ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == ">") - return "conditionTrue = (" + value1Code + " > " + value2Code + ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == "<") - return "conditionTrue = (" + value1Code + " < " + value2Code + ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == "<=") - return "conditionTrue = (" + value1Code + " <= " + value2Code + - ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == ">=") - return "conditionTrue = (" + value1Code + " >= " + value2Code + - ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == "!=") - return "conditionTrue = (" + value1Code + " != " + value2Code + - ");\n"; - - return gd::String(""); - }); - - GetAllConditions()["StrEqual"].codeExtraInformation.SetCustomCodeGenerator( - [](gd::Instruction& instruction, - gd::EventsCodeGenerator& codeGenerator, - gd::EventsCodeGenerationContext& context) { - gd::String value1Code = - gd::ExpressionCodeGenerator::GenerateExpressionCode( - codeGenerator, - context, - "string", - instruction.GetParameters()[0].GetPlainString()); - - gd::String value2Code = - gd::ExpressionCodeGenerator::GenerateExpressionCode( - codeGenerator, - context, - "string", - instruction.GetParameters()[2].GetPlainString()); - - if (instruction.GetParameters()[1].GetPlainString() == "=") - return "conditionTrue = (" + value1Code + " == " + value2Code + - ");\n"; - else if (instruction.GetParameters()[1].GetPlainString() == "!=") - return "conditionTrue = (" + value1Code + " != " + value2Code + - ");\n"; - - return gd::String(""); - }); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.h b/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.h deleted file mode 100644 index ff0315331..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SceneExtension.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef SCENEEXTENSION_H -#define SCENEEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Standard extension providing features related to Scene. - * - * \ingroup BuiltinExtensions - */ -class SceneExtension : public ExtensionBase { - public: - SceneExtension(); - virtual ~SceneExtension(){}; - - protected: - private: -}; - -#endif // SCENEEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.cpp deleted file mode 100644 index bdc98fe2a..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/SpriteExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h" -#include "GDCpp/Runtime/RuntimeSpriteObject.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp" -#endif - -SpriteExtension::SpriteExtension() { - gd::BuiltinExtensionsImplementer::ImplementsSpriteExtension(*this); - - gd::ObjectMetadata& obj = GetObjectMetadata("Sprite"); - AddRuntimeObject( - obj, "RuntimeSpriteObject"); - -#if defined(GD_IDE_ONLY) - obj.SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - auto& objectActions = GetAllActionsForObject("Sprite"); - auto& objectConditions = GetAllConditionsForObject("Sprite"); - auto& objectExpressions = GetAllExpressionsForObject("Sprite"); - auto& objectStrExpressions = GetAllStrExpressionsForObject("Sprite"); - - objectActions["Opacity"] - .SetFunctionName("SetOpacity") - .SetGetter("GetOpacity") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeAnimation"] - .SetFunctionName("SetCurrentAnimation") - .SetGetter("GetCurrentAnimation") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["SetAnimationName"] - .SetFunctionName("SetCurrentAnimation") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeDirection"] - .SetFunctionName("SetDirection") - .SetGetter("GetCurrentDirectionOrAngle") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeSprite"] - .SetFunctionName("SetSprite") - .SetGetter("GetSpriteNb") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["PauseAnimation"] - .SetFunctionName("StopAnimation") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["PlayAnimation"] - .SetFunctionName("PlayAnimation") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeAnimationSpeedScale"] - .SetFunctionName("SetAnimationSpeedScale") - .SetGetter("GetAnimationSpeedScale") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["TourneVersPos"] - .SetFunctionName("RotateTowardPosition") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeScale"] - .SetFunctionName("SetScale") - .SetGetter("GetScale") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeScaleWidth"] - .SetFunctionName("SetScaleX") - .SetGetter("GetScaleX") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeScaleHeight"] - .SetFunctionName("SetScaleY") - .SetGetter("GetScaleY") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - objectConditions["Animation"] - .SetFunctionName("GetCurrentAnimation") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["AnimationName"] - .SetFunctionName("IsCurrentAnimationName") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["Direction"] - .SetFunctionName("GetCurrentDirectionOrAngle") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["Sprite"] - .SetFunctionName("GetSpriteNb") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["AnimStopped"] - .SetFunctionName("IsAnimationStopped") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["AnimationEnded"] - .SetFunctionName("AnimationEnded") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["ScaleWidth"] - .SetFunctionName("GetScaleX") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["ScaleHeight"] - .SetFunctionName("GetScaleY") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["Opacity"] - .SetFunctionName("GetOpacity") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["BlendMode"] - .SetFunctionName("GetBlendMode") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - objectActions["CopyImageOnImageOfSprite"] - .SetFunctionName("CopyImageOnImageOfCurrentSprite") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["CreateMaskFromColorOnActualImage"] - .SetFunctionName("MakeColorTransparent") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeColor"] - .SetFunctionName("SetColor") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["ChangeBlendMode"] - .SetFunctionName("SetBlendMode") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - objectActions["FlipX"].SetFunctionName("FlipX").SetIncludeFile( - "GDCpp/Runtime/RuntimeSpriteObject.h"); - objectActions["FlipY"].SetFunctionName("FlipY").SetIncludeFile( - "GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["FlippedX"] - .SetFunctionName("IsFlippedX") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectConditions["FlippedY"] - .SetFunctionName("IsFlippedY") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - objectActions["TourneVers"] - .SetFunctionName("TurnTowardObject") - .SetIncludeFile("GDCpp/Extensions/Builtin/SpriteTools.h"); - - objectExpressions["X"] - .SetFunctionName("GetPointX") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Y"] - .SetFunctionName("GetPointY") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["PointX"] - .SetFunctionName("GetPointX") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["PointY"] - .SetFunctionName("GetPointY") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Direc"] - .SetFunctionName("GetCurrentDirectionOrAngle") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Direction"] - .SetFunctionName("GetCurrentDirectionOrAngle") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Anim"] - .SetFunctionName("GetCurrentAnimation") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Animation"] - .SetFunctionName("GetCurrentAnimation") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectStrExpressions["AnimationName"] - .SetFunctionName("GetCurrentAnimationName") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Sprite"] - .SetFunctionName("GetSpriteNb") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["AnimationSpeedScale"] - .SetFunctionName("GetAnimationSpeedScale") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["ScaleX"] - .SetFunctionName("GetScaleX") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["ScaleY"] - .SetFunctionName("GetScaleY") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - objectExpressions["Opacity"] - .SetFunctionName("GetOpacity") - .SetIncludeFile("GDCpp/Runtime/RuntimeSpriteObject.h"); - - GetAllConditions()["Collision"] - .SetFunctionName("SpriteCollision") - .SetIncludeFile("GDCpp/Extensions/Builtin/SpriteTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.h b/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.h deleted file mode 100644 index a33c5e9d9..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SpriteExtension.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef SPRITEEXTENSION_H -#define SPRITEEXTENSION_H -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing SpriteObject objects. - * - * - * \ingroup BuiltinExtensions - * \ingroup SpriteObjectExtension - */ -class SpriteExtension : public ExtensionBase { - public: - SpriteExtension(); - virtual ~SpriteExtension(){}; -}; - -#endif // SPRITEEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.cpp deleted file mode 100644 index 64d2bc183..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "SpriteTools.h" -#include -#include -#include "GDCpp/Extensions/Builtin/ObjectTools.h" -#include "GDCpp/Runtime/Collisions.h" -#include "GDCpp/Runtime/RuntimeObjectsListsTools.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/RuntimeSpriteObject.h" -#include "GDCpp/Runtime/profile.h" - -using namespace std; - -/** - * Test a collision between two sprites objects - */ -bool GD_API SpriteCollision( - std::map *> objectsLists1, - std::map *> objectsLists2, - bool conditionInverted) { - return TwoObjectListsTest(objectsLists1, - objectsLists2, - conditionInverted, - [](RuntimeObject *obj1, RuntimeObject *obj2) { - return CheckCollision( - static_cast(obj1), - static_cast(obj2)); - }); -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.h b/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.h deleted file mode 100644 index 4a6b44fd0..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/SpriteTools.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef SPRITETOOLS_H -#define SPRITETOOLS_H - -#include -#include -#include - -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; -class RuntimeObject; - -bool GD_API SpriteCollision( - std::map *> objectsLists1, - std::map *> objectsLists2, - bool conditionInverted); - -#endif // SPRITETOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.cpp deleted file mode 100644 index c5f88270f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/StringInstructionsExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/StringInstructionsExtension.cpp" -#endif - -StringInstructionsExtension::StringInstructionsExtension() { - gd::BuiltinExtensionsImplementer::ImplementsStringInstructionsExtension( - *this); - -#if defined(GD_IDE_ONLY) - GetAllStrExpressions()["NewLine"] - .SetFunctionName("GDpriv::StringTools::NewLine") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["FromCodePoint"] - .SetFunctionName("GDpriv::StringTools::FromCodePoint") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["ToUpperCase"] - .SetFunctionName("GDpriv::StringTools::ToUpperCase") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["ToLowerCase"] - .SetFunctionName("GDpriv::StringTools::ToLowerCase") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["SubStr"] - .SetFunctionName("GDpriv::StringTools::SubStr") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["StrAt"] - .SetFunctionName("GDpriv::StringTools::StrAt") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllStrExpressions()["StrRepeat"] - .SetFunctionName("GDpriv::StringTools::StrRepeat") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrLength"] - .SetFunctionName("GDpriv::StringTools::StrLen") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrFind"] - .SetFunctionName("GDpriv::StringTools::StrFind") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrRFind"] - .SetFunctionName("GDpriv::StringTools::StrFindLast") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrFindLast"] - .SetFunctionName("GDpriv::StringTools::StrFindLast") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrFindFrom"] - .SetFunctionName("GDpriv::StringTools::StrFindFrom") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrRFindFrom"] - .SetFunctionName("GDpriv::StringTools::StrFindLastFrom") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); - GetAllExpressions()["StrFindLastFrom"] - .SetFunctionName("GDpriv::StringTools::StrFindLastFrom") - .SetIncludeFile("GDCpp/Extensions/Builtin/StringTools.h"); -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.h b/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.h deleted file mode 100644 index 861661043..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/StringInstructionsExtension.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef STRINGINSTRUCTIONSEXTENSION_H -#define STRINGINSTRUCTIONSEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing string features - * - * \ingroup BuiltinExtensions - */ -class StringInstructionsExtension : public ExtensionBase { - public: - StringInstructionsExtension(); - virtual ~StringInstructionsExtension(){}; -}; - -#endif // STRINGINSTRUCTIONSEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/StringTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/StringTools.cpp deleted file mode 100644 index 439b43642..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/StringTools.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/String.h" - -using namespace std; - -namespace GDpriv { -namespace StringTools { - -/** - * Expression function for getting a substring from a string - */ -gd::String GD_API SubStr(const gd::String& str, size_t start, size_t length) { - if (start < str.size()) return str.substr(start, length); - - return ""; -} - -/** - * Expression function for getting a character from a string - */ -gd::String GD_API StrAt(const gd::String& str, size_t pos) { - if (pos < str.size()) return str.substr(pos, 1); - - return ""; -} - -/** - * Expression function for getting a character from its codepoint - */ -gd::String GD_API FromCodePoint(int32_t codepoint) { - return gd::String::FromUTF32( - std::u32string(1, static_cast(codepoint))); -} - -/** - * Expression function for getting the uppercase version of a string - */ -gd::String GD_API ToUpperCase(const gd::String& str) { return str.UpperCase(); } - -/** - * Expression function for getting the lowercase version of a string - */ -gd::String GD_API ToLowerCase(const gd::String& str) { return str.LowerCase(); } - -/** - * Expression function for getting a repeated version of a string - */ -gd::String GD_API StrRepeat(const gd::String& str, std::size_t repCount) { - gd::String result; - - result.Raw().reserve(str.Raw().size() * repCount); - for (std::size_t i = 0; i < repCount; ++i) result.Raw() += str.Raw(); - - return result; -} - -/** - * Expression function for getting a substring from a string - */ -std::size_t GD_API StrLen(const gd::String& str) { return str.size(); } - -/** - * Expression function for finding a string in another - */ -int GD_API StrFind(const gd::String& str, const gd::String& findwhat) { - size_t pos = str.find(findwhat); - - if (pos != gd::String::npos) return pos; - return -1; -} - -/** - * Expression function for finding a string in another - */ -int GD_API StrFindLast(const gd::String& str, const gd::String& findwhat) { - size_t pos = str.rfind(findwhat); - - if (pos != gd::String::npos) return pos; - return -1; -} - -/** - * Expression function for finding a string in another - */ -int GD_API StrFindFrom(const gd::String& str, - const gd::String& findwhat, - std::size_t start) { - size_t pos = str.find(findwhat, start); - - if (pos != gd::String::npos) return pos; - return -1; -} - -/** - * Expression function for finding a string in another - */ -int GD_API StrFindLastFrom(const gd::String& str, - const gd::String& findwhat, - std::size_t start) { - size_t pos = str.rfind(findwhat, start); - - if (pos != gd::String::npos) return pos; - return -1; -} - -gd::String GD_API NewLine() { return "\n"; }; - -} // namespace StringTools -} // namespace GDpriv diff --git a/GDCpp/GDCpp/Extensions/Builtin/StringTools.h b/GDCpp/GDCpp/Extensions/Builtin/StringTools.h deleted file mode 100644 index 9a21ab5ee..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/StringTools.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef STRINGEXPRESSIONS_H -#define STRINGEXPRESSIONS_H - -#include -class RuntimeScene; - -namespace GDpriv { - -/** - * \brief Tools only meant to be used by GD events generated code - */ -namespace StringTools { - -gd::String GD_API SubStr(const gd::String& str, size_t start, size_t length); -gd::String GD_API StrAt(const gd::String& str, size_t pos); -gd::String GD_API NewLine(); -gd::String GD_API FromCodePoint(int32_t codepoint); -gd::String GD_API ToUpperCase(const gd::String& str); -gd::String GD_API ToLowerCase(const gd::String& str); -gd::String GD_API StrRepeat(const gd::String& str, std::size_t repCount); -std::size_t GD_API StrLen(const gd::String& str); -int GD_API StrFind(const gd::String& str, const gd::String& findwhat); -int GD_API StrFindLast(const gd::String& str, const gd::String& findwhat); -int GD_API StrFindFrom(const gd::String& str, - const gd::String& findwhat, - std::size_t start); -int GD_API StrFindLastFrom(const gd::String& str, - const gd::String& findwhat, - std::size_t start); - -} // namespace StringTools - -} // namespace GDpriv -#endif // STRINGEXPRESSIONS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.cpp deleted file mode 100644 index 026ebb455..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/TimeExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/ManualTimer.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/TimeExtension.cpp" -#endif - -TimeExtension::TimeExtension() { - gd::BuiltinExtensionsImplementer::ImplementsTimeExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["Timer"] - .SetFunctionName("TimerElapsedTime") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllConditions()["TimeScale"] - .SetFunctionName("GetTimeScale") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllConditions()["TimerPaused"] - .SetFunctionName("TimerPaused") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - - GetAllActions()["ResetTimer"] - .SetFunctionName("ResetTimer") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllActions()["PauseTimer"] - .SetFunctionName("PauseTimer") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllActions()["UnPauseTimer"] - .SetFunctionName("UnPauseTimer") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllActions()["RemoveTimer"] - .SetFunctionName("RemoveTimer") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllActions()["ChangeTimeScale"] - .SetFunctionName("SetTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - - GetAllExpressions()["TimeDelta"] - .SetFunctionName("GetElapsedTimeInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TempsFrame"] - .SetFunctionName("GetElapsedTimeInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["ElapsedTime"] - .SetFunctionName("GetElapsedTimeInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TimerElapsedTime"] - .SetFunctionName("GetTimerElapsedTimeInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TimeFromStart"] - .SetFunctionName("GetTimeFromStartInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TempsDebut"] - .SetFunctionName("GetTimeFromStartInSeconds") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TimeScale"] - .SetFunctionName("GetTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["TimeScale"] - .SetFunctionName("GetTimeScale") - .SetIncludeFile("GDCpp/Extensions/Builtin/TimeTools.h"); - GetAllExpressions()["Time"].SetFunctionName("GetTime").SetIncludeFile( - "GDCpp/Extensions/Builtin/TimeTools.h"); -#endif -} - -#if defined(GD_IDE_ONLY) && !defined(EMSCRIPTEN) -void TimeExtension::GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - auto timers = scene.GetTimeManager().GetTimers(); - size_t i = 0; - for (auto it = timers.begin(); it != timers.end(); ++i, ++it) { - if (i != propertyNb) continue; - - name = it->first; - value = gd::String::From(static_cast(it->second.GetTime()) / - 1000000.0) + - "s"; - } -} - -bool TimeExtension::ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue) { - auto timers = scene.GetTimeManager().GetTimers(); - size_t i = 0; - for (auto it = timers.begin(); it != timers.end(); ++i, ++it) { - if (i != propertyNb) continue; - - it->second.SetTime(newValue.To() * 1000000.0); - return true; - } - - return false; -} - -std::size_t TimeExtension::GetNumberOfProperties(RuntimeScene& scene) const { - auto timers = scene.GetTimeManager().GetTimers(); - return timers.size(); -} -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.h b/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.h deleted file mode 100644 index 03a288201..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/TimeExtension.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef TIMEEXTENSION_H -#define TIMEEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing time features. - * - * \ingroup BuiltinExtensions - */ -class TimeExtension : public ExtensionBase { - public: - TimeExtension(); - virtual ~TimeExtension(){}; - -#if defined(GD_IDE_ONLY) && !defined(EMSCRIPTEN) - bool HasDebuggingProperties() const { return true; }; - void GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - bool ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue); - std::size_t GetNumberOfProperties(RuntimeScene& scene) const; -#endif - - private: -}; - -#endif // TIMEEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/TimeTools.cpp b/GDCpp/GDCpp/Extensions/Builtin/TimeTools.cpp deleted file mode 100644 index d6cc08d5f..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/TimeTools.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "TimeTools.h" -#include "GDCpp/Runtime/ManualTimer.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -bool GD_API TimerElapsedTime(RuntimeScene& scene, - double timeInSeconds, - const gd::String& timerName) { - if (!scene.GetTimeManager().HasTimer(timerName)) - return true; // Inconsistency to keep compatibility with games relying on - // this behavior. - - return scene.GetTimeManager().GetTimer(timerName).GetTime() >= - timeInSeconds * 1000000.0; -} - -double GD_API GetTimerElapsedTimeInSeconds(RuntimeScene& scene, - const gd::String& timerName) { - return static_cast( - scene.GetTimeManager().GetTimer(timerName).GetTime()) / - 1000000.0; -} - -bool GD_API TimerPaused(RuntimeScene& scene, const gd::String& timerName) { - if (!scene.GetTimeManager().HasTimer(timerName)) return false; - - return scene.GetTimeManager().GetTimer(timerName).IsPaused(); -} - -double GD_API GetTimeScale(RuntimeScene& scene) { - return scene.GetTimeManager().GetTimeScale(); -} - -void GD_API ResetTimer(RuntimeScene& scene, const gd::String& timerName) { - if (!scene.GetTimeManager().HasTimer(timerName)) - scene.GetTimeManager().AddTimer(timerName); - - scene.GetTimeManager().GetTimer(timerName).Reset(); -} - -void GD_API PauseTimer(RuntimeScene& scene, const gd::String& timerName) { - if (!scene.GetTimeManager().HasTimer(timerName)) - scene.GetTimeManager().AddTimer(timerName); - - scene.GetTimeManager().GetTimer(timerName).SetPaused(true); -} - -void GD_API UnPauseTimer(RuntimeScene& scene, const gd::String& timerName) { - if (!scene.GetTimeManager().HasTimer(timerName)) - scene.GetTimeManager().AddTimer(timerName); - - scene.GetTimeManager().GetTimer(timerName).SetPaused(false); -} - -void GD_API RemoveTimer(RuntimeScene& scene, const gd::String& timerName) { - scene.GetTimeManager().RemoveTimer(timerName); -} - -void GD_API SetTimeScale(RuntimeScene& scene, double value) { - scene.GetTimeManager().SetTimeScale(value); -} - -double GD_API GetElapsedTimeInSeconds(RuntimeScene& scene) { - return scene.GetTimeManager().GetElapsedTime() / 1000000.0; -} - -double GD_API GetTimeFromStartInSeconds(RuntimeScene& scene) { - return static_cast(scene.GetTimeManager().GetTimeFromStart()) / - 1000000.0; -} - -double GD_API GetTime(const RuntimeScene& scene, const gd::String& parameter) { - time_t rawtime = time(0); - struct tm* timeinfo = localtime(&rawtime); - - if (parameter == "hour") - return timeinfo->tm_hour; - else if (parameter == "min") - return timeinfo->tm_min; - else if (parameter == "sec") - return timeinfo->tm_sec; - else if (parameter == "mday") - return timeinfo->tm_mday; - else if (parameter == "mon") - return timeinfo->tm_mon; - else if (parameter == "year") - return timeinfo->tm_year; - else if (parameter == "wday") - return timeinfo->tm_wday; - else if (parameter == "yday") - return timeinfo->tm_yday; - - return 0; -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/TimeTools.h b/GDCpp/GDCpp/Extensions/Builtin/TimeTools.h deleted file mode 100644 index 7e61f0d5c..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/TimeTools.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef TIMETOOLS_H -#define TIMETOOLS_H - -#include -#include "GDCpp/Runtime/String.h" - -class RuntimeScene; - -bool GD_API TimerElapsedTime(RuntimeScene& scene, - double time, - const gd::String& timerName); -bool GD_API TimerPaused(RuntimeScene& scene, const gd::String& timerName); -double GD_API GetTimeScale(RuntimeScene& scene); -double GD_API GetTimerElapsedTimeInSeconds(RuntimeScene& scene, - const gd::String& timerName); -void GD_API ResetTimer(RuntimeScene& scene, const gd::String& timerName); -void GD_API PauseTimer(RuntimeScene& scene, const gd::String& timerName); -void GD_API UnPauseTimer(RuntimeScene& scene, const gd::String& timerName); -void GD_API RemoveTimer(RuntimeScene& scene, const gd::String& timerName); -void GD_API SetTimeScale(RuntimeScene& scene, double value); -double GD_API GetElapsedTimeInSeconds(RuntimeScene& scene); -double GD_API GetTimeFromStartInSeconds(RuntimeScene& scene); -double GD_API GetTimeScale(RuntimeScene& scene); -double GD_API GetTime(const RuntimeScene& scene, const gd::String& parameter); - -#endif // TIMETOOLS_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.cpp deleted file mode 100644 index 95cf41bb8..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/VariablesExtension.h" -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/Project/Project.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/VariablesExtension.cpp" -#endif - -VariablesExtension::VariablesExtension() { - gd::BuiltinExtensionsImplementer::ImplementsVariablesExtension(*this); - -#if defined(GD_IDE_ONLY) - GetAllConditions()["VarScene"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["VarSceneTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["VariableChildExists"] - .SetFunctionName("VariableChildExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["GlobalVariableChildExists"] - .SetFunctionName("VariableChildExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["VarSceneDef"] - .SetFunctionName("VariableExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["VarGlobalDef"] - .SetFunctionName("VariableExists") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllConditions()["VarGlobal"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllConditions()["VarGlobalTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllActions()["ModVarScene"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["ModVarSceneTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllActions()["ModVarGlobal"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("number") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["ModVarGlobalTxt"] - .SetFunctionName("ReturnVariable") - .SetManipulatedType("string") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllActions()["VariableRemoveChild"] - .SetFunctionName("VariableRemoveChild") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["GlobalVariableRemoveChild"] - .SetFunctionName("VariableRemoveChild") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllActions()["VariableClearChildren"] - .SetFunctionName("VariableClearChildren") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["GlobalVariableClearChildren"] - .SetFunctionName("VariableClearChildren") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllExpressions()["Variable"] - .SetFunctionName("GetVariableValue") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllStrExpressions()["VariableString"] - .SetFunctionName("GetVariableString") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllExpressions()["GlobalVariable"] - .SetFunctionName("GetVariableValue") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllStrExpressions()["GlobalVariableString"] - .SetFunctionName("GetVariableString") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllExpressions()["VariableChildCount"] - .SetFunctionName("GetVariableChildCount") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllExpressions()["GlobalVariableChildCount"] - .SetFunctionName("GetVariableChildCount") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - -#endif -} diff --git a/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.h b/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.h deleted file mode 100644 index c58e5cf28..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/VariablesExtension.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef VARIABLESEXTENSION_H -#define VARIABLESEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" - -/** - * \brief Internal built-in extension providing variables features. - * - * \ingroup BuiltinExtensions - */ -class VariablesExtension : public ExtensionBase { - public: - VariablesExtension(); - virtual ~VariablesExtension(){}; -}; - -#endif // VARIABLESEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.cpp b/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.cpp deleted file mode 100644 index bc7ce5289..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/Builtin/WindowExtension.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/Events/Instruction.h" -#include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -#endif -#include "GDCore/Extensions/Builtin/AllBuiltinExtensions.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/WindowExtension.cpp" -#endif - -WindowExtension::WindowExtension() { - gd::BuiltinExtensionsImplementer::ImplementsWindowExtension(*this); - -#if defined(GD_IDE_ONLY) - - GetAllActions()["SetFullScreen"] - .SetFunctionName("SetFullScreen") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["SetWindowSize"] - .SetFunctionName("SetWindowSize") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["SetWindowIcon"] - .SetFunctionName("SetWindowIcon") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllActions()["SetWindowTitle"] - .SetFunctionName("SetWindowTitle") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllExpressions()["SceneWindowWidth"] - .SetFunctionName("GetSceneWindowWidth") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllExpressions()["SceneWindowHeight"] - .SetFunctionName("GetSceneWindowHeight") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllExpressions()["ScreenWidth"] - .SetFunctionName("GetScreenWidth") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllExpressions()["ScreenHeight"] - .SetFunctionName("GetScreenHeight") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - GetAllExpressions()["ColorDepth"] - .SetFunctionName("GetColorDepth") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - - GetAllStrExpressions()["WindowTitle"] - .SetFunctionName("GetWindowTitle") - .SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h"); - -#endif -} - -#if defined(GD_IDE_ONLY) -void WindowExtension::ExposeActionsResources( - gd::Instruction& action, gd::ArbitraryResourceWorker& worker) { - if (action.GetType() == "SetWindowIcon" && - !action.GetParameter(1).GetPlainString().empty()) { - gd::String parameter = action.GetParameter(1).GetPlainString(); - worker.ExposeImage(parameter); - action.SetParameter(1, parameter); - } -} -#endif diff --git a/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.h b/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.h deleted file mode 100644 index e5cdba9b1..000000000 --- a/GDCpp/GDCpp/Extensions/Builtin/WindowExtension.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef WINDOWEXTENSION_H -#define WINDOWEXTENSION_H - -#include "GDCpp/Extensions/ExtensionBase.h" -namespace gd { -class ArbitraryResourceWorker; -} - -/** - * \brief Internal built-in extension providing windows features. - * - * \ingroup BuiltinExtensions - */ -class WindowExtension : public ExtensionBase { - public: - WindowExtension(); - virtual ~WindowExtension(){}; - -#if defined(GD_IDE_ONLY) - virtual void ExposeActionsResources(gd::Instruction& action, - gd::ArbitraryResourceWorker& worker); -#endif -}; - -#endif // WINDOWEXTENSION_H diff --git a/GDCpp/GDCpp/Extensions/CppPlatform.cpp b/GDCpp/GDCpp/Extensions/CppPlatform.cpp deleted file mode 100644 index d4f21a19c..000000000 --- a/GDCpp/GDCpp/Extensions/CppPlatform.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/CppPlatform.h" -#include -#include -#include "GDCore/Extensions/Platform.h" -#include "GDCore/IDE/AbstractFileSystem.h" -#include "GDCore/Project/Project.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/ExtensionBase.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/SoundManager.h" - -// Builtin extensions -#include "GDCpp/Extensions/Builtin/AdvancedExtension.h" -#include "GDCpp/Extensions/Builtin/AudioExtension.h" -#include "GDCpp/Extensions/Builtin/BaseObjectExtension.h" -#include "GDCpp/Extensions/Builtin/CameraExtension.h" -#include "GDCpp/Extensions/Builtin/CommonConversionsExtension.h" -#include "GDCpp/Extensions/Builtin/CommonInstructionsExtension.h" -#include "GDCpp/Extensions/Builtin/ExternalLayoutsExtension.h" -#include "GDCpp/Extensions/Builtin/FileExtension.h" -#include "GDCpp/Extensions/Builtin/JoystickExtension.h" -#include "GDCpp/Extensions/Builtin/KeyboardExtension.h" -#include "GDCpp/Extensions/Builtin/MathematicalToolsExtension.h" -#include "GDCpp/Extensions/Builtin/MouseExtension.h" -#include "GDCpp/Extensions/Builtin/NetworkExtension.h" -#include "GDCpp/Extensions/Builtin/SceneExtension.h" -#include "GDCpp/Extensions/Builtin/SpriteExtension.h" -#include "GDCpp/Extensions/Builtin/StringInstructionsExtension.h" -#include "GDCpp/Extensions/Builtin/TimeExtension.h" -#include "GDCpp/Extensions/Builtin/VariablesExtension.h" -#include "GDCpp/Extensions/Builtin/WindowExtension.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/BehaviorsRuntimeSharedData.h" - -CppPlatform *CppPlatform::singleton = NULL; - -CppPlatform::CppPlatform() : gd::Platform() { ReloadBuiltinExtensions(); } - -void CppPlatform::ReloadBuiltinExtensions() { - std::cout << "* Loading builtin extensions... "; - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); - AddExtension(std::make_shared()); - std::cout.flush(); -} - -bool CppPlatform::AddExtension( - std::shared_ptr platformExtension) { - std::shared_ptr extension = - std::dynamic_pointer_cast(platformExtension); - if (extension == std::shared_ptr()) { - std::cout << "ERROR: Tried to add an incompatible extension to C++ Platform" - << std::endl; - return false; - } - - // First add normally the extension - if (!gd::Platform::AddExtension(extension)) return false; - - // Then Load all runtime objects provided by the extension - std::vector objectsTypes = extension->GetExtensionObjectsTypes(); - for (const auto &objectType : objectsTypes) { - runtimeObjCreationFunctionTable[objectType] = - extension->GetRuntimeObjectCreationFunctionPtr(objectType); - } - std::vector behaviorsTypes = extension->GetBehaviorsTypes(); - for (const auto &behaviorType : behaviorsTypes) { - runtimeBehaviorCreationFunctionTable[behaviorType] = - extension->GetRuntimeBehaviorCreationFunctionPtr(behaviorType); - behaviorsRuntimeSharedDataCreationFunctionTable[behaviorType] = - extension->GetBehaviorsRuntimeSharedDataFunctionPtr(behaviorType); - } - return true; -} - -std::unique_ptr CppPlatform::CreateRuntimeObject( - RuntimeScene &scene, gd::Object &object) { - const gd::String &type = object.GetType(); - - if (runtimeObjCreationFunctionTable.find(type) == - runtimeObjCreationFunctionTable.end()) { - std::cout << "Tried to create an object with an unknown type: " << type - << std::endl; - std::cout << "Have you called AddRuntimeObject<...>(...) in your extension?" << std::endl; - return std::unique_ptr(); - } - - // Create a new object with the type we want. - return runtimeObjCreationFunctionTable[type](scene, object); -} - -std::unique_ptr CppPlatform::CreateRuntimeBehavior( - const gd::String &type, gd::SerializerElement &behaviorContent) { - if (runtimeBehaviorCreationFunctionTable.find(type) == - runtimeBehaviorCreationFunctionTable.end()) { - std::cout << "Tried to create a runtime behavior with an unknown type: " - << type << std::endl; - std::cout << "Have you called AddRuntimeBehavior<...>(...) in your extension?" << std::endl; - return std::unique_ptr(); - } - if (!runtimeBehaviorCreationFunctionTable[type]) { - std::cout << "Tried to create a runtime behavior, but no class was " - "specified for type: " - << type << std::endl; - std::cout << "Have you called AddRuntimeBehavior<...>(...) in your extension?" << std::endl; - return std::unique_ptr(); - } - - // Create a new behavior with the type we want. - return runtimeBehaviorCreationFunctionTable[type](behaviorContent); -} - -std::unique_ptr -CppPlatform::CreateBehaviorsRuntimeSharedData( - const gd::String &type, const gd::SerializerElement &behaviorSharedDataContent) { - if (behaviorsRuntimeSharedDataCreationFunctionTable.find(type) == - behaviorsRuntimeSharedDataCreationFunctionTable.end()) { - std::cout << "Tried to create a runtime behavior shared data with an " - "unknown type: " - << type << std::endl; - std::cout << "Have you called AddBehaviorsRuntimeSharedData<...>(...) in your extension?" << std::endl; - return std::unique_ptr(); - } - if (!behaviorsRuntimeSharedDataCreationFunctionTable[type]) { - std::cout << "Tried to create a runtime behavior shared data, but no creation function was " - "specified for type: " - << type << std::endl; - std::cout << "Have you called AddBehaviorsRuntimeSharedData<...>(...) in your extension?" << std::endl; - return std::unique_ptr(); - } - - // Create a new behavior with the type we want. - return behaviorsRuntimeSharedDataCreationFunctionTable[type]( - behaviorSharedDataContent); -} - -#if defined(GD_IDE_ONLY) -gd::String CppPlatform::GetDescription() const { - return _( - "Allows you to create 2D games that can be compiled and played on " - "Windows or Linux."); -} - -void CppPlatform::OnIDEClosed() { FontManager::Get()->DestroySingleton(); } -#endif - -CppPlatform &CppPlatform::Get() { - if (!singleton) singleton = new CppPlatform; - - return *singleton; -} - -void CppPlatform::DestroySingleton() { - if (singleton) { - delete singleton; - singleton = NULL; - } -} - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Platform.cpp" -#endif - -#if !defined(EMSCRIPTEN) -/** - * Used by GDevelop to create the platform class - */ -extern "C" gd::Platform *GD_API CreateGDPlatform() { - return &CppPlatform::Get(); -} - -/** - * Used by GDevelop to destroy the platform class - */ -extern "C" void GD_API DestroyGDPlatform() { CppPlatform::DestroySingleton(); } -#endif diff --git a/GDCpp/GDCpp/Extensions/CppPlatform.h b/GDCpp/GDCpp/Extensions/CppPlatform.h deleted file mode 100644 index ed6210c3b..000000000 --- a/GDCpp/GDCpp/Extensions/CppPlatform.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef PLATFORM_H -#define PLATFORM_H -#include "GDCore/Extensions/Platform.h" -#include "GDCore/Extensions/PlatformExtension.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -namespace gd { -class Behavior; -class Object; -class SerializerElement; -} // namespace gd -class RuntimeBehavior; -class BehaviorsRuntimeSharedData; -class RuntimeObject; -class RuntimeScene; - -typedef std::unique_ptr (*CreateRuntimeObjectFunPtr)( - RuntimeScene& scene, const gd::Object& object); -typedef std::unique_ptr (*CreateRuntimeBehaviorFunPtr)( - const gd::SerializerElement& behaviorContent); -typedef std::unique_ptr ( - *CreateBehaviorsRuntimeSharedDataFunPtr)( - const gd::SerializerElement& behaviorSharedDataContent); - -/** - * \brief GDevelop C++ Platform - * - * Platform designed to be used to create 2D games based on SFML and OpenGL - * libraries for rendering, events being translated to C++ and then compiled - * using GCC. - */ -class GD_API CppPlatform : public gd::Platform { - public: - virtual gd::String GetName() const { return "GDevelop C++ platform"; } -#if defined(GD_IDE_ONLY) - virtual gd::String GetFullName() const { - return _("Native (Windows or Linux games)"); - } - virtual gd::String GetSubtitle() const { - return _("C++ and OpenGL based games for Windows or Linux."); - } - virtual gd::String GetDescription() const; -#endif - - /** - * \brief Create a RuntimeObject from a gd::Object for a scene. - * - * \param scene The scene the object is going to be used on. - * \param object The gd::Object the RuntimeObject must be based on. - */ - std::unique_ptr CreateRuntimeObject(RuntimeScene& scene, - gd::Object& object); - - /** - * \brief Create a RuntimeBehavior for an object. - * - * \param type The type of the behavior to create. - * \param behaviorContent The content used to initialize the behavior. - */ - std::unique_ptr CreateRuntimeBehavior( - const gd::String& type, gd::SerializerElement& behaviorContent); - - /** - * \brief Create a BehaviorsRuntimeSharedData - * - * \param type The type of the behavior shared data to create. - * \param behaviorSharedData The initial shared data used to initialize the - * shared data. - */ - std::unique_ptr CreateBehaviorsRuntimeSharedData( - const gd::String& type, const gd::SerializerElement &behaviorSharedDataContent); - - /** - * \brief Our platform need to do a bit of extra work when adding an extension - * ( i.e : Storing pointers to creation/destruction functions ). - */ - bool AddExtension(std::shared_ptr platformExtension); - - /** \brief The name of the function searched in an extension file to create - * the extension - */ - virtual gd::String GetExtensionCreateFunctionName() { - return "CreateGDExtension"; - } - -#if defined(GD_IDE_ONLY) - virtual gd::String GetIcon() const { return "CppPlatform/icon32.png"; } - - /** - * \brief When destroyed, our platform need to do ensure the destruction of - * some singletons. - */ - virtual void OnIDEClosed(); -#endif - - /** - * \brief (Re)load platform built-in extensions. - * \note Can be useful if, for example, the user changed the language - * of the editor. - */ - virtual void ReloadBuiltinExtensions(); - - /** - * \brief Get access to the CppPlatform instance. ( CppPlatform is a singleton - * ). - */ - static CppPlatform& Get(); - - /** - * \brief Destroy the singleton. - * - * \note You do not need usually to call this method. - **/ - static void DestroySingleton(); - - CppPlatform(); - virtual ~CppPlatform(){}; - - private: - std::map - runtimeObjCreationFunctionTable; ///< The C++ Platform also need to store - ///< functions to create runtime - ///< objects. - std::map - runtimeBehaviorCreationFunctionTable; ///< The C++ Platform also need to - ///< store functions to create - ///< runtime behaviors. - std::map - behaviorsRuntimeSharedDataCreationFunctionTable; ///< The C++ Platform - ///< also need to store - ///< functions to create - ///< runtime behaviors - ///< shared data. - - static CppPlatform* singleton; -}; - -#endif // PLATFORM_H diff --git a/GDCpp/GDCpp/Extensions/ExtensionBase.cpp b/GDCpp/GDCpp/Extensions/ExtensionBase.cpp deleted file mode 100644 index 1957d082f..000000000 --- a/GDCpp/GDCpp/Extensions/ExtensionBase.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Extensions/ExtensionBase.h" -#include -#include -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/Events/Event.h" -#endif - -using namespace std; - -ExtensionBase::~ExtensionBase(){}; - -CreateRuntimeObjectFunPtr ExtensionBase::GetRuntimeObjectCreationFunctionPtr( - gd::String objectType) const { - if (runtimeObjectCreationFunctionTable.find(objectType) != - runtimeObjectCreationFunctionTable.end()) - return runtimeObjectCreationFunctionTable.find(objectType)->second; - - return NULL; -} - -CreateRuntimeBehaviorFunPtr -ExtensionBase::GetRuntimeBehaviorCreationFunctionPtr( - gd::String behaviorType) const { - if (runtimeBehaviorCreationFunctionTable.find(behaviorType) != - runtimeBehaviorCreationFunctionTable.end()) - return runtimeBehaviorCreationFunctionTable.find(behaviorType)->second; - - return NULL; -} - -CreateBehaviorsRuntimeSharedDataFunPtr -ExtensionBase::GetBehaviorsRuntimeSharedDataFunctionPtr( - gd::String behaviorType) const { - if (behaviorsRuntimeSharedDataCreationFunctionTable.find(behaviorType) != - behaviorsRuntimeSharedDataCreationFunctionTable.end()) - return behaviorsRuntimeSharedDataCreationFunctionTable.find(behaviorType) - ->second; - - return NULL; -} - -#if !defined(GD_IDE_ONLY) -// Implementations of some dependencies of ExtensionBase are compiled in this -// compilation unit when compiling for runtime: -#include "GDCore/Extensions/Metadata/BehaviorMetadata.cpp" -#include "GDCore/Extensions/Metadata/ObjectMetadata.cpp" -#include "GDCore/Extensions/Metadata/EffectMetadata.cpp" -#include "GDCore/Extensions/PlatformExtension.cpp" -#endif diff --git a/GDCpp/GDCpp/Extensions/ExtensionBase.h b/GDCpp/GDCpp/Extensions/ExtensionBase.h deleted file mode 100644 index 47b0bb5dc..000000000 --- a/GDCpp/GDCpp/Extensions/ExtensionBase.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. Copyright 2016 Victor Levasseur (victorlevasseur52@gmail.com) This - * project is released under the MIT License. - */ - -#ifndef EXTENSIONBASE_H -#define EXTENSIONBASE_H -#include -#include -#include -#include -#include -#include "GDCore/CommonTools.h" -#include "GDCore/Extensions/Metadata/BehaviorMetadata.h" -#include "GDCore/Extensions/Metadata/ExpressionMetadata.h" -#include "GDCore/Extensions/Metadata/InstructionMetadata.h" -#include "GDCore/Extensions/Metadata/MultipleInstructionMetadata.h" -#include "GDCore/Extensions/Metadata/ObjectMetadata.h" -#include "GDCore/Extensions/PlatformExtension.h" -#include "GDCore/Tools/Localization.h" - -namespace gd { -class Instruction; -class Layout; -class Object; -class BaseEvent; -class BehaviorsSharedData; -class ArbitraryResourceWorker; -class Project; -class SerializerElement; -} // namespace gd -class RuntimeScene; -class RuntimeObject; -class RuntimeBehavior; -class BehaviorsRuntimeSharedData; -class ExtensionBase; -class EventsCodeGenerationContext; -class EventsCodeGenerator; -#undef CreateEvent - -// Declare typedefs for objects creations/destructions functions -typedef std::unique_ptr (*CreateRuntimeObjectFunPtr)( - RuntimeScene& scene, const gd::Object& object); -typedef std::unique_ptr (*CreateRuntimeBehaviorFunPtr)( - const gd::SerializerElement& behaviorContent); -typedef std::unique_ptr ( - *CreateBehaviorsRuntimeSharedDataFunPtr)( - const gd::SerializerElement& behaviorSharedDataContent); - -/** - * \brief Base class for C++ extensions. - * Extensions can provide : - * - * - Static functions ( e.g. GetActionFunctionPtr ). - * - Objects functions ( e.g. GetObjectActionFunctionPtr ) - * - New objects, which have a type. The new - * objects creations/destructions functions are provided - * by the extension. - * - More information when compiled for the IDE. - */ -class GD_API ExtensionBase : public gd::PlatformExtension { - public: - ExtensionBase(){}; - virtual ~ExtensionBase(); - - /** - * \brief To be called so as to declare the creation and destruction function - * of a RuntimeObject associated to a gd::Object. - * - * \tparam T the object class (inheriting *gd::Object*) declared with - * *AddObject*. - * - * \tparam U the runtime object class (inheriting *RuntimeObject*). - * - * \param object The object associated to the RuntimeObject being declared. - * \param className The C++ class name associated to the RuntimeObject. - */ - template - void AddRuntimeObject(gd::ObjectMetadata& object, gd::String className); - - /** - * \brief To be called so as to declare the creation and destruction function - * of a RuntimeBehavior associated to a gd::Behavior. - * - * \tparam T the runtime behavior class (inheriting *RuntimeBehavior*). - * \tparam U the runtime behavior shared data class (inheriting - * *BehaviorsRuntimeSharedData*). - * - * \param object The object associated to the RuntimeBehavior being declared. - * \param className The C++ class name associated to the RuntimeBehavior. - */ - template - void AddRuntimeBehavior(gd::BehaviorMetadata& behavior, gd::String className); - - /** - * \brief To be called so as to declare the creation and destruction function - * of a BehaviorsRuntimeSharedData associated to a gd::BehaviorsSharedData. - * - * \tparam T the behavior shared data class (inheriting - * *BehaviorsSharedData*). \tparam U the runtime behavior shared data class - * (inheriting *BehaviorsRuntimeSharedData*). - * - * \param object The object associated to the RuntimeBehavior being declared. - * \param className The C++ class name associated to the RuntimeBehavior. - */ - template - void AddBehaviorsRuntimeSharedData(gd::BehaviorMetadata& behavior); - - /** - * \brief Return a function to create the runtime object if the type is - * handled by the extension - */ - CreateRuntimeObjectFunPtr GetRuntimeObjectCreationFunctionPtr( - gd::String objectType) const; - - /** - * \brief Return a function to create the runtime behavior if the type is - * handled by the extension - */ - CreateRuntimeBehaviorFunPtr GetRuntimeBehaviorCreationFunctionPtr( - gd::String behaviorType) const; - - /** - * \brief Return a function to create the runtime behavior shared data if the type is - * handled by the extension. - */ - CreateBehaviorsRuntimeSharedDataFunPtr GetBehaviorsRuntimeSharedDataFunctionPtr( - gd::String behaviorType) const; - - /** - * \brief Called when a scene is loaded: Useful to initialize some extensions - * specific objects related to scene - */ - virtual void SceneLoaded(RuntimeScene& scene){}; - - /** - * \brief Called when a scene is unloaded: Useful to destroy some extensions - * specific objects related to scene - */ - virtual void SceneUnloaded(RuntimeScene& scene){}; - - /** - * \brief Redefine this method to return true if you want the method - * ObjectDeletedFromScene to be called by RuntimeScene when - * - * \see ExtensionBase::ToBeNotifiedOnObjectDeletion - */ - virtual bool ToBeNotifiedOnObjectDeletion() { return false; } - - /** - * \brief Called by RuntimeScene, if ToBeNotifiedOnObjectDeletion() returns - * true, when an object is about to be deleted. - * - * \see ExtensionBase::ObjectDeletedFromScene - */ - virtual void ObjectDeletedFromScene(RuntimeScene& scene, - RuntimeObject* objectDeleted){}; - -#if defined(GD_IDE_ONLY) - - /** - * \brief Must return true if the extension has something to display in - * debugger. - */ - virtual bool HasDebuggingProperties() const { return false; }; - - /** - * \brief Called by the debugger so as to get a property value and name. - * \see RuntimeObject::GetPropertyForDebugger - */ - virtual void GetPropertyForDebugger(RuntimeScene& scene, - std::size_t propertyNb, - gd::String& name, - gd::String& value) const {}; - - /** - * \brief Called by the debugger so as to update a property - * \see RuntimeObject::ChangeProperty - */ - virtual bool ChangeProperty(RuntimeScene& scene, - std::size_t propertyNb, - gd::String newValue) { - return false; - }; - - /** - * \brief Must return the number of available properties for the debugger - */ - virtual std::size_t GetNumberOfProperties(RuntimeScene& scene) const { - return 0; - }; - - const std::vector >& - GetSupplementaryRuntimeFiles() const { - return supplementaryRuntimeFiles; - }; - const std::vector& GetSupplementaryIncludeDirectories() const { - return supplementaryIncludeDirectories; - }; - const std::vector& GetSupplementaryLibFiles() const { - return supplementaryLibFiles; - }; -#endif - - protected: -#if defined(GD_IDE_ONLY) - std::vector > - supplementaryRuntimeFiles; ///< Supplementary runtime files to copy on - ///< compilation - std::vector - supplementaryIncludeDirectories; ///< Supplementary include directories - ///< to use on events compilation - std::vector - supplementaryLibFiles; ///< Supplementary libraries files to be used when - ///< compiling events with this extension. Files - ///< must be in CppPlatform/Extensions and - ///< CppPlatform/Extensions/Runtime directories. - ///< The filename will be completed with lib and - ///< .a. -#endif - - private: - std::map - runtimeObjectCreationFunctionTable; - std::map - runtimeBehaviorCreationFunctionTable; - std::map - behaviorsRuntimeSharedDataCreationFunctionTable; -}; - -#include "GDCpp/Extensions/ExtensionBase.inl" - -#endif // EXTENSIONBASE_H diff --git a/GDCpp/GDCpp/Extensions/ExtensionBase.inl b/GDCpp/GDCpp/Extensions/ExtensionBase.inl deleted file mode 100644 index 9583bc501..000000000 --- a/GDCpp/GDCpp/Extensions/ExtensionBase.inl +++ /dev/null @@ -1,57 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. Copyright 2016 Victor Levasseur (victorlevasseur52@gmail.com) This - * project is released under the MIT License. - */ -#ifndef EXTENSIONBASE_INL -#define EXTENSIONBASE_INL - -#include "GDCore/Tools/MakeUnique.h" - -template -void ExtensionBase::AddRuntimeObject(gd::ObjectMetadata& object, - gd::String className) { -#if defined(GD_IDE_ONLY) - object.className = className; -#endif - runtimeObjectCreationFunctionTable[object.GetName()] = - [](RuntimeScene& scene, - const gd::Object& object) -> std::unique_ptr { - try { - const T& derivedObject = dynamic_cast(object); - return gd::make_unique(scene, derivedObject); - } catch (const std::bad_cast& e) { - std::cout - << "Tried to create a RuntimeObject from an invalid gd::Object: " - << std::endl; - std::cout << e.what() << std::endl; - } - - return std::unique_ptr(); - }; -} - -template -void ExtensionBase::AddRuntimeBehavior(gd::BehaviorMetadata& behavior, - gd::String className) { -#if defined(GD_IDE_ONLY) - behavior.className = className; -#endif - runtimeBehaviorCreationFunctionTable[behavior.GetName()] = - [](const gd::SerializerElement& behaviorContent) - -> std::unique_ptr { - return gd::make_unique(behaviorContent); - }; -} - -template -void ExtensionBase::AddBehaviorsRuntimeSharedData(gd::BehaviorMetadata& behavior) { - behaviorsRuntimeSharedDataCreationFunctionTable[behavior.GetName()] = - [](const gd::SerializerElement& behaviorSharedDataContent) - -> std::unique_ptr { - return gd::make_unique(behaviorSharedDataContent); - }; -} - -#endif diff --git a/GDCpp/GDCpp/IDE/BaseDebugger.cpp b/GDCpp/GDCpp/IDE/BaseDebugger.cpp deleted file mode 100644 index 7957ac63d..000000000 --- a/GDCpp/GDCpp/IDE/BaseDebugger.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) -#include "GDCpp/IDE/BaseDebugger.h" - -void BaseDebugger::Update() { - if (timeInterval.getElapsedTime().asMilliseconds() > - 200) // Update each 200 ms - { - UpdateGUI(); - timeInterval.restart(); - } -} -#endif diff --git a/GDCpp/GDCpp/IDE/BaseDebugger.h b/GDCpp/GDCpp/IDE/BaseDebugger.h deleted file mode 100644 index 5cf8394fc..000000000 --- a/GDCpp/GDCpp/IDE/BaseDebugger.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. - * This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) -#ifndef BASEDEBUGGER_H -#define BASEDEBUGGER_H -#include - -class RuntimeObject; - -/** - * \brief Internal base class to implement a debugger. - * Derive from this class and implement - * UpdateGUI function which be called - * automatically by the scene - */ -class GD_API BaseDebugger -{ - public: - BaseDebugger() {}; - virtual ~BaseDebugger() {}; - - /** - * Called at each frame by RuntimeScene - */ - void Update(); - - virtual void OnRuntimeObjectAdded(RuntimeObject * object) {}; - virtual void OnRuntimeObjectAboutToBeRemoved(RuntimeObject * object) {}; - - virtual void OnRuntimeObjectListFullRefresh() {}; - - protected: - private: - virtual void UpdateGUI() = 0; - - sf::Clock timeInterval; -}; - -#endif // BASEDEBUGGER_H -#endif diff --git a/GDCpp/GDCpp/IDE/BaseProfiler.cpp b/GDCpp/GDCpp/IDE/BaseProfiler.cpp deleted file mode 100644 index 8142db8d5..000000000 --- a/GDCpp/GDCpp/IDE/BaseProfiler.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#if defined(GD_IDE_ONLY) - -#include "BaseProfiler.h" - -/** - * Reset() only reset the profile clock, not the time registered. - */ -void ProfileLink::Reset() { profileClock.reset(); } - -/** - * Add the time of the profile clock to the total time. - */ -void ProfileLink::Stop() { time += profileClock.getTimeMicroseconds(); } - -BaseProfiler::BaseProfiler() - : profilingActivated(false), - lastEventsTime(0), - lastRenderingTime(0), - totalSceneTime(0), - totalEventsTime(0), - stepTime(50) { - // ctor -} - -void BaseProfiler::Update() { - if (stepClock.getElapsedTime().asMilliseconds() > stepTime) { - UpdateGUI(); - stepClock.restart(); - } -} - -void BaseProfiler::Reset() { - lastEventsTime = 0; - lastRenderingTime = 0; - totalSceneTime = 0; - totalEventsTime = 0; - - for (std::size_t i = 0; i < profileEventsInformation.size(); ++i) { - profileEventsInformation[i].time = 0; - } -} -#endif diff --git a/GDCpp/GDCpp/IDE/BaseProfiler.h b/GDCpp/GDCpp/IDE/BaseProfiler.h deleted file mode 100644 index 60192076d..000000000 --- a/GDCpp/GDCpp/IDE/BaseProfiler.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. - * This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) - -#ifndef BASEPROFILER_H -#define BASEPROFILER_H -#include -#include -#include -#include "GDCpp/Runtime/profile.h" -namespace gd { class BaseEvent; } - -/** - * \brief Internal class used as a link between compiled events code and events. - */ -class ProfileLink -{ -public: - ProfileLink() : time(0) {}; - - void Reset(); - void Stop(); - unsigned long int GetTime() const { return time; } - - btClock profileClock; - unsigned long int time; - std::weak_ptr originalEvent; -}; - -/** - * \brief Base class to create a profiler. - */ -class GD_API BaseProfiler -{ -public: - BaseProfiler(); - virtual ~BaseProfiler() {}; - - bool profilingActivated; ///< Set this to true so as to activate profiling. - - unsigned long int lastEventsTime; ///< Time used by events during the last frame - unsigned long int lastRenderingTime; ///< Time used by rendering during the last frame - unsigned long int totalSceneTime; ///< Total time used by events and rendering since the beginning. - unsigned long int totalEventsTime; ///< Total time used by events since the beginning. - - btClock eventsClock; ///< Used to compute time used by events during the frame - btClock renderingClock; ///< Used to compute time used by rendering during the frame - - std::vector profileEventsInformation; ///< Used by events generated code - - void Update(); - void Reset(); - -protected: - sf::Uint32 stepTime; ///< Time between each UpdateGUI, in milliseconds. - - /** - * Redefine this function so as to update GUI. - */ - virtual void UpdateGUI() = 0; -private: - sf::Clock stepClock; -}; - -#endif // BASEPROFILER_H -#endif - diff --git a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.cpp b/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.cpp deleted file mode 100644 index a3f6f1e44..000000000 --- a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "BehaviorsRuntimeSharedData.h" diff --git a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.h b/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.h deleted file mode 100644 index b69a78bba..000000000 --- a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedData.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef BEHAVIORSRUNTIMESHAREDDATAS_H -#define BEHAVIORSRUNTIMESHAREDDATAS_H - -namespace gd { -class BehaviorsSharedData; -class SerializerElement; -} -#include - -/** - * \brief Base class for defining behaviors shared datas used at runtime. - * - * Behaviors can use shared datas, as if they were extending the RuntimeScene - * members. - * - * \ingroup GameEngine - */ -class BehaviorsRuntimeSharedData { - public: - BehaviorsRuntimeSharedData(const gd::SerializerElement& behaviorSharedDataContent){}; - virtual ~BehaviorsRuntimeSharedData(){}; - virtual std::shared_ptr Clone() const { - return std::shared_ptr( - new BehaviorsRuntimeSharedData(*this)); - } -}; - -#endif // BEHAVIORSRUNTIMESHAREDDATAS_H diff --git a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.cpp b/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.cpp deleted file mode 100644 index ca19a0889..000000000 --- a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "BehaviorsRuntimeSharedDataHolder.h" -#include -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Runtime/BehaviorsRuntimeSharedData.h" -#include "GDCpp/Runtime/Project/BehaviorContent.h" - -const std::shared_ptr& -BehaviorsRuntimeSharedDataHolder::GetBehaviorSharedData( - const gd::String& behaviorName) const { - return behaviorsSharedDatas.find(behaviorName)->second; -} - -void BehaviorsRuntimeSharedDataHolder::LoadFrom( - const std::map>& - sharedData) { - behaviorsSharedDatas.clear(); - for (auto& it : sharedData) { - const gd::String& type = it.second->GetTypeName(); - const gd::String& name = it.second->GetName(); - - std::unique_ptr runtimeSharedData = - CppPlatform::Get().CreateBehaviorsRuntimeSharedData( - type, it.second->GetContent()); - - if (runtimeSharedData) - behaviorsSharedDatas[name] = std::move(runtimeSharedData); - else - std::cout << "ERROR: Unable to create shared data for behavior \"" << type - << "\"."; - } -} - -BehaviorsRuntimeSharedDataHolder::BehaviorsRuntimeSharedDataHolder( - const BehaviorsRuntimeSharedDataHolder& other) { - Init(other); -} - -BehaviorsRuntimeSharedDataHolder& BehaviorsRuntimeSharedDataHolder::operator=( - const BehaviorsRuntimeSharedDataHolder& other) { - if ((this) != &other) Init(other); - - return *this; -} - -void BehaviorsRuntimeSharedDataHolder::Init( - const BehaviorsRuntimeSharedDataHolder& other) { - behaviorsSharedDatas.clear(); - for (std::map>::const_iterator - it = other.behaviorsSharedDatas.begin(); - it != other.behaviorsSharedDatas.end(); - ++it) { - behaviorsSharedDatas[it->first] = it->second->Clone(); - } -} diff --git a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.h b/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.h deleted file mode 100644 index 5a4c23cf7..000000000 --- a/GDCpp/GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef BEHAVIORSRUNTIMESHAREDDATAS_HOLDER_H -#define BEHAVIORSRUNTIMESHAREDDATAS_HOLDER_H -#include -#include -#include -#include "GDCpp/Runtime/String.h" -class BehaviorsRuntimeSharedData; -namespace gd { -class BehaviorContent; -} - -/** - * \brief Contains all the shared data of the behaviors of a RuntimeScene. - */ -class GD_API BehaviorsRuntimeSharedDataHolder { - public: - BehaviorsRuntimeSharedDataHolder(){}; - BehaviorsRuntimeSharedDataHolder( - const BehaviorsRuntimeSharedDataHolder& other); - BehaviorsRuntimeSharedDataHolder& operator=( - const BehaviorsRuntimeSharedDataHolder& other); - - /** - * \brief Return the shared data for a behavior. - * \warning Be careful, no check is made to ensure that the shared data exist. - * \param name The name of the behavior for which shared data must be fetched. - */ - const std::shared_ptr& GetBehaviorSharedData( - const gd::String& behaviorName) const; - - /** - * \brief Create all runtime shared data according to the shared data content - * passed as argument. - */ - void LoadFrom( - const std::map>& - sharedData); - - private: - void Init(const BehaviorsRuntimeSharedDataHolder& other); - - std::map> - behaviorsSharedDatas; -}; - -#endif diff --git a/GDCpp/GDCpp/Runtime/CodeExecutionEngine.cpp b/GDCpp/GDCpp/Runtime/CodeExecutionEngine.cpp deleted file mode 100644 index 0cd983680..000000000 --- a/GDCpp/GDCpp/Runtime/CodeExecutionEngine.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "CodeExecutionEngine.h" -#include -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/RuntimeContext.h" -#include "GDCpp/Runtime/Tools/DynamicLibrariesTools.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/Tools/Log.h" -#endif - -CodeExecutionEngine::CodeExecutionEngine() - : runtimeContext(NULL), - loaded(false), - dynamicLibrary(NULL), - function(NULL) {} - -CodeExecutionEngine::~CodeExecutionEngine() { - if (loaded) Unload(); -} - -void CodeExecutionEngine::Unload() { - std::cout << "Unloaded compiled code" << dynamicLibrary << std::endl; - loaded = false; - - if (dynamicLibrary != NULL) gd::CloseLibrary(dynamicLibrary); - dynamicLibrary = NULL; - function = NULL; - dynamicLibraryFilename.clear(); - functionName.clear(); -} - -bool CodeExecutionEngine::LoadFromDynamicLibrary( - const gd::String &filename, const gd::String &mainFunctionName) { - if (loaded) Unload(); - - dynamicLibraryFilename = filename; - functionName = mainFunctionName; - - dynamicLibrary = gd::OpenLibrary(dynamicLibraryFilename.ToLocale().c_str()); - if (dynamicLibrary == NULL) { - std::cout << "ERROR: Unable to load " << dynamicLibraryFilename - << std::endl; - std::cout << "Full error message: " << gd::DynamicLibraryLastError() - << std::endl; - return false; - } - - function = gd::GetSymbol(dynamicLibrary, functionName.c_str()); - if (function == NULL) { - std::cout << "ERROR: Unable to find " << functionName << " in " - << dynamicLibraryFilename << std::endl; - std::cout << "(Dynamic library unloaded)" << std::endl; - std::cout << "Full error message: " << gd::DynamicLibraryLastError() - << std::endl; - - gd::CloseLibrary(dynamicLibrary); - dynamicLibrary = NULL; - return false; - } - - std::cout << "Loaded compiled code" << dynamicLibrary << std::endl; - loaded = true; - return true; -} - -bool CodeExecutionEngine::LoadFunction(functionType fn) { - if (loaded) Unload(); - - function = (void *)fn; - if (!function) { - std::cout << "ERROR: Unable to use the specified function for a code " - "execution engine." - << std::endl; - return false; - } - std::cout << "Loaded function" << function << std::endl; - - loaded = true; - return true; -} - -void CodeExecutionEngine::Init(const CodeExecutionEngine &other) { - runtimeContext = other.runtimeContext; - - if (loaded) Unload(); - if (other.Ready()) - LoadFromDynamicLibrary(other.dynamicLibraryFilename, other.functionName); -} diff --git a/GDCpp/GDCpp/Runtime/CodeExecutionEngine.h b/GDCpp/GDCpp/Runtime/CodeExecutionEngine.h deleted file mode 100644 index 5a63acb3f..000000000 --- a/GDCpp/GDCpp/Runtime/CodeExecutionEngine.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef CODEEXECUTIONENGINE_H -#define CODEEXECUTIONENGINE_H -#include -#include -#include "GDCpp/Runtime/RuntimeContext.h" -#include "GDCpp/Runtime/Tools/DynamicLibrariesTools.h" - -/** - * \brief Wrapper allowing to load a dynamic library and launch a specific -function. - * - * RuntimeScene uses this class to launch compiled events. In particular, the -signature of the function - * of the dynamic library must be : - \code -void functionName(RuntimeContext *); - \endcode - * - * \TODO: This class is unecessarily complicated. - * \see CodeCompilationHelpers - * \see CodeCompiler - * - * \ingroup CodeExecutionEngine - */ -class GD_API CodeExecutionEngine { - public: - typedef int (*functionType)(RuntimeContext*); - - /** - * Construct an empty engine. - */ - CodeExecutionEngine(); - - /** - * Create an engine from another: The new execution engine will load the same - * library as the source execution engine. - */ - CodeExecutionEngine(const CodeExecutionEngine& other) - : runtimeContext(other.runtimeContext) { - Init(other); - }; - - /** - * Create an engine from another: The new execution engine will load the same - * library as the source execution engine. - */ - CodeExecutionEngine& operator=(const CodeExecutionEngine& other) { - if ((this) != &other) Init(other); - return *this; - } - - /** - * Destructor: Unload if necessary the dynamic library. - */ - virtual ~CodeExecutionEngine(); - - /** - * Execute the loaded function. - */ - void Execute() { - if (Ready()) ((functionType)function)(&runtimeContext); - }; - - /** - * Return true if an initialization from a dynamic library has been made - * successfully and if Execute can be called. - */ - bool Ready() const { return loaded; }; - - /** - * Unload the dynamic library from memory. - * - * \warning Of course, Execute() can not be called after Unload() is called. - */ - void Unload(); - - /** - * Initialize the engine from a dynamic library, which is kept loaded in - * memory. - * - * \param filename The dynamic library to be loaded - * \param mainFunctionName The name of the function to be executed when - * Execute() is called. The function signature must be void - * functionName(RuntimeContext *); - * - * \return true if the CodeExecutionEngine is successfully initialized and - * Execute() can be called. - */ - bool LoadFromDynamicLibrary(const gd::String& filename, - const gd::String& mainFunctionName); - - bool LoadFunction(functionType fn); - - RuntimeContext runtimeContext; ///< The object passed as parameter to the - ///< function of the dynamic library. - - private: - bool loaded; ///< True if a dynamic library is loaded and a function is ready - ///< to be executed. - gd::String dynamicLibraryFilename; ///< The filename of the dynamic library - ///< loaded in memory. - Handle dynamicLibrary; ///< The dynamic library loaded in memory. - gd::String functionName; ///< The name of the function of the dynamic library - ///< to be executed. - void* function; ///< Pointer to function to be executed. - - void Init(const CodeExecutionEngine& other); -}; - -#endif // CODEEXECUTIONENGINE_H diff --git a/GDCpp/GDCpp/Runtime/Collisions.cpp b/GDCpp/GDCpp/Runtime/Collisions.cpp deleted file mode 100644 index 2e2a1e354..000000000 --- a/GDCpp/GDCpp/Runtime/Collisions.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/Collisions.h" -#include -#include "GDCore/Extensions/Builtin/SpriteExtension/Sprite.h" -#include "GDCore/Project/ImageManager.h" -#include "GDCpp/Runtime/RuntimeSpriteObject.h" - -bool PixelPerfectTest(const sf::Sprite& object1, - const sf::Sprite& object2, - sf::Uint8 AlphaLimit, - const sf::Image& object1CollisionMask, - const sf::Image& object2CollisionMask) { - sf::FloatRect intersection; - if (object1.getGlobalBounds().intersects(object2.getGlobalBounds(), - intersection)) { - // We've got an intersection we need to process the pixels - // in that Rect. - - // Bail out now if AlphaLimit = 0 - if (AlphaLimit == 0) return true; - - // There are a few hacks here, sometimes the TransformToLocal returns - // negative points Or Points outside the image. We need to check for these - // as they print to the error console which is slow, and then return black - // which registers as a hit. - - sf::Vector2f o1v; - sf::Vector2f o2v; - // Loop through our pixels - for (int i = intersection.left; i < intersection.left + intersection.width; - i++) // 4ian : Rect now uses width/height. - { - for (int j = intersection.top; j < intersection.top + intersection.height; - j++) // 4ian : Rect now uses width/height. - { - o1v = object1.getInverseTransform().transformPoint( - i, j); // Creating objects each loop :( - o2v = object2.getInverseTransform().transformPoint(i, j); - - // Hack to make sure pixels fall within the Sprite's Image - if (o1v.x > 0 && o1v.y > 0 && o2v.x > 0 && o2v.y > 0 && - o1v.x < object1CollisionMask.getSize().x && - o1v.y < object1CollisionMask.getSize().y && - o2v.x < object2CollisionMask.getSize().x && - o2v.y < object2CollisionMask.getSize().y) { - // If both sprites have opaque pixels at the same point we've got a - // hit - if ((object1CollisionMask - .getPixel(static_cast(o1v.x), static_cast(o1v.y)) - .a > AlphaLimit) && - (object2CollisionMask - .getPixel(static_cast(o2v.x), static_cast(o2v.y)) - .a > AlphaLimit)) { - return true; - } - } - } - } - return false; - } - return false; -} - -/** - * Check for collision between two sprite objects - */ -bool GD_API CheckCollision(const RuntimeSpriteObject* const objet1, - const RuntimeSpriteObject* const objet2) { - return PixelPerfectTest(objet1->GetCurrentSFMLSprite(), - objet2->GetCurrentSFMLSprite(), - 1, - objet1->GetCurrentSprite().GetSFMLTexture()->image, - objet2->GetCurrentSprite().GetSFMLTexture()->image); -} diff --git a/GDCpp/GDCpp/Runtime/Collisions.h b/GDCpp/GDCpp/Runtime/Collisions.h deleted file mode 100644 index 99dae268a..000000000 --- a/GDCpp/GDCpp/Runtime/Collisions.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef COLLISIONS_H_INCLUDED -#define COLLISIONS_H_INCLUDED -#include "GDCpp/Runtime/RuntimeSpriteObject.h" - -/** - * \brief Pixel perfect collision test between two sprite objects - * Alpha transparency, rotation and zooms are taken into account. - * - * \return true if the sprite are overlapping - * - * \ingroup GameEngine - * \ingroup SpriteObjectExtension - */ -bool GD_API CheckCollision(const RuntimeSpriteObject* const objet1, - const RuntimeSpriteObject* const objet2); - -#endif // COLLISIONS_H_INCLUDED diff --git a/GDCpp/GDCpp/Runtime/CommonTools.h b/GDCpp/GDCpp/Runtime/CommonTools.h deleted file mode 100644 index c7b2309c9..000000000 --- a/GDCpp/GDCpp/Runtime/CommonTools.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef GDCPP_COMMONTOOLS_H_INCLUDED -#define GDCPP_COMMONTOOLS_H_INCLUDED -#include -#include -#include -#include -#include "GDCpp/Runtime/String.h" - -/** - * \brief Functor testing if a gd::String is empty - * - * Usage example: - * \code - * //Remove all empty strings from a std::vector. - * myVector.erase(std::remove_if(myVector.begin(), myVector.end(), - * StringEmpty()), myVector.end()); \endcode - * - * \ingroup CommonProgrammingTools - */ -struct StringEmpty { - bool operator()(const gd::String& a) const { return a.empty(); } -}; - -#ifdef __GNUC__ -/** - * Round the number to the nearest integer - * \ingroup CommonProgrammingTools - */ -inline int GDRound(float x) { return round(x); } -#else -/** - * Round the number to the nearest integer - * \ingroup CommonProgrammingTools - */ -inline double GDRound(double d) { - return (d >= 0 ? floor(d + 0.5) : ceil(d - 0.5)); -} -#endif - -#endif // GDCPP_COMMONTOOLS_H_INCLUDED diff --git a/GDCpp/GDCpp/Runtime/DatFile.cpp b/GDCpp/GDCpp/Runtime/DatFile.cpp deleted file mode 100644 index 1c59b49f3..000000000 --- a/GDCpp/GDCpp/Runtime/DatFile.cpp +++ /dev/null @@ -1,202 +0,0 @@ - -#include "GDCpp/Runtime/DatFile.h" - -#include -#include -#include -#include -#include "GDCpp/Runtime/Tools/FileStream.h" - -DatFile::DatFile(void) { m_buffer = NULL; } - -DatFile::~DatFile(void) { - if (m_buffer != NULL) delete[] m_buffer; -} -bool DatFile::Create(std::vector files, - gd::String directory, - gd::String destination) { - // An file entry in order to push it in the object's std::vector - sFileEntry entry; - // An input file stream to read each file included - gd::FileStream file; - // An output file stream to write our DAT file - gd::FileStream datfile; - // The buffer used to read/write the DAT file - char buffer[1]; - - // DATHeader - // We start by filling it with 0 - memset(&m_header, 0, sizeof(m_header)); - // Then we copy the ID - memcpy(m_header.uniqueID, "EXEGD", 5); // EXEcutable GDevelop - // Then the version - memcpy(m_header.version, "0.1", 3); - // Then the number of files to include - m_header.nb_files = files.size(); - - // Next, we open each file in orderto create the File Entries Table - for (std::size_t i = 0; i < files.size(); i++) { - gd::String fileToOpen = directory + "/" + files[i]; - file.open(fileToOpen, std::ios_base::in | std::ios_base::binary); - if (file.is_open()) { - // Filling the FileEntry with 0 - memset(&entry, 0, sizeof(sFileEntry)); - // We keep the file name - memcpy(entry.name, files[i].c_str(), strlen(files[i].c_str())); - // We calculate its size - file.seekg(0, std::ios::end); - entry.size = file.tellg(); - // Since we don't know exactly its final position in the DAT file, let's - // use 0 - entry.offset = 0; - // We finished with this file - file.close(); - - // Finally, we add this File Entry in our std::vector - m_entries.push_back(entry); - } else { - // Simple error track - std::cout << "File " << files[i] << " raise an error." << std::endl; - return (false); - } - } - - // Now, we know everything about our files, we can update offsets - long actual_offset = 0; - actual_offset += sizeof(sDATHeader); - actual_offset += m_header.nb_files * sizeof(sFileEntry); - for (std::size_t i = 0; i < m_entries.size(); i++) { - m_entries[i].offset = actual_offset; - actual_offset += m_entries[i].size; - } - - // And finally, we are writing the DAT file - datfile.open(destination, std::ios_base::out | std::ios_base::binary); - - // First, we write the header - datfile.write((char*)&m_header, sizeof(sDATHeader)); - - // Then, the File Entries Table - for (std::size_t i = 0; i < m_entries.size(); i++) { - datfile.write((char*)&m_entries[i], sizeof(sFileEntry)); - } - - // Finally, we write each file - for (std::size_t i = 0; i < m_entries.size(); i++) { - gd::String fileToOpen = directory + "/" + files[i]; - file.open(fileToOpen, std::ios_base::in | std::ios_base::binary); - if (file.is_open()) { - file.seekg(0, std::ios::beg); - datfile << file.rdbuf(); - file.close(); - } - } - // And it's finished - datfile.close(); - return true; -} - -/** - * Load the DatFile from a file. Return true on success - */ -bool DatFile::Read(gd::String source) { - bool success = false; - - // The input file stream from which we want informations - gd::FileStream datfile; - // A file entry in order to push it in the object's std::vector - sFileEntry entry; - - // Filling the header with 0 - memset(&m_header, 0, sizeof(m_header)); - // We open the DAT file to read it - datfile.open(source, std::ios_base::in | std::ios_base::binary); - if (datfile.is_open()) { - // Getting to the Header position - datfile.seekg(0, std::ios::beg); - // Reading the DAT Header - datfile.read((char*)&m_header, sizeof(sDATHeader)); - // Next we are reading each file entry - for (std::size_t i = 0; i < m_header.nb_files; i++) { - // Reading a File Entry - datfile.read((char*)&entry, sizeof(sFileEntry)); - // Pushing it in our std::vector - m_entries.push_back(entry); - } - // Since all seems ok, we keep the DAT file name - m_datfile = source; - success = true; - } - // Closing the DAT file - datfile.close(); - return success; -} - -//////////////////////////////////////////////////////////// -/// Check if the DatFile contains a file -//////////////////////////////////////////////////////////// -bool DatFile::ContainsFile(const gd::String& filename) { - if (m_header.nb_files != m_entries.size()) return false; - - for (std::size_t i = 0; i < m_header.nb_files; i++) { - if (gd::String(m_entries[i].name) == filename) return true; - } - - return false; -} - -char* DatFile::GetFile(gd::String filename) { - // The input file stream from which we want information - gd::FileStream datfile; - - // Cleaning properly an ancient file loaded - if (m_buffer != NULL) { - delete[] m_buffer; - m_buffer = NULL; - } - - // First, we have to find the file needed - for (std::size_t i = 0; i < m_header.nb_files; i++) { - // If we found it - if (gd::String(m_entries[i].name) == filename) { - // We are allocating memory to the buffer - m_buffer = new char[(m_entries[i].size)]; - // Simple error catch - if (m_buffer == NULL) { - cout << "Unable to allocate a buffer of length " << (m_entries[i].size) - << " when loading " << filename << endl; - return (NULL); - } - - // Opening the DAT file ot read the file datas needed - datfile.open(m_datfile, std::ios_base::in | std::ios_base::binary); - if (datfile.is_open()) { - // Going to the right position - datfile.seekg(m_entries[i].offset, std::ios::beg); - // Reading - datfile.read(m_buffer, m_entries[i].size); - // We can close the DAT file - datfile.close(); - // Returning the buffer - cout << "Successfully loaded " << filename << endl; - return (m_buffer); - } - cout << "Unable to open file " << m_datfile << " when loading " - << filename << endl; - } - } - // Finally, there is no such file in our DAT file - return (NULL); -} - -long int DatFile::GetFileSize(gd::String filename) { - // First, we have to find the file needed - for (std::size_t i = 0; i < m_header.nb_files; i++) { - // If we found it - if (gd::String(m_entries[i].name) == filename) { - // Returning the size of the file found - return (m_entries[i].size); - } - } - return (0); -} diff --git a/GDCpp/GDCpp/Runtime/DatFile.h b/GDCpp/GDCpp/Runtime/DatFile.h deleted file mode 100644 index cef5466cd..000000000 --- a/GDCpp/GDCpp/Runtime/DatFile.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * \file - * Adapted from the article http://www.sfml-dev.org/wiki/en/tutorials/formatdat - * which is itself inspired from - * archive.gamedev.net/archive/reference/programming/features/pak/index.html - */ - -#ifndef DATFILE_H -#define DATFILE_H - -#include -#include -#include "GDCpp/Runtime/String.h" - -using namespace std; - -/** - * \brief Internal class related to DatFile - * - * \ingroup ResourcesManagement - */ -struct sDATHeader { - char uniqueID[5]; /// Unique ID used to know if this file is a DAT File from - /// this class - char version[3]; /// Version of the DAT file format - unsigned int nb_files; /// Number of files in the DAT file -}; - -/** - * \brief Internal class related to DatFile - * - * \ingroup ResourcesManagement - */ -struct sFileEntry { - char name[1024]; /// Name of the data file - long size; /// Size of the data file - long offset; /// Offset, in the DAT file where the file is -}; - -/** - * \brief Internal class used to create and access "DAT files". - * - * \ingroup ResourcesManagement - */ -class GD_API DatFile { - private: - gd::String m_datfile; /// name of the DAT file - sDATHeader m_header; /// file header - std::vector m_entries; /// vector of files entries - char* m_buffer; /// Buffer pointing on a file in memory - public: - DatFile(void); - ~DatFile(void); - bool Create(std::vector files, - gd::String directory, - gd::String destination); - bool ContainsFile(const gd::String& filename); - bool Read(gd::String source); - char* GetFile(gd::String filename); - long int GetFileSize(gd::String filename); -}; - -#endif // DATFILE_H diff --git a/GDCpp/GDCpp/Runtime/DocMainPage.h b/GDCpp/GDCpp/Runtime/DocMainPage.h deleted file mode 100644 index ff0e9126a..000000000 --- a/GDCpp/GDCpp/Runtime/DocMainPage.h +++ /dev/null @@ -1,266 +0,0 @@ -/** - * \mainpage GDevelop C++ Platform - * \image html gdlogo.png - * \section welcome Welcome - * This is the help file for the GDevelop C++ Platform, which contains a - * reference of all the features provided by the C++ Platform and explains how - * to create extensions for this platform.
To create new extensions, you - * should have some basic knowledge of C++. - * - * ### GDevelop Core documentation - * Some classes and features are provided by the *GDevelop Core library*: When - * you're working with a class in the gd namespace, read the - * [GDCore documentation here](../GDCore Documentation/index.html). - * - * \section gettingstarted Getting started - * Please refer to the getting started guide in the [GDCore - * documentation](../GDCore Documentation/index.html).
You can then read the - * \subpage overviewOfGDCpp. - */ - -/** - * \page overviewOfGDCpp Overview of the C++ Platform - * - * \section gameEngine Some important classes from the game engine - * - * \subsection runtimeScene RuntimeScene - * - * When a game is played, a RuntimeScene is used to represent a scene. A - RuntimeScene contains the objects instances or functions for rendering the - scene in a window. - * - * \subsection runtimeObject RuntimeObject - * - * RuntimeObject is used as a base class for all objects. It defines some common - properties like position, angle, size or visibility of an object. - * - * \section storageAndIdeClasses Some important classes used by the IDE or for - storage - * - * The C++ platform also make uses of some classes provide by GDevelop Core: - These classes are in the namespace gd.
- *
- * It is important to make the distinction between the classes used by the IDE - or for storage only and the classes used by the game engine.
- * When a game is being played, it is first loaded using the classes listed - below. Then, in a second part, the game engine classes are initialized, most - * of the time using their edittime class counterpart (For example, a - RuntimeScene is loaded from a gd::Layout: see below).
- *
- * Edittime is often used to refer to a class being used for storage or - by the IDE, while Runtime is used to refer to the class - * belonging to the game engine. - * - * \subsection game gd::Project (also named Game) - * A game is represented by a gd::Project class. This class contains the scenes - of the game (see below), as well as the images, the global objects and some - game properties.
- * When a game is played, the RuntimeScene being rendered contains a pointer to - its parent gd::Project. - * - * \subsection scene gd::Layout - * - * A scene is called a layout in GDevelop Core. It is used only for - storage or by the IDE: It contains the objects and the initial instances - * of a scene. gd::Layout classes representing the scenes of a game are stored - inside a gd::Project.
- * RuntimeScene are not stored inside a gd::Project. RuntimeScene is a - runtime class used only by the game engine. - * - * \subsection object gd::Object - * Objects are represented by the gd::Object class. Again, this class is used - only for the storage or by the IDE: When a game is played, RuntimeObject - * is used.
- * - * \subsection behavior gd::Behavior - - * Each behavior is an instance of a class that derive from gd::Behavior. - Behaviors are linked to an object (thus, behaviors can access to their object - by using their member `object`) and they are also managed by this object.
- * gd::Behavior is the only exception to the rule explained below: Whereas the - classes described in this section are used only for storage, this class - * is used both for storage and by the game engine. - * - * \subsection event gd::BaseEvent - * BaseEvent is the base class for all events.
- * Each event type is represented by a class, which define how the event is - rendered (BaseEvent::Render), how the code is generated - (BaseEvent::GenerateEventCode), and various properties - (BaseEvent::CanHaveSubEvents for example)...
- * As the other classes list in this section, this class is only at - edittime used by the IDE. - * - * The classes described in this section are not documented here: please refer - to the documentation of GDevelop Core if you need help using them. - * - * \section aboutShared_ptr About shared pointers - * - * GDevelop use shared pointers (`std::shared_ptr`), for managing lots of - objects like scenes or objects. - * - * Shared pointers are used like raw pointers (`*myPointer` to dereference the - pointer and get the object, `myPointer->myMember` to access to a - function/member of the object...). - * They don't need to be deleted manually: The pointed object is deleted when no - more shared pointers are pointing to the object. - * For instance, scenes don't have to manually delete the objects they own in - their destructors. - * - * \section utf8section UTF8 strings - * - * GDevelop uses UTF8 encoded gd::String as string parameters passed to - actions/conditions and expressions and as return value for string expressions. - * This class is a wrapper around std::string and is UTF8-aware. - * - * For more information, see [gd::String](../GDCore - Documentation/classgd_1_1_string.html) reference in the [GDCore - documentation](../GDCore Documentation/index.html). - */ - -// Group definitions: -/** - * \defgroup GameEngine Game engine - */ - -/** - * \defgroup SoundEngine Sound engine - * \ingroup GameEngine - */ - -/** - * \defgroup ResourcesManagement Resources management - * \ingroup GameEngine - */ - -/** - * \defgroup CommonProgrammingTools Common programming tools - */ - -/** - * \defgroup Tools Tools classes - */ - -/** - * \defgroup BuiltinExtensions Standard GDevelop extensions - */ - -/** - * \defgroup SpriteObjectExtension Standard Sprite Object extension - * \ingroup BuiltinExtensions - */ - -/** - * \defgroup FileExtension Standard File extension - * \ingroup BuiltinExtensions - */ - -/** - * \defgroup TinyXml Integrated TinyXml library - */ - -// Some classes documentation: -/** - * \class AES - * \brief AES encryption algorithm - * - * Implementation of the AES encryption algorithm under the zlib-png licence by - * Chris Lomont.
See the header file for more information about its usage. - * - * \ingroup Tools - */ - -/** - * \class MD5 - * \brief MD5 hash algorithm - * - * Implementation of the MD5 encryption algorithm.
- * See the header file for more information about its usage. - * - * \ingroup Tools - */ - -/** - * \class TiXmlAttribute - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlAttributeSet - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlBase - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlComment - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlCursor - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlDeclaration - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlDocument - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlElement - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlHandle - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlNode - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlOutStream - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlParsingData - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlPrinter - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlString - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlText - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlUnknown - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ -/** - * \class TiXmlVisitor - * \brief Part of the tinyxml library - * \ingroup TinyXml - */ diff --git a/GDCpp/GDCpp/Runtime/EventsPrecompiledHeader.h b/GDCpp/GDCpp/Runtime/EventsPrecompiledHeader.h deleted file mode 100644 index a8bada6f7..000000000 --- a/GDCpp/GDCpp/Runtime/EventsPrecompiledHeader.h +++ /dev/null @@ -1,14 +0,0 @@ -// This file contains some common includes and is automatically used for each -// source file compiled within GDevelop -#include -#include -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/RuntimeContext.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/SourceFileCommonTools.h" -#include "GDCpp/Runtime/String.h" diff --git a/GDCpp/GDCpp/Runtime/ExtensionsLoader.cpp b/GDCpp/GDCpp/Runtime/ExtensionsLoader.cpp deleted file mode 100644 index 12a7787ce..000000000 --- a/GDCpp/GDCpp/Runtime/ExtensionsLoader.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/IDE/ExtensionsLoader.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/ExtensionsLoader.h b/GDCpp/GDCpp/Runtime/ExtensionsLoader.h deleted file mode 100644 index 6c5057756..000000000 --- a/GDCpp/GDCpp/Runtime/ExtensionsLoader.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/IDE/ExtensionsLoader.h" diff --git a/GDCpp/GDCpp/Runtime/FontManager.cpp b/GDCpp/GDCpp/Runtime/FontManager.cpp deleted file mode 100644 index b67e625a6..000000000 --- a/GDCpp/GDCpp/Runtime/FontManager.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "GDCpp/Runtime/FontManager.h" -#include -#include -#include -#include - -using namespace std; - -FontManager *FontManager::_singleton = NULL; - -FontManager::~FontManager() { UnloadAllFonts(); } - -void FontManager::UnloadAllFonts() { - // Need to explicit delete fonts... - for (auto it = fonts.begin(); it != fonts.end(); ++it) { - if ((*it).second) delete (*it).second; - } - //...and their buffers - for (auto it = fontsBuffer.begin(); it != fontsBuffer.end(); ++it) { - if ((*it).second) delete (*it).second; - } - - fonts.clear(); - fontsBuffer.clear(); - if (defaultFont) delete defaultFont; - defaultFont = nullptr; -} - -void FontManager::EnsureDefaultFontIsLoaded() { - if (!defaultFont) { - static const unsigned char data[] = { -#include "GDCpp/Runtime/Liberation.hpp" - }; - - defaultFont = new sf::Font; - if (!defaultFont->loadFromMemory(data, sizeof(data))) - std::cout << "ERROR: Failed to load the default font!" << std::endl; - else - std::cout << "Loaded default font" << std::endl; - } -} - -const sf::Font *FontManager::GetFont(const gd::String &fontName) { - // Use default font if no font is specified - if (fontName.empty()) { - EnsureDefaultFontIsLoaded(); - return defaultFont; - } - - // Find an already loaded font - if (fonts.find(fontName) != fonts.end()) return fonts[fontName]; - - // Load an new font - gd::ResourcesLoader *ressourcesLoader = gd::ResourcesLoader::Get(); - std::pair font = - ressourcesLoader->LoadFont(fontName); - if (font.first) { - if (font.second) // Store the buffer if any. - fontsBuffer[fontName] = font.second; - - fonts[fontName] = font.first; - return font.first; - } - - // Loading failed: Fall back to the default font. - EnsureDefaultFontIsLoaded(); - return defaultFont; -} - -void FontManager::DestroySingleton() { - if (NULL != _singleton) { - delete _singleton; - _singleton = NULL; - } -} diff --git a/GDCpp/GDCpp/Runtime/FontManager.h b/GDCpp/GDCpp/Runtime/FontManager.h deleted file mode 100644 index 23035db4a..000000000 --- a/GDCpp/GDCpp/Runtime/FontManager.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef FONTMANAGER_H -#define FONTMANAGER_H -#include -#include -#include -#include "GDCpp/Runtime/ResourcesLoader.h" -#include "GDCpp/Runtime/String.h" - -/** - * \brief FontManager loads and manages SFML fonts. - * - * \ingroup ResourcesManagement - */ -class GD_API FontManager { - public: - /** - * \brief Return a pointer to an SFML font. - * - * The font is stored in the font manager. - * - * Example : - * \code - * sfmlText.SetFont(*fontManager->GetFont(fontName)); - * \endcode - */ - const sf::Font* GetFont(const gd::String& fontName); - - /** - * \brief Unload all fonts from memory - */ - void UnloadAllFonts(); - - /** - * \brief Return a pointer to the global singleton class - */ - static FontManager* Get() { - if (NULL == _singleton) { - _singleton = new FontManager; - } - - return (static_cast(_singleton)); - } - - /** - * \brief Destroy the global singleton class. - */ - static void DestroySingleton(); - - private: - void EnsureDefaultFontIsLoaded(); - - std::map fonts; ///< The font being loaded. - std::map - fontsBuffer; ///< The buffer associated to each font, if any. - sf::Font* defaultFont; ///< The default font used when no font is specified. - ///< Initialized at first use. - - FontManager() : defaultFont(NULL){}; - virtual ~FontManager(); - - static FontManager* _singleton; -}; - -#endif // FONTMANAGER_H diff --git a/GDCpp/GDCpp/Runtime/Force.cpp b/GDCpp/GDCpp/Runtime/Force.cpp deleted file mode 100644 index c53944bc7..000000000 --- a/GDCpp/GDCpp/Runtime/Force.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCpp/Runtime/Force.h" -#include -#include -#include -#include -#include "GDCpp/Runtime/Log.h" - -float const Force::PI = 3.14159265; - -Force::Force() : x(0), y(0), angle(0), length(0), clearing(0), isDirty(false) {} - -Force::Force(const Force& other) - : x(other.x), - y(other.y), - angle(other.angle), - length(other.length), - clearing(other.clearing), - isDirty(other.isDirty) {} - -Force::Force(float x_, float y_, float clearing_) - : x(x_), y(y_), clearing(clearing_), isDirty(true) {} - -float Force::GetAngle() const { - if (isDirty) { - angle = atan2(y, x) * 180.0 / PI; - length = sqrt(x * x + y * y); - isDirty = false; - } - - return angle; -} -float Force::GetLength() const { - if (isDirty) { - angle = atan2(y, x) * 180.0 / PI; - length = sqrt(x * x + y * y); - isDirty = false; - } - - return length; -} - -void Force::SetX(float x_) { - if (x != x_) { - isDirty = true; - x = x_; - } -} -void Force::SetY(float y_) { - if (y != y_) { - isDirty = true; - y = y_; - } -} -void Force::SetAngle(float angle_) { - if (isDirty) { - length = sqrt(x * x + y * y); - isDirty = false; - } - - angle = angle_; - - x = cos(angle / 180.0 * PI) * length; - y = sin(angle / 180.0 * PI) * length; -} -void Force::SetLength(float length_) { - if (isDirty) { - angle = atan2(y, x) * 180 / PI; - isDirty = false; - } - - length = length_; - - x = cos(angle / 180.0 * PI) * length; - y = sin(angle / 180.0 * PI) * length; -} -void Force::SetClearing(float clearing_) { clearing = clearing_; } diff --git a/GDCpp/GDCpp/Runtime/Force.h b/GDCpp/GDCpp/Runtime/Force.h deleted file mode 100644 index d8c051c63..000000000 --- a/GDCpp/GDCpp/Runtime/Force.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef FORCE_H_INCLUDED -#define FORCE_H_INCLUDED - -/** - * \brief Represents a force to be applied on an object. - * - * \ingroup GameEngine - */ -class GD_API Force { - public: - Force(); - Force(const Force& other); - Force(float x, float y, float clearing); - - float GetX() const { return x; }; - float GetY() const { return y; }; - float GetAngle() const; - float GetLength() const; - float GetClearing() const { return clearing; }; - - void SetX(float x_); - void SetY(float y_); - void SetAngle(float angle_); - void SetLength(float length_); - void SetClearing(float clearing_); - - private: - float x; - float y; - mutable float angle; - mutable float length; - float clearing; - - mutable bool isDirty; - - static const float PI; -}; - -#endif // FORCE_H_INCLUDED diff --git a/GDCpp/GDCpp/Runtime/ImageManager.cpp b/GDCpp/GDCpp/Runtime/ImageManager.cpp deleted file mode 100644 index eaa0c88ac..000000000 --- a/GDCpp/GDCpp/Runtime/ImageManager.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/ImageManager.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/ImageManager.h b/GDCpp/GDCpp/Runtime/ImageManager.h deleted file mode 100644 index 9090b417d..000000000 --- a/GDCpp/GDCpp/Runtime/ImageManager.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/ImageManager.h" diff --git a/GDCpp/GDCpp/Runtime/InputManager.cpp b/GDCpp/GDCpp/Runtime/InputManager.cpp deleted file mode 100644 index 6123913a2..000000000 --- a/GDCpp/GDCpp/Runtime/InputManager.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "InputManager.h" - -InputManager::InputManager(sf::Window* win) - : window(win), - lastPressedKey(0), - keyWasPressed(false), - touchSimulateMouse(true), - mouseWheelDelta(0), - windowHasFocus(true), - disableInputWhenNotFocused(true) {} - -void InputManager::SimulateMousePressed(sf::Vector2i pos) { - mousePosition = pos; - buttonsPressed["Left"] = true; -} - -void InputManager::NextFrame() { - keyWasPressed = false; - charactersEntered.clear(); - - oldKeysPressed = keysPressed; - keysPressed.clear(); - const auto& keyMap = GetKeyNameToSfKeyMap(); - for (auto it = keyMap.begin(); it != keyMap.end(); ++it) { - keysPressed[it->first] = - sf::Keyboard::isKeyPressed(static_cast(it->second)); - } - - mouseWheelDelta = 0; - oldButtonsPressed = buttonsPressed; - buttonsPressed.clear(); - const auto& buttonMap = GetButtonNameToSfButtonMap(); - for (auto it = buttonMap.begin(); it != buttonMap.end(); ++it) { - buttonsPressed[it->first] = - sf::Mouse::isButtonPressed(static_cast(it->second)); - } - - if (window) mousePosition = sf::Mouse::getPosition(*window); - if (touchSimulateMouse && !touches.empty()) - SimulateMousePressed(touches.begin()->second); -} - -void InputManager::HandleEvent(sf::Event& event) { - if (event.type == sf::Event::KeyPressed) { - if (!windowHasFocus && disableInputWhenNotFocused) return; - - lastPressedKey = event.key.code; - keyWasPressed = true; - } else if (event.type == sf::Event::TextEntered) { - if (!windowHasFocus && disableInputWhenNotFocused) return; - - charactersEntered.push_back(event.text.unicode); - } else if (event.type == sf::Event::MouseWheelMoved) - mouseWheelDelta = event.mouseWheel.delta; - else if (event.type == sf::Event::TouchBegan || - event.type == sf::Event::TouchMoved) { - touches[event.touch.finger] = sf::Vector2i(event.touch.x, event.touch.y); - if (touchSimulateMouse) SimulateMousePressed(touches[event.touch.finger]); - } else if (event.type == sf::Event::TouchEnded) { - touches.erase(event.touch.finger); - } else if (event.type == sf::Event::GainedFocus) - windowHasFocus = true; - else if (event.type == sf::Event::LostFocus) - windowHasFocus = false; -} - -bool InputManager::IsKeyPressed(gd::String key) const { - if (!windowHasFocus && disableInputWhenNotFocused) return false; - - return keysPressed.find(key) != keysPressed.end() && - keysPressed.find(key)->second; -} - -bool InputManager::WasKeyReleased(gd::String key) const { - return oldKeysPressed.find(key) != oldKeysPressed.end() && - oldKeysPressed.find(key)->second && !IsKeyPressed(key); -} - -gd::String InputManager::GetLastPressedKey() const { - const auto& keyMap = GetSfKeyToKeyNameMap(); - auto it = keyMap.find(lastPressedKey); - if (it != keyMap.end()) return it->second; - - return ""; -} - -bool InputManager::AnyKeyIsPressed() const { - if (!windowHasFocus && disableInputWhenNotFocused) return false; - - return keyWasPressed; -} - -sf::Vector2i InputManager::GetMousePosition() const { return mousePosition; } - -bool InputManager::IsMouseButtonPressed(const gd::String& button) const { - if (!windowHasFocus && disableInputWhenNotFocused) return false; - - return buttonsPressed.find(button) != buttonsPressed.end() && - buttonsPressed.find(button)->second; -} - -bool InputManager::IsMouseButtonReleased(const gd::String& button) const { - return oldButtonsPressed.find(button) != oldButtonsPressed.end() && - oldButtonsPressed.find(button)->second && - !IsMouseButtonPressed(button); -} - -int InputManager::GetMouseWheelDelta() const { - if (!windowHasFocus && disableInputWhenNotFocused) return 0; - - return mouseWheelDelta; -} - -bool InputManager::IsScrollingUp() const { - if (!windowHasFocus && disableInputWhenNotFocused) return false; - - return mouseWheelDelta > 0; -} - -bool InputManager::IsScrollingDown() const { - if (!windowHasFocus && disableInputWhenNotFocused) return false; - - return mouseWheelDelta < 0; -} - -const std::map& InputManager::GetKeyNameToSfKeyMap() { - static bool initialized = false; - static std::map* map = new std::map(); - if (!initialized) { - (*map)["a"] = sf::Keyboard::A; - (*map)["b"] = sf::Keyboard::B; - (*map)["c"] = sf::Keyboard::C; - (*map)["d"] = sf::Keyboard::D; - (*map)["e"] = sf::Keyboard::E; - (*map)["f"] = sf::Keyboard::F; - (*map)["g"] = sf::Keyboard::G; - (*map)["h"] = sf::Keyboard::H; - (*map)["i"] = sf::Keyboard::I; - (*map)["j"] = sf::Keyboard::J; - (*map)["k"] = sf::Keyboard::K; - (*map)["l"] = sf::Keyboard::L; - (*map)["m"] = sf::Keyboard::M; - (*map)["n"] = sf::Keyboard::N; - (*map)["o"] = sf::Keyboard::O; - (*map)["p"] = sf::Keyboard::P; - (*map)["q"] = sf::Keyboard::Q; - (*map)["r"] = sf::Keyboard::R; - (*map)["s"] = sf::Keyboard::S; - (*map)["t"] = sf::Keyboard::T; - (*map)["u"] = sf::Keyboard::U; - (*map)["v"] = sf::Keyboard::V; - (*map)["w"] = sf::Keyboard::W; - (*map)["x"] = sf::Keyboard::X; - (*map)["y"] = sf::Keyboard::Y; - (*map)["z"] = sf::Keyboard::Z; - - (*map)["Num9"] = sf::Keyboard::Num9; - (*map)["Num8"] = sf::Keyboard::Num8; - (*map)["Num7"] = sf::Keyboard::Num7; - (*map)["Num6"] = sf::Keyboard::Num6; - (*map)["Num5"] = sf::Keyboard::Num5; - (*map)["Num4"] = sf::Keyboard::Num4; - (*map)["Num3"] = sf::Keyboard::Num3; - (*map)["Num2"] = sf::Keyboard::Num2; - (*map)["Num1"] = sf::Keyboard::Num1; - (*map)["Num0"] = sf::Keyboard::Num0; - - (*map)["Escape"] = sf::Keyboard::Escape; - (*map)["RControl"] = sf::Keyboard::RControl; - (*map)["RShift"] = sf::Keyboard::RShift; - (*map)["RAlt"] = sf::Keyboard::RAlt; - (*map)["LControl"] = sf::Keyboard::LControl; - (*map)["LShift"] = sf::Keyboard::LShift; - (*map)["LAlt"] = sf::Keyboard::LAlt; - (*map)["LSystem"] = sf::Keyboard::LSystem; - (*map)["RSystem"] = sf::Keyboard::RSystem; - (*map)["Menu"] = sf::Keyboard::Menu; - (*map)["LBracket"] = sf::Keyboard::LBracket; - (*map)["RBracket"] = sf::Keyboard::RBracket; - (*map)["SemiColon"] = sf::Keyboard::SemiColon; - (*map)["Comma"] = sf::Keyboard::Comma; - (*map)["Period"] = sf::Keyboard::Period; - (*map)["Quote"] = sf::Keyboard::Quote; - (*map)["Slash"] = sf::Keyboard::Slash; - (*map)["BackSlash"] = sf::Keyboard::BackSlash; - (*map)["Tilde"] = sf::Keyboard::Tilde; - (*map)["Equal"] = sf::Keyboard::Equal; - (*map)["Dash"] = sf::Keyboard::Dash; - (*map)["Space"] = sf::Keyboard::Space; - (*map)["Return"] = sf::Keyboard::Return; - (*map)["Back"] = sf::Keyboard::BackSpace; - (*map)["Tab"] = sf::Keyboard::Tab; - (*map)["PageUp"] = sf::Keyboard::PageUp; - (*map)["PageDown"] = sf::Keyboard::PageDown; - (*map)["End"] = sf::Keyboard::End; - (*map)["Home"] = sf::Keyboard::Home; - (*map)["Insert"] = sf::Keyboard::Insert; - (*map)["Delete"] = sf::Keyboard::Delete; - - (*map)["Add"] = sf::Keyboard::Add; - (*map)["Subtract"] = sf::Keyboard::Subtract; - (*map)["Multiply"] = sf::Keyboard::Multiply; - (*map)["Divide"] = sf::Keyboard::Divide; - - (*map)["Left"] = sf::Keyboard::Left; - (*map)["Right"] = sf::Keyboard::Right; - (*map)["Up"] = sf::Keyboard::Up; - (*map)["Down"] = sf::Keyboard::Down; - - (*map)["Numpad0"] = sf::Keyboard::Numpad0; - (*map)["Numpad1"] = sf::Keyboard::Numpad1; - (*map)["Numpad2"] = sf::Keyboard::Numpad2; - (*map)["Numpad3"] = sf::Keyboard::Numpad3; - (*map)["Numpad4"] = sf::Keyboard::Numpad4; - (*map)["Numpad5"] = sf::Keyboard::Numpad5; - (*map)["Numpad6"] = sf::Keyboard::Numpad6; - (*map)["Numpad7"] = sf::Keyboard::Numpad7; - (*map)["Numpad8"] = sf::Keyboard::Numpad8; - (*map)["Numpad9"] = sf::Keyboard::Numpad9; - - (*map)["F1"] = sf::Keyboard::F1; - (*map)["F2"] = sf::Keyboard::F2; - (*map)["F3"] = sf::Keyboard::F3; - (*map)["F4"] = sf::Keyboard::F4; - (*map)["F5"] = sf::Keyboard::F5; - (*map)["F6"] = sf::Keyboard::F6; - (*map)["F7"] = sf::Keyboard::F7; - (*map)["F8"] = sf::Keyboard::F8; - (*map)["F9"] = sf::Keyboard::F9; - (*map)["F10"] = sf::Keyboard::F10; - (*map)["F11"] = sf::Keyboard::F11; - (*map)["F12"] = sf::Keyboard::F12; - (*map)["F13"] = sf::Keyboard::F13; - (*map)["F14"] = sf::Keyboard::F14; - (*map)["F15"] = sf::Keyboard::F15; - - (*map)["Pause"] = sf::Keyboard::Pause; - - initialized = true; - } - - return *map; -} - -const std::map& InputManager::GetSfKeyToKeyNameMap() { - static bool initialized = false; - static std::map* map = new std::map(); - if (!initialized) { - const auto& keyMap = GetKeyNameToSfKeyMap(); - for (auto it = keyMap.begin(); it != keyMap.end(); ++it) - (*map)[it->second] = it->first; - - initialized = true; - } - - return *map; -} - -const std::map& InputManager::GetButtonNameToSfButtonMap() { - static bool initialized = false; - static std::map* map = new std::map(); - if (!initialized) { - (*map)["Left"] = sf::Mouse::Left; - (*map)["Right"] = sf::Mouse::Right; - (*map)["Middle"] = sf::Mouse::Middle; - (*map)["XButton1"] = sf::Mouse::XButton1; - (*map)["XButton2"] = sf::Mouse::XButton2; - - initialized = true; - } - - return *map; -} - -const std::map& InputManager::GetSfButtonToButtonNameMap() { - static bool initialized = false; - static std::map* map = new std::map(); - if (!initialized) { - const auto& buttonMap = GetButtonNameToSfButtonMap(); - for (auto it = buttonMap.begin(); it != buttonMap.end(); ++it) - (*map)[it->second] = it->first; - - initialized = true; - } - - return *map; -} diff --git a/GDCpp/GDCpp/Runtime/InputManager.h b/GDCpp/GDCpp/Runtime/InputManager.h deleted file mode 100644 index 2625f8534..000000000 --- a/GDCpp/GDCpp/Runtime/InputManager.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef INPUTMANAGER_H -#define INPUTMANAGER_H -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/String.h" - -/** - * \brief Manage the events and mouse, keyboard - * and touches inputs of a sf::Window. - * - * In particular, each RuntimeScene owns an InputManager. - * - * \see RuntimeScene - */ -class GD_API InputManager { - public: - /** - * @brief Default constructor. - * - * Call SetWindow to set the window for which events must be handled - */ - InputManager() - : window(nullptr), - lastPressedKey(0), - mouseWheelDelta(0), - keyWasPressed(false), - touchSimulateMouse(true), - windowHasFocus(true), - disableInputWhenNotFocused(true) {} - - /** - * @brief Constructor with a window to manage. - */ - InputManager(sf::Window* win); - - /** \name Connection with window and events management - */ - ///@{ - /** - * \brief Set the window managed by the input manager. - */ - InputManager& SetWindow(sf::Window* win) { - window = win; - return *this; - } - - /** - * Set if the input must be disabled when window lose focus. - */ - void DisableInputWhenFocusIsLost(bool disable = true) { - disableInputWhenNotFocused = disable; - } - - /** - * \brief Handle a SFML event made on the window. - */ - void HandleEvent(sf::Event& event); - - /** - * \brief Call it when a new frame is rendered. - */ - void NextFrame(); - ///@} - - /** \name Keyboard - */ - ///@{ - /** - * \brief Return the key name of the latest pressed key. - */ - gd::String GetLastPressedKey() const; - - /** - * \brief Return true if the specified key name is pressed. - */ - bool IsKeyPressed(gd::String key) const; - - /** - * \brief Return true if the specified key name was just released. - */ - bool WasKeyReleased(gd::String key) const; - - /** - * \brief Return true if any key was pressed since the last call - * to NextFrame. - */ - bool AnyKeyIsPressed() const; - - /** - * @brief Get the unicode value of the characters entered during the last - * frame. - */ - std::vector GetCharactersEntered() const { - return charactersEntered; - }; - - static const std::map& GetKeyNameToSfKeyMap(); - static const std::map& GetSfKeyToKeyNameMap(); - ///@} - - /** \name Mouse - */ - ///@{ - /** - * @brief Return the position of the mouse, in window coordinates. - */ - sf::Vector2i GetMousePosition() const; - - /** - * @brief Return true if the specified mouse button is pressed. - */ - bool IsMouseButtonPressed(const gd::String& button) const; - - /** - * @brief Return true if the specified mouse button was released in this - * frame. - */ - bool IsMouseButtonReleased(const gd::String& button) const; - - /** - * @brief Get the number of ticks the wheel moved during last frame. - */ - int GetMouseWheelDelta() const; - - /** - * @brief Return true is mouse wheel scroll up. - */ - bool IsScrollingUp() const; - - /** - * @brief Return true is mouse wheel scroll down. - */ - bool IsScrollingDown() const; - - static const std::map& GetButtonNameToSfButtonMap(); - static const std::map& GetSfButtonToButtonNameMap(); - ///@} - - /** \name Touches - */ - ///@{ - /** - * @brief Get all touches being made on the screen, along with their - * coordinates. - */ - const std::map& GetAllTouches() { return touches; } - ///@} - - private: - sf::Window* window; - - int lastPressedKey; ///< SFML key code of the last pressed key. - bool keyWasPressed; ///< True if a key was pressed during the last step. - std::map keysPressed; ///< The keys pressed for this frame. - std::map - oldKeysPressed; ///< The keys pressed during the last frame. - std::vector - charactersEntered; ///< The characters entered for this frame. - - int mouseWheelDelta; - sf::Vector2i mousePosition; ///< The mouse position for this frame. - std::map - buttonsPressed; ///< The buttons pressed for this frame. - std::map - oldButtonsPressed; ///< The buttons pressed during the last frame. - - void SimulateMousePressed(sf::Vector2i pos); - bool touchSimulateMouse; - std::map touches; - - bool windowHasFocus; ///< True if the render target has the focus. - bool disableInputWhenNotFocused; ///< True if input should be ignored when - ///< focus is lost. -}; - -#endif diff --git a/GDCpp/GDCpp/Runtime/Liberation.hpp b/GDCpp/GDCpp/Runtime/Liberation.hpp deleted file mode 100644 index 410b13d8f..000000000 --- a/GDCpp/GDCpp/Runtime/Liberation.hpp +++ /dev/null @@ -1,29185 +0,0 @@ -/* Liberation font, licenced under SIL OPEN FONT LICENSE 1.1, see GDCpp/license.txt for more information */ - 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x04, 0x00, 0x30, - 0x46, 0x46, 0x54, 0x4d, 0x61, 0x10, 0x8b, 0x53, 0x00, 0x05, 0x57, 0xdc, - 0x00, 0x00, 0x00, 0x1c, 0x47, 0x44, 0x45, 0x46, 0x7d, 0xfe, 0x74, 0x31, - 0x00, 0x05, 0x03, 0x34, 0x00, 0x00, 0x00, 0x88, 0x47, 0x50, 0x4f, 0x53, - 0x11, 0xb0, 0x72, 0xa1, 0x00, 0x05, 0x0c, 0x8c, 0x00, 0x00, 0x4b, 0x4e, - 0x47, 0x53, 0x55, 0x42, 0x4f, 0x51, 0x2e, 0x0e, 0x00, 0x05, 0x03, 0xbc, - 0x00, 0x00, 0x08, 0xd0, 0x4f, 0x53, 0x2f, 0x32, 0x00, 0xa6, 0xcb, 0x97, - 0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x60, 0x63, 0x6d, 0x61, 0x70, - 0x12, 0x98, 0x5b, 0xc4, 0x00, 0x00, 0x2a, 0x84, 0x00, 0x00, 0x06, 0x2e, - 0x63, 0x76, 0x74, 0x20, 0x4a, 0xda, 0x4b, 0xfa, 0x00, 0x00, 0x3b, 0xac, - 0x00, 0x00, 0x02, 0x88, 0x66, 0x70, 0x67, 0x6d, 0x7e, 0x61, 0xb6, 0x11, - 0x00, 0x00, 0x30, 0xb4, 0x00, 0x00, 0x07, 0xb4, 0x67, 0x61, 0x73, 0x70, - 0x00, 0x18, 0x00, 0x09, 0x00, 0x05, 0x03, 0x24, 0x00, 0x00, 0x00, 0x10, - 0x67, 0x6c, 0x79, 0x66, 0x3c, 0x97, 0x4d, 0x98, 0x00, 0x00, 0x66, 0xa4, - 0x00, 0x04, 0x13, 0x7c, 0x68, 0x65, 0x61, 0x64, 0x00, 0x68, 0x84, 0xf6, - 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, - 0x0d, 0x94, 0x0d, 0x98, 0x00, 0x00, 0x01, 0x74, 0x00, 0x00, 0x00, 0x24, - 0x68, 0x6d, 0x74, 0x78, 0xdb, 0x2a, 0xb8, 0x9d, 0x00, 0x00, 0x02, 0x18, - 0x00, 0x00, 0x28, 0x6c, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x36, 0x1d, 0x34, - 0x00, 0x04, 0x7a, 0x20, 0x00, 0x00, 0x15, 0x5a, 0x6c, 0x6f, 0x63, 0x61, - 0x16, 0x19, 0x9d, 0x70, 0x00, 0x00, 0x3e, 0x34, 0x00, 0x00, 0x28, 0x70, - 0x6d, 0x61, 0x78, 0x70, 0x0d, 0x8a, 0x03, 0xe4, 0x00, 0x00, 0x01, 0x98, - 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xe6, 0xfa, 0x85, 0xe9, - 0x00, 0x04, 0x8f, 0x7c, 0x00, 0x00, 0x0b, 0x8b, 0x70, 0x6f, 0x73, 0x74, - 0x87, 0xf8, 0xab, 0xfb, 0x00, 0x04, 0x9b, 0x08, 0x00, 0x00, 0x68, 0x19, - 0x70, 0x72, 0x65, 0x70, 0xfd, 0xae, 0x47, 0x49, 0x00, 0x00, 0x38, 0x68, - 0x00, 0x00, 0x03, 0x43, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0xd6, 0x57, 0x2d, 0x59, 0x5f, 0x0f, 0x3c, 0xf5, 0x02, 0x1f, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xcc, 0x93, 0x1d, 0x47, 0x00, 0x00, 0x00, 0x00, - 0xcc, 0x93, 0x1d, 0x47, 0xfb, 0xa6, 0xfd, 0x93, 0x0a, 0x6a, 0x07, 0xd7, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x07, 0x3e, 0xfe, 0x4e, 0x00, 0x43, 0x0a, 0xb4, - 0xfb, 0xa6, 0xfa, 0x7a, 0x0a, 0x6a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1b, - 0x00, 0x01, 0x00, 0x00, 0x0a, 0x1b, 0x01, 0x52, 0x00, 0x54, 0x00, 0x5c, - 0x00, 0x06, 0x00, 0x02, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x5c, 0x00, 0x00, - 0x02, 0xa4, 0x02, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x04, 0xa2, - 0x01, 0x90, 0x00, 0x05, 0x00, 0x00, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00, - 0x01, 0x1b, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00, 0x03, 0xd1, 0x00, 0x66, - 0x02, 0x12, 0x08, 0x05, 0x02, 0x0b, 0x06, 0x04, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x04, 0xe0, 0x00, 0x0a, 0xff, 0x50, 0x00, 0x78, 0xff, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x31, 0x41, 0x53, 0x43, 0x00, 0x40, - 0x00, 0x20, 0xff, 0xfc, 0x05, 0xd3, 0xfe, 0x51, 0x01, 0x33, 0x07, 0x3e, - 0x01, 0xb2, 0x60, 0x00, 0x01, 0xbf, 0xdf, 0xf7, 0x00, 0x00, 0x04, 0x3a, - 0x05, 0x81, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0e, 0x06, 0x00, 0x00, 0xcd, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0x00, - 0x02, 0x39, 0x00, 0xb9, 0x02, 0xd7, 0x00, 0x57, 0x04, 0x73, 0x00, 0x09, - 0x04, 0x73, 0x00, 0x16, 0x07, 0x1d, 0x00, 0x49, 0x05, 0x56, 0x00, 0x48, - 0x01, 0x87, 0x00, 0x68, 0x02, 0xaa, 0x00, 0x7f, 0x02, 0xaa, 0x00, 0x0c, - 0x03, 0x1d, 0x00, 0x21, 0x04, 0xac, 0x00, 0x64, 0x02, 0x39, 0x00, 0xb8, - 0x02, 0xaa, 0x00, 0x5b, 0x02, 0x39, 0x00, 0xbb, 0x02, 0x39, 0x00, 0x00, - 0x04, 0x73, 0x00, 0x50, 0x04, 0x73, 0x00, 0x9c, 0x04, 0x73, 0x00, 0x67, - 0x04, 0x73, 0x00, 0x4e, 0x04, 0x73, 0x00, 0x2f, 0x04, 0x73, 0x00, 0x52, - 0x04, 0x73, 0x00, 0x68, 0x04, 0x73, 0x00, 0x69, 0x04, 0x73, 0x00, 0x59, - 0x04, 0x73, 0x00, 0x60, 0x02, 0x39, 0x00, 0xbb, 0x02, 0x39, 0x00, 0xb8, - 0x04, 0xac, 0x00, 0x65, 0x04, 0xac, 0x00, 0x64, 0x04, 0xac, 0x00, 0x65, - 0x04, 0x73, 0x00, 0x54, 0x08, 0x1f, 0x00, 0xa1, 0x05, 0x56, 0x00, 0x04, - 0x05, 0x56, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0x68, 0x05, 0xc7, 0x00, 0xa8, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0xe3, 0x00, 0xa8, 0x06, 0x39, 0x00, 0x67, - 0x05, 0xc7, 0x00, 0xa8, 0x02, 0x39, 0x00, 0xbd, 0x04, 0x00, 0x00, 0x20, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0xa8, 0x06, 0xaa, 0x00, 0xa8, - 0x05, 0xc7, 0x00, 0xa8, 0x06, 0x39, 0x00, 0x61, 0x05, 0x56, 0x00, 0xa8, - 0x06, 0x39, 0x00, 0x61, 0x05, 0xc7, 0x00, 0xa8, 0x05, 0x56, 0x00, 0x5d, - 0x04, 0xe3, 0x00, 0x2e, 0x05, 0xc7, 0x00, 0x9e, 0x05, 0x56, 0x00, 0x09, - 0x07, 0x8d, 0x00, 0x09, 0x05, 0x56, 0x00, 0x2e, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0xe3, 0x00, 0x41, 0x02, 0x39, 0x00, 0x92, 0x02, 0x39, 0x00, 0x00, - 0x02, 0x39, 0x00, 0x10, 0x03, 0xc1, 0x00, 0x0a, 0x04, 0x73, 0xff, 0xe1, - 0x02, 0xaa, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x84, - 0x04, 0x00, 0x00, 0x57, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x57, - 0x02, 0x39, 0x00, 0x1d, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x8e, - 0x01, 0xc7, 0x00, 0x89, 0x01, 0xc7, 0xff, 0xce, 0x04, 0x00, 0x00, 0x8a, - 0x01, 0xc7, 0x00, 0x8a, 0x06, 0xaa, 0x00, 0x88, 0x04, 0x73, 0x00, 0x88, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x84, 0x04, 0x73, 0x00, 0x56, - 0x02, 0xaa, 0x00, 0x88, 0x04, 0x00, 0x00, 0x39, 0x02, 0x39, 0x00, 0x1f, - 0x04, 0x73, 0x00, 0x85, 0x04, 0x00, 0x00, 0x07, 0x05, 0xc7, 0xff, 0xfd, - 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x53, - 0x02, 0xac, 0x00, 0x22, 0x02, 0x14, 0x00, 0xb7, 0x02, 0xac, 0x00, 0x22, - 0x04, 0xac, 0x00, 0x5c, 0x02, 0x39, 0x00, 0x00, 0x02, 0xaa, 0x00, 0xf2, - 0x04, 0x73, 0x00, 0x87, 0x04, 0x73, 0x00, 0x3a, 0x04, 0x73, 0x00, 0x71, - 0x04, 0x73, 0xff, 0xfe, 0x02, 0x14, 0x00, 0xb7, 0x04, 0x73, 0x00, 0x73, - 0x02, 0xaa, 0x00, 0x2d, 0x05, 0xe5, 0x00, 0x1f, 0x02, 0xf6, 0x00, 0x1a, - 0x04, 0x73, 0x00, 0x53, 0x04, 0xac, 0x00, 0x64, 0x02, 0xaa, 0x00, 0x5b, - 0x05, 0xe5, 0x00, 0x1f, 0x04, 0x6b, 0xff, 0xef, 0x03, 0x33, 0x00, 0x7a, - 0x04, 0x64, 0x00, 0x41, 0x02, 0xaa, 0x00, 0x29, 0x02, 0xaa, 0x00, 0x1b, - 0x02, 0xaa, 0x00, 0x48, 0x04, 0x9c, 0x00, 0x8c, 0x04, 0x4c, 0x00, 0x50, - 0x02, 0xaa, 0x00, 0xf3, 0x02, 0xaa, 0x00, 0x77, 0x02, 0xaa, 0x00, 0x50, - 0x02, 0xec, 0x00, 0x1b, 0x04, 0x73, 0x00, 0x53, 0x06, 0xac, 0x00, 0x38, - 0x06, 0xac, 0x00, 0x38, 0x06, 0xac, 0x00, 0x49, 0x04, 0xe3, 0x00, 0x83, - 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, - 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, - 0x08, 0x00, 0x00, 0x18, 0x05, 0xc7, 0x00, 0x68, 0x05, 0x56, 0x00, 0xa8, - 0x05, 0x56, 0x00, 0xa8, 0x05, 0x56, 0x00, 0xa8, 0x05, 0x56, 0x00, 0xa8, - 0x02, 0x39, 0x00, 0x09, 0x02, 0x39, 0x00, 0x8e, 0x02, 0x39, 0xff, 0xd2, - 0x02, 0x39, 0x00, 0x07, 0x05, 0xc7, 0x00, 0x0e, 0x05, 0xc7, 0x00, 0xa8, - 0x06, 0x39, 0x00, 0x61, 0x06, 0x39, 0x00, 0x61, 0x06, 0x39, 0x00, 0x61, - 0x06, 0x39, 0x00, 0x61, 0x06, 0x39, 0x00, 0x61, 0x04, 0xac, 0x00, 0x8e, - 0x06, 0x39, 0x00, 0x47, 0x05, 0xc7, 0x00, 0x9e, 0x05, 0xc7, 0x00, 0x9e, - 0x05, 0xc7, 0x00, 0x9e, 0x05, 0xc7, 0x00, 0x9e, 0x05, 0x56, 0x00, 0x2d, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0xe3, 0x00, 0x8e, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, 0x07, 0x1d, 0x00, 0x42, - 0x04, 0x00, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, 0x02, 0x39, 0x00, 0x0a, - 0x02, 0x39, 0x00, 0x87, 0x02, 0x39, 0xff, 0xd3, 0x02, 0x39, 0x00, 0x08, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x8c, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x64, 0x00, 0x41, 0x04, 0xe3, 0x00, 0x2c, - 0x04, 0x73, 0x00, 0x8b, 0x04, 0x73, 0x00, 0x8b, 0x04, 0x73, 0x00, 0x8b, - 0x04, 0x73, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x05, 0x04, 0x73, 0x00, 0x8a, - 0x04, 0x00, 0x00, 0x05, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, - 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, 0x05, 0xc7, 0x00, 0x68, - 0x04, 0x00, 0x00, 0x57, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0xeb, 0x00, 0x56, 0x05, 0xc7, 0x00, 0x0e, - 0x04, 0x73, 0x00, 0x56, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x06, 0x39, 0x00, 0x67, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x67, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x67, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x67, - 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8e, - 0x05, 0xc7, 0x00, 0x0e, 0x04, 0x73, 0x00, 0x0a, 0x02, 0x39, 0xff, 0xb8, - 0x02, 0x39, 0xff, 0xb8, 0x02, 0x39, 0x00, 0x0c, 0x02, 0x39, 0x00, 0x0c, - 0x02, 0x39, 0xff, 0xd2, 0x02, 0x39, 0xff, 0xd2, 0x02, 0x39, 0x00, 0x5c, - 0x01, 0xc7, 0x00, 0x1f, 0x02, 0x39, 0x00, 0xbd, 0x02, 0x39, 0x00, 0xc2, - 0x05, 0xe1, 0x00, 0xaa, 0x03, 0x8d, 0x00, 0x89, 0x04, 0x00, 0x00, 0x20, - 0x01, 0xc7, 0xff, 0x99, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x8a, - 0x04, 0x00, 0x00, 0x8a, 0x04, 0x73, 0x00, 0xa8, 0x01, 0xc7, 0x00, 0x5b, - 0x04, 0x73, 0x00, 0xa8, 0x01, 0xc7, 0x00, 0x7e, 0x04, 0x73, 0x00, 0xa8, - 0x02, 0x55, 0x00, 0x8a, 0x04, 0x73, 0x00, 0xa8, 0x02, 0xac, 0x00, 0x8a, - 0x04, 0x73, 0x00, 0x14, 0x01, 0xc7, 0x00, 0x10, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x8c, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8c, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8c, 0x04, 0xd5, 0xff, 0xfe, - 0x05, 0xc9, 0x00, 0xa5, 0x04, 0x73, 0x00, 0x8c, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x08, 0x00, 0x00, 0x61, - 0x07, 0x8d, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x88, - 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x81, 0x05, 0xc7, 0x00, 0xa8, - 0x02, 0xaa, 0x00, 0x38, 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, - 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, 0x05, 0x56, 0x00, 0x5d, - 0x04, 0x00, 0x00, 0x39, 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, - 0x04, 0xe3, 0x00, 0x2e, 0x02, 0x39, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x2e, - 0x03, 0x00, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x2e, 0x02, 0x39, 0x00, 0x1f, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, - 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, - 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x07, 0x8d, 0x00, 0x09, 0x05, 0xc7, 0xff, 0xfd, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0x00, 0x00, 0x05, 0x05, 0x56, 0x00, 0x2d, 0x04, 0xe3, 0x00, 0x41, - 0x04, 0x00, 0x00, 0x53, 0x04, 0xe3, 0x00, 0x41, 0x04, 0x00, 0x00, 0x53, - 0x04, 0xe3, 0x00, 0x41, 0x04, 0x00, 0x00, 0x53, 0x01, 0xc7, 0x00, 0x8a, - 0x04, 0x73, 0x00, 0x0b, 0x06, 0x11, 0x00, 0x14, 0x05, 0x40, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x84, 0x05, 0x40, 0x00, 0x0a, 0x04, 0x73, 0x00, 0x0a, - 0x05, 0xc7, 0x00, 0x5b, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, - 0x05, 0xc7, 0x00, 0x0e, 0x06, 0x7a, 0x00, 0x14, 0x05, 0x40, 0x00, 0x51, - 0x04, 0x73, 0x00, 0x52, 0x04, 0x74, 0x00, 0x56, 0x05, 0x56, 0x00, 0x59, - 0x06, 0x05, 0x00, 0x5e, 0x04, 0xd5, 0x00, 0x58, 0x04, 0xe3, 0xff, 0xc6, - 0x04, 0x73, 0x00, 0xc0, 0x06, 0x39, 0x00, 0x67, 0x04, 0xfe, 0x00, 0x0a, - 0x07, 0x0c, 0x00, 0x8e, 0x01, 0xc7, 0x00, 0x8a, 0x02, 0x39, 0x00, 0x1e, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x8a, 0x01, 0xc7, 0x00, 0x14, - 0x04, 0x00, 0x00, 0x0e, 0x07, 0x20, 0x00, 0x9e, 0x05, 0xc7, 0xff, 0xd0, - 0x04, 0x73, 0x00, 0x88, 0x06, 0x39, 0x00, 0x61, 0x06, 0xdc, 0x00, 0x61, - 0x05, 0x3f, 0x00, 0x56, 0x06, 0xf2, 0x00, 0x61, 0x05, 0x57, 0x00, 0x56, - 0x06, 0x09, 0x00, 0x14, 0x04, 0x73, 0x00, 0x8a, 0x05, 0x56, 0x00, 0xa8, - 0x05, 0x56, 0x00, 0x62, 0x04, 0x00, 0x00, 0x4f, 0x04, 0xf2, 0x00, 0x6c, - 0x03, 0x0b, 0x00, 0x43, 0x02, 0x39, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x14, - 0x02, 0x39, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x2e, 0x06, 0xd5, 0x00, 0x9e, - 0x05, 0x5b, 0x00, 0x85, 0x05, 0xfb, 0x00, 0x57, 0x05, 0xc7, 0x00, 0x9e, - 0x06, 0x2e, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x05, 0x04, 0xe3, 0x00, 0x3e, - 0x04, 0x00, 0x00, 0x2f, 0x04, 0xe3, 0x00, 0x2d, 0x04, 0xe3, 0x00, 0x46, - 0x04, 0x5c, 0x00, 0x5d, 0x04, 0x5c, 0x00, 0x4e, 0x04, 0x73, 0x00, 0x5a, - 0x04, 0x73, 0x00, 0x59, 0x03, 0xab, 0x00, 0x2e, 0x03, 0xe5, 0x00, 0x24, - 0x04, 0x73, 0x00, 0x8a, 0x02, 0x14, 0x00, 0xb0, 0x03, 0x4e, 0x00, 0xb3, - 0x04, 0xac, 0x00, 0x72, 0x02, 0x39, 0x00, 0xb9, 0x0a, 0xaa, 0x00, 0xa8, - 0x09, 0xc7, 0x00, 0xa8, 0x08, 0x64, 0x00, 0x56, 0x08, 0x7f, 0x00, 0xa8, - 0x06, 0xaa, 0x00, 0xa8, 0x03, 0x9c, 0x00, 0x8a, 0x09, 0xc7, 0x00, 0xa8, - 0x07, 0x8e, 0x00, 0xa8, 0x06, 0x2b, 0x00, 0x88, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x02, 0x39, 0xff, 0xd6, 0x01, 0xc7, 0xff, 0x89, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0x9e, - 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, - 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x04, 0x73, 0x00, 0x56, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x08, 0x00, 0x00, 0x18, - 0x07, 0x1d, 0x00, 0x42, 0x06, 0x39, 0x00, 0x67, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x67, 0x04, 0x73, 0x00, 0x56, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x00, 0x00, 0x8a, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x04, 0xe3, 0x00, 0x2d, - 0x04, 0x5c, 0x00, 0x44, 0x01, 0xc7, 0xff, 0x92, 0x0a, 0xaa, 0x00, 0xa8, - 0x09, 0xc7, 0x00, 0xa8, 0x08, 0x64, 0x00, 0x56, 0x06, 0x39, 0x00, 0x67, - 0x04, 0x73, 0x00, 0x56, 0x08, 0x46, 0x00, 0xa8, 0x04, 0xf2, 0x00, 0xa8, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x88, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x08, 0x00, 0x00, 0x18, 0x07, 0x1d, 0x00, 0x42, - 0x06, 0x39, 0x00, 0x47, 0x04, 0xe3, 0x00, 0x2c, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x02, 0x39, 0xff, 0x69, 0x02, 0x39, 0xff, 0x57, - 0x02, 0x39, 0x00, 0x08, 0x02, 0x39, 0xff, 0xfa, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0xff, 0xbf, 0x05, 0xc7, 0x00, 0xa8, - 0x02, 0xaa, 0x00, 0x6c, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x69, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0x56, 0x00, 0x5d, - 0x04, 0x00, 0x00, 0x39, 0x04, 0xe3, 0x00, 0x2e, 0x02, 0x39, 0x00, 0x1f, - 0x04, 0x5c, 0x00, 0x40, 0x03, 0x7e, 0x00, 0x21, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x8e, 0x05, 0xa6, 0x00, 0xa4, 0x05, 0x74, 0x00, 0x56, - 0x04, 0xd6, 0x00, 0x5d, 0x04, 0x86, 0x00, 0x5f, 0x04, 0xe3, 0x00, 0x41, - 0x04, 0x00, 0x00, 0x31, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x05, 0x56, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x05, - 0x02, 0xcb, 0xff, 0xa9, 0x05, 0x7a, 0x00, 0x88, 0x02, 0xf0, 0xff, 0xb7, - 0x01, 0xc7, 0xff, 0xce, 0x07, 0x18, 0x00, 0x53, 0x07, 0x18, 0x00, 0x53, - 0x05, 0x56, 0x00, 0x04, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x0a, - 0x04, 0x73, 0x00, 0x1a, 0x04, 0xe3, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x47, - 0x04, 0x00, 0x00, 0x31, 0x04, 0xa5, 0x00, 0x33, 0x03, 0xa0, 0x00, 0x14, - 0x05, 0x56, 0x00, 0x21, 0x05, 0xc7, 0x00, 0x29, 0x05, 0x58, 0x00, 0x09, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x44, 0x04, 0x00, 0x00, 0x20, - 0x01, 0xc7, 0xff, 0xce, 0x05, 0xe6, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x05, 0xc7, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x14, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0x00, 0x00, 0x05, 0x04, 0x73, 0x00, 0x01, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x7e, 0x04, 0x73, 0x00, 0x84, 0x04, 0x00, 0x00, 0x3d, - 0x04, 0x00, 0x00, 0x4d, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, 0x05, 0xe9, 0x00, 0x57, - 0x03, 0xab, 0x00, 0x48, 0x03, 0xab, 0x00, 0x35, 0x05, 0x0d, 0x00, 0x35, - 0x04, 0x0f, 0x00, 0x4b, 0x02, 0x39, 0x00, 0x08, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x78, 0x00, 0x5e, 0x04, 0x02, 0x00, 0x07, - 0x04, 0xef, 0x00, 0x16, 0x04, 0x73, 0x00, 0x8e, 0x04, 0x73, 0x00, 0x8e, - 0x04, 0x73, 0x00, 0x8e, 0x01, 0xc7, 0x00, 0x18, 0x01, 0xc7, 0x00, 0x56, - 0x02, 0xd9, 0x00, 0x44, 0x02, 0x9e, 0x00, 0x00, 0x02, 0x6e, 0x00, 0x0f, - 0x01, 0xc7, 0x00, 0x86, 0x04, 0x93, 0x00, 0x83, 0x06, 0xaa, 0x00, 0x89, - 0x06, 0xaa, 0x00, 0x89, 0x06, 0xaa, 0x00, 0x88, 0x04, 0x73, 0xff, 0xa1, - 0x04, 0x73, 0x00, 0x88, 0x04, 0x6c, 0x00, 0x8e, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x53, 0x00, 0x56, 0x06, 0x3f, 0x00, 0x57, 0x04, 0x66, 0x00, 0x56, - 0x02, 0xaa, 0x00, 0x2b, 0x02, 0xaa, 0x00, 0x2b, 0x02, 0xaa, 0x00, 0x2b, - 0x02, 0xaa, 0x00, 0x88, 0x02, 0xaa, 0x00, 0x88, 0x02, 0xaa, 0x00, 0x8e, - 0x02, 0xaa, 0x00, 0x20, 0x04, 0x55, 0x00, 0x8e, 0x04, 0x55, 0x00, 0x8e, - 0x04, 0x00, 0x00, 0x39, 0x01, 0xc7, 0xff, 0x8a, 0x02, 0x14, 0xff, 0xc3, - 0x01, 0xc7, 0xff, 0x82, 0x02, 0xcb, 0x00, 0x00, 0x02, 0x39, 0x00, 0x1f, - 0x02, 0x39, 0x00, 0x1f, 0x04, 0x73, 0x00, 0x1a, 0x04, 0x8c, 0x00, 0x54, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x00, 0x00, 0x07, 0x05, 0xc7, 0x00, 0x06, - 0x04, 0x00, 0x00, 0x0f, 0x04, 0x28, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x31, - 0x04, 0x54, 0x00, 0x31, 0x04, 0x5c, 0x00, 0x44, 0x04, 0x5c, 0x00, 0x6c, - 0x04, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x5b, 0x04, 0x00, 0x00, 0x39, - 0x04, 0x00, 0x00, 0x57, 0x06, 0x39, 0x00, 0x61, 0x04, 0x40, 0x00, 0x8e, - 0x04, 0x0f, 0x00, 0x49, 0x04, 0x78, 0x00, 0x5e, 0x04, 0x6b, 0x00, 0x86, - 0x03, 0x2e, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x03, 0x3b, 0x00, 0x86, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x00, 0x00, 0x2f, 0x04, 0x00, 0x00, 0x4f, - 0x07, 0xb7, 0x00, 0x56, 0x07, 0x40, 0x00, 0x56, 0x08, 0x0b, 0x00, 0x56, - 0x05, 0xb3, 0x00, 0x29, 0x03, 0x6f, 0x00, 0x29, 0x05, 0xc0, 0x00, 0x1f, - 0x06, 0x1c, 0x00, 0x1d, 0x05, 0x4a, 0x00, 0x8a, 0x05, 0x0f, 0x00, 0x8a, - 0x03, 0xe2, 0x00, 0x19, 0x04, 0x38, 0x00, 0x63, 0x05, 0x7f, 0x00, 0x27, - 0x05, 0x7f, 0x00, 0x27, 0x03, 0x11, 0x00, 0x61, 0x03, 0x11, 0x00, 0x61, - 0x01, 0x46, 0xff, 0xe9, 0x01, 0xeb, 0x00, 0x67, 0x01, 0xeb, 0x00, 0x28, - 0x01, 0xeb, 0x00, 0x16, 0x02, 0xea, 0x00, 0x64, 0x03, 0xd9, 0xff, 0xf2, - 0x02, 0x91, 0xff, 0xf5, 0x01, 0x87, 0x00, 0x68, 0x02, 0xd7, 0x00, 0x57, - 0x01, 0xc7, 0x00, 0x7f, 0x01, 0xc7, 0x00, 0x76, 0x01, 0xc7, 0x00, 0x8a, - 0x02, 0xaa, 0x00, 0xf6, 0x02, 0xaa, 0x00, 0xfa, 0x02, 0xca, 0x00, 0x34, - 0x02, 0xca, 0x00, 0x33, 0x04, 0xac, 0x00, 0x65, 0x04, 0xac, 0x00, 0x65, - 0x04, 0xac, 0x00, 0x65, 0x04, 0xac, 0x00, 0x65, 0x02, 0xaa, 0x00, 0x00, - 0x02, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0x01, 0x1c, 0x02, 0xaa, 0x00, 0x33, - 0x02, 0xaa, 0x00, 0xc7, 0x02, 0xaa, 0x00, 0x95, 0x02, 0xaa, 0x01, 0x1c, - 0x02, 0xaa, 0x00, 0x43, 0x02, 0xaa, 0x00, 0x77, 0x02, 0xaa, 0x00, 0xe5, - 0x02, 0x39, 0x00, 0xb1, 0x02, 0x39, 0x00, 0xb1, 0x02, 0xaa, 0x00, 0xf6, - 0x02, 0xaa, 0x00, 0xfa, 0x02, 0xaa, 0x00, 0xa1, 0x02, 0xaa, 0x00, 0xa1, - 0x02, 0xaa, 0x00, 0xa1, 0x02, 0xaa, 0x00, 0x1d, 0x02, 0xaa, 0xff, 0xdd, - 0x02, 0xaa, 0x00, 0x9c, 0x02, 0xaa, 0x00, 0x33, 0x02, 0xaa, 0x00, 0x50, - 0x02, 0xaa, 0xff, 0xe9, 0x02, 0xaa, 0x00, 0x16, 0x02, 0xaa, 0xff, 0xe6, - 0x02, 0xaa, 0x00, 0x03, 0x02, 0x94, 0xff, 0xf2, 0x01, 0x42, 0x00, 0x64, - 0x02, 0xb8, 0x00, 0x2c, 0x02, 0xa0, 0x00, 0x04, 0x02, 0xca, 0x00, 0x33, - 0x03, 0x10, 0x00, 0xa0, 0x03, 0x10, 0x00, 0xa0, 0x03, 0x10, 0x00, 0xa0, - 0x03, 0x10, 0x00, 0xa0, 0x03, 0x10, 0x00, 0xa0, 0x02, 0xaa, 0x00, 0x62, - 0x02, 0xaa, 0x00, 0x62, 0x02, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x1d, - 0x02, 0xaa, 0x00, 0x50, 0x02, 0xaa, 0x00, 0x81, 0x02, 0xaa, 0x00, 0x81, - 0x02, 0xaa, 0x00, 0xc8, 0x02, 0xaa, 0x00, 0xc8, 0x02, 0xaa, 0x00, 0x8d, - 0x02, 0xaa, 0x00, 0x8d, 0x02, 0xaa, 0xff, 0xe6, 0x02, 0xaa, 0xff, 0xe7, - 0x02, 0xaa, 0xff, 0xe9, 0x02, 0x39, 0x00, 0xbb, 0x02, 0xaa, 0x00, 0x8a, - 0x02, 0xaa, 0x00, 0x8a, 0x02, 0xaa, 0x00, 0x8a, 0x02, 0xaa, 0x00, 0x8a, - 0x03, 0x2e, 0x00, 0x1e, 0x03, 0x2e, 0x00, 0x17, 0x02, 0xaa, 0x00, 0x3a, - 0x00, 0x00, 0xfd, 0xfc, 0x00, 0x00, 0xfe, 0x95, 0x00, 0x00, 0xfe, 0xb5, - 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xfe, 0xed, 0x00, 0x00, 0xfd, 0xab, - 0x00, 0x00, 0xfe, 0xdc, 0x00, 0x00, 0xff, 0xa6, 0x00, 0x00, 0xfe, 0xe9, - 0x00, 0x00, 0xfe, 0x17, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xfe, 0x7f, - 0x00, 0x00, 0xfe, 0xb5, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0xff, 0x59, - 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xfe, 0xdc, 0x00, 0x00, 0xfe, 0xdc, - 0x00, 0x00, 0xff, 0x9b, 0x00, 0x00, 0xff, 0x9b, 0x00, 0x00, 0xff, 0x9b, - 0x00, 0x00, 0xff, 0x9b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, 0x4f, - 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xfe, 0x87, - 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xff, 0xa6, 0x00, 0x00, 0xff, 0x4c, - 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xfe, 0xc9, - 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, - 0x00, 0x00, 0xfe, 0xe9, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x99, - 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xbd, - 0x00, 0x00, 0xfe, 0x87, 0x00, 0x00, 0xfe, 0x9d, 0x00, 0x00, 0xfe, 0xb9, - 0x00, 0x00, 0xfe, 0xb5, 0x00, 0x00, 0xfe, 0xdc, 0x00, 0x00, 0xfe, 0xdc, - 0x00, 0x00, 0xfe, 0x9a, 0x00, 0x00, 0xfe, 0xed, 0x00, 0x00, 0xfd, 0xab, - 0x00, 0x00, 0xfe, 0xc9, 0x00, 0x00, 0xfe, 0x9a, 0x00, 0x00, 0xfe, 0xa1, - 0x00, 0x00, 0xfd, 0xad, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0xe6, - 0x00, 0x00, 0xff, 0xa3, 0x00, 0x00, 0xfe, 0x87, 0x00, 0x00, 0xff, 0x44, - 0x00, 0x00, 0xfe, 0xa2, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, 0x97, - 0x00, 0x00, 0xfd, 0xac, 0x00, 0x00, 0xfe, 0xb3, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0xff, 0x9c, 0x00, 0x00, 0xfe, 0xab, - 0x00, 0x00, 0xff, 0xba, 0x00, 0x00, 0xfe, 0x87, 0x00, 0x00, 0xfe, 0x0d, - 0x00, 0x00, 0xff, 0x47, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xfe, 0x99, - 0x00, 0x00, 0xfe, 0x9f, 0x00, 0x00, 0xfe, 0x9f, 0x00, 0x00, 0xfe, 0xef, - 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xfd, 0x16, 0x00, 0x00, 0xff, 0x74, - 0x00, 0x00, 0xff, 0xa3, 0x00, 0x00, 0xfe, 0xdc, 0x00, 0x00, 0xff, 0x25, - 0x00, 0x00, 0xff, 0x74, 0x00, 0x00, 0xff, 0x74, 0x00, 0x00, 0xfe, 0xe8, - 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0xff, 0x41, - 0x00, 0x00, 0xfe, 0xbf, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, 0x53, - 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, - 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, 0x53, - 0x00, 0x00, 0xfe, 0xbb, 0x00, 0x00, 0xfe, 0xba, 0x00, 0x00, 0xff, 0xc4, - 0x00, 0x00, 0xfe, 0xb9, 0x00, 0x00, 0xfe, 0xda, 0x00, 0x00, 0xfe, 0xcd, - 0x00, 0x00, 0xfe, 0xc8, 0x00, 0x00, 0xfe, 0xd7, 0x00, 0x00, 0xfe, 0x19, - 0x00, 0x00, 0xff, 0x63, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xfe, 0xaa, - 0x00, 0x00, 0xfe, 0xb6, 0x02, 0xaa, 0x00, 0xf9, 0x02, 0xaa, 0x00, 0x75, - 0x02, 0xaa, 0x00, 0xf0, 0x04, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, 0x57, - 0x04, 0x00, 0x00, 0x3e, 0x02, 0x39, 0x00, 0xb8, 0x02, 0xaa, 0x00, 0xcd, - 0x02, 0xaa, 0x00, 0x1d, 0x05, 0x57, 0x00, 0x04, 0x02, 0x39, 0x00, 0xbb, - 0x06, 0x46, 0xff, 0xf5, 0x06, 0xb4, 0xff, 0xf2, 0x03, 0x12, 0xff, 0xe8, - 0x06, 0x32, 0xff, 0xbb, 0x06, 0xd8, 0x00, 0x41, 0x06, 0x05, 0xff, 0xbb, - 0x01, 0xc7, 0xff, 0xb0, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x68, 0x00, 0xa8, 0x05, 0x58, 0x00, 0x3d, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0xe3, 0x00, 0x41, 0x05, 0xc7, 0x00, 0xa8, 0x06, 0x39, 0x00, 0x61, - 0x02, 0x39, 0x00, 0xbd, 0x05, 0x56, 0x00, 0xa8, 0x05, 0x58, 0x00, 0x0a, - 0x06, 0xaa, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0xa8, 0x05, 0x33, 0x00, 0x5a, - 0x06, 0x39, 0x00, 0x61, 0x05, 0xc7, 0x00, 0xa8, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0xf2, 0x00, 0x6c, 0x04, 0xe3, 0x00, 0x2e, 0x05, 0x56, 0x00, 0x2d, - 0x06, 0x62, 0x00, 0x75, 0x05, 0x56, 0x00, 0x2e, 0x06, 0xaf, 0x00, 0x91, - 0x05, 0xfb, 0x00, 0x57, 0x02, 0x39, 0x00, 0x07, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0xa0, 0x00, 0x56, 0x03, 0x91, 0x00, 0x46, 0x04, 0x73, 0x00, 0x6a, - 0x01, 0xc7, 0x00, 0x89, 0x04, 0x60, 0x00, 0x85, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0x9a, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x07, 0x04, 0x74, 0x00, 0x56, - 0x03, 0x91, 0x00, 0x46, 0x03, 0x87, 0x00, 0x56, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x01, 0xc7, 0x00, 0x89, 0x04, 0x00, 0x00, 0x8a, - 0x04, 0x00, 0x00, 0x0e, 0x04, 0x9c, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x00, - 0x03, 0x95, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, 0x05, 0x85, 0x00, 0x4f, - 0x04, 0x8d, 0x00, 0x84, 0x03, 0xdb, 0x00, 0x56, 0x04, 0xf0, 0x00, 0x56, - 0x03, 0x29, 0x00, 0x1d, 0x04, 0x60, 0x00, 0x85, 0x05, 0x30, 0x00, 0x55, - 0x04, 0x33, 0x00, 0x15, 0x05, 0xb4, 0x00, 0x87, 0x06, 0x3f, 0x00, 0x53, - 0x01, 0xc7, 0xff, 0xcd, 0x04, 0x60, 0x00, 0x85, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x60, 0x00, 0x85, 0x06, 0x3f, 0x00, 0x53, 0x04, 0x9a, 0x00, 0x73, - 0x04, 0x60, 0x00, 0x09, 0x06, 0x2e, 0x00, 0x39, 0x07, 0xaa, 0x00, 0x1c, - 0x06, 0x2e, 0x00, 0x39, 0x04, 0x7b, 0x00, 0x50, 0x06, 0x3f, 0x00, 0x52, - 0x04, 0xcf, 0x00, 0x44, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x05, 0xc7, 0x00, 0x72, 0x04, 0x00, 0x00, 0x5a, 0x04, 0xe3, 0x00, 0xa8, - 0x03, 0x3b, 0x00, 0x88, 0x04, 0xff, 0x00, 0x01, 0x04, 0x3c, 0x00, 0x32, - 0x06, 0x0d, 0x00, 0x2e, 0x04, 0x9d, 0x00, 0x63, 0x07, 0x20, 0x00, 0xa6, - 0x06, 0xaa, 0x00, 0x84, 0x05, 0x65, 0x00, 0x64, 0x04, 0x73, 0x00, 0x8e, - 0x05, 0x64, 0x00, 0xa4, 0x04, 0x00, 0x00, 0x0a, 0x05, 0x56, 0x00, 0x6e, - 0x05, 0x56, 0x00, 0x6e, 0x04, 0xe0, 0x00, 0x07, 0x04, 0xc5, 0x00, 0x16, - 0x05, 0xe5, 0x00, 0x61, 0x04, 0x6e, 0x00, 0x49, 0x03, 0xb6, 0x00, 0x14, - 0x03, 0x47, 0x00, 0x28, 0x04, 0xcf, 0x00, 0x44, 0x04, 0x95, 0x00, 0x62, - 0x04, 0x00, 0x00, 0x57, 0x01, 0xc7, 0xff, 0xce, 0x06, 0x39, 0x00, 0x61, - 0x03, 0x89, 0x00, 0x50, 0x03, 0x89, 0x00, 0x50, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x8a, 0x05, 0xc7, 0x00, 0x68, 0x06, 0xaa, 0x00, 0xa8, - 0x05, 0x80, 0x00, 0x8e, 0x04, 0x8d, 0x00, 0x0a, 0x05, 0xc7, 0x00, 0x5b, - 0x05, 0xc7, 0x00, 0x68, 0x05, 0xc7, 0x00, 0x5b, 0x05, 0x56, 0x00, 0xa8, - 0x05, 0x57, 0x00, 0xa8, 0x06, 0xeb, 0x00, 0x2e, 0x04, 0x55, 0x00, 0xa8, - 0x05, 0xc0, 0x00, 0x68, 0x05, 0x56, 0x00, 0x5d, 0x02, 0x39, 0x00, 0xbd, - 0x02, 0x39, 0x00, 0x07, 0x04, 0x00, 0x00, 0x20, 0x08, 0x75, 0x00, 0x12, - 0x08, 0x15, 0x00, 0xa8, 0x06, 0xd5, 0x00, 0x2e, 0x04, 0xa9, 0x00, 0xa8, - 0x05, 0xc0, 0x00, 0xa8, 0x05, 0x15, 0x00, 0x37, 0x05, 0xc0, 0x00, 0xa8, - 0x05, 0x56, 0x00, 0x04, 0x05, 0x40, 0x00, 0xa8, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x55, 0x00, 0xa8, 0x05, 0x6b, 0x00, 0x0f, 0x05, 0x56, 0x00, 0xa8, - 0x07, 0x63, 0x00, 0x1c, 0x04, 0xd5, 0x00, 0x43, 0x05, 0xc0, 0x00, 0xa8, - 0x05, 0xc0, 0x00, 0xa8, 0x04, 0xa9, 0x00, 0xa8, 0x05, 0x40, 0x00, 0x12, - 0x06, 0xaa, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0xa8, 0x06, 0x39, 0x00, 0x61, - 0x05, 0xc0, 0x00, 0xa6, 0x05, 0x56, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0x68, - 0x04, 0xe3, 0x00, 0x2e, 0x05, 0x15, 0x00, 0x37, 0x06, 0x15, 0x00, 0x76, - 0x05, 0x56, 0x00, 0x2e, 0x05, 0xeb, 0x00, 0xa8, 0x05, 0x55, 0x00, 0xa0, - 0x07, 0x55, 0x00, 0xa8, 0x07, 0x80, 0x00, 0xa8, 0x06, 0x55, 0x00, 0x2e, - 0x07, 0x15, 0x00, 0xa8, 0x05, 0x40, 0x00, 0xa8, 0x05, 0xc0, 0x00, 0x69, - 0x08, 0x15, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0x60, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x95, 0x00, 0x78, 0x04, 0x40, 0x00, 0x8e, 0x02, 0xeb, 0x00, 0x8e, - 0x04, 0xab, 0x00, 0x14, 0x04, 0x73, 0x00, 0x57, 0x05, 0x5a, 0x00, 0x07, - 0x03, 0xab, 0x00, 0x31, 0x04, 0x78, 0x00, 0x8e, 0x04, 0x78, 0x00, 0x8e, - 0x03, 0x80, 0x00, 0x8a, 0x04, 0xab, 0x00, 0x0b, 0x05, 0x80, 0x00, 0x8e, - 0x04, 0x6b, 0x00, 0x8e, 0x04, 0x73, 0x00, 0x56, 0x04, 0x55, 0x00, 0x8e, - 0x04, 0x73, 0x00, 0x84, 0x04, 0x00, 0x00, 0x57, 0x03, 0xaa, 0x00, 0x23, - 0x04, 0x00, 0x00, 0x05, 0x06, 0x95, 0x00, 0x56, 0x04, 0x00, 0x00, 0x17, - 0x04, 0x95, 0x00, 0x8e, 0x04, 0x2b, 0x00, 0x7a, 0x06, 0x6b, 0x00, 0x8e, - 0x06, 0x95, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x2d, 0x05, 0xc0, 0x00, 0x8e, - 0x04, 0x2b, 0x00, 0x8e, 0x04, 0x15, 0x00, 0x37, 0x06, 0x00, 0x00, 0x8e, - 0x04, 0x55, 0x00, 0x11, 0x04, 0x73, 0x00, 0x57, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x73, 0x00, 0x0a, 0x02, 0xeb, 0x00, 0x8e, 0x04, 0x15, 0x00, 0x57, - 0x04, 0x00, 0x00, 0x39, 0x01, 0xc7, 0x00, 0x89, 0x02, 0x39, 0xff, 0xf8, - 0x01, 0xc7, 0xff, 0xce, 0x07, 0x40, 0x00, 0x0b, 0x06, 0x80, 0x00, 0x8e, - 0x04, 0x73, 0x00, 0x0a, 0x03, 0x80, 0x00, 0x8a, 0x04, 0x78, 0x00, 0x8e, - 0x04, 0x00, 0x00, 0x05, 0x04, 0x6b, 0x00, 0x8e, 0x0a, 0xb4, 0x00, 0x72, - 0x04, 0xfe, 0x00, 0x0f, 0x06, 0x39, 0x00, 0x15, 0x04, 0xe7, 0x00, 0x15, - 0x07, 0x99, 0x00, 0xbd, 0x05, 0xb5, 0x00, 0x88, 0x05, 0x58, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x06, 0x07, 0x2e, 0x00, 0xbf, 0x05, 0x90, 0x00, 0x86, - 0x06, 0xa1, 0x00, 0x79, 0x05, 0x7b, 0x00, 0x7a, 0x08, 0x6d, 0x00, 0xbd, - 0x06, 0xf0, 0x00, 0x88, 0x04, 0xd5, 0x00, 0x60, 0x03, 0xab, 0x00, 0x20, - 0x06, 0x5f, 0x00, 0x43, 0x05, 0x82, 0x00, 0x44, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x6d, 0x00, 0x09, 0x05, 0x0c, 0x00, 0x07, - 0x06, 0x6d, 0x00, 0x09, 0x05, 0x0c, 0x00, 0x07, 0x08, 0x98, 0x00, 0x61, - 0x07, 0x2c, 0x00, 0x55, 0x06, 0xaa, 0x00, 0x36, 0x04, 0xe6, 0x00, 0x2b, - 0x09, 0x87, 0x00, 0x6c, 0x06, 0xd0, 0x00, 0x57, 0x0a, 0xb4, 0x00, 0x72, - 0x04, 0xfe, 0x00, 0x0f, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x50, - 0x04, 0x07, 0x00, 0x0b, 0x00, 0x00, 0xfe, 0xa2, 0x00, 0x00, 0xfe, 0xbc, - 0x00, 0x00, 0xff, 0x9f, 0x00, 0x00, 0xff, 0x9f, 0x00, 0x00, 0xfd, 0xd3, - 0x00, 0x00, 0xfc, 0x25, 0x00, 0x00, 0xfc, 0x6b, 0x05, 0xc0, 0x00, 0xa8, - 0x04, 0x78, 0x00, 0x8e, 0x05, 0x40, 0x00, 0x04, 0x04, 0x2b, 0x00, 0x14, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x84, 0x03, 0xe9, 0x00, 0xa8, - 0x03, 0x4a, 0x00, 0x8e, 0x04, 0x55, 0xff, 0xff, 0x02, 0xeb, 0x00, 0x14, - 0x05, 0x5d, 0x00, 0xa7, 0x04, 0x64, 0x00, 0x8d, 0x07, 0x63, 0x00, 0x1c, - 0x05, 0x5a, 0x00, 0x07, 0x04, 0xd5, 0x00, 0x43, 0x03, 0xab, 0x00, 0x31, - 0x04, 0xa9, 0x00, 0xa8, 0x03, 0x80, 0x00, 0x8a, 0x04, 0xa9, 0x00, 0xa8, - 0x03, 0x80, 0x00, 0x8a, 0x04, 0xa9, 0x00, 0x04, 0x03, 0x80, 0x00, 0x0a, - 0x05, 0xef, 0x00, 0x29, 0x04, 0x49, 0x00, 0x28, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x6b, 0x00, 0x8e, 0x07, 0x09, 0x00, 0xa8, 0x05, 0x2f, 0x00, 0x8e, - 0x09, 0x18, 0x00, 0xa8, 0x06, 0xf6, 0x00, 0x88, 0x06, 0x06, 0x00, 0x3e, - 0x04, 0x2b, 0x00, 0x23, 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, - 0x04, 0xe3, 0x00, 0x2e, 0x03, 0xaa, 0x00, 0x23, 0x04, 0x73, 0x00, 0x14, - 0x04, 0x00, 0x00, 0x07, 0x04, 0x73, 0x00, 0x14, 0x04, 0x00, 0x00, 0x07, - 0x05, 0x56, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x17, 0x07, 0x67, 0x00, 0x31, - 0x05, 0x87, 0x00, 0x26, 0x05, 0x55, 0x00, 0xa0, 0x04, 0x2b, 0x00, 0x45, - 0x05, 0x55, 0x00, 0xa0, 0x04, 0x2b, 0x00, 0x7a, 0x05, 0x55, 0x00, 0xa9, - 0x04, 0x73, 0x00, 0x8e, 0x06, 0xe4, 0x00, 0x0a, 0x05, 0x54, 0x00, 0x0a, - 0x06, 0xe4, 0x00, 0x0a, 0x05, 0x54, 0x00, 0x0a, 0x02, 0x39, 0x00, 0xbd, - 0x07, 0x63, 0x00, 0x1c, 0x05, 0x5a, 0x00, 0x07, 0x05, 0x57, 0x00, 0xa8, - 0x04, 0x68, 0x00, 0x8d, 0x05, 0x40, 0x00, 0x12, 0x04, 0xab, 0x00, 0x0b, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x6b, 0x00, 0x8e, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x6b, 0x00, 0x8e, 0x05, 0x55, 0x00, 0xa0, 0x04, 0x2b, 0x00, 0x7a, - 0x06, 0xaa, 0x00, 0xa8, 0x05, 0x80, 0x00, 0x8e, 0x01, 0xc7, 0x00, 0x8a, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x08, 0x00, 0x00, 0x18, 0x07, 0x1d, 0x00, 0x42, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x06, 0x05, 0x00, 0x5e, - 0x04, 0x73, 0x00, 0x57, 0x06, 0x05, 0x00, 0x5e, 0x04, 0x73, 0x00, 0x57, - 0x07, 0x63, 0x00, 0x1c, 0x05, 0x5a, 0x00, 0x07, 0x04, 0xd5, 0x00, 0x43, - 0x03, 0xab, 0x00, 0x31, 0x04, 0xd5, 0x00, 0x4d, 0x04, 0x5c, 0x00, 0x44, - 0x05, 0xc0, 0x00, 0xa8, 0x04, 0x78, 0x00, 0x8e, 0x05, 0xc0, 0x00, 0xa8, - 0x04, 0x78, 0x00, 0x8e, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x05, 0xc0, 0x00, 0x69, 0x04, 0x15, 0x00, 0x37, - 0x05, 0x15, 0x00, 0x37, 0x04, 0x00, 0x00, 0x05, 0x05, 0x15, 0x00, 0x37, - 0x04, 0x00, 0x00, 0x05, 0x05, 0x15, 0x00, 0x37, 0x04, 0x00, 0x00, 0x05, - 0x05, 0x55, 0x00, 0xa0, 0x04, 0x2b, 0x00, 0x7a, 0x04, 0x55, 0x00, 0xa8, - 0x02, 0xeb, 0x00, 0x8e, 0x07, 0x15, 0x00, 0xa8, 0x05, 0xc0, 0x00, 0x8e, - 0x04, 0x55, 0xff, 0xff, 0x02, 0xeb, 0x00, 0x00, 0x05, 0x56, 0x00, 0x2e, - 0x04, 0x00, 0x00, 0x17, 0x05, 0x56, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x17, - 0x05, 0x40, 0x00, 0x58, 0x04, 0x73, 0x00, 0x56, 0x07, 0xbf, 0x00, 0x5b, - 0x07, 0x03, 0x00, 0x56, 0x07, 0xa6, 0x00, 0x60, 0x06, 0x86, 0x00, 0x55, - 0x05, 0x4d, 0x00, 0x60, 0x04, 0x13, 0x00, 0x55, 0x07, 0xc3, 0x00, 0x12, - 0x07, 0x47, 0x00, 0x0b, 0x08, 0x46, 0x00, 0xa8, 0x07, 0x07, 0x00, 0x8e, - 0x06, 0x39, 0x00, 0x67, 0x04, 0x78, 0x00, 0x5e, 0x05, 0xf9, 0x00, 0x2e, - 0x05, 0x53, 0x00, 0x23, 0x04, 0xd5, 0x00, 0x52, 0x03, 0xab, 0x00, 0x49, - 0x05, 0x40, 0x00, 0x12, 0x04, 0xab, 0x00, 0x0b, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x07, 0x8d, 0x00, 0x09, 0x05, 0xc7, 0xff, 0xfd, - 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0xff, 0x6d, - 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xff, 0x4e, - 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xfe, 0xd5, 0x00, 0x00, 0xfe, 0xb8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xb8, 0x00, 0x00, 0xfd, 0xf6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0x44, - 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, 0x6a, - 0x00, 0x00, 0xfe, 0xb8, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, 0x5c, - 0x00, 0x00, 0xfe, 0x14, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x5e, - 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xaa, - 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0xfe, 0xd3, - 0x00, 0x00, 0xfe, 0xf2, 0x00, 0x00, 0xfe, 0xf2, 0x00, 0x00, 0xff, 0xb0, - 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, 0x5c, - 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0xff, 0xb0, - 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0xff, 0xc9, - 0x03, 0x10, 0x00, 0x85, 0x00, 0x00, 0xff, 0x5c, 0x04, 0x81, 0x01, 0xf4, - 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0xff, 0xb0, 0x02, 0x39, 0x00, 0xba, - 0x00, 0x00, 0xff, 0xb0, 0x00, 0x00, 0xff, 0xb0, 0x03, 0x08, 0x00, 0x9a, - 0x00, 0x00, 0x00, 0x35, 0x05, 0x06, 0x00, 0x42, 0x04, 0xc9, 0x00, 0x52, - 0x03, 0x62, 0x00, 0x3f, 0x04, 0x6f, 0x00, 0x29, 0x05, 0x12, 0x00, 0x98, - 0x02, 0x14, 0x00, 0xae, 0x02, 0x96, 0x00, 0x33, 0x05, 0x44, 0x00, 0xae, - 0x05, 0x39, 0x00, 0xa4, 0x02, 0x14, 0x00, 0xae, 0x04, 0x46, 0x00, 0x27, - 0x04, 0x33, 0x00, 0x50, 0x04, 0x3d, 0x00, 0x46, 0x05, 0x6d, 0x00, 0xae, - 0x05, 0x7f, 0x00, 0x37, 0x02, 0x14, 0x00, 0xae, 0x03, 0x1d, 0x00, 0x48, - 0x05, 0x3f, 0x00, 0x33, 0x04, 0xa8, 0x00, 0x29, 0x04, 0xfc, 0x00, 0x85, - 0x04, 0xe1, 0x00, 0x8f, 0x04, 0x08, 0x00, 0x0a, 0x04, 0x5c, 0x00, 0x0a, - 0x04, 0xb8, 0x00, 0x7b, 0x04, 0x46, 0x00, 0x27, 0x05, 0xd7, 0x00, 0x33, - 0x05, 0x87, 0x00, 0x3d, 0x04, 0x12, 0x00, 0xae, 0x04, 0x12, 0x00, 0xae, - 0x04, 0x12, 0x00, 0xae, 0x03, 0x14, 0x00, 0xd7, 0x04, 0xd3, 0x00, 0xd7, - 0x03, 0xf8, 0x00, 0x15, 0x05, 0xfb, 0x00, 0x19, 0x07, 0x1d, 0x00, 0x42, - 0x04, 0x40, 0x00, 0x19, 0x04, 0x00, 0x00, 0x57, 0x04, 0x69, 0x00, 0x87, - 0x04, 0x69, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x87, 0x03, 0xab, 0x00, 0x31, - 0x01, 0xc7, 0x00, 0x89, 0x03, 0x61, 0x00, 0x30, 0x04, 0x00, 0x00, 0x8a, - 0x03, 0x36, 0x00, 0x10, 0x05, 0x80, 0x00, 0x8e, 0x04, 0x78, 0x00, 0x8e, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x00, 0x00, 0x3d, 0x04, 0xde, 0x00, 0x3e, - 0x04, 0xde, 0x00, 0x41, 0x04, 0xde, 0x00, 0x2f, 0x07, 0x8d, 0x00, 0x57, - 0x03, 0xa8, 0x00, 0x43, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x2b, 0x00, 0x8e, 0x04, 0x55, 0x00, 0x11, 0x04, 0x55, 0x00, 0x11, - 0x03, 0xaa, 0x00, 0x23, 0x04, 0x60, 0x00, 0x85, 0x04, 0xc6, 0x00, 0x44, - 0x05, 0xde, 0x00, 0x45, 0x04, 0xc6, 0x00, 0x3f, 0x04, 0x00, 0x00, 0x07, - 0x05, 0xc7, 0xff, 0xfd, 0x04, 0x00, 0x00, 0x53, 0x03, 0xab, 0x00, 0x31, - 0x03, 0x6b, 0x00, 0x41, 0x04, 0xdb, 0x00, 0x29, 0x02, 0xeb, 0x00, 0x8e, - 0x04, 0x00, 0x00, 0x07, 0x04, 0x55, 0x00, 0x8e, 0x04, 0x2b, 0x00, 0x8e, - 0x05, 0xb4, 0x00, 0x7e, 0x04, 0xab, 0x00, 0x0b, 0x03, 0xa0, 0xff, 0xfc, - 0x05, 0x4f, 0x00, 0x0b, 0x03, 0x51, 0x00, 0x35, 0x03, 0x51, 0xff, 0xdc, - 0x03, 0x98, 0x00, 0x32, 0x03, 0x48, 0x00, 0x31, 0x03, 0x48, 0x00, 0x20, - 0x03, 0xf8, 0x00, 0x30, 0x03, 0x6e, 0x00, 0x2e, 0x01, 0x56, 0x00, 0x63, - 0x02, 0x84, 0x00, 0x11, 0x03, 0x66, 0x00, 0x31, 0x02, 0xd0, 0x00, 0x2d, - 0x04, 0x15, 0x00, 0x34, 0x03, 0x71, 0x00, 0x2e, 0x03, 0x6f, 0x00, 0x2e, - 0x04, 0x18, 0x00, 0x2b, 0x03, 0x0f, 0x00, 0x34, 0x03, 0x59, 0x00, 0x2d, - 0x03, 0x9c, 0x00, 0x2d, 0x03, 0x76, 0x00, 0x2a, 0x03, 0x6f, 0x00, 0x27, - 0x04, 0xfb, 0x00, 0x01, 0x02, 0xfa, 0x00, 0x3b, 0x02, 0xfa, 0xff, 0xec, - 0x03, 0x04, 0x00, 0x3b, 0x04, 0xcc, 0x00, 0x2d, 0x03, 0x05, 0x00, 0x5a, - 0x03, 0x05, 0x00, 0x3b, 0x02, 0xf9, 0x00, 0x3b, 0x02, 0xf9, 0x00, 0x3b, - 0x02, 0x8c, 0x00, 0x38, 0x02, 0x8c, 0x00, 0x30, 0x03, 0x04, 0x00, 0x3b, - 0x01, 0x42, 0x00, 0x5e, 0x02, 0xb6, 0x00, 0x5e, 0x04, 0x95, 0x00, 0x5d, - 0x03, 0x0f, 0x00, 0x5d, 0x03, 0x05, 0x00, 0x3b, 0x02, 0xd5, 0x00, 0x48, - 0x03, 0x05, 0x00, 0x3b, 0x03, 0x05, 0x00, 0x3b, 0x03, 0x06, 0x00, 0x5a, - 0x01, 0xc2, 0x00, 0x20, 0x03, 0x0f, 0x00, 0x5b, 0x03, 0x42, 0x00, 0x2b, - 0x04, 0x95, 0x00, 0x5d, 0x02, 0x92, 0xff, 0xf3, 0x03, 0x20, 0x00, 0x04, - 0x03, 0x15, 0x00, 0x60, 0x02, 0x92, 0x00, 0x02, 0x03, 0x06, 0x00, 0x3b, - 0x03, 0x85, 0x00, 0x3a, 0x02, 0xbf, 0x00, 0x04, 0x01, 0x42, 0x00, 0x65, - 0x01, 0xeb, 0x00, 0x67, 0x03, 0x0f, 0x00, 0x60, 0x02, 0x92, 0xff, 0xf3, - 0x03, 0x15, 0x00, 0x62, 0x02, 0x92, 0xff, 0xf3, 0x03, 0x09, 0x00, 0x3c, - 0x03, 0x85, 0x00, 0x3a, 0x02, 0xbf, 0x00, 0x04, 0x07, 0x44, 0x00, 0x85, - 0x04, 0x73, 0xff, 0x92, 0x04, 0x73, 0x00, 0x56, 0x02, 0x39, 0xff, 0xbd, - 0x06, 0xaa, 0xff, 0xc7, 0x04, 0x73, 0xff, 0xb3, 0x04, 0x73, 0xff, 0x96, - 0x02, 0xaa, 0xff, 0x9e, 0x02, 0xaa, 0xff, 0x9e, 0x04, 0x00, 0xff, 0xf9, - 0x02, 0x39, 0xff, 0xb2, 0x04, 0x00, 0x00, 0x31, 0x04, 0x73, 0x00, 0x87, - 0x03, 0x0b, 0x00, 0x62, 0x04, 0x74, 0x00, 0x4d, 0x06, 0x49, 0x00, 0x2a, - 0x01, 0xc7, 0x00, 0x1a, 0x01, 0xc7, 0x00, 0x1a, 0x04, 0x73, 0x00, 0x1e, - 0x04, 0x60, 0x00, 0x1e, 0x04, 0x8c, 0x00, 0x0a, 0x04, 0x73, 0x00, 0x84, - 0x04, 0x73, 0x00, 0x56, 0x02, 0x39, 0x00, 0x1d, 0x05, 0xb4, 0x00, 0x56, - 0x04, 0x00, 0x00, 0x8a, 0x01, 0xc7, 0x00, 0x0f, 0x06, 0xaa, 0x00, 0x88, - 0x04, 0x73, 0x00, 0x88, 0x04, 0x73, 0x00, 0x84, 0x02, 0xaa, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x39, 0x03, 0x18, 0xff, 0xa7, 0x04, 0x00, 0x00, 0x07, - 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x31, 0x04, 0x73, 0x00, 0x57, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x57, - 0x03, 0xab, 0x00, 0x49, 0x03, 0xab, 0x00, 0x35, 0x05, 0x34, 0x00, 0x58, - 0x01, 0xc7, 0x00, 0x89, 0x04, 0x00, 0x00, 0x3d, 0x01, 0xc7, 0xff, 0x91, - 0x04, 0x73, 0x00, 0x85, 0x04, 0x5c, 0x00, 0x44, 0x03, 0x04, 0x00, 0x57, - 0x02, 0xd5, 0x00, 0x40, 0x02, 0xc9, 0x00, 0x33, 0x02, 0xfc, 0x00, 0x32, - 0x02, 0x8c, 0x00, 0x27, 0x01, 0xd5, 0x00, 0x2e, 0x01, 0xd5, 0x00, 0x2c, - 0x03, 0x04, 0x00, 0x3b, 0x03, 0x11, 0x00, 0x60, 0x01, 0x42, 0x00, 0x11, - 0x01, 0x42, 0x00, 0x64, 0x01, 0x42, 0x00, 0x64, 0x01, 0x42, 0x00, 0x11, - 0x02, 0x2a, 0xff, 0xff, 0x01, 0x42, 0x00, 0x57, 0x01, 0x42, 0x00, 0x03, - 0x02, 0x33, 0x00, 0x58, 0x04, 0x93, 0x00, 0x5b, 0x04, 0x93, 0x00, 0x5b, - 0x03, 0x0f, 0xff, 0xc1, 0x03, 0x0f, 0x00, 0x5f, 0x03, 0x0e, 0x00, 0x5f, - 0x03, 0x05, 0x00, 0x3a, 0x03, 0x00, 0x00, 0x37, 0x02, 0xb8, 0x00, 0x2f, - 0x01, 0x42, 0xff, 0xaf, 0x01, 0xc2, 0x00, 0x22, 0x03, 0x0f, 0x00, 0x13, - 0x03, 0x1a, 0x00, 0x38, 0x03, 0x06, 0x00, 0x5b, 0x02, 0xd4, 0x00, 0x57, - 0x02, 0x92, 0xff, 0xf3, 0x02, 0xde, 0x00, 0x3c, 0x02, 0xde, 0x00, 0x2e, - 0x02, 0xde, 0x00, 0x25, 0x02, 0xf4, 0x00, 0x2e, 0x02, 0xea, 0x00, 0x3c, - 0x00, 0x00, 0xfe, 0xb0, 0x00, 0x00, 0xfe, 0x84, 0x00, 0x00, 0xff, 0x85, - 0x00, 0x00, 0xfe, 0xa9, 0x00, 0x00, 0xfe, 0xc6, 0x00, 0x00, 0xfe, 0xd4, - 0x00, 0x00, 0xfe, 0xc6, 0x00, 0x00, 0xfe, 0xd4, 0x00, 0x00, 0xfe, 0x62, - 0x00, 0x00, 0xfe, 0x62, 0x00, 0x00, 0xff, 0x6f, 0x00, 0x00, 0xff, 0x74, - 0x00, 0x00, 0xfe, 0xe8, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x84, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x84, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x84, - 0x05, 0xc7, 0x00, 0x68, 0x04, 0x00, 0x00, 0x57, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x56, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x56, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x04, 0xe3, 0x00, 0xa8, 0x02, 0x39, 0x00, 0x1d, - 0x06, 0x39, 0x00, 0x67, 0x04, 0x73, 0x00, 0x56, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x8e, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8e, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8e, 0x05, 0xc7, 0x00, 0x91, - 0x04, 0x73, 0x00, 0x6c, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8e, - 0x02, 0x39, 0xff, 0xb5, 0x01, 0xc7, 0xff, 0x7c, 0x02, 0x39, 0xff, 0xf8, - 0x02, 0x39, 0x00, 0x07, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x8a, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x8a, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x00, 0x00, 0x8a, 0x04, 0x73, 0x00, 0xa8, 0x01, 0xc7, 0x00, 0x89, - 0x04, 0x73, 0x00, 0xa8, 0x01, 0xc7, 0xff, 0xd0, 0x04, 0x73, 0x00, 0xa8, - 0x01, 0xc7, 0xff, 0xd3, 0x04, 0x73, 0x00, 0xa8, 0x01, 0xc7, 0xff, 0x9a, - 0x06, 0xaa, 0x00, 0xa8, 0x06, 0xaa, 0x00, 0x88, 0x06, 0xaa, 0x00, 0xa8, - 0x06, 0xaa, 0x00, 0x88, 0x06, 0xaa, 0x00, 0xa8, 0x06, 0xaa, 0x00, 0x88, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x88, 0x05, 0xc7, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x88, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x88, - 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x88, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x84, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x84, 0x05, 0xc7, 0x00, 0xa8, - 0x02, 0xaa, 0x00, 0x88, 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x88, - 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x74, 0x05, 0xc7, 0x00, 0xa8, - 0x02, 0xaa, 0x00, 0x54, 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, - 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, 0x05, 0x56, 0x00, 0x5d, - 0x04, 0x00, 0x00, 0x39, 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, - 0x05, 0x56, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x39, 0x04, 0xe3, 0x00, 0x2e, - 0x02, 0x39, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x2e, 0x02, 0x39, 0x00, 0x1f, - 0x04, 0xe3, 0x00, 0x2e, 0x02, 0x39, 0x00, 0x1f, 0x04, 0xe3, 0x00, 0x2e, - 0x02, 0x39, 0x00, 0x08, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, - 0x04, 0x73, 0x00, 0x85, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x05, 0x56, 0x00, 0x09, - 0x04, 0x00, 0x00, 0x07, 0x05, 0x56, 0x00, 0x09, 0x04, 0x00, 0x00, 0x07, - 0x07, 0x8d, 0x00, 0x09, 0x05, 0xc7, 0xff, 0xfd, 0x07, 0x8d, 0x00, 0x09, - 0x05, 0xc7, 0xff, 0xfd, 0x07, 0x8d, 0x00, 0x09, 0x05, 0xc7, 0xff, 0xfd, - 0x07, 0x8d, 0x00, 0x09, 0x05, 0xc7, 0xff, 0xfd, 0x07, 0x8d, 0x00, 0x09, - 0x05, 0xc7, 0xff, 0xfd, 0x05, 0x56, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x17, - 0x05, 0x56, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x17, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0x00, 0x00, 0x05, 0x04, 0xe3, 0x00, 0x41, 0x04, 0x00, 0x00, 0x53, - 0x04, 0xe3, 0x00, 0x41, 0x04, 0x00, 0x00, 0x53, 0x04, 0xe3, 0x00, 0x41, - 0x04, 0x00, 0x00, 0x53, 0x04, 0x73, 0x00, 0x8e, 0x02, 0x39, 0x00, 0x0b, - 0x05, 0xc7, 0xff, 0xfd, 0x04, 0x00, 0x00, 0x05, 0x04, 0x73, 0x00, 0x57, - 0x01, 0xc7, 0x00, 0x8a, 0x05, 0x9f, 0x00, 0xa8, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x31, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0x04, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x31, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, - 0x04, 0x73, 0x00, 0x57, 0x05, 0x56, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x57, - 0x02, 0x39, 0x00, 0x51, 0x01, 0xc7, 0x00, 0x0a, 0x02, 0x39, 0x00, 0xbc, - 0x01, 0xc7, 0x00, 0x89, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x25, - 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, - 0x04, 0x73, 0x00, 0x56, 0x06, 0x39, 0x00, 0x61, 0x04, 0x73, 0x00, 0x56, - 0x06, 0xdc, 0x00, 0x61, 0x05, 0x3f, 0x00, 0x56, 0x06, 0xdc, 0x00, 0x61, - 0x05, 0x3f, 0x00, 0x56, 0x06, 0xdc, 0x00, 0x61, 0x05, 0x3f, 0x00, 0x56, - 0x06, 0xdc, 0x00, 0x61, 0x05, 0x3f, 0x00, 0x56, 0x06, 0xdc, 0x00, 0x61, - 0x05, 0x3f, 0x00, 0x56, 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, - 0x05, 0xc7, 0x00, 0x9e, 0x04, 0x73, 0x00, 0x85, 0x06, 0xd5, 0x00, 0x9e, - 0x05, 0x5b, 0x00, 0x85, 0x06, 0xd5, 0x00, 0x9e, 0x05, 0x5b, 0x00, 0x85, - 0x06, 0xd5, 0x00, 0x9e, 0x05, 0x5b, 0x00, 0x85, 0x06, 0xd5, 0x00, 0x9e, - 0x05, 0x5b, 0x00, 0x85, 0x06, 0xd5, 0x00, 0x9e, 0x05, 0x5b, 0x00, 0x85, - 0x05, 0x56, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x05, 0x05, 0x56, 0x00, 0x2d, - 0x04, 0x00, 0x00, 0x05, 0x05, 0x56, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x05, - 0x05, 0x56, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x05, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, - 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x2a, - 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x3f, 0x06, 0x82, 0x00, 0x3f, - 0x03, 0x91, 0x00, 0x46, 0x03, 0x91, 0x00, 0x46, 0x03, 0x91, 0x00, 0x46, - 0x03, 0x91, 0x00, 0x46, 0x03, 0x91, 0x00, 0x46, 0x03, 0x91, 0x00, 0x46, - 0x06, 0x1e, 0x00, 0x0f, 0x06, 0x1e, 0x00, 0x08, 0x07, 0x6c, 0x00, 0x18, - 0x07, 0x6c, 0x00, 0x18, 0x07, 0x6c, 0x00, 0x18, 0x07, 0x6c, 0x00, 0x18, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x06, 0x8f, 0x00, 0x0f, - 0x06, 0x8f, 0x00, 0x08, 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0x00, 0x2a, - 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0xff, 0xfa, - 0x08, 0x1f, 0xff, 0xfa, 0x01, 0xc7, 0x00, 0x89, 0x01, 0xc7, 0x00, 0x89, - 0x01, 0xc7, 0xff, 0xb3, 0x01, 0xc7, 0xff, 0xb3, 0x01, 0xc7, 0x00, 0x03, - 0x01, 0xc7, 0x00, 0x03, 0x01, 0xc7, 0xff, 0x8c, 0x01, 0xc7, 0xff, 0x8c, - 0x03, 0x01, 0x00, 0x0f, 0x03, 0x01, 0x00, 0x08, 0x04, 0x91, 0x00, 0x18, - 0x04, 0x91, 0x00, 0x18, 0x04, 0x91, 0x00, 0x18, 0x04, 0x91, 0x00, 0x18, - 0x04, 0x91, 0xff, 0xfa, 0x04, 0x91, 0xff, 0xfa, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x56, 0x06, 0x9d, 0x00, 0x0f, - 0x06, 0x9d, 0x00, 0x08, 0x08, 0x2d, 0x00, 0x18, 0x08, 0x2d, 0x00, 0x18, - 0x07, 0xc9, 0x00, 0x18, 0x07, 0xc9, 0x00, 0x18, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x06, 0x82, 0x00, 0x08, 0x07, 0xae, 0x00, 0x18, - 0x08, 0x12, 0x00, 0x18, 0x07, 0xae, 0xff, 0xef, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x5f, 0x00, 0x0f, 0x06, 0x5f, 0x00, 0x08, - 0x07, 0xef, 0x00, 0x18, 0x07, 0xef, 0x00, 0x18, 0x07, 0x8b, 0x00, 0x18, - 0x07, 0x8b, 0x00, 0x18, 0x07, 0x8b, 0xff, 0xe9, 0x07, 0x8b, 0xff, 0xe9, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x03, 0x91, 0x00, 0x46, - 0x03, 0x91, 0x00, 0x46, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x01, 0xc7, 0x00, 0x10, 0x01, 0xc7, 0x00, 0x89, 0x04, 0x73, 0x00, 0x56, - 0x04, 0x73, 0x00, 0x56, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, - 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x2a, - 0x06, 0x82, 0x00, 0x2a, 0x06, 0x82, 0x00, 0x3f, 0x06, 0x82, 0x00, 0x3f, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x06, 0x8f, 0x00, 0x0f, - 0x06, 0x8f, 0x00, 0x08, 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0x00, 0x18, - 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0x00, 0x18, 0x08, 0x1f, 0xff, 0xdd, - 0x08, 0x1f, 0xff, 0xdd, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x5f, 0x00, 0x0f, 0x06, 0x5f, 0x00, 0x08, 0x07, 0xef, 0x00, 0x18, - 0x07, 0xef, 0x00, 0x18, 0x07, 0x8b, 0x00, 0x18, 0x07, 0x8b, 0x00, 0x18, - 0x07, 0x8b, 0xff, 0xe9, 0x07, 0x8b, 0xff, 0xe9, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, - 0x05, 0x56, 0x00, 0x04, 0x05, 0x56, 0x00, 0x04, 0x02, 0xaa, 0x00, 0xf3, - 0x02, 0xaa, 0x01, 0x14, 0x02, 0xaa, 0x00, 0xf3, 0x02, 0xaa, 0xff, 0xe9, - 0x02, 0xaa, 0x00, 0x11, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, 0x04, 0x73, 0x00, 0x6a, - 0x06, 0x82, 0x00, 0x22, 0x06, 0x82, 0x00, 0x42, 0x06, 0xf3, 0x00, 0x22, - 0x06, 0xf3, 0x00, 0x42, 0x05, 0xc7, 0x00, 0xa8, 0x02, 0xaa, 0x00, 0x2a, - 0x02, 0xaa, 0x00, 0x2a, 0x02, 0xaa, 0xff, 0xef, 0x01, 0xc7, 0xff, 0x96, - 0x01, 0xc7, 0xff, 0xcf, 0x01, 0xc7, 0xff, 0xc9, 0x01, 0xc7, 0xff, 0xc8, - 0x01, 0xc7, 0xff, 0x77, 0x01, 0xc7, 0xff, 0xa2, 0x02, 0x39, 0xff, 0xca, - 0x02, 0x39, 0x00, 0x0c, 0x03, 0x65, 0x00, 0x20, 0x03, 0x65, 0x00, 0x57, - 0x02, 0xaa, 0x00, 0x2a, 0x02, 0xaa, 0x00, 0x2a, 0x02, 0xaa, 0xff, 0xef, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x8d, 0x00, 0x84, 0x04, 0x8d, 0x00, 0x84, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x05, 0x56, 0x00, 0x2d, - 0x05, 0x56, 0x00, 0x2d, 0x06, 0xe6, 0x00, 0x4b, 0x07, 0x18, 0x00, 0x7a, - 0x06, 0x1e, 0x00, 0x08, 0x02, 0xaa, 0xff, 0xea, 0x02, 0xaa, 0xff, 0xea, - 0x02, 0xaa, 0x00, 0xcb, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, 0x06, 0x3f, 0x00, 0x53, - 0x07, 0x65, 0x00, 0x5c, 0x06, 0x9d, 0xff, 0xe9, 0x07, 0x27, 0x00, 0x5c, - 0x06, 0x5f, 0x00, 0x2f, 0x05, 0xfb, 0x00, 0x57, 0x02, 0xaa, 0x00, 0xf3, - 0x02, 0xaa, 0x00, 0xec, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xab, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x55, 0x00, 0x00, 0x04, 0x73, 0x00, 0x00, - 0x02, 0x39, 0x00, 0x00, 0x01, 0x9a, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd6, 0x00, 0x00, 0xff, 0x20, - 0x00, 0x00, 0xff, 0xd7, 0x00, 0x00, 0xfe, 0x4c, 0x04, 0x73, 0x00, 0x00, - 0x04, 0x73, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x4e, 0x00, 0xb3, 0x04, 0x6b, 0xff, 0xe1, 0x01, 0xc7, 0x00, 0x7f, - 0x01, 0xc7, 0x00, 0x7f, 0x01, 0xc7, 0x00, 0x7f, 0x01, 0xc7, 0x00, 0x7e, - 0x02, 0xaa, 0x00, 0x4b, 0x02, 0xaa, 0x00, 0x4b, 0x02, 0xaa, 0x00, 0x4b, - 0x02, 0xaa, 0x00, 0x48, 0x04, 0x73, 0x00, 0x8a, 0x04, 0x73, 0x00, 0x88, - 0x02, 0xcd, 0x00, 0x51, 0x08, 0x00, 0x01, 0x16, 0x00, 0x00, 0xff, 0xd7, - 0x00, 0x00, 0xfe, 0x4d, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0x12, - 0x00, 0x00, 0xff, 0x12, 0x01, 0x9a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x37, - 0x01, 0x80, 0x00, 0x55, 0x02, 0xd5, 0x00, 0x55, 0x02, 0xd5, 0xff, 0xa4, - 0x02, 0xaa, 0x00, 0x58, 0x02, 0xaa, 0x00, 0x59, 0x04, 0x00, 0x00, 0xb9, - 0x02, 0xaa, 0xff, 0xc0, 0x01, 0x56, 0xfe, 0x60, 0x02, 0x39, 0x00, 0xbb, - 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, 0x10, - 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, 0x12, - 0x02, 0xaa, 0x00, 0x0e, 0x02, 0xaa, 0x00, 0x35, 0x02, 0xaa, 0x00, 0x2b, - 0x02, 0xaa, 0x00, 0x2d, 0x02, 0xeb, 0x00, 0x65, 0x02, 0xfa, 0x00, 0x3d, - 0x02, 0xf9, 0x00, 0x36, 0x03, 0x05, 0x00, 0x3b, 0x02, 0xa0, 0x00, 0x04, - 0x02, 0xf9, 0x00, 0x36, 0x04, 0x73, 0x00, 0x0e, 0x05, 0xc7, 0x00, 0x68, - 0x05, 0xc7, 0x00, 0x68, 0x04, 0x73, 0x00, 0x04, 0x04, 0x73, 0x00, 0x3a, - 0x06, 0xaa, 0x00, 0x88, 0x05, 0xc7, 0x00, 0x19, 0x08, 0xc0, 0x00, 0x9e, - 0x09, 0x50, 0x00, 0xa8, 0x07, 0x8d, 0x00, 0x13, 0x06, 0xcb, 0x00, 0xb4, - 0x04, 0x1b, 0x00, 0xa1, 0x04, 0x73, 0x00, 0x10, 0x05, 0x56, 0x00, 0x1f, - 0x04, 0xe3, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x29, 0x04, 0x2b, 0x00, 0x05, - 0x05, 0x56, 0x00, 0x19, 0x06, 0x39, 0x00, 0x67, 0x05, 0x56, 0x00, 0x00, - 0x04, 0x73, 0x00, 0x0f, 0x05, 0xc7, 0x00, 0x68, 0x00, 0x00, 0xfe, 0x9b, - 0x07, 0x15, 0x00, 0x45, 0x02, 0x96, 0x00, 0x13, 0x08, 0x95, 0x00, 0xbc, - 0x05, 0xe5, 0x00, 0x1f, 0x08, 0x00, 0x00, 0xbc, 0x06, 0x25, 0x00, 0x6c, - 0x04, 0xcd, 0x00, 0x58, 0x07, 0x8b, 0x00, 0x08, 0x03, 0xeb, 0x00, 0x60, - 0x06, 0xac, 0x00, 0x50, 0x06, 0xac, 0x00, 0x22, 0x06, 0xac, 0x00, 0x50, - 0x06, 0xac, 0x00, 0x3d, 0x06, 0xac, 0x00, 0x5d, 0x06, 0xac, 0x00, 0x91, - 0x04, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x01, 0xa2, 0x04, 0x00, 0x01, 0x10, - 0x08, 0x00, 0x01, 0xa2, 0x04, 0x00, 0x01, 0x10, 0x08, 0x00, 0x01, 0xa2, - 0x04, 0x00, 0x01, 0x10, 0x04, 0x00, 0x01, 0x10, 0x03, 0xf4, 0x00, 0x38, - 0x04, 0xe5, 0x00, 0x04, 0x06, 0x96, 0x00, 0xeb, 0x05, 0xb4, 0x00, 0x9a, - 0x04, 0xac, 0x00, 0x65, 0x01, 0x56, 0xfe, 0x60, 0x02, 0x39, 0x00, 0xbb, - 0x04, 0x64, 0x00, 0x33, 0x05, 0xb4, 0x00, 0x57, 0x07, 0xd5, 0x01, 0x98, - 0x05, 0xc0, 0x01, 0x16, 0x02, 0x31, 0xff, 0x9e, 0x04, 0x64, 0x00, 0x38, - 0x04, 0x64, 0x00, 0x41, 0x04, 0xab, 0x00, 0x64, 0x04, 0x64, 0x00, 0x3f, - 0x04, 0x64, 0x00, 0x41, 0x04, 0xd5, 0x00, 0x9d, 0x04, 0xac, 0x00, 0x64, - 0x04, 0xd5, 0x02, 0x22, 0x04, 0xd5, 0x01, 0x05, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0x00, 0x01, 0xd8, 0x05, 0xab, 0x02, 0x8d, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0x02, 0x8d, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0x02, 0x8d, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0x01, 0xd9, - 0x05, 0xab, 0x02, 0x8d, 0x05, 0xab, 0x01, 0xd9, 0x05, 0xab, 0x01, 0xd9, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0x02, 0x8d, 0x05, 0xab, 0x01, 0xd9, 0x05, 0xab, 0x01, 0xd9, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0x02, 0x8d, 0x05, 0xab, 0x01, 0xd9, 0x05, 0xab, 0x01, 0xd9, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, 0x05, 0xab, 0xff, 0xf6, - 0x05, 0xab, 0x00, 0x00, 0x05, 0xab, 0x00, 0x00, 0x05, 0xab, 0x00, 0x00, - 0x05, 0xab, 0x00, 0x00, 0x05, 0xab, 0x02, 0xd5, 0x05, 0xab, 0x00, 0x67, - 0x05, 0xab, 0x00, 0x00, 0x05, 0xd5, 0x00, 0x00, 0x04, 0xd5, 0x00, 0x7b, - 0x04, 0xd5, 0x00, 0x06, 0x02, 0xd6, 0x00, 0x6d, 0x02, 0xd6, 0x00, 0x6d, - 0x08, 0x00, 0x00, 0x00, 0x07, 0xeb, 0x01, 0x9e, 0x07, 0xeb, 0x01, 0x91, - 0x07, 0xeb, 0x01, 0x9e, 0x07, 0xeb, 0x01, 0x91, 0x03, 0xf4, 0x00, 0x08, - 0x04, 0xd5, 0x00, 0xa7, 0x04, 0xc1, 0x00, 0x62, 0x04, 0xd5, 0x00, 0xb2, - 0x04, 0xd5, 0x00, 0x29, 0x04, 0xd5, 0x00, 0x29, 0x02, 0xd6, 0x00, 0x73, - 0x08, 0x2b, 0x01, 0xb1, 0x08, 0x6b, 0x01, 0xd1, 0x07, 0x55, 0x01, 0x46, - 0x06, 0x00, 0x01, 0xda, 0x06, 0x00, 0x01, 0x51, 0x04, 0x40, 0x00, 0x3b, - 0x05, 0x40, 0x00, 0x3c, 0x04, 0xc0, 0x00, 0x66, 0x04, 0x15, 0x00, 0x42, - 0x04, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x01, 0x10, 0x04, 0x00, 0x00, 0x32, - 0x04, 0x73, 0x00, 0x19, 0x01, 0xc7, 0x00, 0x1c, 0x04, 0x73, 0xff, 0xf3, - 0x05, 0x56, 0x00, 0x1a, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x50, - 0x02, 0x39, 0xff, 0x7a, 0x05, 0xc7, 0x00, 0xa8, 0x04, 0x73, 0x00, 0x8e, - 0x05, 0x56, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x8a, 0x04, 0xe3, 0x00, 0x41, - 0x04, 0x00, 0x00, 0x31, 0x05, 0xdc, 0x00, 0x61, 0x04, 0xc6, 0x00, 0x07, - 0x08, 0x4c, 0x00, 0x09, 0x06, 0xba, 0xff, 0xfd, 0x04, 0x00, 0x00, 0x2d, - 0x04, 0x9e, 0x00, 0xa8, 0x03, 0x67, 0x00, 0x8e, 0x05, 0x30, 0x00, 0x55, - 0x02, 0xaa, 0x00, 0x41, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, 0xb3, - 0x00, 0x00, 0xfe, 0xee, 0x00, 0x00, 0xfe, 0xee, 0x04, 0x00, 0x00, 0x99, - 0x04, 0x00, 0x00, 0x99, 0x02, 0x39, 0x00, 0xb0, 0x02, 0x39, 0x00, 0xb0, - 0x02, 0x39, 0x00, 0xb0, 0x00, 0x00, 0xfe, 0xa0, 0x00, 0x00, 0xfe, 0xa0, - 0x02, 0xaa, 0x00, 0x1c, 0x02, 0x39, 0x00, 0xbb, 0x03, 0x80, 0x00, 0x64, - 0x01, 0x87, 0x00, 0x64, 0x01, 0x87, 0x00, 0x64, 0x04, 0x00, 0x00, 0x1d, - 0x04, 0x00, 0x00, 0x1d, 0x02, 0x14, 0x00, 0xae, 0x00, 0x00, 0xfe, 0xb6, - 0x04, 0x12, 0x00, 0xae, 0x04, 0xa8, 0x00, 0x29, 0x05, 0x06, 0x00, 0x42, - 0x04, 0x6f, 0x00, 0x29, 0x05, 0x12, 0x00, 0x98, 0x04, 0x33, 0x00, 0x50, - 0x04, 0x3d, 0x00, 0x46, 0x05, 0x6d, 0x00, 0xae, 0x04, 0x46, 0x00, 0x27, - 0x05, 0x87, 0x00, 0x3d, 0x04, 0x7f, 0x00, 0x5a, 0x05, 0xd7, 0x00, 0x33, - 0x05, 0xd7, 0x00, 0x33, 0x05, 0xd7, 0x00, 0x33, 0x05, 0xd7, 0x00, 0x33, - 0x05, 0x06, 0x00, 0x42, 0x05, 0x06, 0x00, 0x42, 0x05, 0x06, 0x00, 0x42, - 0x04, 0xc9, 0x00, 0x52, 0x03, 0x62, 0x00, 0x3f, 0x04, 0x6f, 0x00, 0x29, - 0x05, 0x12, 0x00, 0x98, 0x02, 0x14, 0xff, 0xba, 0x02, 0x96, 0xff, 0xcb, - 0x05, 0x39, 0x00, 0xa4, 0x02, 0x14, 0xff, 0xba, 0x04, 0x46, 0x00, 0x27, - 0x04, 0x33, 0x00, 0x50, 0x04, 0x3d, 0x00, 0x46, 0x05, 0x7f, 0x00, 0x37, - 0x03, 0x1d, 0x00, 0x48, 0x05, 0x3f, 0x00, 0x33, 0x04, 0xfc, 0x00, 0x85, - 0x04, 0xe1, 0x00, 0x8f, 0x04, 0x5c, 0x00, 0x0a, 0x04, 0xb8, 0x00, 0x7b, - 0x04, 0x46, 0x00, 0x27, 0x05, 0xd7, 0x00, 0x33, 0x05, 0x87, 0x00, 0x3d, - 0x02, 0x14, 0x00, 0xae, 0x04, 0xc9, 0x00, 0x52, 0x04, 0x33, 0x00, 0x50, - 0x04, 0xe1, 0x00, 0x8f, 0x05, 0x06, 0x00, 0x50, 0x00, 0x00, 0xfc, 0xe9, - 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x7f, 0x02, 0xaa, 0xff, 0xe5, - 0x01, 0xc7, 0x00, 0x7c, 0x01, 0xc7, 0x00, 0x82, 0x02, 0x5a, 0x00, 0x6a, - 0x02, 0x5a, 0x00, 0x48, 0x02, 0x98, 0x00, 0x00, 0x02, 0x98, 0x00, 0x00, - 0x02, 0x87, 0x00, 0x2d, 0x02, 0xa0, 0xff, 0xe9, 0x03, 0x2f, 0x00, 0x20, - 0x02, 0x48, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, - 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0xfe, 0x17, 0x00, 0x00, 0xfd, 0x11, - 0x00, 0x00, 0xfc, 0x58, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, - 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x6a, - 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0xfe, 0x17, 0x00, 0x00, 0xfe, 0x17, - 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, - 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, - 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0x8b, 0x00, 0x00, 0xfb, 0xeb, - 0x00, 0x00, 0xfc, 0xcf, 0x00, 0x00, 0xfb, 0xa6, 0x00, 0x00, 0xff, 0xe9, - 0x00, 0x00, 0xfd, 0x6d, 0x00, 0x00, 0xfe, 0x84, 0x00, 0x00, 0xfe, 0xca, - 0x00, 0x00, 0xfc, 0xf9, 0x00, 0x00, 0xfd, 0x7a, 0x00, 0x00, 0xfd, 0x66, - 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfd, 0x23, 0x00, 0x00, 0xfc, 0x3a, - 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xff, 0xe9, - 0x00, 0x00, 0xff, 0xe9, 0x01, 0xc7, 0x00, 0x88, 0x00, 0x00, 0xfe, 0xd6, - 0x00, 0x00, 0xfe, 0xd6, 0x00, 0x00, 0xfe, 0xcf, 0x00, 0x00, 0xfe, 0xd6, - 0x00, 0x00, 0xfe, 0xee, 0x00, 0x00, 0xfe, 0xc2, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0x4d, 0x04, 0x57, 0x00, 0x52, 0x04, 0x57, 0x00, 0x4d, - 0x04, 0x57, 0x00, 0x4d, 0x04, 0x57, 0x00, 0x46, 0x03, 0x10, 0x00, 0x46, - 0x04, 0x57, 0x00, 0x35, 0x04, 0x57, 0x00, 0x35, 0x04, 0x57, 0x00, 0x4f, - 0x04, 0x57, 0x00, 0x2d, 0x04, 0x57, 0x00, 0x48, 0x03, 0x10, 0x00, 0x2d, - 0x04, 0x57, 0x00, 0x24, 0x04, 0x57, 0x00, 0x25, 0x04, 0x57, 0x00, 0x25, - 0x04, 0x57, 0x00, 0x27, 0x04, 0x57, 0x00, 0x2f, 0x03, 0x10, 0x00, 0x25, - 0x04, 0x57, 0x00, 0x1d, 0x04, 0x57, 0x00, 0x17, 0x04, 0x57, 0x00, 0x36, - 0x04, 0x57, 0x00, 0x36, 0x04, 0x57, 0x00, 0x30, 0x03, 0x10, 0x00, 0x29, - 0x04, 0x57, 0x00, 0x4f, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x5e, 0x03, 0x10, 0x00, 0x4c, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0x50, 0x04, 0x57, 0x00, 0x4c, - 0x04, 0x57, 0x00, 0x46, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x03, 0x10, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x2f, 0x04, 0x57, 0x00, 0x39, - 0x04, 0x57, 0x00, 0x3f, 0x04, 0x57, 0x00, 0x3f, 0x04, 0x57, 0x00, 0x3f, - 0x03, 0x10, 0x00, 0x3f, 0x04, 0x57, 0x00, 0x36, 0x04, 0x57, 0x00, 0x35, - 0x04, 0x57, 0x00, 0x36, 0x04, 0x57, 0x00, 0x36, 0x04, 0x57, 0x00, 0x36, - 0x03, 0x10, 0x00, 0x35, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x03, 0x10, 0x00, 0x68, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x46, - 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x03, 0x10, 0x00, 0x4c, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0x56, - 0x04, 0x57, 0x00, 0x57, 0x04, 0x57, 0x00, 0x59, 0x04, 0x57, 0x00, 0x57, - 0x04, 0x57, 0x00, 0x56, 0x03, 0x10, 0x00, 0x5c, 0x04, 0x57, 0x00, 0x38, - 0x04, 0x57, 0x00, 0x37, 0x04, 0x57, 0x00, 0x37, 0x04, 0x57, 0x00, 0x38, - 0x04, 0x57, 0x00, 0x38, 0x03, 0x10, 0x00, 0x38, 0x04, 0x57, 0x00, 0x47, - 0x04, 0x57, 0x00, 0x45, 0x04, 0x57, 0x00, 0x45, 0x04, 0x57, 0x00, 0x45, - 0x04, 0x57, 0x00, 0x45, 0x03, 0x10, 0x00, 0x45, 0x04, 0x57, 0x00, 0x81, - 0x04, 0x57, 0x00, 0x81, 0x04, 0x57, 0x00, 0x39, 0x04, 0x57, 0x00, 0x39, - 0x04, 0x57, 0x00, 0x3a, 0x03, 0x10, 0x00, 0x39, 0x04, 0x57, 0x00, 0x91, - 0x04, 0x57, 0x00, 0x91, 0x04, 0x57, 0x00, 0x91, 0x04, 0x57, 0x00, 0x91, - 0x04, 0x57, 0x00, 0x91, 0x03, 0x10, 0x00, 0x4c, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4c, - 0x04, 0x57, 0x00, 0x4c, 0x04, 0x57, 0x00, 0x4f, 0x03, 0x10, 0x00, 0x4f, - 0x04, 0x57, 0x00, 0x30, 0x04, 0x57, 0x00, 0x36, 0x04, 0x57, 0x00, 0x36, - 0x04, 0x57, 0x00, 0x17, 0x04, 0x57, 0x00, 0x1d, 0x03, 0x10, 0x00, 0x29, - 0x04, 0x57, 0x00, 0x2f, 0x04, 0x57, 0x00, 0x27, 0x04, 0x57, 0x00, 0x25, - 0x04, 0x57, 0x00, 0x25, 0x04, 0x57, 0x00, 0x24, 0x03, 0x10, 0x00, 0x25, - 0x04, 0x57, 0x00, 0x48, 0x04, 0x57, 0x00, 0x2d, 0x04, 0x57, 0x00, 0x4f, - 0x04, 0x57, 0x00, 0x35, 0x04, 0x57, 0x00, 0x35, 0x03, 0x10, 0x00, 0x2d, - 0x04, 0x57, 0x00, 0x46, 0x04, 0x57, 0x00, 0x4d, 0x04, 0x57, 0x00, 0x4d, - 0x04, 0x57, 0x00, 0x52, 0x04, 0x57, 0x00, 0x4d, 0x03, 0x10, 0x00, 0x46, - 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, 0x04, 0x57, 0x00, 0xa0, - 0x04, 0x57, 0x00, 0xa0, 0x00, 0x00, 0xfe, 0x37, 0x00, 0x00, 0xfe, 0xee, - 0x00, 0x00, 0xfe, 0xee, 0x00, 0x00, 0xfe, 0xc2, 0x00, 0x00, 0xfe, 0xc2, - 0x00, 0x00, 0xff, 0x59, 0x00, 0x00, 0xfe, 0xb5, 0x00, 0x00, 0xfe, 0xd6, - 0x01, 0xc7, 0x00, 0x1a, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, 0x04, 0xa0, 0x00, 0x56, - 0x01, 0xc7, 0xff, 0xc2, 0x01, 0xc7, 0xff, 0xd5, 0x01, 0xc7, 0xff, 0xbd, - 0x01, 0xc7, 0xff, 0xd5, 0x01, 0xc7, 0xff, 0xc2, 0x01, 0xc7, 0xff, 0xc2, - 0x01, 0xc7, 0xff, 0xc2, 0x01, 0xc7, 0xff, 0xc2, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x01, 0xc7, 0xff, 0xcf, 0x01, 0xc7, 0xff, 0xcf, - 0x01, 0xc7, 0xff, 0xc2, 0x01, 0xc7, 0xff, 0xc2, 0x04, 0x60, 0x00, 0x85, - 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, 0x04, 0x60, 0x00, 0x85, - 0x01, 0xc7, 0x00, 0x68, 0x05, 0xc9, 0x00, 0xa8, 0x05, 0xc7, 0x00, 0xa8, - 0x05, 0xc9, 0x00, 0xa8, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0x58, - 0x00, 0x00, 0xfe, 0xdd, 0x00, 0x00, 0xfe, 0xd0, 0x00, 0x00, 0xfe, 0xc2, - 0x00, 0x00, 0xfe, 0xcf, 0x00, 0x00, 0xfe, 0xd7, 0x00, 0x00, 0xfe, 0xdd, - 0x00, 0x00, 0xfe, 0xd7, 0x00, 0x00, 0xfe, 0xd8, 0x00, 0x00, 0xfe, 0xb7, - 0x00, 0x00, 0xfd, 0xec, 0x00, 0x00, 0xfe, 0xb7, 0x00, 0x00, 0xfe, 0xc2, - 0x00, 0x00, 0xfe, 0xc7, 0x00, 0x00, 0xfe, 0xc7, 0x00, 0x00, 0xfe, 0xc7, - 0x00, 0x00, 0xfe, 0xc2, 0x00, 0x00, 0xfe, 0xb7, 0x00, 0x00, 0xfd, 0xec, - 0x00, 0x00, 0xfe, 0xb7, 0x00, 0x00, 0xfe, 0xb5, 0x00, 0x00, 0xfe, 0xb3, - 0x00, 0x00, 0xfe, 0xb3, 0x00, 0x00, 0xfe, 0xb3, 0x00, 0x00, 0xfe, 0xb3, - 0x02, 0xaa, 0x00, 0xcb, 0x02, 0xaa, 0x00, 0xcb, 0x04, 0x3d, 0xff, 0x6b, - 0x04, 0x3d, 0xff, 0x6b, 0x04, 0x46, 0x00, 0x27, 0x04, 0x46, 0x00, 0x27, - 0x05, 0x06, 0x00, 0x50, 0x05, 0x06, 0x00, 0x50, 0x05, 0x06, 0x00, 0x50, - 0x04, 0x3d, 0x00, 0x46, 0x05, 0x06, 0x00, 0x42, 0x00, 0x00, 0xfe, 0x26, - 0x00, 0x00, 0xfe, 0x12, 0x00, 0x00, 0xfe, 0x5c, 0x04, 0x74, 0x00, 0x56, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x03, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x04, 0x08, 0x00, 0x00, 0x00, 0xfe, - 0x00, 0x80, 0x00, 0x06, 0x00, 0x7e, 0x00, 0x7e, 0x03, 0x6f, 0x03, 0x75, - 0x03, 0x7e, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0xa1, 0x03, 0xce, 0x05, 0x13, - 0x05, 0x1d, 0x05, 0xc7, 0x05, 0xea, 0x05, 0xf4, 0x1d, 0xca, 0x1e, 0x9b, - 0x1e, 0x9e, 0x1e, 0xf9, 0x1f, 0x15, 0x1f, 0x1d, 0x1f, 0x45, 0x1f, 0x4d, - 0x1f, 0x57, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x7d, 0x1f, 0xb4, - 0x1f, 0xc4, 0x1f, 0xd3, 0x1f, 0xdb, 0x1f, 0xef, 0x1f, 0xf4, 0x1f, 0xfe, - 0x20, 0x0f, 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x34, 0x20, 0x3a, - 0x20, 0x3c, 0x20, 0x3e, 0x20, 0x44, 0x20, 0x5e, 0x20, 0x6f, 0x20, 0x75, - 0x20, 0x78, 0x20, 0x7f, 0x20, 0x94, 0x20, 0xb5, 0x20, 0xf0, 0x21, 0x05, - 0x21, 0x13, 0x21, 0x17, 0x21, 0x22, 0x21, 0x26, 0x21, 0x2e, 0x21, 0x4e, - 0x21, 0x54, 0x21, 0x5e, 0x21, 0x84, 0x21, 0x95, 0x21, 0xa8, 0x22, 0x02, - 0x22, 0x06, 0x22, 0x0f, 0x22, 0x12, 0x22, 0x15, 0x22, 0x1a, 0x22, 0x1f, - 0x22, 0x29, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x61, 0x22, 0x65, 0x23, 0x02, - 0x23, 0x10, 0x23, 0x21, 0x25, 0x00, 0x25, 0x02, 0x25, 0x0c, 0x25, 0x10, - 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, 0x25, 0x34, - 0x25, 0x3c, 0x25, 0x6c, 0x25, 0x80, 0x25, 0x84, 0x25, 0x88, 0x25, 0x8c, - 0x25, 0x93, 0x25, 0xa1, 0x25, 0xac, 0x25, 0xb2, 0x25, 0xba, 0x25, 0xbc, - 0x25, 0xc4, 0x25, 0xcc, 0x25, 0xcf, 0x25, 0xd9, 0x25, 0xe6, 0x26, 0x3c, - 0x26, 0x40, 0x26, 0x42, 0x26, 0x60, 0x26, 0x63, 0x26, 0x66, 0x26, 0x6b, - 0x26, 0x6f, 0x2c, 0x6d, 0x2c, 0x77, 0x2e, 0x17, 0xa7, 0x21, 0xa7, 0x8c, - 0xfb, 0x02, 0xfb, 0x36, 0xfb, 0x3c, 0xfb, 0x3e, 0xfb, 0x41, 0xfb, 0x44, - 0xfb, 0x4f, 0xfe, 0x23, 0xff, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x20, - 0x00, 0xa0, 0x03, 0x74, 0x03, 0x7a, 0x03, 0x84, 0x03, 0x8c, 0x03, 0x8e, - 0x03, 0xa3, 0x03, 0xd0, 0x05, 0x1a, 0x05, 0x91, 0x05, 0xd0, 0x05, 0xf0, - 0x1d, 0x00, 0x1d, 0xfe, 0x1e, 0x9e, 0x1e, 0xa0, 0x1f, 0x00, 0x1f, 0x18, - 0x1f, 0x20, 0x1f, 0x48, 0x1f, 0x50, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, - 0x1f, 0x5f, 0x1f, 0x80, 0x1f, 0xb6, 0x1f, 0xc6, 0x1f, 0xd6, 0x1f, 0xdd, - 0x1f, 0xf2, 0x1f, 0xf6, 0x20, 0x00, 0x20, 0x12, 0x20, 0x26, 0x20, 0x2a, - 0x20, 0x32, 0x20, 0x39, 0x20, 0x3c, 0x20, 0x3e, 0x20, 0x44, 0x20, 0x5e, - 0x20, 0x6a, 0x20, 0x74, 0x20, 0x77, 0x20, 0x7f, 0x20, 0x90, 0x20, 0xa0, - 0x20, 0xf0, 0x21, 0x05, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, - 0x21, 0x2e, 0x21, 0x4d, 0x21, 0x53, 0x21, 0x5b, 0x21, 0x84, 0x21, 0x90, - 0x21, 0xa8, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x11, 0x22, 0x15, - 0x22, 0x19, 0x22, 0x1e, 0x22, 0x29, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, - 0x22, 0x64, 0x23, 0x02, 0x23, 0x10, 0x23, 0x20, 0x25, 0x00, 0x25, 0x02, - 0x25, 0x0c, 0x25, 0x10, 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, - 0x25, 0x2c, 0x25, 0x34, 0x25, 0x3c, 0x25, 0x50, 0x25, 0x80, 0x25, 0x84, - 0x25, 0x88, 0x25, 0x8c, 0x25, 0x90, 0x25, 0xa0, 0x25, 0xaa, 0x25, 0xb2, - 0x25, 0xba, 0x25, 0xbc, 0x25, 0xc4, 0x25, 0xca, 0x25, 0xcf, 0x25, 0xd8, - 0x25, 0xe6, 0x26, 0x3a, 0x26, 0x40, 0x26, 0x42, 0x26, 0x60, 0x26, 0x63, - 0x26, 0x65, 0x26, 0x6a, 0x26, 0x6f, 0x2c, 0x60, 0x2c, 0x71, 0x2e, 0x17, - 0xa7, 0x17, 0xa7, 0x88, 0xfb, 0x01, 0xfb, 0x1d, 0xfb, 0x38, 0xfb, 0x3e, - 0xfb, 0x40, 0xfb, 0x43, 0xfb, 0x46, 0xfe, 0x20, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xe3, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xba, 0xff, 0xb5, 0xff, 0xb4, - 0xff, 0xb3, 0xff, 0xb2, 0xff, 0xb1, 0xff, 0xab, 0xff, 0x38, 0xff, 0x30, - 0xff, 0x2b, 0xe8, 0x20, 0xe7, 0xed, 0xe7, 0xeb, 0xe7, 0xea, 0xe7, 0xe4, - 0xe7, 0xe2, 0xe7, 0xe0, 0xe7, 0xde, 0xe7, 0xdc, 0xe7, 0xdb, 0xe7, 0xda, - 0xe7, 0xd9, 0xe7, 0xd8, 0xe7, 0xd6, 0xe7, 0xd5, 0xe7, 0xd4, 0xe7, 0xd2, - 0xe7, 0xd1, 0xe7, 0xcf, 0xe7, 0xce, 0xe7, 0xcd, 0xe7, 0xcb, 0xe7, 0xc8, - 0xe7, 0xc5, 0xe7, 0xc4, 0xe7, 0xc0, 0xe7, 0xbf, 0xe7, 0xbe, 0xe7, 0xb9, - 0xe7, 0xa0, 0xe7, 0x95, 0xe7, 0x91, 0xe7, 0x90, 0xe7, 0x8a, 0xe7, 0x7a, - 0xe7, 0x6f, 0xe7, 0x35, 0xe7, 0x21, 0xe7, 0x14, 0xe7, 0x12, 0xe7, 0x08, - 0xe7, 0x05, 0xe6, 0xfe, 0xe6, 0xe0, 0xe6, 0xdc, 0xe6, 0xd6, 0xe6, 0xb1, - 0xe6, 0xa6, 0xe6, 0x94, 0xe6, 0x3b, 0xe6, 0x38, 0xe6, 0x30, 0xe6, 0x2f, - 0xe6, 0x2d, 0xe6, 0x2a, 0xe6, 0x27, 0xe6, 0x1e, 0xe6, 0x1d, 0xe6, 0x01, - 0xe5, 0xea, 0xe5, 0xe8, 0xe5, 0x4c, 0xe5, 0x3f, 0xe5, 0x30, 0xe3, 0x52, - 0xe3, 0x51, 0xe3, 0x48, 0xe3, 0x45, 0xe3, 0x42, 0xe3, 0x3f, 0xe3, 0x3c, - 0xe3, 0x35, 0xe3, 0x2e, 0xe3, 0x27, 0xe3, 0x20, 0xe3, 0x0d, 0xe2, 0xfa, - 0xe2, 0xf7, 0xe2, 0xf4, 0xe2, 0xf1, 0xe2, 0xee, 0xe2, 0xe2, 0xe2, 0xda, - 0xe2, 0xd5, 0xe2, 0xce, 0xe2, 0xcd, 0xe2, 0xc6, 0xe2, 0xc1, 0xe2, 0xbf, - 0xe2, 0xb7, 0xe2, 0xab, 0xe2, 0x58, 0xe2, 0x55, 0xe2, 0x54, 0xe2, 0x37, - 0xe2, 0x35, 0xe2, 0x34, 0xe2, 0x31, 0xe2, 0x2e, 0xdc, 0x3e, 0xdc, 0x3b, - 0xda, 0x9c, 0x61, 0x9d, 0x61, 0x37, 0x0d, 0xc3, 0x0d, 0xa9, 0x0d, 0xa8, - 0x0d, 0xa7, 0x0d, 0xa6, 0x0d, 0xa5, 0x0d, 0xa4, 0x0a, 0xd4, 0x08, 0xfc, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, - 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, - 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, - 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, - 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, - 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, - 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, - 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, - 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, - 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, - 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, - 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, - 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, - 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, - 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, - 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, - 0x00, 0x60, 0x00, 0x61, 0x00, 0x00, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, - 0x00, 0x8b, 0x00, 0x93, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa3, 0x00, 0xa2, - 0x00, 0xa4, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xab, - 0x00, 0xaa, 0x00, 0xac, 0x00, 0xad, 0x00, 0xaf, 0x00, 0xae, 0x00, 0xb0, - 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xb8, - 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbe, 0x07, 0xeb, - 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x07, 0xed, 0x00, 0x78, - 0x00, 0xa1, 0x00, 0x70, 0x00, 0x6b, 0x08, 0x2a, 0x00, 0x76, 0x00, 0x6a, - 0x08, 0x4a, 0x00, 0x88, 0x00, 0x9a, 0x08, 0x45, 0x00, 0x73, 0x08, 0x4c, - 0x08, 0x4d, 0x00, 0x67, 0x00, 0x77, 0x08, 0x3d, 0x08, 0x40, 0x08, 0x3f, - 0x03, 0x72, 0x08, 0x48, 0x00, 0x6c, 0x00, 0x7c, 0x03, 0x5b, 0x00, 0xa8, - 0x00, 0xba, 0x00, 0x81, 0x00, 0x63, 0x00, 0x6e, 0x08, 0x44, 0x01, 0x54, - 0x08, 0x49, 0x08, 0x3e, 0x00, 0x6d, 0x00, 0x7d, 0x07, 0xee, 0x00, 0x62, - 0x00, 0x82, 0x00, 0x85, 0x00, 0x97, 0x01, 0x14, 0x01, 0x15, 0x07, 0xde, - 0x07, 0xdf, 0x07, 0xe7, 0x07, 0xe8, 0x07, 0xe3, 0x07, 0xe4, 0x00, 0xb9, - 0x08, 0x8b, 0x00, 0xc1, 0x01, 0x3a, 0x07, 0xfd, 0x08, 0x1b, 0x07, 0xf9, - 0x07, 0xfa, 0x08, 0xc4, 0x08, 0xc5, 0x07, 0xec, 0x00, 0x79, 0x07, 0xe5, - 0x07, 0xe9, 0x07, 0xf5, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x83, 0x00, 0x8d, - 0x00, 0x8a, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x8e, 0x00, 0x95, - 0x00, 0x96, 0x00, 0x00, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9b, - 0x00, 0xf3, 0x02, 0x88, 0x02, 0x9e, 0x00, 0x71, 0x02, 0x9a, 0x02, 0x9b, - 0x02, 0x9c, 0x00, 0x7a, 0x02, 0x9f, 0x02, 0x9d, 0x02, 0x89, 0x00, 0x00, - 0x40, 0x47, 0x5b, 0x5a, 0x59, 0x58, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, - 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, - 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, - 0x37, 0x36, 0x35, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x28, 0x27, 0x26, - 0x25, 0x24, 0x23, 0x22, 0x21, 0x1f, 0x18, 0x14, 0x11, 0x10, 0x0f, 0x0e, - 0x0d, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, - 0x00, 0x2c, 0x20, 0xb0, 0x01, 0x60, 0x45, 0xb0, 0x03, 0x25, 0x20, 0x11, - 0x46, 0x61, 0x23, 0x45, 0x23, 0x61, 0x48, 0x2d, 0x2c, 0x20, 0x45, 0x18, - 0x68, 0x44, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x20, 0x61, 0x20, - 0xb0, 0x46, 0x60, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, - 0x23, 0x46, 0x23, 0x61, 0xb0, 0x20, 0x60, 0x20, 0xb0, 0x26, 0x61, 0xb0, - 0x20, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, - 0x46, 0x60, 0xb0, 0x40, 0x61, 0x20, 0xb0, 0x66, 0x60, 0xb0, 0x04, 0x26, - 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, 0x40, - 0x60, 0x20, 0xb0, 0x26, 0x61, 0xb0, 0x40, 0x61, 0xb0, 0x04, 0x26, 0x23, - 0x48, 0x48, 0x2d, 0x2c, 0x01, 0x10, 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, - 0x20, 0x45, 0x23, 0x20, 0xb0, 0xcd, 0x44, 0x23, 0x20, 0xb8, 0x01, 0x5a, - 0x51, 0x58, 0x23, 0x20, 0xb0, 0x8d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0xed, - 0x51, 0x58, 0x23, 0x20, 0xb0, 0x4d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0x04, - 0x26, 0x51, 0x58, 0x23, 0x20, 0xb0, 0x0d, 0x44, 0x23, 0x59, 0x21, 0x21, - 0x2d, 0x2c, 0x20, 0x20, 0x45, 0x18, 0x68, 0x44, 0x20, 0xb0, 0x01, 0x60, - 0x20, 0x45, 0xb0, 0x46, 0x76, 0x68, 0x8a, 0x45, 0x60, 0x44, 0x2d, 0x2c, - 0x01, 0xb1, 0x0b, 0x0a, 0x43, 0x23, 0x43, 0x65, 0x0a, 0x2d, 0x2c, 0x00, - 0xb1, 0x0a, 0x0b, 0x43, 0x23, 0x43, 0x0b, 0x2d, 0x2c, 0x00, 0xb0, 0x28, - 0x23, 0x70, 0xb1, 0x01, 0x28, 0x3e, 0x01, 0xb0, 0x28, 0x23, 0x70, 0xb1, - 0x02, 0x28, 0x45, 0x3a, 0xb1, 0x02, 0x00, 0x08, 0x0d, 0x2d, 0x2c, 0x20, - 0x45, 0xb0, 0x03, 0x25, 0x45, 0x61, 0x64, 0xb0, 0x50, 0x51, 0x58, 0x45, - 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x49, 0xb0, 0x0e, 0x23, 0x44, - 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x00, 0x43, 0x60, 0x44, 0x2d, 0x2c, 0x01, - 0xb0, 0x06, 0x43, 0xb0, 0x07, 0x43, 0x65, 0x0a, 0x2d, 0x2c, 0x20, 0x69, - 0xb0, 0x40, 0x61, 0xb0, 0x00, 0x8b, 0x20, 0xb1, 0x2c, 0xc0, 0x8a, 0x8c, - 0xb8, 0x10, 0x00, 0x62, 0x60, 0x2b, 0x0c, 0x64, 0x23, 0x64, 0x61, 0x5c, - 0x58, 0xb0, 0x03, 0x61, 0x59, 0x2d, 0x2c, 0x8a, 0x03, 0x45, 0x8a, 0x8a, - 0x87, 0xb0, 0x11, 0x2b, 0xb0, 0x29, 0x23, 0x44, 0xb0, 0x29, 0x7a, 0xe4, - 0x18, 0x2d, 0x2c, 0x45, 0x65, 0xb0, 0x2c, 0x23, 0x44, 0x45, 0xb0, 0x2b, - 0x23, 0x44, 0x2d, 0x2c, 0x4b, 0x52, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, - 0x59, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, - 0x2d, 0x2c, 0x01, 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, - 0xb0, 0x01, 0x60, 0x23, 0xed, 0xec, 0x2d, 0x2c, 0x01, 0xb0, 0x05, 0x25, - 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x61, 0x23, 0xed, 0xec, - 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x25, 0x10, 0xf5, 0x00, 0xed, 0xec, 0x2d, - 0x2c, 0xb0, 0x02, 0x43, 0xb0, 0x01, 0x52, 0x58, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x1b, 0x46, 0x23, 0x46, 0x60, 0x8a, 0x8a, 0x46, 0x23, 0x20, 0x46, - 0x8a, 0x60, 0x8a, 0x61, 0xb8, 0xff, 0x80, 0x62, 0x23, 0x20, 0x10, 0x23, - 0x8a, 0xb1, 0x0c, 0x0c, 0x8a, 0x70, 0x45, 0x60, 0x20, 0xb0, 0x00, 0x50, - 0x58, 0xb0, 0x01, 0x61, 0xb8, 0xff, 0xba, 0x8b, 0x1b, 0xb0, 0x46, 0x8c, - 0x59, 0xb0, 0x10, 0x60, 0x68, 0x01, 0x3a, 0x59, 0x2d, 0x2c, 0x20, 0x45, - 0xb0, 0x03, 0x25, 0x46, 0x52, 0x4b, 0xb0, 0x13, 0x51, 0x5b, 0x58, 0xb0, - 0x02, 0x25, 0x46, 0x20, 0x68, 0x61, 0xb0, 0x03, 0x25, 0xb0, 0x03, 0x25, - 0x3f, 0x23, 0x21, 0x38, 0x1b, 0x21, 0x11, 0x59, 0x2d, 0x2c, 0x20, 0x45, - 0xb0, 0x03, 0x25, 0x46, 0x50, 0x58, 0xb0, 0x02, 0x25, 0x46, 0x20, 0x68, - 0x61, 0xb0, 0x03, 0x25, 0xb0, 0x03, 0x25, 0x3f, 0x23, 0x21, 0x38, 0x1b, - 0x21, 0x11, 0x59, 0x2d, 0x2c, 0x00, 0xb0, 0x07, 0x43, 0xb0, 0x06, 0x43, - 0x0b, 0x2d, 0x2c, 0x21, 0x21, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, - 0x00, 0x62, 0x2d, 0x2c, 0x21, 0xb0, 0x80, 0x51, 0x58, 0x0c, 0x64, 0x23, - 0x64, 0x8b, 0xb8, 0x20, 0x00, 0x62, 0x1b, 0xb2, 0x00, 0x40, 0x2f, 0x2b, - 0x59, 0xb0, 0x02, 0x60, 0x2d, 0x2c, 0x21, 0xb0, 0xc0, 0x51, 0x58, 0x0c, - 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x15, 0x55, 0x62, 0x1b, 0xb2, 0x00, 0x80, - 0x2f, 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, 0x2c, 0x0c, 0x64, 0x23, 0x64, - 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x60, 0x23, 0x21, 0x2d, 0x2c, 0x4b, 0x53, - 0x58, 0x8a, 0xb0, 0x04, 0x25, 0x49, 0x64, 0x23, 0x45, 0x69, 0xb0, 0x40, - 0x8b, 0x61, 0xb0, 0x80, 0x62, 0xb0, 0x20, 0x61, 0x6a, 0xb0, 0x0e, 0x23, - 0x44, 0x23, 0x10, 0xb0, 0x0e, 0xf6, 0x1b, 0x21, 0x23, 0x8a, 0x12, 0x11, - 0x20, 0x39, 0x2f, 0x59, 0x2d, 0x2c, 0x4b, 0x53, 0x58, 0x20, 0xb0, 0x03, - 0x25, 0x49, 0x64, 0x69, 0x20, 0xb0, 0x05, 0x26, 0xb0, 0x06, 0x25, 0x49, - 0x64, 0x23, 0x61, 0xb0, 0x80, 0x62, 0xb0, 0x20, 0x61, 0x6a, 0xb0, 0x0e, - 0x23, 0x44, 0xb0, 0x04, 0x26, 0x10, 0xb0, 0x0e, 0xf6, 0x8a, 0x10, 0xb0, - 0x0e, 0x23, 0x44, 0xb0, 0x0e, 0xf6, 0xb0, 0x0e, 0x23, 0x44, 0xb0, 0x0e, - 0xed, 0x1b, 0x8a, 0xb0, 0x04, 0x26, 0x11, 0x12, 0x20, 0x39, 0x23, 0x20, - 0x39, 0x2f, 0x2f, 0x59, 0x2d, 0x2c, 0x45, 0x23, 0x45, 0x60, 0x23, 0x45, - 0x60, 0x23, 0x45, 0x60, 0x23, 0x76, 0x68, 0x18, 0xb0, 0x80, 0x62, 0x20, - 0x2d, 0x2c, 0xb0, 0x48, 0x2b, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x00, 0x54, - 0x58, 0xb0, 0x40, 0x44, 0x20, 0x45, 0xb0, 0x40, 0x61, 0x44, 0x1b, 0x21, - 0x21, 0x59, 0x2d, 0x2c, 0x45, 0xb1, 0x30, 0x2f, 0x45, 0x23, 0x45, 0x61, - 0x60, 0xb0, 0x01, 0x60, 0x69, 0x44, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0xb0, - 0x2f, 0x23, 0x70, 0xb0, 0x14, 0x23, 0x42, 0x1b, 0x21, 0x21, 0x59, 0x2d, - 0x2c, 0x4b, 0x51, 0x58, 0x20, 0xb0, 0x03, 0x25, 0x45, 0x69, 0x53, 0x58, - 0x44, 0x1b, 0x21, 0x21, 0x59, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x45, - 0xb0, 0x14, 0x43, 0xb0, 0x00, 0x60, 0x63, 0xb0, 0x01, 0x60, 0x69, 0x44, - 0x2d, 0x2c, 0xb0, 0x2f, 0x45, 0x44, 0x2d, 0x2c, 0x45, 0x23, 0x20, 0x45, - 0x8a, 0x60, 0x44, 0x2d, 0x2c, 0x45, 0x23, 0x45, 0x60, 0x44, 0x2d, 0x2c, - 0x4b, 0x23, 0x51, 0x58, 0xb9, 0x00, 0x33, 0xff, 0xe0, 0xb1, 0x34, 0x20, - 0x1b, 0xb3, 0x33, 0x00, 0x34, 0x00, 0x59, 0x44, 0x44, 0x2d, 0x2c, 0xb0, - 0x16, 0x43, 0x58, 0xb0, 0x03, 0x26, 0x45, 0x8a, 0x58, 0x64, 0x66, 0xb0, - 0x1f, 0x60, 0x1b, 0x64, 0xb0, 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, - 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x59, 0x23, 0x58, 0x65, 0x59, 0xb0, - 0x29, 0x23, 0x44, 0x23, 0x10, 0xb0, 0x29, 0xe0, 0x1b, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0x4b, 0x53, - 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x1b, 0x21, - 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x16, 0x43, 0x58, 0xb0, 0x04, - 0x25, 0x45, 0x64, 0xb0, 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, - 0x40, 0x59, 0xb0, 0x01, 0x61, 0x23, 0x58, 0x1b, 0x65, 0x59, 0xb0, 0x29, - 0x23, 0x44, 0xb0, 0x05, 0x25, 0xb0, 0x08, 0x25, 0x08, 0x20, 0x58, 0x02, - 0x1b, 0x03, 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0x20, 0x46, - 0xb0, 0x04, 0x25, 0x23, 0x42, 0x3c, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, - 0x08, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0x20, 0x46, 0xb0, 0x04, - 0x25, 0xb0, 0x01, 0x60, 0x23, 0x42, 0x3c, 0x20, 0x58, 0x01, 0x1b, 0x00, - 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0xb0, 0x29, 0xe0, 0xb0, - 0x29, 0x20, 0x45, 0x65, 0x44, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, - 0xb0, 0x29, 0xe0, 0xb0, 0x05, 0x25, 0xb0, 0x08, 0x25, 0x08, 0x20, 0x58, - 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x05, 0x25, 0xb0, 0x03, 0x25, 0x43, 0x48, - 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0xb0, 0x06, 0x25, 0xb0, 0x03, - 0x25, 0xb0, 0x01, 0x60, 0x43, 0x48, 0x1b, 0x21, 0x59, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, 0xb0, 0x04, 0x25, 0x20, 0x20, - 0x46, 0xb0, 0x04, 0x25, 0x23, 0x42, 0xb0, 0x05, 0x25, 0x08, 0xb0, 0x03, - 0x25, 0x45, 0x48, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, 0xb0, 0x03, - 0x25, 0x20, 0xb0, 0x04, 0x25, 0x08, 0xb0, 0x02, 0x25, 0x43, 0x48, 0x21, - 0x21, 0x21, 0x2d, 0x2c, 0x45, 0x23, 0x20, 0x45, 0x18, 0x20, 0xb0, 0x00, - 0x50, 0x20, 0x58, 0x23, 0x65, 0x23, 0x59, 0x23, 0x68, 0x20, 0xb0, 0x40, - 0x50, 0x58, 0x21, 0xb0, 0x40, 0x59, 0x23, 0x58, 0x65, 0x59, 0x8a, 0x60, - 0x44, 0x2d, 0x2c, 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x20, 0x45, - 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x54, 0x58, - 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, - 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, - 0x2c, 0xb0, 0x00, 0x21, 0x4b, 0x54, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, - 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x46, 0x2b, 0x1b, 0x21, - 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, - 0x47, 0x2b, 0x1b, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, - 0x54, 0x58, 0xb0, 0x48, 0x2b, 0x1b, 0x21, 0x21, 0x21, 0x21, 0x59, 0x2d, - 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x49, 0x2b, 0x1b, 0x21, 0x21, - 0x21, 0x59, 0x2d, 0x2c, 0x20, 0x8a, 0x08, 0x23, 0x4b, 0x53, 0x8a, 0x4b, - 0x51, 0x5a, 0x58, 0x23, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x00, - 0xb0, 0x02, 0x25, 0x49, 0xb0, 0x00, 0x53, 0x58, 0x20, 0xb0, 0x40, 0x38, - 0x11, 0x1b, 0x21, 0x59, 0x2d, 0x2c, 0x01, 0x46, 0x23, 0x46, 0x60, 0x23, - 0x46, 0x61, 0x23, 0x20, 0x10, 0x20, 0x46, 0x8a, 0x61, 0xb8, 0xff, 0x80, - 0x62, 0x8a, 0xb1, 0x40, 0x40, 0x8a, 0x70, 0x45, 0x60, 0x68, 0x3a, 0x2d, - 0x2c, 0x20, 0x8a, 0x23, 0x49, 0x64, 0x8a, 0x23, 0x53, 0x58, 0x3c, 0x1b, - 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x52, 0x58, 0x7d, 0x1b, 0x7a, 0x59, 0x2d, - 0x2c, 0xb0, 0x12, 0x00, 0x4b, 0x01, 0x4b, 0x54, 0x42, 0x2d, 0x2c, 0xb1, - 0x02, 0x00, 0x42, 0xb1, 0x23, 0x01, 0x88, 0x51, 0xb1, 0x40, 0x01, 0x88, - 0x53, 0x5a, 0x58, 0xb9, 0x10, 0x00, 0x00, 0x20, 0x88, 0x54, 0x58, 0xb2, - 0x02, 0x01, 0x02, 0x43, 0x60, 0x42, 0x59, 0xb1, 0x24, 0x01, 0x88, 0x51, - 0x58, 0xb9, 0x20, 0x00, 0x00, 0x40, 0x88, 0x54, 0x58, 0xb2, 0x02, 0x02, - 0x02, 0x43, 0x60, 0x42, 0xb1, 0x24, 0x01, 0x88, 0x54, 0x58, 0xb2, 0x02, - 0x20, 0x02, 0x43, 0x60, 0x42, 0x00, 0x4b, 0x01, 0x4b, 0x52, 0x58, 0xb2, - 0x02, 0x08, 0x02, 0x43, 0x60, 0x42, 0x59, 0x1b, 0xb9, 0x40, 0x00, 0x00, - 0x80, 0x88, 0x54, 0x58, 0xb2, 0x02, 0x04, 0x02, 0x43, 0x60, 0x42, 0x59, - 0xb9, 0x40, 0x00, 0x00, 0x80, 0x63, 0xb8, 0x01, 0x00, 0x88, 0x54, 0x58, - 0xb2, 0x02, 0x08, 0x02, 0x43, 0x60, 0x42, 0x59, 0xb9, 0x40, 0x00, 0x01, - 0x00, 0x63, 0xb8, 0x02, 0x00, 0x88, 0x54, 0x58, 0xb2, 0x02, 0x10, 0x02, - 0x43, 0x60, 0x42, 0x59, 0xb1, 0x26, 0x01, 0x88, 0x51, 0x58, 0xb9, 0x40, - 0x00, 0x02, 0x00, 0x63, 0xb8, 0x04, 0x00, 0x88, 0x54, 0x58, 0xb2, 0x02, - 0x40, 0x02, 0x43, 0x60, 0x42, 0x59, 0xb9, 0x40, 0x00, 0x04, 0x00, 0x63, - 0xb8, 0x08, 0x00, 0x88, 0x54, 0x58, 0xb2, 0x02, 0x80, 0x02, 0x43, 0x60, - 0x42, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0xb1, 0x00, 0x02, 0x43, 0x54, - 0x58, 0x40, 0x0a, 0x05, 0x40, 0x08, 0x40, 0x09, 0x40, 0x0c, 0x02, 0x0d, - 0x02, 0x1b, 0xb1, 0x01, 0x02, 0x43, 0x54, 0x58, 0xb2, 0x05, 0x40, 0x08, - 0xba, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0xb3, 0x0c, 0x01, 0x0d, 0x01, - 0x1b, 0xb1, 0x80, 0x02, 0x43, 0x52, 0x58, 0xb2, 0x05, 0x40, 0x08, 0xb8, - 0x01, 0x80, 0xb1, 0x09, 0x40, 0x1b, 0xb2, 0x05, 0x40, 0x08, 0xba, 0x01, - 0x80, 0x00, 0x09, 0x01, 0x40, 0x59, 0xb9, 0x40, 0x00, 0x00, 0x80, 0x88, - 0x55, 0xb9, 0x40, 0x00, 0x02, 0x00, 0x63, 0xb8, 0x04, 0x00, 0x88, 0x55, - 0x5a, 0x58, 0xb3, 0x0c, 0x00, 0x0d, 0x01, 0x1b, 0xb3, 0x0c, 0x00, 0x0d, - 0x01, 0x59, 0x59, 0x59, 0x42, 0x42, 0x42, 0x42, 0x42, 0x2d, 0x2c, 0x45, - 0x18, 0x68, 0x23, 0x4b, 0x51, 0x58, 0x23, 0x20, 0x45, 0x20, 0x64, 0xb0, - 0x40, 0x50, 0x58, 0x7c, 0x59, 0x68, 0x8a, 0x60, 0x59, 0x44, 0x2d, 0x2c, - 0xb0, 0x00, 0x16, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x01, 0xb0, 0x01, - 0x23, 0x3e, 0x00, 0xb0, 0x02, 0x23, 0x3e, 0xb1, 0x01, 0x02, 0x06, 0x0c, - 0xb0, 0x0a, 0x23, 0x65, 0x42, 0xb0, 0x0b, 0x23, 0x42, 0x01, 0xb0, 0x01, - 0x23, 0x3f, 0x00, 0xb0, 0x02, 0x23, 0x3f, 0xb1, 0x01, 0x02, 0x06, 0x0c, - 0xb0, 0x06, 0x23, 0x65, 0x42, 0xb0, 0x07, 0x23, 0x42, 0xb0, 0x01, 0x16, - 0x01, 0x2d, 0x2c, 0xb0, 0x80, 0xb0, 0x02, 0x43, 0x50, 0xb0, 0x01, 0xb0, - 0x02, 0x43, 0x54, 0x5b, 0x58, 0x21, 0x23, 0x10, 0xb0, 0x20, 0x1a, 0xc9, - 0x1b, 0x8a, 0x10, 0xed, 0x59, 0x2d, 0x2c, 0xb0, 0x59, 0x2b, 0x2d, 0x2c, - 0x8a, 0x10, 0xe5, 0x2d, 0x41, 0x21, 0x00, 0x09, 0x01, 0x3f, 0x00, 0x01, - 0x01, 0x39, 0x00, 0x55, 0x01, 0x3e, 0x00, 0x01, 0x01, 0x39, 0x00, 0x55, - 0x01, 0x42, 0x01, 0x40, 0x00, 0x14, 0x00, 0x1f, 0x01, 0x41, 0x01, 0x40, - 0x00, 0x1f, 0x00, 0x1f, 0x01, 0x3b, 0x00, 0x33, 0x01, 0x3a, 0x00, 0x55, - 0x01, 0x38, 0x00, 0x33, 0x01, 0x39, 0x00, 0x55, 0x00, 0x40, 0x01, 0x07, - 0x00, 0x01, 0x00, 0x1f, 0x01, 0x07, 0x00, 0x01, 0x00, 0x9f, 0x01, 0x04, - 0x40, 0xaa, 0x01, 0xc0, 0xfd, 0x01, 0xaf, 0xfd, 0x01, 0x00, 0xfd, 0x01, - 0x0a, 0x4f, 0xfb, 0x01, 0x20, 0xfb, 0x01, 0xf5, 0x50, 0x28, 0x1f, 0xf2, - 0x46, 0x28, 0x1f, 0xf1, 0x46, 0x2a, 0x1f, 0xf0, 0x46, 0x2b, 0x1f, 0x5f, - 0xef, 0x7f, 0xef, 0x02, 0x0f, 0xef, 0x4f, 0xef, 0x5f, 0xef, 0x8f, 0xef, - 0xaf, 0xef, 0x05, 0x0b, 0xe5, 0xe4, 0x1e, 0x1f, 0xe3, 0xe2, 0x46, 0x1f, - 0x0f, 0xe2, 0x01, 0x40, 0xe2, 0x46, 0x16, 0x1f, 0xe1, 0xe0, 0x46, 0x1f, - 0xcf, 0xe0, 0xdf, 0xe0, 0xef, 0xe0, 0x03, 0x40, 0xe0, 0x33, 0x36, 0x46, - 0xe0, 0x46, 0x18, 0x1f, 0xee, 0xed, 0xff, 0x1f, 0xed, 0x01, 0xe8, 0x55, - 0xec, 0x48, 0xeb, 0x55, 0xea, 0x32, 0x00, 0x55, 0xe9, 0xe8, 0xe8, 0x55, - 0xe7, 0x48, 0x00, 0x55, 0xe6, 0x00, 0xff, 0x1f, 0xdd, 0x3d, 0xdf, 0x55, - 0xdf, 0x01, 0x03, 0x55, 0xde, 0x3d, 0x03, 0x55, 0xdc, 0x03, 0xff, 0x1f, - 0x0f, 0xd5, 0x1f, 0xd5, 0x02, 0x0f, 0xd5, 0x1f, 0xd5, 0x02, 0x40, 0xca, - 0x18, 0x1b, 0x46, 0xcf, 0xc2, 0x01, 0xbd, 0xc0, 0x3c, 0x1f, 0xc1, 0x50, - 0x26, 0x1f, 0xbc, 0xbe, 0x28, 0x1f, 0xff, 0xb9, 0x01, 0x50, 0xb8, 0x70, - 0xb8, 0x80, 0xb8, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0xff, 0xb8, 0x12, 0x32, - 0x46, 0x1f, 0xb7, 0x3f, 0xb7, 0x4f, 0xb7, 0x6f, 0xb7, 0x7f, 0xb7, 0x9f, - 0xb7, 0xaf, 0xb7, 0x07, 0x18, 0xb6, 0x01, 0x70, 0xb2, 0xa0, 0xb2, 0xb0, - 0xb2, 0x03, 0x0f, 0xb2, 0x01, 0x90, 0xb5, 0x01, 0xb0, 0xb5, 0x01, 0x0f, - 0xb5, 0x01, 0x08, 0x0f, 0xb3, 0x3f, 0xb3, 0xef, 0xb3, 0x03, 0x80, 0xb0, - 0x90, 0xb0, 0x02, 0xb0, 0xb0, 0xc0, 0xb0, 0xd0, 0xb0, 0x03, 0x2f, 0xaf, - 0x3f, 0xaf, 0x02, 0xa0, 0xad, 0xb0, 0xad, 0x02, 0xc0, 0xad, 0xd0, 0xad, - 0x02, 0x2f, 0xac, 0x3f, 0xac, 0x02, 0x9f, 0xab, 0x01, 0xc0, 0xaa, 0xd0, - 0xaa, 0x02, 0x4f, 0xa9, 0x8f, 0xa9, 0x02, 0x2f, 0xa9, 0x6f, 0xa9, 0xbf, - 0xa9, 0xff, 0xa9, 0x04, 0x9c, 0x9b, 0x24, 0x1f, 0x50, 0x9b, 0x01, 0x6f, - 0x96, 0x01, 0xbf, 0x96, 0x01, 0x96, 0x46, 0x1d, 0x1f, 0x95, 0x94, 0x17, - 0x1f, 0x0f, 0x94, 0x1f, 0x94, 0x7f, 0x94, 0x8f, 0x94, 0xff, 0x94, 0x05, - 0x30, 0x91, 0x40, 0x91, 0x02, 0x80, 0x91, 0x01, 0x70, 0x8f, 0x80, 0x8f, - 0x02, 0x90, 0x8f, 0x01, 0xc0, 0x8f, 0xd0, 0x8f, 0x02, 0x4f, 0x8c, 0x5f, - 0x8c, 0x6f, 0x8c, 0x03, 0x86, 0x46, 0xff, 0x1f, 0x9f, 0x85, 0x01, 0x84, - 0x83, 0x31, 0x1f, 0x74, 0x73, 0x3f, 0x1f, 0x73, 0x50, 0x26, 0x1f, 0x6f, - 0x6e, 0x3c, 0x1f, 0x6e, 0x46, 0x35, 0x1f, 0x1a, 0x01, 0x18, 0x55, 0x19, - 0x33, 0x18, 0x55, 0x07, 0x33, 0x03, 0x55, 0x06, 0x03, 0xff, 0x1f, 0x60, - 0x50, 0x26, 0x1f, 0x5f, 0x50, 0x26, 0x1f, 0x5c, 0x46, 0x31, 0x1f, 0x5b, - 0x5a, 0x48, 0x1f, 0x5a, 0x46, 0x31, 0x1f, 0x13, 0x32, 0x12, 0x55, 0x05, - 0x01, 0x03, 0x55, 0x04, 0x32, 0x03, 0x55, 0x6c, 0x03, 0x01, 0x0c, 0x03, - 0x3c, 0x03, 0x4c, 0x03, 0x6c, 0x03, 0x7c, 0x03, 0x05, 0xef, 0x51, 0xff, - 0x40, 0x64, 0x51, 0x02, 0x40, 0x51, 0x35, 0x38, 0x46, 0x40, 0x51, 0x25, - 0x28, 0x46, 0xcf, 0x50, 0x01, 0x49, 0x46, 0x20, 0x1f, 0x48, 0x46, 0x35, - 0x1f, 0x47, 0x46, 0x35, 0x1f, 0xaf, 0x46, 0x01, 0xdf, 0x46, 0xef, 0x46, - 0x02, 0x80, 0x46, 0x01, 0x16, 0x32, 0x15, 0x55, 0x11, 0x01, 0x0f, 0x55, - 0x10, 0x32, 0x0f, 0x55, 0x02, 0x01, 0x00, 0x55, 0x01, 0x00, 0x01, 0x1f, - 0x1f, 0x0f, 0x3f, 0x0f, 0x5f, 0x0f, 0x7f, 0x0f, 0x04, 0x0f, 0x0f, 0x2f, - 0x0f, 0x4f, 0x0f, 0x6f, 0x0f, 0x8f, 0x0f, 0xdf, 0x0f, 0xff, 0x0f, 0x07, - 0x3f, 0x0f, 0x7f, 0x0f, 0xef, 0x0f, 0x03, 0x6f, 0x00, 0x01, 0x4f, 0x00, - 0x01, 0x80, 0x16, 0x01, 0x05, 0x01, 0xb8, 0x01, 0x90, 0xb1, 0x54, 0x53, - 0x2b, 0x2b, 0x4b, 0xb8, 0x07, 0xff, 0x52, 0x4b, 0xb0, 0x07, 0x50, 0x5b, - 0xb0, 0x01, 0x88, 0xb0, 0x25, 0x53, 0xb0, 0x01, 0x88, 0xb0, 0x40, 0x51, - 0x5a, 0xb0, 0x06, 0x88, 0xb0, 0x00, 0x55, 0x5a, 0x5b, 0x58, 0xb1, 0x01, - 0x01, 0x8e, 0x59, 0x85, 0x8d, 0x8d, 0x00, 0x42, 0x1d, 0x4b, 0xb0, 0x32, - 0x53, 0x58, 0xb0, 0x60, 0x1d, 0x59, 0x4b, 0xb0, 0x64, 0x53, 0x58, 0xb0, - 0x40, 0x1d, 0x59, 0x4b, 0xb0, 0x80, 0x53, 0x58, 0xb0, 0x10, 0x1d, 0xb1, - 0x16, 0x00, 0x42, 0x59, 0x73, 0x74, 0x73, 0x74, 0x75, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x01, 0x73, 0x74, 0x75, 0x2b, 0x2b, 0x2b, 0x00, 0x74, 0x2b, - 0x2b, 0x73, 0x73, 0x75, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x00, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, - 0x01, 0x2b, 0x73, 0x2b, 0x00, 0x74, 0x73, 0x74, 0x75, 0x73, 0x74, 0x73, - 0x2b, 0x01, 0x2b, 0x74, 0x75, 0x00, 0x73, 0x2b, 0x73, 0x74, 0x01, 0x73, - 0x73, 0x74, 0x00, 0x73, 0x74, 0x74, 0x73, 0x74, 0x73, 0x01, 0x5e, 0x73, - 0x73, 0x74, 0x73, 0x73, 0x00, 0x73, 0x73, 0x2b, 0x73, 0x73, 0x01, 0x2b, - 0x00, 0x2b, 0x01, 0x2b, 0x00, 0x73, 0x2b, 0x74, 0x75, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x74, - 0x2b, 0x2b, 0x5e, 0x73, 0x2b, 0x00, 0x2b, 0x5e, 0x73, 0x74, 0x01, 0x2b, - 0x2b, 0x2b, 0x00, 0x2b, 0x73, 0x73, 0x5e, 0x73, 0x73, 0x73, 0x01, 0x73, - 0x73, 0x73, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x5e, 0x00, - 0x05, 0xcc, 0x05, 0xcc, 0x00, 0x7d, 0x05, 0x81, 0x00, 0x15, 0x00, 0x79, - 0x05, 0x81, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x77, - 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xec, 0x00, 0x00, 0xfe, 0x57, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0xbd, - 0x00, 0xaf, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xac, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xbf, 0x00, 0xc3, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, - 0x00, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x94, 0x00, 0x99, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x83, - 0x00, 0x8d, 0x00, 0xa4, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x6a, 0x00, 0x79, 0x00, 0x98, - 0x00, 0xac, 0x00, 0xb8, 0x00, 0xa7, 0x00, 0x00, 0x01, 0x22, 0x01, 0x33, - 0x00, 0xc3, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, - 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xe1, 0x01, 0xc9, 0x00, 0x92, 0x00, 0xa8, 0x00, 0x6b, 0x00, 0x92, - 0x00, 0xb7, 0x00, 0x6b, 0x00, 0x9b, 0x00, 0x00, 0x02, 0x7b, 0x02, 0xf2, - 0x00, 0x92, 0x02, 0x52, 0x00, 0x6e, 0x02, 0xd7, 0x03, 0x81, 0x00, 0x82, - 0x00, 0x89, 0x00, 0xa0, 0x00, 0x9f, 0x01, 0x69, 0x00, 0x8f, 0x00, 0x00, - 0x01, 0x60, 0x00, 0xa4, 0x01, 0x5b, 0x00, 0x5e, 0x00, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x65, 0x00, 0x6f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x8a, 0x00, 0x90, 0x00, 0xa5, 0x00, 0x7a, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x81, 0xff, 0xf3, - 0x00, 0x0d, 0xfc, 0xb3, 0x00, 0x83, 0x00, 0x89, 0x00, 0x8f, 0x00, 0x96, - 0x00, 0x69, 0x00, 0x71, 0x05, 0xcc, 0x00, 0x0f, 0xfc, 0x1e, 0xff, 0xf2, - 0x00, 0x34, 0x04, 0xe6, 0x00, 0x0d, 0xfe, 0xd4, 0x00, 0xbf, 0x03, 0x1f, - 0x00, 0xa7, 0x00, 0xae, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x48, 0x03, 0x6a, - 0x02, 0xb6, 0x02, 0x02, 0xfd, 0x93, 0x00, 0x00, 0x00, 0x91, 0x00, 0x67, - 0x00, 0x91, 0x00, 0x61, 0x01, 0xd9, 0x00, 0x00, 0x02, 0x8d, 0x03, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x81, 0x04, 0x68, - 0x00, 0x14, 0x04, 0xcb, 0x00, 0x00, 0xff, 0xec, 0xff, 0xd3, 0xfe, 0x7f, - 0x00, 0x83, 0x00, 0xdb, 0x00, 0xaa, 0x00, 0xba, 0x00, 0xa0, 0x00, 0xcf, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4c, - 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x02, 0x58, - 0x00, 0x00, 0x02, 0xa8, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x00, 0x05, 0x50, - 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x07, 0x6c, 0x00, 0x00, 0x07, 0xa0, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x64, 0x00, 0x00, 0x08, 0xfc, - 0x00, 0x00, 0x09, 0x70, 0x00, 0x00, 0x09, 0xbc, 0x00, 0x00, 0x09, 0xf4, - 0x00, 0x00, 0x0a, 0x24, 0x00, 0x00, 0x0a, 0x54, 0x00, 0x00, 0x0a, 0xd8, - 0x00, 0x00, 0x0b, 0x30, 0x00, 0x00, 0x0b, 0xcc, 0x00, 0x00, 0x0c, 0xa8, - 0x00, 0x00, 0x0d, 0x2c, 0x00, 0x00, 0x0d, 0xe8, 0x00, 0x00, 0x0e, 0xac, - 0x00, 0x00, 0x0f, 0x0c, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0xbc, - 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x11, 0x68, 0x00, 0x00, 0x11, 0xcc, - 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x12, 0x98, 0x00, 0x00, 0x13, 0x58, - 0x00, 0x00, 0x14, 0xc4, 0x00, 0x00, 0x15, 0x6c, 0x00, 0x00, 0x16, 0x44, - 0x00, 0x00, 0x17, 0x08, 0x00, 0x00, 0x17, 0x88, 0x00, 0x00, 0x18, 0x0c, - 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, 0x19, 0x40, 0x00, 0x00, 0x19, 0xe4, - 0x00, 0x00, 0x1a, 0x88, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x1b, 0x78, - 0x00, 0x00, 0x1b, 0xb4, 0x00, 0x00, 0x1d, 0x68, 0x00, 0x00, 0x1d, 0xf0, - 0x00, 0x00, 0x1e, 0x8c, 0x00, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x1f, 0xd8, - 0x00, 0x00, 0x20, 0x84, 0x00, 0x00, 0x21, 0x9c, 0x00, 0x00, 0x22, 0xf4, - 0x00, 0x00, 0x23, 0x84, 0x00, 0x00, 0x23, 0xf0, 0x00, 0x00, 0x26, 0x50, - 0x00, 0x00, 0x27, 0x98, 0x00, 0x00, 0x29, 0x78, 0x00, 0x00, 0x29, 0xf0, - 0x00, 0x00, 0x2a, 0x3c, 0x00, 0x00, 0x2a, 0x70, 0x00, 0x00, 0x2a, 0xbc, - 0x00, 0x00, 0x2c, 0x20, 0x00, 0x00, 0x2c, 0x50, 0x00, 0x00, 0x2c, 0x9c, - 0x00, 0x00, 0x2d, 0xbc, 0x00, 0x00, 0x2e, 0x88, 0x00, 0x00, 0x2f, 0x48, - 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 0x31, 0xb4, - 0x00, 0x00, 0x32, 0xe4, 0x00, 0x00, 0x33, 0x94, 0x00, 0x00, 0x34, 0x28, - 0x00, 0x00, 0x35, 0x5c, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x36, 0xb0, - 0x00, 0x00, 0x38, 0xa8, 0x00, 0x00, 0x39, 0x5c, 0x00, 0x00, 0x39, 0xf8, - 0x00, 0x00, 0x3a, 0xc8, 0x00, 0x00, 0x3b, 0xbc, 0x00, 0x00, 0x3c, 0x20, - 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, 0x3d, 0x8c, 0x00, 0x00, 0x3e, 0x40, - 0x00, 0x00, 0x3f, 0xcc, 0x00, 0x00, 0x41, 0xcc, 0x00, 0x00, 0x43, 0x60, - 0x00, 0x00, 0x45, 0x98, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, 0x47, 0xf0, - 0x00, 0x00, 0x49, 0x4c, 0x00, 0x00, 0x4a, 0x14, 0x00, 0x00, 0x4a, 0xd0, - 0x00, 0x00, 0x4a, 0xe0, 0x00, 0x00, 0x4c, 0xcc, 0x00, 0x00, 0x4d, 0x90, - 0x00, 0x00, 0x4e, 0x8c, 0x00, 0x00, 0x4f, 0x4c, 0x00, 0x00, 0x50, 0x28, - 0x00, 0x00, 0x51, 0xa8, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x53, 0x4c, - 0x00, 0x00, 0x54, 0x80, 0x00, 0x00, 0x55, 0x8c, 0x00, 0x00, 0x56, 0x14, - 0x00, 0x00, 0x56, 0x50, 0x00, 0x00, 0x56, 0x60, 0x00, 0x00, 0x57, 0x9c, - 0x00, 0x00, 0x57, 0xcc, 0x00, 0x00, 0x58, 0x44, 0x00, 0x00, 0x58, 0xd8, - 0x00, 0x00, 0x59, 0x70, 0x00, 0x00, 0x5a, 0x64, 0x00, 0x00, 0x5a, 0xa8, - 0x00, 0x00, 0x5b, 0x5c, 0x00, 0x00, 0x5b, 0xc0, 0x00, 0x00, 0x5b, 0xe0, - 0x00, 0x00, 0x5c, 0x6c, 0x00, 0x00, 0x5c, 0xd8, 0x00, 0x00, 0x5d, 0x6c, - 0x00, 0x00, 0x5d, 0xf0, 0x00, 0x00, 0x5e, 0x30, 0x00, 0x00, 0x5e, 0x7c, - 0x00, 0x00, 0x5e, 0xc0, 0x00, 0x00, 0x5f, 0x8c, 0x00, 0x00, 0x5f, 0xc0, - 0x00, 0x00, 0x5f, 0xf0, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x50, - 0x00, 0x00, 0x60, 0x84, 0x00, 0x00, 0x60, 0xcc, 0x00, 0x00, 0x61, 0x8c, - 0x00, 0x00, 0x61, 0xb4, 0x00, 0x00, 0x61, 0xe8, 0x00, 0x00, 0x62, 0x18, - 0x00, 0x00, 0x62, 0x4c, 0x00, 0x00, 0x62, 0x84, 0x00, 0x00, 0x62, 0xb4, - 0x00, 0x00, 0x62, 0xe0, 0x00, 0x00, 0x63, 0x10, 0x00, 0x00, 0x63, 0x44, - 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x30, 0x00, 0x00, 0x64, 0x64, - 0x00, 0x00, 0x64, 0x94, 0x00, 0x00, 0x64, 0xc4, 0x00, 0x00, 0x64, 0xf8, - 0x00, 0x00, 0x65, 0x30, 0x00, 0x00, 0x65, 0x98, 0x00, 0x00, 0x66, 0x64, - 0x00, 0x00, 0x66, 0x98, 0x00, 0x00, 0x66, 0xc8, 0x00, 0x00, 0x66, 0xf8, - 0x00, 0x00, 0x67, 0x30, 0x00, 0x00, 0x67, 0x60, 0x00, 0x00, 0x67, 0xe8, - 0x00, 0x00, 0x68, 0xe8, 0x00, 0x00, 0x69, 0x1c, 0x00, 0x00, 0x69, 0x4c, - 0x00, 0x00, 0x69, 0x80, 0x00, 0x00, 0x69, 0xb4, 0x00, 0x00, 0x69, 0xec, - 0x00, 0x00, 0x6a, 0x24, 0x00, 0x00, 0x6b, 0x88, 0x00, 0x00, 0x6b, 0xb0, - 0x00, 0x00, 0x6b, 0xe4, 0x00, 0x00, 0x6c, 0x14, 0x00, 0x00, 0x6c, 0x44, - 0x00, 0x00, 0x6c, 0x78, 0x00, 0x00, 0x6c, 0xa8, 0x00, 0x00, 0x6c, 0xd4, - 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x6d, 0x38, 0x00, 0x00, 0x6e, 0x2c, - 0x00, 0x00, 0x6e, 0x5c, 0x00, 0x00, 0x6e, 0x90, 0x00, 0x00, 0x6e, 0xc0, - 0x00, 0x00, 0x6e, 0xf0, 0x00, 0x00, 0x6f, 0x20, 0x00, 0x00, 0x6f, 0x54, - 0x00, 0x00, 0x6f, 0xd4, 0x00, 0x00, 0x70, 0xc8, 0x00, 0x00, 0x70, 0xfc, - 0x00, 0x00, 0x71, 0x2c, 0x00, 0x00, 0x71, 0x60, 0x00, 0x00, 0x71, 0x98, - 0x00, 0x00, 0x71, 0xc8, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, 0x72, 0xa8, - 0x00, 0x00, 0x72, 0xd8, 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x73, 0x3c, - 0x00, 0x00, 0x73, 0x70, 0x00, 0x00, 0x73, 0x9c, 0x00, 0x00, 0x73, 0xc8, - 0x00, 0x00, 0x73, 0xf8, 0x00, 0x00, 0x74, 0x28, 0x00, 0x00, 0x74, 0x58, - 0x00, 0x00, 0x74, 0x88, 0x00, 0x00, 0x74, 0xb8, 0x00, 0x00, 0x74, 0xe8, - 0x00, 0x00, 0x75, 0x18, 0x00, 0x00, 0x75, 0x48, 0x00, 0x00, 0x75, 0x7c, - 0x00, 0x00, 0x75, 0xac, 0x00, 0x00, 0x75, 0xbc, 0x00, 0x00, 0x76, 0xb0, - 0x00, 0x00, 0x76, 0xe4, 0x00, 0x00, 0x77, 0x14, 0x00, 0x00, 0x77, 0x48, - 0x00, 0x00, 0x77, 0x78, 0x00, 0x00, 0x77, 0xa8, 0x00, 0x00, 0x77, 0xd8, - 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x78, 0x30, 0x00, 0x00, 0x78, 0x64, - 0x00, 0x00, 0x78, 0x98, 0x00, 0x00, 0x78, 0xc8, 0x00, 0x00, 0x78, 0xf8, - 0x00, 0x00, 0x79, 0x28, 0x00, 0x00, 0x79, 0x58, 0x00, 0x00, 0x79, 0x88, - 0x00, 0x00, 0x79, 0xb8, 0x00, 0x00, 0x79, 0xe0, 0x00, 0x00, 0x7a, 0x14, - 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x7a, 0x78, 0x00, 0x00, 0x7b, 0x48, - 0x00, 0x00, 0x7c, 0x1c, 0x00, 0x00, 0x7c, 0x4c, 0x00, 0x00, 0x7c, 0x80, - 0x00, 0x00, 0x7c, 0xb0, 0x00, 0x00, 0x7c, 0xe0, 0x00, 0x00, 0x7d, 0x10, - 0x00, 0x00, 0x7d, 0x40, 0x00, 0x00, 0x7d, 0x64, 0x00, 0x00, 0x7d, 0x90, - 0x00, 0x00, 0x7d, 0xc0, 0x00, 0x00, 0x7e, 0xe4, 0x00, 0x00, 0x7e, 0xfc, - 0x00, 0x00, 0x7f, 0x30, 0x00, 0x00, 0x7f, 0x60, 0x00, 0x00, 0x80, 0xc8, - 0x00, 0x00, 0x80, 0xf4, 0x00, 0x00, 0x81, 0x20, 0x00, 0x00, 0x81, 0x98, - 0x00, 0x00, 0x81, 0xc8, 0x00, 0x00, 0x81, 0xf4, 0x00, 0x00, 0x82, 0x20, - 0x00, 0x00, 0x82, 0x48, 0x00, 0x00, 0x82, 0x78, 0x00, 0x00, 0x82, 0xbc, - 0x00, 0x00, 0x82, 0xe4, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x83, 0x90, - 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x84, 0x38, 0x00, 0x00, 0x84, 0x68, - 0x00, 0x00, 0x84, 0x94, 0x00, 0x00, 0x84, 0xbc, 0x00, 0x00, 0x84, 0xf0, - 0x00, 0x00, 0x85, 0x24, 0x00, 0x00, 0x85, 0x54, 0x00, 0x00, 0x86, 0x04, - 0x00, 0x00, 0x86, 0xac, 0x00, 0x00, 0x86, 0xdc, 0x00, 0x00, 0x87, 0x0c, - 0x00, 0x00, 0x87, 0x3c, 0x00, 0x00, 0x87, 0x6c, 0x00, 0x00, 0x87, 0xa0, - 0x00, 0x00, 0x87, 0xd4, 0x00, 0x00, 0x88, 0xa8, 0x00, 0x00, 0x89, 0xbc, - 0x00, 0x00, 0x89, 0xec, 0x00, 0x00, 0x8a, 0x1c, 0x00, 0x00, 0x8a, 0x48, - 0x00, 0x00, 0x8a, 0x70, 0x00, 0x00, 0x8a, 0xa4, 0x00, 0x00, 0x8a, 0xd4, - 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x8b, 0x34, 0x00, 0x00, 0x8b, 0x64, - 0x00, 0x00, 0x8b, 0x94, 0x00, 0x00, 0x8b, 0xbc, 0x00, 0x00, 0x8b, 0xe4, - 0x00, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x8c, 0x44, 0x00, 0x00, 0x8c, 0x6c, - 0x00, 0x00, 0x8d, 0x20, 0x00, 0x00, 0x8d, 0x54, 0x00, 0x00, 0x8d, 0x80, - 0x00, 0x00, 0x8e, 0x08, 0x00, 0x00, 0x8e, 0xd0, 0x00, 0x00, 0x8f, 0x00, - 0x00, 0x00, 0x8f, 0x30, 0x00, 0x00, 0x8f, 0x60, 0x00, 0x00, 0x8f, 0x94, - 0x00, 0x00, 0x8f, 0xc4, 0x00, 0x00, 0x8f, 0xf8, 0x00, 0x00, 0x90, 0x48, - 0x00, 0x00, 0x90, 0x7c, 0x00, 0x00, 0x90, 0xb0, 0x00, 0x00, 0x90, 0xe4, - 0x00, 0x00, 0x91, 0x24, 0x00, 0x00, 0x91, 0x50, 0x00, 0x00, 0x91, 0x84, - 0x00, 0x00, 0x91, 0xb8, 0x00, 0x00, 0x91, 0xec, 0x00, 0x00, 0x92, 0x1c, - 0x00, 0x00, 0x92, 0x50, 0x00, 0x00, 0x92, 0x80, 0x00, 0x00, 0x92, 0xb0, - 0x00, 0x00, 0x92, 0xe0, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x93, 0x38, - 0x00, 0x00, 0x93, 0x6c, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0xec, - 0x00, 0x00, 0x95, 0xd0, 0x00, 0x00, 0x96, 0x74, 0x00, 0x00, 0x97, 0x34, - 0x00, 0x00, 0x97, 0xbc, 0x00, 0x00, 0x98, 0x74, 0x00, 0x00, 0x99, 0x10, - 0x00, 0x00, 0x99, 0xe0, 0x00, 0x00, 0x9a, 0xa0, 0x00, 0x00, 0x9a, 0xb0, - 0x00, 0x00, 0x9b, 0x5c, 0x00, 0x00, 0x9b, 0xec, 0x00, 0x00, 0x9c, 0xac, - 0x00, 0x00, 0x9d, 0x58, 0x00, 0x00, 0x9d, 0xc0, 0x00, 0x00, 0x9e, 0x78, - 0x00, 0x00, 0x9f, 0x48, 0x00, 0x00, 0x9f, 0xc4, 0x00, 0x00, 0xa0, 0x54, - 0x00, 0x00, 0xa1, 0x34, 0x00, 0x00, 0xa1, 0xe0, 0x00, 0x00, 0xa2, 0x90, - 0x00, 0x00, 0xa2, 0xc0, 0x00, 0x00, 0xa3, 0x18, 0x00, 0x00, 0xa3, 0xac, - 0x00, 0x00, 0xa4, 0x4c, 0x00, 0x00, 0xa4, 0xa4, 0x00, 0x00, 0xa5, 0x38, - 0x00, 0x00, 0xa5, 0xe8, 0x00, 0x00, 0xa6, 0x68, 0x00, 0x00, 0xa6, 0xf0, - 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa7, 0xcc, 0x00, 0x00, 0xa8, 0x7c, - 0x00, 0x00, 0xa9, 0x28, 0x00, 0x00, 0xa9, 0xd0, 0x00, 0x00, 0xaa, 0x78, - 0x00, 0x00, 0xab, 0x3c, 0x00, 0x00, 0xab, 0xe0, 0x00, 0x00, 0xac, 0xa0, - 0x00, 0x00, 0xad, 0x50, 0x00, 0x00, 0xad, 0x60, 0x00, 0x00, 0xae, 0x08, - 0x00, 0x00, 0xae, 0xa4, 0x00, 0x00, 0xaf, 0x14, 0x00, 0x00, 0xaf, 0xac, - 0x00, 0x00, 0xb0, 0x14, 0x00, 0x00, 0xb0, 0xb4, 0x00, 0x00, 0xb1, 0x78, - 0x00, 0x00, 0xb2, 0x38, 0x00, 0x00, 0xb2, 0xc0, 0x00, 0x00, 0xb3, 0x40, - 0x00, 0x00, 0xb3, 0xe8, 0x00, 0x00, 0xb4, 0x78, 0x00, 0x00, 0xb5, 0x08, - 0x00, 0x00, 0xb5, 0xb8, 0x00, 0x00, 0xb6, 0x64, 0x00, 0x00, 0xb7, 0x0c, - 0x00, 0x00, 0xb7, 0xe0, 0x00, 0x00, 0xb8, 0xa0, 0x00, 0x00, 0xb9, 0x40, - 0x00, 0x00, 0xb9, 0xd8, 0x00, 0x00, 0xba, 0x94, 0x00, 0x00, 0xbb, 0x28, - 0x00, 0x00, 0xbb, 0x58, 0x00, 0x00, 0xbb, 0x9c, 0x00, 0x00, 0xbc, 0x34, - 0x00, 0x00, 0xbc, 0x44, 0x00, 0x00, 0xbc, 0x70, 0x00, 0x00, 0xbc, 0x9c, - 0x00, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0xbc, 0xe0, 0x00, 0x00, 0xbc, 0xf8, - 0x00, 0x00, 0xbd, 0x10, 0x00, 0x00, 0xbd, 0x28, 0x00, 0x00, 0xbd, 0x40, - 0x00, 0x00, 0xbd, 0x58, 0x00, 0x00, 0xbd, 0x88, 0x00, 0x00, 0xbd, 0xbc, - 0x00, 0x00, 0xbd, 0xec, 0x00, 0x00, 0xbe, 0x4c, 0x00, 0x00, 0xbe, 0x80, - 0x00, 0x00, 0xbe, 0xb0, 0x00, 0x00, 0xbe, 0xe4, 0x00, 0x00, 0xbf, 0x18, - 0x00, 0x00, 0xbf, 0x50, 0x00, 0x00, 0xbf, 0xb4, 0x00, 0x00, 0xbf, 0xec, - 0x00, 0x00, 0xc0, 0x38, 0x00, 0x00, 0xc0, 0x70, 0x00, 0x00, 0xc0, 0xbc, - 0x00, 0x00, 0xc0, 0xf4, 0x00, 0x00, 0xc1, 0x40, 0x00, 0x00, 0xc1, 0xdc, - 0x00, 0x00, 0xc2, 0x14, 0x00, 0x00, 0xc2, 0x58, 0x00, 0x00, 0xc2, 0x8c, - 0x00, 0x00, 0xc2, 0xd0, 0x00, 0x00, 0xc3, 0x04, 0x00, 0x00, 0xc3, 0x34, - 0x00, 0x00, 0xc4, 0x20, 0x00, 0x00, 0xc5, 0x28, 0x00, 0x00, 0xc5, 0x58, - 0x00, 0x00, 0xc5, 0x8c, 0x00, 0x00, 0xc5, 0xc0, 0x00, 0x00, 0xc5, 0xf4, - 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xc6, 0x24, 0x00, 0x00, 0xc6, 0x5c, - 0x00, 0x00, 0xc6, 0x94, 0x00, 0x00, 0xc6, 0xc4, 0x00, 0x00, 0xc6, 0xf4, - 0x00, 0x00, 0xc7, 0x24, 0x00, 0x00, 0xc7, 0x3c, 0x00, 0x00, 0xc7, 0x54, - 0x00, 0x00, 0xc7, 0x6c, 0x00, 0x00, 0xc7, 0x9c, 0x00, 0x00, 0xc7, 0xcc, - 0x00, 0x00, 0xc8, 0x80, 0x00, 0x00, 0xc9, 0x1c, 0x00, 0x00, 0xc9, 0x50, - 0x00, 0x00, 0xc9, 0x84, 0x00, 0x00, 0xca, 0xcc, 0x00, 0x00, 0xcb, 0x30, - 0x00, 0x00, 0xcb, 0x60, 0x00, 0x00, 0xcb, 0x90, 0x00, 0x00, 0xcb, 0xc0, - 0x00, 0x00, 0xcb, 0xf0, 0x00, 0x00, 0xcc, 0x28, 0x00, 0x00, 0xcc, 0x60, - 0x00, 0x00, 0xcc, 0x90, 0x00, 0x00, 0xcc, 0xc0, 0x00, 0x00, 0xcc, 0xf8, - 0x00, 0x00, 0xcd, 0x30, 0x00, 0x00, 0xcd, 0x60, 0x00, 0x00, 0xcd, 0x90, - 0x00, 0x00, 0xcd, 0xc8, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xce, 0x30, - 0x00, 0x00, 0xce, 0x60, 0x00, 0x00, 0xce, 0x98, 0x00, 0x00, 0xce, 0xd0, - 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcf, 0x30, 0x00, 0x00, 0xcf, 0x68, - 0x00, 0x00, 0xcf, 0xa0, 0x00, 0x00, 0xcf, 0xd0, 0x00, 0x00, 0xd0, 0x00, - 0x00, 0x00, 0xd0, 0x38, 0x00, 0x00, 0xd0, 0x70, 0x00, 0x00, 0xd0, 0xa0, - 0x00, 0x00, 0xd0, 0xd0, 0x00, 0x00, 0xd0, 0xf8, 0x00, 0x00, 0xd1, 0x20, - 0x00, 0x00, 0xd1, 0x48, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0xd2, 0xc0, - 0x00, 0x00, 0xd3, 0x78, 0x00, 0x00, 0xd3, 0xac, 0x00, 0x00, 0xd3, 0xdc, - 0x00, 0x00, 0xd4, 0x54, 0x00, 0x00, 0xd5, 0x68, 0x00, 0x00, 0xd6, 0x5c, - 0x00, 0x00, 0xd7, 0x48, 0x00, 0x00, 0xd7, 0xcc, 0x00, 0x00, 0xd8, 0x4c, - 0x00, 0x00, 0xd8, 0x7c, 0x00, 0x00, 0xd8, 0xb0, 0x00, 0x00, 0xd8, 0xc8, - 0x00, 0x00, 0xd8, 0xe0, 0x00, 0x00, 0xd9, 0x18, 0x00, 0x00, 0xd9, 0x60, - 0x00, 0x00, 0xd9, 0x94, 0x00, 0x00, 0xd9, 0xd8, 0x00, 0x00, 0xda, 0x08, - 0x00, 0x00, 0xda, 0x38, 0x00, 0x00, 0xda, 0x6c, 0x00, 0x00, 0xda, 0xb0, - 0x00, 0x00, 0xda, 0xe0, 0x00, 0x00, 0xdb, 0x10, 0x00, 0x00, 0xdb, 0xb0, - 0x00, 0x00, 0xdc, 0xb0, 0x00, 0x00, 0xdd, 0x80, 0x00, 0x00, 0xdd, 0xd0, - 0x00, 0x00, 0xde, 0xe0, 0x00, 0x00, 0xdf, 0xec, 0x00, 0x00, 0xe0, 0xc8, - 0x00, 0x00, 0xe1, 0xd4, 0x00, 0x00, 0xe2, 0xbc, 0x00, 0x00, 0xe3, 0x30, - 0x00, 0x00, 0xe3, 0xcc, 0x00, 0x00, 0xe4, 0xcc, 0x00, 0x00, 0xe5, 0x68, - 0x00, 0x00, 0xe5, 0xf4, 0x00, 0x00, 0xe6, 0x74, 0x00, 0x00, 0xe7, 0x5c, - 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xe8, 0x74, 0x00, 0x00, 0xe9, 0x6c, - 0x00, 0x00, 0xea, 0x90, 0x00, 0x00, 0xeb, 0x34, 0x00, 0x00, 0xeb, 0xd0, - 0x00, 0x00, 0xec, 0x90, 0x00, 0x00, 0xed, 0x5c, 0x00, 0x00, 0xee, 0x08, - 0x00, 0x00, 0xee, 0x9c, 0x00, 0x00, 0xef, 0x30, 0x00, 0x00, 0xef, 0xfc, - 0x00, 0x00, 0xf0, 0xe4, 0x00, 0x00, 0xf1, 0x90, 0x00, 0x00, 0xf2, 0x3c, - 0x00, 0x00, 0xf3, 0x08, 0x00, 0x00, 0xf3, 0x98, 0x00, 0x00, 0xf4, 0x84, - 0x00, 0x00, 0xf5, 0x48, 0x00, 0x00, 0xf6, 0x10, 0x00, 0x00, 0xf6, 0xb8, - 0x00, 0x00, 0xf7, 0x58, 0x00, 0x00, 0xf8, 0x3c, 0x00, 0x00, 0xf9, 0x1c, - 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0xfb, 0x18, 0x00, 0x00, 0xfb, 0xe0, - 0x00, 0x00, 0xfc, 0x60, 0x00, 0x00, 0xfd, 0x54, 0x00, 0x00, 0xfd, 0x64, - 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xfe, 0xac, 0x00, 0x00, 0xff, 0xa8, - 0x00, 0x01, 0x00, 0x24, 0x00, 0x01, 0x00, 0xbc, 0x00, 0x01, 0x01, 0x74, - 0x00, 0x01, 0x01, 0xe4, 0x00, 0x01, 0x02, 0x34, 0x00, 0x01, 0x02, 0x98, - 0x00, 0x01, 0x03, 0x30, 0x00, 0x01, 0x03, 0xc8, 0x00, 0x01, 0x04, 0x18, - 0x00, 0x01, 0x04, 0xd4, 0x00, 0x01, 0x05, 0x98, 0x00, 0x01, 0x06, 0x48, - 0x00, 0x01, 0x07, 0x28, 0x00, 0x01, 0x07, 0xcc, 0x00, 0x01, 0x08, 0x70, - 0x00, 0x01, 0x08, 0xe4, 0x00, 0x01, 0x09, 0x90, 0x00, 0x01, 0x0a, 0x68, - 0x00, 0x01, 0x0b, 0x30, 0x00, 0x01, 0x0b, 0xf4, 0x00, 0x01, 0x0c, 0x64, - 0x00, 0x01, 0x0c, 0xd4, 0x00, 0x01, 0x0d, 0x58, 0x00, 0x01, 0x0d, 0xc4, - 0x00, 0x01, 0x0e, 0x54, 0x00, 0x01, 0x0e, 0xa4, 0x00, 0x01, 0x0e, 0xf8, - 0x00, 0x01, 0x0f, 0x90, 0x00, 0x01, 0x10, 0x24, 0x00, 0x01, 0x11, 0x10, - 0x00, 0x01, 0x11, 0x88, 0x00, 0x01, 0x12, 0x2c, 0x00, 0x01, 0x12, 0xa4, - 0x00, 0x01, 0x13, 0x6c, 0x00, 0x01, 0x13, 0xf0, 0x00, 0x01, 0x14, 0x68, - 0x00, 0x01, 0x15, 0x30, 0x00, 0x01, 0x16, 0x04, 0x00, 0x01, 0x16, 0x78, - 0x00, 0x01, 0x16, 0xd4, 0x00, 0x01, 0x17, 0x60, 0x00, 0x01, 0x17, 0xe0, - 0x00, 0x01, 0x18, 0x38, 0x00, 0x01, 0x18, 0xbc, 0x00, 0x01, 0x19, 0x80, - 0x00, 0x01, 0x1a, 0x2c, 0x00, 0x01, 0x1b, 0x1c, 0x00, 0x01, 0x1b, 0xa8, - 0x00, 0x01, 0x1c, 0x34, 0x00, 0x01, 0x1c, 0xb8, 0x00, 0x01, 0x1d, 0x4c, - 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x1e, 0xdc, 0x00, 0x01, 0x1f, 0xa4, - 0x00, 0x01, 0x20, 0x74, 0x00, 0x01, 0x20, 0xfc, 0x00, 0x01, 0x21, 0xb4, - 0x00, 0x01, 0x22, 0x2c, 0x00, 0x01, 0x22, 0x6c, 0x00, 0x01, 0x23, 0x30, - 0x00, 0x01, 0x23, 0xfc, 0x00, 0x01, 0x24, 0xc4, 0x00, 0x01, 0x25, 0xb0, - 0x00, 0x01, 0x26, 0xf4, 0x00, 0x01, 0x28, 0x3c, 0x00, 0x01, 0x29, 0x38, - 0x00, 0x01, 0x2a, 0x20, 0x00, 0x01, 0x2b, 0x48, 0x00, 0x01, 0x2c, 0x3c, - 0x00, 0x01, 0x2d, 0x14, 0x00, 0x01, 0x2d, 0x88, 0x00, 0x01, 0x2e, 0x34, - 0x00, 0x01, 0x2e, 0xb8, 0x00, 0x01, 0x2f, 0x58, 0x00, 0x01, 0x30, 0x14, - 0x00, 0x01, 0x30, 0x28, 0x00, 0x01, 0x30, 0xc4, 0x00, 0x01, 0x31, 0x2c, - 0x00, 0x01, 0x31, 0x98, 0x00, 0x01, 0x32, 0x08, 0x00, 0x01, 0x32, 0x8c, - 0x00, 0x01, 0x33, 0x18, 0x00, 0x01, 0x33, 0xa0, 0x00, 0x01, 0x34, 0x18, - 0x00, 0x01, 0x34, 0x28, 0x00, 0x01, 0x34, 0x38, 0x00, 0x01, 0x34, 0x80, - 0x00, 0x01, 0x34, 0xc8, 0x00, 0x01, 0x35, 0x10, 0x00, 0x01, 0x35, 0x60, - 0x00, 0x01, 0x35, 0xb4, 0x00, 0x01, 0x36, 0x3c, 0x00, 0x01, 0x36, 0xc4, - 0x00, 0x01, 0x36, 0xd4, 0x00, 0x01, 0x36, 0xe4, 0x00, 0x01, 0x37, 0x28, - 0x00, 0x01, 0x37, 0x6c, 0x00, 0x01, 0x37, 0xb8, 0x00, 0x01, 0x38, 0x04, - 0x00, 0x01, 0x38, 0x34, 0x00, 0x01, 0x38, 0x68, 0x00, 0x01, 0x38, 0x9c, - 0x00, 0x01, 0x38, 0xd0, 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x2c, - 0x00, 0x01, 0x39, 0x60, 0x00, 0x01, 0x39, 0x94, 0x00, 0x01, 0x39, 0xd8, - 0x00, 0x01, 0x3a, 0x08, 0x00, 0x01, 0x3a, 0x58, 0x00, 0x01, 0x3a, 0xa8, - 0x00, 0x01, 0x3a, 0xec, 0x00, 0x01, 0x3b, 0x30, 0x00, 0x01, 0x3b, 0x88, - 0x00, 0x01, 0x3b, 0xb4, 0x00, 0x01, 0x3c, 0x14, 0x00, 0x01, 0x3c, 0x44, - 0x00, 0x01, 0x3c, 0xdc, 0x00, 0x01, 0x3d, 0x58, 0x00, 0x01, 0x3f, 0xa8, - 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x40, 0x54, 0x00, 0x01, 0x40, 0xb4, - 0x00, 0x01, 0x41, 0x50, 0x00, 0x01, 0x41, 0x80, 0x00, 0x01, 0x42, 0x38, - 0x00, 0x01, 0x42, 0x4c, 0x00, 0x01, 0x42, 0x5c, 0x00, 0x01, 0x42, 0x94, - 0x00, 0x01, 0x42, 0xdc, 0x00, 0x01, 0x43, 0x24, 0x00, 0x01, 0x43, 0x6c, - 0x00, 0x01, 0x43, 0xa4, 0x00, 0x01, 0x43, 0xdc, 0x00, 0x01, 0x44, 0x24, - 0x00, 0x01, 0x44, 0x38, 0x00, 0x01, 0x44, 0x80, 0x00, 0x01, 0x44, 0xf4, - 0x00, 0x01, 0x45, 0x30, 0x00, 0x01, 0x45, 0x6c, 0x00, 0x01, 0x45, 0xac, - 0x00, 0x01, 0x45, 0xec, 0x00, 0x01, 0x46, 0x58, 0x00, 0x01, 0x46, 0x90, - 0x00, 0x01, 0x46, 0xe8, 0x00, 0x01, 0x47, 0x3c, 0x00, 0x01, 0x47, 0xa4, - 0x00, 0x01, 0x47, 0xec, 0x00, 0x01, 0x48, 0x28, 0x00, 0x01, 0x48, 0x64, - 0x00, 0x01, 0x48, 0xa4, 0x00, 0x01, 0x48, 0xe4, 0x00, 0x01, 0x49, 0x2c, - 0x00, 0x01, 0x49, 0x68, 0x00, 0x01, 0x49, 0xcc, 0x00, 0x01, 0x49, 0xf8, - 0x00, 0x01, 0x4a, 0x24, 0x00, 0x01, 0x4a, 0x60, 0x00, 0x01, 0x4a, 0x70, - 0x00, 0x01, 0x4a, 0x98, 0x00, 0x01, 0x4a, 0xc0, 0x00, 0x01, 0x4b, 0x04, - 0x00, 0x01, 0x4b, 0x28, 0x00, 0x01, 0x4b, 0x60, 0x00, 0x01, 0x4b, 0xc0, - 0x00, 0x01, 0x4c, 0x1c, 0x00, 0x01, 0x4c, 0x60, 0x00, 0x01, 0x4c, 0x98, - 0x00, 0x01, 0x4c, 0xbc, 0x00, 0x01, 0x4c, 0xf0, 0x00, 0x01, 0x4d, 0x38, - 0x00, 0x01, 0x4d, 0x8c, 0x00, 0x01, 0x4d, 0xd0, 0x00, 0x01, 0x4e, 0x08, - 0x00, 0x01, 0x4e, 0x40, 0x00, 0x01, 0x4e, 0x78, 0x00, 0x01, 0x4e, 0xb0, - 0x00, 0x01, 0x4e, 0xe0, 0x00, 0x01, 0x4f, 0x10, 0x00, 0x01, 0x4f, 0x54, - 0x00, 0x01, 0x4f, 0x94, 0x00, 0x01, 0x4f, 0xc0, 0x00, 0x01, 0x4f, 0xf8, - 0x00, 0x01, 0x50, 0x3c, 0x00, 0x01, 0x50, 0x74, 0x00, 0x01, 0x50, 0xac, - 0x00, 0x01, 0x50, 0xf4, 0x00, 0x01, 0x51, 0x1c, 0x00, 0x01, 0x51, 0x5c, - 0x00, 0x01, 0x51, 0x9c, 0x00, 0x01, 0x51, 0xb0, 0x00, 0x01, 0x51, 0xe8, - 0x00, 0x01, 0x52, 0x44, 0x00, 0x01, 0x52, 0x80, 0x00, 0x01, 0x52, 0xd4, - 0x00, 0x01, 0x53, 0x1c, 0x00, 0x01, 0x53, 0x48, 0x00, 0x01, 0x53, 0x80, - 0x00, 0x01, 0x53, 0xe8, 0x00, 0x01, 0x54, 0x2c, 0x00, 0x01, 0x54, 0x70, - 0x00, 0x01, 0x54, 0xb8, 0x00, 0x01, 0x55, 0x00, 0x00, 0x01, 0x55, 0x6c, - 0x00, 0x01, 0x55, 0x94, 0x00, 0x01, 0x55, 0xbc, 0x00, 0x01, 0x56, 0x00, - 0x00, 0x01, 0x56, 0x5c, 0x00, 0x01, 0x56, 0x80, 0x00, 0x01, 0x56, 0xa4, - 0x00, 0x01, 0x56, 0xd0, 0x00, 0x01, 0x56, 0xf8, 0x00, 0x01, 0x57, 0x44, - 0x00, 0x01, 0x57, 0x7c, 0x00, 0x01, 0x57, 0xb8, 0x00, 0x01, 0x58, 0x20, - 0x00, 0x01, 0x58, 0x6c, 0x00, 0x01, 0x58, 0xd0, 0x00, 0x01, 0x59, 0x08, - 0x00, 0x01, 0x59, 0x34, 0x00, 0x01, 0x59, 0x60, 0x00, 0x01, 0x59, 0xc4, - 0x00, 0x01, 0x59, 0xfc, 0x00, 0x01, 0x5a, 0x48, 0x00, 0x01, 0x5a, 0x8c, - 0x00, 0x01, 0x5a, 0xc0, 0x00, 0x01, 0x5b, 0x04, 0x00, 0x01, 0x5b, 0x40, - 0x00, 0x01, 0x5b, 0x70, 0x00, 0x01, 0x5b, 0xdc, 0x00, 0x01, 0x5c, 0x6c, - 0x00, 0x01, 0x5d, 0x1c, 0x00, 0x01, 0x5d, 0x54, 0x00, 0x01, 0x5d, 0x8c, - 0x00, 0x01, 0x60, 0x08, 0x00, 0x01, 0x60, 0x38, 0x00, 0x01, 0x60, 0x78, - 0x00, 0x01, 0x60, 0xd0, 0x00, 0x01, 0x61, 0x1c, 0x00, 0x01, 0x61, 0x50, - 0x00, 0x01, 0x61, 0x84, 0x00, 0x01, 0x61, 0xd8, 0x00, 0x01, 0x62, 0x18, - 0x00, 0x01, 0x62, 0x4c, 0x00, 0x01, 0x62, 0xb0, 0x00, 0x01, 0x63, 0x50, - 0x00, 0x01, 0x63, 0x84, 0x00, 0x01, 0x63, 0xc8, 0x00, 0x01, 0x64, 0x0c, - 0x00, 0x01, 0x64, 0x30, 0x00, 0x01, 0x64, 0x54, 0x00, 0x01, 0x64, 0xb4, - 0x00, 0x01, 0x64, 0xf8, 0x00, 0x01, 0x65, 0x28, 0x00, 0x01, 0x65, 0x3c, - 0x00, 0x01, 0x65, 0x50, 0x00, 0x01, 0x65, 0x84, 0x00, 0x01, 0x65, 0x98, - 0x00, 0x01, 0x65, 0xac, 0x00, 0x01, 0x66, 0x18, 0x00, 0x01, 0x66, 0x2c, - 0x00, 0x01, 0x66, 0x90, 0x00, 0x01, 0x66, 0xa4, 0x00, 0x01, 0x66, 0xf8, - 0x00, 0x01, 0x67, 0x0c, 0x00, 0x01, 0x67, 0x20, 0x00, 0x01, 0x67, 0x74, - 0x00, 0x01, 0x67, 0xa8, 0x00, 0x01, 0x67, 0xdc, 0x00, 0x01, 0x67, 0xf0, - 0x00, 0x01, 0x68, 0xac, 0x00, 0x01, 0x68, 0xf0, 0x00, 0x01, 0x69, 0x34, - 0x00, 0x01, 0x69, 0x44, 0x00, 0x01, 0x69, 0x78, 0x00, 0x01, 0x69, 0xec, - 0x00, 0x01, 0x6a, 0x34, 0x00, 0x01, 0x6b, 0x4c, 0x00, 0x01, 0x6b, 0x98, - 0x00, 0x01, 0x6b, 0xec, 0x00, 0x01, 0x6c, 0x48, 0x00, 0x01, 0x6c, 0x88, - 0x00, 0x01, 0x6e, 0x80, 0x00, 0x01, 0x6e, 0xd0, 0x00, 0x01, 0x6f, 0xe0, - 0x00, 0x01, 0x6f, 0xf0, 0x00, 0x01, 0x70, 0x00, 0x00, 0x01, 0x70, 0x40, - 0x00, 0x01, 0x70, 0xc4, 0x00, 0x01, 0x70, 0xd4, 0x00, 0x01, 0x70, 0xe4, - 0x00, 0x01, 0x70, 0xf4, 0x00, 0x01, 0x71, 0xbc, 0x00, 0x01, 0x71, 0xcc, - 0x00, 0x01, 0x71, 0xdc, 0x00, 0x01, 0x72, 0x48, 0x00, 0x01, 0x72, 0x58, - 0x00, 0x01, 0x72, 0x68, 0x00, 0x01, 0x72, 0xdc, 0x00, 0x01, 0x72, 0xec, - 0x00, 0x01, 0x73, 0x50, 0x00, 0x01, 0x73, 0x60, 0x00, 0x01, 0x73, 0xdc, - 0x00, 0x01, 0x73, 0xec, 0x00, 0x01, 0x73, 0xfc, 0x00, 0x01, 0x74, 0xf8, - 0x00, 0x01, 0x75, 0x08, 0x00, 0x01, 0x75, 0xe0, 0x00, 0x01, 0x76, 0xac, - 0x00, 0x01, 0x76, 0xe0, 0x00, 0x01, 0x78, 0xdc, 0x00, 0x01, 0x79, 0x0c, - 0x00, 0x01, 0x79, 0x3c, 0x00, 0x01, 0x79, 0x6c, 0x00, 0x01, 0x79, 0xa0, - 0x00, 0x01, 0x79, 0xdc, 0x00, 0x01, 0x7a, 0xb4, 0x00, 0x01, 0x7b, 0x8c, - 0x00, 0x01, 0x7c, 0x24, 0x00, 0x01, 0x7c, 0xd8, 0x00, 0x01, 0x7d, 0xb0, - 0x00, 0x01, 0x7e, 0x84, 0x00, 0x01, 0x7f, 0x24, 0x00, 0x01, 0x7f, 0xe4, - 0x00, 0x01, 0x80, 0xc8, 0x00, 0x01, 0x81, 0x40, 0x00, 0x01, 0x81, 0xd8, - 0x00, 0x01, 0x82, 0x80, 0x00, 0x01, 0x83, 0xd8, 0x00, 0x01, 0x84, 0xec, - 0x00, 0x01, 0x84, 0xfc, 0x00, 0x01, 0x85, 0xa8, 0x00, 0x01, 0x86, 0x60, - 0x00, 0x01, 0x87, 0x34, 0x00, 0x01, 0x87, 0xc8, 0x00, 0x01, 0x88, 0x60, - 0x00, 0x01, 0x88, 0xf0, 0x00, 0x01, 0x89, 0xbc, 0x00, 0x01, 0x8a, 0x84, - 0x00, 0x01, 0x8b, 0x38, 0x00, 0x01, 0x8c, 0x34, 0x00, 0x01, 0x8c, 0x6c, - 0x00, 0x01, 0x8c, 0xa4, 0x00, 0x01, 0x8c, 0xd4, 0x00, 0x01, 0x8d, 0x04, - 0x00, 0x01, 0x8d, 0x34, 0x00, 0x01, 0x8e, 0x28, 0x00, 0x01, 0x8f, 0x20, - 0x00, 0x01, 0x8f, 0xa0, 0x00, 0x01, 0x8f, 0xc4, 0x00, 0x01, 0x8f, 0xfc, - 0x00, 0x01, 0x90, 0xc0, 0x00, 0x01, 0x91, 0xa8, 0x00, 0x01, 0x92, 0x84, - 0x00, 0x01, 0x93, 0x2c, 0x00, 0x01, 0x93, 0xbc, 0x00, 0x01, 0x94, 0x50, - 0x00, 0x01, 0x95, 0x10, 0x00, 0x01, 0x95, 0x7c, 0x00, 0x01, 0x95, 0xe8, - 0x00, 0x01, 0x96, 0xbc, 0x00, 0x01, 0x97, 0x20, 0x00, 0x01, 0x97, 0xe0, - 0x00, 0x01, 0x98, 0x68, 0x00, 0x01, 0x99, 0x38, 0x00, 0x01, 0x9a, 0x0c, - 0x00, 0x01, 0x9a, 0x9c, 0x00, 0x01, 0x9b, 0x3c, 0x00, 0x01, 0x9b, 0xd8, - 0x00, 0x01, 0x9c, 0xcc, 0x00, 0x01, 0x9d, 0xac, 0x00, 0x01, 0x9e, 0x78, - 0x00, 0x01, 0x9f, 0x54, 0x00, 0x01, 0xa0, 0x20, 0x00, 0x01, 0xa0, 0xe4, - 0x00, 0x01, 0xa1, 0x90, 0x00, 0x01, 0xa2, 0x28, 0x00, 0x01, 0xa2, 0x9c, - 0x00, 0x01, 0xa3, 0x50, 0x00, 0x01, 0xa4, 0x18, 0x00, 0x01, 0xa4, 0x28, - 0x00, 0x01, 0xa4, 0x38, 0x00, 0x01, 0xa4, 0x48, 0x00, 0x01, 0xa4, 0xd8, - 0x00, 0x01, 0xa5, 0x64, 0x00, 0x01, 0xa5, 0x74, 0x00, 0x01, 0xa5, 0x84, - 0x00, 0x01, 0xa5, 0x94, 0x00, 0x01, 0xa6, 0x08, 0x00, 0x01, 0xa6, 0x8c, - 0x00, 0x01, 0xa7, 0x54, 0x00, 0x01, 0xa7, 0x64, 0x00, 0x01, 0xa7, 0x7c, - 0x00, 0x01, 0xa7, 0x94, 0x00, 0x01, 0xa7, 0xc8, 0x00, 0x01, 0xa8, 0x28, - 0x00, 0x01, 0xa8, 0xe8, 0x00, 0x01, 0xa9, 0x18, 0x00, 0x01, 0xaa, 0x08, - 0x00, 0x01, 0xaa, 0x18, 0x00, 0x01, 0xaa, 0x28, 0x00, 0x01, 0xaa, 0x5c, - 0x00, 0x01, 0xaa, 0x6c, 0x00, 0x01, 0xab, 0x38, 0x00, 0x01, 0xab, 0xe8, - 0x00, 0x01, 0xac, 0x94, 0x00, 0x01, 0xac, 0xc4, 0x00, 0x01, 0xac, 0xf8, - 0x00, 0x01, 0xad, 0x28, 0x00, 0x01, 0xad, 0xa4, 0x00, 0x01, 0xad, 0xb4, - 0x00, 0x01, 0xae, 0x64, 0x00, 0x01, 0xae, 0x74, 0x00, 0x01, 0xae, 0x84, - 0x00, 0x01, 0xaf, 0x28, 0x00, 0x01, 0xaf, 0x38, 0x00, 0x01, 0xb0, 0x48, - 0x00, 0x01, 0xb1, 0x44, 0x00, 0x01, 0xb1, 0xb4, 0x00, 0x01, 0xb1, 0xe4, - 0x00, 0x01, 0xb2, 0x80, 0x00, 0x01, 0xb3, 0x08, 0x00, 0x01, 0xb3, 0x18, - 0x00, 0x01, 0xb3, 0x28, 0x00, 0x01, 0xb3, 0x38, 0x00, 0x01, 0xb3, 0x68, - 0x00, 0x01, 0xb3, 0x78, 0x00, 0x01, 0xb3, 0x88, 0x00, 0x01, 0xb3, 0x98, - 0x00, 0x01, 0xb4, 0x24, 0x00, 0x01, 0xb5, 0x0c, 0x00, 0x01, 0xb5, 0x1c, - 0x00, 0x01, 0xb5, 0x90, 0x00, 0x01, 0xb6, 0x20, 0x00, 0x01, 0xb6, 0xa4, - 0x00, 0x01, 0xb7, 0x38, 0x00, 0x01, 0xb7, 0xd0, 0x00, 0x01, 0xb8, 0x7c, - 0x00, 0x01, 0xb9, 0x08, 0x00, 0x01, 0xb9, 0xec, 0x00, 0x01, 0xba, 0xc8, - 0x00, 0x01, 0xbb, 0x74, 0x00, 0x01, 0xbb, 0x84, 0x00, 0x01, 0xbc, 0x50, - 0x00, 0x01, 0xbd, 0x34, 0x00, 0x01, 0xbd, 0x74, 0x00, 0x01, 0xbe, 0x0c, - 0x00, 0x01, 0xbe, 0x1c, 0x00, 0x01, 0xbf, 0x54, 0x00, 0x01, 0xc0, 0x4c, - 0x00, 0x01, 0xc0, 0xd0, 0x00, 0x01, 0xc1, 0x00, 0x00, 0x01, 0xc1, 0xb0, - 0x00, 0x01, 0xc2, 0x48, 0x00, 0x01, 0xc2, 0xdc, 0x00, 0x01, 0xc3, 0x74, - 0x00, 0x01, 0xc3, 0x84, 0x00, 0x01, 0xc3, 0xf0, 0x00, 0x01, 0xc4, 0x00, - 0x00, 0x01, 0xc4, 0x10, 0x00, 0x01, 0xc4, 0x70, 0x00, 0x01, 0xc4, 0x80, - 0x00, 0x01, 0xc5, 0xe4, 0x00, 0x01, 0xc5, 0xf4, 0x00, 0x01, 0xc6, 0x60, - 0x00, 0x01, 0xc6, 0xd8, 0x00, 0x01, 0xc7, 0x60, 0x00, 0x01, 0xc7, 0xfc, - 0x00, 0x01, 0xc8, 0xb0, 0x00, 0x01, 0xc9, 0x54, 0x00, 0x01, 0xca, 0x04, - 0x00, 0x01, 0xca, 0xfc, 0x00, 0x01, 0xcb, 0xb0, 0x00, 0x01, 0xcc, 0x54, - 0x00, 0x01, 0xcc, 0x88, 0x00, 0x01, 0xcc, 0xbc, 0x00, 0x01, 0xcd, 0xac, - 0x00, 0x01, 0xcd, 0xdc, 0x00, 0x01, 0xce, 0xd8, 0x00, 0x01, 0xce, 0xe8, - 0x00, 0x01, 0xce, 0xf8, 0x00, 0x01, 0xcf, 0x30, 0x00, 0x01, 0xcf, 0x40, - 0x00, 0x01, 0xd0, 0x34, 0x00, 0x01, 0xd1, 0x08, 0x00, 0x01, 0xd1, 0xd8, - 0x00, 0x01, 0xd2, 0x08, 0x00, 0x01, 0xd2, 0x3c, 0x00, 0x01, 0xd2, 0x6c, - 0x00, 0x01, 0xd2, 0xe8, 0x00, 0x01, 0xd3, 0xf0, 0x00, 0x01, 0xd4, 0x80, - 0x00, 0x01, 0xd5, 0x28, 0x00, 0x01, 0xd5, 0xcc, 0x00, 0x01, 0xd6, 0xc4, - 0x00, 0x01, 0xd7, 0xc0, 0x00, 0x01, 0xd8, 0x54, 0x00, 0x01, 0xd8, 0xd4, - 0x00, 0x01, 0xd9, 0x90, 0x00, 0x01, 0xda, 0x38, 0x00, 0x01, 0xda, 0xf8, - 0x00, 0x01, 0xdb, 0xbc, 0x00, 0x01, 0xdc, 0x9c, 0x00, 0x01, 0xdd, 0x80, - 0x00, 0x01, 0xde, 0xfc, 0x00, 0x01, 0xe0, 0x64, 0x00, 0x01, 0xe0, 0xfc, - 0x00, 0x01, 0xe1, 0x90, 0x00, 0x01, 0xe2, 0x84, 0x00, 0x01, 0xe3, 0x58, - 0x00, 0x01, 0xe3, 0xcc, 0x00, 0x01, 0xe4, 0x38, 0x00, 0x01, 0xe4, 0x70, - 0x00, 0x01, 0xe4, 0xa8, 0x00, 0x01, 0xe5, 0x90, 0x00, 0x01, 0xe6, 0x68, - 0x00, 0x01, 0xe7, 0x5c, 0x00, 0x01, 0xe8, 0x38, 0x00, 0x01, 0xe9, 0xb4, - 0x00, 0x01, 0xea, 0xfc, 0x00, 0x01, 0xeb, 0x30, 0x00, 0x01, 0xeb, 0x60, - 0x00, 0x01, 0xeb, 0xf4, 0x00, 0x01, 0xec, 0x78, 0x00, 0x01, 0xed, 0x10, - 0x00, 0x01, 0xed, 0x64, 0x00, 0x01, 0xed, 0xbc, 0x00, 0x01, 0xed, 0xf4, - 0x00, 0x01, 0xee, 0x2c, 0x00, 0x01, 0xee, 0x84, 0x00, 0x01, 0xef, 0xc8, - 0x00, 0x01, 0xf0, 0xec, 0x00, 0x01, 0xf1, 0xac, 0x00, 0x01, 0xf2, 0x70, - 0x00, 0x01, 0xf3, 0x18, 0x00, 0x01, 0xf3, 0xbc, 0x00, 0x01, 0xf4, 0x78, - 0x00, 0x01, 0xf5, 0x60, 0x00, 0x01, 0xf5, 0xac, 0x00, 0x01, 0xf5, 0xf8, - 0x00, 0x01, 0xf6, 0x6c, 0x00, 0x01, 0xf6, 0xe0, 0x00, 0x01, 0xf7, 0xa0, - 0x00, 0x01, 0xf8, 0x58, 0x00, 0x01, 0xf9, 0x60, 0x00, 0x01, 0xfa, 0x60, - 0x00, 0x01, 0xfb, 0x6c, 0x00, 0x01, 0xfc, 0x74, 0x00, 0x01, 0xfd, 0x1c, - 0x00, 0x01, 0xfd, 0xc4, 0x00, 0x01, 0xfe, 0x7c, 0x00, 0x01, 0xff, 0x28, - 0x00, 0x01, 0xff, 0xdc, 0x00, 0x02, 0x00, 0x94, 0x00, 0x02, 0x01, 0x38, - 0x00, 0x02, 0x01, 0xd0, 0x00, 0x02, 0x02, 0x50, 0x00, 0x02, 0x02, 0xd4, - 0x00, 0x02, 0x03, 0x48, 0x00, 0x02, 0x03, 0xbc, 0x00, 0x02, 0x04, 0x80, - 0x00, 0x02, 0x05, 0x44, 0x00, 0x02, 0x06, 0x4c, 0x00, 0x02, 0x07, 0x44, - 0x00, 0x02, 0x08, 0x40, 0x00, 0x02, 0x09, 0x40, 0x00, 0x02, 0x09, 0xa4, - 0x00, 0x02, 0x0a, 0x08, 0x00, 0x02, 0x0a, 0x60, 0x00, 0x02, 0x0a, 0xbc, - 0x00, 0x02, 0x0b, 0x38, 0x00, 0x02, 0x0b, 0xb8, 0x00, 0x02, 0x0c, 0x50, - 0x00, 0x02, 0x0c, 0xe8, 0x00, 0x02, 0x0d, 0x64, 0x00, 0x02, 0x0d, 0xe0, - 0x00, 0x02, 0x0e, 0x68, 0x00, 0x02, 0x0e, 0xf0, 0x00, 0x02, 0x0f, 0x98, - 0x00, 0x02, 0x10, 0x40, 0x00, 0x02, 0x10, 0xac, 0x00, 0x02, 0x10, 0xbc, - 0x00, 0x02, 0x11, 0xac, 0x00, 0x02, 0x12, 0x78, 0x00, 0x02, 0x13, 0x80, - 0x00, 0x02, 0x14, 0x64, 0x00, 0x02, 0x14, 0x74, 0x00, 0x02, 0x14, 0xa4, - 0x00, 0x02, 0x14, 0xd4, 0x00, 0x02, 0x15, 0xa0, 0x00, 0x02, 0x16, 0x68, - 0x00, 0x02, 0x17, 0x00, 0x00, 0x02, 0x17, 0x94, 0x00, 0x02, 0x18, 0x30, - 0x00, 0x02, 0x18, 0xcc, 0x00, 0x02, 0x19, 0x48, 0x00, 0x02, 0x19, 0xc8, - 0x00, 0x02, 0x1a, 0x54, 0x00, 0x02, 0x1a, 0xd8, 0x00, 0x02, 0x1b, 0x9c, - 0x00, 0x02, 0x1c, 0x3c, 0x00, 0x02, 0x1c, 0x4c, 0x00, 0x02, 0x1c, 0x7c, - 0x00, 0x02, 0x1c, 0xb0, 0x00, 0x02, 0x1c, 0xe4, 0x00, 0x02, 0x1d, 0x1c, - 0x00, 0x02, 0x1d, 0x2c, 0x00, 0x02, 0x1d, 0x3c, 0x00, 0x02, 0x1d, 0x70, - 0x00, 0x02, 0x1d, 0xa0, 0x00, 0x02, 0x1d, 0xb0, 0x00, 0x02, 0x1d, 0xc0, - 0x00, 0x02, 0x1d, 0xf8, 0x00, 0x02, 0x1e, 0x30, 0x00, 0x02, 0x1e, 0x68, - 0x00, 0x02, 0x1e, 0x9c, 0x00, 0x02, 0x1e, 0xd0, 0x00, 0x02, 0x1f, 0x04, - 0x00, 0x02, 0x1f, 0xb4, 0x00, 0x02, 0x1f, 0xc4, 0x00, 0x02, 0x1f, 0xf4, - 0x00, 0x02, 0x20, 0x24, 0x00, 0x02, 0x20, 0x5c, 0x00, 0x02, 0x20, 0x94, - 0x00, 0x02, 0x20, 0xc8, 0x00, 0x02, 0x20, 0xfc, 0x00, 0x02, 0x21, 0xb0, - 0x00, 0x02, 0x22, 0x50, 0x00, 0x02, 0x22, 0x84, 0x00, 0x02, 0x22, 0xb8, - 0x00, 0x02, 0x22, 0xf0, 0x00, 0x02, 0x23, 0x28, 0x00, 0x02, 0x23, 0x58, - 0x00, 0x02, 0x23, 0x88, 0x00, 0x02, 0x23, 0xbc, 0x00, 0x02, 0x23, 0xf0, - 0x00, 0x02, 0x24, 0x24, 0x00, 0x02, 0x24, 0x58, 0x00, 0x02, 0x24, 0x8c, - 0x00, 0x02, 0x24, 0xc0, 0x00, 0x02, 0x25, 0x18, 0x00, 0x02, 0x25, 0x70, - 0x00, 0x02, 0x25, 0xa8, 0x00, 0x02, 0x25, 0xe0, 0x00, 0x02, 0x26, 0x88, - 0x00, 0x02, 0x27, 0x34, 0x00, 0x02, 0x27, 0xe0, 0x00, 0x02, 0x28, 0x8c, - 0x00, 0x02, 0x29, 0x30, 0x00, 0x02, 0x29, 0xd4, 0x00, 0x02, 0x2a, 0x50, - 0x00, 0x02, 0x2a, 0x60, 0x00, 0x02, 0x2b, 0x28, 0x00, 0x02, 0x2b, 0xfc, - 0x00, 0x02, 0x2c, 0xc8, 0x00, 0x02, 0x2d, 0x90, 0x00, 0x02, 0x2e, 0x50, - 0x00, 0x02, 0x2f, 0x08, 0x00, 0x02, 0x2f, 0xbc, 0x00, 0x02, 0x30, 0x68, - 0x00, 0x02, 0x31, 0x04, 0x00, 0x02, 0x31, 0x98, 0x00, 0x02, 0x31, 0xa8, - 0x00, 0x02, 0x31, 0xb8, 0x00, 0x02, 0x32, 0x38, 0x00, 0x02, 0x32, 0xbc, - 0x00, 0x02, 0x33, 0x90, 0x00, 0x02, 0x34, 0x60, 0x00, 0x02, 0x35, 0x00, - 0x00, 0x02, 0x35, 0x98, 0x00, 0x02, 0x35, 0xa8, 0x00, 0x02, 0x35, 0xb8, - 0x00, 0x02, 0x35, 0xc8, 0x00, 0x02, 0x35, 0xd8, 0x00, 0x02, 0x36, 0x3c, - 0x00, 0x02, 0x36, 0xd0, 0x00, 0x02, 0x37, 0x10, 0x00, 0x02, 0x37, 0x80, - 0x00, 0x02, 0x38, 0x00, 0x00, 0x02, 0x38, 0x34, 0x00, 0x02, 0x38, 0x5c, - 0x00, 0x02, 0x38, 0xe4, 0x00, 0x02, 0x39, 0x1c, 0x00, 0x02, 0x39, 0x44, - 0x00, 0x02, 0x39, 0x9c, 0x00, 0x02, 0x39, 0xd0, 0x00, 0x02, 0x39, 0xe0, - 0x00, 0x02, 0x3a, 0x34, 0x00, 0x02, 0x3a, 0xf8, 0x00, 0x02, 0x3b, 0x64, - 0x00, 0x02, 0x3b, 0xb8, 0x00, 0x02, 0x3c, 0x18, 0x00, 0x02, 0x3c, 0x44, - 0x00, 0x02, 0x3c, 0x6c, 0x00, 0x02, 0x3c, 0xa0, 0x00, 0x02, 0x3c, 0xf0, - 0x00, 0x02, 0x3d, 0x24, 0x00, 0x02, 0x3d, 0x38, 0x00, 0x02, 0x3d, 0xa4, - 0x00, 0x02, 0x3d, 0xb4, 0x00, 0x02, 0x3d, 0xe0, 0x00, 0x02, 0x3e, 0x10, - 0x00, 0x02, 0x3e, 0x24, 0x00, 0x02, 0x3e, 0x38, 0x00, 0x02, 0x3e, 0x94, - 0x00, 0x02, 0x3e, 0xf4, 0x00, 0x02, 0x3f, 0xc4, 0x00, 0x02, 0x40, 0x38, - 0x00, 0x02, 0x40, 0xb8, 0x00, 0x02, 0x40, 0xec, 0x00, 0x02, 0x41, 0x48, - 0x00, 0x02, 0x41, 0xd0, 0x00, 0x02, 0x41, 0xf8, 0x00, 0x02, 0x42, 0x20, - 0x00, 0x02, 0x42, 0x58, 0x00, 0x02, 0x42, 0x68, 0x00, 0x02, 0x42, 0xec, - 0x00, 0x02, 0x43, 0x20, 0x00, 0x02, 0x43, 0x40, 0x00, 0x02, 0x43, 0x6c, - 0x00, 0x02, 0x43, 0x94, 0x00, 0x02, 0x43, 0xc0, 0x00, 0x02, 0x43, 0xd0, - 0x00, 0x02, 0x43, 0xe0, 0x00, 0x02, 0x44, 0x38, 0x00, 0x02, 0x44, 0x6c, - 0x00, 0x02, 0x44, 0xa0, 0x00, 0x02, 0x45, 0x10, 0x00, 0x02, 0x45, 0x40, - 0x00, 0x02, 0x45, 0xec, 0x00, 0x02, 0x46, 0x60, 0x00, 0x02, 0x46, 0xf4, - 0x00, 0x02, 0x47, 0x44, 0x00, 0x02, 0x47, 0xb8, 0x00, 0x02, 0x47, 0xe8, - 0x00, 0x02, 0x48, 0x58, 0x00, 0x02, 0x48, 0xbc, 0x00, 0x02, 0x49, 0x54, - 0x00, 0x02, 0x49, 0x84, 0x00, 0x02, 0x49, 0xd8, 0x00, 0x02, 0x4a, 0x4c, - 0x00, 0x02, 0x4a, 0xc8, 0x00, 0x02, 0x4b, 0x38, 0x00, 0x02, 0x4b, 0xec, - 0x00, 0x02, 0x4c, 0x20, 0x00, 0x02, 0x4c, 0x8c, 0x00, 0x02, 0x4d, 0x38, - 0x00, 0x02, 0x4d, 0xac, 0x00, 0x02, 0x4e, 0x24, 0x00, 0x02, 0x4e, 0xc0, - 0x00, 0x02, 0x4f, 0x44, 0x00, 0x02, 0x4f, 0xd4, 0x00, 0x02, 0x50, 0x60, - 0x00, 0x02, 0x50, 0xb4, 0x00, 0x02, 0x51, 0x70, 0x00, 0x02, 0x52, 0x04, - 0x00, 0x02, 0x52, 0x1c, 0x00, 0x02, 0x52, 0x34, 0x00, 0x02, 0x52, 0x4c, - 0x00, 0x02, 0x52, 0x84, 0x00, 0x02, 0x52, 0xdc, 0x00, 0x02, 0x53, 0x50, - 0x00, 0x02, 0x53, 0xfc, 0x00, 0x02, 0x55, 0x4c, 0x00, 0x02, 0x56, 0x20, - 0x00, 0x02, 0x56, 0x30, 0x00, 0x02, 0x56, 0x9c, 0x00, 0x02, 0x57, 0x40, - 0x00, 0x02, 0x57, 0xb8, 0x00, 0x02, 0x58, 0x88, 0x00, 0x02, 0x58, 0xd0, - 0x00, 0x02, 0x59, 0x3c, 0x00, 0x02, 0x59, 0x4c, 0x00, 0x02, 0x59, 0xc0, - 0x00, 0x02, 0x5a, 0x50, 0x00, 0x02, 0x5a, 0xd4, 0x00, 0x02, 0x5a, 0xe4, - 0x00, 0x02, 0x5a, 0xf4, 0x00, 0x02, 0x5b, 0x6c, 0x00, 0x02, 0x5b, 0xf0, - 0x00, 0x02, 0x5c, 0xac, 0x00, 0x02, 0x5d, 0xb0, 0x00, 0x02, 0x5e, 0x68, - 0x00, 0x02, 0x5e, 0xc0, 0x00, 0x02, 0x5f, 0x1c, 0x00, 0x02, 0x5f, 0x94, - 0x00, 0x02, 0x60, 0x2c, 0x00, 0x02, 0x60, 0xc0, 0x00, 0x02, 0x61, 0x20, - 0x00, 0x02, 0x61, 0x30, 0x00, 0x02, 0x61, 0xb0, 0x00, 0x02, 0x62, 0x68, - 0x00, 0x02, 0x63, 0x20, 0x00, 0x02, 0x63, 0x30, 0x00, 0x02, 0x63, 0x40, - 0x00, 0x02, 0x63, 0x50, 0x00, 0x02, 0x63, 0xf8, 0x00, 0x02, 0x64, 0xd0, - 0x00, 0x02, 0x65, 0x9c, 0x00, 0x02, 0x65, 0xdc, 0x00, 0x02, 0x65, 0xec, - 0x00, 0x02, 0x66, 0x58, 0x00, 0x02, 0x66, 0x68, 0x00, 0x02, 0x66, 0xfc, - 0x00, 0x02, 0x67, 0x98, 0x00, 0x02, 0x68, 0x14, 0x00, 0x02, 0x68, 0xd4, - 0x00, 0x02, 0x69, 0x88, 0x00, 0x02, 0x6a, 0x4c, 0x00, 0x02, 0x6a, 0xb8, - 0x00, 0x02, 0x6b, 0x30, 0x00, 0x02, 0x6b, 0xa8, 0x00, 0x02, 0x6c, 0x4c, - 0x00, 0x02, 0x6c, 0xb0, 0x00, 0x02, 0x6c, 0xe0, 0x00, 0x02, 0x6d, 0x54, - 0x00, 0x02, 0x6d, 0xcc, 0x00, 0x02, 0x6e, 0x0c, 0x00, 0x02, 0x6e, 0x9c, - 0x00, 0x02, 0x6f, 0x04, 0x00, 0x02, 0x6f, 0x68, 0x00, 0x02, 0x6f, 0xe4, - 0x00, 0x02, 0x70, 0xa0, 0x00, 0x02, 0x71, 0x14, 0x00, 0x02, 0x71, 0xb8, - 0x00, 0x02, 0x72, 0x04, 0x00, 0x02, 0x72, 0x68, 0x00, 0x02, 0x72, 0xe0, - 0x00, 0x02, 0x73, 0xd8, 0x00, 0x02, 0x74, 0xcc, 0x00, 0x02, 0x75, 0x78, - 0x00, 0x02, 0x76, 0xc4, 0x00, 0x02, 0x77, 0x70, 0x00, 0x02, 0x78, 0x1c, - 0x00, 0x02, 0x78, 0xc4, 0x00, 0x02, 0x79, 0x5c, 0x00, 0x02, 0x7a, 0x2c, - 0x00, 0x02, 0x7b, 0x00, 0x00, 0x02, 0x7b, 0xe4, 0x00, 0x02, 0x7c, 0x30, - 0x00, 0x02, 0x7c, 0xa8, 0x00, 0x02, 0x7d, 0x5c, 0x00, 0x02, 0x7d, 0xf0, - 0x00, 0x02, 0x7e, 0x64, 0x00, 0x02, 0x7e, 0xe8, 0x00, 0x02, 0x7f, 0x40, - 0x00, 0x02, 0x7f, 0x98, 0x00, 0x02, 0x80, 0x44, 0x00, 0x02, 0x80, 0xc0, - 0x00, 0x02, 0x81, 0x38, 0x00, 0x02, 0x81, 0xb8, 0x00, 0x02, 0x82, 0x78, - 0x00, 0x02, 0x82, 0xc8, 0x00, 0x02, 0x83, 0x84, 0x00, 0x02, 0x84, 0x54, - 0x00, 0x02, 0x84, 0xac, 0x00, 0x02, 0x85, 0x58, 0x00, 0x02, 0x86, 0x0c, - 0x00, 0x02, 0x86, 0x94, 0x00, 0x02, 0x86, 0xa8, 0x00, 0x02, 0x86, 0xbc, - 0x00, 0x02, 0x86, 0xd0, 0x00, 0x02, 0x86, 0xe4, 0x00, 0x02, 0x87, 0xb4, - 0x00, 0x02, 0x88, 0x18, 0x00, 0x02, 0x88, 0xd0, 0x00, 0x02, 0x89, 0x8c, - 0x00, 0x02, 0x89, 0xa0, 0x00, 0x02, 0x8a, 0x90, 0x00, 0x02, 0x8b, 0xa0, - 0x00, 0x02, 0x8c, 0xac, 0x00, 0x02, 0x8d, 0x94, 0x00, 0x02, 0x8e, 0xec, - 0x00, 0x02, 0x8f, 0xec, 0x00, 0x02, 0x90, 0xf4, 0x00, 0x02, 0x91, 0xb8, - 0x00, 0x02, 0x92, 0x68, 0x00, 0x02, 0x93, 0x5c, 0x00, 0x02, 0x94, 0x3c, - 0x00, 0x02, 0x95, 0x08, 0x00, 0x02, 0x95, 0xdc, 0x00, 0x02, 0x96, 0x4c, - 0x00, 0x02, 0x97, 0x24, 0x00, 0x02, 0x98, 0x44, 0x00, 0x02, 0x98, 0xa4, - 0x00, 0x02, 0x98, 0xb4, 0x00, 0x02, 0x99, 0xac, 0x00, 0x02, 0x9a, 0x5c, - 0x00, 0x02, 0x9b, 0x54, 0x00, 0x02, 0x9c, 0x38, 0x00, 0x02, 0x9d, 0x18, - 0x00, 0x02, 0x9d, 0xc8, 0x00, 0x02, 0x9e, 0xf4, 0x00, 0x02, 0x9f, 0xa0, - 0x00, 0x02, 0xa0, 0x04, 0x00, 0x02, 0xa0, 0xfc, 0x00, 0x02, 0xa1, 0xbc, - 0x00, 0x02, 0xa2, 0xa8, 0x00, 0x02, 0xa3, 0x50, 0x00, 0x02, 0xa4, 0x38, - 0x00, 0x02, 0xa4, 0xf8, 0x00, 0x02, 0xa5, 0x8c, 0x00, 0x02, 0xa6, 0x34, - 0x00, 0x02, 0xa6, 0xc0, 0x00, 0x02, 0xa7, 0xd4, 0x00, 0x02, 0xa8, 0xbc, - 0x00, 0x02, 0xa9, 0x98, 0x00, 0x02, 0xaa, 0x68, 0x00, 0x02, 0xab, 0x64, - 0x00, 0x02, 0xac, 0x58, 0x00, 0x02, 0xad, 0x34, 0x00, 0x02, 0xad, 0xb8, - 0x00, 0x02, 0xae, 0x6c, 0x00, 0x02, 0xaf, 0x10, 0x00, 0x02, 0xaf, 0xc8, - 0x00, 0x02, 0xb0, 0xb0, 0x00, 0x02, 0xb1, 0x5c, 0x00, 0x02, 0xb1, 0xd8, - 0x00, 0x02, 0xb2, 0xa4, 0x00, 0x02, 0xb3, 0x78, 0x00, 0x02, 0xb4, 0x60, - 0x00, 0x02, 0xb4, 0xe8, 0x00, 0x02, 0xb5, 0x70, 0x00, 0x02, 0xb5, 0x80, - 0x00, 0x02, 0xb6, 0x04, 0x00, 0x02, 0xb6, 0x7c, 0x00, 0x02, 0xb6, 0xac, - 0x00, 0x02, 0xb6, 0xdc, 0x00, 0x02, 0xb7, 0x40, 0x00, 0x02, 0xb7, 0xf4, - 0x00, 0x02, 0xb8, 0x48, 0x00, 0x02, 0xb8, 0xb0, 0x00, 0x02, 0xb8, 0xf0, - 0x00, 0x02, 0xb9, 0xc4, 0x00, 0x02, 0xba, 0x7c, 0x00, 0x02, 0xbb, 0x14, - 0x00, 0x02, 0xbb, 0xac, 0x00, 0x02, 0xbc, 0x1c, 0x00, 0x02, 0xbc, 0xc4, - 0x00, 0x02, 0xbd, 0x84, 0x00, 0x02, 0xbe, 0x64, 0x00, 0x02, 0xbe, 0xe0, - 0x00, 0x02, 0xbf, 0x80, 0x00, 0x02, 0xc0, 0x44, 0x00, 0x02, 0xc1, 0x14, - 0x00, 0x02, 0xc1, 0x70, 0x00, 0x02, 0xc1, 0xe0, 0x00, 0x02, 0xc2, 0x30, - 0x00, 0x02, 0xc2, 0x94, 0x00, 0x02, 0xc3, 0x28, 0x00, 0x02, 0xc3, 0xe4, - 0x00, 0x02, 0xc4, 0x88, 0x00, 0x02, 0xc5, 0x30, 0x00, 0x02, 0xc5, 0x84, - 0x00, 0x02, 0xc5, 0xd4, 0x00, 0x02, 0xc6, 0x60, 0x00, 0x02, 0xc6, 0xb4, - 0x00, 0x02, 0xc6, 0xec, 0x00, 0x02, 0xc7, 0x28, 0x00, 0x02, 0xc7, 0x60, - 0x00, 0x02, 0xc7, 0x9c, 0x00, 0x02, 0xc7, 0xdc, 0x00, 0x02, 0xc8, 0x20, - 0x00, 0x02, 0xc8, 0x6c, 0x00, 0x02, 0xc8, 0x9c, 0x00, 0x02, 0xc8, 0xec, - 0x00, 0x02, 0xc9, 0x18, 0x00, 0x02, 0xc9, 0x44, 0x00, 0x02, 0xc9, 0x78, - 0x00, 0x02, 0xc9, 0x9c, 0x00, 0x02, 0xc9, 0xc8, 0x00, 0x02, 0xc9, 0xf0, - 0x00, 0x02, 0xca, 0x1c, 0x00, 0x02, 0xca, 0x48, 0x00, 0x02, 0xca, 0x78, - 0x00, 0x02, 0xca, 0xa8, 0x00, 0x02, 0xca, 0xdc, 0x00, 0x02, 0xcb, 0x00, - 0x00, 0x02, 0xcb, 0x2c, 0x00, 0x02, 0xcb, 0x58, 0x00, 0x02, 0xcb, 0x84, - 0x00, 0x02, 0xcb, 0xac, 0x00, 0x02, 0xcb, 0xd8, 0x00, 0x02, 0xcc, 0x04, - 0x00, 0x02, 0xcc, 0x30, 0x00, 0x02, 0xcc, 0x5c, 0x00, 0x02, 0xcc, 0x94, - 0x00, 0x02, 0xcc, 0xd8, 0x00, 0x02, 0xcd, 0x0c, 0x00, 0x02, 0xcd, 0x50, - 0x00, 0x02, 0xcd, 0x7c, 0x00, 0x02, 0xcd, 0xa4, 0x00, 0x02, 0xcd, 0xd0, - 0x00, 0x02, 0xcd, 0xfc, 0x00, 0x02, 0xce, 0x34, 0x00, 0x02, 0xce, 0x6c, - 0x00, 0x02, 0xce, 0x9c, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x02, 0xce, 0xfc, - 0x00, 0x02, 0xcf, 0x2c, 0x00, 0x02, 0xcf, 0x5c, 0x00, 0x02, 0xcf, 0x8c, - 0x00, 0x02, 0xcf, 0xb8, 0x00, 0x02, 0xcf, 0xe4, 0x00, 0x02, 0xd0, 0x1c, - 0x00, 0x02, 0xd0, 0x50, 0x00, 0x02, 0xd0, 0x68, 0x00, 0x02, 0xd0, 0x80, - 0x00, 0x02, 0xd0, 0xac, 0x00, 0x02, 0xd0, 0xd4, 0x00, 0x02, 0xd1, 0x00, - 0x00, 0x02, 0xd1, 0x28, 0x00, 0x02, 0xd1, 0x60, 0x00, 0x02, 0xd1, 0xa4, - 0x00, 0x02, 0xd1, 0xd4, 0x00, 0x02, 0xd2, 0x08, 0x00, 0x02, 0xd2, 0x34, - 0x00, 0x02, 0xd2, 0x60, 0x00, 0x02, 0xd2, 0x8c, 0x00, 0x02, 0xd2, 0xb8, - 0x00, 0x02, 0xd2, 0xe0, 0x00, 0x02, 0xd3, 0x0c, 0x00, 0x02, 0xd3, 0x38, - 0x00, 0x02, 0xd3, 0x64, 0x00, 0x02, 0xd3, 0x90, 0x00, 0x02, 0xd3, 0xb8, - 0x00, 0x02, 0xd3, 0xe4, 0x00, 0x02, 0xd4, 0x10, 0x00, 0x02, 0xd4, 0x40, - 0x00, 0x02, 0xd4, 0x70, 0x00, 0x02, 0xd4, 0xa0, 0x00, 0x02, 0xd4, 0xd0, - 0x00, 0x02, 0xd4, 0xf8, 0x00, 0x02, 0xd5, 0x20, 0x00, 0x02, 0xd5, 0x54, - 0x00, 0x02, 0xd5, 0x84, 0x00, 0x02, 0xd5, 0xb0, 0x00, 0x02, 0xd5, 0xdc, - 0x00, 0x02, 0xd6, 0x08, 0x00, 0x02, 0xd6, 0x34, 0x00, 0x02, 0xd6, 0x60, - 0x00, 0x02, 0xd6, 0x8c, 0x00, 0x02, 0xd6, 0xc0, 0x00, 0x02, 0xd7, 0x0c, - 0x00, 0x02, 0xd7, 0x44, 0x00, 0x02, 0xd7, 0xc4, 0x00, 0x02, 0xd7, 0xfc, - 0x00, 0x02, 0xd8, 0x4c, 0x00, 0x02, 0xd8, 0x80, 0x00, 0x02, 0xd8, 0xd0, - 0x00, 0x02, 0xd9, 0x04, 0x00, 0x02, 0xd9, 0x34, 0x00, 0x02, 0xd9, 0x68, - 0x00, 0x02, 0xd9, 0x98, 0x00, 0x02, 0xd9, 0xcc, 0x00, 0x02, 0xd9, 0xfc, - 0x00, 0x02, 0xda, 0x28, 0x00, 0x02, 0xda, 0x54, 0x00, 0x02, 0xda, 0x8c, - 0x00, 0x02, 0xda, 0xc4, 0x00, 0x02, 0xda, 0xf0, 0x00, 0x02, 0xdb, 0x1c, - 0x00, 0x02, 0xdb, 0x4c, 0x00, 0x02, 0xdb, 0x7c, 0x00, 0x02, 0xdb, 0xa4, - 0x00, 0x02, 0xdb, 0xcc, 0x00, 0x02, 0xdc, 0x00, 0x00, 0x02, 0xdc, 0x34, - 0x00, 0x02, 0xdc, 0x6c, 0x00, 0x02, 0xdc, 0xa0, 0x00, 0x02, 0xdc, 0xd8, - 0x00, 0x02, 0xdd, 0x10, 0x00, 0x02, 0xdd, 0x40, 0x00, 0x02, 0xdd, 0x74, - 0x00, 0x02, 0xdd, 0x9c, 0x00, 0x02, 0xdd, 0xc4, 0x00, 0x02, 0xdd, 0xf0, - 0x00, 0x02, 0xde, 0x18, 0x00, 0x02, 0xde, 0x44, 0x00, 0x02, 0xde, 0x6c, - 0x00, 0x02, 0xde, 0x98, 0x00, 0x02, 0xde, 0xc4, 0x00, 0x02, 0xde, 0xec, - 0x00, 0x02, 0xdf, 0x14, 0x00, 0x02, 0xdf, 0x40, 0x00, 0x02, 0xdf, 0x6c, - 0x00, 0x02, 0xdf, 0xa0, 0x00, 0x02, 0xdf, 0xec, 0x00, 0x02, 0xe0, 0x28, - 0x00, 0x02, 0xe0, 0x90, 0x00, 0x02, 0xe0, 0xc0, 0x00, 0x02, 0xe0, 0xf0, - 0x00, 0x02, 0xe1, 0x1c, 0x00, 0x02, 0xe1, 0x48, 0x00, 0x02, 0xe1, 0x7c, - 0x00, 0x02, 0xe1, 0xb0, 0x00, 0x02, 0xe1, 0xe0, 0x00, 0x02, 0xe2, 0x10, - 0x00, 0x02, 0xe2, 0x44, 0x00, 0x02, 0xe2, 0x78, 0x00, 0x02, 0xe2, 0xa8, - 0x00, 0x02, 0xe2, 0xd8, 0x00, 0x02, 0xe3, 0x00, 0x00, 0x02, 0xe3, 0x28, - 0x00, 0x02, 0xe3, 0x58, 0x00, 0x02, 0xe3, 0x8c, 0x00, 0x02, 0xe3, 0xc0, - 0x00, 0x02, 0xe3, 0xf8, 0x00, 0x02, 0xe4, 0x28, 0x00, 0x02, 0xe4, 0x58, - 0x00, 0x02, 0xe4, 0x88, 0x00, 0x02, 0xe4, 0xbc, 0x00, 0x02, 0xe4, 0xe8, - 0x00, 0x02, 0xe5, 0x14, 0x00, 0x02, 0xe5, 0x3c, 0x00, 0x02, 0xe5, 0x68, - 0x00, 0x02, 0xe5, 0x94, 0x00, 0x02, 0xe5, 0xcc, 0x00, 0x02, 0xe6, 0x04, - 0x00, 0x02, 0xe6, 0x38, 0x00, 0x02, 0xe6, 0x68, 0x00, 0x02, 0xe6, 0x9c, - 0x00, 0x02, 0xe7, 0x68, 0x00, 0x02, 0xe7, 0x94, 0x00, 0x02, 0xe7, 0xc0, - 0x00, 0x02, 0xe7, 0xf0, 0x00, 0x02, 0xe8, 0x24, 0x00, 0x02, 0xe8, 0x58, - 0x00, 0x02, 0xe8, 0x8c, 0x00, 0x02, 0xe8, 0xc4, 0x00, 0x02, 0xe8, 0xfc, - 0x00, 0x02, 0xe9, 0x30, 0x00, 0x02, 0xe9, 0x64, 0x00, 0x02, 0xe9, 0x98, - 0x00, 0x02, 0xe9, 0xd0, 0x00, 0x02, 0xea, 0x08, 0x00, 0x02, 0xea, 0x40, - 0x00, 0x02, 0xea, 0x74, 0x00, 0x02, 0xea, 0xac, 0x00, 0x02, 0xea, 0xe0, - 0x00, 0x02, 0xeb, 0x18, 0x00, 0x02, 0xeb, 0x4c, 0x00, 0x02, 0xeb, 0x84, - 0x00, 0x02, 0xeb, 0xb8, 0x00, 0x02, 0xeb, 0xf0, 0x00, 0x02, 0xec, 0x38, - 0x00, 0x02, 0xec, 0x80, 0x00, 0x02, 0xec, 0xac, 0x00, 0x02, 0xec, 0xd4, - 0x00, 0x02, 0xed, 0x08, 0x00, 0x02, 0xed, 0x38, 0x00, 0x02, 0xed, 0x68, - 0x00, 0x02, 0xed, 0x98, 0x00, 0x02, 0xed, 0xcc, 0x00, 0x02, 0xee, 0x00, - 0x00, 0x02, 0xee, 0x38, 0x00, 0x02, 0xee, 0x70, 0x00, 0x02, 0xee, 0xa4, - 0x00, 0x02, 0xee, 0xd8, 0x00, 0x02, 0xef, 0x10, 0x00, 0x02, 0xef, 0x44, - 0x00, 0x02, 0xef, 0x8c, 0x00, 0x02, 0xef, 0xb8, 0x00, 0x02, 0xf0, 0x30, - 0x00, 0x02, 0xf0, 0x90, 0x00, 0x02, 0xf0, 0xbc, 0x00, 0x02, 0xf0, 0xe4, - 0x00, 0x02, 0xf1, 0x10, 0x00, 0x02, 0xf1, 0x3c, 0x00, 0x02, 0xf1, 0x6c, - 0x00, 0x02, 0xf1, 0xa0, 0x00, 0x02, 0xf1, 0xd4, 0x00, 0x02, 0xf2, 0x08, - 0x00, 0x02, 0xf2, 0x40, 0x00, 0x02, 0xf2, 0x78, 0x00, 0x02, 0xf2, 0xac, - 0x00, 0x02, 0xf2, 0xe0, 0x00, 0x02, 0xf3, 0x14, 0x00, 0x02, 0xf3, 0x4c, - 0x00, 0x02, 0xf3, 0x94, 0x00, 0x02, 0xf3, 0xdc, 0x00, 0x02, 0xf4, 0x10, - 0x00, 0x02, 0xf4, 0x44, 0x00, 0x02, 0xf4, 0x78, 0x00, 0x02, 0xf4, 0xac, - 0x00, 0x02, 0xf4, 0xe0, 0x00, 0x02, 0xf5, 0x14, 0x00, 0x02, 0xf5, 0x44, - 0x00, 0x02, 0xf5, 0x74, 0x00, 0x02, 0xf5, 0xa0, 0x00, 0x02, 0xf5, 0xcc, - 0x00, 0x02, 0xf5, 0xf8, 0x00, 0x02, 0xf6, 0x24, 0x00, 0x02, 0xf6, 0x58, - 0x00, 0x02, 0xf6, 0x8c, 0x00, 0x02, 0xf6, 0xc0, 0x00, 0x02, 0xf6, 0xf4, - 0x00, 0x02, 0xf7, 0x28, 0x00, 0x02, 0xf7, 0x5c, 0x00, 0x02, 0xf7, 0x90, - 0x00, 0x02, 0xf7, 0xc4, 0x00, 0x02, 0xf7, 0xf4, 0x00, 0x02, 0xf8, 0x24, - 0x00, 0x02, 0xf8, 0x50, 0x00, 0x02, 0xf8, 0x7c, 0x00, 0x02, 0xf8, 0xb0, - 0x00, 0x02, 0xf8, 0xe0, 0x00, 0x02, 0xf9, 0x08, 0x00, 0x02, 0xf9, 0x20, - 0x00, 0x02, 0xf9, 0x50, 0x00, 0x02, 0xf9, 0x80, 0x00, 0x02, 0xf9, 0xb0, - 0x00, 0x02, 0xf9, 0xe0, 0x00, 0x02, 0xfa, 0x10, 0x00, 0x02, 0xfa, 0x44, - 0x00, 0x02, 0xfa, 0x78, 0x00, 0x02, 0xfa, 0xb0, 0x00, 0x02, 0xfa, 0xe4, - 0x00, 0x02, 0xfb, 0x18, 0x00, 0x02, 0xfb, 0x50, 0x00, 0x02, 0xfb, 0x88, - 0x00, 0x02, 0xfb, 0xa8, 0x00, 0x02, 0xfb, 0xc8, 0x00, 0x02, 0xfb, 0xec, - 0x00, 0x02, 0xfc, 0x10, 0x00, 0x02, 0xfc, 0x34, 0x00, 0x02, 0xfc, 0x58, - 0x00, 0x02, 0xfc, 0x7c, 0x00, 0x02, 0xfc, 0xa0, 0x00, 0x02, 0xfc, 0xd0, - 0x00, 0x02, 0xfd, 0x00, 0x00, 0x02, 0xfd, 0x34, 0x00, 0x02, 0xfd, 0x6c, - 0x00, 0x02, 0xfd, 0xa0, 0x00, 0x02, 0xfd, 0xd4, 0x00, 0x02, 0xfd, 0xf8, - 0x00, 0x02, 0xfe, 0x1c, 0x00, 0x02, 0xfe, 0x40, 0x00, 0x02, 0xfe, 0x64, - 0x00, 0x02, 0xfe, 0x88, 0x00, 0x02, 0xfe, 0xac, 0x00, 0x02, 0xfe, 0xdc, - 0x00, 0x02, 0xff, 0x0c, 0x00, 0x02, 0xff, 0x40, 0x00, 0x02, 0xff, 0x78, - 0x00, 0x02, 0xff, 0xac, 0x00, 0x02, 0xff, 0xe0, 0x00, 0x03, 0x00, 0x14, - 0x00, 0x03, 0x00, 0x48, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x03, 0x00, 0x90, - 0x00, 0x03, 0x00, 0xb4, 0x00, 0x03, 0x00, 0xd8, 0x00, 0x03, 0x00, 0xfc, - 0x00, 0x03, 0x01, 0x20, 0x00, 0x03, 0x01, 0x44, 0x00, 0x03, 0x01, 0x68, - 0x00, 0x03, 0x01, 0x98, 0x00, 0x03, 0x01, 0xc8, 0x00, 0x03, 0x01, 0xfc, - 0x00, 0x03, 0x02, 0x34, 0x00, 0x03, 0x02, 0x64, 0x00, 0x03, 0x02, 0x98, - 0x00, 0x03, 0x02, 0xd0, 0x00, 0x03, 0x03, 0x08, 0x00, 0x03, 0x03, 0x2c, - 0x00, 0x03, 0x03, 0x50, 0x00, 0x03, 0x03, 0x74, 0x00, 0x03, 0x03, 0x98, - 0x00, 0x03, 0x03, 0xbc, 0x00, 0x03, 0x03, 0xe0, 0x00, 0x03, 0x04, 0x04, - 0x00, 0x03, 0x04, 0x28, 0x00, 0x03, 0x04, 0x58, 0x00, 0x03, 0x04, 0x8c, - 0x00, 0x03, 0x04, 0xc0, 0x00, 0x03, 0x04, 0xf8, 0x00, 0x03, 0x05, 0x2c, - 0x00, 0x03, 0x05, 0x60, 0x00, 0x03, 0x05, 0x84, 0x00, 0x03, 0x05, 0xa8, - 0x00, 0x03, 0x05, 0xcc, 0x00, 0x03, 0x05, 0xf0, 0x00, 0x03, 0x06, 0x14, - 0x00, 0x03, 0x06, 0x38, 0x00, 0x03, 0x06, 0x68, 0x00, 0x03, 0x06, 0x9c, - 0x00, 0x03, 0x06, 0xd0, 0x00, 0x03, 0x07, 0x08, 0x00, 0x03, 0x07, 0x3c, - 0x00, 0x03, 0x07, 0x70, 0x00, 0x03, 0x07, 0xa8, 0x00, 0x03, 0x07, 0xe0, - 0x00, 0x03, 0x08, 0x04, 0x00, 0x03, 0x08, 0x28, 0x00, 0x03, 0x08, 0x4c, - 0x00, 0x03, 0x08, 0x70, 0x00, 0x03, 0x08, 0xa0, 0x00, 0x03, 0x08, 0xd4, - 0x00, 0x03, 0x09, 0x08, 0x00, 0x03, 0x09, 0x40, 0x00, 0x03, 0x09, 0x74, - 0x00, 0x03, 0x09, 0xa8, 0x00, 0x03, 0x09, 0xe0, 0x00, 0x03, 0x0a, 0x18, - 0x00, 0x03, 0x0a, 0x3c, 0x00, 0x03, 0x0a, 0x60, 0x00, 0x03, 0x0a, 0x84, - 0x00, 0x03, 0x0a, 0xa8, 0x00, 0x03, 0x0a, 0xcc, 0x00, 0x03, 0x0a, 0xf0, - 0x00, 0x03, 0x0b, 0x14, 0x00, 0x03, 0x0b, 0x38, 0x00, 0x03, 0x0b, 0x6c, - 0x00, 0x03, 0x0b, 0xa0, 0x00, 0x03, 0x0b, 0xd0, 0x00, 0x03, 0x0c, 0x00, - 0x00, 0x03, 0x0c, 0x34, 0x00, 0x03, 0x0c, 0x64, 0x00, 0x03, 0x0c, 0x98, - 0x00, 0x03, 0x0c, 0xc8, 0x00, 0x03, 0x0c, 0xfc, 0x00, 0x03, 0x0d, 0x2c, - 0x00, 0x03, 0x0d, 0x5c, 0x00, 0x03, 0x0d, 0x8c, 0x00, 0x03, 0x0d, 0xc0, - 0x00, 0x03, 0x0d, 0xf0, 0x00, 0x03, 0x0e, 0x28, 0x00, 0x03, 0x0e, 0x64, - 0x00, 0x03, 0x0e, 0xa0, 0x00, 0x03, 0x0e, 0xe0, 0x00, 0x03, 0x0f, 0x1c, - 0x00, 0x03, 0x0f, 0x58, 0x00, 0x03, 0x0f, 0x98, 0x00, 0x03, 0x0f, 0xd8, - 0x00, 0x03, 0x10, 0x00, 0x00, 0x03, 0x10, 0x28, 0x00, 0x03, 0x10, 0x54, - 0x00, 0x03, 0x10, 0x80, 0x00, 0x03, 0x10, 0xac, 0x00, 0x03, 0x10, 0xd8, - 0x00, 0x03, 0x11, 0x04, 0x00, 0x03, 0x11, 0x30, 0x00, 0x03, 0x11, 0x68, - 0x00, 0x03, 0x11, 0xa0, 0x00, 0x03, 0x11, 0xdc, 0x00, 0x03, 0x12, 0x1c, - 0x00, 0x03, 0x12, 0x58, 0x00, 0x03, 0x12, 0x94, 0x00, 0x03, 0x12, 0xd0, - 0x00, 0x03, 0x13, 0x0c, 0x00, 0x03, 0x13, 0x38, 0x00, 0x03, 0x13, 0x64, - 0x00, 0x03, 0x13, 0x90, 0x00, 0x03, 0x13, 0xbc, 0x00, 0x03, 0x13, 0xe8, - 0x00, 0x03, 0x14, 0x14, 0x00, 0x03, 0x14, 0x40, 0x00, 0x03, 0x14, 0x6c, - 0x00, 0x03, 0x14, 0xa4, 0x00, 0x03, 0x14, 0xdc, 0x00, 0x03, 0x15, 0x18, - 0x00, 0x03, 0x15, 0x58, 0x00, 0x03, 0x15, 0x94, 0x00, 0x03, 0x15, 0xd0, - 0x00, 0x03, 0x16, 0x10, 0x00, 0x03, 0x16, 0x50, 0x00, 0x03, 0x16, 0x7c, - 0x00, 0x03, 0x16, 0xa8, 0x00, 0x03, 0x16, 0xd4, 0x00, 0x03, 0x17, 0x00, - 0x00, 0x03, 0x17, 0x2c, 0x00, 0x03, 0x17, 0x58, 0x00, 0x03, 0x17, 0x84, - 0x00, 0x03, 0x17, 0xb0, 0x00, 0x03, 0x17, 0xe4, 0x00, 0x03, 0x18, 0x18, - 0x00, 0x03, 0x18, 0x50, 0x00, 0x03, 0x18, 0x7c, 0x00, 0x03, 0x18, 0xb8, - 0x00, 0x03, 0x18, 0xe8, 0x00, 0x03, 0x19, 0x20, 0x00, 0x03, 0x19, 0x50, - 0x00, 0x03, 0x19, 0x80, 0x00, 0x03, 0x19, 0xa4, 0x00, 0x03, 0x19, 0xc4, - 0x00, 0x03, 0x19, 0xec, 0x00, 0x03, 0x1a, 0x38, 0x00, 0x03, 0x1a, 0x80, - 0x00, 0x03, 0x1a, 0xcc, 0x00, 0x03, 0x1b, 0x3c, 0x00, 0x03, 0x1b, 0xdc, - 0x00, 0x03, 0x1c, 0x18, 0x00, 0x03, 0x1c, 0x30, 0x00, 0x03, 0x1c, 0x6c, - 0x00, 0x03, 0x1c, 0x9c, 0x00, 0x03, 0x1c, 0xd4, 0x00, 0x03, 0x1d, 0x08, - 0x00, 0x03, 0x1d, 0x2c, 0x00, 0x03, 0x1d, 0x50, 0x00, 0x03, 0x1d, 0x74, - 0x00, 0x03, 0x1d, 0x9c, 0x00, 0x03, 0x1e, 0x0c, 0x00, 0x03, 0x1e, 0x7c, - 0x00, 0x03, 0x1f, 0x38, 0x00, 0x03, 0x1f, 0x68, 0x00, 0x03, 0x1f, 0x98, - 0x00, 0x03, 0x20, 0x00, 0x00, 0x03, 0x20, 0x68, 0x00, 0x03, 0x20, 0x98, - 0x00, 0x03, 0x20, 0xd4, 0x00, 0x03, 0x21, 0x08, 0x00, 0x03, 0x21, 0x38, - 0x00, 0x03, 0x21, 0x5c, 0x00, 0x03, 0x21, 0x80, 0x00, 0x03, 0x21, 0xec, - 0x00, 0x03, 0x22, 0x5c, 0x00, 0x03, 0x22, 0xf4, 0x00, 0x03, 0x23, 0x28, - 0x00, 0x03, 0x23, 0x5c, 0x00, 0x03, 0x23, 0xc4, 0x00, 0x03, 0x24, 0x2c, - 0x00, 0x03, 0x24, 0x5c, 0x00, 0x03, 0x24, 0x90, 0x00, 0x03, 0x24, 0xc0, - 0x00, 0x03, 0x24, 0xf8, 0x00, 0x03, 0x25, 0x2c, 0x00, 0x03, 0x25, 0x5c, - 0x00, 0x03, 0x25, 0x80, 0x00, 0x03, 0x25, 0xa4, 0x00, 0x03, 0x25, 0xc8, - 0x00, 0x03, 0x26, 0x28, 0x00, 0x03, 0x26, 0x88, 0x00, 0x03, 0x26, 0xbc, - 0x00, 0x03, 0x26, 0xdc, 0x00, 0x03, 0x27, 0x04, 0x00, 0x03, 0x27, 0x3c, - 0x00, 0x03, 0x27, 0x6c, 0x00, 0x03, 0x27, 0xa4, 0x00, 0x03, 0x27, 0xc8, - 0x00, 0x03, 0x27, 0xec, 0x00, 0x03, 0x28, 0x10, 0x00, 0x03, 0x28, 0x34, - 0x00, 0x03, 0x28, 0x5c, 0x00, 0x03, 0x28, 0x90, 0x00, 0x03, 0x28, 0xe0, - 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, - 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, - 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, - 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, 0x00, 0x03, 0x28, 0xe0, - 0x00, 0x03, 0x29, 0x04, 0x00, 0x03, 0x29, 0x64, 0x00, 0x03, 0x29, 0xac, - 0x00, 0x03, 0x29, 0xf8, 0x00, 0x03, 0x2a, 0x08, 0x00, 0x03, 0x2a, 0x54, - 0x00, 0x03, 0x2a, 0xa0, 0x00, 0x03, 0x2a, 0xec, 0x00, 0x03, 0x2a, 0xfc, - 0x00, 0x03, 0x2b, 0x48, 0x00, 0x03, 0x2b, 0x94, 0x00, 0x03, 0x2b, 0xe0, - 0x00, 0x03, 0x2c, 0x2c, 0x00, 0x03, 0x2c, 0x78, 0x00, 0x03, 0x2d, 0x04, - 0x00, 0x03, 0x2d, 0x94, 0x00, 0x03, 0x2e, 0x20, 0x00, 0x03, 0x2e, 0x38, - 0x00, 0x03, 0x2e, 0xa8, 0x00, 0x03, 0x2f, 0x64, 0x00, 0x03, 0x2f, 0xb4, - 0x00, 0x03, 0x30, 0x10, 0x00, 0x03, 0x30, 0x3c, 0x00, 0x03, 0x30, 0x68, - 0x00, 0x03, 0x30, 0xa0, 0x00, 0x03, 0x30, 0xe8, 0x00, 0x03, 0x31, 0x30, - 0x00, 0x03, 0x31, 0x40, 0x00, 0x03, 0x34, 0x00, 0x00, 0x03, 0x34, 0x38, - 0x00, 0x03, 0x34, 0x5c, 0x00, 0x03, 0x34, 0x7c, 0x00, 0x03, 0x34, 0xd0, - 0x00, 0x03, 0x35, 0x20, 0x00, 0x03, 0x35, 0x50, 0x00, 0x03, 0x35, 0x7c, - 0x00, 0x03, 0x35, 0xac, 0x00, 0x03, 0x36, 0x30, 0x00, 0x03, 0x36, 0x84, - 0x00, 0x03, 0x36, 0xd0, 0x00, 0x03, 0x37, 0x04, 0x00, 0x03, 0x37, 0x3c, - 0x00, 0x03, 0x37, 0x90, 0x00, 0x03, 0x37, 0xdc, 0x00, 0x03, 0x38, 0x6c, - 0x00, 0x03, 0x39, 0x40, 0x00, 0x03, 0x39, 0x9c, 0x00, 0x03, 0x3a, 0x88, - 0x00, 0x03, 0x3b, 0x34, 0x00, 0x03, 0x3b, 0x48, 0x00, 0x03, 0x3b, 0x5c, - 0x00, 0x03, 0x3b, 0x70, 0x00, 0x03, 0x3b, 0x84, 0x00, 0x03, 0x3b, 0x98, - 0x00, 0x03, 0x3c, 0x6c, 0x00, 0x03, 0x3d, 0x90, 0x00, 0x03, 0x3e, 0x98, - 0x00, 0x03, 0x3f, 0x48, 0x00, 0x03, 0x40, 0x64, 0x00, 0x03, 0x41, 0x54, - 0x00, 0x03, 0x42, 0x70, 0x00, 0x03, 0x44, 0xe0, 0x00, 0x03, 0x44, 0xf8, - 0x00, 0x03, 0x46, 0x34, 0x00, 0x03, 0x46, 0xf8, 0x00, 0x03, 0x47, 0xe8, - 0x00, 0x03, 0x49, 0x1c, 0x00, 0x03, 0x49, 0xbc, 0x00, 0x03, 0x4a, 0x60, - 0x00, 0x03, 0x4c, 0x20, 0x00, 0x03, 0x4d, 0x00, 0x00, 0x03, 0x4e, 0x38, - 0x00, 0x03, 0x4f, 0x28, 0x00, 0x03, 0x50, 0x10, 0x00, 0x03, 0x51, 0x30, - 0x00, 0x03, 0x52, 0x08, 0x00, 0x03, 0x52, 0x1c, 0x00, 0x03, 0x53, 0x38, - 0x00, 0x03, 0x53, 0xfc, 0x00, 0x03, 0x54, 0xd4, 0x00, 0x03, 0x55, 0xd4, - 0x00, 0x03, 0x56, 0x88, 0x00, 0x03, 0x57, 0x4c, 0x00, 0x03, 0x57, 0xf8, - 0x00, 0x03, 0x59, 0x28, 0x00, 0x03, 0x59, 0x8c, 0x00, 0x03, 0x59, 0xb8, - 0x00, 0x03, 0x59, 0xe4, 0x00, 0x03, 0x5a, 0x3c, 0x00, 0x03, 0x5a, 0x94, - 0x00, 0x03, 0x5a, 0xec, 0x00, 0x03, 0x5b, 0x3c, 0x00, 0x03, 0x5b, 0xf8, - 0x00, 0x03, 0x5c, 0x54, 0x00, 0x03, 0x5c, 0xb0, 0x00, 0x03, 0x5d, 0x0c, - 0x00, 0x03, 0x5d, 0x64, 0x00, 0x03, 0x5d, 0xf4, 0x00, 0x03, 0x5e, 0x7c, - 0x00, 0x03, 0x5f, 0x1c, 0x00, 0x03, 0x5f, 0xfc, 0x00, 0x03, 0x60, 0xf8, - 0x00, 0x03, 0x61, 0x44, 0x00, 0x03, 0x61, 0xc0, 0x00, 0x03, 0x61, 0xf0, - 0x00, 0x03, 0x62, 0x00, 0x00, 0x03, 0x62, 0x3c, 0x00, 0x03, 0x63, 0x0c, - 0x00, 0x03, 0x63, 0xec, 0x00, 0x03, 0x64, 0x24, 0x00, 0x03, 0x64, 0x88, - 0x00, 0x03, 0x66, 0x6c, 0x00, 0x03, 0x67, 0xbc, 0x00, 0x03, 0x68, 0x70, - 0x00, 0x03, 0x68, 0xfc, 0x00, 0x03, 0x69, 0x7c, 0x00, 0x03, 0x69, 0xfc, - 0x00, 0x03, 0x6a, 0x60, 0x00, 0x03, 0x6a, 0x9c, 0x00, 0x03, 0x6b, 0x00, - 0x00, 0x03, 0x6b, 0x60, 0x00, 0x03, 0x6b, 0x94, 0x00, 0x03, 0x6b, 0xc8, - 0x00, 0x03, 0x6c, 0x10, 0x00, 0x03, 0x6c, 0x58, 0x00, 0x03, 0x6c, 0x9c, - 0x00, 0x03, 0x6c, 0xe4, 0x00, 0x03, 0x6d, 0x38, 0x00, 0x03, 0x6d, 0x88, - 0x00, 0x03, 0x6d, 0xdc, 0x00, 0x03, 0x6e, 0x30, 0x00, 0x03, 0x6e, 0x9c, - 0x00, 0x03, 0x6e, 0xf4, 0x00, 0x03, 0x6f, 0x44, 0x00, 0x03, 0x6f, 0xac, - 0x00, 0x03, 0x70, 0x10, 0x00, 0x03, 0x70, 0x88, 0x00, 0x03, 0x70, 0xec, - 0x00, 0x03, 0x71, 0x50, 0x00, 0x03, 0x71, 0xc8, 0x00, 0x03, 0x72, 0x2c, - 0x00, 0x03, 0x72, 0x8c, 0x00, 0x03, 0x73, 0x04, 0x00, 0x03, 0x73, 0x68, - 0x00, 0x03, 0x73, 0xcc, 0x00, 0x03, 0x74, 0x44, 0x00, 0x03, 0x74, 0xb4, - 0x00, 0x03, 0x75, 0x28, 0x00, 0x03, 0x75, 0xb8, 0x00, 0x03, 0x76, 0x28, - 0x00, 0x03, 0x76, 0x98, 0x00, 0x03, 0x77, 0x28, 0x00, 0x03, 0x77, 0x9c, - 0x00, 0x03, 0x78, 0x0c, 0x00, 0x03, 0x78, 0xa0, 0x00, 0x03, 0x79, 0x14, - 0x00, 0x03, 0x79, 0x84, 0x00, 0x03, 0x7a, 0x18, 0x00, 0x03, 0x7a, 0xb8, - 0x00, 0x03, 0x7b, 0x54, 0x00, 0x03, 0x7c, 0x1c, 0x00, 0x03, 0x7c, 0x4c, - 0x00, 0x03, 0x7c, 0x7c, 0x00, 0x03, 0x7c, 0xac, 0x00, 0x03, 0x7c, 0xdc, - 0x00, 0x03, 0x7d, 0x0c, 0x00, 0x03, 0x7f, 0x08, 0x00, 0x03, 0x82, 0xc0, - 0x00, 0x03, 0x86, 0x40, 0x00, 0x03, 0x86, 0x6c, 0x00, 0x03, 0x86, 0xb4, - 0x00, 0x03, 0x86, 0xe8, 0x00, 0x03, 0x87, 0x40, 0x00, 0x03, 0x87, 0x6c, - 0x00, 0x03, 0x87, 0x9c, 0x00, 0x03, 0x87, 0xcc, 0x00, 0x03, 0x88, 0x00, - 0x00, 0x03, 0x88, 0x30, 0x00, 0x03, 0x88, 0x98, 0x00, 0x03, 0x89, 0x1c, - 0x00, 0x03, 0x8a, 0x6c, 0x00, 0x03, 0x8a, 0xbc, 0x00, 0x03, 0x8b, 0x20, - 0x00, 0x03, 0x8b, 0xbc, 0x00, 0x03, 0x8c, 0x38, 0x00, 0x03, 0x8d, 0x6c, - 0x00, 0x03, 0x8e, 0x68, 0x00, 0x03, 0x8f, 0x90, 0x00, 0x03, 0x90, 0x68, - 0x00, 0x03, 0x91, 0x48, 0x00, 0x03, 0x91, 0xe4, 0x00, 0x03, 0x92, 0xb4, - 0x00, 0x03, 0x93, 0x24, 0x00, 0x03, 0x93, 0x84, 0x00, 0x03, 0x94, 0x04, - 0x00, 0x03, 0x94, 0xd0, 0x00, 0x03, 0x95, 0xa8, 0x00, 0x03, 0x96, 0x64, - 0x00, 0x03, 0x97, 0x00, 0x00, 0x03, 0x97, 0x9c, 0x00, 0x03, 0x98, 0x40, - 0x00, 0x03, 0x98, 0xfc, 0x00, 0x03, 0x9a, 0x50, 0x00, 0x03, 0x9b, 0x10, - 0x00, 0x03, 0x9b, 0x90, 0x00, 0x03, 0x9c, 0x34, 0x00, 0x03, 0x9c, 0xc8, - 0x00, 0x03, 0x9d, 0x5c, 0x00, 0x03, 0x9d, 0xcc, 0x00, 0x03, 0x9e, 0x38, - 0x00, 0x03, 0x9e, 0xd4, 0x00, 0x03, 0x9f, 0x54, 0x00, 0x03, 0xa0, 0x10, - 0x00, 0x03, 0xa0, 0xc0, 0x00, 0x03, 0xa1, 0x8c, 0x00, 0x03, 0xa1, 0xdc, - 0x00, 0x03, 0xa2, 0x2c, 0x00, 0x03, 0xa2, 0xd0, 0x00, 0x03, 0xa3, 0x20, - 0x00, 0x03, 0xa3, 0x58, 0x00, 0x03, 0xa3, 0x98, 0x00, 0x03, 0xa3, 0xd0, - 0x00, 0x03, 0xa3, 0xfc, 0x00, 0x03, 0xa4, 0x4c, 0x00, 0x03, 0xa4, 0x9c, - 0x00, 0x03, 0xa4, 0xe8, 0x00, 0x03, 0xa5, 0x34, 0x00, 0x03, 0xa5, 0x7c, - 0x00, 0x03, 0xa5, 0xb4, 0x00, 0x03, 0xa5, 0xec, 0x00, 0x03, 0xa6, 0x2c, - 0x00, 0x03, 0xa6, 0x70, 0x00, 0x03, 0xa6, 0xb8, 0x00, 0x03, 0xa6, 0xf0, - 0x00, 0x03, 0xa7, 0x28, 0x00, 0x03, 0xa7, 0xdc, 0x00, 0x03, 0xa8, 0x78, - 0x00, 0x03, 0xa8, 0x90, 0x00, 0x03, 0xa8, 0xd4, 0x00, 0x03, 0xa8, 0xf4, - 0x00, 0x03, 0xa9, 0x04, 0x00, 0x03, 0xa9, 0x14, 0x00, 0x03, 0xa9, 0x24, - 0x00, 0x03, 0xa9, 0x34, 0x00, 0x03, 0xa9, 0x44, 0x00, 0x03, 0xa9, 0x54, - 0x00, 0x03, 0xa9, 0x64, 0x00, 0x03, 0xa9, 0x74, 0x00, 0x03, 0xa9, 0x84, - 0x00, 0x03, 0xa9, 0xd8, 0x00, 0x03, 0xaa, 0x00, 0x00, 0x03, 0xaa, 0x18, - 0x00, 0x03, 0xaa, 0x64, 0x00, 0x03, 0xaa, 0xa8, 0x00, 0x03, 0xaa, 0xc0, - 0x00, 0x03, 0xaa, 0xd8, 0x00, 0x03, 0xab, 0x00, 0x00, 0x03, 0xab, 0x24, - 0x00, 0x03, 0xab, 0x4c, 0x00, 0x03, 0xab, 0x70, 0x00, 0x03, 0xab, 0x94, - 0x00, 0x03, 0xab, 0xb8, 0x00, 0x03, 0xab, 0xdc, 0x00, 0x03, 0xac, 0x00, - 0x00, 0x03, 0xac, 0x38, 0x00, 0x03, 0xac, 0x5c, 0x00, 0x03, 0xac, 0x80, - 0x00, 0x03, 0xac, 0xb0, 0x00, 0x03, 0xac, 0xe4, 0x00, 0x03, 0xad, 0x08, - 0x00, 0x03, 0xad, 0x2c, 0x00, 0x03, 0xad, 0x44, 0x00, 0x03, 0xad, 0x5c, - 0x00, 0x03, 0xad, 0x90, 0x00, 0x03, 0xad, 0xb8, 0x00, 0x03, 0xad, 0xdc, - 0x00, 0x03, 0xae, 0x18, 0x00, 0x03, 0xae, 0x3c, 0x00, 0x03, 0xae, 0x54, - 0x00, 0x03, 0xae, 0x6c, 0x00, 0x03, 0xae, 0x84, 0x00, 0x03, 0xae, 0x9c, - 0x00, 0x03, 0xaf, 0x2c, 0x00, 0x03, 0xaf, 0x64, 0x00, 0x03, 0xaf, 0x9c, - 0x00, 0x03, 0xaf, 0xe0, 0x00, 0x03, 0xb0, 0x24, 0x00, 0x03, 0xb2, 0x8c, - 0x00, 0x03, 0xb2, 0xe4, 0x00, 0x03, 0xb3, 0x38, 0x00, 0x03, 0xb3, 0x8c, - 0x00, 0x03, 0xb3, 0xec, 0x00, 0x03, 0xb4, 0x34, 0x00, 0x03, 0xb4, 0x7c, - 0x00, 0x03, 0xb4, 0xd8, 0x00, 0x03, 0xb5, 0x30, 0x00, 0x03, 0xb5, 0x78, - 0x00, 0x03, 0xb6, 0x10, 0x00, 0x03, 0xb6, 0x70, 0x00, 0x03, 0xb6, 0xcc, - 0x00, 0x03, 0xb6, 0xdc, 0x00, 0x03, 0xb6, 0xec, 0x00, 0x03, 0xb6, 0xfc, - 0x00, 0x03, 0xb7, 0x0c, 0x00, 0x03, 0xb7, 0x1c, 0x00, 0x03, 0xb7, 0x2c, - 0x00, 0x03, 0xb7, 0x78, 0x00, 0x03, 0xb7, 0xc4, 0x00, 0x03, 0xb8, 0x10, - 0x00, 0x03, 0xb8, 0x20, 0x00, 0x03, 0xb8, 0x30, 0x00, 0x03, 0xb8, 0x40, - 0x00, 0x03, 0xb8, 0x50, 0x00, 0x03, 0xb8, 0x70, 0x00, 0x03, 0xb8, 0x80, - 0x00, 0x03, 0xb8, 0x90, 0x00, 0x03, 0xb8, 0xa0, 0x00, 0x03, 0xb8, 0xb0, - 0x00, 0x03, 0xb8, 0xc0, 0x00, 0x03, 0xb8, 0xd0, 0x00, 0x03, 0xb8, 0xe0, - 0x00, 0x03, 0xb8, 0xf0, 0x00, 0x03, 0xb9, 0x00, 0x00, 0x03, 0xb9, 0x10, - 0x00, 0x03, 0xb9, 0x20, 0x00, 0x03, 0xb9, 0x30, 0x00, 0x03, 0xb9, 0x44, - 0x00, 0x03, 0xb9, 0x58, 0x00, 0x03, 0xb9, 0x6c, 0x00, 0x03, 0xb9, 0x80, - 0x00, 0x03, 0xb9, 0x94, 0x00, 0x03, 0xb9, 0xa4, 0x00, 0x03, 0xb9, 0xb8, - 0x00, 0x03, 0xb9, 0xcc, 0x00, 0x03, 0xb9, 0xdc, 0x00, 0x03, 0xb9, 0xf0, - 0x00, 0x03, 0xba, 0x04, 0x00, 0x03, 0xba, 0x18, 0x00, 0x03, 0xba, 0x2c, - 0x00, 0x03, 0xba, 0x40, 0x00, 0x03, 0xba, 0x54, 0x00, 0x03, 0xba, 0x64, - 0x00, 0x03, 0xba, 0x74, 0x00, 0x03, 0xba, 0x84, 0x00, 0x03, 0xba, 0x94, - 0x00, 0x03, 0xba, 0xc4, 0x00, 0x03, 0xbb, 0x1c, 0x00, 0x03, 0xbb, 0xa8, - 0x00, 0x03, 0xbc, 0x40, 0x00, 0x03, 0xbc, 0xc8, 0x00, 0x03, 0xbd, 0x14, - 0x00, 0x03, 0xbd, 0xa8, 0x00, 0x03, 0xbd, 0xfc, 0x00, 0x03, 0xbe, 0x50, - 0x00, 0x03, 0xbe, 0xa4, 0x00, 0x03, 0xbe, 0xf4, 0x00, 0x03, 0xbf, 0x48, - 0x00, 0x03, 0xbf, 0xa0, 0x00, 0x03, 0xbf, 0xf0, 0x00, 0x03, 0xc0, 0x48, - 0x00, 0x03, 0xc0, 0x9c, 0x00, 0x03, 0xc0, 0xec, 0x00, 0x03, 0xc1, 0x40, - 0x00, 0x03, 0xc1, 0xa4, 0x00, 0x03, 0xc1, 0xf8, 0x00, 0x03, 0xc2, 0x50, - 0x00, 0x03, 0xc2, 0x98, 0x00, 0x03, 0xc2, 0xe8, 0x00, 0x03, 0xc3, 0x3c, - 0x00, 0x03, 0xc3, 0xa0, 0x00, 0x03, 0xc4, 0x04, 0x00, 0x03, 0xc4, 0x58, - 0x00, 0x03, 0xc4, 0xa4, 0x00, 0x03, 0xc4, 0xf4, 0x00, 0x03, 0xc5, 0x48, - 0x00, 0x03, 0xc5, 0xa4, 0x00, 0x03, 0xc6, 0x00, 0x00, 0x03, 0xc6, 0x5c, - 0x00, 0x03, 0xc6, 0xa4, 0x00, 0x03, 0xc6, 0xec, 0x00, 0x03, 0xc7, 0x38, - 0x00, 0x03, 0xc7, 0x9c, 0x00, 0x03, 0xc7, 0xfc, 0x00, 0x03, 0xc8, 0x58, - 0x00, 0x03, 0xc8, 0xb0, 0x00, 0x03, 0xc8, 0xf8, 0x00, 0x03, 0xc9, 0x44, - 0x00, 0x03, 0xc9, 0xa0, 0x00, 0x03, 0xc9, 0xf8, 0x00, 0x03, 0xca, 0x48, - 0x00, 0x03, 0xca, 0xa0, 0x00, 0x03, 0xcb, 0x08, 0x00, 0x03, 0xcb, 0x60, - 0x00, 0x03, 0xcb, 0xb0, 0x00, 0x03, 0xcc, 0x00, 0x00, 0x03, 0xcc, 0x50, - 0x00, 0x03, 0xcc, 0xa8, 0x00, 0x03, 0xcd, 0x10, 0x00, 0x03, 0xcd, 0x78, - 0x00, 0x03, 0xcd, 0xd0, 0x00, 0x03, 0xce, 0x20, 0x00, 0x03, 0xce, 0x70, - 0x00, 0x03, 0xce, 0xc8, 0x00, 0x03, 0xcf, 0x28, 0x00, 0x03, 0xcf, 0x88, - 0x00, 0x03, 0xcf, 0xe8, 0x00, 0x03, 0xd0, 0x34, 0x00, 0x03, 0xd0, 0x7c, - 0x00, 0x03, 0xd0, 0xc8, 0x00, 0x03, 0xd1, 0x2c, 0x00, 0x03, 0xd1, 0x90, - 0x00, 0x03, 0xd1, 0xf0, 0x00, 0x03, 0xd2, 0x48, 0x00, 0x03, 0xd2, 0x90, - 0x00, 0x03, 0xd2, 0xd8, 0x00, 0x03, 0xd3, 0x34, 0x00, 0x03, 0xd3, 0x9c, - 0x00, 0x03, 0xd4, 0x04, 0x00, 0x03, 0xd4, 0x5c, 0x00, 0x03, 0xd4, 0xb0, - 0x00, 0x03, 0xd4, 0xfc, 0x00, 0x03, 0xd5, 0x58, 0x00, 0x03, 0xd5, 0xb4, - 0x00, 0x03, 0xd6, 0x04, 0x00, 0x03, 0xd6, 0x5c, 0x00, 0x03, 0xd6, 0xc4, - 0x00, 0x03, 0xd7, 0x2c, 0x00, 0x03, 0xd7, 0x84, 0x00, 0x03, 0xd7, 0xcc, - 0x00, 0x03, 0xd8, 0x1c, 0x00, 0x03, 0xd8, 0x74, 0x00, 0x03, 0xd8, 0xd8, - 0x00, 0x03, 0xd9, 0x3c, 0x00, 0x03, 0xd9, 0x9c, 0x00, 0x03, 0xd9, 0xe8, - 0x00, 0x03, 0xda, 0x30, 0x00, 0x03, 0xda, 0x7c, 0x00, 0x03, 0xda, 0xe0, - 0x00, 0x03, 0xdb, 0x44, 0x00, 0x03, 0xdb, 0xa8, 0x00, 0x03, 0xdc, 0x00, - 0x00, 0x03, 0xdc, 0x48, 0x00, 0x03, 0xdc, 0x98, 0x00, 0x03, 0xdc, 0xf0, - 0x00, 0x03, 0xdd, 0x58, 0x00, 0x03, 0xdd, 0xbc, 0x00, 0x03, 0xde, 0x14, - 0x00, 0x03, 0xde, 0x68, 0x00, 0x03, 0xde, 0xb8, 0x00, 0x03, 0xdf, 0x0c, - 0x00, 0x03, 0xdf, 0x68, 0x00, 0x03, 0xdf, 0xd0, 0x00, 0x03, 0xe0, 0x2c, - 0x00, 0x03, 0xe0, 0x80, 0x00, 0x03, 0xe0, 0xd0, 0x00, 0x03, 0xe1, 0x2c, - 0x00, 0x03, 0xe1, 0x88, 0x00, 0x03, 0xe1, 0xd4, 0x00, 0x03, 0xe2, 0x2c, - 0x00, 0x03, 0xe2, 0x8c, 0x00, 0x03, 0xe2, 0xf0, 0x00, 0x03, 0xe3, 0x54, - 0x00, 0x03, 0xe3, 0xa0, 0x00, 0x03, 0xe3, 0xe8, 0x00, 0x03, 0xe4, 0x2c, - 0x00, 0x03, 0xe4, 0x8c, 0x00, 0x03, 0xe4, 0xe8, 0x00, 0x03, 0xe5, 0x44, - 0x00, 0x03, 0xe5, 0x9c, 0x00, 0x03, 0xe5, 0xe4, 0x00, 0x03, 0xe6, 0x30, - 0x00, 0x03, 0xe6, 0x84, 0x00, 0x03, 0xe6, 0xe8, 0x00, 0x03, 0xe7, 0x4c, - 0x00, 0x03, 0xe7, 0xa8, 0x00, 0x03, 0xe7, 0xf8, 0x00, 0x03, 0xe8, 0x3c, - 0x00, 0x03, 0xe8, 0x94, 0x00, 0x03, 0xe8, 0xe8, 0x00, 0x03, 0xe9, 0x4c, - 0x00, 0x03, 0xe9, 0xa4, 0x00, 0x03, 0xe9, 0xf4, 0x00, 0x03, 0xea, 0x40, - 0x00, 0x03, 0xea, 0x98, 0x00, 0x03, 0xea, 0xe8, 0x00, 0x03, 0xeb, 0x40, - 0x00, 0x03, 0xeb, 0x98, 0x00, 0x03, 0xeb, 0xe8, 0x00, 0x03, 0xec, 0x38, - 0x00, 0x03, 0xec, 0x90, 0x00, 0x03, 0xec, 0xe8, 0x00, 0x03, 0xed, 0x40, - 0x00, 0x03, 0xed, 0x88, 0x00, 0x03, 0xed, 0xdc, 0x00, 0x03, 0xee, 0x2c, - 0x00, 0x03, 0xee, 0xcc, 0x00, 0x03, 0xef, 0xa8, 0x00, 0x03, 0xef, 0xec, - 0x00, 0x03, 0xf0, 0x40, 0x00, 0x03, 0xf0, 0xa8, 0x00, 0x03, 0xf1, 0x08, - 0x00, 0x03, 0xf1, 0x60, 0x00, 0x03, 0xf1, 0xb8, 0x00, 0x03, 0xf2, 0x10, - 0x00, 0x03, 0xf2, 0x68, 0x00, 0x03, 0xf2, 0xbc, 0x00, 0x03, 0xf3, 0x10, - 0x00, 0x03, 0xf3, 0x64, 0x00, 0x03, 0xf3, 0xb8, 0x00, 0x03, 0xf4, 0x10, - 0x00, 0x03, 0xf4, 0x68, 0x00, 0x03, 0xf4, 0xc0, 0x00, 0x03, 0xf5, 0x18, - 0x00, 0x03, 0xf5, 0x6c, 0x00, 0x03, 0xf5, 0xc0, 0x00, 0x03, 0xf6, 0x14, - 0x00, 0x03, 0xf6, 0x68, 0x00, 0x03, 0xf6, 0xc4, 0x00, 0x03, 0xf7, 0x20, - 0x00, 0x03, 0xf7, 0x7c, 0x00, 0x03, 0xf7, 0xd8, 0x00, 0x03, 0xf8, 0x2c, - 0x00, 0x03, 0xf8, 0x80, 0x00, 0x03, 0xf8, 0xd4, 0x00, 0x03, 0xf9, 0x28, - 0x00, 0x03, 0xfa, 0x04, 0x00, 0x03, 0xfa, 0xdc, 0x00, 0x03, 0xfb, 0xa8, - 0x00, 0x03, 0xfc, 0x70, 0x00, 0x03, 0xfd, 0x48, 0x00, 0x03, 0xfe, 0x24, - 0x00, 0x03, 0xfe, 0xe4, 0x00, 0x03, 0xff, 0xa4, 0x00, 0x03, 0xff, 0xe0, - 0x00, 0x04, 0x00, 0x8c, 0x00, 0x04, 0x01, 0x1c, 0x00, 0x04, 0x01, 0xdc, - 0x00, 0x04, 0x02, 0x4c, 0x00, 0x04, 0x02, 0x98, 0x00, 0x04, 0x03, 0x38, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04, 0x80, 0x00, 0x04, 0x05, 0x44, - 0x00, 0x04, 0x05, 0xf4, 0x00, 0x04, 0x06, 0x54, 0x00, 0x04, 0x07, 0x20, - 0x00, 0x04, 0x07, 0xd4, 0x00, 0x04, 0x08, 0x28, 0x00, 0x04, 0x08, 0x80, - 0x00, 0x04, 0x08, 0xf8, 0x00, 0x04, 0x09, 0x8c, 0x00, 0x04, 0x0a, 0x14, - 0x00, 0x04, 0x0a, 0xa0, 0x00, 0x04, 0x0b, 0x54, 0x00, 0x04, 0x0c, 0x10, - 0x00, 0x04, 0x0c, 0x60, 0x00, 0x04, 0x0c, 0xac, 0x00, 0x04, 0x0d, 0x20, - 0x00, 0x04, 0x0d, 0xc0, 0x00, 0x04, 0x0e, 0x18, 0x00, 0x04, 0x0e, 0x70, - 0x00, 0x04, 0x0e, 0xe8, 0x00, 0x04, 0x0f, 0x80, 0x00, 0x04, 0x0f, 0xb4, - 0x00, 0x04, 0x0f, 0xe8, 0x00, 0x04, 0x10, 0x08, 0x00, 0x04, 0x10, 0x20, - 0x00, 0x04, 0x10, 0x38, 0x00, 0x04, 0x10, 0x50, 0x00, 0x04, 0x10, 0x68, - 0x00, 0x04, 0x10, 0x80, 0x00, 0x04, 0x10, 0x98, 0x00, 0x04, 0x10, 0xa8, - 0x00, 0x04, 0x10, 0xd0, 0x00, 0x04, 0x11, 0xb8, 0x00, 0x04, 0x12, 0x40, - 0x00, 0x04, 0x12, 0xe4, 0x00, 0x04, 0x13, 0x7c, 0x00, 0x02, 0x00, 0xcd, - 0x00, 0x00, 0x05, 0x32, 0x05, 0x81, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1f, - 0x40, 0x0d, 0x02, 0x06, 0x05, 0x03, 0x06, 0x03, 0x09, 0x08, 0x05, 0x03, - 0x04, 0x00, 0x03, 0x00, 0x3f, 0xcd, 0x2f, 0xcd, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x11, 0x21, 0x13, - 0x11, 0x21, 0x11, 0xcd, 0x04, 0x65, 0xfb, 0x9b, 0x4c, 0x03, 0xcd, 0x05, - 0x81, 0xfa, 0x7f, 0x05, 0x35, 0xfb, 0x17, 0x04, 0xe9, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0xb9, 0x00, 0x00, 0x01, 0x7f, 0x05, 0x81, 0x00, 0x03, - 0x00, 0x07, 0x01, 0xe4, 0x40, 0xff, 0x03, 0x07, 0x07, 0x02, 0x04, 0x04, - 0x09, 0x08, 0x20, 0x01, 0x01, 0x0f, 0x01, 0x01, 0x0e, 0x03, 0x01, 0x05, - 0x40, 0x04, 0x05, 0x9c, 0x5b, 0x04, 0x02, 0x03, 0x92, 0x09, 0x01, 0x84, - 0x09, 0x01, 0x72, 0x09, 0x01, 0x62, 0x09, 0x01, 0x54, 0x09, 0x01, 0x44, - 0x09, 0x01, 0x32, 0x09, 0x01, 0x22, 0x09, 0x01, 0x14, 0x09, 0x01, 0x04, - 0x09, 0x01, 0xf2, 0x09, 0x01, 0xe2, 0x09, 0x01, 0xd4, 0x09, 0x01, 0xc4, - 0x09, 0x01, 0xb2, 0x09, 0x01, 0xa4, 0x09, 0x01, 0x94, 0x09, 0x01, 0x84, - 0x09, 0x01, 0x72, 0x09, 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, 0x44, - 0x09, 0x01, 0x34, 0x09, 0x01, 0x24, 0x09, 0x01, 0x14, 0x09, 0x01, 0x04, - 0x09, 0x01, 0x67, 0xf4, 0x09, 0x01, 0xb9, 0x09, 0x01, 0xa9, 0x09, 0x01, - 0x99, 0x09, 0x01, 0x89, 0x09, 0x01, 0x79, 0x09, 0x01, 0x49, 0x09, 0x01, - 0x3d, 0x09, 0x01, 0x2d, 0x09, 0x01, 0x1f, 0x09, 0x01, 0x0f, 0x09, 0x01, - 0xff, 0x09, 0x01, 0xef, 0x09, 0x01, 0xdb, 0x09, 0x01, 0xcb, 0x09, 0x01, - 0xbb, 0x09, 0x01, 0xab, 0x09, 0x01, 0x9d, 0x09, 0x01, 0x8d, 0x09, 0x01, - 0x7d, 0x09, 0x01, 0x6f, 0x09, 0x01, 0x5f, 0x09, 0x01, 0x4b, 0x09, 0x01, - 0x3b, 0x09, 0x01, 0x2b, 0x09, 0x01, 0x1b, 0x09, 0x01, 0x0b, 0x09, 0x01, - 0xfd, 0x09, 0x01, 0xed, 0x09, 0x01, 0xdd, 0x09, 0x01, 0xcd, 0x09, 0x01, - 0xbb, 0x09, 0x01, 0xab, 0x09, 0x01, 0x9b, 0x09, 0x01, 0x8b, 0x09, 0x01, - 0x7d, 0x09, 0x01, 0x6b, 0x09, 0x01, 0x5b, 0x09, 0x01, 0x4d, 0x09, 0x01, - 0x3d, 0x09, 0x01, 0x29, 0x09, 0x01, 0x19, 0x09, 0x01, 0x0b, 0x09, 0x01, - 0x37, 0xfb, 0x09, 0x01, 0xeb, 0x09, 0x01, 0xdd, 0x09, 0x01, 0xcd, 0x09, - 0x01, 0xbb, 0x09, 0x01, 0xab, 0x09, 0x01, 0x99, 0x09, 0x40, 0x5b, 0x01, - 0x89, 0x09, 0x01, 0x79, 0x09, 0x01, 0x69, 0x09, 0x01, 0x5b, 0x09, 0x01, - 0x4b, 0x09, 0x01, 0x3b, 0x09, 0x01, 0x2d, 0x09, 0x01, 0x1d, 0x09, 0x01, - 0x01, 0xeb, 0x09, 0x01, 0xdb, 0x09, 0x01, 0xcb, 0x09, 0x01, 0xbf, 0x09, - 0x01, 0xaf, 0x09, 0x01, 0x9f, 0x09, 0x01, 0x7b, 0x09, 0x01, 0x6b, 0x09, - 0x01, 0x3b, 0x09, 0x01, 0x2b, 0x09, 0x01, 0x1b, 0x09, 0x01, 0x0f, 0x09, - 0x01, 0x02, 0xcf, 0x09, 0x01, 0xbf, 0x09, 0x01, 0x9f, 0x09, 0x01, 0x8f, - 0x09, 0x01, 0x7f, 0x09, 0x01, 0x60, 0x09, 0x01, 0x40, 0x09, 0x01, 0x1f, - 0x09, 0x01, 0x0f, 0x09, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x5f, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2f, 0x2b, - 0x00, 0x1a, 0x18, 0x10, 0xce, 0x5f, 0x5e, 0x5d, 0x5d, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x03, 0x33, - 0x03, 0x35, 0x33, 0x15, 0x01, 0x67, 0x94, 0x18, 0xc4, 0xc6, 0xc2, 0x01, - 0x8d, 0x03, 0xf4, 0xfa, 0x7f, 0xc9, 0xc9, 0x00, 0x00, 0x02, 0x00, 0x57, - 0x03, 0xc6, 0x02, 0x80, 0x05, 0x81, 0x00, 0x03, 0x00, 0x07, 0x00, 0x23, - 0x40, 0x10, 0x03, 0x02, 0x07, 0x06, 0x02, 0x06, 0x09, 0x08, 0x05, 0x20, - 0x00, 0x01, 0x00, 0x06, 0x02, 0x03, 0x00, 0x3f, 0x33, 0xcd, 0x5d, 0x32, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x23, 0x03, 0x33, 0x01, 0x23, 0x03, 0x33, 0x02, 0x6a, 0x8e, 0x14, 0xb8, - 0xfe, 0x79, 0x8d, 0x15, 0xb8, 0x03, 0xc6, 0x01, 0xbb, 0xfe, 0x45, 0x01, - 0xbb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x69, - 0x05, 0x79, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0xb5, 0x40, 0x68, 0x04, 0x01, - 0x00, 0x19, 0x04, 0x18, 0x05, 0x07, 0x1e, 0x1f, 0x16, 0x04, 0x17, 0x06, - 0x08, 0x1d, 0x1c, 0x15, 0x04, 0x14, 0x09, 0x0b, 0x0e, 0x0f, 0x12, 0x04, - 0x13, 0x0a, 0x17, 0x18, 0x06, 0x05, 0x14, 0x13, 0x09, 0x0a, 0x0a, 0x13, - 0x18, 0x05, 0x04, 0x1a, 0x0c, 0x0c, 0x1d, 0x1f, 0x1a, 0x04, 0x21, 0x20, - 0x0b, 0x08, 0x07, 0x04, 0x0c, 0x0d, 0x1e, 0x1d, 0x0e, 0x01, 0x0d, 0x1f, - 0x1c, 0x0f, 0x00, 0x10, 0x11, 0x19, 0x16, 0x15, 0x12, 0x11, 0x10, 0x0d, - 0x01, 0xd0, 0x0d, 0x01, 0x4f, 0x11, 0x8f, 0x11, 0x9f, 0x11, 0x03, 0x3f, - 0x11, 0x4f, 0x11, 0x02, 0x0d, 0x11, 0x0d, 0x11, 0x05, 0x18, 0x17, 0x14, - 0x13, 0x03, 0x0a, 0x09, 0x06, 0x05, 0x00, 0x2f, 0x33, 0x33, 0x33, 0x3f, - 0x33, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x71, 0x5d, 0x71, - 0x11, 0x33, 0x33, 0x33, 0x33, 0x10, 0xcd, 0x32, 0x32, 0x32, 0x32, 0x11, - 0x33, 0x33, 0x33, 0x33, 0x10, 0xcd, 0x32, 0x32, 0x32, 0x32, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x03, 0x21, - 0x15, 0x21, 0x03, 0x23, 0x13, 0x21, 0x03, 0x23, 0x13, 0x23, 0x35, 0x33, - 0x13, 0x23, 0x35, 0x21, 0x13, 0x33, 0x03, 0x21, 0x13, 0x33, 0x03, 0x33, - 0x15, 0x21, 0x03, 0x21, 0x13, 0x03, 0x80, 0x4e, 0x01, 0x04, 0xfe, 0xe5, - 0x58, 0x6e, 0x56, 0xfe, 0x95, 0x54, 0x6e, 0x54, 0xc9, 0xe1, 0x4e, 0xfc, - 0x01, 0x12, 0x59, 0x6e, 0x58, 0x01, 0x6b, 0x58, 0x6e, 0x58, 0xd3, 0xfd, - 0x40, 0x50, 0x01, 0x6a, 0x4e, 0x03, 0x75, 0xfe, 0x8f, 0x6c, 0xfe, 0x68, - 0x01, 0x98, 0xfe, 0x68, 0x01, 0x98, 0x6c, 0x01, 0x71, 0x6c, 0x01, 0x98, - 0xfe, 0x68, 0x01, 0x98, 0xfe, 0x68, 0x6c, 0xfe, 0x8f, 0x01, 0x71, 0x00, - 0x00, 0x03, 0x00, 0x16, 0xff, 0x72, 0x04, 0x52, 0x05, 0xec, 0x00, 0x24, - 0x00, 0x2c, 0x00, 0x33, 0x00, 0xd6, 0x40, 0x8c, 0x03, 0x02, 0x2d, 0x0c, - 0x12, 0x1a, 0x1a, 0x29, 0x29, 0x23, 0x23, 0x24, 0x0f, 0x31, 0x31, 0x07, - 0x07, 0x24, 0x16, 0x15, 0x25, 0x1f, 0x1f, 0x15, 0x24, 0x0c, 0x02, 0x05, - 0x34, 0x35, 0x19, 0x32, 0x0f, 0x32, 0x73, 0x59, 0xcf, 0x29, 0x01, 0x9d, - 0x29, 0x01, 0x05, 0x88, 0x29, 0x01, 0x78, 0x07, 0xd8, 0x07, 0x02, 0xc7, - 0x1a, 0xd7, 0x1a, 0x02, 0xb6, 0x1a, 0x01, 0x87, 0x1a, 0xa7, 0x1a, 0x02, - 0xd7, 0x31, 0x01, 0xa6, 0x31, 0x01, 0x77, 0x31, 0x01, 0x2d, 0x0c, 0x31, - 0x1a, 0x07, 0x29, 0x1f, 0x25, 0x08, 0x00, 0x7d, 0x16, 0x8d, 0x16, 0x02, - 0x1a, 0x16, 0x01, 0x16, 0x12, 0x10, 0x40, 0x13, 0x17, 0x48, 0x10, 0x40, - 0x0f, 0x0f, 0x01, 0x09, 0x03, 0x0f, 0x40, 0x0b, 0x10, 0x48, 0x0f, 0x2a, - 0x06, 0x00, 0x06, 0x73, 0x59, 0x23, 0x22, 0x94, 0x03, 0xa4, 0x03, 0x02, - 0x70, 0x03, 0x80, 0x03, 0x02, 0x05, 0x03, 0x15, 0x03, 0x55, 0x03, 0x65, - 0x03, 0x04, 0x03, 0x00, 0x00, 0x2f, 0x32, 0x5d, 0x5d, 0x5d, 0x32, 0xcd, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x5f, 0x5e, 0x5d, 0x1a, 0xcd, - 0x2b, 0x33, 0x33, 0x5d, 0x5d, 0x12, 0x17, 0x39, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x25, 0x24, 0x03, 0x37, 0x1e, 0x01, 0x17, 0x11, - 0x2e, 0x03, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x1e, 0x01, 0x17, - 0x07, 0x2e, 0x01, 0x27, 0x11, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, 0x15, - 0x23, 0x01, 0x34, 0x2e, 0x01, 0x27, 0x11, 0x3e, 0x01, 0x01, 0x14, 0x1e, - 0x01, 0x17, 0x11, 0x04, 0x02, 0x06, 0xfe, 0x56, 0x46, 0xaa, 0x19, 0x9f, - 0x8e, 0xb1, 0x87, 0x53, 0x25, 0xe1, 0xcf, 0x7c, 0xbb, 0xcc, 0x2a, 0xae, - 0x14, 0x7a, 0x75, 0xb3, 0x97, 0x58, 0x2e, 0xf2, 0xde, 0x7c, 0x01, 0xa0, - 0x34, 0x62, 0x8e, 0x8d, 0x97, 0xfd, 0x5c, 0x32, 0x63, 0x6f, 0xfe, 0xfc, - 0x14, 0x12, 0x01, 0x55, 0x25, 0x77, 0x78, 0x09, 0x01, 0xf0, 0x2c, 0x46, - 0x5b, 0x68, 0x49, 0x9b, 0xaf, 0x09, 0x83, 0x83, 0x09, 0x97, 0xa0, 0x21, - 0x5e, 0x69, 0x0b, 0xfe, 0x43, 0x2a, 0x46, 0x58, 0x78, 0x51, 0xa5, 0xc8, - 0x0b, 0xa2, 0x02, 0x18, 0x41, 0x54, 0x37, 0x25, 0xfe, 0x2c, 0x09, 0x74, - 0x02, 0xf4, 0x3b, 0x52, 0x38, 0x1c, 0x01, 0xa5, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x00, 0x49, 0xff, 0xf4, 0x06, 0xd4, 0x05, 0x8d, 0x00, 0x0b, - 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x57, 0x40, 0x35, - 0x1c, 0x00, 0x22, 0x06, 0x0e, 0x0f, 0x0c, 0x0d, 0x28, 0x13, 0x2e, 0x19, - 0x19, 0x13, 0x0d, 0x0f, 0x06, 0x00, 0x06, 0x35, 0x34, 0x16, 0x31, 0xb6, - 0x59, 0x10, 0x16, 0xb8, 0x5b, 0x10, 0x2b, 0xb6, 0x59, 0x10, 0x04, 0x0e, - 0x03, 0x0d, 0x12, 0x09, 0x1f, 0xb6, 0x59, 0x03, 0x09, 0xb8, 0x5b, 0x03, - 0x25, 0xb6, 0x59, 0x03, 0x13, 0x00, 0x3f, 0x2b, 0x2b, 0x2b, 0x00, 0x18, - 0x3f, 0x3f, 0x3f, 0x2b, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x01, 0x23, 0x01, 0x33, 0x25, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x06, 0xd4, 0xa2, 0x9e, 0x9c, 0x9f, 0x99, - 0xa6, 0xa4, 0x98, 0xfb, 0x3b, 0x9b, 0x03, 0x9a, 0x9d, 0xfb, 0xdf, 0x9f, - 0x9a, 0x9f, 0x9e, 0x9e, 0x9f, 0x9a, 0x05, 0x5d, 0x4d, 0x5b, 0x5b, 0x51, - 0x4f, 0x5b, 0x58, 0x52, 0xfb, 0xf0, 0x4c, 0x5a, 0x5e, 0x50, 0x50, 0x5c, - 0x57, 0x51, 0x01, 0xb2, 0xd7, 0xe7, 0xe1, 0xdd, 0xe4, 0xdf, 0xe5, 0xfd, - 0x70, 0x05, 0x81, 0x0c, 0xe0, 0xde, 0xd9, 0xea, 0xe8, 0xdb, 0xdf, 0xdf, - 0xfc, 0x25, 0xb3, 0xa1, 0x9e, 0xb6, 0xab, 0xa5, 0xa7, 0x02, 0xc6, 0xb0, - 0xa2, 0x9f, 0xb3, 0xad, 0xa5, 0xa8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x48, - 0xff, 0xec, 0x05, 0x36, 0x05, 0x89, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x39, - 0x00, 0x75, 0x40, 0x46, 0x34, 0x08, 0x2a, 0x0d, 0x24, 0x13, 0x1a, 0x1b, - 0x21, 0x1b, 0x13, 0x1d, 0x18, 0x02, 0x30, 0x16, 0x2c, 0x32, 0x0a, 0x0d, - 0x08, 0x0d, 0x3a, 0x3b, 0x16, 0x32, 0x27, 0x05, 0x10, 0x27, 0x51, 0x59, - 0x2c, 0x0a, 0x10, 0x37, 0x02, 0x30, 0x1d, 0x18, 0x04, 0x1a, 0x1a, 0x05, - 0x90, 0x10, 0x01, 0xc0, 0x10, 0x01, 0x0f, 0x10, 0x3f, 0x10, 0x02, 0x09, - 0x03, 0x10, 0x05, 0x37, 0x51, 0x59, 0x05, 0x16, 0x00, 0x1f, 0x50, 0x59, - 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x12, 0x39, 0x2f, 0x17, 0x39, 0x11, 0x12, - 0x39, 0x39, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, - 0x22, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x10, 0x25, 0x2e, 0x01, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, - 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x01, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x02, 0x03, 0x26, - 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0xa9, 0xb1, 0x79, - 0x4b, 0xc0, 0x69, 0xd7, 0xec, 0x01, 0x57, 0x21, 0x30, 0xb7, 0xa8, 0x97, - 0xb9, 0xb7, 0xe2, 0x6f, 0xb6, 0x71, 0x3a, 0x91, 0x3f, 0x95, 0x60, 0x70, - 0x47, 0x2e, 0x38, 0xfe, 0x67, 0x64, 0x56, 0x60, 0x64, 0x41, 0x83, 0x7b, - 0x3f, 0x4a, 0xc6, 0x79, 0xec, 0x9b, 0x86, 0x47, 0x8e, 0x0c, 0x7f, 0x41, - 0x46, 0xcf, 0xb8, 0x01, 0x16, 0x97, 0x3e, 0xaa, 0x46, 0x96, 0xa5, 0x98, - 0x84, 0x76, 0xb8, 0x5a, 0xcd, 0xcf, 0xa6, 0xf4, 0x2b, 0xf9, 0xdc, 0x62, - 0x10, 0x87, 0x16, 0x04, 0x79, 0x48, 0x5b, 0x67, 0x5b, 0x72, 0x82, 0x35, - 0x4e, 0x5a, 0xfc, 0xa2, 0xea, 0xdf, 0x64, 0xc9, 0x79, 0x8d, 0x37, 0x00, - 0x00, 0x01, 0x00, 0x68, 0x03, 0xc6, 0x01, 0x20, 0x05, 0x81, 0x00, 0x03, - 0x00, 0x19, 0x40, 0x0b, 0x03, 0x02, 0x02, 0x04, 0x05, 0x20, 0x00, 0x01, - 0x00, 0x02, 0x03, 0x00, 0x3f, 0xcd, 0x5d, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x23, 0x03, 0x33, 0x01, 0x0a, 0x8d, 0x15, 0xb8, - 0x03, 0xc6, 0x01, 0xbb, 0x00, 0x01, 0x00, 0x7f, 0xfe, 0x58, 0x02, 0x9e, - 0x05, 0xcc, 0x00, 0x0e, 0x00, 0x22, 0x40, 0x10, 0x07, 0x00, 0x0b, 0x0a, - 0x03, 0x04, 0x0a, 0x04, 0x00, 0x03, 0x0f, 0x10, 0x0a, 0x1b, 0x03, 0x00, - 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x10, 0x12, 0x37, 0x33, 0x06, 0x02, 0x11, - 0x10, 0x12, 0x17, 0x23, 0x26, 0x02, 0x11, 0x7f, 0xb5, 0xbc, 0xae, 0xbb, - 0xaf, 0xad, 0xbd, 0xae, 0xbd, 0xb4, 0x02, 0x14, 0x01, 0x21, 0x01, 0xcc, - 0xcb, 0xd0, 0xfe, 0x2c, 0xfe, 0xea, 0xfe, 0xeb, 0xfe, 0x2e, 0xd3, 0xcc, - 0x01, 0xcd, 0x01, 0x1f, 0x00, 0x01, 0x00, 0x0c, 0xfe, 0x58, 0x02, 0x2b, - 0x05, 0xcc, 0x00, 0x0e, 0x00, 0x22, 0x40, 0x10, 0x07, 0x00, 0x03, 0x04, - 0x0b, 0x0a, 0x00, 0x04, 0x0a, 0x03, 0x0f, 0x10, 0x0a, 0x00, 0x03, 0x1b, - 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x07, 0x23, 0x36, 0x12, 0x11, - 0x10, 0x02, 0x27, 0x33, 0x16, 0x12, 0x11, 0x02, 0x2b, 0xb5, 0xbc, 0xae, - 0xbc, 0xae, 0xaf, 0xbb, 0xae, 0xbd, 0xb4, 0x02, 0x10, 0xfe, 0xdf, 0xfe, - 0x34, 0xcb, 0xd2, 0x01, 0xd1, 0x01, 0x17, 0x01, 0x17, 0x01, 0xd2, 0xd1, - 0xcc, 0xfe, 0x33, 0xfe, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x21, - 0x02, 0xb2, 0x02, 0xfd, 0x05, 0x81, 0x00, 0x0e, 0x00, 0x53, 0x40, 0x32, - 0x0c, 0x00, 0x03, 0x06, 0x09, 0x05, 0x0a, 0x05, 0x04, 0x0b, 0x04, 0x01, - 0x1a, 0x04, 0x2a, 0x04, 0x02, 0x07, 0x08, 0x16, 0x08, 0x01, 0x05, 0x08, - 0x25, 0x08, 0x02, 0x04, 0x08, 0x0a, 0x0e, 0x0d, 0x0d, 0x02, 0x0a, 0x0a, - 0x02, 0x0f, 0x10, 0xdf, 0x05, 0x01, 0x00, 0x05, 0xf0, 0x05, 0x02, 0x05, - 0x0e, 0x03, 0x00, 0x3f, 0xcc, 0x5d, 0x5d, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x39, 0x39, 0x5d, 0x5d, 0x11, 0x33, - 0x5d, 0x5d, 0x11, 0x33, 0x11, 0x17, 0x39, 0x31, 0x30, 0x01, 0x25, 0x17, - 0x05, 0x17, 0x07, 0x0b, 0x01, 0x27, 0x37, 0x25, 0x37, 0x05, 0x03, 0x33, - 0x01, 0xc8, 0x01, 0x08, 0x2d, 0xfe, 0xe6, 0xb9, 0x77, 0x96, 0x9c, 0x77, - 0xbd, 0xfe, 0xe8, 0x2d, 0x01, 0x0b, 0x0c, 0x88, 0x04, 0x5a, 0x67, 0x84, - 0x49, 0xfa, 0x48, 0x01, 0x02, 0xff, 0x00, 0x48, 0xf8, 0x49, 0x86, 0x6b, - 0x01, 0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0xb4, 0x04, 0x47, - 0x04, 0x9e, 0x00, 0x0b, 0x00, 0x43, 0x40, 0x26, 0x09, 0x00, 0x00, 0x06, - 0x03, 0x03, 0x0d, 0x0c, 0xa9, 0x02, 0x01, 0x03, 0x0f, 0x02, 0x5f, 0x02, - 0x02, 0x0c, 0x06, 0x02, 0x00, 0x04, 0x05, 0x04, 0xad, 0x59, 0x09, 0xd6, - 0x07, 0x01, 0x37, 0x07, 0x87, 0x07, 0x02, 0x07, 0x05, 0xb3, 0x00, 0x3f, - 0x33, 0x5d, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x5f, 0x5e, 0x5d, - 0x5f, 0x5d, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, - 0x15, 0x02, 0x9f, 0x93, 0xfe, 0x58, 0x01, 0xa8, 0x93, 0x01, 0xa8, 0x02, - 0x60, 0xfe, 0x54, 0x01, 0xac, 0x92, 0x01, 0xac, 0xfe, 0x54, 0x92, 0x00, - 0x00, 0x01, 0x00, 0xb8, 0xfe, 0xfa, 0x01, 0x81, 0x00, 0xdb, 0x00, 0x09, - 0x00, 0x22, 0x40, 0x11, 0x04, 0x05, 0x00, 0x08, 0x05, 0x08, 0x0a, 0x0b, - 0x00, 0x05, 0xa8, 0x5b, 0x08, 0x00, 0x9b, 0x5b, 0x08, 0x00, 0x2f, 0x2b, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x25, 0x15, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x01, 0x81, - 0x26, 0x28, 0x7b, 0x5e, 0x58, 0xdb, 0xa8, 0x6a, 0x8e, 0x41, 0x88, 0x7e, - 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x01, 0xd0, 0x02, 0x4f, - 0x02, 0x70, 0x00, 0x03, 0x00, 0x1f, 0x40, 0x11, 0x00, 0x03, 0x04, 0x05, - 0x01, 0x00, 0xbb, 0x59, 0x9f, 0x01, 0xcf, 0x01, 0x02, 0x2f, 0x01, 0x01, - 0x01, 0x00, 0x2f, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x35, 0x21, 0x15, 0x5b, 0x01, 0xf4, 0x01, 0xd0, 0xa0, 0xa0, - 0x00, 0x01, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x7e, 0x00, 0xdb, 0x00, 0x03, - 0x00, 0x17, 0x40, 0x0a, 0x03, 0x00, 0x00, 0x04, 0x05, 0x00, 0x01, 0x9b, - 0x5b, 0x00, 0x00, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, - 0x30, 0x33, 0x35, 0x33, 0x15, 0xbb, 0xc3, 0xdb, 0xdb, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0xff, 0xec, 0x02, 0x39, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x13, 0xb7, 0x02, 0x05, 0x00, 0x04, 0x01, 0x00, 0x00, 0x13, 0x00, - 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x15, 0x01, 0x33, - 0x01, 0x01, 0x9b, 0x9e, 0xfe, 0x69, 0x14, 0x05, 0xe0, 0xfa, 0x20, 0x00, - 0x00, 0x02, 0x00, 0x50, 0xff, 0xec, 0x04, 0x23, 0x05, 0x96, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x28, 0x40, 0x14, 0x12, 0x06, 0x0c, 0x00, 0x06, 0x00, - 0x18, 0x19, 0x09, 0x0f, 0x73, 0x59, 0x09, 0x07, 0x03, 0x15, 0x73, 0x59, - 0x03, 0x19, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, - 0x22, 0x02, 0x11, 0x10, 0x12, 0x21, 0x32, 0x12, 0x03, 0x10, 0x02, 0x23, - 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x04, 0x23, 0xf9, 0xf3, - 0xf3, 0xf4, 0xed, 0x01, 0x00, 0xf9, 0xed, 0xb7, 0x8d, 0xa2, 0xa6, 0x91, - 0x93, 0xa0, 0x9f, 0x94, 0x02, 0xc1, 0xfe, 0x9f, 0xfe, 0x8c, 0x01, 0x72, - 0x01, 0x63, 0x01, 0x6b, 0x01, 0x6a, 0xfe, 0x92, 0xfe, 0x99, 0x01, 0x31, - 0x01, 0x12, 0xfe, 0xf2, 0xfe, 0xcb, 0xfe, 0xd4, 0xfe, 0xea, 0x01, 0x1c, - 0x00, 0x01, 0x00, 0x9c, 0x00, 0x00, 0x04, 0x0f, 0x05, 0x81, 0x00, 0x0a, - 0x00, 0x2b, 0x40, 0x14, 0x04, 0x08, 0x02, 0x02, 0x0b, 0x0c, 0x05, 0x04, - 0x04, 0x03, 0x06, 0x06, 0x08, 0x01, 0x00, 0x01, 0x74, 0x59, 0x00, 0x18, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x33, 0x2f, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x33, 0x35, 0x21, - 0x11, 0x05, 0x35, 0x25, 0x33, 0x11, 0x21, 0x15, 0x9c, 0x01, 0x67, 0xfe, - 0xc2, 0x01, 0x4d, 0xa6, 0x01, 0x57, 0x99, 0x04, 0x3c, 0xe3, 0xaa, 0xe5, - 0xfb, 0x18, 0x99, 0x00, 0x00, 0x01, 0x00, 0x67, 0x00, 0x00, 0x04, 0x0c, - 0x05, 0x96, 0x00, 0x1e, 0x00, 0x3e, 0x40, 0x20, 0x1c, 0x00, 0x0e, 0x0f, - 0x08, 0x15, 0x1d, 0x15, 0x0f, 0x00, 0x04, 0x1f, 0x20, 0x08, 0x1c, 0x0e, - 0x12, 0x12, 0x0b, 0x73, 0x59, 0x12, 0x07, 0x01, 0x00, 0x1c, 0x00, 0x1c, - 0x74, 0x59, 0x00, 0x18, 0x00, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x35, 0x3e, 0x05, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x07, 0x21, 0x15, 0x67, - 0x33, 0x93, 0xa2, 0x9f, 0x80, 0x4f, 0x88, 0x79, 0x73, 0x95, 0x0d, 0xb8, - 0x14, 0xf7, 0xc2, 0xd5, 0xe5, 0x4b, 0x94, 0xd1, 0x73, 0x88, 0x1e, 0x02, - 0xdf, 0x7f, 0x75, 0xb3, 0x91, 0x7c, 0x7c, 0x88, 0x56, 0x74, 0x80, 0x7d, - 0x71, 0x11, 0xa9, 0xc8, 0xc9, 0xb9, 0x52, 0xa2, 0xa2, 0xaa, 0x5e, 0x97, - 0x46, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, 0xff, 0xec, 0x04, 0x19, - 0x05, 0x96, 0x00, 0x28, 0x00, 0x63, 0x40, 0x39, 0x07, 0x06, 0x1b, 0x1c, - 0x15, 0x22, 0x0c, 0x00, 0x00, 0x22, 0x25, 0x10, 0x1c, 0x06, 0x06, 0x29, - 0x2a, 0x25, 0x11, 0x10, 0x11, 0x10, 0x74, 0x59, 0x11, 0x18, 0x13, 0x82, - 0x4d, 0x11, 0x18, 0x13, 0x01, 0x4d, 0x0f, 0x11, 0x01, 0x10, 0x05, 0x11, - 0x11, 0x03, 0x1b, 0x1f, 0x1f, 0x18, 0x73, 0x59, 0x1f, 0x07, 0x03, 0x09, - 0x73, 0x59, 0x07, 0x03, 0x19, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, - 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, - 0x1e, 0x01, 0x04, 0x19, 0xf8, 0xe6, 0xd6, 0xff, 0x18, 0xba, 0x24, 0x01, - 0x0f, 0x88, 0x9b, 0xb1, 0xa7, 0x66, 0x62, 0x94, 0xa3, 0x85, 0x83, 0x77, - 0x93, 0x0c, 0xb5, 0x14, 0xf7, 0xc2, 0xd4, 0xeb, 0x97, 0x90, 0x9e, 0xb0, - 0x01, 0x85, 0xc3, 0xd6, 0xc1, 0xbd, 0x11, 0xfa, 0x86, 0x84, 0x73, 0x81, - 0x9c, 0x81, 0x72, 0x71, 0x83, 0x7a, 0x6f, 0x0e, 0xad, 0xc2, 0xc5, 0xb0, - 0x87, 0xa9, 0x1e, 0x04, 0x11, 0xb2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2f, - 0x00, 0x00, 0x04, 0x37, 0x05, 0x81, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x36, - 0x40, 0x1a, 0x11, 0x05, 0x12, 0x02, 0x02, 0x08, 0x01, 0x05, 0x01, 0x13, - 0x14, 0x00, 0x04, 0x11, 0x04, 0x73, 0x59, 0x08, 0x11, 0x11, 0x01, 0x0b, - 0x06, 0x06, 0x01, 0x18, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, - 0x01, 0x33, 0x11, 0x33, 0x15, 0x01, 0x0e, 0x01, 0x07, 0x01, 0x0f, 0x01, - 0x21, 0x03, 0x71, 0xaa, 0xfd, 0x68, 0x02, 0x85, 0xbd, 0xc6, 0xfe, 0x90, - 0x02, 0x34, 0x0d, 0xfe, 0x97, 0x36, 0x10, 0x01, 0xf2, 0x01, 0x3f, 0xfe, - 0xc1, 0x01, 0x3f, 0x8c, 0x03, 0xb6, 0xfc, 0x4c, 0x8e, 0x03, 0x77, 0x06, - 0x5e, 0x13, 0xfd, 0xec, 0x4a, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0x81, 0x00, 0x1c, 0x00, 0x5e, 0x40, 0x35, - 0x12, 0x13, 0x18, 0x17, 0x14, 0x14, 0x00, 0x13, 0x07, 0x06, 0x18, 0x13, - 0x0c, 0x00, 0x00, 0x16, 0x13, 0x06, 0x04, 0x1d, 0x1e, 0x1a, 0x0f, 0x73, - 0x59, 0x1a, 0x1a, 0x03, 0x14, 0x14, 0x17, 0x74, 0x59, 0x14, 0x06, 0x03, - 0x09, 0x73, 0x59, 0x67, 0x07, 0x01, 0x16, 0x07, 0x01, 0x73, 0x07, 0x83, - 0x07, 0x02, 0x07, 0x03, 0x19, 0x00, 0x3f, 0x33, 0x5d, 0x5d, 0x5d, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, 0x00, 0x23, - 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x13, 0x21, 0x15, 0x21, 0x03, 0x36, 0x33, 0x32, - 0x16, 0x04, 0x1d, 0xfe, 0xf7, 0xeb, 0xc5, 0xf2, 0x20, 0xb6, 0x39, 0xec, - 0x91, 0xa4, 0xa5, 0x8c, 0x49, 0x7e, 0x3f, 0xb0, 0x2f, 0x03, 0x21, 0xfd, - 0x83, 0x1b, 0x75, 0xae, 0xd0, 0xf7, 0x01, 0xcb, 0xdf, 0xff, 0x00, 0xac, - 0xa3, 0x15, 0xd1, 0xaf, 0x99, 0x85, 0xa4, 0x2e, 0x37, 0x02, 0xf6, 0x99, - 0xfe, 0x41, 0x5a, 0xf4, 0x00, 0x02, 0x00, 0x68, 0xff, 0xec, 0x04, 0x19, - 0x05, 0x96, 0x00, 0x16, 0x00, 0x22, 0x00, 0x50, 0x40, 0x2b, 0x1d, 0x11, - 0x06, 0x0c, 0x0b, 0x17, 0x00, 0x00, 0x0b, 0x06, 0x03, 0x23, 0x24, 0x11, - 0x1a, 0x14, 0x1a, 0x75, 0x59, 0x14, 0x14, 0x03, 0x09, 0x09, 0x0e, 0x73, - 0x59, 0x0f, 0x0c, 0x8f, 0x0c, 0x02, 0x0a, 0x05, 0x0c, 0x09, 0x07, 0x03, - 0x20, 0x73, 0x59, 0x03, 0x19, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, - 0x00, 0x33, 0x20, 0x13, 0x07, 0x26, 0x23, 0x22, 0x02, 0x11, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x04, 0x19, 0xf2, 0xd5, 0xee, 0xfc, 0x01, 0x06, 0xf2, - 0x01, 0x3f, 0x53, 0xac, 0x35, 0xb3, 0x9a, 0xa9, 0x31, 0xb2, 0x73, 0xc3, - 0xe5, 0xb7, 0x96, 0x86, 0x7e, 0x9b, 0xa1, 0x7e, 0x82, 0x94, 0x01, 0xcd, - 0xdf, 0xfe, 0xfe, 0x01, 0x62, 0x01, 0x52, 0x01, 0x6e, 0x01, 0x88, 0xfe, - 0xe1, 0x1f, 0xac, 0xfe, 0xe1, 0xfe, 0xf0, 0x5b, 0x5f, 0xf4, 0xd6, 0x99, - 0xa6, 0x93, 0x81, 0xa3, 0xd0, 0xaf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, - 0x00, 0x00, 0x04, 0x0c, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x2a, 0x40, 0x14, - 0x08, 0x04, 0x05, 0x05, 0x00, 0x09, 0x09, 0x00, 0x0c, 0x0d, 0x00, 0x09, - 0x0a, 0x09, 0x74, 0x59, 0x0a, 0x06, 0x04, 0x18, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x11, - 0x33, 0x32, 0x31, 0x30, 0x01, 0x0a, 0x02, 0x15, 0x23, 0x10, 0x12, 0x01, - 0x21, 0x35, 0x21, 0x04, 0x0c, 0xd8, 0xb2, 0x59, 0xbc, 0xe5, 0x01, 0x0c, - 0xfd, 0x0b, 0x03, 0xa3, 0x04, 0xef, 0xfe, 0xb6, 0xfe, 0x8a, 0xfe, 0x94, - 0xc3, 0x01, 0x0e, 0x02, 0x55, 0x01, 0x85, 0x99, 0x00, 0x03, 0x00, 0x59, - 0xff, 0xec, 0x04, 0x1a, 0x05, 0x96, 0x00, 0x19, 0x00, 0x24, 0x00, 0x2f, - 0x00, 0x55, 0x40, 0x2e, 0x2b, 0x06, 0x1f, 0x0d, 0x1a, 0x13, 0x25, 0x00, - 0x00, 0x13, 0x16, 0x09, 0x0d, 0x06, 0x06, 0x30, 0x31, 0x16, 0x09, 0x22, - 0x28, 0x22, 0x28, 0x75, 0x59, 0x0f, 0x22, 0x01, 0x13, 0x06, 0x22, 0x22, - 0x03, 0x10, 0x10, 0x1c, 0x75, 0x59, 0x10, 0x07, 0x03, 0x2d, 0x75, 0x59, - 0x03, 0x19, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x37, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x07, 0x15, 0x1e, 0x01, 0x03, 0x34, 0x21, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x10, - 0x21, 0x32, 0x36, 0x04, 0x1a, 0xf8, 0xe8, 0xe2, 0xff, 0x9e, 0x7b, 0x73, - 0x85, 0xf1, 0xcb, 0xd0, 0xf1, 0x86, 0x74, 0x87, 0x96, 0xde, 0xfe, 0xfa, - 0x7f, 0x85, 0x89, 0x7d, 0x7f, 0x85, 0x23, 0x9c, 0x8d, 0x89, 0x9a, 0x01, - 0x29, 0x93, 0x90, 0x01, 0x89, 0xc3, 0xda, 0xd6, 0xc5, 0x8a, 0xbc, 0x14, - 0x04, 0x1b, 0xb4, 0x79, 0xa1, 0xc8, 0xc4, 0xa7, 0x79, 0xb4, 0x17, 0x04, - 0x16, 0xb9, 0x02, 0x0d, 0xef, 0x78, 0x77, 0x79, 0x7f, 0x75, 0xfd, 0xfc, - 0x83, 0x85, 0x8f, 0x7d, 0xfe, 0xdd, 0x8d, 0x00, 0x00, 0x02, 0x00, 0x60, - 0xff, 0xec, 0x04, 0x12, 0x05, 0x96, 0x00, 0x17, 0x00, 0x24, 0x00, 0x54, - 0x40, 0x2e, 0x1e, 0x12, 0x07, 0x06, 0x18, 0x0c, 0x00, 0x00, 0x06, 0x12, - 0x03, 0x25, 0x26, 0x0c, 0x21, 0x0f, 0x21, 0x73, 0x59, 0x0f, 0x0f, 0x1f, - 0x0f, 0x02, 0x0e, 0x03, 0x0f, 0x0f, 0x03, 0x15, 0x15, 0x1b, 0x73, 0x59, - 0x15, 0x07, 0x03, 0x09, 0x73, 0x59, 0x17, 0x07, 0x01, 0x07, 0x03, 0x19, - 0x00, 0x3f, 0x33, 0x5d, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x12, - 0x13, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, - 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, - 0x01, 0x04, 0x12, 0xfe, 0xf7, 0xf5, 0xa5, 0xc7, 0x2b, 0xac, 0x36, 0xb8, - 0x9b, 0xaa, 0x04, 0x28, 0xc2, 0x74, 0xbe, 0xe4, 0xf8, 0xdd, 0xeb, 0xf2, - 0xc4, 0x9c, 0x83, 0x82, 0x96, 0x96, 0x80, 0x4e, 0x86, 0x4d, 0x02, 0xdd, - 0xfe, 0x95, 0xfe, 0x7a, 0x8b, 0x9b, 0x1b, 0xb0, 0x01, 0x20, 0x01, 0x0b, - 0x5a, 0x6d, 0x01, 0x04, 0xd7, 0xdd, 0xfd, 0xfe, 0xa4, 0xaf, 0xaa, 0xcf, - 0xb1, 0x97, 0x9a, 0xb3, 0x47, 0x82, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbb, - 0x00, 0x00, 0x01, 0x7e, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x27, - 0x40, 0x13, 0x03, 0x07, 0x07, 0x04, 0x00, 0x04, 0x09, 0x08, 0x04, 0x05, - 0x9c, 0x5b, 0x04, 0x01, 0x00, 0x9c, 0x5b, 0x01, 0x0f, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0xbb, - 0xc3, 0xc3, 0xc3, 0x03, 0x6b, 0xcf, 0xcf, 0xfc, 0x95, 0xcf, 0xcf, 0x00, - 0x00, 0x02, 0x00, 0xb8, 0xfe, 0xfa, 0x01, 0x81, 0x04, 0x3a, 0x00, 0x09, - 0x00, 0x0d, 0x00, 0x2e, 0x40, 0x19, 0x0d, 0x00, 0x00, 0x08, 0x0a, 0x08, - 0x05, 0x03, 0x0e, 0x0f, 0x0b, 0x0a, 0x9c, 0x5b, 0x0b, 0x0f, 0x00, 0x05, - 0xa8, 0x5b, 0x08, 0x00, 0x9c, 0x5b, 0x08, 0x00, 0x2f, 0x2b, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x25, 0x15, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, - 0x11, 0x35, 0x33, 0x15, 0x01, 0x81, 0x26, 0x28, 0x7b, 0x5e, 0x58, 0xc3, - 0xcf, 0x9c, 0x6a, 0x8e, 0x41, 0x88, 0x7e, 0xcf, 0x02, 0x9c, 0xcf, 0xcf, - 0x00, 0x01, 0x00, 0x65, 0x00, 0x9a, 0x04, 0x48, 0x04, 0xaa, 0x00, 0x06, - 0x00, 0x3c, 0x40, 0x27, 0x03, 0x06, 0x04, 0x00, 0x04, 0x07, 0x08, 0x05, - 0x3f, 0x06, 0x7f, 0x06, 0x8f, 0x06, 0x03, 0x06, 0x03, 0x30, 0x02, 0x70, - 0x02, 0x80, 0x02, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x04, 0x3f, 0x04, 0x6f, - 0x04, 0x9f, 0x04, 0xcf, 0x04, 0x05, 0x04, 0x00, 0x19, 0x2f, 0x5d, 0x33, - 0x33, 0xcd, 0x5d, 0x32, 0xcd, 0x5d, 0x32, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x31, 0x30, 0x13, 0x35, 0x01, 0x15, 0x09, 0x01, 0x15, 0x65, 0x03, 0xe3, - 0xfc, 0xa6, 0x03, 0x5a, 0x02, 0x3b, 0xcd, 0x01, 0xa2, 0x9a, 0xfe, 0x92, - 0xfe, 0x91, 0x99, 0x00, 0x00, 0x02, 0x00, 0x64, 0x01, 0x58, 0x04, 0x47, - 0x03, 0xec, 0x00, 0x03, 0x00, 0x07, 0x00, 0x3f, 0x40, 0x28, 0x07, 0x03, - 0x00, 0x04, 0x04, 0x08, 0x09, 0x05, 0x04, 0xad, 0x59, 0x0f, 0x05, 0x1f, - 0x05, 0x4f, 0x05, 0x5f, 0x05, 0xcf, 0x05, 0x05, 0x0a, 0x03, 0x05, 0x01, - 0x40, 0x01, 0x00, 0xad, 0x59, 0x50, 0x01, 0xd0, 0x01, 0x02, 0x0f, 0x01, - 0x01, 0x01, 0x00, 0x2f, 0x5d, 0x5d, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, - 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x13, - 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x64, 0x03, 0xe3, 0xfc, 0x1d, - 0x03, 0xe3, 0x03, 0x58, 0x94, 0x94, 0xfe, 0x00, 0x94, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x65, 0x00, 0x9a, 0x04, 0x48, 0x04, 0xaa, 0x00, 0x06, - 0x00, 0x3c, 0x40, 0x27, 0x06, 0x02, 0x00, 0x03, 0x04, 0x07, 0x08, 0x03, - 0x30, 0x04, 0x70, 0x04, 0x80, 0x04, 0x03, 0x04, 0x01, 0x3f, 0x00, 0x7f, - 0x00, 0x8f, 0x00, 0x03, 0x00, 0x06, 0x05, 0x0f, 0x02, 0x3f, 0x02, 0x6f, - 0x02, 0x9f, 0x02, 0xcf, 0x02, 0x05, 0x02, 0x00, 0x19, 0x2f, 0x5d, 0x33, - 0x33, 0xcd, 0x5d, 0x32, 0xcd, 0x5d, 0x32, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x31, 0x30, 0x37, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, 0x65, 0x03, 0x5a, - 0xfc, 0xa6, 0x03, 0xe3, 0x9a, 0x99, 0x01, 0x6f, 0x01, 0x6e, 0x9a, 0xfe, - 0x5e, 0xcd, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x00, 0x04, 0x27, - 0x05, 0x96, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x52, 0x40, 0x2c, 0x21, 0x20, - 0x18, 0x19, 0x08, 0x09, 0x12, 0x00, 0x00, 0x09, 0x20, 0x19, 0x04, 0x23, - 0x24, 0x12, 0x1c, 0x0f, 0x09, 0x3f, 0x09, 0x02, 0x0e, 0x03, 0x09, 0x20, - 0x1f, 0x20, 0x9c, 0x5b, 0x1f, 0x0c, 0x18, 0x01, 0x0d, 0x03, 0x18, 0x1c, - 0x1c, 0x15, 0x5f, 0x59, 0x1c, 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x5f, 0x5e, 0x5d, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x5f, 0x5e, - 0x5d, 0x11, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x01, 0x0f, 0x01, - 0x0e, 0x01, 0x07, 0x23, 0x3e, 0x07, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x27, 0x36, 0x24, 0x33, 0x32, 0x04, 0x01, 0x35, 0x33, 0x15, 0x04, - 0x27, 0x2c, 0x52, 0x5d, 0x50, 0x48, 0x46, 0x01, 0xaf, 0x02, 0x27, 0x3e, - 0x4e, 0x50, 0x4d, 0x3c, 0x25, 0x9b, 0x8c, 0x8c, 0xa4, 0x0e, 0xb8, 0x1a, - 0x01, 0x04, 0xd6, 0xdf, 0x01, 0x00, 0xfd, 0x8f, 0xc3, 0x04, 0x08, 0x4b, - 0x76, 0x64, 0x44, 0x3b, 0x34, 0x73, 0x44, 0x45, 0x68, 0x50, 0x3f, 0x39, - 0x39, 0x46, 0x58, 0x3b, 0x72, 0x84, 0x8c, 0x7a, 0x0c, 0xc6, 0xd4, 0xd3, - 0xfb, 0x3d, 0xc9, 0xc9, 0x00, 0x02, 0x00, 0xa1, 0xfe, 0xe5, 0x07, 0x6e, - 0x05, 0xcc, 0x00, 0x3f, 0x00, 0x4e, 0x00, 0x7e, 0x40, 0x46, 0x1b, 0x07, - 0x29, 0x38, 0x47, 0x0f, 0x07, 0x40, 0x40, 0x17, 0x17, 0x18, 0x21, 0x00, - 0x00, 0x31, 0x18, 0x0f, 0x38, 0x05, 0x4f, 0x50, 0x04, 0x1d, 0xd5, 0x59, - 0x04, 0x04, 0x0c, 0x0c, 0x4a, 0xd6, 0x59, 0x13, 0x43, 0xd6, 0x59, 0x17, - 0x13, 0x0f, 0x0c, 0x1f, 0x0c, 0x02, 0x0b, 0x03, 0x0c, 0x13, 0x0c, 0x13, - 0x34, 0x3c, 0x3c, 0x25, 0xd6, 0x59, 0x3c, 0x00, 0x02, 0x30, 0x01, 0x12, - 0x04, 0x30, 0x34, 0x34, 0x2d, 0xd6, 0x59, 0x34, 0x00, 0x2f, 0x2b, 0x11, - 0x00, 0x33, 0x5f, 0x5e, 0x5d, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x33, 0x2b, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x02, 0x06, 0x23, 0x22, 0x26, 0x35, 0x37, 0x23, - 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x17, - 0x33, 0x37, 0x33, 0x03, 0x06, 0x15, 0x14, 0x33, 0x32, 0x3e, 0x01, 0x35, - 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x15, 0x14, 0x12, 0x04, 0x33, - 0x32, 0x24, 0x37, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, - 0x12, 0x00, 0x21, 0x32, 0x04, 0x12, 0x05, 0x34, 0x26, 0x23, 0x22, 0x0e, - 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x07, 0x6e, 0x73, - 0xcd, 0x7f, 0x63, 0x6c, 0x03, 0x06, 0x42, 0xc3, 0x71, 0x9d, 0xad, 0x81, - 0xe8, 0x8d, 0xdb, 0x52, 0x06, 0x27, 0x9c, 0x74, 0x25, 0x51, 0x50, 0x87, - 0x4e, 0x9a, 0xfe, 0xde, 0xc2, 0xf2, 0xfe, 0x8c, 0xd4, 0x9d, 0x01, 0x29, - 0xc6, 0x91, 0x01, 0x2a, 0xa0, 0x37, 0x91, 0xfe, 0xad, 0xae, 0xf1, 0xfe, - 0x97, 0xbf, 0xf9, 0x01, 0xba, 0x01, 0x12, 0xf1, 0x01, 0x5e, 0xb9, 0xfd, - 0xa2, 0x84, 0x6e, 0x65, 0x9d, 0x5a, 0x5f, 0x63, 0x7d, 0xd0, 0x28, 0x17, - 0x02, 0xf3, 0xba, 0xfe, 0xd3, 0xa4, 0x58, 0x58, 0x46, 0x7b, 0x7b, 0xcc, - 0xb5, 0xa4, 0x01, 0x1a, 0xa6, 0xb6, 0xa0, 0xfe, 0x06, 0xa4, 0x59, 0x5e, - 0x8a, 0xf2, 0x93, 0xb3, 0x01, 0x15, 0x95, 0xd6, 0xfe, 0x6d, 0xfa, 0xc1, - 0xfe, 0xd9, 0x9e, 0x4b, 0x57, 0x70, 0x57, 0x5b, 0xbf, 0x01, 0x61, 0xe6, - 0x01, 0x18, 0x01, 0xca, 0x00, 0xff, 0xb5, 0xfe, 0xb6, 0xe2, 0x66, 0x7d, - 0x7f, 0xe1, 0x83, 0x78, 0x88, 0xd2, 0x9d, 0x5c, 0x00, 0x02, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x05, 0x81, 0x00, 0x07, 0x00, 0x10, 0x00, 0x5b, - 0x40, 0x36, 0x0d, 0x01, 0x00, 0x0c, 0x02, 0x03, 0x06, 0x05, 0x08, 0x00, - 0x03, 0x04, 0x04, 0x08, 0x07, 0x03, 0x12, 0x11, 0x0c, 0x02, 0x5f, 0x59, - 0x0c, 0x0c, 0x08, 0x05, 0x03, 0x04, 0x00, 0x12, 0xb0, 0x12, 0x01, 0x50, - 0x12, 0x01, 0xf0, 0x12, 0x01, 0xc0, 0x12, 0x01, 0x90, 0x12, 0x01, 0x60, - 0x12, 0x01, 0x30, 0x12, 0x01, 0x2f, 0x12, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x39, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x32, 0x11, 0x33, 0x33, 0x12, - 0x39, 0x39, 0x12, 0x39, 0x39, 0x31, 0x30, 0x21, 0x03, 0x21, 0x03, 0x23, - 0x01, 0x33, 0x09, 0x01, 0x07, 0x06, 0x07, 0x03, 0x21, 0x03, 0x26, 0x27, - 0x04, 0x8f, 0xa1, 0xfd, 0x7e, 0xa2, 0xc6, 0x02, 0x3f, 0xd9, 0x02, 0x36, - 0xfd, 0x5b, 0x09, 0x19, 0x31, 0xb4, 0x02, 0x0f, 0xb5, 0x1c, 0x1c, 0x01, - 0x9c, 0xfe, 0x64, 0x05, 0x81, 0xfa, 0x7f, 0x04, 0xf1, 0x1c, 0x53, 0x82, - 0xfe, 0x31, 0x01, 0xd1, 0x45, 0x57, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x1e, - 0x00, 0x68, 0x40, 0x3a, 0x0b, 0x13, 0x08, 0x13, 0x1b, 0x1b, 0x04, 0x0e, - 0x08, 0x17, 0x00, 0x00, 0x08, 0x04, 0x03, 0x1f, 0x20, 0x0b, 0x13, 0x1a, - 0x13, 0x1a, 0x5f, 0x59, 0x13, 0x24, 0x13, 0x02, 0x4d, 0x0f, 0x13, 0x01, - 0x03, 0x3e, 0x13, 0x01, 0x04, 0x0f, 0x13, 0x01, 0x10, 0x05, 0x13, 0x13, - 0x04, 0x05, 0x05, 0x12, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x1b, 0x5f, 0x59, - 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x5f, 0x71, 0x2b, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, - 0x04, 0x23, 0x21, 0x11, 0x21, 0x20, 0x11, 0x14, 0x06, 0x07, 0x1e, 0x01, - 0x01, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x13, 0x34, 0x29, - 0x01, 0x11, 0x21, 0x32, 0x36, 0x04, 0xea, 0xfe, 0xee, 0xf4, 0xfd, 0xc4, - 0x02, 0x00, 0x01, 0xf0, 0x8c, 0x80, 0xa8, 0xb6, 0xfe, 0xee, 0x9c, 0x94, - 0xfe, 0xbf, 0x01, 0x41, 0x99, 0x97, 0x51, 0xfe, 0xa2, 0xfe, 0x9c, 0x01, - 0x73, 0xaf, 0xa0, 0x01, 0x8d, 0xbc, 0xd1, 0x05, 0x81, 0xfe, 0xaa, 0x7d, - 0xaa, 0x1d, 0x14, 0xb9, 0x01, 0xfa, 0x72, 0x62, 0xfe, 0x42, 0x73, 0xfd, - 0xff, 0xf9, 0xfe, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x05, 0x96, 0x00, 0x19, 0x00, 0x5e, 0x40, 0x39, - 0x03, 0x10, 0x17, 0x16, 0x08, 0x09, 0x09, 0x16, 0x10, 0x03, 0x1a, 0x1b, - 0x0f, 0x17, 0x01, 0x0d, 0x03, 0x17, 0x17, 0x13, 0x13, 0x00, 0x5f, 0x59, - 0x13, 0x04, 0x00, 0x08, 0x10, 0x08, 0x40, 0x08, 0x50, 0x08, 0x90, 0x08, - 0xa0, 0x08, 0xd0, 0x08, 0xe0, 0x08, 0x08, 0x0c, 0x03, 0x08, 0x08, 0x0c, - 0x0c, 0x06, 0x5f, 0x59, 0x0c, 0x13, 0x20, 0x1b, 0x01, 0x5d, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x00, 0x11, - 0x10, 0x00, 0x33, 0x20, 0x13, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, - 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x03, 0x18, - 0xea, 0xfe, 0xfc, 0x01, 0x0f, 0xe7, 0x01, 0x28, 0x95, 0x9c, 0x57, 0xfe, - 0xc5, 0xd0, 0xd5, 0xfe, 0xc9, 0xa3, 0x01, 0x6c, 0x01, 0x42, 0xe1, 0x01, - 0x2e, 0x47, 0xb5, 0x31, 0xd9, 0x04, 0xfa, 0xfe, 0xd3, 0xfe, 0xfa, 0xfe, - 0xfd, 0xfe, 0xc5, 0x01, 0x25, 0x4e, 0xb6, 0xbe, 0xb1, 0x01, 0x49, 0xe1, - 0x01, 0x51, 0x01, 0x7e, 0xb0, 0xad, 0x3c, 0x7b, 0x82, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x65, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x13, 0x00, 0x2c, 0x40, 0x17, 0x0f, 0x05, 0x0a, 0x00, 0x05, 0x00, - 0x14, 0x15, 0x06, 0x0e, 0x5f, 0x59, 0x06, 0x03, 0x05, 0x0f, 0x5f, 0x59, - 0x05, 0x12, 0x20, 0x15, 0x01, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x02, 0x04, 0x23, 0x21, 0x11, 0x21, 0x20, 0x00, 0x03, 0x10, - 0x00, 0x29, 0x01, 0x11, 0x21, 0x32, 0x36, 0x12, 0x05, 0x65, 0xaa, 0xfe, - 0xc8, 0xcc, 0xfd, 0xf1, 0x01, 0xd2, 0x01, 0x66, 0x01, 0x85, 0xc0, 0xfe, - 0xe1, 0xfe, 0xf0, 0xfe, 0xf1, 0x01, 0x3a, 0x9b, 0xeb, 0x7e, 0x02, 0xcf, - 0xda, 0xfe, 0xb9, 0xae, 0x05, 0x81, 0xfe, 0x99, 0xfe, 0xb5, 0x01, 0x06, - 0x01, 0x13, 0xfb, 0xb1, 0x88, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x54, 0x40, 0x32, - 0x05, 0x09, 0x09, 0x00, 0x0a, 0x03, 0x07, 0x00, 0x04, 0x0c, 0x0d, 0x05, - 0x08, 0x5f, 0x59, 0x8f, 0x05, 0x01, 0xba, 0x05, 0x01, 0x79, 0x05, 0x89, - 0x05, 0x02, 0x0f, 0x05, 0x01, 0x08, 0x03, 0x05, 0x05, 0x00, 0x01, 0x01, - 0x04, 0x5f, 0x59, 0x01, 0x03, 0x00, 0x09, 0x5f, 0x59, 0x00, 0x12, 0x20, - 0x0d, 0x01, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, - 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0xa8, 0x04, - 0x2d, 0xfc, 0x92, 0x03, 0x32, 0xfc, 0xce, 0x03, 0x97, 0x05, 0x81, 0x9c, - 0xfe, 0x3c, 0x9a, 0xfe, 0x15, 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0x91, 0x05, 0x81, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1d, - 0x01, 0x05, 0x05, 0x06, 0x08, 0x02, 0x06, 0x03, 0x0a, 0x0b, 0x01, 0x04, - 0x5f, 0x59, 0x01, 0x01, 0x05, 0x07, 0x07, 0x00, 0x5f, 0x59, 0x07, 0x03, - 0x05, 0x12, 0x20, 0x0b, 0x01, 0x5d, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, - 0x21, 0x15, 0x01, 0x67, 0x03, 0x12, 0xfc, 0xee, 0xbf, 0x03, 0xe9, 0x04, - 0xe5, 0xfd, 0xf4, 0x9e, 0xfd, 0xc5, 0x05, 0x81, 0x9c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, 0x05, 0x96, 0x00, 0x1e, - 0x00, 0x62, 0x40, 0x3b, 0x07, 0x06, 0x0d, 0x00, 0x13, 0x18, 0x18, 0x06, - 0x15, 0x00, 0x04, 0x1f, 0x20, 0x16, 0x15, 0x5f, 0x59, 0x00, 0x16, 0x01, - 0x18, 0x03, 0x16, 0x16, 0x1b, 0x03, 0x1b, 0x10, 0x5f, 0x59, 0x1b, 0x13, - 0x03, 0x0a, 0x5f, 0x59, 0x30, 0x07, 0x40, 0x07, 0x02, 0x90, 0x07, 0xe0, - 0x07, 0x02, 0x07, 0x07, 0x03, 0x04, 0x80, 0x20, 0x01, 0x60, 0x20, 0x01, - 0x20, 0x20, 0x01, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x33, 0x2f, 0x5d, 0x71, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, - 0x2e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x36, 0x37, - 0x35, 0x21, 0x35, 0x21, 0x11, 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, 0x67, - 0x01, 0x70, 0x01, 0x4d, 0xea, 0x01, 0x24, 0x4f, 0xb6, 0x3c, 0xd3, 0x9d, - 0xf4, 0xfe, 0xfe, 0x01, 0x12, 0xf2, 0x8a, 0xef, 0x4a, 0xfe, 0x5b, 0x02, - 0x55, 0x70, 0xfe, 0xbb, 0xbe, 0xdd, 0xfe, 0xc0, 0xa9, 0x02, 0xc7, 0x01, - 0x57, 0x01, 0x78, 0x9e, 0xae, 0x36, 0x78, 0x6e, 0xfe, 0xd9, 0xfe, 0xf4, - 0xfe, 0xf5, 0xfe, 0xcb, 0x54, 0x48, 0xfe, 0xa0, 0xfe, 0x1a, 0x72, 0x7d, - 0xb0, 0x01, 0x4b, 0x00, 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x05, 0x81, 0x00, 0x0b, 0x00, 0x72, 0x40, 0x17, 0x07, 0x03, 0x03, 0x04, - 0x08, 0x00, 0x00, 0x0b, 0x04, 0x0b, 0x0c, 0x0d, 0x07, 0x02, 0x5f, 0x59, - 0x50, 0x07, 0x01, 0xe0, 0x07, 0x01, 0x07, 0xb8, 0xff, 0xe1, 0x40, 0x2e, - 0x13, 0x49, 0x79, 0x07, 0x89, 0x07, 0x02, 0x0f, 0x07, 0x01, 0x08, 0x07, - 0x07, 0x09, 0x05, 0x03, 0x04, 0x00, 0x12, 0x20, 0x0d, 0x01, 0xc0, 0x0d, - 0x01, 0xb0, 0x0d, 0x01, 0xa0, 0x0d, 0x01, 0x80, 0x0d, 0x01, 0x70, 0x0d, - 0x01, 0x60, 0x0d, 0x01, 0x50, 0x0d, 0x01, 0x20, 0x0d, 0x01, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x00, 0x3f, 0x32, 0x3f, 0x33, - 0x39, 0x2f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, - 0x04, 0x61, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0x02, 0x8d, 0xfd, - 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfa, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xbd, 0x00, 0x00, 0x01, 0x7c, 0x05, 0x81, 0x00, 0x03, - 0x00, 0x8c, 0x40, 0x61, 0x03, 0x00, 0x00, 0x04, 0x05, 0x01, 0x03, 0x00, - 0x12, 0x40, 0x05, 0x01, 0x30, 0x05, 0x01, 0x20, 0x05, 0x01, 0x10, 0x05, - 0x01, 0x00, 0x05, 0x01, 0x39, 0xf0, 0x05, 0x01, 0xb0, 0x05, 0x01, 0xa0, - 0x05, 0x01, 0x70, 0x05, 0x01, 0x60, 0x05, 0x01, 0x50, 0x05, 0x01, 0x40, - 0x05, 0x01, 0x00, 0x05, 0x01, 0xf0, 0x05, 0x01, 0xc0, 0x05, 0x01, 0xb0, - 0x05, 0x01, 0xa0, 0x05, 0x01, 0x50, 0x05, 0x01, 0x40, 0x05, 0x01, 0x10, - 0x05, 0x01, 0x00, 0x05, 0x01, 0xf0, 0x05, 0x01, 0xaf, 0x05, 0x01, 0x90, - 0x05, 0x01, 0x70, 0x05, 0x01, 0x60, 0x05, 0x01, 0x50, 0x05, 0x01, 0x40, - 0x05, 0x01, 0x20, 0x05, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, - 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, - 0x33, 0x11, 0xbd, 0xbf, 0x05, 0x81, 0xfa, 0x7f, 0x00, 0x01, 0x00, 0x20, - 0xff, 0xec, 0x03, 0x68, 0x05, 0x81, 0x00, 0x10, 0x00, 0x46, 0x40, 0x2a, - 0x03, 0x02, 0x09, 0x0e, 0x0e, 0x0b, 0x02, 0x03, 0x11, 0x12, 0x0c, 0x0b, - 0x5f, 0x59, 0x0c, 0x03, 0x00, 0x06, 0x5f, 0x59, 0x40, 0x03, 0x01, 0x03, - 0x03, 0x00, 0x13, 0x20, 0x12, 0x01, 0x60, 0x12, 0x01, 0x50, 0x12, 0x01, - 0x40, 0x12, 0x01, 0x20, 0x12, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x00, - 0x3f, 0x32, 0x2f, 0x5d, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x20, 0x03, 0x37, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x35, 0x21, 0x11, 0x14, - 0x06, 0x01, 0xc9, 0xfe, 0x9a, 0x43, 0xbb, 0x12, 0x7e, 0x5f, 0x68, 0x78, - 0xfe, 0xf1, 0x01, 0xcd, 0xde, 0x14, 0x01, 0x72, 0x1f, 0x74, 0x82, 0x8f, - 0x8a, 0x03, 0x45, 0x9c, 0xfc, 0x23, 0xcd, 0xeb, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x3f, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x34, 0x40, 0x1b, - 0x00, 0x0b, 0x08, 0x09, 0x07, 0x03, 0x03, 0x04, 0x0b, 0x09, 0x0a, 0x04, - 0x04, 0x0c, 0x0d, 0x0a, 0x07, 0x01, 0x02, 0x04, 0x04, 0x08, 0x05, 0x03, - 0x00, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, - 0x09, 0x01, 0x04, 0x52, 0xfd, 0xcd, 0xb8, 0xbf, 0xbf, 0x02, 0xa7, 0xe1, - 0xfd, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x8c, 0xfd, 0xe4, 0x05, 0x81, 0xfd, - 0x3e, 0x02, 0xc2, 0xfd, 0x9c, 0xfc, 0xe3, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0x2f, 0x05, 0x81, 0x00, 0x05, 0x00, 0x1f, 0x40, 0x0e, - 0x03, 0x00, 0x00, 0x04, 0x06, 0x07, 0x01, 0x03, 0x00, 0x03, 0x5f, 0x59, - 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0xa8, - 0xbf, 0x02, 0xc8, 0x05, 0x81, 0xfb, 0x1b, 0x9c, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x06, 0x02, 0x05, 0x81, 0x00, 0x1a, 0x01, 0x52, 0x40, 0xef, - 0x18, 0x00, 0x1a, 0x10, 0x0d, 0x0e, 0x1a, 0x0e, 0x1c, 0x1b, 0x03, 0x0a, - 0x18, 0x0a, 0x0f, 0x03, 0x00, 0x07, 0x14, 0x03, 0x0e, 0x12, 0x90, 0x1c, - 0x01, 0x84, 0x1c, 0x01, 0x70, 0x1c, 0x01, 0x64, 0x1c, 0x01, 0x44, 0x1c, - 0x01, 0x34, 0x1c, 0x01, 0x20, 0x1c, 0x01, 0x14, 0x1c, 0x01, 0xf4, 0x1c, - 0x01, 0xd0, 0x1c, 0x01, 0xc4, 0x1c, 0x01, 0xa4, 0x1c, 0x01, 0x84, 0x1c, - 0x01, 0x74, 0x1c, 0x01, 0x60, 0x1c, 0x01, 0x54, 0x1c, 0x01, 0x34, 0x1c, - 0x01, 0x10, 0x1c, 0x01, 0x04, 0x1c, 0x01, 0x67, 0xe4, 0x1c, 0x01, 0xc4, - 0x1c, 0x01, 0xb4, 0x1c, 0x01, 0x94, 0x1c, 0x01, 0x74, 0x1c, 0x01, 0x50, - 0x1c, 0x01, 0x44, 0x1c, 0x01, 0x24, 0x1c, 0x01, 0x04, 0x1c, 0x01, 0xf4, - 0x1c, 0x01, 0xd4, 0x1c, 0x01, 0xb4, 0x1c, 0x01, 0x84, 0x1c, 0x01, 0x64, - 0x1c, 0x01, 0x44, 0x1c, 0x01, 0x34, 0x1c, 0x01, 0x14, 0x1c, 0x01, 0xf4, - 0x1c, 0x01, 0xc4, 0x1c, 0x01, 0xa4, 0x1c, 0x01, 0x8b, 0x1c, 0x01, 0x74, - 0x1c, 0x01, 0x54, 0x1c, 0x01, 0x34, 0x1c, 0x01, 0x04, 0x1c, 0x01, 0x37, - 0xe4, 0x1c, 0x01, 0xcb, 0x1c, 0x01, 0xb4, 0x1c, 0x01, 0x94, 0x1c, 0x01, - 0x74, 0x1c, 0x01, 0x44, 0x1c, 0x01, 0x24, 0x1c, 0x01, 0x0b, 0x1c, 0x01, - 0xf4, 0x1c, 0x01, 0xd4, 0x1c, 0x01, 0xbb, 0x1c, 0x01, 0x84, 0x1c, 0x01, - 0x64, 0x1c, 0x01, 0x4b, 0x1c, 0x01, 0x34, 0x1c, 0x01, 0x14, 0x1c, 0x01, - 0xfb, 0x1c, 0x01, 0xe4, 0x1c, 0x01, 0xc4, 0x1c, 0x01, 0xa4, 0x1c, 0x01, - 0x80, 0x1c, 0x01, 0x02, 0x70, 0x1c, 0x01, 0x50, 0x1c, 0x01, 0x40, 0x1c, - 0x01, 0x3f, 0x1c, 0x01, 0x20, 0x1c, 0x01, 0x00, 0x1c, 0x01, 0x07, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x00, 0x3f, 0x17, 0x33, 0x3f, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x21, 0x11, 0x34, 0x37, 0x06, 0x07, 0x01, 0x23, 0x01, 0x2f, 0x01, 0x1f, - 0x01, 0x11, 0x23, 0x11, 0x33, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, - 0x01, 0x33, 0x11, 0x05, 0x56, 0x09, 0x31, 0x27, 0xfe, 0x94, 0x86, 0xfe, - 0x8f, 0x38, 0x21, 0x03, 0x04, 0xaa, 0xfb, 0x01, 0x77, 0x14, 0x25, 0x06, - 0x08, 0x33, 0x09, 0x01, 0x70, 0xf5, 0x03, 0xac, 0x9c, 0x90, 0xb3, 0x65, - 0xfc, 0x40, 0x03, 0xc0, 0xaa, 0x6e, 0x6f, 0xbd, 0xfc, 0x54, 0x05, 0x81, - 0xfc, 0x2f, 0x3b, 0x87, 0x1e, 0x28, 0xa3, 0x15, 0x03, 0xd1, 0xfa, 0x7f, - 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x05, 0x81, 0x00, 0x0d, - 0x00, 0x50, 0x40, 0x2f, 0x00, 0x0a, 0x0a, 0x0d, 0x07, 0x04, 0x04, 0x05, - 0x0d, 0x05, 0x0f, 0x0e, 0x0b, 0x01, 0x06, 0x03, 0x08, 0x00, 0x05, 0x12, - 0x20, 0x0f, 0x01, 0xc0, 0x0f, 0x01, 0xb0, 0x0f, 0x01, 0xa0, 0x0f, 0x01, - 0x80, 0x0f, 0x01, 0x70, 0x0f, 0x01, 0x60, 0x0f, 0x01, 0x50, 0x0f, 0x01, - 0x20, 0x0f, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, - 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x01, - 0x1f, 0x01, 0x11, 0x23, 0x11, 0x33, 0x01, 0x26, 0x35, 0x11, 0x33, 0x11, - 0x04, 0x3a, 0xfd, 0x0e, 0x05, 0x05, 0xaa, 0xde, 0x02, 0xfa, 0x0c, 0xac, - 0x04, 0xb0, 0x61, 0xa7, 0xfc, 0x58, 0x05, 0x81, 0xfb, 0x48, 0xc4, 0x58, - 0x03, 0x9c, 0xfa, 0x7f, 0x00, 0x02, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x05, 0x96, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x30, 0x40, 0x1a, 0x15, 0x08, - 0x0f, 0x00, 0x08, 0x00, 0x1b, 0x1c, 0x0b, 0x12, 0x5f, 0x59, 0x0b, 0x04, - 0x04, 0x18, 0x5f, 0x59, 0x04, 0x13, 0x80, 0x1c, 0x01, 0x20, 0x1c, 0x01, - 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, - 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, 0x07, - 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x05, - 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, 0xc5, 0xa6, 0x01, 0x72, 0x01, - 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xc3, 0xfe, 0xf9, 0xf0, 0xf2, 0xfe, 0xf8, - 0x01, 0x0b, 0xed, 0xf4, 0x01, 0x05, 0x02, 0xc7, 0xdd, 0xfe, 0xb4, 0xb2, - 0xb0, 0x01, 0x4d, 0xde, 0x01, 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, 0xde, - 0x01, 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, 0xf5, 0xfe, 0xf7, 0xfe, 0xc9, - 0x01, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, - 0x05, 0x81, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x3c, 0x40, 0x20, 0x0f, 0x05, - 0x05, 0x06, 0x0b, 0x00, 0x06, 0x00, 0x12, 0x13, 0x0f, 0x04, 0x5f, 0x59, - 0x0f, 0x0f, 0x05, 0x07, 0x07, 0x0e, 0x5f, 0x59, 0x07, 0x03, 0x05, 0x12, - 0x20, 0x13, 0x01, 0x20, 0x13, 0x01, 0x5d, 0x71, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, - 0x21, 0x11, 0x23, 0x11, 0x21, 0x32, 0x04, 0x07, 0x10, 0x29, 0x01, 0x11, - 0x21, 0x20, 0x04, 0xea, 0xfe, 0xfb, 0xe0, 0xfe, 0x62, 0xbf, 0x02, 0x51, - 0xed, 0x01, 0x04, 0xc0, 0xfe, 0xb8, 0xfe, 0x85, 0x01, 0x83, 0x01, 0x40, - 0x03, 0xd9, 0xc8, 0xec, 0xfd, 0xdb, 0x05, 0x81, 0xde, 0xcc, 0x01, 0x11, - 0xfd, 0xd4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xfe, 0x7d, 0x05, 0xd7, - 0x05, 0x96, 0x00, 0x18, 0x00, 0x24, 0x00, 0x3f, 0x40, 0x24, 0x1f, 0x12, - 0x19, 0x00, 0x00, 0x08, 0x03, 0x0e, 0x12, 0x05, 0x25, 0x26, 0x15, 0x1c, - 0x5f, 0x59, 0x15, 0x04, 0x0e, 0x22, 0x5f, 0x59, 0x03, 0x0e, 0x13, 0x0b, - 0x06, 0x5f, 0x59, 0x0b, 0x80, 0x26, 0x01, 0x20, 0x26, 0x01, 0x5d, 0x5d, - 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x10, 0x00, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, - 0x26, 0x27, 0x26, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, - 0x07, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, - 0x05, 0xd7, 0xfe, 0xd4, 0xfe, 0xf5, 0x29, 0x85, 0x66, 0x37, 0x3c, 0x5d, - 0x55, 0x97, 0xc3, 0x3e, 0xc6, 0xfe, 0xe1, 0x97, 0x01, 0x72, 0x01, 0x4a, - 0xd7, 0x01, 0x3c, 0xa7, 0xc3, 0xfe, 0xf9, 0xf0, 0xf2, 0xfe, 0xf8, 0x01, - 0x0b, 0xed, 0xf4, 0x01, 0x05, 0x02, 0xc7, 0xfe, 0xd6, 0xfe, 0x80, 0x23, - 0x7e, 0x70, 0x0d, 0x86, 0x16, 0xab, 0xc8, 0x0a, 0xb5, 0x01, 0x43, 0xd5, - 0x01, 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, 0xde, 0x01, 0x07, 0x01, 0x2c, - 0xfe, 0xd8, 0xfe, 0xf5, 0xfe, 0xf7, 0xfe, 0xc9, 0x01, 0x2d, 0x00, 0x00, - 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x68, 0x05, 0x81, 0x00, 0x0d, - 0x00, 0x16, 0x00, 0x57, 0x40, 0x2f, 0x01, 0x0c, 0x0c, 0x13, 0x09, 0x13, - 0x03, 0x03, 0x04, 0x0e, 0x09, 0x00, 0x0d, 0x0d, 0x09, 0x04, 0x03, 0x17, - 0x18, 0x0c, 0x02, 0x13, 0x02, 0x5f, 0x59, 0x13, 0x13, 0x00, 0x05, 0x05, - 0x12, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x00, 0x12, 0x80, 0x18, 0x01, 0x70, - 0x18, 0x01, 0x20, 0x18, 0x01, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x32, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x01, 0x21, 0x11, 0x23, - 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x03, 0x34, 0x26, - 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, 0x8c, 0xfe, 0x92, 0xfe, 0x49, - 0xbf, 0x02, 0x97, 0xee, 0x01, 0x03, 0xb7, 0xa1, 0x01, 0x90, 0xf8, 0xa7, - 0x9d, 0xfe, 0x3b, 0x01, 0xcd, 0x97, 0xa5, 0x02, 0x49, 0xfd, 0xb7, 0x05, - 0x81, 0xd5, 0xbe, 0x9d, 0xd6, 0x1c, 0xfd, 0xa1, 0x03, 0xec, 0x7b, 0x81, - 0xfd, 0xf8, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, - 0x05, 0x96, 0x00, 0x2d, 0x00, 0x8e, 0x40, 0x1f, 0x0c, 0x00, 0x1d, 0x1c, - 0x23, 0x16, 0x06, 0x05, 0x05, 0x16, 0x1c, 0x00, 0x04, 0x2f, 0x2e, 0x0c, - 0x10, 0x13, 0x16, 0x48, 0x49, 0x0c, 0x59, 0x0c, 0x69, 0x0c, 0x03, 0x0f, - 0x0c, 0x01, 0x23, 0xb8, 0xff, 0xf0, 0x40, 0x39, 0x13, 0x16, 0x48, 0x46, - 0x23, 0x56, 0x23, 0x66, 0x23, 0x03, 0x0d, 0x23, 0x01, 0x0c, 0x04, 0x0c, - 0x23, 0x03, 0x19, 0x19, 0x20, 0x5f, 0x59, 0x6f, 0x1d, 0x01, 0x59, 0x1d, - 0x01, 0x4b, 0x1d, 0x01, 0x03, 0x00, 0x1d, 0x01, 0x09, 0x05, 0x1d, 0x19, - 0x04, 0x03, 0x09, 0x5f, 0x59, 0x60, 0x06, 0x01, 0x52, 0x06, 0x01, 0x44, - 0x06, 0x01, 0x06, 0x03, 0x13, 0x00, 0x3f, 0x33, 0x5d, 0x5d, 0x5d, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x5d, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x21, 0x20, 0x03, 0x37, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, - 0x34, 0x24, 0x21, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x1e, 0x01, 0x17, 0x1e, 0x05, 0x04, 0xf8, 0xfe, 0xcf, 0xfe, - 0xeb, 0xfd, 0xfd, 0x52, 0xb9, 0x20, 0xd0, 0xb3, 0xb9, 0xc9, 0x3f, 0x72, - 0x9e, 0x60, 0xa7, 0xad, 0x64, 0x35, 0x01, 0x15, 0x01, 0x02, 0xf0, 0xfe, - 0x33, 0xbc, 0x1f, 0xae, 0x9a, 0xa9, 0xb2, 0x45, 0x82, 0xc2, 0x41, 0x81, - 0x76, 0x67, 0x4c, 0x2b, 0x01, 0x85, 0xc3, 0xd6, 0x01, 0x66, 0x25, 0x7f, - 0x77, 0x7f, 0x7b, 0x45, 0x56, 0x38, 0x26, 0x16, 0x25, 0x4a, 0x5b, 0x7a, - 0x4f, 0xb5, 0xc4, 0x93, 0xb1, 0x21, 0x70, 0x65, 0x70, 0x6f, 0x41, 0x55, - 0x3b, 0x2b, 0x0f, 0x1f, 0x2b, 0x3a, 0x54, 0x72, 0x00, 0x01, 0x00, 0x2e, - 0x00, 0x00, 0x04, 0xb4, 0x05, 0x81, 0x00, 0x07, 0x01, 0x30, 0x40, 0xd9, - 0x01, 0x02, 0x04, 0x02, 0x07, 0x03, 0x09, 0x08, 0x00, 0x04, 0x05, 0x04, - 0x5f, 0x59, 0x05, 0x03, 0x01, 0x12, 0x7b, 0x09, 0x01, 0x4b, 0x09, 0x01, - 0x3b, 0x09, 0x01, 0x24, 0x09, 0x01, 0xfb, 0x09, 0x01, 0xcb, 0x09, 0x01, - 0xbb, 0x09, 0x01, 0x9b, 0x09, 0x01, 0x8b, 0x09, 0x01, 0x7f, 0x09, 0x01, - 0x02, 0x5f, 0x09, 0x01, 0x4f, 0x09, 0x01, 0x30, 0x09, 0x01, 0x0f, 0x09, - 0x01, 0x67, 0xdf, 0x09, 0x01, 0xcf, 0x09, 0x01, 0xb0, 0x09, 0x01, 0x8f, - 0x09, 0x01, 0x5f, 0x09, 0x01, 0x4f, 0x09, 0x01, 0x0f, 0x09, 0x01, 0xf0, - 0x09, 0x01, 0xdf, 0x09, 0x01, 0xcf, 0x09, 0x01, 0xaf, 0x09, 0x01, 0x9f, - 0x09, 0x01, 0x70, 0x09, 0x01, 0x5f, 0x09, 0x01, 0x40, 0x09, 0x01, 0x1f, - 0x09, 0x01, 0xef, 0x09, 0x01, 0xdf, 0x09, 0x01, 0x9f, 0x09, 0x01, 0x6f, - 0x09, 0x01, 0x5f, 0x09, 0x01, 0x3f, 0x09, 0x01, 0x1f, 0x09, 0x01, 0x00, - 0x09, 0x01, 0x37, 0xef, 0x09, 0x01, 0xd0, 0x09, 0x01, 0x90, 0x09, 0x01, - 0x80, 0x09, 0x01, 0x6f, 0x09, 0x01, 0x50, 0x09, 0x01, 0x2f, 0x09, 0x01, - 0x00, 0x09, 0x01, 0xd0, 0x09, 0x01, 0xaf, 0x09, 0x01, 0x90, 0x09, 0x01, - 0x7f, 0x09, 0x01, 0x6f, 0x09, 0x01, 0x50, 0x09, 0x01, 0x40, 0x09, 0x01, - 0x20, 0x09, 0x01, 0x10, 0x09, 0x01, 0xff, 0x09, 0x01, 0xe0, 0x09, 0x01, - 0xbf, 0x09, 0x01, 0xa0, 0x09, 0x01, 0x90, 0x09, 0x01, 0x60, 0x09, 0x01, - 0x40, 0x09, 0x01, 0x3f, 0x09, 0x01, 0x20, 0x09, 0x01, 0x0f, 0x09, 0x01, - 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x02, 0xd0, - 0xbe, 0xfe, 0x1c, 0x04, 0x86, 0x04, 0xe5, 0xfb, 0x1b, 0x04, 0xe5, 0x9c, - 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x05, 0x81, 0x00, 0x13, 0x00, 0x49, 0x40, 0x2c, 0x0d, 0x10, 0x07, 0x04, - 0x10, 0x04, 0x15, 0x14, 0x0e, 0x05, 0x03, 0x00, 0x0a, 0x5f, 0x59, 0x00, - 0x13, 0x20, 0x15, 0x01, 0xc0, 0x15, 0x01, 0xb0, 0x15, 0x01, 0xa0, 0x15, - 0x01, 0x80, 0x15, 0x01, 0x70, 0x15, 0x01, 0x60, 0x15, 0x01, 0x50, 0x15, - 0x01, 0x20, 0x15, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x24, 0x26, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x06, 0x04, 0x02, 0xdb, 0xad, 0xfe, 0xfe, 0x8e, 0xbf, 0xc4, 0xb9, - 0xbe, 0xd3, 0xbe, 0x91, 0xfe, 0xf7, 0x14, 0x7e, 0xf0, 0xa6, 0x03, 0x81, - 0xfc, 0x8f, 0xc1, 0xc8, 0xcf, 0xc7, 0x03, 0x64, 0xfc, 0x91, 0xab, 0xf8, - 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x05, 0x4d, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x3e, 0x40, 0x26, 0x07, 0x08, 0x01, 0x00, - 0x05, 0x03, 0x02, 0x02, 0x05, 0x08, 0x03, 0x0a, 0x09, 0x20, 0x0a, 0x50, - 0x0a, 0x02, 0x30, 0x0a, 0x60, 0x0a, 0x90, 0x0a, 0xc0, 0x0a, 0xf0, 0x0a, - 0x05, 0x2f, 0x0a, 0x01, 0x07, 0x02, 0x03, 0x05, 0x01, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x33, 0x01, 0x5d, 0x5d, 0x71, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x33, - 0x01, 0x17, 0x37, 0x01, 0x33, 0x03, 0x0e, 0xc6, 0xfd, 0xc1, 0xc9, 0x01, - 0x86, 0x54, 0x54, 0x01, 0x84, 0xc9, 0x05, 0x81, 0xfc, 0x20, 0xf9, 0xf9, - 0x03, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x07, 0x86, - 0x05, 0x81, 0x00, 0x19, 0x01, 0xfc, 0x40, 0xff, 0x18, 0x19, 0x08, 0x01, - 0x01, 0x01, 0x00, 0x14, 0x07, 0x11, 0x01, 0x08, 0x10, 0x01, 0x11, 0x10, - 0x04, 0x08, 0x07, 0x07, 0x01, 0x0b, 0x03, 0x07, 0x0d, 0x0a, 0x09, 0x09, - 0x0d, 0x04, 0x14, 0x19, 0x05, 0x1b, 0x1a, 0x8b, 0x1b, 0x01, 0x1b, 0xc0, - 0x7c, 0x7f, 0x48, 0x39, 0x1b, 0x01, 0x2a, 0x1b, 0x01, 0x19, 0x1b, 0x01, - 0x0a, 0x1b, 0x01, 0xf9, 0x1b, 0x01, 0xea, 0x1b, 0x01, 0xd9, 0x1b, 0x01, - 0xca, 0x1b, 0x01, 0xb8, 0x1b, 0x01, 0x89, 0x1b, 0x99, 0x1b, 0xa9, 0x1b, - 0x03, 0x78, 0x1b, 0x01, 0x69, 0x1b, 0x01, 0x3a, 0x1b, 0x4a, 0x1b, 0x5a, - 0x1b, 0x03, 0x29, 0x1b, 0x01, 0x1a, 0x1b, 0x01, 0x0c, 0x1b, 0x01, 0x68, - 0xfd, 0x1b, 0x01, 0xec, 0x1b, 0x01, 0xdd, 0x1b, 0x01, 0xcc, 0x1b, 0x01, - 0xbd, 0x1b, 0x01, 0xab, 0x1b, 0x01, 0x9c, 0x1b, 0x01, 0x8b, 0x1b, 0x01, - 0x7c, 0x1b, 0x01, 0x6b, 0x1b, 0x01, 0x5c, 0x1b, 0x01, 0x4b, 0x1b, 0x01, - 0x3c, 0x1b, 0x01, 0x2b, 0x1b, 0x01, 0x1c, 0x1b, 0x01, 0x0b, 0x1b, 0x01, - 0xfc, 0x1b, 0x01, 0xeb, 0x1b, 0x01, 0xdc, 0x1b, 0x01, 0xcb, 0x1b, 0x01, - 0xbc, 0x1b, 0x01, 0xab, 0x1b, 0x01, 0x9c, 0x1b, 0x01, 0x00, 0x8d, 0x1b, - 0x01, 0x7f, 0x1b, 0x01, 0x6d, 0x1b, 0x01, 0x5f, 0x1b, 0x01, 0x4d, 0x1b, - 0x01, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, 0x1d, 0x1b, 0x01, 0x0f, 0x1b, 0x01, - 0xfd, 0x1b, 0x01, 0xef, 0x1b, 0x01, 0xdd, 0x1b, 0x01, 0xcf, 0x1b, 0x01, - 0xbd, 0x1b, 0x01, 0xaf, 0x1b, 0x01, 0x9d, 0x1b, 0x01, 0x8f, 0x1b, 0x01, - 0x6d, 0x1b, 0x7d, 0x1b, 0x02, 0x5b, 0x1b, 0x01, 0x4d, 0x1b, 0x01, 0x3b, - 0x1b, 0x01, 0x2d, 0x1b, 0x01, 0x1b, 0x1b, 0x01, 0x0d, 0x1b, 0x01, 0x38, - 0xfb, 0x1b, 0x01, 0xed, 0x1b, 0x01, 0xdb, 0x1b, 0x01, 0xcd, 0x1b, 0x40, - 0x6f, 0x01, 0xbb, 0x1b, 0x01, 0xad, 0x1b, 0x01, 0x9b, 0x1b, 0x01, 0x8d, - 0x1b, 0x01, 0x7b, 0x1b, 0x01, 0x6d, 0x1b, 0x01, 0x4b, 0x1b, 0x5b, 0x1b, - 0x02, 0x39, 0x1b, 0x01, 0x2b, 0x1b, 0x01, 0x19, 0x1b, 0x01, 0x0b, 0x1b, - 0x01, 0xf9, 0x1b, 0x01, 0xeb, 0x1b, 0x01, 0xdd, 0x1b, 0x01, 0xcb, 0x1b, - 0x01, 0xbd, 0x1b, 0x01, 0xab, 0x1b, 0x01, 0x9d, 0x1b, 0x01, 0x8b, 0x1b, - 0x01, 0x7d, 0x1b, 0x01, 0x6b, 0x1b, 0x01, 0x5d, 0x1b, 0x01, 0x4b, 0x1b, - 0x01, 0x3d, 0x1b, 0x01, 0x01, 0x2b, 0x1b, 0x01, 0x1f, 0x1b, 0x01, 0x02, - 0x5f, 0x1b, 0x7f, 0x1b, 0x9f, 0x1b, 0xbf, 0x1b, 0xdf, 0x1b, 0xff, 0x1b, - 0x06, 0x00, 0x1b, 0x01, 0x08, 0x18, 0x10, 0x04, 0x09, 0x03, 0x14, 0x0d, - 0x0d, 0x01, 0x08, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x11, 0x33, 0x3f, 0x33, - 0x33, 0x33, 0x01, 0x5e, 0x5d, 0x5d, 0x5f, 0x71, 0x71, 0x5f, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x2b, 0x71, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x5f, 0x5e, 0x5d, 0x33, 0x11, 0x33, 0x33, - 0x5d, 0x5d, 0x11, 0x33, 0x33, 0x5d, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x03, 0x26, 0x27, 0x0e, 0x01, 0x03, 0x23, 0x01, 0x33, 0x13, 0x16, 0x17, - 0x36, 0x12, 0x13, 0x33, 0x13, 0x16, 0x17, 0x37, 0x3e, 0x01, 0x01, 0x33, - 0x05, 0xe7, 0xe4, 0xf4, 0x18, 0x2e, 0x1a, 0x24, 0xff, 0xe4, 0xfe, 0x61, - 0xc7, 0xfd, 0x2d, 0x26, 0x18, 0x3f, 0xf6, 0xb7, 0xf5, 0x38, 0x20, 0x09, - 0x1b, 0x22, 0x01, 0x08, 0xc7, 0x03, 0x7f, 0x54, 0xd9, 0x74, 0x9c, 0xfc, - 0x64, 0x05, 0x81, 0xfc, 0x81, 0xa8, 0xb2, 0x6e, 0x01, 0x04, 0x03, 0x67, - 0xfc, 0x93, 0xd7, 0x95, 0x23, 0x73, 0x91, 0x03, 0xb2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x2b, 0x05, 0x81, 0x00, 0x0b, - 0x01, 0x08, 0x40, 0xc5, 0x08, 0x09, 0x06, 0x05, 0x02, 0x03, 0x00, 0x0b, - 0x03, 0x05, 0x04, 0x0a, 0x09, 0x0b, 0x06, 0x0d, 0x0c, 0x1b, 0x0d, 0x4b, - 0x0d, 0x02, 0x8b, 0x0d, 0xbb, 0x0d, 0xeb, 0x0d, 0x03, 0x04, 0x0d, 0x14, - 0x0d, 0x34, 0x0d, 0x44, 0x0d, 0x04, 0x6a, 0x54, 0x0d, 0x64, 0x0d, 0x84, - 0x0d, 0x94, 0x0d, 0xb4, 0x0d, 0xc4, 0x0d, 0xe4, 0x0d, 0xf4, 0x0d, 0x08, - 0x3b, 0x0d, 0x01, 0x24, 0x0d, 0x01, 0x0b, 0x0d, 0x01, 0xf4, 0x0d, 0x01, - 0xdb, 0x0d, 0x01, 0xc4, 0x0d, 0x01, 0xab, 0x0d, 0x01, 0x94, 0x0d, 0x01, - 0x7b, 0x0d, 0x01, 0x64, 0x0d, 0x01, 0x30, 0x0d, 0x01, 0x24, 0x0d, 0x01, - 0x00, 0x0d, 0x01, 0xf4, 0x0d, 0x01, 0xd0, 0x0d, 0x01, 0xc4, 0x0d, 0x01, - 0xa0, 0x0d, 0x01, 0x94, 0x0d, 0x01, 0x70, 0x0d, 0x01, 0x64, 0x0d, 0x01, - 0x40, 0x0d, 0x01, 0x34, 0x0d, 0x01, 0x10, 0x0d, 0x01, 0x04, 0x0d, 0x01, - 0x39, 0xe0, 0x0d, 0x01, 0xd4, 0x0d, 0x01, 0xb0, 0x0d, 0x01, 0xa4, 0x0d, - 0x01, 0x80, 0x0d, 0x01, 0x14, 0x0d, 0x44, 0x0d, 0x74, 0x0d, 0x03, 0x24, - 0x0d, 0x54, 0x0d, 0x84, 0x0d, 0xb4, 0x0d, 0xe4, 0x0d, 0x05, 0x54, 0x0d, - 0x64, 0x0d, 0x94, 0x0d, 0xf4, 0x0d, 0x04, 0x40, 0x0d, 0x01, 0x02, 0x00, - 0x0d, 0x30, 0x0d, 0x02, 0x77, 0x07, 0x01, 0x78, 0x01, 0x01, 0x01, 0x04, - 0x0a, 0x07, 0x04, 0x08, 0x05, 0x03, 0x03, 0x00, 0x12, 0x00, 0x3f, 0x32, - 0x3f, 0x33, 0x17, 0x39, 0x5d, 0x5d, 0x01, 0x5d, 0x5f, 0x5d, 0x5d, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x71, - 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, - 0x09, 0x01, 0x04, 0x58, 0xfe, 0x59, 0xfe, 0x50, 0xd3, 0x02, 0x18, 0xfe, - 0x11, 0xd3, 0x01, 0x88, 0x01, 0x7d, 0xd3, 0xfe, 0x1e, 0x02, 0x0b, 0x02, - 0x68, 0xfd, 0x98, 0x02, 0xdc, 0x02, 0xa5, 0xfd, 0xd7, 0x02, 0x29, 0xfd, - 0x62, 0xfd, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, - 0x05, 0x81, 0x00, 0x08, 0x01, 0xb0, 0x40, 0xff, 0x06, 0x01, 0x01, 0x02, - 0x02, 0x04, 0x07, 0x08, 0x05, 0x04, 0x08, 0x04, 0x0a, 0x09, 0x06, 0x00, - 0x03, 0x08, 0x03, 0x18, 0x03, 0x48, 0x03, 0x03, 0x0c, 0x03, 0x01, 0x08, - 0x04, 0x03, 0x01, 0x12, 0x76, 0x0a, 0x01, 0x62, 0x0a, 0x01, 0x54, 0x0a, - 0x01, 0x46, 0x0a, 0x01, 0x36, 0x0a, 0x01, 0x24, 0x0a, 0x01, 0x16, 0x0a, - 0x01, 0x04, 0x0a, 0x01, 0xf2, 0x0a, 0x01, 0x01, 0xe0, 0x0a, 0x01, 0xd0, - 0x0a, 0x01, 0xc4, 0x0a, 0x01, 0xb0, 0x0a, 0x01, 0xa0, 0x0a, 0x01, 0x94, - 0x0a, 0x01, 0x70, 0x0a, 0x01, 0x64, 0x0a, 0x01, 0x40, 0x0a, 0x01, 0x34, - 0x0a, 0x01, 0x24, 0x0a, 0x01, 0x14, 0x0a, 0x01, 0x00, 0x0a, 0x01, 0x69, - 0xf4, 0x0a, 0x01, 0xe4, 0x0a, 0x01, 0xd0, 0x0a, 0x01, 0xc4, 0x0a, 0x01, - 0xb4, 0x0a, 0x01, 0xa4, 0x0a, 0x01, 0x90, 0x0a, 0x01, 0x80, 0x0a, 0x01, - 0x74, 0x0a, 0x01, 0x60, 0x0a, 0x01, 0x50, 0x0a, 0x01, 0x44, 0x0a, 0x01, - 0x20, 0x0a, 0x01, 0x14, 0x0a, 0x01, 0x04, 0x0a, 0x01, 0xf4, 0x0a, 0x01, - 0xe0, 0x0a, 0x01, 0xd4, 0x0a, 0x01, 0xc4, 0x0a, 0x01, 0xb0, 0x0a, 0x01, - 0xa4, 0x0a, 0x01, 0x94, 0x0a, 0x01, 0x74, 0x0a, 0x01, 0x64, 0x0a, 0x01, - 0x54, 0x0a, 0x01, 0x40, 0x0a, 0x01, 0x30, 0x0a, 0x01, 0x24, 0x0a, 0x01, - 0x00, 0x0a, 0x01, 0xf4, 0x0a, 0x01, 0xc4, 0x0a, 0x01, 0x90, 0x0a, 0x01, - 0x84, 0x0a, 0x01, 0x74, 0x0a, 0x01, 0x54, 0x0a, 0x01, 0x44, 0x0a, 0x01, - 0x24, 0x0a, 0x01, 0x14, 0x0a, 0x01, 0x04, 0x0a, 0x01, 0x39, 0xe0, 0x0a, - 0x01, 0xd4, 0x0a, 0x01, 0xa4, 0x0a, 0x01, 0x84, 0x0a, 0x01, 0x70, 0x0a, - 0x01, 0x64, 0x0a, 0x01, 0x54, 0x0a, 0x01, 0x34, 0x0a, 0x01, 0x24, 0x0a, - 0x01, 0x04, 0x0a, 0x01, 0xf4, 0x0a, 0x01, 0xe4, 0x0a, 0x01, 0xc0, 0x40, - 0x33, 0x0a, 0x01, 0xb4, 0x0a, 0x01, 0x90, 0x0a, 0x01, 0x84, 0x0a, 0x01, - 0x54, 0x0a, 0x01, 0x34, 0x0a, 0x01, 0x14, 0x0a, 0x01, 0x04, 0x0a, 0x01, - 0xe4, 0x0a, 0x01, 0xd4, 0x0a, 0x01, 0xbb, 0x0a, 0x01, 0xa4, 0x0a, 0x01, - 0x70, 0x0a, 0x01, 0x02, 0x60, 0x0a, 0x01, 0x30, 0x0a, 0x01, 0x2f, 0x0a, - 0x01, 0x0f, 0x0a, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x5e, 0x5d, 0x11, 0x33, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, - 0x09, 0x01, 0x33, 0x03, 0x09, 0xbe, 0xfd, 0xe2, 0xd2, 0x01, 0xad, 0x01, - 0xab, 0xd2, 0x02, 0x48, 0xfd, 0xb8, 0x02, 0x48, 0x03, 0x39, 0xfd, 0x61, - 0x02, 0x9f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x04, 0xa3, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x4a, 0x40, 0x2b, 0x08, 0x02, 0x03, 0x07, - 0x09, 0x07, 0x04, 0x02, 0x04, 0x0a, 0x0b, 0x07, 0x03, 0x04, 0x05, 0x04, - 0x5f, 0x59, 0x05, 0x03, 0x02, 0x08, 0x01, 0x08, 0x5f, 0x59, 0x01, 0x12, - 0x80, 0x0b, 0x01, 0x70, 0x0b, 0x01, 0x60, 0x0b, 0x01, 0x50, 0x0b, 0x01, - 0x40, 0x0b, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x35, 0x01, - 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x04, 0xa3, 0xfb, 0x9e, 0x03, 0x5a, - 0xfc, 0xef, 0x03, 0xea, 0xfc, 0xa6, 0x03, 0x89, 0x8f, 0x04, 0x56, 0x9c, - 0x8b, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0x00, 0x92, 0xfe, 0x57, 0x02, 0x29, - 0x05, 0xcc, 0x00, 0x07, 0x00, 0x26, 0x40, 0x14, 0x05, 0x00, 0x06, 0x03, - 0x00, 0x03, 0x08, 0x09, 0x01, 0x04, 0xf5, 0x59, 0x01, 0x00, 0x00, 0x05, - 0xf5, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x21, 0x15, - 0x23, 0x11, 0x33, 0x15, 0x92, 0x01, 0x97, 0xe9, 0xe9, 0xfe, 0x57, 0x07, - 0x75, 0x81, 0xf9, 0x8d, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0xff, 0xec, 0x02, 0x39, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x13, 0xb7, 0x03, - 0x05, 0x01, 0x04, 0x01, 0x00, 0x00, 0x13, 0x00, 0x3f, 0x3f, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x01, 0x33, 0x01, 0x01, 0x97, 0xfe, - 0x69, 0x9e, 0x01, 0x9b, 0x14, 0x05, 0xe0, 0xfa, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x10, 0xfe, 0x57, 0x01, 0xa7, 0x05, 0xcc, 0x00, 0x07, - 0x00, 0x26, 0x40, 0x14, 0x02, 0x07, 0x04, 0x01, 0x07, 0x03, 0x09, 0x08, - 0x05, 0x04, 0xf5, 0x59, 0x05, 0x00, 0x00, 0x01, 0xf5, 0x59, 0x00, 0x1b, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, - 0x10, 0xe9, 0xe9, 0x01, 0x97, 0xfe, 0x57, 0x81, 0x06, 0x73, 0x81, 0xf8, - 0x8b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x02, 0xa1, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x06, 0x01, 0x37, 0x40, 0x6f, 0x05, 0x04, 0x01, 0x00, - 0x06, 0x02, 0x03, 0x03, 0x01, 0x06, 0x03, 0x08, 0x07, 0x03, 0x04, 0x03, - 0x09, 0x08, 0x19, 0x08, 0x29, 0x08, 0x69, 0x08, 0xc9, 0x08, 0xd9, 0x08, - 0x06, 0x16, 0x06, 0x08, 0x01, 0x7e, 0x46, 0x08, 0x56, 0x08, 0xa6, 0x08, - 0x03, 0x86, 0x08, 0x96, 0x08, 0xf6, 0x08, 0x03, 0x06, 0x08, 0x16, 0x08, - 0x56, 0x08, 0x66, 0x08, 0xb6, 0x08, 0xc6, 0x08, 0x06, 0x4e, 0x26, 0x08, - 0x36, 0x08, 0x66, 0x08, 0x86, 0x08, 0x96, 0x08, 0xa6, 0x08, 0xd6, 0x08, - 0xe6, 0x08, 0x08, 0x36, 0x08, 0x76, 0x08, 0x86, 0x08, 0x96, 0x08, 0xe6, - 0x08, 0xf6, 0x08, 0x06, 0x06, 0x08, 0x16, 0x08, 0x46, 0x08, 0x56, 0x08, - 0x86, 0x08, 0x96, 0x08, 0xa6, 0x08, 0xc6, 0x08, 0x08, 0x08, 0x08, 0xb8, - 0xff, 0xc0, 0xb3, 0x48, 0x4b, 0x48, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x4c, - 0x42, 0x45, 0x48, 0x04, 0x08, 0x14, 0x08, 0x44, 0x08, 0x54, 0x08, 0xa4, - 0x08, 0xb4, 0x08, 0x06, 0x75, 0x74, 0x08, 0x84, 0x08, 0xa4, 0x08, 0xb4, - 0x08, 0xd4, 0x08, 0xe4, 0x08, 0x06, 0x04, 0x08, 0x14, 0x08, 0xa4, 0x08, - 0xb4, 0x08, 0xe4, 0x08, 0xf4, 0x08, 0x06, 0x04, 0x08, 0x54, 0x08, 0xb4, - 0x08, 0xf4, 0x08, 0x04, 0x41, 0x54, 0x08, 0x94, 0x08, 0xa4, 0x08, 0x03, - 0xe4, 0x08, 0xf4, 0x08, 0x02, 0x04, 0x08, 0x14, 0x08, 0x54, 0x08, 0x74, - 0x08, 0x04, 0x0e, 0x08, 0xb8, 0xff, 0x80, 0xb3, 0x55, 0x58, 0x48, 0x08, - 0xb8, 0xff, 0x80, 0x40, 0x2d, 0x3b, 0x3e, 0x48, 0x02, 0x08, 0x12, 0x08, - 0x72, 0x08, 0xb2, 0x08, 0xc2, 0x08, 0xd2, 0x08, 0x06, 0x70, 0x42, 0x08, - 0x52, 0x08, 0x82, 0x08, 0x92, 0x08, 0xa2, 0x08, 0x05, 0x02, 0x08, 0x12, - 0x08, 0x62, 0x08, 0x72, 0x08, 0x04, 0x39, 0x00, 0x08, 0x60, 0x08, 0x02, - 0x64, 0x01, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x72, 0x5e, 0x5d, 0x2b, 0x2b, - 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x2b, 0x2b, - 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x5e, 0x5d, - 0x00, 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x09, 0x02, 0x23, 0x01, 0x33, 0x01, 0x03, - 0x13, 0xfe, 0xcb, 0xfe, 0xce, 0xa2, 0x01, 0x70, 0xcb, 0x01, 0x72, 0x02, - 0xa1, 0x02, 0x79, 0xfd, 0x87, 0x02, 0xe0, 0xfd, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xe1, 0xfe, 0x69, 0x04, 0x8a, 0xfe, 0xeb, 0x00, 0x03, - 0x00, 0x15, 0x40, 0x09, 0x02, 0x05, 0x00, 0x04, 0x01, 0x00, 0xba, 0x59, - 0x01, 0x00, 0x2f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, - 0x35, 0x21, 0x15, 0x1f, 0x04, 0xa9, 0xfe, 0x69, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x6a, 0x04, 0xb1, 0x02, 0x12, 0x05, 0xe4, 0x00, 0x05, - 0x00, 0x29, 0x40, 0x18, 0x00, 0x05, 0x03, 0x02, 0x04, 0x02, 0x07, 0x06, - 0x00, 0x02, 0x95, 0x5b, 0x0f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x7f, 0x00, - 0xef, 0x00, 0x05, 0x00, 0x00, 0x2f, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x09, 0x01, 0x35, 0x33, 0x13, - 0x15, 0x01, 0xb4, 0xfe, 0xb6, 0xcf, 0xd9, 0x04, 0xb1, 0x01, 0x16, 0x1d, - 0xfe, 0xe1, 0x14, 0x00, 0x00, 0x02, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, - 0x04, 0x4e, 0x00, 0x23, 0x00, 0x30, 0x00, 0x8e, 0x40, 0x56, 0x20, 0x29, - 0x29, 0x07, 0x07, 0x15, 0x0e, 0x0f, 0x2e, 0x03, 0x03, 0x0f, 0x15, 0x1a, - 0x04, 0x32, 0x31, 0x1d, 0x18, 0x51, 0x59, 0x1d, 0x16, 0x20, 0x00, 0x11, - 0x07, 0x29, 0x51, 0x59, 0x07, 0x07, 0x11, 0x00, 0x3f, 0x0e, 0x01, 0x0f, - 0x0e, 0x6f, 0x0e, 0x02, 0x0b, 0x03, 0x0e, 0x0e, 0x11, 0x11, 0x0b, 0x50, - 0x59, 0x11, 0x10, 0x00, 0x24, 0x50, 0x59, 0x00, 0x16, 0xc0, 0x32, 0x01, - 0xa0, 0x32, 0x01, 0x90, 0x32, 0x01, 0x80, 0x32, 0x01, 0x70, 0x32, 0x01, - 0x60, 0x32, 0x01, 0x50, 0x32, 0x01, 0x30, 0x32, 0x01, 0xa0, 0x32, 0x01, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x71, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x3f, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, - 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, - 0x22, 0x26, 0x27, 0x23, 0x0e, 0x01, 0x27, 0x32, 0x3e, 0x01, 0x3d, 0x01, - 0x07, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x01, 0x9e, 0xa3, 0xa4, 0xdd, 0xf6, - 0xf3, 0x70, 0x78, 0x79, 0x6e, 0x0b, 0xbc, 0x2e, 0x01, 0x84, 0xcc, 0xce, - 0x2a, 0x3b, 0x1a, 0x21, 0x44, 0x47, 0x64, 0x5b, 0x06, 0x06, 0x45, 0xb7, - 0x5a, 0x63, 0x9a, 0x59, 0xc5, 0x7f, 0x83, 0x46, 0x5f, 0x14, 0xac, 0x96, - 0xa8, 0xb4, 0x06, 0x04, 0x3b, 0x84, 0x72, 0x52, 0x5a, 0x11, 0x01, 0x24, - 0xbb, 0xb1, 0xfe, 0x2e, 0x50, 0x51, 0x07, 0x70, 0x10, 0x69, 0x70, 0x7c, - 0x67, 0x87, 0x5a, 0x9d, 0x53, 0x59, 0x04, 0x02, 0x30, 0x64, 0x51, 0x58, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xcc, 0x00, 0x17, 0x00, 0x23, 0x00, 0x5d, 0x40, 0x37, 0x1e, 0x05, - 0x0e, 0x0e, 0x0d, 0x18, 0x00, 0x0d, 0x00, 0x24, 0x25, 0x05, 0x11, 0x02, - 0x15, 0x15, 0x1b, 0x50, 0x59, 0x15, 0x10, 0x0d, 0x00, 0x0a, 0x15, 0x02, - 0x21, 0x50, 0x59, 0x02, 0x16, 0xb0, 0x25, 0x01, 0x3f, 0x25, 0x01, 0x90, - 0x25, 0x01, 0x70, 0x25, 0x01, 0x1f, 0x25, 0x01, 0xff, 0x25, 0x01, 0xe0, - 0x25, 0x01, 0xc0, 0x25, 0x01, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, - 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x33, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfe, 0x72, 0x7b, 0xa3, 0x33, - 0x02, 0x08, 0x02, 0xae, 0x06, 0xb4, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, - 0xc1, 0xbd, 0x78, 0x87, 0x98, 0x8b, 0x88, 0x99, 0x88, 0x79, 0x02, 0x22, - 0xfd, 0xca, 0x59, 0x63, 0x1f, 0x7f, 0x0a, 0x36, 0xa9, 0x04, 0xed, 0xfe, - 0x59, 0x41, 0x58, 0x68, 0x5a, 0xfe, 0xec, 0xfe, 0xe2, 0xe3, 0xc4, 0xd0, - 0xe2, 0xd5, 0xcb, 0xc9, 0x00, 0x01, 0x00, 0x57, 0xff, 0xec, 0x03, 0xca, - 0x04, 0x4e, 0x00, 0x19, 0x00, 0x66, 0x40, 0x45, 0x00, 0x0d, 0x14, 0x13, - 0x06, 0x07, 0x07, 0x13, 0x0d, 0x03, 0x1a, 0x1b, 0x10, 0x17, 0x50, 0x59, - 0x1f, 0x14, 0x7f, 0x14, 0x8f, 0x14, 0xdf, 0x14, 0x04, 0x14, 0x14, 0x10, - 0x10, 0x20, 0x06, 0x70, 0x06, 0x80, 0x06, 0xd0, 0x06, 0xe0, 0x06, 0x05, - 0x00, 0x06, 0x10, 0x06, 0x60, 0x06, 0x70, 0x06, 0x80, 0x06, 0xc0, 0x06, - 0xd0, 0x06, 0x07, 0x09, 0x03, 0x06, 0x06, 0x0a, 0x0a, 0x03, 0x50, 0x59, - 0x0a, 0x16, 0x1f, 0x1b, 0x01, 0x5d, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x3f, 0x33, 0x2f, 0x5d, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x01, 0x13, 0x88, 0x89, 0x60, 0x81, 0x0f, 0xb6, 0x15, 0xe0, - 0xac, 0xe3, 0xef, 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, 0x69, - 0x8f, 0x80, 0x02, 0x22, 0xd8, 0xd0, 0x68, 0x6c, 0x0c, 0x9c, 0xba, 0x01, - 0x1f, 0x01, 0x13, 0x01, 0x11, 0x01, 0x1f, 0xac, 0x97, 0x0e, 0x5a, 0x6a, - 0xbe, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x03, 0xef, - 0x05, 0xcc, 0x00, 0x16, 0x00, 0x22, 0x00, 0x56, 0x40, 0x31, 0x1d, 0x00, - 0x0e, 0x0e, 0x0f, 0x17, 0x06, 0x0f, 0x06, 0x24, 0x23, 0x12, 0x15, 0x0e, - 0x00, 0x00, 0x0b, 0x03, 0x08, 0x08, 0x20, 0x50, 0x59, 0x08, 0x10, 0x03, - 0x1a, 0x50, 0x59, 0x03, 0x16, 0x90, 0x24, 0x01, 0x70, 0x24, 0x01, 0x1f, - 0x24, 0x01, 0xff, 0x24, 0x01, 0xe0, 0x24, 0x01, 0xc0, 0x24, 0x01, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x25, 0x0e, - 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, - 0x11, 0x33, 0x11, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x35, 0x01, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, 0x32, - 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, - 0x06, 0xac, 0x03, 0x07, 0xfd, 0xda, 0x78, 0x87, 0x99, 0x8a, 0x8a, 0x97, - 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, 0x5a, - 0x62, 0x79, 0x01, 0xc1, 0xfb, 0x13, 0xa9, 0x36, 0x10, 0x74, 0x2a, 0x01, - 0x70, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x02, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x18, 0x04, 0x4e, 0x00, 0x12, 0x00, 0x19, 0x00, 0x77, - 0x40, 0x46, 0x13, 0x11, 0x06, 0x07, 0x19, 0x00, 0x00, 0x0c, 0x0c, 0x07, - 0x11, 0x03, 0x1b, 0x1a, 0x06, 0x06, 0x00, 0x03, 0x19, 0x00, 0x50, 0x59, - 0x0d, 0x19, 0x01, 0x14, 0x04, 0x19, 0x19, 0x09, 0x0f, 0x0f, 0x16, 0x50, - 0x59, 0x0f, 0x10, 0x09, 0x03, 0x50, 0x59, 0x09, 0x16, 0xd0, 0x1b, 0x01, - 0xc0, 0x1b, 0x01, 0xa0, 0x1b, 0x01, 0x90, 0x1b, 0x01, 0x80, 0x1b, 0x01, - 0x70, 0x1b, 0x01, 0x60, 0x1b, 0x01, 0x50, 0x1b, 0x01, 0x30, 0x1b, 0x01, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x02, 0x11, - 0x10, 0x12, 0x33, 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x07, 0x01, 0x14, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x61, 0xfe, 0xa8, - 0xf0, 0xfb, 0xfb, 0xe9, 0x01, 0xdd, 0xba, 0x0f, 0x90, 0x87, 0x83, 0x99, - 0x06, 0x01, 0xf7, 0xba, 0xca, 0x5e, 0x48, 0x2d, 0xff, 0x00, 0x01, 0x1e, - 0x01, 0x1a, 0x01, 0x0c, 0x01, 0x1e, 0xfd, 0xc1, 0x18, 0x8a, 0xab, 0x9d, - 0xaf, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x02, 0x3c, - 0x05, 0xca, 0x00, 0x15, 0x00, 0x8f, 0x40, 0x68, 0x0d, 0x13, 0x01, 0x06, - 0x01, 0x02, 0x02, 0x15, 0x04, 0x15, 0x04, 0x17, 0x16, 0x0a, 0x0f, 0x50, - 0x59, 0x0a, 0x00, 0x00, 0x03, 0x06, 0x03, 0x50, 0x59, 0x13, 0x06, 0x0f, - 0x01, 0x15, 0x1f, 0x17, 0x2f, 0x17, 0x4f, 0x17, 0x5f, 0x17, 0x7f, 0x17, - 0x8f, 0x17, 0x9f, 0x17, 0x07, 0x0f, 0x17, 0x3f, 0x17, 0x7f, 0x17, 0xaf, - 0x17, 0xbf, 0x17, 0xdf, 0x17, 0xef, 0x17, 0x07, 0x3b, 0x5f, 0x17, 0xbf, - 0x17, 0x02, 0x7f, 0x17, 0x8f, 0x17, 0x9f, 0x17, 0x03, 0x0f, 0x17, 0x2f, - 0x17, 0xaf, 0x17, 0xdf, 0x17, 0xef, 0x17, 0x05, 0x17, 0x40, 0x56, 0x64, - 0x48, 0x17, 0x40, 0x27, 0x2c, 0x48, 0x20, 0x17, 0x30, 0x17, 0x60, 0x17, - 0x03, 0x40, 0x17, 0x01, 0x5d, 0x71, 0x2b, 0x2b, 0x5d, 0x71, 0x72, 0x5e, - 0x5d, 0x71, 0x00, 0x3f, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x32, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, - 0x01, 0x33, 0x15, 0x01, 0x69, 0xb4, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, - 0x2d, 0x23, 0x45, 0x3e, 0xd3, 0x03, 0xb7, 0xfc, 0x49, 0x03, 0xb7, 0x83, - 0x7a, 0x94, 0x82, 0x0c, 0x89, 0x08, 0x46, 0x5c, 0x61, 0x83, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, 0x04, 0x4b, 0x00, 0x20, - 0x00, 0x2e, 0x00, 0x9f, 0x40, 0x64, 0x21, 0x17, 0x09, 0x09, 0x1f, 0x04, - 0x03, 0x28, 0x11, 0x11, 0x03, 0x1f, 0x03, 0x30, 0x2f, 0x1c, 0x0f, 0x17, - 0x0a, 0x14, 0x0e, 0x14, 0x25, 0x50, 0x59, 0x14, 0x10, 0x0e, 0x2b, 0x50, - 0x59, 0x0e, 0x16, 0x00, 0x07, 0x50, 0x59, 0x15, 0x04, 0x01, 0x06, 0x04, - 0x01, 0x0b, 0x04, 0x00, 0x1b, 0x40, 0x30, 0x01, 0x20, 0x30, 0x01, 0xcf, - 0x30, 0x01, 0xb0, 0x30, 0x01, 0x90, 0x30, 0x01, 0x20, 0x30, 0x01, 0x00, - 0x30, 0x01, 0x50, 0xdf, 0x30, 0x01, 0xc0, 0x30, 0x01, 0x4f, 0x30, 0x01, - 0xa0, 0x30, 0x01, 0x80, 0x30, 0x01, 0x2f, 0x30, 0x01, 0x0f, 0x30, 0x01, - 0xf0, 0x30, 0x01, 0xd0, 0x30, 0x01, 0x0f, 0x30, 0x01, 0x08, 0x5e, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x00, 0x3f, 0x32, 0x5e, 0x5d, 0x5d, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x37, - 0x1e, 0x01, 0x33, 0x20, 0x11, 0x35, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, - 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x33, 0x34, 0x36, 0x37, 0x33, - 0x06, 0x15, 0x11, 0x10, 0x03, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x02, 0x24, 0xb1, 0xd2, 0x1e, 0xb5, - 0x12, 0x7b, 0x64, 0x01, 0x0d, 0x02, 0x33, 0xb2, 0x77, 0xc7, 0xbb, 0xc9, - 0xcd, 0x73, 0xa9, 0x2e, 0x02, 0x08, 0x04, 0xab, 0x06, 0xb3, 0x48, 0x83, - 0x53, 0x8a, 0x7e, 0x76, 0x8f, 0x55, 0x84, 0x48, 0xfe, 0x57, 0x8b, 0x80, - 0x1a, 0x4b, 0x51, 0x01, 0x3b, 0xae, 0x68, 0x69, 0x01, 0x08, 0x01, 0x1b, - 0x01, 0x1f, 0x01, 0x11, 0x69, 0x61, 0x1e, 0x94, 0x07, 0x36, 0xaa, 0xfc, - 0xc5, 0xfe, 0x38, 0x03, 0xc6, 0x84, 0xbf, 0x65, 0xc8, 0xe0, 0xde, 0xc2, - 0x64, 0xbb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xcc, 0x00, 0x18, 0x00, 0x60, 0x40, 0x3b, 0x15, 0x11, 0x11, 0x12, - 0x08, 0x07, 0x12, 0x07, 0x19, 0x1a, 0x13, 0x00, 0x00, 0x03, 0x12, 0x07, - 0x15, 0x03, 0x0d, 0x50, 0x59, 0x03, 0x10, 0xd0, 0x1a, 0x01, 0xc0, 0x1a, - 0x01, 0xb0, 0x1a, 0x01, 0xf0, 0x1a, 0x01, 0xb0, 0x1a, 0x01, 0xff, 0x1a, - 0x01, 0xe0, 0x1a, 0x01, 0xd0, 0x1a, 0x01, 0xc0, 0x1a, 0x01, 0xb0, 0x1a, - 0x01, 0xa0, 0x1a, 0x01, 0x70, 0x1a, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x12, 0x39, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, - 0x23, 0x11, 0x33, 0x11, 0x14, 0x06, 0x07, 0x01, 0x3d, 0x3a, 0xa3, 0x7d, - 0xb0, 0xa7, 0xb5, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0xb4, 0x07, 0x01, - 0x03, 0x81, 0x6a, 0x63, 0xaf, 0xce, 0xfd, 0x2f, 0x02, 0xae, 0x72, 0x6f, - 0x34, 0xb0, 0x95, 0xfd, 0x82, 0x05, 0xcc, 0xfe, 0x7e, 0x3d, 0x82, 0x0a, - 0x00, 0x02, 0x00, 0x89, 0x00, 0x00, 0x01, 0x3d, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x6e, 0x40, 0x48, 0x03, 0x07, 0x07, 0x00, 0x04, 0x04, - 0x08, 0x09, 0x05, 0x0f, 0x04, 0x15, 0x01, 0x00, 0x53, 0x59, 0x01, 0x00, - 0xff, 0x09, 0x01, 0xe0, 0x09, 0x01, 0xdf, 0x09, 0x01, 0xc0, 0x09, 0x01, - 0xb0, 0x09, 0x01, 0x9f, 0x09, 0x01, 0x80, 0x09, 0x01, 0x70, 0x09, 0x01, - 0x1f, 0x09, 0x01, 0x00, 0x09, 0x01, 0xf0, 0x09, 0x01, 0xdf, 0x09, 0x01, - 0xc0, 0x09, 0x01, 0xb0, 0x09, 0x01, 0xa0, 0x09, 0x01, 0x90, 0x09, 0x01, - 0x4f, 0x09, 0x01, 0x1f, 0x09, 0x01, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x03, 0x11, - 0x33, 0x11, 0x89, 0xb4, 0xb4, 0xb4, 0x05, 0x20, 0xac, 0xac, 0xfa, 0xe0, - 0x04, 0x3a, 0xfb, 0xc6, 0x00, 0x02, 0xff, 0xce, 0xfe, 0x57, 0x01, 0x3d, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x10, 0x00, 0xf7, 0x40, 0xac, 0x0a, 0x03, - 0x04, 0x04, 0x00, 0x0e, 0x0e, 0x11, 0x12, 0x0f, 0x0f, 0x07, 0x0b, 0x50, - 0x59, 0x07, 0x1b, 0x01, 0x00, 0x53, 0x59, 0x01, 0x00, 0xcf, 0x12, 0x01, - 0xbf, 0x12, 0x01, 0x8f, 0x12, 0x01, 0x00, 0x12, 0x01, 0x6f, 0xef, 0x12, - 0x01, 0xd0, 0x12, 0x01, 0x8f, 0x12, 0x01, 0x3f, 0x12, 0x01, 0xff, 0x12, - 0x01, 0xaf, 0x12, 0x01, 0x9f, 0x12, 0x01, 0x8f, 0x12, 0x01, 0x6f, 0x12, - 0x01, 0x50, 0x12, 0x01, 0x40, 0x12, 0x01, 0x30, 0x12, 0x01, 0x20, 0x12, - 0x01, 0xdf, 0x12, 0x01, 0xb0, 0x12, 0x01, 0xa0, 0x12, 0x01, 0x90, 0x12, - 0x01, 0x4f, 0x12, 0x01, 0x3f, 0x12, 0x01, 0x2f, 0x12, 0x01, 0x00, 0x12, - 0x01, 0x3d, 0xff, 0x12, 0x01, 0xef, 0x12, 0x01, 0xdf, 0x12, 0x01, 0xcf, - 0x12, 0x01, 0xb0, 0x12, 0x01, 0x90, 0x12, 0x01, 0x80, 0x12, 0x01, 0x70, - 0x12, 0x01, 0x1f, 0x12, 0x01, 0x0f, 0x12, 0x01, 0xff, 0x12, 0x01, 0xdf, - 0x12, 0x01, 0xcf, 0x12, 0x01, 0xbf, 0x12, 0x01, 0xaf, 0x12, 0x01, 0x90, - 0x12, 0x01, 0x4f, 0x12, 0x01, 0xff, 0x12, 0x01, 0xe0, 0x12, 0x01, 0xd0, - 0x12, 0x01, 0xc0, 0x12, 0x01, 0x80, 0x12, 0x01, 0x70, 0x12, 0x01, 0x1f, - 0x12, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x32, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x11, 0x14, 0x06, 0x23, 0x22, - 0x27, 0x35, 0x17, 0x32, 0x36, 0x35, 0x11, 0x33, 0x89, 0xb4, 0x78, 0x78, - 0x4d, 0x32, 0x3e, 0x45, 0x38, 0xb4, 0x05, 0x20, 0xac, 0xac, 0xfa, 0x5a, - 0x99, 0x8a, 0x09, 0x8b, 0x06, 0x48, 0x68, 0x04, 0xa5, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, 0x05, 0xcc, 0x00, 0x0b, - 0x00, 0x8d, 0x40, 0x67, 0x08, 0x09, 0x01, 0x0a, 0x09, 0x0a, 0x04, 0x00, - 0x0b, 0x0b, 0x07, 0x03, 0x04, 0x04, 0x0d, 0x0c, 0x1f, 0x0d, 0x3f, 0x0d, - 0x02, 0x1f, 0x0d, 0x3f, 0x0d, 0x5f, 0x0d, 0xff, 0x0d, 0x04, 0x0f, 0x0d, - 0x1f, 0x0d, 0x3f, 0x0d, 0x5f, 0x0d, 0x7f, 0x0d, 0x05, 0x39, 0x0d, 0x40, - 0x53, 0x56, 0x48, 0x60, 0x0d, 0x80, 0x0d, 0xa0, 0x0d, 0xc0, 0x0d, 0xd0, - 0x0d, 0x05, 0xdf, 0x0d, 0x01, 0x00, 0x0d, 0x60, 0x0d, 0x80, 0x0d, 0xa0, - 0x0d, 0x04, 0x00, 0x0d, 0x10, 0x0d, 0x30, 0x0d, 0x40, 0x0d, 0x80, 0x0d, - 0xa0, 0x0d, 0xc0, 0x0d, 0xe0, 0x0d, 0xf0, 0x0d, 0x09, 0x07, 0x02, 0x01, - 0x07, 0x0a, 0x04, 0x08, 0x0f, 0x05, 0x00, 0x04, 0x15, 0x00, 0x15, 0x00, - 0x3f, 0x3f, 0x3f, 0x3f, 0x17, 0x39, 0x01, 0x5e, 0x5d, 0x71, 0x71, 0x72, - 0x2b, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x32, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x03, - 0x30, 0xfe, 0x92, 0x84, 0xb4, 0xb4, 0x01, 0xdb, 0xd3, 0xfe, 0x49, 0x01, - 0xce, 0x01, 0xee, 0x6d, 0xfe, 0x7f, 0x05, 0xcc, 0xfc, 0x61, 0x02, 0x0d, - 0xfe, 0x2f, 0xfd, 0x97, 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x01, 0x3e, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x76, 0x40, 0x51, 0x03, 0x00, 0x00, 0x05, - 0x04, 0x01, 0x00, 0x00, 0x15, 0xf0, 0x05, 0x01, 0xe0, 0x05, 0x01, 0xdf, - 0x05, 0x01, 0xc0, 0x05, 0x01, 0xb0, 0x05, 0x01, 0x9f, 0x05, 0x01, 0x80, - 0x05, 0x01, 0x70, 0x05, 0x01, 0x1f, 0x05, 0x01, 0x0f, 0x05, 0x01, 0xf0, - 0x05, 0x01, 0xdf, 0x05, 0x01, 0xc0, 0x05, 0x01, 0xb0, 0x05, 0x01, 0xa0, - 0x05, 0x01, 0x90, 0x05, 0x01, 0x4f, 0x05, 0x01, 0xff, 0x05, 0x01, 0xe0, - 0x05, 0x01, 0xd0, 0x05, 0x01, 0xc0, 0x05, 0x01, 0x80, 0x05, 0x01, 0x70, - 0x05, 0x01, 0x1f, 0x05, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x8a, 0xb4, 0x05, 0xcc, - 0xfa, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x06, 0x23, - 0x04, 0x4e, 0x00, 0x29, 0x01, 0x7e, 0x40, 0xff, 0x18, 0x29, 0x00, 0x00, - 0x21, 0x09, 0x21, 0x20, 0x12, 0x08, 0x09, 0x20, 0x09, 0x2b, 0x2a, 0x1c, - 0x25, 0x50, 0x59, 0x1c, 0x10, 0x18, 0x11, 0x00, 0x15, 0x15, 0x04, 0x50, - 0x59, 0x15, 0x10, 0x0c, 0x0f, 0x21, 0x09, 0x00, 0x15, 0x64, 0x2b, 0x01, - 0x4b, 0x2b, 0x01, 0x3f, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x1f, 0x2b, 0x01, - 0x0f, 0x2b, 0x01, 0xeb, 0x2b, 0x01, 0xdf, 0x2b, 0x01, 0xbb, 0x2b, 0x01, - 0xab, 0x2b, 0x01, 0x8b, 0x2b, 0x01, 0x7b, 0x2b, 0x01, 0x6f, 0x2b, 0x01, - 0x3b, 0x2b, 0x01, 0x1f, 0x2b, 0x01, 0x0b, 0x2b, 0x01, 0x6a, 0xeb, 0x2b, - 0x01, 0xcb, 0x2b, 0x01, 0xbb, 0x2b, 0x01, 0xaf, 0x2b, 0x01, 0x8b, 0x2b, - 0x01, 0x7f, 0x2b, 0x01, 0x5b, 0x2b, 0x01, 0x4f, 0x2b, 0x01, 0x1b, 0x2b, - 0x01, 0xfb, 0x2b, 0x01, 0xef, 0x2b, 0x01, 0xdf, 0x2b, 0x01, 0xcb, 0x2b, - 0x01, 0xbb, 0x2b, 0x01, 0xaf, 0x2b, 0x01, 0x94, 0x2b, 0x01, 0x64, 0x2b, - 0x01, 0x4b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x1b, 0x2b, 0x01, 0x04, 0x2b, - 0x01, 0xf4, 0x2b, 0x01, 0xdb, 0x2b, 0x01, 0xab, 0x2b, 0x01, 0x8b, 0x2b, - 0x01, 0x7f, 0x2b, 0x01, 0x6b, 0x2b, 0x01, 0x34, 0x2b, 0x01, 0x1b, 0x2b, - 0x01, 0x0f, 0x2b, 0x01, 0x39, 0xfb, 0x2b, 0x01, 0xdb, 0x2b, 0x01, 0xbb, - 0x2b, 0x01, 0xa0, 0x2b, 0x01, 0x94, 0x2b, 0x01, 0x74, 0x2b, 0x01, 0x5b, - 0x2b, 0x01, 0x4b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x1f, 0x2b, 0x01, 0x0b, - 0x2b, 0x01, 0xfb, 0x2b, 0x01, 0xeb, 0x2b, 0x01, 0xcb, 0x2b, 0x01, 0xa4, - 0x2b, 0x01, 0x7b, 0x2b, 0x01, 0x5b, 0x2b, 0x01, 0x4b, 0x2b, 0x01, 0x1b, - 0x2b, 0x01, 0xf4, 0x2b, 0x01, 0xd0, 0x2b, 0x01, 0x02, 0xc0, 0x2b, 0x01, - 0xa0, 0x2b, 0x01, 0x90, 0x2b, 0x01, 0x60, 0x2b, 0x01, 0x4f, 0x2b, 0x40, - 0x0b, 0x01, 0x30, 0x2b, 0x01, 0x2f, 0x2b, 0x01, 0x00, 0x2b, 0x01, 0x08, - 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x32, 0x32, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, - 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x03, 0x00, 0x56, - 0x70, 0x73, 0x86, 0xb3, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3a, - 0x96, 0x6c, 0x7b, 0x8f, 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, 0xb2, - 0x56, 0x70, 0x76, 0x83, 0x02, 0xae, 0x9d, 0x78, 0xb0, 0xa0, 0xfd, 0x8d, - 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, - 0x6d, 0x60, 0xb2, 0xcb, 0xfd, 0x2f, 0x02, 0xae, 0x9d, 0x78, 0xaf, 0xa1, - 0xfd, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x03, 0xee, - 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x61, 0x40, 0x3c, 0x12, 0x09, 0x09, 0x0a, - 0x00, 0x1a, 0x0a, 0x1a, 0x1b, 0x1c, 0x12, 0x16, 0x00, 0x16, 0x05, 0x50, - 0x59, 0x16, 0x10, 0x0d, 0x0f, 0x0a, 0x00, 0x15, 0xd0, 0x1c, 0x01, 0xc0, - 0x1c, 0x01, 0xb0, 0x1c, 0x01, 0xf0, 0x1c, 0x01, 0xb0, 0x1c, 0x01, 0xff, - 0x1c, 0x01, 0xe0, 0x1c, 0x01, 0xd0, 0x1c, 0x01, 0xc0, 0x1c, 0x01, 0xb0, - 0x1c, 0x01, 0xa0, 0x1c, 0x01, 0x70, 0x1c, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x00, 0x3f, 0x32, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x34, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, - 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x03, 0x39, 0x2a, - 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, - 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x02, 0xae, 0x6b, 0x76, 0x34, 0xb2, 0x9e, - 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, - 0xb1, 0xcc, 0xfd, 0x2f, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x04, 0x4e, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x48, 0x40, 0x2c, 0x11, 0x06, - 0x0b, 0x00, 0x06, 0x00, 0x17, 0x18, 0x08, 0x0e, 0x50, 0x59, 0x08, 0x10, - 0x03, 0x14, 0x50, 0x59, 0x03, 0x16, 0xa0, 0x18, 0x01, 0x90, 0x18, 0x01, - 0x80, 0x18, 0x01, 0x70, 0x18, 0x01, 0x60, 0x18, 0x01, 0x50, 0x18, 0x01, - 0x30, 0x18, 0x01, 0xdf, 0x18, 0x01, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, - 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfa, 0xee, 0xed, - 0xf2, 0x01, 0xe5, 0xf8, 0xea, 0xbd, 0x85, 0x9d, 0x9e, 0x8d, 0x8b, 0x95, - 0xa2, 0x8b, 0x02, 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x01, 0x21, 0x01, 0x11, - 0x02, 0x30, 0xfe, 0xef, 0xfe, 0xe1, 0xe0, 0xcb, 0xcf, 0xdc, 0xd6, 0xd7, - 0xd0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x1d, - 0x04, 0x4d, 0x00, 0x17, 0x00, 0x24, 0x00, 0x5d, 0x40, 0x37, 0x18, 0x00, - 0x1f, 0x11, 0x08, 0x08, 0x09, 0x00, 0x09, 0x26, 0x25, 0x11, 0x04, 0x15, - 0x02, 0x15, 0x1b, 0x50, 0x59, 0x15, 0x10, 0x0c, 0x0f, 0x08, 0x1b, 0x02, - 0x22, 0x50, 0x59, 0x02, 0x16, 0xb0, 0x26, 0x01, 0x3f, 0x26, 0x01, 0x90, - 0x26, 0x01, 0x70, 0x26, 0x01, 0x1f, 0x26, 0x01, 0xff, 0x26, 0x01, 0xe0, - 0x26, 0x01, 0xc0, 0x26, 0x01, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x27, 0x23, 0x16, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x15, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfe, 0x72, 0xfa, 0x56, 0x05, - 0x04, 0xb4, 0x06, 0xae, 0x01, 0x04, 0x05, 0x04, 0x30, 0x9e, 0x81, 0xc8, - 0xc6, 0xbd, 0x7a, 0x85, 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x86, 0x7b, 0x02, - 0x22, 0xfd, 0xca, 0xbc, 0x08, 0xa2, 0xfe, 0x59, 0x05, 0x06, 0xa7, 0x36, - 0x04, 0x31, 0x66, 0x13, 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xdd, 0xe2, 0xc2, - 0x5a, 0xbf, 0x99, 0xd5, 0xca, 0xc5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xfe, 0x57, 0x03, 0xf0, 0x04, 0x4e, 0x00, 0x16, 0x00, 0x22, 0x00, 0x86, - 0x40, 0x54, 0x17, 0x08, 0x11, 0x11, 0x10, 0x1d, 0x03, 0x10, 0x03, 0x24, - 0x23, 0x10, 0x1b, 0x0c, 0x10, 0x08, 0x13, 0x05, 0x00, 0x05, 0x1a, 0x50, - 0x59, 0x05, 0x10, 0x00, 0x20, 0x50, 0x59, 0x00, 0x16, 0x40, 0x24, 0x01, - 0x20, 0x24, 0x01, 0xcf, 0x24, 0x01, 0xb0, 0x24, 0x01, 0x90, 0x24, 0x01, - 0x20, 0x24, 0x01, 0x00, 0x24, 0x01, 0x50, 0xdf, 0x24, 0x01, 0xc0, 0x24, - 0x01, 0x4f, 0x24, 0x01, 0xa0, 0x24, 0x01, 0x80, 0x24, 0x01, 0x2f, 0x24, - 0x01, 0x0f, 0x24, 0x01, 0xf0, 0x24, 0x01, 0xd0, 0x24, 0x01, 0x0f, 0x24, - 0x01, 0x08, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, - 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x05, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, - 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x11, 0x23, 0x11, 0x37, 0x23, 0x0e, - 0x01, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x01, 0xe4, 0xce, 0xc0, 0x01, 0x8e, 0x7b, 0xa0, 0x36, 0x02, 0x08, - 0x04, 0xad, 0x07, 0xb4, 0x04, 0x02, 0x36, 0x9e, 0xd2, 0x8a, 0x97, 0x89, - 0x78, 0x79, 0x86, 0x99, 0x8a, 0x14, 0x01, 0x16, 0x01, 0x16, 0x02, 0x36, - 0x57, 0x65, 0x1e, 0x93, 0x05, 0x3b, 0xec, 0xfb, 0x36, 0x01, 0xb7, 0xa4, - 0x6b, 0x5b, 0x02, 0x3e, 0xd3, 0xcc, 0xcc, 0xdf, 0xe3, 0xc4, 0xda, 0x00, - 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x13, - 0x00, 0x23, 0x40, 0x10, 0x06, 0x13, 0x13, 0x00, 0x00, 0x0c, 0x14, 0x15, - 0x0f, 0x06, 0x0a, 0x10, 0x04, 0x0f, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x3f, - 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x33, 0x11, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, 0x01, 0x33, - 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x8e, 0x06, 0xaa, - 0x08, 0x04, 0x2b, 0x70, 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x03, - 0x3e, 0x72, 0x8a, 0xb8, 0x25, 0x8b, 0x66, 0x0a, 0xa5, 0x0a, 0xc1, 0xb4, - 0xfd, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0xff, 0xec, 0x03, 0xb6, - 0x04, 0x4b, 0x00, 0x2a, 0x00, 0x64, 0x40, 0x3c, 0x07, 0x06, 0x22, 0x15, - 0x1c, 0x1b, 0x0d, 0x00, 0x00, 0x1b, 0x15, 0x06, 0x04, 0x2b, 0x2c, 0x0d, - 0x22, 0x03, 0x18, 0x18, 0x1f, 0x50, 0x59, 0x1c, 0x18, 0x10, 0x03, 0x0a, - 0x50, 0x59, 0x07, 0x03, 0x16, 0x10, 0x2c, 0x01, 0x00, 0x2c, 0x01, 0xf0, - 0x2c, 0x01, 0xe0, 0x2c, 0x01, 0xc0, 0x2c, 0x01, 0x60, 0x2c, 0x01, 0x80, - 0x2c, 0x01, 0x3f, 0x2c, 0x01, 0x10, 0x2c, 0x01, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x17, - 0x1e, 0x03, 0x03, 0xb6, 0xe7, 0xd0, 0xca, 0xdb, 0x21, 0x9f, 0x17, 0x90, - 0x80, 0x89, 0x7f, 0x58, 0x62, 0x81, 0x9b, 0x83, 0x4a, 0xd3, 0xca, 0xb3, - 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, 0x74, 0x30, 0x5e, 0x97, 0x8f, - 0x7e, 0x49, 0x28, 0x01, 0x2b, 0x99, 0xa6, 0x85, 0x8d, 0x1f, 0x57, 0x51, - 0x54, 0x54, 0x40, 0x50, 0x1a, 0x22, 0x28, 0x4d, 0x6e, 0x50, 0x94, 0x9b, - 0x7e, 0x8b, 0x14, 0x48, 0x4d, 0x4a, 0x4b, 0x2e, 0x3c, 0x2a, 0x25, 0x24, - 0x3d, 0x4a, 0x61, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf0, 0x02, 0x2a, - 0x05, 0x2c, 0x00, 0x14, 0x00, 0x45, 0x40, 0x24, 0x0d, 0x14, 0x14, 0x0b, - 0x0f, 0x0f, 0x09, 0x04, 0x04, 0x16, 0x15, 0x0e, 0x05, 0x08, 0x05, 0x50, - 0x59, 0x0b, 0x0f, 0x09, 0x01, 0x0c, 0x03, 0x09, 0x40, 0x08, 0x0f, 0x02, - 0x12, 0x50, 0x59, 0x02, 0x16, 0x80, 0x16, 0x01, 0x5d, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x1a, 0xcd, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x32, 0x11, - 0x33, 0x31, 0x30, 0x25, 0x06, 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, - 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x02, 0x2a, 0x59, 0x5d, 0xd8, 0x7d, 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x33, - 0x3f, 0x24, 0x44, 0x08, 0x18, 0xf5, 0x02, 0xd2, 0x83, 0xf2, 0xf2, 0x83, - 0xfd, 0x55, 0x4e, 0x3f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xeb, 0x04, 0x3a, 0x00, 0x1a, 0x00, 0x5f, 0x40, 0x3b, - 0x12, 0x08, 0x08, 0x0b, 0x01, 0x19, 0x0b, 0x19, 0x1c, 0x1b, 0x12, 0x05, - 0x16, 0x05, 0x50, 0x59, 0x16, 0x16, 0x0d, 0x15, 0x09, 0x00, 0x0f, 0xd0, - 0x1c, 0x01, 0xc0, 0x1c, 0x01, 0xb0, 0x1c, 0x01, 0xf0, 0x1c, 0x01, 0xb0, - 0x1c, 0x01, 0xff, 0x1c, 0x01, 0xe0, 0x1c, 0x01, 0xd0, 0x1c, 0x01, 0xc0, - 0x1c, 0x01, 0xb0, 0x1c, 0x01, 0xa0, 0x1c, 0x01, 0x70, 0x1c, 0x01, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x00, - 0x3f, 0x32, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x23, - 0x2e, 0x02, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, - 0x3a, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, 0x03, - 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x04, 0x3a, 0xfd, 0x52, 0x6b, - 0x76, 0x34, 0xb2, 0x9e, 0x02, 0x73, 0xfc, 0xad, 0xbd, 0x2a, 0x05, 0x2c, - 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0x02, 0xd1, 0x00, 0x01, 0x00, 0x07, - 0x00, 0x00, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x0a, 0x01, 0x5c, 0x40, 0xf8, - 0x01, 0x00, 0x06, 0x09, 0x0a, 0x03, 0x02, 0x02, 0x06, 0x0a, 0x03, 0x0b, - 0x0c, 0x09, 0x02, 0x0f, 0x06, 0x01, 0x15, 0x9b, 0x0c, 0x01, 0x84, 0x0c, - 0x01, 0x60, 0x0c, 0x01, 0x54, 0x0c, 0x01, 0x44, 0x0c, 0x01, 0x20, 0x0c, - 0x01, 0x14, 0x0c, 0x01, 0x04, 0x0c, 0x01, 0xe0, 0x0c, 0x01, 0xd4, 0x0c, - 0x01, 0xc4, 0x0c, 0x01, 0xa0, 0x0c, 0x01, 0x94, 0x0c, 0x01, 0x84, 0x0c, - 0x01, 0x60, 0x0c, 0x01, 0x54, 0x0c, 0x01, 0x44, 0x0c, 0x01, 0x14, 0x0c, - 0x01, 0x04, 0x0c, 0x01, 0x67, 0xd4, 0x0c, 0x01, 0xc4, 0x0c, 0x01, 0x94, - 0x0c, 0x01, 0x84, 0x0c, 0x01, 0x54, 0x0c, 0x01, 0x44, 0x0c, 0x01, 0x14, - 0x0c, 0x01, 0x04, 0x0c, 0x01, 0xdb, 0x0c, 0x01, 0xc4, 0x0c, 0x01, 0x9b, - 0x0c, 0x01, 0x84, 0x0c, 0x01, 0x5b, 0x0c, 0x01, 0x44, 0x0c, 0x01, 0x1b, - 0x0c, 0x01, 0x04, 0x0c, 0x01, 0xdb, 0x0c, 0x01, 0xc4, 0x0c, 0x01, 0x9b, - 0x0c, 0x01, 0x8b, 0x0c, 0x01, 0x5b, 0x0c, 0x01, 0x4b, 0x0c, 0x01, 0x1b, - 0x0c, 0x01, 0x0b, 0x0c, 0x01, 0x37, 0xdb, 0x0c, 0x01, 0xcb, 0x0c, 0x01, - 0x9b, 0x0c, 0x01, 0x8b, 0x0c, 0x01, 0x5b, 0x0c, 0x01, 0x4b, 0x0c, 0x01, - 0x3f, 0x0c, 0x01, 0x20, 0x0c, 0x01, 0x14, 0x0c, 0x01, 0x04, 0x0c, 0x01, - 0xe0, 0x0c, 0x01, 0xd4, 0x0c, 0x01, 0xc4, 0x0c, 0x01, 0xa0, 0x0c, 0x01, - 0x94, 0x0c, 0x01, 0x84, 0x0c, 0x01, 0x60, 0x0c, 0x01, 0x54, 0x0c, 0x01, - 0x44, 0x0c, 0x01, 0x20, 0x0c, 0x01, 0x14, 0x0c, 0x01, 0x04, 0x0c, 0x01, - 0xd4, 0x0c, 0x01, 0xc4, 0x0c, 0x01, 0xa0, 0x0c, 0x01, 0x94, 0x0c, 0x01, - 0x84, 0x0c, 0x01, 0x60, 0x0c, 0x01, 0x02, 0x50, 0x0c, 0x01, 0x2f, 0x0c, - 0x01, 0x10, 0x0c, 0x01, 0x00, 0x0c, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x01, 0x33, 0x13, 0x16, 0x17, 0x3f, 0x01, 0x13, 0x33, 0x02, 0x65, 0xd5, - 0xfe, 0x77, 0xc0, 0xee, 0x0d, 0x38, 0x23, 0x27, 0xf6, 0xbf, 0x04, 0x3a, - 0xfd, 0x40, 0x28, 0xc5, 0x75, 0x76, 0x02, 0xc2, 0x00, 0x01, 0xff, 0xfd, - 0x00, 0x00, 0x05, 0xcc, 0x04, 0x3a, 0x00, 0x14, 0x01, 0xae, 0x40, 0xff, - 0x01, 0x00, 0x11, 0x07, 0x06, 0x0c, 0x0f, 0x0e, 0x03, 0x13, 0x09, 0x0c, - 0x03, 0x11, 0x03, 0x14, 0x08, 0x07, 0x14, 0x01, 0x14, 0x16, 0x08, 0x08, - 0x01, 0x0b, 0x08, 0x15, 0x03, 0x0e, 0x13, 0x03, 0x08, 0x0f, 0x01, 0x0c, - 0x11, 0x03, 0x07, 0x15, 0x76, 0x16, 0x01, 0x66, 0x16, 0x01, 0x54, 0x16, - 0x01, 0x46, 0x16, 0x01, 0x36, 0x16, 0x01, 0x24, 0x16, 0x01, 0x16, 0x16, - 0x01, 0x04, 0x16, 0x01, 0xf4, 0x16, 0x01, 0xe6, 0x16, 0x01, 0xc4, 0x16, - 0x01, 0xb2, 0x16, 0x01, 0xa4, 0x16, 0x01, 0x96, 0x16, 0x01, 0x86, 0x16, - 0x01, 0x66, 0x16, 0x01, 0x54, 0x16, 0x01, 0x44, 0x16, 0x01, 0x36, 0x16, - 0x01, 0x14, 0x16, 0x01, 0x06, 0x16, 0x01, 0x69, 0xf6, 0x16, 0x01, 0xe2, - 0x16, 0x01, 0xd4, 0x16, 0x01, 0xc6, 0x16, 0x01, 0xb6, 0x16, 0x01, 0x96, - 0x16, 0x01, 0x84, 0x16, 0x01, 0x74, 0x16, 0x01, 0x66, 0x16, 0x01, 0x46, - 0x16, 0x01, 0x36, 0x16, 0x01, 0x24, 0x16, 0x01, 0x16, 0x16, 0x01, 0x06, - 0x16, 0x01, 0xf4, 0x16, 0x01, 0xe6, 0x16, 0x01, 0xb6, 0x16, 0x01, 0xa4, - 0x16, 0x01, 0x94, 0x16, 0x01, 0x86, 0x16, 0x01, 0x69, 0x16, 0x01, 0x56, - 0x16, 0x01, 0x44, 0x16, 0x01, 0x36, 0x16, 0x01, 0x06, 0x16, 0x01, 0xe4, - 0x16, 0x01, 0xd6, 0x16, 0x01, 0xc4, 0x16, 0x01, 0xb6, 0x16, 0x01, 0xa6, - 0x16, 0x01, 0x89, 0x16, 0x01, 0x72, 0x16, 0x01, 0x01, 0x60, 0x16, 0x01, - 0x54, 0x16, 0x01, 0x24, 0x16, 0x01, 0x04, 0x16, 0x01, 0x38, 0xf4, 0x16, - 0x01, 0xd4, 0x16, 0x01, 0xc4, 0x16, 0x01, 0xa4, 0x16, 0x01, 0x80, 0x16, - 0x01, 0x74, 0x16, 0x01, 0x4b, 0x16, 0x01, 0x30, 0x16, 0x01, 0x24, 0x16, - 0x01, 0x14, 0x16, 0x01, 0xfb, 0x16, 0x01, 0xc4, 0x16, 0x01, 0xa0, 0x16, - 0x01, 0x94, 0x16, 0x40, 0x30, 0x01, 0x7b, 0x16, 0x01, 0x64, 0x16, 0x01, - 0x44, 0x16, 0x01, 0x34, 0x16, 0x01, 0x1b, 0x16, 0x01, 0xf0, 0x16, 0x01, - 0xe4, 0x16, 0x01, 0xcb, 0x16, 0x01, 0xb4, 0x16, 0x01, 0x94, 0x16, 0x01, - 0x84, 0x16, 0x01, 0x64, 0x16, 0x01, 0x3f, 0x16, 0x01, 0x02, 0x10, 0x16, - 0x01, 0x00, 0x16, 0x01, 0x08, 0x5e, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x00, 0x3f, 0x17, 0x33, 0x3f, 0x17, 0x33, 0x11, 0x01, 0x33, 0x5e, 0x5d, - 0x11, 0x33, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x33, 0x32, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x23, 0x03, 0x27, - 0x0e, 0x01, 0x03, 0x23, 0x01, 0x33, 0x13, 0x16, 0x17, 0x37, 0x13, 0x33, - 0x13, 0x17, 0x37, 0x13, 0x33, 0x04, 0x96, 0xd1, 0xbd, 0x24, 0x09, 0x26, - 0xb9, 0xd0, 0xfe, 0xd1, 0xb2, 0xb7, 0x07, 0x24, 0x11, 0xe2, 0xc1, 0xbd, - 0x2e, 0x1f, 0xcd, 0xb0, 0x02, 0xfd, 0xa9, 0x2d, 0xa9, 0xfd, 0x30, 0x04, - 0x3a, 0xfd, 0x21, 0x18, 0xae, 0x4a, 0x03, 0x5b, 0xfd, 0x19, 0xbe, 0x8b, - 0x03, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x03, 0xea, - 0x04, 0x3a, 0x00, 0x0b, 0x01, 0x54, 0x40, 0xa0, 0x00, 0x0b, 0x08, 0x09, - 0x0a, 0x04, 0x01, 0x07, 0x06, 0x05, 0x02, 0x03, 0x03, 0x05, 0x07, 0x09, - 0x0b, 0x05, 0x0d, 0x0c, 0x84, 0x0d, 0x01, 0x76, 0x0d, 0x01, 0x44, 0x0d, - 0x54, 0x0d, 0x64, 0x0d, 0x03, 0x36, 0x0d, 0x01, 0x24, 0x0d, 0x01, 0x16, - 0x0d, 0x01, 0x04, 0x0d, 0x01, 0xf6, 0x0d, 0x01, 0xe4, 0x0d, 0x01, 0xd6, - 0x0d, 0x01, 0xc4, 0x0d, 0x01, 0xb6, 0x0d, 0x01, 0xa4, 0x0d, 0x01, 0x76, - 0x0d, 0x86, 0x0d, 0x96, 0x0d, 0x03, 0x64, 0x0d, 0x01, 0x06, 0x0d, 0x16, - 0x0d, 0x26, 0x0d, 0x46, 0x0d, 0x56, 0x0d, 0x05, 0x67, 0x06, 0x0d, 0x46, - 0x0d, 0x56, 0x0d, 0x86, 0x0d, 0x96, 0x0d, 0xc6, 0x0d, 0xd6, 0x0d, 0xe6, - 0x0d, 0x08, 0x99, 0x0d, 0xd9, 0x0d, 0x02, 0x64, 0x0d, 0x01, 0x56, 0x0d, - 0x01, 0x44, 0x0d, 0x01, 0x36, 0x0d, 0x01, 0x24, 0x0d, 0x01, 0x16, 0x0d, - 0x01, 0x04, 0x0d, 0x01, 0xd6, 0x0d, 0xe6, 0x0d, 0xf6, 0x0d, 0x03, 0xc4, - 0x0d, 0x01, 0x06, 0x0d, 0x26, 0x0d, 0x36, 0x0d, 0x46, 0x0d, 0x04, 0x37, - 0x66, 0x0d, 0xa6, 0x0d, 0xb6, 0x0d, 0xe6, 0x0d, 0xf6, 0x0d, 0x05, 0x0d, - 0xb8, 0xff, 0xc0, 0x40, 0x36, 0x3d, 0x42, 0x48, 0x39, 0x0d, 0x01, 0x22, - 0x0d, 0x01, 0x01, 0x00, 0x0d, 0x10, 0x0d, 0x02, 0xf4, 0x0d, 0x01, 0xc0, - 0x0d, 0xd0, 0x0d, 0xe0, 0x0d, 0x03, 0xb4, 0x0d, 0x01, 0x80, 0x0d, 0x90, - 0x0d, 0xa0, 0x0d, 0x03, 0x74, 0x0d, 0x01, 0x60, 0x0d, 0x01, 0x54, 0x0d, - 0x01, 0x40, 0x0d, 0x01, 0x34, 0x0d, 0x01, 0x20, 0x0d, 0x01, 0x0d, 0xb8, - 0xff, 0xc0, 0x40, 0x22, 0x12, 0x18, 0x48, 0xa0, 0x0d, 0x01, 0x02, 0x00, - 0x0d, 0x10, 0x0d, 0x50, 0x0d, 0x70, 0x0d, 0x80, 0x0d, 0x90, 0x0d, 0x06, - 0x07, 0x0a, 0x04, 0x01, 0x04, 0x07, 0x03, 0x02, 0x08, 0x06, 0x0f, 0x00, - 0x02, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x01, 0x5e, 0x5d, 0x5f, 0x5d, 0x2b, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x72, 0x5f, 0x72, 0x72, 0x2b, 0x72, 0x5e, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x09, - 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x03, 0x21, - 0xfe, 0xdd, 0xfe, 0xdb, 0xc2, 0x01, 0x81, 0xfe, 0x91, 0xc7, 0x01, 0x0e, - 0x01, 0x0c, 0xc9, 0xfe, 0x91, 0x01, 0x86, 0x01, 0xbc, 0xfe, 0x44, 0x02, - 0x2c, 0x02, 0x0e, 0xfe, 0x5b, 0x01, 0xa5, 0xfd, 0xf4, 0xfd, 0xd2, 0x00, - 0x00, 0x01, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x16, - 0x01, 0xe4, 0x40, 0xff, 0x13, 0x08, 0x0f, 0x11, 0x12, 0x0a, 0x09, 0x09, - 0x03, 0x0f, 0x12, 0x04, 0x18, 0x17, 0x08, 0x13, 0x0f, 0x13, 0x17, 0x11, - 0x09, 0x0f, 0x00, 0x05, 0x50, 0x59, 0x00, 0x1b, 0x92, 0x18, 0x01, 0x82, - 0x18, 0x01, 0x74, 0x18, 0x01, 0x64, 0x18, 0x01, 0x52, 0x18, 0x01, 0x42, - 0x18, 0x01, 0x34, 0x18, 0x01, 0x24, 0x18, 0x01, 0x12, 0x18, 0x01, 0x02, - 0x18, 0x01, 0xf4, 0x18, 0x01, 0xe4, 0x18, 0x01, 0xd2, 0x18, 0x01, 0xc2, - 0x18, 0x01, 0xb4, 0x18, 0x01, 0xa4, 0x18, 0x01, 0x92, 0x18, 0x01, 0x82, - 0x18, 0x01, 0x74, 0x18, 0x01, 0x64, 0x18, 0x01, 0x56, 0x18, 0x01, 0x42, - 0x18, 0x01, 0x34, 0x18, 0x01, 0x24, 0x18, 0x01, 0x16, 0x18, 0x01, 0x02, - 0x18, 0x01, 0x67, 0xf4, 0x18, 0x01, 0xe4, 0x18, 0x01, 0xd6, 0x18, 0x01, - 0xc2, 0x18, 0x01, 0xb4, 0x18, 0x01, 0xa4, 0x18, 0x01, 0x96, 0x18, 0x01, - 0x82, 0x18, 0x01, 0x74, 0x18, 0x01, 0x64, 0x18, 0x01, 0x56, 0x18, 0x01, - 0x42, 0x18, 0x01, 0x34, 0x18, 0x01, 0x24, 0x18, 0x01, 0x16, 0x18, 0x01, - 0x02, 0x18, 0x01, 0xf4, 0x18, 0x01, 0xe4, 0x18, 0x01, 0xd6, 0x18, 0x01, - 0xc2, 0x18, 0x01, 0x01, 0xb0, 0x18, 0x01, 0xa0, 0x18, 0x01, 0x94, 0x18, - 0x01, 0x84, 0x18, 0x01, 0x70, 0x18, 0x01, 0x60, 0x18, 0x01, 0x54, 0x18, - 0x01, 0x44, 0x18, 0x01, 0x30, 0x18, 0x01, 0x20, 0x18, 0x01, 0x14, 0x18, - 0x01, 0x04, 0x18, 0x01, 0xf0, 0x18, 0x01, 0xe0, 0x18, 0x01, 0xd4, 0x18, - 0x01, 0xc4, 0x18, 0x01, 0xb0, 0x18, 0x01, 0xa0, 0x18, 0x01, 0x94, 0x18, - 0x01, 0x84, 0x18, 0x01, 0x70, 0x18, 0x01, 0x60, 0x18, 0x01, 0x54, 0x18, - 0x01, 0x44, 0x18, 0x01, 0x30, 0x18, 0x01, 0x20, 0x18, 0x01, 0x14, 0x18, - 0x01, 0x04, 0x18, 0x01, 0x37, 0xe0, 0x18, 0x40, 0x5a, 0x01, 0xd4, 0x18, - 0x01, 0xc4, 0x18, 0x01, 0xa0, 0x18, 0x01, 0x94, 0x18, 0x01, 0x84, 0x18, - 0x01, 0x60, 0x18, 0x01, 0x54, 0x18, 0x01, 0x44, 0x18, 0x01, 0x20, 0x18, - 0x01, 0x14, 0x18, 0x01, 0x04, 0x18, 0x01, 0xe0, 0x18, 0x01, 0xd4, 0x18, - 0x01, 0xc4, 0x18, 0x01, 0xa0, 0x18, 0x01, 0x94, 0x18, 0x01, 0x84, 0x18, - 0x01, 0x60, 0x18, 0x01, 0x02, 0x50, 0x18, 0x01, 0x30, 0x18, 0x01, 0x20, - 0x18, 0x01, 0x00, 0x18, 0x01, 0xc0, 0x18, 0x01, 0x90, 0x18, 0x01, 0x80, - 0x18, 0x01, 0x50, 0x18, 0x01, 0x2f, 0x18, 0x01, 0x10, 0x18, 0x01, 0x00, - 0x18, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x3f, 0x01, 0x01, 0x33, 0x13, 0x1e, 0x02, 0x17, 0x37, 0x13, 0x33, - 0x01, 0x0e, 0x02, 0xbf, 0x4a, 0x32, 0x26, 0x2e, 0xa8, 0x62, 0x11, 0xfe, - 0x53, 0xc0, 0xe4, 0x05, 0x0e, 0x4c, 0x03, 0x46, 0xed, 0xbe, 0xfe, 0x60, - 0x43, 0x74, 0x8d, 0xfe, 0x57, 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0x04, 0x35, - 0xfd, 0xaa, 0x0e, 0x27, 0xde, 0x0d, 0xc5, 0x02, 0xb1, 0xfb, 0xc6, 0xad, - 0xa9, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, 0x00, 0x03, 0x9a, - 0x04, 0x3a, 0x00, 0x09, 0x01, 0x62, 0x40, 0xfc, 0x02, 0x06, 0x07, 0x01, - 0x01, 0x03, 0x06, 0x08, 0x04, 0x0b, 0x0a, 0x06, 0x03, 0x04, 0x03, 0x50, - 0x59, 0x04, 0x0f, 0x01, 0x07, 0x00, 0x07, 0x50, 0x59, 0x00, 0x15, 0xd4, - 0x0b, 0x01, 0xc4, 0x0b, 0x01, 0xb4, 0x0b, 0x01, 0xa4, 0x0b, 0x01, 0x94, - 0x0b, 0x01, 0x84, 0x0b, 0x01, 0x74, 0x0b, 0x01, 0x64, 0x0b, 0x01, 0x54, - 0x0b, 0x01, 0x40, 0x0b, 0x01, 0x34, 0x0b, 0x01, 0x20, 0x0b, 0x01, 0x14, - 0x0b, 0x01, 0x00, 0x0b, 0x01, 0xf4, 0x0b, 0x01, 0xe0, 0x0b, 0x01, 0xd4, - 0x0b, 0x01, 0xc0, 0x0b, 0x01, 0xb4, 0x0b, 0x01, 0xa4, 0x0b, 0x01, 0x94, - 0x0b, 0x01, 0x84, 0x0b, 0x01, 0x74, 0x0b, 0x01, 0x64, 0x0b, 0x01, 0x54, - 0x0b, 0x01, 0x44, 0x0b, 0x01, 0x34, 0x0b, 0x01, 0x24, 0x0b, 0x01, 0x04, - 0x0b, 0x01, 0xe4, 0x0b, 0x01, 0xc4, 0x0b, 0x01, 0xb4, 0x0b, 0x01, 0xa0, - 0x0b, 0x01, 0x94, 0x0b, 0x01, 0x80, 0x0b, 0x01, 0x74, 0x0b, 0x01, 0x64, - 0x0b, 0x01, 0x54, 0x0b, 0x01, 0x44, 0x0b, 0x01, 0x34, 0x0b, 0x01, 0x24, - 0x0b, 0x01, 0x14, 0x0b, 0x01, 0x04, 0x0b, 0x01, 0x37, 0xf4, 0x0b, 0x01, - 0xe4, 0x0b, 0x01, 0xd4, 0x0b, 0x01, 0xc4, 0x0b, 0x01, 0xa4, 0x0b, 0x01, - 0x84, 0x0b, 0x01, 0x64, 0x0b, 0x01, 0x44, 0x0b, 0x01, 0x04, 0x0b, 0x01, - 0xf4, 0x0b, 0x01, 0xe4, 0x0b, 0x01, 0xd4, 0x0b, 0x01, 0xc4, 0x0b, 0x01, - 0xb4, 0x0b, 0x01, 0xa4, 0x0b, 0x01, 0x94, 0x0b, 0x01, 0x84, 0x0b, 0x01, - 0x64, 0x0b, 0x01, 0x44, 0x0b, 0x01, 0x24, 0x0b, 0x01, 0x04, 0x0b, 0x01, - 0xe0, 0x0b, 0x01, 0x02, 0xd0, 0x0b, 0x01, 0xc0, 0x0b, 0x01, 0xb0, 0x0b, - 0x01, 0xa0, 0x0b, 0x01, 0x90, 0x0b, 0x01, 0x70, 0x0b, 0x01, 0x50, 0x0b, - 0x01, 0x20, 0x0b, 0x01, 0x00, 0x0b, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x33, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x15, 0x53, 0x02, - 0x5d, 0xfd, 0xc5, 0x03, 0x10, 0xfd, 0xa2, 0x02, 0x73, 0x89, 0x03, 0x26, - 0x8b, 0x89, 0xfc, 0xda, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, - 0xfe, 0x57, 0x02, 0x88, 0x05, 0xcc, 0x00, 0x23, 0x00, 0x5f, 0x40, 0x3a, - 0x16, 0x1e, 0x1e, 0x0b, 0x03, 0x11, 0x22, 0x03, 0x07, 0x04, 0x24, 0x25, - 0x19, 0x08, 0x07, 0x08, 0x07, 0xf5, 0x59, 0x0f, 0x08, 0x4f, 0x08, 0x02, - 0x2f, 0x08, 0xbf, 0x08, 0xcf, 0x08, 0x03, 0x0f, 0x08, 0x2f, 0x08, 0x4f, - 0x08, 0xef, 0x08, 0x04, 0x0b, 0x03, 0x08, 0x08, 0x0f, 0x00, 0x0f, 0x12, - 0xf5, 0x59, 0x0f, 0x00, 0x00, 0x21, 0xf5, 0x59, 0x00, 0x1b, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x71, 0x72, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, - 0x35, 0x11, 0x34, 0x26, 0x27, 0x35, 0x3e, 0x01, 0x35, 0x11, 0x34, 0x36, - 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x07, 0x15, - 0x1e, 0x01, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x02, 0x01, 0x7f, - 0x89, 0x69, 0x6e, 0x6d, 0x6a, 0x85, 0x83, 0x87, 0x3f, 0x5b, 0x4d, 0x6a, - 0x58, 0x59, 0x69, 0x4d, 0x5b, 0x3f, 0xfe, 0x57, 0x9a, 0x8b, 0x01, 0x69, - 0x75, 0x73, 0x05, 0x7f, 0x04, 0x73, 0x75, 0x01, 0x6a, 0x8d, 0x98, 0x81, - 0x6b, 0x6c, 0xfe, 0x9c, 0x5e, 0x89, 0x15, 0x02, 0x15, 0x88, 0x61, 0xfe, - 0x9b, 0x6a, 0x6d, 0x81, 0x00, 0x01, 0x00, 0xb7, 0xfe, 0x4e, 0x01, 0x5d, - 0x05, 0xcc, 0x00, 0x03, 0x01, 0x41, 0x40, 0xe8, 0x00, 0x04, 0x05, 0x01, - 0x00, 0x00, 0x84, 0x05, 0x01, 0x74, 0x05, 0x01, 0x60, 0x05, 0x01, 0x54, - 0x05, 0x01, 0x44, 0x05, 0x01, 0x34, 0x05, 0x01, 0x24, 0x05, 0x01, 0xe0, - 0x05, 0x01, 0xd4, 0x05, 0x01, 0xc4, 0x05, 0x01, 0xb4, 0x05, 0x01, 0xa4, - 0x05, 0x01, 0x84, 0x05, 0x01, 0x74, 0x05, 0x01, 0x64, 0x05, 0x01, 0x20, - 0x05, 0x01, 0x14, 0x05, 0x01, 0x04, 0x05, 0x01, 0x68, 0xf4, 0x05, 0x01, - 0xe4, 0x05, 0x01, 0xb4, 0x05, 0x01, 0x70, 0x05, 0x01, 0x64, 0x05, 0x01, - 0x54, 0x05, 0x01, 0x44, 0x05, 0x01, 0x34, 0x05, 0x01, 0xc0, 0x05, 0x01, - 0xb0, 0x05, 0x01, 0xa4, 0x05, 0x01, 0x94, 0x05, 0x01, 0x84, 0x05, 0x01, - 0x74, 0x05, 0x01, 0x3b, 0x05, 0x01, 0x2b, 0x05, 0x01, 0x10, 0x05, 0x01, - 0x00, 0x05, 0x01, 0x02, 0xf0, 0x05, 0x01, 0xe0, 0x05, 0x01, 0xd0, 0x05, - 0x01, 0xc0, 0x05, 0x01, 0x7f, 0x05, 0x01, 0x6f, 0x05, 0x01, 0x50, 0x05, - 0x01, 0x40, 0x05, 0x01, 0x30, 0x05, 0x01, 0x20, 0x05, 0x01, 0x10, 0x05, - 0x01, 0x00, 0x05, 0x01, 0x38, 0xcf, 0x05, 0x01, 0xb0, 0x05, 0x01, 0xa0, - 0x05, 0x01, 0x70, 0x05, 0x01, 0x60, 0x05, 0x01, 0x1f, 0x05, 0x01, 0x00, - 0x05, 0x01, 0xf0, 0x05, 0x01, 0xe0, 0x05, 0x01, 0xa0, 0x05, 0x01, 0x50, - 0x05, 0x01, 0x40, 0x05, 0x01, 0x30, 0x05, 0x01, 0x20, 0x05, 0x01, 0xef, - 0x05, 0x01, 0xdf, 0x05, 0x01, 0xcf, 0x05, 0x01, 0xbf, 0x05, 0x01, 0xaf, - 0x05, 0x01, 0x90, 0x05, 0x01, 0x80, 0x05, 0x01, 0x70, 0x05, 0x01, 0x40, - 0x05, 0x01, 0x2f, 0x05, 0x01, 0x1f, 0x05, 0x01, 0x0f, 0x05, 0x01, 0x07, - 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x2f, 0x3f, 0x11, 0x12, 0x01, - 0x39, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0xb7, 0xa6, 0xfe, 0x4e, 0x07, - 0x7e, 0xf8, 0x82, 0x00, 0x00, 0x01, 0x00, 0x22, 0xfe, 0x57, 0x02, 0x87, - 0x05, 0xcc, 0x00, 0x23, 0x00, 0x5f, 0x40, 0x3a, 0x0b, 0x16, 0x16, 0x04, - 0x1d, 0x1a, 0x1d, 0x23, 0x10, 0x04, 0x24, 0x25, 0x07, 0x19, 0x1a, 0x19, - 0x1a, 0xf5, 0x59, 0x0f, 0x19, 0x4f, 0x19, 0x02, 0x2f, 0x19, 0xbf, 0x19, - 0xcf, 0x19, 0x03, 0x0f, 0x19, 0x2f, 0x19, 0x4f, 0x19, 0xef, 0x19, 0x04, - 0x0b, 0x03, 0x19, 0x19, 0x11, 0x22, 0x22, 0x23, 0xf5, 0x59, 0x22, 0x1b, - 0x11, 0x10, 0xf5, 0x59, 0x11, 0x00, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x72, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x32, 0x36, 0x35, 0x11, 0x34, 0x36, - 0x37, 0x35, 0x2e, 0x01, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, - 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x17, 0x15, 0x0e, 0x01, 0x15, 0x11, - 0x14, 0x06, 0x2b, 0x01, 0x35, 0x5e, 0x5b, 0x4f, 0x68, 0x59, 0x56, 0x6b, - 0x4f, 0x5b, 0x3c, 0x84, 0x83, 0x85, 0x6a, 0x6f, 0x70, 0x69, 0x89, 0x7f, - 0x84, 0xfe, 0xd8, 0x6d, 0x6a, 0x01, 0x65, 0x62, 0x88, 0x14, 0x02, 0x14, - 0x87, 0x61, 0x01, 0x64, 0x6c, 0x6b, 0x81, 0x98, 0x8d, 0xfe, 0x96, 0x74, - 0x74, 0x04, 0x7f, 0x04, 0x74, 0x75, 0xfe, 0x97, 0x8a, 0x9b, 0x81, 0x00, - 0x00, 0x01, 0x00, 0x5c, 0x02, 0x29, 0x04, 0x50, 0x03, 0x27, 0x00, 0x16, - 0x00, 0x6f, 0x40, 0x09, 0x08, 0x13, 0x17, 0x18, 0x00, 0x11, 0xad, 0x59, - 0x08, 0xb8, 0xff, 0xc0, 0xb4, 0x26, 0x3c, 0x48, 0x08, 0x00, 0xb8, 0xff, - 0xc0, 0xb3, 0x17, 0x1c, 0x48, 0x00, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x14, - 0x48, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x09, 0x0c, 0x48, 0x00, 0x40, - 0x13, 0x40, 0x29, 0x3c, 0x48, 0x13, 0x0b, 0x0b, 0x05, 0xad, 0x59, 0x1f, - 0x0b, 0x4f, 0x0b, 0x9f, 0x0b, 0x03, 0x6f, 0x0b, 0x7f, 0x0b, 0x9f, 0x0b, - 0xaf, 0x0b, 0xcf, 0x0b, 0xef, 0x0b, 0xff, 0x0b, 0x07, 0x0b, 0x40, 0x09, - 0x0d, 0x48, 0x0b, 0x00, 0x2f, 0x2b, 0x5d, 0x71, 0x2b, 0x00, 0x18, 0x10, - 0xc4, 0x2b, 0x1a, 0xdd, 0x2b, 0x2b, 0x2b, 0xc4, 0x2b, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, - 0x37, 0x15, 0x0e, 0x01, 0x03, 0x4c, 0x45, 0x91, 0x49, 0x81, 0x58, 0x43, - 0x74, 0x41, 0x6f, 0x98, 0x34, 0x7f, 0x82, 0x1f, 0x78, 0x2d, 0x82, 0x72, - 0x3a, 0x75, 0x02, 0x29, 0x2c, 0x1a, 0x2d, 0x29, 0x2f, 0x8f, 0x54, 0x1a, - 0x2e, 0x0c, 0x21, 0x5c, 0x95, 0x2a, 0x26, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x02, 0x00, 0xf2, 0xfe, 0xb9, 0x01, 0xb8, 0x04, 0x3a, 0x00, 0x03, - 0x00, 0x07, 0x01, 0xc2, 0x40, 0xff, 0x02, 0x03, 0x03, 0x05, 0x06, 0x06, - 0x08, 0x09, 0x00, 0x06, 0x40, 0x07, 0x06, 0x9c, 0x5b, 0x07, 0x0f, 0x06, - 0x03, 0x01, 0x09, 0x03, 0x90, 0x09, 0x01, 0x82, 0x09, 0x01, 0x72, 0x09, - 0x01, 0x60, 0x09, 0x01, 0x52, 0x09, 0x01, 0x42, 0x09, 0x01, 0x32, 0x09, - 0x01, 0x22, 0x09, 0x01, 0x12, 0x09, 0x01, 0x02, 0x09, 0x01, 0xf2, 0x09, - 0x01, 0xe2, 0x09, 0x01, 0xd0, 0x09, 0x01, 0xc2, 0x09, 0x01, 0xb2, 0x09, - 0x01, 0xa2, 0x09, 0x01, 0x92, 0x09, 0x01, 0x82, 0x09, 0x01, 0x72, 0x09, - 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, 0x42, 0x09, 0x01, 0x32, 0x09, - 0x01, 0x22, 0x09, 0x01, 0x12, 0x09, 0x01, 0x02, 0x09, 0x01, 0x67, 0xf2, - 0x09, 0x01, 0xe2, 0x09, 0x01, 0xd4, 0x09, 0x01, 0xc4, 0x09, 0x01, 0xb4, - 0x09, 0x01, 0xa6, 0x09, 0x01, 0x96, 0x09, 0x01, 0x84, 0x09, 0x01, 0x76, - 0x09, 0x01, 0x62, 0x09, 0x01, 0x52, 0x09, 0x01, 0x44, 0x09, 0x01, 0x34, - 0x09, 0x01, 0x24, 0x09, 0x01, 0x16, 0x09, 0x01, 0x06, 0x09, 0x01, 0xf6, - 0x09, 0x01, 0xd2, 0x09, 0x01, 0xc2, 0x09, 0x01, 0x01, 0xb0, 0x09, 0x01, - 0xa0, 0x09, 0x01, 0x90, 0x09, 0x01, 0x84, 0x09, 0x01, 0x74, 0x09, 0x01, - 0x64, 0x09, 0x01, 0x40, 0x09, 0x01, 0x30, 0x09, 0x01, 0x20, 0x09, 0x01, - 0x10, 0x09, 0x01, 0x00, 0x09, 0x01, 0xf4, 0x09, 0x01, 0xe4, 0x09, 0x01, - 0xd4, 0x09, 0x01, 0xb0, 0x09, 0x01, 0xa0, 0x09, 0x01, 0x94, 0x09, 0x01, - 0x84, 0x09, 0x01, 0x74, 0x09, 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, - 0x44, 0x09, 0x01, 0x20, 0x09, 0x01, 0x10, 0x09, 0x01, 0x04, 0x09, 0x01, - 0x37, 0xf4, 0x09, 0x01, 0xe4, 0x09, 0x01, 0xb4, 0x09, 0x01, 0x90, 0x09, - 0x01, 0x80, 0x09, 0x01, 0x74, 0x09, 0x01, 0x64, 0x09, 0x40, 0x42, 0x01, - 0x54, 0x09, 0x01, 0x1b, 0x09, 0x01, 0x00, 0x09, 0x01, 0xf0, 0x09, 0x01, - 0xe4, 0x09, 0x01, 0xd4, 0x09, 0x01, 0xc4, 0x09, 0x01, 0x84, 0x09, 0x01, - 0x74, 0x09, 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, 0x44, 0x09, 0x01, - 0x34, 0x09, 0x01, 0xf4, 0x09, 0x01, 0xe4, 0x09, 0x01, 0xd4, 0x09, 0x01, - 0xa4, 0x09, 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, 0x40, 0x09, 0x01, - 0x02, 0x0f, 0x09, 0x01, 0x07, 0x5e, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x5f, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x00, 0x2f, 0x5e, 0x5d, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, - 0x13, 0x23, 0x13, 0x15, 0x23, 0x35, 0x01, 0x0a, 0x94, 0x18, 0xc4, 0xc6, - 0xc2, 0x02, 0xad, 0xfc, 0x0c, 0x05, 0x81, 0xc9, 0xc9, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x87, 0xff, 0xe1, 0x03, 0xfa, 0x05, 0x81, 0x00, 0x1f, - 0x00, 0x5b, 0x40, 0x30, 0x17, 0x16, 0x16, 0x04, 0x13, 0x08, 0x08, 0x10, - 0x09, 0x09, 0x0d, 0x03, 0x03, 0x04, 0x1d, 0x0d, 0x04, 0x0d, 0x21, 0x20, - 0x13, 0x1a, 0x50, 0x59, 0x17, 0x10, 0x00, 0x13, 0xc0, 0x13, 0xd0, 0x13, - 0x03, 0x13, 0x03, 0x13, 0x40, 0x11, 0x03, 0x0a, 0x03, 0x07, 0x07, 0x00, - 0x50, 0x59, 0x07, 0x08, 0x00, 0x2f, 0xcd, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x18, 0x3f, 0x1a, 0xcd, 0x5f, 0x5e, 0x5d, 0x32, 0x32, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x36, - 0x37, 0x17, 0x0e, 0x01, 0x07, 0x15, 0x23, 0x35, 0x26, 0x02, 0x11, 0x34, - 0x12, 0x37, 0x35, 0x33, 0x15, 0x1e, 0x01, 0x17, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x54, 0x60, 0x81, 0x0f, 0xb6, 0x13, - 0xbe, 0x93, 0x7c, 0xc7, 0xcc, 0xcc, 0xc7, 0x7c, 0x8f, 0xb4, 0x1b, 0xb9, - 0x0e, 0x72, 0x69, 0x8f, 0x80, 0x88, 0x01, 0x15, 0x68, 0x6c, 0x0c, 0x90, - 0xb6, 0x0e, 0xa8, 0xa8, 0x12, 0x01, 0x1d, 0x01, 0x01, 0xfd, 0x01, 0x1f, - 0x11, 0x9b, 0x9b, 0x0f, 0xa6, 0x8b, 0x0e, 0x5a, 0x6a, 0xbe, 0xe1, 0xd8, - 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x04, 0x50, - 0x05, 0x96, 0x00, 0x25, 0x00, 0x8a, 0x40, 0x54, 0x22, 0x0b, 0x04, 0x14, - 0x13, 0x1c, 0x13, 0x00, 0x1b, 0x1f, 0x1f, 0x0c, 0x08, 0x08, 0x04, 0x25, - 0x00, 0x04, 0x00, 0x26, 0x27, 0x1e, 0x09, 0x0c, 0x09, 0x51, 0x59, 0x1b, - 0x0f, 0x0c, 0x1f, 0x0c, 0xaf, 0x0c, 0x03, 0x0f, 0x0c, 0x3f, 0x0c, 0x6f, - 0x0c, 0x7f, 0x0c, 0x9f, 0x0c, 0xaf, 0x0c, 0xcf, 0x0c, 0xdf, 0x0c, 0x08, - 0x08, 0x03, 0x0c, 0x40, 0x25, 0x2a, 0x48, 0x0c, 0x40, 0x1b, 0x20, 0x48, - 0x0c, 0x0c, 0x22, 0x10, 0x10, 0x17, 0x73, 0x59, 0x14, 0x10, 0x07, 0x05, - 0x22, 0x04, 0x22, 0x74, 0x59, 0x25, 0x04, 0x18, 0x00, 0x3f, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x2b, 0x5f, 0x5e, 0x5d, 0x71, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x0e, 0x01, 0x23, 0x21, 0x35, 0x3e, 0x01, 0x3d, 0x01, 0x23, 0x35, - 0x33, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x11, 0x21, 0x15, 0x21, 0x15, 0x14, 0x06, 0x07, 0x21, - 0x32, 0x37, 0x04, 0x50, 0x11, 0xb0, 0x90, 0xfd, 0x46, 0x59, 0x56, 0xba, - 0xba, 0xce, 0xc4, 0x93, 0xc8, 0x22, 0xae, 0x15, 0x6f, 0x47, 0x72, 0x70, - 0x01, 0x98, 0xfe, 0x68, 0x5c, 0x4d, 0x01, 0xe3, 0xae, 0x1d, 0x01, 0x37, - 0x96, 0xa1, 0x9a, 0x2e, 0xa0, 0x79, 0x90, 0x81, 0x01, 0x18, 0xc3, 0xc9, - 0x79, 0x6d, 0x39, 0x40, 0x4b, 0x73, 0x7d, 0xfe, 0xe0, 0x81, 0x7e, 0x77, - 0xba, 0x29, 0xb0, 0x00, 0x00, 0x02, 0x00, 0x71, 0x00, 0xe1, 0x04, 0x02, - 0x04, 0x73, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x42, 0x40, 0x21, 0x1c, 0x19, - 0x03, 0x00, 0x22, 0x11, 0x0b, 0x0e, 0x00, 0x0e, 0x28, 0x29, 0x0f, 0x29, - 0x01, 0x0b, 0x03, 0x15, 0x1f, 0xb0, 0x59, 0x18, 0x12, 0x15, 0x07, 0x40, - 0x07, 0x25, 0xb0, 0x59, 0x0a, 0x04, 0x07, 0x00, 0x2f, 0x33, 0x33, 0x2b, - 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x32, 0x32, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x31, 0x30, 0x13, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, 0x33, 0x32, 0x17, - 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x23, - 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x89, 0x4e, 0x64, 0x68, 0x63, 0x72, - 0x8c, 0x89, 0x72, 0x61, 0x68, 0x60, 0x50, 0x52, 0x64, 0x66, 0x65, 0x72, - 0x89, 0x8f, 0x6d, 0x69, 0x66, 0x66, 0x4e, 0x9a, 0xa6, 0x73, 0x72, 0xa6, - 0xa7, 0x71, 0x71, 0xa8, 0x02, 0xac, 0x8a, 0x72, 0x64, 0x67, 0x65, 0x52, - 0x50, 0x61, 0x69, 0x60, 0x75, 0x87, 0x8a, 0x72, 0x64, 0x69, 0x65, 0x4e, - 0x50, 0x69, 0x69, 0x66, 0x72, 0x8c, 0x75, 0xa3, 0xa2, 0x76, 0x75, 0xa4, - 0xa3, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x04, 0x76, - 0x05, 0x81, 0x00, 0x16, 0x00, 0x86, 0x40, 0x4f, 0x02, 0x06, 0x08, 0x0f, - 0x0b, 0x15, 0x16, 0x16, 0x18, 0x14, 0x09, 0x04, 0x00, 0x08, 0x08, 0x11, - 0x0d, 0x09, 0x09, 0x18, 0x17, 0x13, 0x12, 0x12, 0x17, 0x03, 0x0f, 0x10, - 0x0f, 0x51, 0x59, 0x07, 0x0b, 0x0c, 0x0b, 0x51, 0x59, 0x04, 0x2f, 0x0c, - 0x9f, 0x0c, 0xaf, 0x0c, 0x03, 0x0c, 0x40, 0x29, 0x2d, 0x48, 0x00, 0x0c, - 0x10, 0x0c, 0x20, 0x0c, 0xa0, 0x0c, 0x04, 0x0c, 0x14, 0x00, 0x0f, 0x10, - 0xaf, 0x10, 0x02, 0x08, 0xf0, 0x10, 0x01, 0x10, 0x10, 0x08, 0x15, 0x12, - 0x03, 0x08, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x5d, 0x5e, - 0x5d, 0x33, 0x33, 0xce, 0x5d, 0x2b, 0x71, 0x32, 0x2b, 0x11, 0x00, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x32, 0x32, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x21, 0x15, 0x21, - 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x37, 0x21, - 0x35, 0x21, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0xd0, 0x01, 0x41, 0xfe, - 0x81, 0x01, 0x7f, 0xfe, 0x81, 0xb2, 0xfe, 0x83, 0x01, 0x7d, 0x02, 0xfe, - 0x81, 0x01, 0x40, 0xfe, 0x5b, 0xc7, 0x01, 0x73, 0x01, 0x77, 0xc7, 0x02, - 0xc5, 0x7d, 0x9a, 0x7f, 0xfe, 0xd1, 0x01, 0x2f, 0x7f, 0x9a, 0x7d, 0x02, - 0xbc, 0xfd, 0x79, 0x02, 0x87, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb7, - 0xfe, 0x4e, 0x01, 0x5d, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x01, 0x55, - 0x40, 0xf2, 0x03, 0x07, 0x07, 0x00, 0x04, 0x04, 0x08, 0x09, 0x05, 0x00, - 0x05, 0x00, 0x01, 0x04, 0x01, 0x00, 0x84, 0x09, 0x01, 0x74, 0x09, 0x01, - 0x60, 0x09, 0x01, 0x54, 0x09, 0x01, 0x44, 0x09, 0x01, 0x34, 0x09, 0x01, - 0x24, 0x09, 0x01, 0xe0, 0x09, 0x01, 0xd4, 0x09, 0x01, 0xc4, 0x09, 0x01, - 0xb4, 0x09, 0x01, 0xa4, 0x09, 0x01, 0x84, 0x09, 0x01, 0x74, 0x09, 0x01, - 0x64, 0x09, 0x01, 0x20, 0x09, 0x01, 0x14, 0x09, 0x01, 0x04, 0x09, 0x01, - 0x68, 0xf4, 0x09, 0x01, 0xe4, 0x09, 0x01, 0xb4, 0x09, 0x01, 0x70, 0x09, - 0x01, 0x64, 0x09, 0x01, 0x54, 0x09, 0x01, 0x44, 0x09, 0x01, 0x34, 0x09, - 0x01, 0xc0, 0x09, 0x01, 0xb0, 0x09, 0x01, 0xa4, 0x09, 0x01, 0x94, 0x09, - 0x01, 0x84, 0x09, 0x01, 0x74, 0x09, 0x01, 0x3b, 0x09, 0x01, 0x2b, 0x09, - 0x01, 0x10, 0x09, 0x01, 0x00, 0x09, 0x01, 0x02, 0xf0, 0x09, 0x01, 0xe0, - 0x09, 0x01, 0xd0, 0x09, 0x01, 0xc0, 0x09, 0x01, 0x7f, 0x09, 0x01, 0x6f, - 0x09, 0x01, 0x50, 0x09, 0x01, 0x40, 0x09, 0x01, 0x30, 0x09, 0x01, 0x20, - 0x09, 0x01, 0x10, 0x09, 0x01, 0x00, 0x09, 0x01, 0x38, 0xcf, 0x09, 0x01, - 0xb0, 0x09, 0x01, 0xa0, 0x09, 0x01, 0x70, 0x09, 0x01, 0x60, 0x09, 0x01, - 0x1f, 0x09, 0x01, 0x00, 0x09, 0x01, 0xf0, 0x09, 0x01, 0xe0, 0x09, 0x01, - 0xa0, 0x09, 0x01, 0x50, 0x09, 0x01, 0x40, 0x09, 0x01, 0x30, 0x09, 0x01, - 0x20, 0x09, 0x01, 0xef, 0x09, 0x01, 0xdf, 0x09, 0x01, 0xcf, 0x09, 0x01, - 0xbf, 0x09, 0x01, 0xaf, 0x09, 0x01, 0x90, 0x09, 0x01, 0x80, 0x09, 0x01, - 0x70, 0x09, 0x01, 0x40, 0x09, 0x01, 0x2f, 0x09, 0x01, 0x1f, 0x09, 0x01, - 0x0f, 0x09, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, - 0x2f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, - 0x11, 0xb7, 0xa6, 0xa6, 0xa6, 0x02, 0xc2, 0x03, 0x0a, 0xfc, 0xf6, 0xfb, - 0x8c, 0x03, 0x0b, 0xfc, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x73, - 0xff, 0x54, 0x04, 0x00, 0x05, 0xcc, 0x00, 0x33, 0x00, 0x40, 0x00, 0x9b, - 0x40, 0x5f, 0x24, 0x17, 0x17, 0x04, 0x03, 0x03, 0x34, 0x09, 0x31, 0x31, - 0x2b, 0x1e, 0x1d, 0x1d, 0x2e, 0x14, 0x11, 0x3a, 0x2b, 0x11, 0x2b, 0x42, - 0x41, 0x79, 0x24, 0x01, 0x6b, 0x24, 0x01, 0x5c, 0x24, 0x01, 0x38, 0x24, - 0x01, 0x95, 0x3e, 0x01, 0x86, 0x3e, 0x01, 0x35, 0x3e, 0x01, 0x19, 0x37, - 0x01, 0x0a, 0x37, 0x01, 0x7a, 0x37, 0x01, 0x3b, 0x37, 0x01, 0x84, 0x09, - 0x94, 0x09, 0x02, 0x46, 0x09, 0x01, 0x03, 0x10, 0x09, 0x20, 0x09, 0x02, - 0x0f, 0x09, 0x01, 0x0f, 0x06, 0x09, 0x37, 0x3e, 0x24, 0x04, 0x1a, 0x00, - 0x1a, 0x21, 0x51, 0x59, 0x1e, 0x1a, 0x00, 0x06, 0x51, 0x59, 0x04, 0x00, - 0x00, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x12, - 0x00, 0x17, 0x39, 0x5f, 0x5e, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x71, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x39, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x32, 0x32, 0x11, 0x33, 0x32, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, - 0x17, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x2e, 0x01, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, - 0x34, 0x36, 0x01, 0x34, 0x26, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x01, - 0x17, 0x3e, 0x01, 0x02, 0x4c, 0xad, 0xd5, 0x1b, 0xa1, 0x1b, 0xe1, 0x7d, - 0x81, 0x3c, 0x6f, 0x82, 0x93, 0x9c, 0x56, 0x77, 0x64, 0x70, 0x65, 0xe7, - 0xd2, 0xd1, 0xdb, 0x22, 0xa1, 0x14, 0x88, 0x91, 0x88, 0x91, 0x42, 0x7b, - 0x97, 0xc2, 0xab, 0x7b, 0x69, 0x60, 0x6f, 0xd3, 0x01, 0xe1, 0x8b, 0xb0, - 0x6d, 0x81, 0x3b, 0x6f, 0x81, 0x77, 0x87, 0x05, 0xcc, 0x85, 0x7f, 0x14, - 0x96, 0x4f, 0x47, 0x30, 0x46, 0x34, 0x1f, 0x23, 0x53, 0x76, 0x51, 0x63, - 0x96, 0x18, 0x30, 0x81, 0x5b, 0x94, 0xa9, 0x85, 0x8b, 0x1f, 0x5a, 0x52, - 0x58, 0x52, 0x39, 0x4d, 0x3a, 0x25, 0x2d, 0x9c, 0x70, 0x59, 0x94, 0x1e, - 0x20, 0x86, 0x56, 0x8b, 0x9b, 0xfc, 0xcb, 0x48, 0x68, 0x29, 0x06, 0x6a, - 0x54, 0x31, 0x49, 0x36, 0x21, 0x02, 0x65, 0x00, 0x00, 0x02, 0x00, 0x2d, - 0x04, 0xc3, 0x02, 0x5a, 0x05, 0x7b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, - 0x40, 0x10, 0x07, 0x04, 0x00, 0x03, 0x04, 0x03, 0x08, 0x09, 0x01, 0x05, - 0x04, 0x05, 0x91, 0x59, 0x00, 0x04, 0x00, 0x2f, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x01, 0xb7, 0xa3, 0xfd, - 0xd3, 0xa5, 0x04, 0xc3, 0xb8, 0xb8, 0xb8, 0xb8, 0x00, 0x03, 0x00, 0x1f, - 0xff, 0xf0, 0x05, 0xc5, 0x05, 0x96, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x37, - 0x00, 0x7f, 0x40, 0x50, 0x18, 0x20, 0x2c, 0x31, 0x26, 0x2c, 0x26, 0x08, - 0x10, 0x00, 0x08, 0x00, 0x38, 0x39, 0x25, 0x29, 0x29, 0x23, 0xc9, 0x59, - 0x2f, 0x35, 0xc9, 0x59, 0x32, 0x2f, 0x0f, 0x29, 0x7f, 0x29, 0x02, 0x0f, - 0x29, 0x1f, 0x29, 0x7f, 0x29, 0x8f, 0x29, 0x9f, 0x29, 0xff, 0x29, 0x06, - 0x00, 0x2f, 0x01, 0x00, 0x2f, 0x10, 0x2f, 0x70, 0x2f, 0x80, 0x2f, 0x90, - 0x2f, 0xf0, 0x2f, 0x06, 0x09, 0x03, 0x29, 0x2f, 0x29, 0x2f, 0x04, 0x0c, - 0x0c, 0x14, 0xc8, 0x59, 0x0c, 0x04, 0x04, 0x1c, 0xc8, 0x59, 0x04, 0x13, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x5d, 0x71, 0x11, 0x33, 0x2b, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, - 0x12, 0x07, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x15, 0x14, 0x12, - 0x04, 0x33, 0x32, 0x24, 0x12, 0x25, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, - 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, - 0x2e, 0x01, 0x23, 0x22, 0x06, 0x05, 0xc5, 0xc1, 0xfe, 0xaf, 0xc1, 0xc5, - 0xfe, 0xad, 0xbb, 0xc2, 0x01, 0x50, 0xc1, 0xc2, 0x01, 0x51, 0xc0, 0x5c, - 0xa8, 0xfe, 0xdb, 0xaa, 0xa8, 0xfe, 0xdc, 0xa8, 0xa9, 0x01, 0x22, 0xa9, - 0xa9, 0x01, 0x26, 0xa8, 0xfc, 0x89, 0x8e, 0x7d, 0x9e, 0x4b, 0x73, 0x3e, - 0xa9, 0x75, 0xbc, 0xd0, 0xc8, 0xbd, 0xf4, 0x60, 0x72, 0x20, 0x74, 0x4c, - 0x7f, 0x87, 0x02, 0xc3, 0xc1, 0xfe, 0xaf, 0xc1, 0xc9, 0x01, 0x4d, 0xbd, - 0xc1, 0x01, 0x50, 0xc2, 0xc3, 0xfe, 0xb2, 0xc2, 0xa9, 0x01, 0x21, 0xaa, - 0xa9, 0xfe, 0xdc, 0xa7, 0xa9, 0xfe, 0xdc, 0xa8, 0xa8, 0x01, 0x24, 0xab, - 0x9b, 0xab, 0x9c, 0x23, 0x79, 0x68, 0xe2, 0xcc, 0xcb, 0xdd, 0xd1, 0x21, - 0x45, 0x44, 0xa1, 0x00, 0x00, 0x02, 0x00, 0x1a, 0x02, 0x8b, 0x02, 0xfd, - 0x05, 0x98, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x86, 0x40, 0x51, 0x0e, 0x0f, - 0x0f, 0x2c, 0x03, 0x21, 0x07, 0x27, 0x27, 0x1c, 0x16, 0x03, 0x16, 0x2e, - 0x2f, 0x07, 0x28, 0xe4, 0x59, 0x0e, 0x18, 0x0f, 0x15, 0x48, 0x0e, 0x20, - 0x0a, 0x0e, 0x48, 0x0e, 0x07, 0x07, 0x00, 0x12, 0x19, 0x24, 0x00, 0x24, - 0xe4, 0x59, 0x1e, 0x1e, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x03, 0x09, - 0x03, 0x00, 0x00, 0x12, 0x12, 0x0b, 0xe4, 0x59, 0x12, 0xde, 0xc0, 0x2f, - 0x01, 0x90, 0x2f, 0x01, 0x80, 0x2f, 0x01, 0x70, 0x2f, 0x01, 0x60, 0x2f, - 0x01, 0x50, 0x2f, 0x01, 0x40, 0x2f, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x33, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, - 0x33, 0x2b, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, - 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x27, 0x23, 0x06, 0x27, 0x32, - 0x36, 0x3d, 0x01, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x01, 0x04, 0x6c, 0x7e, - 0x9d, 0x9b, 0xb2, 0x46, 0x51, 0x43, 0x51, 0x09, 0x95, 0x10, 0x9f, 0x81, - 0x91, 0x97, 0x1c, 0x23, 0x13, 0x18, 0x31, 0x22, 0x49, 0x51, 0x04, 0x04, - 0x49, 0x94, 0x5a, 0x7f, 0x8a, 0x76, 0x54, 0x02, 0x8b, 0x74, 0x67, 0x74, - 0x7c, 0x02, 0x04, 0x3c, 0x51, 0x4a, 0x3b, 0x4c, 0x0a, 0x6a, 0x78, 0x7d, - 0x7d, 0xfe, 0xcc, 0x3a, 0x32, 0x08, 0x68, 0x0d, 0x4c, 0x41, 0x93, 0x6f, - 0x76, 0x4f, 0x41, 0x04, 0x06, 0x42, 0x41, 0x79, 0x00, 0x02, 0x00, 0x53, - 0x00, 0x8d, 0x04, 0x20, 0x03, 0xac, 0x00, 0x08, 0x00, 0x11, 0x00, 0x39, - 0x40, 0x20, 0x05, 0x08, 0x06, 0x01, 0x0f, 0x0a, 0x0e, 0x11, 0x0a, 0x01, - 0x11, 0x08, 0x04, 0x13, 0x12, 0x09, 0x00, 0x03, 0x00, 0xef, 0x5b, 0x0c, - 0x0f, 0x03, 0x2f, 0x03, 0x6f, 0x03, 0x7f, 0x03, 0x04, 0x03, 0x00, 0x2f, - 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x01, 0x35, - 0x01, 0x33, 0x15, 0x09, 0x01, 0x15, 0x21, 0x01, 0x35, 0x01, 0x33, 0x15, - 0x09, 0x01, 0x15, 0x03, 0x76, 0xfe, 0xae, 0x01, 0x52, 0xa8, 0xfe, 0xae, - 0x01, 0x54, 0xfd, 0x83, 0xfe, 0xb0, 0x01, 0x50, 0xa7, 0xfe, 0xb1, 0x01, - 0x51, 0x8d, 0x01, 0x6d, 0x3f, 0x01, 0x73, 0x1f, 0xfe, 0x8c, 0xfe, 0x91, - 0x1d, 0x01, 0x6d, 0x3f, 0x01, 0x73, 0x1f, 0xfe, 0x8c, 0xfe, 0x91, 0x1d, - 0x00, 0x01, 0x00, 0x64, 0x00, 0xb4, 0x04, 0x47, 0x02, 0xf2, 0x00, 0x05, - 0x00, 0x1c, 0x40, 0x0d, 0x00, 0x05, 0x02, 0x05, 0x06, 0x07, 0x03, 0x02, - 0xad, 0x59, 0x00, 0x03, 0xb3, 0x00, 0x3f, 0xcc, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, - 0x03, 0xb6, 0xfc, 0xae, 0x03, 0xe3, 0xb4, 0x01, 0xac, 0x92, 0xfd, 0xc2, - 0xff, 0xff, 0x00, 0x5b, 0x01, 0xd0, 0x02, 0x4f, 0x02, 0x70, 0x10, 0x06, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1f, 0xff, 0xf0, 0x05, 0xc5, - 0x05, 0x96, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x83, - 0x40, 0x4a, 0x10, 0x00, 0x2e, 0x29, 0x29, 0x20, 0x2d, 0x21, 0x2c, 0x2c, - 0x33, 0x2d, 0x33, 0x23, 0x23, 0x24, 0x18, 0x08, 0x08, 0x24, 0x2d, 0x00, - 0x04, 0x38, 0x37, 0x20, 0x20, 0x24, 0x2c, 0x22, 0x33, 0x22, 0xc9, 0x59, - 0x25, 0x32, 0xc9, 0x59, 0x0f, 0x24, 0x1f, 0x24, 0x02, 0xdf, 0x25, 0x01, - 0x00, 0x25, 0x10, 0x25, 0x02, 0x09, 0x03, 0x24, 0x33, 0x25, 0x25, 0x33, - 0x24, 0x03, 0x04, 0x0c, 0x0c, 0x14, 0xc8, 0x59, 0x0c, 0x04, 0x04, 0x1c, - 0xc8, 0x59, 0x04, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, - 0x5d, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x18, 0x2f, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, - 0x32, 0x04, 0x12, 0x07, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x15, - 0x14, 0x12, 0x04, 0x33, 0x32, 0x24, 0x12, 0x05, 0x03, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x13, 0x03, 0x34, 0x26, - 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x05, 0xc5, 0xc1, 0xfe, 0xaf, 0xc1, - 0xc5, 0xfe, 0xad, 0xbb, 0xc2, 0x01, 0x50, 0xc1, 0xc2, 0x01, 0x51, 0xc0, - 0x5c, 0xa8, 0xfe, 0xdb, 0xaa, 0xa8, 0xfe, 0xdc, 0xa8, 0xa9, 0x01, 0x22, - 0xa9, 0xa9, 0x01, 0x26, 0xa8, 0xfe, 0x52, 0xc7, 0xa1, 0x7f, 0x01, 0x33, - 0x8e, 0x97, 0x68, 0x55, 0xdd, 0x9f, 0x5f, 0x51, 0xaa, 0xb6, 0x50, 0x54, - 0x02, 0xc3, 0xc1, 0xfe, 0xaf, 0xc1, 0xc9, 0x01, 0x4d, 0xbd, 0xc1, 0x01, - 0x50, 0xc2, 0xc3, 0xfe, 0xb2, 0xc2, 0xa9, 0x01, 0x21, 0xaa, 0xa9, 0xfe, - 0xdc, 0xa7, 0xa9, 0xfe, 0xdc, 0xa8, 0xa8, 0x01, 0x24, 0xf9, 0x01, 0x50, - 0xfe, 0xb0, 0x03, 0x3f, 0x7e, 0x6f, 0x66, 0x7b, 0x13, 0xfe, 0xa2, 0x02, - 0x50, 0x45, 0x48, 0xfe, 0xd3, 0x55, 0x00, 0x00, 0x00, 0x01, 0xff, 0xef, - 0x05, 0xac, 0x04, 0x7c, 0x06, 0x0a, 0x00, 0x03, 0x00, 0x15, 0x40, 0x09, - 0x00, 0x05, 0x01, 0x04, 0x01, 0x02, 0x8c, 0x59, 0x01, 0x00, 0x2f, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x04, - 0x7c, 0xfb, 0x73, 0x04, 0x8d, 0x05, 0xac, 0x5e, 0x00, 0x02, 0x00, 0x7a, - 0x03, 0x5c, 0x02, 0xb8, 0x05, 0x96, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x2b, - 0x40, 0x15, 0x0c, 0x00, 0x12, 0x06, 0x00, 0x06, 0x19, 0x18, 0x03, 0x15, - 0xaf, 0x59, 0x03, 0x09, 0x40, 0x09, 0x0f, 0xaf, 0x59, 0x09, 0x04, 0x00, - 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0xb8, 0xa9, 0x76, 0x76, - 0xa9, 0xa7, 0x78, 0x78, 0xa7, 0x6d, 0x67, 0x4b, 0x4b, 0x67, 0x69, 0x49, - 0x4a, 0x68, 0x04, 0x79, 0x77, 0xa6, 0xa8, 0x75, 0x75, 0xa8, 0xa6, 0x77, - 0x4c, 0x68, 0x6a, 0x4a, 0x4a, 0x6a, 0x69, 0x00, 0x00, 0x02, 0x00, 0x41, - 0x00, 0x00, 0x04, 0x24, 0x04, 0xc3, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x56, - 0x40, 0x32, 0x0d, 0x04, 0x09, 0x01, 0x01, 0x06, 0x02, 0x0e, 0x0b, 0x0b, - 0x02, 0x04, 0x03, 0x10, 0x11, 0x0c, 0x0d, 0xad, 0x59, 0x0c, 0x00, 0x02, - 0x01, 0x12, 0x06, 0x02, 0x00, 0x04, 0x05, 0x04, 0xad, 0x59, 0x09, 0x98, - 0x07, 0x01, 0x07, 0xef, 0x05, 0x01, 0x50, 0x05, 0x80, 0x05, 0xa0, 0x05, - 0xd0, 0x05, 0x04, 0x05, 0x00, 0x2f, 0x5d, 0x5d, 0x33, 0x5d, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x33, 0x5f, 0x5e, 0x5d, 0x18, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, - 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x02, 0x7c, 0x93, 0xfe, 0x58, 0x01, - 0xa8, 0x93, 0x01, 0xa8, 0xfc, 0x1d, 0x03, 0xe3, 0x02, 0xa8, 0xfe, 0x75, - 0x01, 0x8b, 0x91, 0x01, 0x8a, 0xfe, 0x76, 0x91, 0xfd, 0x58, 0x91, 0x91, - 0x00, 0x01, 0x00, 0x29, 0x02, 0x33, 0x02, 0x83, 0x05, 0x8d, 0x00, 0x1b, - 0x00, 0x3d, 0x40, 0x1e, 0x0d, 0x0e, 0x0e, 0x19, 0x00, 0x1a, 0x07, 0x14, - 0x00, 0x14, 0x1c, 0x1d, 0x07, 0x19, 0x0d, 0x11, 0x11, 0x0a, 0xe4, 0x59, - 0x11, 0xde, 0x01, 0x19, 0x00, 0x19, 0xe5, 0x59, 0x00, 0xdf, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x27, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x07, 0x0e, 0x01, 0x07, 0x21, 0x15, 0x2b, 0x02, 0x1f, 0x81, 0x6b, - 0x61, 0x58, 0x47, 0x4a, 0x44, 0x58, 0x08, 0x85, 0x0d, 0xa1, 0x81, 0x7f, - 0x95, 0xbc, 0x7a, 0x64, 0x14, 0x01, 0xbb, 0x02, 0x33, 0x67, 0x45, 0x83, - 0x4a, 0x44, 0x70, 0x3a, 0x3e, 0x4b, 0x49, 0x44, 0x08, 0x6b, 0x84, 0x7b, - 0x6e, 0x93, 0x8a, 0x5a, 0x5c, 0x2d, 0x71, 0x00, 0x00, 0x01, 0x00, 0x1b, - 0x02, 0x27, 0x02, 0x82, 0x05, 0x8d, 0x00, 0x25, 0x00, 0x84, 0x40, 0x4f, - 0x18, 0x19, 0x19, 0x06, 0x05, 0x22, 0x0d, 0x12, 0x1f, 0x1f, 0x00, 0x0d, - 0x0a, 0x05, 0x0a, 0x00, 0x05, 0x00, 0x26, 0x27, 0x23, 0x0e, 0x0d, 0x0e, - 0x0d, 0xe4, 0x59, 0xa8, 0x0e, 0xb8, 0x0e, 0xc8, 0x0e, 0x03, 0x3f, 0x0e, - 0x4f, 0x0e, 0x02, 0x03, 0x0e, 0x0e, 0x03, 0x2f, 0x18, 0x3f, 0x18, 0x4f, - 0x18, 0x03, 0x0d, 0x18, 0x1d, 0x18, 0x02, 0x0b, 0x04, 0x18, 0x1c, 0x1c, - 0x15, 0xe4, 0x59, 0x1c, 0xde, 0x03, 0x08, 0xe4, 0x59, 0x25, 0x06, 0x35, - 0x06, 0x45, 0x06, 0x03, 0x06, 0x03, 0xdd, 0x00, 0x3f, 0x33, 0x5d, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x5f, 0x5e, 0x5d, 0x5d, 0x12, - 0x39, 0x18, 0x2f, 0x5f, 0x5d, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x06, 0x23, 0x20, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x34, 0x2b, 0x01, - 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, - 0x02, 0x82, 0x9b, 0x8e, 0xfe, 0xe2, 0x20, 0x88, 0x12, 0xa4, 0xa0, 0xbd, - 0x3d, 0x39, 0x50, 0x5c, 0x4a, 0x47, 0x44, 0x54, 0x06, 0x87, 0x0d, 0x9d, - 0x7f, 0x82, 0x94, 0x56, 0x5a, 0x5b, 0x6a, 0x03, 0x1b, 0x74, 0x80, 0xe3, - 0x0d, 0x88, 0x94, 0x89, 0x6d, 0x48, 0x41, 0x3c, 0x45, 0x46, 0x41, 0x0c, - 0x6d, 0x78, 0x77, 0x62, 0x4b, 0x6e, 0x14, 0x02, 0x09, 0x69, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x48, 0x04, 0xb1, 0x01, 0xf0, 0x05, 0xe4, 0x00, 0x05, - 0x00, 0x21, 0x40, 0x14, 0x03, 0x00, 0x07, 0x06, 0x00, 0x02, 0x95, 0x5b, - 0x0f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x7f, 0x00, 0xef, 0x00, 0x05, 0x00, - 0x00, 0x2f, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x13, - 0x35, 0x13, 0x33, 0x15, 0x01, 0x48, 0xd9, 0xcf, 0xfe, 0xb6, 0x04, 0xb1, - 0x14, 0x01, 0x1f, 0x1d, 0xfe, 0xea, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, - 0xfe, 0x57, 0x04, 0x6d, 0x04, 0x3a, 0x00, 0x1e, 0x00, 0x57, 0x40, 0x32, - 0x17, 0x0a, 0x0a, 0x11, 0x0b, 0x1e, 0x02, 0x02, 0x01, 0x0b, 0x01, 0x20, - 0x1f, 0x17, 0x06, 0x1a, 0x06, 0x50, 0x59, 0x1a, 0x16, 0x14, 0x0f, 0x50, - 0x59, 0x14, 0x16, 0x0a, 0x01, 0x0f, 0x00, 0x1b, 0xe0, 0x20, 0x01, 0xd0, - 0x20, 0x01, 0xc0, 0x20, 0x01, 0xb0, 0x20, 0x01, 0x80, 0x20, 0x01, 0x60, - 0x20, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x3f, 0x33, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, - 0x27, 0x23, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x8c, 0xb5, 0x6b, 0x77, - 0x80, 0x92, 0xb4, 0x24, 0x2a, 0x19, 0x1d, 0x41, 0x30, 0x5b, 0x5f, 0x05, - 0x03, 0x6a, 0xc1, 0x43, 0x6d, 0x1f, 0xfe, 0x57, 0x05, 0xe3, 0xfd, 0x52, - 0x8a, 0x8b, 0xae, 0xa2, 0x02, 0x73, 0xfc, 0xd0, 0x4c, 0x45, 0x08, 0x81, - 0x14, 0x5e, 0x64, 0xc2, 0x29, 0x26, 0xfe, 0x1c, 0x00, 0x01, 0x00, 0x50, - 0xfe, 0xf8, 0x03, 0xf5, 0x05, 0x81, 0x00, 0x0f, 0x00, 0x2b, 0x40, 0x14, - 0x05, 0x06, 0x0f, 0x02, 0x01, 0x01, 0x06, 0x0a, 0x03, 0x10, 0x11, 0x07, - 0x07, 0x01, 0x00, 0x04, 0x0d, 0x03, 0x06, 0x01, 0x00, 0x2f, 0x33, 0x3f, - 0xcd, 0x32, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, - 0x11, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x03, 0x74, 0x70, - 0xd9, 0x71, 0xa8, 0xc2, 0xc5, 0xad, 0x02, 0x33, 0x05, 0x1b, 0xf9, 0xdd, - 0x06, 0x23, 0xf9, 0xdd, 0x03, 0xbe, 0xb9, 0xaa, 0xa9, 0xbf, 0x66, 0x00, - 0xff, 0xff, 0x00, 0xf3, 0x01, 0xbe, 0x01, 0xb6, 0x02, 0x9a, 0x11, 0x06, - 0x08, 0x43, 0x38, 0x00, 0x00, 0x0b, 0xb7, 0x00, 0x5f, 0x00, 0x6f, 0x00, - 0x7f, 0x00, 0x03, 0x5d, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, - 0xfe, 0x4e, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x12, 0x00, 0x4b, 0x40, 0x2b, - 0x09, 0x00, 0x0f, 0x10, 0x10, 0x0e, 0x0d, 0x0d, 0x04, 0x00, 0x00, 0x04, - 0x14, 0x13, 0x0b, 0x40, 0x10, 0x40, 0x09, 0x0d, 0x48, 0x10, 0x10, 0x02, - 0x0e, 0x02, 0x07, 0x8c, 0x59, 0x20, 0x02, 0x50, 0x02, 0x60, 0x02, 0x70, - 0x02, 0xb0, 0x02, 0xc0, 0x02, 0x06, 0x02, 0x00, 0x2f, 0x5d, 0x2b, 0x00, - 0x18, 0x2f, 0x12, 0x39, 0x2f, 0x2b, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x05, 0x14, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, - 0x23, 0x22, 0x07, 0x37, 0x33, 0x07, 0x1e, 0x01, 0x01, 0xe3, 0xfe, 0xee, - 0x39, 0x21, 0x31, 0x25, 0x93, 0x85, 0x2b, 0x0e, 0x41, 0x6b, 0x27, 0x5e, - 0x5e, 0xfd, 0xb5, 0x04, 0x62, 0x06, 0x51, 0x4d, 0x02, 0xb6, 0x64, 0x03, - 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x02, 0x33, 0x02, 0x7d, - 0x05, 0x81, 0x00, 0x0a, 0x00, 0x3f, 0x40, 0x20, 0x09, 0x08, 0x08, 0x07, - 0x06, 0x04, 0x00, 0x02, 0x02, 0x0b, 0x0c, 0x00, 0x05, 0x10, 0x05, 0x02, - 0x0b, 0x03, 0x05, 0x04, 0x04, 0x03, 0x06, 0xdc, 0x09, 0x01, 0x00, 0x01, - 0xe4, 0x59, 0x00, 0xdf, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x33, 0x33, 0x2f, 0x33, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, - 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x50, 0xd3, 0xca, 0xd2, - 0x7b, 0xd7, 0x02, 0x33, 0x6b, 0x02, 0x6c, 0x8a, 0x78, 0x89, 0xfd, 0x1d, - 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x02, 0x8b, 0x02, 0xd3, - 0x05, 0x98, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x47, 0x40, 0x2a, 0x11, 0x06, - 0x0b, 0x00, 0x06, 0x00, 0x17, 0x18, 0x03, 0x14, 0xe4, 0x59, 0x00, 0x03, - 0x20, 0x03, 0x50, 0x03, 0x03, 0x09, 0x03, 0x03, 0x03, 0x09, 0x09, 0x0e, - 0xe4, 0x59, 0x09, 0xde, 0xef, 0x18, 0x01, 0x80, 0x18, 0x01, 0x70, 0x18, - 0x01, 0x2f, 0x18, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x20, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0xd3, 0xb0, 0xaf, 0xa8, 0xb1, - 0xb2, 0xab, 0x01, 0x5b, 0x95, 0x5b, 0x68, 0x6c, 0x5c, 0x5b, 0x65, 0x6f, - 0x5c, 0x04, 0x12, 0xbc, 0xcb, 0xc9, 0xbe, 0xbd, 0xc9, 0xfe, 0x7a, 0x9a, - 0x83, 0x87, 0x96, 0x91, 0x8d, 0x8a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x53, - 0x00, 0x8d, 0x04, 0x20, 0x03, 0xac, 0x00, 0x08, 0x00, 0x11, 0x00, 0x39, - 0x40, 0x20, 0x03, 0x08, 0x0c, 0x11, 0x04, 0x01, 0x0d, 0x0a, 0x0a, 0x11, - 0x01, 0x08, 0x04, 0x13, 0x12, 0x0a, 0x00, 0x05, 0x00, 0xef, 0x5b, 0x0e, - 0x0f, 0x05, 0x2f, 0x05, 0x6f, 0x05, 0x7f, 0x05, 0x04, 0x05, 0x00, 0x2f, - 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x23, 0x35, - 0x09, 0x01, 0x35, 0x33, 0x01, 0x15, 0x01, 0x23, 0x35, 0x09, 0x01, 0x35, - 0x33, 0x01, 0x15, 0x02, 0xce, 0xa8, 0x01, 0x52, 0xfe, 0xb0, 0xa6, 0x01, - 0x52, 0xfc, 0xdd, 0xaa, 0x01, 0x52, 0xfe, 0xb0, 0xa8, 0x01, 0x4f, 0x8d, - 0x1d, 0x01, 0x6f, 0x01, 0x74, 0x1f, 0xfe, 0x8d, 0x3f, 0xfe, 0x93, 0x1d, - 0x01, 0x6f, 0x01, 0x74, 0x1f, 0xfe, 0x8d, 0x3f, 0xff, 0xff, 0x00, 0x38, - 0x00, 0x00, 0x06, 0x4e, 0x05, 0x81, 0x10, 0x26, 0x00, 0x7b, 0xe8, 0x00, - 0x10, 0x27, 0x07, 0xfd, 0x02, 0xf9, 0x00, 0x00, 0x11, 0x07, 0x08, 0x05, - 0x03, 0xb8, 0xfd, 0xcf, 0x00, 0x1b, 0x40, 0x10, 0x01, 0x0c, 0xbf, 0x0c, - 0x01, 0x10, 0x0c, 0x60, 0x0c, 0x70, 0x0c, 0x03, 0x03, 0x02, 0x11, 0x18, - 0x00, 0x3f, 0x35, 0x35, 0x01, 0x5d, 0x5d, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x06, 0x75, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x7b, 0xe8, 0x00, 0x10, 0x27, 0x07, 0xfd, 0x02, 0xf9, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x74, 0x03, 0xf2, 0xfd, 0xcf, 0x00, 0x29, 0x40, 0x19, - 0x02, 0x0f, 0x2f, 0x0f, 0x6f, 0x0f, 0x02, 0x01, 0x0c, 0xbf, 0x0c, 0x01, - 0x10, 0x0c, 0x60, 0x0c, 0x70, 0x0c, 0x03, 0x2f, 0x2c, 0x01, 0x02, 0x0f, - 0x18, 0x00, 0x3f, 0x35, 0x01, 0x5d, 0x5d, 0x5d, 0x11, 0x35, 0x5d, 0x11, - 0x35, 0x31, 0x30, 0x00, 0xff, 0xff, 0x00, 0x49, 0x00, 0x00, 0x06, 0x4e, - 0x05, 0x8d, 0x10, 0x27, 0x07, 0xfd, 0x03, 0x0d, 0x00, 0x00, 0x10, 0x27, - 0x08, 0x05, 0x03, 0xb8, 0xfd, 0xcf, 0x11, 0x06, 0x00, 0x75, 0x2e, 0x00, - 0x00, 0x21, 0x40, 0x13, 0x00, 0x00, 0x5f, 0x00, 0x01, 0x10, 0x00, 0x60, - 0x00, 0x70, 0x00, 0x03, 0x2f, 0x3c, 0x01, 0x01, 0x02, 0x06, 0x18, 0x00, - 0x3f, 0x35, 0x35, 0x01, 0x5d, 0x5d, 0x5d, 0x11, 0x35, 0x31, 0x30, 0x00, - 0x00, 0x02, 0x00, 0x83, 0xfe, 0xa4, 0x04, 0x56, 0x04, 0x3a, 0x00, 0x1e, - 0x00, 0x22, 0x00, 0x5f, 0x40, 0x34, 0x09, 0x08, 0x08, 0x20, 0x21, 0x21, - 0x00, 0x18, 0x18, 0x19, 0x12, 0x00, 0x19, 0x00, 0x24, 0x23, 0x12, 0x1c, - 0x08, 0x21, 0x40, 0x22, 0x21, 0x9c, 0x5b, 0x22, 0x0f, 0x03, 0x18, 0x01, - 0x0d, 0x03, 0x18, 0x1c, 0x1c, 0x15, 0x5f, 0x59, 0x2f, 0x1c, 0x3f, 0x1c, - 0x02, 0x6f, 0x1c, 0xcf, 0x1c, 0x02, 0x1c, 0x20, 0x24, 0x01, 0x5d, 0x00, - 0x2f, 0x5d, 0x71, 0x2b, 0x11, 0x00, 0x33, 0x5f, 0x5e, 0x5d, 0x18, 0x3f, - 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x11, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x37, 0x34, 0x3e, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x37, - 0x33, 0x0e, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, - 0x04, 0x23, 0x22, 0x24, 0x01, 0x15, 0x23, 0x35, 0x83, 0x2c, 0x52, 0x5d, - 0x51, 0x47, 0x46, 0x01, 0xaf, 0x02, 0x27, 0x3e, 0x4e, 0x50, 0x4d, 0x3c, - 0x25, 0x9b, 0x8c, 0x8c, 0xa4, 0x0e, 0xb8, 0x1a, 0xfe, 0xfc, 0xd6, 0xdf, - 0xff, 0x00, 0x02, 0x71, 0xc3, 0x32, 0x4b, 0x76, 0x64, 0x44, 0x3b, 0x34, - 0x73, 0x44, 0x45, 0x68, 0x50, 0x3f, 0x39, 0x39, 0x46, 0x58, 0x3b, 0x72, - 0x84, 0x8c, 0x7a, 0x0c, 0xc6, 0xd4, 0xd3, 0x04, 0xc3, 0xc9, 0xc9, 0x00, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0x4e, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x11, 0x11, 0x05, 0x26, 0x02, 0x12, 0xb8, 0xff, - 0xe1, 0xb4, 0x12, 0x15, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x01, 0xdb, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x11, 0x05, 0x26, - 0x02, 0x11, 0x4c, 0x11, 0x14, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0x60, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x12, 0x12, 0x05, - 0x26, 0x02, 0x17, 0x00, 0x17, 0x11, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x06, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, - 0x01, 0x5e, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x11, 0x11, 0x05, - 0x26, 0x02, 0x1a, 0x02, 0x1a, 0x26, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x06, 0xb2, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x6c, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x11, 0x11, - 0x05, 0x26, 0x03, 0x02, 0x15, 0x04, 0x15, 0x13, 0x04, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0xfb, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9c, 0x01, 0x89, 0x00, 0x88, 0x00, 0x2b, 0x40, 0x1d, - 0x03, 0x02, 0x26, 0x03, 0x03, 0x02, 0x17, 0x36, 0x17, 0x01, 0x45, 0x17, - 0x01, 0x53, 0x17, 0x73, 0x17, 0x02, 0x22, 0x17, 0x62, 0x17, 0x02, 0x03, - 0x17, 0x11, 0x04, 0x07, 0x25, 0x2b, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x35, - 0x35, 0x00, 0x3f, 0x35, 0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x18, - 0x00, 0x00, 0x07, 0xa8, 0x05, 0x81, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x6f, - 0x40, 0x3b, 0x02, 0x13, 0x03, 0x11, 0x03, 0x04, 0x11, 0x09, 0x0d, 0x0d, - 0x14, 0x05, 0x0b, 0x07, 0x00, 0x0e, 0x0e, 0x00, 0x04, 0x03, 0x15, 0x16, - 0x13, 0x02, 0x5f, 0x59, 0x13, 0x13, 0x05, 0x04, 0x09, 0x0c, 0x5f, 0x59, - 0x0f, 0x09, 0x01, 0x08, 0x03, 0x09, 0x09, 0x00, 0x05, 0x10, 0x08, 0x05, - 0x08, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x12, 0x00, 0x0d, 0x5f, 0x59, 0x00, - 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x12, 0x39, - 0x39, 0x32, 0x32, 0x32, 0x11, 0x33, 0x32, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x39, 0x31, 0x30, 0x21, 0x11, 0x21, 0x03, 0x23, 0x01, 0x21, 0x15, 0x21, - 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0x23, 0x07, 0x01, 0x21, - 0x03, 0xc9, 0xfd, 0xdc, 0xc6, 0xc7, 0x02, 0xae, 0x04, 0xb9, 0xfd, 0x09, - 0x02, 0xbb, 0xfd, 0x45, 0x03, 0x20, 0xfc, 0x21, 0x97, 0x1c, 0xfe, 0xd5, - 0x01, 0xde, 0x01, 0x9c, 0xfe, 0x64, 0x05, 0x81, 0x9c, 0xfe, 0x3c, 0x9a, - 0xfe, 0x15, 0x9c, 0x04, 0xee, 0x3f, 0xfd, 0x82, 0xff, 0xff, 0x00, 0x68, - 0xfe, 0x4e, 0x05, 0x79, 0x05, 0x96, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x7a, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x1e, 0x3a, 0x1e, 0x1a, 0x10, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0x3f, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0d, 0xb8, 0xff, - 0xaa, 0xb4, 0x0d, 0x10, 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x01, 0xdf, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0c, 0x05, 0x26, - 0x01, 0x0c, 0x28, 0x0c, 0x0f, 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0x77, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0d, 0x0d, 0x05, 0x26, - 0x01, 0x12, 0xb8, 0xff, 0xef, 0xb4, 0x12, 0x0c, 0x00, 0x0a, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x06, 0xb2, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x01, 0x01, 0x79, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x02, 0x01, 0x10, 0xb8, 0xff, 0xea, - 0xb4, 0x10, 0x0e, 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb1, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x08, 0xfd, - 0x9f, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x04, 0x04, 0x05, 0x26, 0x01, 0x05, - 0xb8, 0xff, 0xc1, 0xb4, 0x05, 0x08, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x02, 0x36, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x08, 0xfe, - 0x46, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x04, 0x05, 0x26, 0x01, 0x04, - 0x45, 0x04, 0x07, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0xff, 0xd2, 0x00, 0x00, 0x02, 0x68, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x08, 0xff, 0xd2, 0x00, 0x00, 0x16, - 0x40, 0x0d, 0x01, 0x05, 0x05, 0x05, 0x26, 0x01, 0x0a, 0x00, 0x0a, 0x04, - 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x02, 0x34, 0x06, 0xb2, 0x12, 0x26, - 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x09, 0x01, 0xda, 0x00, 0x00, 0x1a, - 0x40, 0x0f, 0x02, 0x01, 0x04, 0x04, 0x05, 0x26, 0x02, 0x01, 0x08, 0x01, - 0x08, 0x06, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x65, - 0x05, 0x81, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x54, 0x40, 0x2b, 0x15, 0x0e, - 0x17, 0x0e, 0x06, 0x13, 0x17, 0x17, 0x0d, 0x01, 0x0b, 0x06, 0x0b, 0x1d, - 0x1c, 0x16, 0x0d, 0x00, 0x0d, 0x5f, 0x59, 0x13, 0x0f, 0x00, 0x01, 0x20, - 0x03, 0x00, 0x00, 0x17, 0x02, 0x0b, 0x17, 0x5f, 0x59, 0x0b, 0x12, 0x02, - 0x12, 0x5f, 0x59, 0x02, 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x13, 0x33, 0x11, 0x21, - 0x20, 0x00, 0x11, 0x14, 0x02, 0x04, 0x23, 0x21, 0x11, 0x23, 0x25, 0x10, - 0x00, 0x29, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x36, 0x12, - 0x0e, 0x9a, 0x01, 0xd2, 0x01, 0x66, 0x01, 0x85, 0xaa, 0xfe, 0xc8, 0xcc, - 0xfd, 0xf1, 0x9a, 0x04, 0x97, 0xfe, 0xe1, 0xfe, 0xf0, 0xfe, 0xf1, 0x01, - 0x96, 0xfe, 0x6a, 0x01, 0x3a, 0x9b, 0xeb, 0x7e, 0x03, 0x21, 0x02, 0x60, - 0xfe, 0x99, 0xfe, 0xb5, 0xda, 0xfe, 0xb9, 0xae, 0x02, 0x87, 0x48, 0x01, - 0x06, 0x01, 0x13, 0xfe, 0x39, 0x9a, 0xfe, 0x12, 0x88, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x07, 0x06, 0x12, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, 0x01, 0xa1, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0e, 0x0e, 0x05, 0x26, 0x01, 0x17, 0x0c, - 0x17, 0x23, 0x05, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0xb6, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x1b, 0x1b, 0x05, 0x26, 0x02, 0x1c, 0xb8, 0xff, - 0xd8, 0xb4, 0x1c, 0x1f, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x02, 0x25, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x1b, 0x05, 0x26, - 0x02, 0x1b, 0x25, 0x1b, 0x1e, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0xd5, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1c, 0x1c, 0x05, - 0x26, 0x02, 0x21, 0x04, 0x21, 0x1b, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x07, 0x06, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, - 0x01, 0xc1, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x1b, 0x1b, 0x05, 0x26, - 0x02, 0x24, 0xb8, 0xff, 0xf5, 0xb4, 0x24, 0x30, 0x08, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x06, 0xb2, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x01, 0x01, 0xd7, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x1b, 0x1b, 0x05, 0x26, 0x03, 0x02, 0x1f, 0xb8, 0xff, 0xff, - 0xb4, 0x1f, 0x1d, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0xe1, 0x04, 0x1f, - 0x04, 0x73, 0x00, 0x0b, 0x00, 0x23, 0x40, 0x10, 0x04, 0x0a, 0x06, 0x08, - 0x02, 0x00, 0x00, 0x0a, 0x08, 0x03, 0x0d, 0x0c, 0x00, 0x07, 0x01, 0x07, - 0x00, 0x19, 0x2f, 0x71, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x09, 0x01, 0x37, 0x09, 0x01, 0x17, - 0x09, 0x01, 0x07, 0x09, 0x01, 0x8e, 0x01, 0x62, 0xfe, 0xa0, 0x68, 0x01, - 0x5e, 0x01, 0x5e, 0x69, 0xfe, 0xa2, 0x01, 0x60, 0x66, 0xfe, 0x9f, 0xfe, - 0x9c, 0x01, 0x4a, 0x01, 0x62, 0x01, 0x60, 0x67, 0xfe, 0x9f, 0x01, 0x5f, - 0x69, 0xfe, 0xa4, 0xfe, 0xa0, 0x69, 0x01, 0x61, 0xfe, 0x9d, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x47, 0xff, 0xcb, 0x05, 0xf4, 0x05, 0xba, 0x00, 0x14, - 0x00, 0x1c, 0x00, 0x24, 0x00, 0x45, 0x40, 0x23, 0x18, 0x20, 0x1d, 0x15, - 0x15, 0x12, 0x00, 0x1d, 0x08, 0x0b, 0x00, 0x0b, 0x26, 0x25, 0x1f, 0x17, - 0x1a, 0x22, 0x0e, 0x22, 0x5f, 0x59, 0x11, 0x0e, 0x04, 0x04, 0x1a, 0x5f, - 0x59, 0x07, 0x04, 0x13, 0x20, 0x26, 0x01, 0x5d, 0x00, 0x3f, 0x33, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, - 0x39, 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, 0x27, 0x07, 0x23, - 0x37, 0x26, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, - 0x03, 0x34, 0x27, 0x01, 0x16, 0x33, 0x32, 0x00, 0x01, 0x14, 0x17, 0x01, - 0x26, 0x23, 0x22, 0x00, 0x05, 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xf6, 0xa8, - 0x78, 0xbe, 0xc8, 0xae, 0x01, 0x72, 0x01, 0x4a, 0xf7, 0xa7, 0x79, 0xc0, - 0xc9, 0xac, 0xc3, 0x62, 0xfd, 0x3b, 0x7a, 0xb4, 0xf4, 0x01, 0x05, 0xfc, - 0x0f, 0x65, 0x02, 0xc3, 0x7c, 0xb2, 0xf2, 0xfe, 0xf8, 0x02, 0xc7, 0xdd, - 0xfe, 0xb4, 0xb2, 0x70, 0x91, 0xf1, 0xc0, 0x01, 0x4b, 0x01, 0x52, 0x01, - 0x7d, 0x6e, 0x92, 0xf2, 0xbe, 0xfe, 0xbd, 0xe0, 0x90, 0xfc, 0xab, 0x5b, - 0x01, 0x2d, 0x01, 0x13, 0xe5, 0x95, 0x03, 0x55, 0x58, 0xfe, 0xd8, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0x8d, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x14, 0x14, 0x05, 0x26, 0x01, 0x15, 0xb8, 0xff, - 0xe8, 0xb4, 0x15, 0x18, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x01, 0xed, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x14, 0x05, 0x26, - 0x01, 0x14, 0x25, 0x14, 0x17, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0x98, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x15, 0x15, 0x05, - 0x26, 0x01, 0x1a, 0x00, 0x1a, 0x14, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x06, 0xb2, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x9e, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x14, 0x14, - 0x05, 0x26, 0x02, 0x01, 0x18, 0xb8, 0xff, 0xfe, 0xb4, 0x18, 0x16, 0x04, - 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x01, 0xd0, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x09, 0x05, 0x26, 0x01, 0x09, 0x41, 0x09, - 0x0c, 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x00, 0x0d, - 0x00, 0x16, 0x00, 0x36, 0x40, 0x1c, 0x13, 0x0a, 0x06, 0x06, 0x07, 0x0e, - 0x00, 0x07, 0x00, 0x17, 0x18, 0x05, 0x13, 0x5f, 0x59, 0x0a, 0x12, 0x5f, - 0x59, 0x05, 0x0a, 0x05, 0x0a, 0x06, 0x08, 0x03, 0x06, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x0e, 0x01, 0x23, 0x21, 0x11, 0x23, 0x11, 0x33, 0x15, 0x21, 0x32, 0x04, - 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, 0xea, 0x74, - 0xdb, 0x96, 0xfe, 0x62, 0xbf, 0xbf, 0x01, 0x92, 0xef, 0x01, 0x02, 0xc0, - 0xa4, 0xa4, 0xfe, 0x85, 0x01, 0x83, 0x99, 0xa7, 0x02, 0xdf, 0x80, 0xc7, - 0x6f, 0xfe, 0xd7, 0x05, 0x81, 0xfc, 0xde, 0xcc, 0x86, 0x95, 0xfd, 0xc0, - 0x9b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xff, 0xec, 0x04, 0x8f, - 0x05, 0xcc, 0x00, 0x31, 0x00, 0x6d, 0x40, 0x41, 0x1f, 0x12, 0x2c, 0x18, - 0x27, 0x06, 0x20, 0x0c, 0x0c, 0x00, 0x00, 0x27, 0x2c, 0x20, 0x04, 0x32, - 0x33, 0x24, 0x18, 0x01, 0x15, 0x18, 0x01, 0x06, 0x18, 0x01, 0x2b, 0x0c, - 0x01, 0x1a, 0x0c, 0x01, 0x03, 0x0f, 0x0c, 0x01, 0x14, 0x05, 0x18, 0x0c, - 0x24, 0x03, 0x24, 0x1b, 0x50, 0x59, 0x24, 0x00, 0x20, 0x15, 0x03, 0x09, - 0x50, 0x59, 0x03, 0x16, 0x70, 0x33, 0x01, 0x4f, 0x33, 0x01, 0x3f, 0x33, - 0x01, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x2f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, - 0x01, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x16, 0x04, 0x8f, 0xbc, - 0xaa, 0xab, 0x70, 0x02, 0x34, 0xa0, 0x45, 0x5c, 0x62, 0x55, 0x61, 0x5c, - 0x5b, 0x39, 0x36, 0x3a, 0x35, 0x86, 0x6d, 0x94, 0x8b, 0xb4, 0xeb, 0xe8, - 0xbe, 0xe1, 0x71, 0x4f, 0x22, 0x37, 0x52, 0x30, 0xb8, 0x01, 0x27, 0x96, - 0xa5, 0x31, 0xa4, 0x1d, 0x28, 0x56, 0x4f, 0x40, 0x66, 0x3a, 0x36, 0x84, - 0x56, 0x3d, 0x64, 0x2d, 0x30, 0x54, 0x32, 0x4d, 0x5d, 0xa0, 0xa2, 0xfc, - 0x03, 0x04, 0x03, 0xe3, 0xe6, 0xa1, 0x88, 0x8f, 0x67, 0x48, 0x31, 0x1d, - 0x26, 0x3b, 0x39, 0x20, 0x7c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x31, 0x31, 0x11, 0x26, 0x02, 0x32, 0xb8, 0xff, 0x95, 0xb4, 0x32, 0x35, - 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x54, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x02, 0x31, 0x11, 0x26, 0x02, 0x31, 0x0b, 0x31, - 0x34, 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, 0x00, 0xda, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x32, 0x32, 0x11, 0x26, 0x02, 0x37, 0xb8, 0xff, - 0xc0, 0xb4, 0x37, 0x31, 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, - 0x05, 0xbd, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, - 0x00, 0xf5, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x31, 0x31, 0x11, 0x26, - 0x02, 0x3a, 0xb8, 0xff, 0xe0, 0xb4, 0x3a, 0x46, 0x03, 0x1a, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x03, 0x02, 0x35, 0xb8, 0xff, 0xca, - 0xb4, 0x35, 0x33, 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, - 0x06, 0x73, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9c, - 0x01, 0x08, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x34, 0x34, - 0x11, 0x26, 0x03, 0x02, 0x37, 0xb8, 0xff, 0xc8, 0xb4, 0x37, 0x31, 0x03, - 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x00, 0x03, 0x00, 0x42, 0xff, 0xec, 0x06, 0xc2, 0x04, 0x4e, 0x00, 0x27, - 0x00, 0x34, 0x00, 0x3b, 0x00, 0xaa, 0x40, 0x5e, 0x1d, 0x1e, 0x1e, 0x2d, - 0x12, 0x0c, 0x22, 0x34, 0x3b, 0x01, 0x01, 0x16, 0x34, 0x34, 0x35, 0x12, - 0x35, 0x26, 0x07, 0x08, 0x08, 0x26, 0x12, 0x26, 0x3c, 0x3d, 0x35, 0x27, - 0x50, 0x59, 0x0d, 0x35, 0x01, 0x14, 0x04, 0x35, 0x35, 0x0c, 0x22, 0x0a, - 0x24, 0x24, 0x38, 0x50, 0x59, 0x24, 0x10, 0x16, 0x28, 0x51, 0x59, 0x16, - 0x16, 0x0f, 0x20, 0x3f, 0x1d, 0x01, 0x0f, 0x1d, 0x6f, 0x1d, 0x02, 0x0b, - 0x03, 0x1d, 0x1d, 0x20, 0x20, 0x1a, 0x50, 0x59, 0x20, 0x10, 0x0f, 0x30, - 0x50, 0x59, 0x0f, 0x16, 0x0a, 0x04, 0x50, 0x59, 0xef, 0x07, 0x01, 0x80, - 0x07, 0x01, 0x07, 0x07, 0x0a, 0x16, 0x00, 0x3f, 0x33, 0x2f, 0x5d, 0x5d, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x39, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x1e, 0x01, - 0x33, 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x20, 0x03, 0x0e, 0x01, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x15, - 0x25, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, - 0x25, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x03, 0xc8, 0x02, 0x96, 0x8c, - 0x75, 0x8d, 0x19, 0x9e, 0x61, 0xfe, 0xa8, 0xfe, 0xbf, 0x66, 0x4f, 0xd2, - 0x92, 0xa7, 0xa9, 0xee, 0xf2, 0xf0, 0x6f, 0x79, 0x7e, 0x71, 0x0d, 0xbc, - 0x2e, 0x01, 0x8e, 0xfa, 0x63, 0x76, 0xe4, 0x01, 0xdd, 0xfc, 0x50, 0xc3, - 0x85, 0x8d, 0x42, 0x64, 0x5d, 0x66, 0x99, 0x57, 0x02, 0xf6, 0x0f, 0x90, - 0x87, 0x7f, 0x93, 0x06, 0x01, 0xf7, 0x11, 0xb5, 0xbe, 0x5e, 0x48, 0x2d, - 0xff, 0x00, 0x01, 0x01, 0x8c, 0x75, 0xac, 0x96, 0xae, 0xb0, 0x04, 0x04, - 0x3b, 0x87, 0x6f, 0x50, 0x5c, 0x11, 0x01, 0x24, 0x8b, 0x8b, 0xfd, 0xc1, - 0x18, 0x1f, 0x04, 0x03, 0x35, 0x65, 0x4a, 0x57, 0x61, 0x59, 0x9b, 0x56, - 0xc4, 0xab, 0x9d, 0xab, 0x9d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xfe, 0x4e, 0x03, 0xca, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x7a, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x1e, 0x28, 0x1e, 0x1a, 0x0d, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, 0x00, 0xdd, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x02, 0x1b, 0xb8, 0xff, - 0xe4, 0xb4, 0x1b, 0x1e, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x1a, 0x11, 0x26, - 0x02, 0x1a, 0x54, 0x1a, 0x1d, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, - 0x00, 0xf5, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1b, 0x1b, 0x11, - 0x26, 0x02, 0x20, 0x08, 0x20, 0x1a, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, - 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x1a, 0x1a, - 0x11, 0x26, 0x03, 0x02, 0x1e, 0x04, 0x1e, 0x1c, 0x0c, 0x11, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x0a, - 0x00, 0x00, 0x01, 0xb2, 0x05, 0xe4, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, - 0x11, 0x06, 0x00, 0x43, 0xa0, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x04, 0x04, - 0x11, 0x26, 0x01, 0x05, 0xb8, 0xff, 0xc2, 0xb4, 0x05, 0x08, 0x00, 0x02, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x87, - 0x00, 0x00, 0x02, 0x2f, 0x05, 0xe4, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, - 0x11, 0x06, 0x00, 0x76, 0x3f, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x04, - 0x11, 0x26, 0x01, 0x04, 0x3f, 0x04, 0x07, 0x00, 0x02, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x02, 0x69, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, - 0xd3, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x05, 0x05, 0x11, 0x26, 0x01, - 0x0a, 0x02, 0x0a, 0x04, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x02, 0x35, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, - 0xdb, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x04, 0x04, 0x11, 0x26, - 0x02, 0x01, 0x08, 0x02, 0x08, 0x06, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x27, 0x05, 0xea, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x73, - 0x40, 0x24, 0x1c, 0x0f, 0x10, 0x0d, 0x0a, 0x12, 0x15, 0x14, 0x0b, 0x08, - 0x09, 0x18, 0x22, 0x03, 0x03, 0x19, 0x28, 0x29, 0x12, 0x0d, 0x15, 0x0a, - 0x04, 0x0b, 0x13, 0x13, 0x0f, 0x06, 0x1f, 0x50, 0x59, 0x08, 0x50, 0x06, - 0x01, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x07, 0x0a, 0x48, 0x24, 0x0b, - 0x34, 0x0b, 0x44, 0x0b, 0x03, 0x02, 0x0b, 0x12, 0x0b, 0x52, 0x0b, 0x03, - 0x09, 0x03, 0x06, 0x0b, 0x06, 0x0b, 0x25, 0x0f, 0x00, 0x00, 0x25, 0x50, - 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x12, 0x17, 0x39, 0x32, 0x31, 0x30, 0x05, 0x22, 0x02, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x17, 0x26, 0x27, 0x05, 0x35, 0x37, 0x26, 0x27, 0x33, - 0x16, 0x17, 0x25, 0x0f, 0x01, 0x16, 0x12, 0x1d, 0x01, 0x10, 0x02, 0x13, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, - 0x36, 0xe8, 0xf8, 0xf8, 0xef, 0x89, 0x5e, 0x6d, 0x7d, 0xfe, 0xd3, 0xda, - 0x6d, 0x85, 0xd1, 0x50, 0x5a, 0x01, 0x32, 0x01, 0xd3, 0xab, 0xae, 0xf9, - 0x3c, 0x8d, 0x9c, 0x9d, 0x91, 0x90, 0x91, 0xa1, 0x95, 0x14, 0x01, 0x02, - 0xf3, 0xf4, 0xfe, 0x3b, 0xd9, 0x72, 0x85, 0x72, 0x5e, 0x57, 0x47, 0x24, - 0x42, 0x84, 0x70, 0x5c, 0x9c, 0xfe, 0x6a, 0xe8, 0x06, 0xfe, 0xfb, 0xfe, - 0xf3, 0x01, 0xf5, 0xc0, 0xad, 0xae, 0xbf, 0xbe, 0xb2, 0xaf, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8c, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xbd, 0x12, 0x26, - 0x00, 0x51, 0x04, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xf5, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x24, 0x05, - 0x24, 0x30, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, 0x00, 0xdf, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x17, 0x17, 0x11, 0x26, 0x02, 0x18, 0xb8, 0xff, - 0xe4, 0xb4, 0x18, 0x1b, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x67, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x17, 0x11, 0x26, - 0x02, 0x17, 0x49, 0x17, 0x1a, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, - 0x00, 0xf0, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x18, 0x18, 0x11, - 0x26, 0x02, 0x1d, 0x01, 0x1d, 0x17, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xbd, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, - 0x00, 0xf7, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x17, 0x17, 0x11, - 0x26, 0x02, 0x20, 0x0d, 0x20, 0x2c, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, - 0x00, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x17, 0x17, - 0x11, 0x26, 0x03, 0x02, 0x1b, 0x04, 0x1b, 0x19, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x03, 0x00, 0x41, - 0x00, 0xdf, 0x04, 0x24, 0x04, 0x75, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, - 0x00, 0x4a, 0x40, 0x2a, 0x03, 0x0b, 0x0b, 0x00, 0x08, 0x08, 0x04, 0x06, - 0x04, 0x06, 0x0c, 0x0d, 0x08, 0x09, 0xae, 0x59, 0x00, 0x08, 0x50, 0x08, - 0x02, 0x0d, 0x03, 0x08, 0x04, 0x40, 0x05, 0x04, 0xad, 0x59, 0x01, 0x00, - 0xae, 0x59, 0x4f, 0x01, 0x9f, 0x01, 0x02, 0x01, 0x05, 0xb3, 0x00, 0x3f, - 0xce, 0x5d, 0x2b, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x5f, 0x5e, 0x5d, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x35, 0x33, 0x15, 0x01, 0x35, 0x21, 0x15, - 0x01, 0x35, 0x33, 0x15, 0x01, 0xde, 0xa8, 0xfd, 0xbb, 0x03, 0xe3, 0xfd, - 0xba, 0xa8, 0x03, 0xbe, 0xb7, 0xb7, 0xfe, 0xa2, 0x92, 0x92, 0xfe, 0x7f, - 0xb7, 0xb7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2c, 0xff, 0xda, 0x04, 0xb4, - 0x04, 0x5c, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x7d, 0x40, 0x4e, - 0x16, 0x1e, 0x1b, 0x13, 0x13, 0x00, 0x1b, 0x0a, 0x00, 0x0a, 0x24, 0x23, - 0x1d, 0x15, 0x18, 0x20, 0x0c, 0x20, 0x50, 0x59, 0x0f, 0x0c, 0x10, 0x03, - 0x18, 0x50, 0x59, 0x06, 0x03, 0x16, 0xf0, 0x24, 0x01, 0xa0, 0x24, 0x01, - 0x90, 0x24, 0x01, 0xe0, 0x24, 0x01, 0xdf, 0x24, 0x01, 0xc0, 0x24, 0x01, - 0xb0, 0x24, 0x01, 0xa0, 0x24, 0x01, 0x90, 0x24, 0x01, 0x80, 0x24, 0x01, - 0x70, 0x24, 0x01, 0x60, 0x24, 0x01, 0x50, 0x24, 0x01, 0x40, 0x24, 0x01, - 0x20, 0x24, 0x01, 0x00, 0x24, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x00, 0x3f, - 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x39, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x27, 0x07, 0x23, 0x37, - 0x26, 0x35, 0x10, 0x21, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x07, 0x34, - 0x27, 0x01, 0x16, 0x33, 0x32, 0x36, 0x25, 0x14, 0x17, 0x01, 0x26, 0x23, - 0x22, 0x06, 0x04, 0x58, 0xfa, 0xee, 0xc3, 0x76, 0x64, 0xa7, 0xb8, 0x53, - 0x01, 0xe5, 0xc9, 0x73, 0x5b, 0xa7, 0xad, 0x51, 0xbd, 0x17, 0xfe, 0x1d, - 0x44, 0x89, 0xa2, 0x8b, 0xfd, 0xb3, 0x18, 0x01, 0xe2, 0x43, 0x8c, 0x9e, - 0x8d, 0x02, 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x62, 0x74, 0xd6, 0x8a, 0xe4, - 0x02, 0x30, 0x5b, 0x69, 0xc9, 0x85, 0xf0, 0x81, 0x5c, 0xfd, 0xce, 0x58, - 0xd0, 0xdd, 0x82, 0x55, 0x02, 0x31, 0x51, 0xcf, 0xff, 0xff, 0x00, 0x8b, - 0xff, 0xec, 0x03, 0xf1, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x58, 0x06, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0xec, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x1c, 0xb8, 0xff, 0xec, 0xb4, 0x1c, 0x1f, - 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8b, 0xff, 0xec, 0x03, 0xf1, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x58, 0x06, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x57, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1b, 0x11, 0x26, 0x01, 0x1b, 0x35, 0x1b, - 0x1e, 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8b, 0xff, 0xec, 0x03, 0xf1, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x58, 0x06, 0x00, 0x11, 0x07, 0x02, 0x88, 0x00, 0xef, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x1c, 0x1c, 0x11, 0x26, 0x01, 0x21, 0xb8, 0xff, - 0xfc, 0xb4, 0x21, 0x1b, 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0xff, 0xec, 0x03, 0xf1, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x06, 0x00, 0x11, 0x07, 0x00, 0x6a, - 0x00, 0xed, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1b, 0x1b, - 0x11, 0x26, 0x02, 0x01, 0x1f, 0xb8, 0xff, 0xf3, 0xb4, 0x1f, 0x1d, 0x19, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x1b, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x17, 0x11, 0x26, 0x01, 0x17, 0x36, 0x17, - 0x1a, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x8a, 0xfe, 0x57, 0x04, 0x1d, 0x05, 0xcc, 0x00, 0x14, - 0x00, 0x21, 0x00, 0x3e, 0x40, 0x1f, 0x1c, 0x04, 0x13, 0x13, 0x14, 0x15, - 0x0b, 0x14, 0x0b, 0x22, 0x23, 0x13, 0x1b, 0x04, 0x0f, 0x08, 0x0d, 0x0d, - 0x1f, 0x50, 0x59, 0x0d, 0x16, 0x08, 0x18, 0x50, 0x59, 0x08, 0x10, 0x00, - 0x00, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x14, 0x07, 0x33, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x21, 0x22, 0x27, 0x23, 0x16, - 0x15, 0x11, 0x23, 0x01, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x8a, 0xb4, 0x04, 0x06, 0x30, 0x9e, 0x81, 0xc8, - 0xc6, 0xfe, 0x72, 0xfa, 0x56, 0x05, 0x04, 0xb4, 0x02, 0xd6, 0x7a, 0x85, - 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x86, 0x7b, 0x05, 0xcc, 0xfe, 0x59, 0x41, - 0x58, 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xe1, 0xfd, 0xca, 0xbc, 0x08, 0xa2, - 0xfe, 0x59, 0x03, 0xc7, 0xe2, 0xc2, 0x5a, 0xbf, 0x99, 0xd5, 0xca, 0xc5, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x05, 0x7b, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0xbb, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x17, 0x17, 0x11, 0x26, 0x02, 0x01, - 0x1b, 0xb8, 0xff, 0xfe, 0xb4, 0x1b, 0x19, 0x09, 0x12, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x01, 0x68, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x11, 0x11, 0x05, 0x26, 0x02, 0x12, 0x02, 0x12, 0x11, 0x04, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0x53, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x31, 0x31, 0x11, 0x26, 0x02, 0x32, 0xb8, 0xff, 0xca, 0xb4, 0x32, 0x31, - 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x06, 0xf3, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, 0x01, 0x79, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x11, 0x11, 0x05, 0x26, 0x02, 0x14, 0x03, - 0x14, 0x1c, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xe6, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0x01, 0x07, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x31, 0x31, 0x11, 0x26, 0x02, 0x34, 0xb8, 0xff, - 0xcc, 0xb4, 0x34, 0x3a, 0x03, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x60, 0x05, 0x63, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9d, - 0x03, 0xb5, 0x00, 0x0b, 0x00, 0x0f, 0xb1, 0x02, 0x1a, 0xb8, 0xff, 0xcf, - 0xb4, 0x1a, 0x1a, 0x07, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xfe, 0x55, 0x04, 0x73, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9d, 0x02, 0xc5, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x3a, 0xb8, 0xff, 0xc2, 0xb4, 0x3a, 0x3a, 0x1a, - 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x06, 0xf0, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x02, 0x53, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x1a, 0x05, 0x26, 0x01, 0x1a, 0x7e, 0x1a, 0x1d, 0x10, 0x09, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x76, 0x01, 0x67, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x1a, 0x11, 0x26, 0x01, 0x1a, 0x72, 0x1a, 0x1d, 0x0d, 0x07, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xff, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1b, 0x1b, 0x05, 0x26, 0x01, 0x20, 0x26, 0x20, 0x1a, 0x10, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x88, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x20, 0x0a, 0x20, 0x1a, 0x0d, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x02, 0x22, 0x01, 0x25, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x1a, 0x05, 0x26, 0x01, 0x1a, 0x27, 0x1a, 0x1c, 0x10, 0x09, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x1a, 0x11, 0x26, 0x01, 0x1a, 0x11, 0x1a, 0x1c, 0x0d, 0x07, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1a, 0x1a, 0x05, 0x26, 0x01, 0x1c, 0x26, 0x1c, 0x22, 0x10, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1a, 0x1a, 0x11, 0x26, 0x01, 0x1c, 0x10, 0x1c, 0x22, 0x0d, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x65, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x00, 0x01, 0x66, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x14, 0x14, 0x05, 0x26, 0x02, 0x16, 0xb8, 0xff, 0xab, 0xb4, 0x16, 0x1c, - 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0xff, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfb, 0x03, 0xba, 0x00, 0x4b, - 0x00, 0x13, 0x40, 0x0b, 0x02, 0x2b, 0x00, 0x02, 0x2b, 0x53, 0x2b, 0x2b, - 0x0f, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x65, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0x6d, - 0x05, 0xcc, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x73, 0x40, 0x2d, 0x1f, 0x10, - 0x06, 0x25, 0x11, 0x00, 0x0e, 0x0e, 0x15, 0x17, 0x06, 0x17, 0x2b, 0x2c, - 0x1a, 0x15, 0x17, 0x0f, 0x10, 0x0f, 0x51, 0x59, 0x14, 0x0f, 0x10, 0x1f, - 0x10, 0x2f, 0x10, 0x03, 0x17, 0x03, 0x10, 0x10, 0x12, 0x00, 0x0b, 0x00, - 0x08, 0x03, 0x08, 0x28, 0x50, 0x59, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x11, - 0x09, 0x0d, 0x48, 0x08, 0x10, 0x03, 0x22, 0x50, 0x59, 0x03, 0x16, 0x3f, - 0x2c, 0x01, 0x8f, 0x2c, 0x01, 0x5d, 0x72, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x39, 0x2f, - 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x12, 0x39, - 0x32, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, - 0x32, 0x16, 0x17, 0x33, 0x27, 0x35, 0x21, 0x35, 0x21, 0x35, 0x33, 0x15, - 0x33, 0x15, 0x23, 0x11, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x35, 0x01, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, - 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, - 0xfe, 0xd4, 0x01, 0x2c, 0xb4, 0x84, 0x84, 0x06, 0xac, 0x03, 0x07, 0xfd, - 0xda, 0x78, 0x87, 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, - 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0xab, 0x83, 0x93, - 0x93, 0x83, 0xfc, 0x29, 0xa9, 0x36, 0x10, 0x74, 0x2a, 0x01, 0x70, 0xe3, - 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x01, 0x7a, 0x01, 0x49, 0x00, 0x18, 0xb6, 0x01, - 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0d, 0xb8, 0xff, 0xed, 0xb4, 0x0d, 0x0c, - 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0x53, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf5, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x02, 0x1b, 0x03, - 0x1b, 0x1a, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x06, 0xf3, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, 0x01, 0x89, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0f, 0xb8, 0xff, - 0xeb, 0xb4, 0x0f, 0x17, 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xe6, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, - 0x01, 0x10, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1a, 0x1a, 0x11, - 0x26, 0x02, 0x1d, 0x02, 0x1d, 0x23, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0xc9, 0x01, 0x25, 0x00, 0x16, 0xb5, 0x01, 0x0c, 0x05, 0x26, 0x01, - 0x0c, 0xb8, 0xff, 0xec, 0xb4, 0x0c, 0x0e, 0x00, 0x0a, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x44, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x1a, 0x11, 0x26, - 0x02, 0x1a, 0x02, 0x1a, 0x1c, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x55, 0x04, 0xfe, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9d, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x15, 0xb8, 0xff, 0xc2, - 0xb4, 0x15, 0x15, 0x0b, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xfe, 0x55, 0x04, 0x18, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9d, 0x01, 0x7d, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x23, 0xb8, 0xfe, 0xf2, 0xb4, 0x23, 0x23, 0x07, - 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x00, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0e, 0xb8, 0xff, 0xe7, 0xb4, 0x0e, 0x14, - 0x00, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0xea, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x02, 0x1c, 0xb8, 0xff, - 0xfe, 0xb4, 0x1c, 0x22, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0xdb, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x20, 0x20, 0x05, - 0x26, 0x01, 0x25, 0x22, 0x25, 0x1f, 0x00, 0x17, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, - 0x00, 0xd8, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x30, 0x30, 0x11, - 0x26, 0x02, 0x35, 0x00, 0x35, 0x2f, 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, - 0x06, 0xf3, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, - 0x01, 0xf6, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1f, 0x1f, 0x05, - 0x26, 0x01, 0x22, 0x27, 0x22, 0x2a, 0x00, 0x17, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, - 0x05, 0xe6, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, - 0x00, 0xf9, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x2f, 0x2f, 0x11, - 0x26, 0x02, 0x32, 0x00, 0x32, 0x38, 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x02, 0x35, 0x01, 0x25, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1f, 0x05, 0x26, - 0x01, 0x1f, 0x27, 0x1f, 0x21, 0x00, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x2d, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x2f, 0x11, 0x26, - 0x02, 0x2f, 0x00, 0x2f, 0x31, 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x4e, 0x05, 0xa0, - 0x05, 0x96, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, - 0x02, 0x4e, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x23, 0x2e, 0x23, 0x1f, - 0x00, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x03, 0xef, 0x06, 0x20, 0x10, 0x26, 0x00, 0x4a, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfc, 0x01, 0x38, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x37, 0x37, 0x11, 0x26, 0x02, 0x2f, 0xb8, 0xff, 0xfc, 0xb4, 0x2f, 0x33, - 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, 0x01, 0x99, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0d, 0x0d, 0x05, 0x26, 0x01, 0x12, 0x00, - 0x12, 0x0c, 0x04, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, 0x07, 0x3e, 0x12, 0x26, - 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, 0x00, 0xf2, 0x00, 0x40, - 0x00, 0x18, 0xb6, 0x01, 0x1a, 0x1a, 0x02, 0x26, 0x01, 0x1f, 0xb8, 0xff, - 0xff, 0xb4, 0x1f, 0x19, 0x12, 0x06, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x05, 0xb9, - 0x05, 0x81, 0x00, 0x13, 0x00, 0x17, 0x00, 0x83, 0x40, 0x23, 0x17, 0x0b, - 0x03, 0x03, 0x08, 0x07, 0x04, 0x14, 0x0c, 0x00, 0x00, 0x10, 0x0f, 0x13, - 0x05, 0x13, 0x01, 0x0a, 0x04, 0x01, 0x04, 0x13, 0x18, 0x19, 0x00, 0x19, - 0x01, 0x80, 0x19, 0x90, 0x19, 0xa0, 0x19, 0x03, 0x19, 0xb8, 0xff, 0xc0, - 0x40, 0x28, 0x0e, 0x11, 0x48, 0x0f, 0x19, 0x01, 0x0b, 0x03, 0x17, 0x02, - 0x5f, 0x59, 0x16, 0x12, 0x06, 0x07, 0x06, 0x5f, 0x59, 0x0f, 0x0b, 0x07, - 0x40, 0x17, 0x01, 0xa0, 0x17, 0xd0, 0x17, 0x02, 0x17, 0x07, 0x17, 0x07, - 0x0d, 0x09, 0x03, 0x04, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x39, - 0x39, 0x2f, 0x2f, 0x5d, 0x71, 0x11, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x33, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, 0x5d, 0x71, 0x11, 0x12, 0x39, - 0x39, 0x5d, 0x5d, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x11, 0x21, 0x11, 0x23, - 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x33, - 0x15, 0x23, 0x11, 0x03, 0x35, 0x21, 0x15, 0x04, 0x66, 0xfd, 0x01, 0xbf, - 0x9a, 0x9a, 0xbf, 0x02, 0xff, 0xba, 0x99, 0x99, 0xba, 0xfd, 0x01, 0x02, - 0x8d, 0xfd, 0x73, 0x04, 0x01, 0x9a, 0xe6, 0xe6, 0xe6, 0xe6, 0x9a, 0xfb, - 0xff, 0x03, 0x2d, 0xd4, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, - 0x00, 0x00, 0x03, 0xee, 0x05, 0xcc, 0x00, 0x20, 0x00, 0x73, 0x40, 0x23, - 0x1d, 0x19, 0x11, 0x11, 0x16, 0x15, 0x12, 0x07, 0x1a, 0x12, 0x03, 0x21, - 0x08, 0x22, 0x40, 0x22, 0x50, 0x22, 0x60, 0x22, 0x03, 0x40, 0x22, 0x80, - 0x22, 0x02, 0x8f, 0x22, 0x01, 0x00, 0x22, 0x01, 0x10, 0x03, 0x22, 0xb8, - 0xff, 0xc0, 0x40, 0x18, 0x13, 0x17, 0x48, 0x1c, 0x14, 0x15, 0x14, 0x51, - 0x59, 0x19, 0x15, 0x15, 0x17, 0x00, 0x00, 0x03, 0x12, 0x07, 0x15, 0x03, - 0x0d, 0x50, 0x59, 0x03, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0c, 0x48, 0x03, - 0x0f, 0x00, 0x3f, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x3f, - 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, - 0x5d, 0x71, 0x72, 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, - 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x14, - 0x06, 0x07, 0x01, 0x3d, 0x3a, 0xa3, 0x7d, 0xb0, 0xa7, 0xb5, 0x2a, 0x60, - 0x55, 0x7f, 0x99, 0xb4, 0x84, 0x84, 0xb4, 0x01, 0x2c, 0xfe, 0xd4, 0x07, - 0x01, 0x03, 0x59, 0x6a, 0x63, 0xaf, 0xce, 0xfd, 0x57, 0x02, 0x86, 0x72, - 0x6f, 0x34, 0xb0, 0x95, 0xfd, 0xaa, 0x04, 0xb6, 0x83, 0x93, 0x93, 0x83, - 0x94, 0x3d, 0x82, 0x0a, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x02, 0x85, - 0x07, 0x06, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x09, 0x02, - 0xcf, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x04, 0x04, 0x05, 0x26, 0x01, - 0x0d, 0x02, 0x0d, 0x19, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x02, 0x85, - 0x05, 0xbd, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, - 0xcf, 0x00, 0x00, 0x1c, 0x40, 0x12, 0x01, 0x04, 0x04, 0x11, 0x26, 0x01, - 0x0d, 0x00, 0x0d, 0x10, 0x0d, 0x02, 0x02, 0x0d, 0x19, 0x00, 0x02, 0x25, - 0x2b, 0x71, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x0c, - 0x00, 0x00, 0x02, 0x31, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0xff, 0xd9, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x04, 0x04, 0x05, 0x26, 0x01, 0x05, 0x02, 0x05, 0x04, 0x00, 0x02, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x0c, - 0x00, 0x00, 0x02, 0x31, 0x05, 0x53, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x8b, 0xd9, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x04, - 0x04, 0x11, 0x26, 0x01, 0x05, 0x02, 0x05, 0x04, 0x00, 0x02, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd2, - 0x00, 0x00, 0x02, 0x6c, 0x06, 0xf3, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, - 0x11, 0x06, 0x09, 0x04, 0xea, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x04, - 0x04, 0x05, 0x26, 0x01, 0x07, 0x02, 0x07, 0x0f, 0x00, 0x02, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd2, - 0x00, 0x00, 0x02, 0x6c, 0x05, 0xe6, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x9a, 0xf5, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x04, - 0x04, 0x11, 0x26, 0x01, 0x07, 0x03, 0x07, 0x0d, 0x00, 0x02, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, - 0xfe, 0x55, 0x01, 0xba, 0x05, 0x81, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x9d, 0x0c, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x0d, 0x00, - 0x0d, 0x0d, 0x03, 0x03, 0x25, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x1f, - 0xfe, 0x55, 0x01, 0x7d, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4c, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x9d, 0xcf, 0x00, 0x00, 0x11, 0x40, 0x0b, 0x17, 0x13, - 0x01, 0x02, 0x11, 0x00, 0x11, 0x11, 0x07, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x5d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbd, 0x00, 0x00, 0x01, 0x7c, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x00, 0x27, 0x01, 0x25, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x04, 0x05, 0x26, - 0x01, 0x04, 0x00, 0x04, 0x06, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc2, 0x00, 0x00, 0x01, 0x76, - 0x04, 0x3a, 0x00, 0x03, 0x01, 0x0a, 0x40, 0xbe, 0x03, 0x00, 0x00, 0x04, - 0x05, 0x01, 0x0f, 0x00, 0x15, 0x24, 0x05, 0x01, 0xe4, 0x05, 0x01, 0xd4, - 0x05, 0x01, 0xc4, 0x05, 0x01, 0xb4, 0x05, 0x01, 0x84, 0x05, 0x01, 0x74, - 0x05, 0x01, 0x34, 0x05, 0x01, 0x24, 0x05, 0x01, 0x14, 0x05, 0x01, 0x04, - 0x05, 0x01, 0x6e, 0xe4, 0x05, 0x01, 0xd4, 0x05, 0x01, 0xc4, 0x05, 0x01, - 0xb4, 0x05, 0x01, 0x40, 0x05, 0x01, 0x34, 0x05, 0x01, 0x24, 0x05, 0x01, - 0x14, 0x05, 0x01, 0x90, 0x05, 0x01, 0x84, 0x05, 0x01, 0x74, 0x05, 0x01, - 0x64, 0x05, 0x01, 0xe4, 0x05, 0x01, 0xd4, 0x05, 0x01, 0xc4, 0x05, 0x01, - 0xb4, 0x05, 0x01, 0x6b, 0x05, 0x01, 0x34, 0x05, 0x01, 0x24, 0x05, 0x01, - 0x14, 0x05, 0x01, 0x04, 0x05, 0x01, 0x38, 0xdb, 0x05, 0x01, 0xcb, 0x05, - 0x01, 0x94, 0x05, 0x01, 0x84, 0x05, 0x01, 0x74, 0x05, 0x01, 0x64, 0x05, - 0x01, 0x2b, 0x05, 0x01, 0x1b, 0x05, 0x01, 0xe4, 0x05, 0x01, 0xd4, 0x05, - 0x01, 0xc4, 0x05, 0x01, 0x7b, 0x05, 0x01, 0x6b, 0x05, 0x01, 0x40, 0x05, - 0x01, 0x02, 0x30, 0x05, 0x01, 0x20, 0x05, 0x01, 0x10, 0x05, 0x01, 0xcf, - 0x05, 0x01, 0xbf, 0x05, 0x01, 0x90, 0x05, 0x01, 0x80, 0x05, 0x01, 0x70, - 0x05, 0x01, 0x60, 0x05, 0x01, 0x40, 0x05, 0x01, 0x20, 0x05, 0x01, 0x1f, - 0x05, 0x01, 0x0f, 0x05, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x00, 0x3f, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, - 0xc2, 0xb4, 0x04, 0x3a, 0xfb, 0xc6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaa, - 0xff, 0xec, 0x05, 0x49, 0x05, 0x81, 0x10, 0x26, 0x00, 0x2c, 0xed, 0x00, - 0x10, 0x07, 0x00, 0x2d, 0x01, 0xe1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, - 0xfe, 0x57, 0x03, 0x03, 0x05, 0xcc, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x4d, 0x01, 0xc6, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x10, - 0x03, 0x02, 0x08, 0x6f, 0x08, 0x01, 0x10, 0x08, 0x30, 0x08, 0x02, 0x01, - 0x00, 0x10, 0x00, 0x01, 0x5d, 0x35, 0x35, 0x5d, 0x5d, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x20, 0xff, 0xec, 0x03, 0xcd, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x2d, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, 0x01, 0x37, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x12, 0x12, 0x05, 0x26, 0x01, 0x17, 0xbe, - 0x17, 0x11, 0x02, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x02, 0xff, 0x99, 0xfe, 0x57, 0x02, 0x2f, 0x05, 0xd3, 0x00, 0x0c, - 0x00, 0x16, 0x01, 0x18, 0x40, 0xc4, 0x16, 0x15, 0x11, 0x11, 0x0e, 0x13, - 0x0e, 0x0a, 0x0a, 0x03, 0x13, 0x07, 0x07, 0x18, 0x17, 0x13, 0x15, 0x94, - 0x5b, 0x0f, 0x13, 0x2f, 0x13, 0x3f, 0x13, 0x7f, 0x13, 0xef, 0x13, 0x05, - 0x09, 0x03, 0x13, 0x08, 0x0f, 0x00, 0x04, 0x50, 0x59, 0x00, 0x1b, 0xcf, - 0x18, 0x01, 0xbf, 0x18, 0x01, 0x8f, 0x18, 0x01, 0x3f, 0x18, 0x01, 0x2f, - 0x18, 0x01, 0x1f, 0x18, 0x01, 0x00, 0x18, 0x01, 0x6f, 0xef, 0x18, 0x01, - 0xd0, 0x18, 0x01, 0x3f, 0x18, 0x01, 0xff, 0x18, 0x01, 0xaf, 0x18, 0x01, - 0x9f, 0x18, 0x01, 0x8f, 0x18, 0x01, 0x6f, 0x18, 0x01, 0x50, 0x18, 0x01, - 0x40, 0x18, 0x01, 0x30, 0x18, 0x01, 0x20, 0x18, 0x01, 0xdf, 0x18, 0x01, - 0xb0, 0x18, 0x01, 0xa0, 0x18, 0x01, 0x90, 0x18, 0x01, 0x4f, 0x18, 0x01, - 0x3f, 0x18, 0x01, 0x2f, 0x18, 0x01, 0x00, 0x18, 0x01, 0x3d, 0xff, 0x18, - 0x01, 0xef, 0x18, 0x01, 0xdf, 0x18, 0x01, 0xcf, 0x18, 0x01, 0xb0, 0x18, - 0x01, 0x90, 0x18, 0x01, 0x80, 0x18, 0x01, 0x70, 0x18, 0x01, 0x1f, 0x18, - 0x01, 0x0f, 0x18, 0x01, 0xff, 0x18, 0x01, 0xdf, 0x18, 0x01, 0xcf, 0x18, - 0x01, 0xbf, 0x18, 0x01, 0xaf, 0x18, 0x01, 0x90, 0x18, 0x01, 0x4f, 0x18, - 0x01, 0xff, 0x18, 0x01, 0xe0, 0x18, 0x01, 0xd0, 0x18, 0x01, 0xc0, 0x18, - 0x01, 0x80, 0x18, 0x01, 0x70, 0x18, 0x01, 0x1f, 0x18, 0x01, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x22, 0x27, 0x35, - 0x17, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x01, 0x15, 0x23, - 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, 0x4d, 0x4d, 0x32, 0x3e, 0x45, - 0x38, 0xb4, 0x78, 0x01, 0x6a, 0x69, 0xdb, 0x02, 0xe8, 0x68, 0xea, 0xcc, - 0xfe, 0x57, 0x09, 0x8b, 0x06, 0x48, 0x68, 0x04, 0xa5, 0xfb, 0x40, 0x99, - 0x8a, 0x06, 0x6e, 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x0e, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x4e, 0x05, 0x3f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2e, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, 0x01, 0xdd, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x10, 0xb8, 0xff, 0xcd, 0xb4, 0x10, 0x0c, 0x04, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8a, - 0xfe, 0x4e, 0x04, 0x03, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xf9, 0x01, 0x4e, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x10, 0xb8, 0xff, 0xeb, 0xb4, 0x10, 0x0c, 0x04, 0x0b, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, - 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x41, 0x40, 0x25, 0x00, 0x0d, 0x07, 0x03, - 0x03, 0x04, 0x08, 0x09, 0x09, 0x0a, 0x04, 0x03, 0x0c, 0x0b, 0x0d, 0x80, - 0x0d, 0xc0, 0x0d, 0xe0, 0x0d, 0x03, 0x3f, 0x0d, 0x01, 0x02, 0x01, 0x07, - 0x0a, 0x04, 0x08, 0x08, 0x05, 0x0f, 0x04, 0x00, 0x15, 0x00, 0x3f, 0x32, - 0x3f, 0x33, 0x11, 0x17, 0x39, 0x01, 0x5d, 0x5d, 0x11, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x03, - 0x30, 0xfe, 0x92, 0x84, 0xb4, 0xb4, 0x01, 0xdb, 0xd3, 0xfe, 0x49, 0x01, - 0xce, 0x01, 0xee, 0x6c, 0xfe, 0x7e, 0x04, 0x3a, 0xfd, 0xf3, 0x02, 0x0d, - 0xfe, 0x2f, 0xfd, 0x97, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x2f, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x00, 0xad, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, 0x06, 0x05, 0x26, 0x01, - 0x06, 0xb8, 0xff, 0x5e, 0xb4, 0x06, 0x09, 0x00, 0x04, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x5b, 0x00, 0x00, 0x02, 0x03, - 0x07, 0x3e, 0x12, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x11, 0x06, 0x08, 0xfe, - 0x13, 0x4e, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x04, 0x02, 0x26, 0x01, 0x04, - 0x4b, 0x04, 0x07, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x4e, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, 0x01, 0x85, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0a, 0xb8, 0xff, 0xfd, 0xb4, 0x0a, 0x06, 0x00, - 0x04, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, - 0xfe, 0x4e, 0x01, 0x47, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4f, 0x00, 0x00, - 0x11, 0x06, 0x08, 0xf9, 0xff, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x08, 0xb8, - 0xff, 0xff, 0xb4, 0x08, 0x04, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfb, 0x02, 0x15, 0x00, 0x00, - 0x00, 0x13, 0x40, 0x0b, 0x01, 0x0e, 0x03, 0x01, 0x0a, 0x8a, 0x0a, 0x06, - 0x00, 0x04, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8a, 0x00, 0x00, 0x02, 0x69, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x4f, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfb, 0x01, 0x24, 0x00, 0x4b, - 0x00, 0x29, 0x40, 0x14, 0x4f, 0x0f, 0x01, 0x2f, 0x0f, 0x9f, 0x0f, 0xdf, - 0x0f, 0x03, 0x70, 0x0f, 0x80, 0x0f, 0x02, 0x01, 0x0c, 0x00, 0x01, 0x08, - 0xb8, 0x01, 0x20, 0xb4, 0x08, 0x04, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x3f, 0x35, 0x01, 0x5d, 0x5d, 0x71, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0xd5, 0xfd, 0x8f, 0x00, 0x0c, 0xb7, 0x01, - 0x06, 0x5f, 0x06, 0x08, 0x00, 0x04, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8a, 0x00, 0x00, 0x02, 0x92, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x4f, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x42, 0xfd, 0x8f, - 0x00, 0x0f, 0xb1, 0x01, 0x04, 0xb8, 0x01, 0x54, 0xb4, 0x04, 0x06, 0x00, - 0x02, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x04, 0x2f, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x46, 0x40, 0x25, - 0x0c, 0x00, 0x02, 0x02, 0x09, 0x07, 0x05, 0x03, 0x05, 0x0f, 0x0e, 0x06, - 0x01, 0x09, 0x0c, 0x04, 0x10, 0x07, 0x01, 0x07, 0x40, 0x00, 0x0d, 0x01, - 0x09, 0x03, 0x0d, 0x0d, 0x05, 0x0a, 0x03, 0x05, 0x02, 0x5f, 0x59, 0x05, - 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, - 0x5d, 0x1a, 0xcd, 0x5d, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x05, 0x11, 0x21, - 0x15, 0x21, 0x11, 0x07, 0x35, 0x37, 0x11, 0x33, 0x11, 0x25, 0x02, 0x68, - 0xfe, 0xff, 0x02, 0xc8, 0xfc, 0x79, 0x94, 0x94, 0xbf, 0x01, 0x01, 0x03, - 0x1d, 0x95, 0xfe, 0x14, 0x9c, 0x02, 0x1a, 0x55, 0x9e, 0x55, 0x02, 0xc9, - 0xfd, 0xa5, 0x94, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0xba, - 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x49, 0x40, 0x2b, 0x08, 0x07, 0x0b, 0x0b, - 0x04, 0x02, 0x00, 0x00, 0x0c, 0x0d, 0x01, 0x0a, 0x04, 0x07, 0x04, 0x02, - 0x4f, 0x08, 0x01, 0x08, 0x08, 0x05, 0x00, 0x00, 0x15, 0xff, 0x0d, 0x01, - 0xd0, 0x0d, 0x01, 0xc0, 0x0d, 0x01, 0x80, 0x0d, 0x01, 0x70, 0x0d, 0x01, - 0x1f, 0x0d, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x3f, - 0x39, 0x2f, 0x5d, 0xcd, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x33, 0x11, 0x07, 0x35, 0x37, - 0x11, 0x33, 0x11, 0x37, 0x15, 0x07, 0x11, 0x8a, 0x7a, 0x7a, 0xb4, 0x7c, - 0x7c, 0x02, 0x1e, 0x44, 0x9e, 0x44, 0x03, 0x10, 0xfd, 0x58, 0x48, 0x9f, - 0x47, 0xfd, 0x7a, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x02, 0x11, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0e, 0x05, 0x26, - 0x01, 0x0e, 0x49, 0x0e, 0x11, 0x05, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8c, 0x00, 0x00, 0x03, 0xf2, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x51, 0x04, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x84, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1b, 0x11, 0x26, - 0x01, 0x1b, 0x61, 0x1b, 0x1e, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x4e, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, - 0x01, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x12, 0xb8, 0xff, 0xfc, - 0xb4, 0x12, 0x0e, 0x05, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8c, 0xfe, 0x4e, 0x03, 0xf2, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x51, 0x04, 0x00, 0x11, 0x07, 0x08, 0xf9, 0x01, 0x5b, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x1f, 0x00, 0x1f, 0x1b, 0x0d, 0x19, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x01, 0x93, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0e, 0x0e, 0x05, 0x26, - 0x01, 0x10, 0xb8, 0xff, 0xfa, 0xb4, 0x10, 0x16, 0x05, 0x0c, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8c, - 0x00, 0x00, 0x03, 0xf2, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x51, 0x04, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x1d, 0xb8, 0xff, 0xfe, 0xb4, 0x1d, 0x23, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x04, 0x50, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x51, 0x62, 0x00, 0x11, 0x07, 0x07, 0xe4, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x15, 0xb4, 0x01, 0x24, 0x03, 0x01, 0x24, 0xb8, 0xff, 0xd7, 0xb4, - 0x24, 0x24, 0x0a, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x00, - 0x00, 0x01, 0x00, 0xa5, 0xff, 0xec, 0x05, 0x34, 0x05, 0x95, 0x00, 0x24, - 0x00, 0x3d, 0x40, 0x20, 0x0a, 0x21, 0x19, 0x13, 0x13, 0x14, 0x14, 0x03, - 0x21, 0x03, 0x26, 0x25, 0x19, 0x1d, 0x00, 0x1d, 0x0e, 0x5f, 0x59, 0x1d, - 0x04, 0x16, 0x03, 0x13, 0x12, 0x00, 0x06, 0x5f, 0x59, 0x04, 0x00, 0x13, - 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x3e, - 0x01, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x11, 0x23, - 0x11, 0x03, 0x33, 0x16, 0x15, 0x33, 0x36, 0x24, 0x33, 0x32, 0x12, 0x19, - 0x01, 0x14, 0x0e, 0x01, 0x03, 0xad, 0x5f, 0xa4, 0x3b, 0x7f, 0x5a, 0x6a, - 0x49, 0x55, 0x26, 0x9d, 0xb1, 0x77, 0xd0, 0x79, 0xbf, 0x04, 0xb8, 0x07, - 0x04, 0x48, 0x01, 0x0f, 0xa3, 0xf6, 0xdc, 0x4d, 0xaa, 0x14, 0x4a, 0x4a, - 0x73, 0x6e, 0x4f, 0xa2, 0xac, 0x01, 0x42, 0xd5, 0xc1, 0x68, 0xb2, 0x65, - 0xfc, 0x85, 0x04, 0x44, 0x01, 0x3d, 0x9a, 0x61, 0x81, 0x8e, 0xfe, 0xfe, - 0xfe, 0xe6, 0xfe, 0xa5, 0xde, 0xe3, 0x71, 0x00, 0x00, 0x01, 0x00, 0x8c, - 0xfe, 0x57, 0x03, 0xf2, 0x04, 0x4e, 0x00, 0x23, 0x00, 0x3b, 0x40, 0x1f, - 0x07, 0x21, 0x19, 0x10, 0x10, 0x11, 0x11, 0x02, 0x21, 0x03, 0x25, 0x24, - 0x19, 0x1d, 0x10, 0x1d, 0x0c, 0x50, 0x59, 0x1d, 0x10, 0x14, 0x0f, 0x10, - 0x15, 0x00, 0x04, 0x50, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x27, - 0x35, 0x17, 0x32, 0x36, 0x35, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x03, 0x01, 0x4d, 0x32, - 0x3e, 0x45, 0x38, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, 0xaa, 0x01, - 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x78, 0xfe, 0x57, - 0x09, 0x8b, 0x06, 0x48, 0x68, 0x03, 0x19, 0x6b, 0x76, 0x34, 0xb2, 0x9e, - 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, - 0xb1, 0xcc, 0xfc, 0xa9, 0x97, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x01, 0xd6, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x1b, 0x1b, 0x05, 0x26, 0x02, 0x1c, 0x00, 0x1c, 0x1b, 0x08, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0x53, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x17, 0x17, 0x11, 0x26, 0x02, 0x18, 0x00, 0x18, 0x17, 0x06, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x06, 0xf3, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x04, 0x01, 0xe7, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x1b, 0x1b, 0x05, 0x26, 0x02, 0x1e, 0x00, 0x1e, 0x26, 0x08, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0xe6, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9a, 0x01, 0x10, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x17, 0x17, 0x11, 0x26, 0x02, 0x1a, 0x00, 0x1a, 0x20, 0x06, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x03, 0x01, 0xe2, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, - 0x03, 0x02, 0x1b, 0x05, 0x26, 0x03, 0x02, 0x1b, 0x5d, 0x1b, 0x24, 0x08, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x22, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9f, 0x01, 0x09, 0x00, 0x00, - 0x00, 0x18, 0x40, 0x0e, 0x03, 0x02, 0x17, 0x11, 0x26, 0x03, 0x02, 0x17, - 0x67, 0x17, 0x20, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x35, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xff, 0xf6, 0x07, 0xa6, - 0x05, 0x8c, 0x00, 0x14, 0x00, 0x20, 0x00, 0x5f, 0x40, 0x34, 0x1e, 0x05, - 0x00, 0x0a, 0x0e, 0x12, 0x12, 0x10, 0x0c, 0x17, 0x13, 0x13, 0x17, 0x05, - 0x03, 0x21, 0x22, 0x0e, 0x11, 0x5f, 0x59, 0x0e, 0x0e, 0x13, 0x0b, 0x14, - 0x13, 0x5f, 0x59, 0x14, 0x12, 0x0b, 0x0c, 0x5f, 0x59, 0x0b, 0x03, 0x08, - 0x1b, 0x5f, 0x59, 0x08, 0x04, 0x02, 0x15, 0x5f, 0x59, 0x02, 0x13, 0x7f, - 0x22, 0x01, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x12, 0x39, 0x39, 0x32, 0x11, - 0x33, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x06, 0x23, 0x20, 0x00, - 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x21, 0x15, 0x25, 0x32, 0x37, 0x11, 0x26, 0x22, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x00, 0x03, 0xe7, 0x43, 0x8f, 0xfe, 0xbd, 0xfe, 0x8f, - 0x01, 0x70, 0x01, 0x46, 0x6b, 0x69, 0x03, 0x92, 0xfc, 0xdd, 0x02, 0xe7, - 0xfd, 0x19, 0x03, 0x4c, 0xfb, 0x6f, 0x52, 0x34, 0x2c, 0x49, 0x0f, 0xf5, - 0xff, 0x01, 0x07, 0x0a, 0x01, 0x82, 0x01, 0x4f, 0x01, 0x4c, 0x01, 0x79, - 0x0b, 0x9c, 0xfe, 0x3c, 0x9a, 0xfe, 0x15, 0x9c, 0x91, 0x04, 0x04, 0x57, - 0x04, 0xfe, 0xe2, 0xfe, 0xf5, 0xfe, 0xf4, 0xfe, 0xd6, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x56, 0xff, 0xec, 0x07, 0x32, 0x04, 0x4e, 0x00, 0x1a, - 0x00, 0x25, 0x00, 0x2c, 0x00, 0x7d, 0x40, 0x45, 0x21, 0x10, 0x0b, 0x15, - 0x1b, 0x2c, 0x00, 0x00, 0x1b, 0x06, 0x07, 0x07, 0x26, 0x19, 0x19, 0x1b, - 0x10, 0x03, 0x2d, 0x2e, 0x2c, 0x00, 0x50, 0x59, 0x0d, 0x2c, 0x01, 0x14, - 0x04, 0x2c, 0x2c, 0x09, 0x17, 0x17, 0x29, 0x50, 0x59, 0x17, 0x10, 0x15, - 0x0b, 0x13, 0x0d, 0x13, 0x1e, 0x50, 0x59, 0x13, 0x10, 0x0d, 0x23, 0x50, - 0x59, 0x0d, 0x16, 0x09, 0x03, 0x50, 0x59, 0xef, 0x06, 0x01, 0x80, 0x06, - 0x01, 0x06, 0x06, 0x09, 0x16, 0x00, 0x3f, 0x33, 0x2f, 0x5d, 0x5d, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x20, 0x27, 0x06, - 0x21, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x20, 0x17, 0x36, 0x21, 0x20, - 0x11, 0x15, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x10, 0x21, 0x32, - 0x36, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x04, 0x2e, 0x9a, 0x94, - 0x75, 0x8d, 0x19, 0x9e, 0x61, 0xfe, 0xa8, 0xfe, 0xed, 0x79, 0x7c, 0xfe, - 0xeb, 0xee, 0xfb, 0xfd, 0xf2, 0x01, 0x19, 0x75, 0x7e, 0x01, 0x04, 0x01, - 0xdd, 0xfc, 0x3f, 0x8a, 0x9f, 0xa2, 0x93, 0x01, 0x2a, 0xa4, 0x90, 0x03, - 0x07, 0x0f, 0x90, 0x87, 0x83, 0x99, 0x06, 0x01, 0xf7, 0xba, 0xca, 0x5e, - 0x48, 0x2d, 0xff, 0x00, 0xb7, 0xb7, 0x01, 0x21, 0x01, 0x11, 0x01, 0x17, - 0x01, 0x19, 0xb1, 0xb1, 0xfd, 0xc1, 0x18, 0x27, 0xdb, 0xd0, 0xd5, 0xd6, - 0xfe, 0x53, 0xd0, 0x01, 0x40, 0xab, 0x9d, 0xaf, 0x99, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x68, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x01, 0xe1, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x02, 0x17, 0x05, 0x26, 0x02, 0x17, 0xb8, 0xff, 0xf5, - 0xb4, 0x17, 0x1a, 0x04, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x02, 0xa6, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x55, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x00, 0xb6, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x14, 0x11, 0x26, 0x01, 0x14, 0x4a, 0x14, - 0x17, 0x03, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x4e, 0x05, 0x68, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, 0x02, 0x05, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x1b, 0xb8, 0xff, 0xe1, 0xb4, 0x1b, 0x17, 0x04, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, - 0xfe, 0x4e, 0x02, 0x88, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, - 0x11, 0x06, 0x08, 0xf9, 0x02, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x18, 0xb8, - 0xff, 0x5e, 0xb4, 0x18, 0x14, 0x03, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x68, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x66, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x17, 0x17, 0x05, 0x26, 0x02, 0x19, 0xb8, 0xff, - 0xa9, 0xb4, 0x19, 0x1f, 0x04, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x02, 0xce, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, - 0x38, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x14, 0x14, 0x11, 0x26, 0x01, 0x16, - 0xb8, 0xff, 0xfb, 0xb4, 0x16, 0x1c, 0x03, 0x0c, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, - 0x07, 0x2d, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0xea, 0x01, 0x49, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x2e, 0x05, 0x26, - 0x01, 0x2e, 0x5b, 0x2e, 0x31, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x39, 0xff, 0xec, 0x03, 0xb6, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x39, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x2b, 0x11, 0x26, - 0x01, 0x2b, 0x5d, 0x2b, 0x2e, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0x72, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2f, 0x2f, 0x05, - 0x26, 0x01, 0x34, 0x12, 0x34, 0x2e, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x39, 0xff, 0xec, 0x03, 0xb6, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, - 0x00, 0xac, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2c, 0x2c, 0x11, - 0x26, 0x01, 0x31, 0x00, 0x31, 0x2b, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x5d, 0xfe, 0x4e, 0x04, 0xf8, - 0x05, 0x96, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x00, 0x7a, - 0x01, 0xa6, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x32, 0x28, 0x32, 0x2e, - 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x39, - 0xfe, 0x4e, 0x03, 0xb6, 0x04, 0x4b, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x7a, 0x00, 0xda, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x2f, 0x0f, 0x2f, 0x2b, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x73, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2e, 0x2e, 0x05, 0x26, 0x01, 0x30, 0x13, - 0x30, 0x36, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x39, 0xff, 0xec, 0x03, 0xb6, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0xad, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2b, 0x2b, 0x11, 0x26, 0x01, 0x2d, 0x00, - 0x2d, 0x33, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x2e, 0xfe, 0x4e, 0x04, 0xb4, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x00, 0x7a, 0x01, 0x5e, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x0c, 0x1a, 0x0c, 0x08, 0x03, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xfe, 0x4e, 0x02, 0x33, - 0x05, 0x2c, 0x10, 0x26, 0x00, 0x57, 0x00, 0x00, 0x11, 0x06, 0x00, 0x7a, - 0x50, 0x00, 0x00, 0x99, 0x40, 0x89, 0x0f, 0x29, 0x1f, 0x29, 0x2f, 0x29, - 0x5f, 0x29, 0x6f, 0x29, 0x05, 0xe2, 0x0f, 0x29, 0x3f, 0x29, 0x4f, 0x29, - 0x5f, 0x29, 0x6f, 0x29, 0x7f, 0x29, 0xbf, 0x29, 0x07, 0x0f, 0x29, 0x1f, - 0x29, 0x2f, 0x29, 0x5f, 0x29, 0x8f, 0x29, 0x9f, 0x29, 0xbf, 0x29, 0xcf, - 0x29, 0x08, 0x0f, 0x29, 0x1f, 0x29, 0x2f, 0x29, 0x3f, 0x29, 0x6f, 0x29, - 0x7f, 0x29, 0xcf, 0x29, 0xdf, 0x29, 0xef, 0x29, 0x09, 0xb2, 0x0f, 0x29, - 0x1f, 0x29, 0x5f, 0x29, 0x6f, 0x29, 0x7f, 0x29, 0x8f, 0x29, 0xbf, 0x29, - 0xcf, 0x29, 0x08, 0x0f, 0x29, 0x1f, 0x29, 0x2f, 0x29, 0x3f, 0x29, 0x6f, - 0x29, 0xaf, 0x29, 0xbf, 0x29, 0xcf, 0x29, 0xdf, 0x29, 0xef, 0x29, 0x0a, - 0x0f, 0x29, 0x1f, 0x29, 0x3f, 0x29, 0x4f, 0x29, 0x6f, 0x29, 0x7f, 0x29, - 0x8f, 0x29, 0xbf, 0x29, 0xcf, 0x29, 0xef, 0x29, 0xff, 0x29, 0x0b, 0x82, - 0x80, 0x29, 0x01, 0x01, 0x19, 0x11, 0x19, 0x15, 0x04, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x5d, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, - 0x5d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x04, 0xb4, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x01, 0x21, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x08, 0x08, 0x05, 0x26, - 0x01, 0x0a, 0xb8, 0xff, 0xfb, 0xb4, 0x0a, 0x10, 0x04, 0x06, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, - 0xff, 0xf0, 0x03, 0x11, 0x05, 0xcc, 0x10, 0x26, 0x00, 0x57, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfb, 0x01, 0xcc, 0x00, 0x4b, 0x00, 0x12, 0xb2, 0x01, - 0x01, 0x19, 0xb8, 0x01, 0x88, 0xb4, 0x19, 0x15, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x35, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x04, 0xb4, - 0x05, 0x81, 0x00, 0x0f, 0x00, 0x4a, 0x40, 0x2a, 0x01, 0x05, 0x05, 0x0a, - 0x06, 0x06, 0x09, 0x0c, 0x0e, 0x02, 0x05, 0x11, 0x10, 0x00, 0x0c, 0x0d, - 0x0c, 0x5f, 0x59, 0x04, 0x08, 0x09, 0x08, 0x5f, 0x59, 0x01, 0x09, 0x09, - 0x05, 0x0d, 0x03, 0x05, 0x12, 0x20, 0x11, 0x01, 0x10, 0x11, 0x01, 0x00, - 0x11, 0x01, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, - 0x02, 0xd0, 0x01, 0x19, 0xfe, 0xe7, 0xbe, 0xfe, 0xe9, 0x01, 0x17, 0xfe, - 0x1c, 0x04, 0x86, 0x04, 0xe5, 0xfe, 0x3c, 0x9a, 0xfd, 0x79, 0x02, 0x87, - 0x9a, 0x01, 0xc4, 0x9c, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, - 0xff, 0xf0, 0x02, 0x2a, 0x05, 0x2c, 0x00, 0x1c, 0x00, 0x75, 0x40, 0x40, - 0x06, 0x1b, 0x12, 0x0d, 0x0d, 0x0b, 0x17, 0x1b, 0x1b, 0x1a, 0x16, 0x01, - 0x01, 0x13, 0x0f, 0x0b, 0x0b, 0x1d, 0x1e, 0x0f, 0x1e, 0x01, 0x0b, 0x00, - 0x1e, 0x01, 0x11, 0x03, 0x19, 0x11, 0x12, 0x11, 0x50, 0x59, 0x00, 0x0d, - 0x0e, 0x0d, 0x50, 0x59, 0x1a, 0x0f, 0x0e, 0x4f, 0x0e, 0x5f, 0x0e, 0x03, - 0x10, 0x03, 0x0e, 0x0e, 0x09, 0x16, 0x14, 0x40, 0x12, 0x0f, 0x09, 0x04, - 0x50, 0x59, 0x09, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, 0xce, - 0x33, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x11, 0x12, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, - 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, - 0x01, 0x50, 0x33, 0x3f, 0x24, 0x44, 0x59, 0x5d, 0xd8, 0x7d, 0x7d, 0x7d, - 0x84, 0x35, 0x78, 0xc8, 0xc8, 0xc8, 0x02, 0x04, 0xf8, 0x4e, 0x3f, 0x0e, - 0x85, 0x18, 0xf5, 0x01, 0x1f, 0x83, 0x01, 0x30, 0x83, 0xf2, 0xf2, 0x83, - 0xfe, 0xd0, 0x83, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x06, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, - 0x01, 0x94, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x14, 0x14, 0x05, - 0x26, 0x01, 0x1d, 0x00, 0x1d, 0x29, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, - 0x05, 0xbd, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, - 0x00, 0xf6, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1b, 0x1b, 0x11, - 0x26, 0x01, 0x24, 0x0d, 0x24, 0x30, 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x06, 0x9c, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x01, 0x9f, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x14, 0x14, 0x05, - 0x26, 0x01, 0x15, 0x01, 0x15, 0x14, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, - 0x05, 0x53, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x00, 0xf0, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x1b, 0x1b, 0x11, 0x26, - 0x01, 0x1c, 0xb8, 0xff, 0xfe, 0xb4, 0x1c, 0x1b, 0x19, 0x0d, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, - 0xff, 0xec, 0x05, 0x29, 0x06, 0xf3, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x04, 0x01, 0xae, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x14, 0x14, 0x05, 0x26, 0x01, 0x17, 0x00, 0x17, 0x1f, 0x04, 0x0f, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xeb, 0x05, 0xe6, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9a, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x1e, 0xb8, 0xff, 0xfd, 0xb4, 0x1e, 0x24, - 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, 0x07, 0x3e, 0x12, 0x26, - 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9c, 0x01, 0xbf, 0x00, 0xcb, - 0x00, 0x35, 0x40, 0x27, 0x02, 0x01, 0x00, 0x17, 0x60, 0x17, 0x70, 0x17, - 0x80, 0x17, 0xf0, 0x17, 0x05, 0x17, 0x03, 0x02, 0x01, 0x1a, 0x67, 0x1a, - 0x01, 0x26, 0x1a, 0x36, 0x1a, 0x46, 0x1a, 0x03, 0x53, 0x1a, 0x73, 0x1a, - 0x02, 0x00, 0x1a, 0x14, 0x04, 0x0f, 0x25, 0x2b, 0x5d, 0x5d, 0x5d, 0x11, - 0x35, 0x35, 0x00, 0x3f, 0x5d, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xeb, 0x06, 0x73, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9c, 0x01, 0x14, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x1e, 0x1e, 0x11, 0x26, 0x02, 0x01, 0x21, 0x01, 0x21, 0x1b, - 0x19, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x03, 0x01, 0x9d, 0x00, 0x00, - 0x00, 0x18, 0x40, 0x0e, 0x02, 0x01, 0x14, 0x05, 0x26, 0x02, 0x01, 0x14, - 0x51, 0x14, 0x1d, 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x04, 0x1e, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9f, - 0x01, 0x05, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, 0x02, 0x01, 0x1b, 0x11, - 0x26, 0x02, 0x01, 0x1b, 0x64, 0x1b, 0x24, 0x19, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, - 0xfe, 0x55, 0x05, 0x29, 0x05, 0x81, 0x10, 0x26, 0x00, 0x38, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9d, 0x02, 0x20, 0x00, 0x00, 0x00, 0x26, 0xb1, 0x01, - 0x1e, 0xb8, 0xfe, 0x67, 0x40, 0x19, 0x1e, 0x1e, 0x10, 0x10, 0x25, 0x20, - 0x29, 0x01, 0x20, 0x29, 0x50, 0x29, 0x60, 0x29, 0x70, 0x29, 0x80, 0x29, - 0xa0, 0x29, 0xb0, 0x29, 0xc0, 0x29, 0x08, 0x5d, 0x71, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xfe, 0x55, 0x04, 0x05, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9d, 0x02, 0x57, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x24, 0xb8, 0xff, 0xe2, 0xb4, 0x24, 0x24, 0x0b, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, - 0x00, 0x00, 0x07, 0x86, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xff, 0x02, 0x79, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1b, 0x1b, 0x05, 0x26, 0x01, 0x20, 0xb8, 0xff, 0xfd, 0xb4, 0x20, 0x1a, - 0x09, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x05, 0xcc, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x5a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, 0x01, 0x94, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x16, 0x16, 0x11, 0x26, 0x01, 0x1b, 0xb8, 0xff, - 0xfb, 0xb4, 0x1b, 0x15, 0x08, 0x14, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x08, 0xff, - 0x01, 0x5b, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0a, 0x0a, 0x05, 0x26, - 0x01, 0x0f, 0xb8, 0xff, 0xfb, 0xb4, 0x0f, 0x09, 0x04, 0x08, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, - 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x88, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x18, 0x18, 0x11, 0x26, 0x01, 0x1d, 0x00, 0x1d, 0x17, 0x09, 0x12, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x2d, - 0x00, 0x00, 0x05, 0x29, 0x06, 0xb2, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x09, 0x09, 0x05, 0x26, 0x02, 0x01, 0x0d, 0x00, 0x0d, 0x0b, - 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x04, 0xa3, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x3d, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x01, 0xa0, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0a, 0x05, 0x26, 0x01, 0x0a, 0x4a, 0x0a, - 0x0d, 0x01, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0x00, 0x00, 0x03, 0x9a, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x5d, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x35, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0a, 0x11, 0x26, 0x01, 0x0a, 0x5d, 0x0a, - 0x0d, 0x00, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x04, 0xa3, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x3d, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x7c, 0x01, 0x25, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0a, 0x05, 0x26, 0x01, 0x0a, 0x00, 0x0a, - 0x0c, 0x01, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0x00, 0x00, 0x03, 0x9a, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x5d, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x00, 0xfd, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x0a, 0x00, 0x0a, 0x0c, 0x00, 0x08, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x04, 0xa3, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x01, 0x38, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0a, 0x0a, 0x05, - 0x26, 0x01, 0x0c, 0x11, 0x0c, 0x12, 0x01, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x53, 0x00, 0x00, 0x03, 0x9a, - 0x05, 0xd3, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, - 0x00, 0x9c, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0a, 0x0a, 0x11, 0x26, - 0x01, 0x0c, 0xb8, 0xff, 0xf4, 0xb4, 0x0c, 0x12, 0x00, 0x08, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, - 0x00, 0x00, 0x02, 0x11, 0x05, 0xca, 0x00, 0x0d, 0x00, 0x63, 0x40, 0x29, - 0x07, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x0e, 0xef, 0x0f, 0x01, 0xd0, 0x0f, - 0x01, 0xcf, 0x0f, 0x01, 0xa0, 0x0f, 0xb0, 0x0f, 0x02, 0x8f, 0x0f, 0x01, - 0x60, 0x0f, 0x70, 0x0f, 0x02, 0x0f, 0x0f, 0x01, 0xe0, 0x0f, 0xf0, 0x0f, - 0x02, 0xcf, 0x0f, 0x01, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x22, 0x25, - 0x48, 0x3f, 0x0f, 0x01, 0x60, 0x0f, 0x01, 0x0f, 0x0f, 0x01, 0x0a, 0x03, - 0x05, 0x0a, 0x50, 0x59, 0x05, 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, - 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x2b, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x01, 0x3e, 0xb4, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, - 0x45, 0x3e, 0x04, 0xb4, 0x94, 0x82, 0x0c, 0x89, 0x08, 0x46, 0x5c, 0x00, - 0x00, 0x02, 0x00, 0x0b, 0xff, 0xec, 0x04, 0x1d, 0x05, 0xcc, 0x00, 0x1f, - 0x00, 0x2b, 0x00, 0x68, 0x40, 0x31, 0x16, 0x07, 0x04, 0x26, 0x26, 0x01, - 0x1d, 0x11, 0x05, 0x1d, 0x03, 0x2c, 0x2d, 0x1b, 0x15, 0x0a, 0x16, 0x0e, - 0x13, 0x13, 0x29, 0x50, 0x59, 0x13, 0x16, 0x07, 0x1f, 0x00, 0x1f, 0x51, - 0x59, 0x04, 0x00, 0x00, 0x0e, 0x02, 0x0e, 0x23, 0x50, 0x59, 0x00, 0x0e, - 0x01, 0xe0, 0x0e, 0xf0, 0x0e, 0x02, 0x0e, 0xb8, 0xff, 0xc0, 0xb6, 0x09, - 0x0c, 0x48, 0x0e, 0x10, 0x02, 0x00, 0x00, 0x3f, 0x3f, 0x2b, 0x5d, 0x71, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x14, 0x07, 0x33, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, - 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x23, 0x01, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x0b, 0x7f, 0xb4, 0x01, - 0x31, 0xfe, 0xcf, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xfe, 0x72, - 0x7b, 0xa3, 0x33, 0x02, 0x08, 0x02, 0xae, 0x06, 0x7f, 0x03, 0x55, 0x78, - 0x87, 0x98, 0x8b, 0x88, 0x99, 0x88, 0x79, 0x05, 0x39, 0x93, 0x93, 0x83, - 0x91, 0x41, 0x58, 0x68, 0x5a, 0xfe, 0xec, 0xfe, 0xe8, 0xfd, 0xca, 0x59, - 0x63, 0x1f, 0x7f, 0x0a, 0x36, 0xa9, 0x03, 0xd7, 0xfd, 0x66, 0xe3, 0xc4, - 0xd0, 0xe2, 0xd5, 0xcb, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x14, - 0x00, 0x00, 0x05, 0x9c, 0x05, 0x81, 0x00, 0x19, 0x00, 0x21, 0x00, 0x2a, - 0x00, 0x5c, 0x40, 0x2f, 0x09, 0x0e, 0x17, 0x14, 0x27, 0x27, 0x1e, 0x1e, - 0x04, 0x22, 0x14, 0x14, 0x1a, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x2b, 0x2c, - 0x17, 0x27, 0x1d, 0x27, 0x1d, 0x5f, 0x59, 0x27, 0x0c, 0x27, 0x0c, 0x04, - 0x11, 0x26, 0x06, 0x11, 0x06, 0x60, 0x59, 0x11, 0x03, 0x04, 0x1e, 0x5f, - 0x59, 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x04, 0x23, 0x21, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x21, 0x20, 0x11, 0x14, 0x06, 0x07, 0x1e, 0x01, - 0x07, 0x34, 0x29, 0x01, 0x11, 0x21, 0x32, 0x36, 0x03, 0x34, 0x26, 0x23, - 0x21, 0x11, 0x21, 0x32, 0x36, 0x05, 0x9c, 0xfe, 0xee, 0xf4, 0xfd, 0xc4, - 0x1d, 0x4d, 0x42, 0x12, 0x9b, 0x11, 0xac, 0x9a, 0x02, 0x00, 0x01, 0xf0, - 0x8c, 0x80, 0xa8, 0xb6, 0xc1, 0xfe, 0xa2, 0xfe, 0x9c, 0x01, 0x73, 0xaf, - 0xa0, 0x51, 0x9c, 0x94, 0xfe, 0xbf, 0x01, 0x41, 0x99, 0x97, 0x01, 0x8d, - 0xbc, 0xd1, 0x04, 0xed, 0x44, 0x47, 0x31, 0x38, 0x11, 0x4a, 0x3d, 0x82, - 0x90, 0xfe, 0xaa, 0x7d, 0xaa, 0x1d, 0x14, 0xb9, 0x7e, 0xf9, 0xfe, 0x04, - 0x82, 0x02, 0xf9, 0x72, 0x62, 0xfe, 0x42, 0x73, 0x00, 0x02, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xef, 0x05, 0x81, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x55, - 0x40, 0x10, 0x09, 0x12, 0x12, 0x04, 0x07, 0x0d, 0x0d, 0x00, 0x04, 0x00, - 0x16, 0x17, 0x60, 0x17, 0x01, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x1e, - 0x23, 0x48, 0x0f, 0x17, 0x01, 0x16, 0x03, 0x09, 0x11, 0x5f, 0x59, 0x09, - 0x09, 0x04, 0x05, 0x05, 0x08, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x12, 0x5f, - 0x59, 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, 0x5d, 0x11, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, - 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, - 0xef, 0xfe, 0xfe, 0xe3, 0xfd, 0x9e, 0x03, 0xb7, 0xfd, 0x08, 0x01, 0x97, - 0xec, 0x01, 0x05, 0xc0, 0xa4, 0xa4, 0xfe, 0x80, 0x01, 0x88, 0xa4, 0x9c, - 0x01, 0x9d, 0xbb, 0xe2, 0x05, 0x81, 0x9c, 0xfe, 0x48, 0xd2, 0xc0, 0x79, - 0x81, 0xfe, 0x02, 0x88, 0x00, 0x02, 0x00, 0x84, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xcc, 0x00, 0x19, 0x00, 0x25, 0x00, 0x48, 0x40, 0x25, 0x10, 0x05, - 0x20, 0x20, 0x0c, 0x0f, 0x1a, 0x1a, 0x00, 0x0c, 0x00, 0x26, 0x27, 0x13, - 0x05, 0x17, 0x02, 0x17, 0x1d, 0x50, 0x59, 0x17, 0x10, 0x0d, 0x10, 0x53, - 0x59, 0x0d, 0x00, 0x0a, 0x15, 0x02, 0x23, 0x50, 0x59, 0x02, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, - 0x26, 0x27, 0x23, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x14, 0x07, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, - 0xfe, 0x72, 0x7b, 0xa3, 0x33, 0x02, 0x08, 0x02, 0xae, 0x06, 0x02, 0xe8, - 0xfd, 0xcc, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xbd, 0x78, 0x87, - 0x98, 0x8b, 0x88, 0x99, 0x88, 0x79, 0x02, 0x22, 0xfd, 0xca, 0x59, 0x63, - 0x1f, 0x7f, 0x0a, 0x36, 0xa9, 0x04, 0xed, 0x9f, 0xfe, 0xf8, 0x41, 0x58, - 0x68, 0x5a, 0xfe, 0xec, 0xfe, 0xe2, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, 0xcb, - 0xc9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x04, 0xef, - 0x05, 0x81, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x34, 0x40, 0x1a, 0x0f, 0x00, - 0x0b, 0x14, 0x14, 0x07, 0x05, 0x00, 0x05, 0x19, 0x18, 0x0b, 0x13, 0x5f, - 0x59, 0x0b, 0x0b, 0x05, 0x09, 0x03, 0x05, 0x14, 0x5f, 0x59, 0x05, 0x12, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x0e, 0x01, 0x23, 0x21, 0x11, 0x27, 0x35, 0x25, 0x33, 0x11, - 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, - 0x04, 0xef, 0x75, 0xdb, 0x95, 0xfd, 0x9e, 0x9e, 0x01, 0x25, 0x38, 0x01, - 0x97, 0xed, 0x01, 0x04, 0xc0, 0xa5, 0xa3, 0xfe, 0x80, 0x01, 0x88, 0xa4, - 0x9c, 0x01, 0xa2, 0x7b, 0xbe, 0x69, 0x03, 0xf3, 0xa5, 0x21, 0xc8, 0xfd, - 0xb6, 0xd7, 0xc0, 0x78, 0x87, 0xfd, 0xf8, 0x8d, 0x00, 0x02, 0x00, 0x0a, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0xcc, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x40, - 0x40, 0x20, 0x12, 0x04, 0x21, 0x21, 0x00, 0x19, 0x1b, 0x0d, 0x19, 0x0d, - 0x27, 0x28, 0x17, 0x15, 0x06, 0x12, 0x0a, 0x0f, 0x0f, 0x24, 0x50, 0x59, - 0x0f, 0x16, 0x0a, 0x1e, 0x50, 0x59, 0x0a, 0x10, 0x02, 0x00, 0x00, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x13, 0x35, 0x25, 0x33, 0x11, 0x14, 0x07, 0x33, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, - 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x01, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x0a, 0x01, 0x01, 0x33, 0x04, - 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xfe, 0x72, 0x7b, 0xa3, 0x33, 0x02, - 0x08, 0x02, 0xae, 0x06, 0x02, 0xd6, 0x78, 0x87, 0x98, 0x8b, 0x88, 0x99, - 0x88, 0x79, 0x04, 0xf2, 0x21, 0xb9, 0xfe, 0x59, 0x41, 0x58, 0x68, 0x5a, - 0xfe, 0xec, 0xfe, 0xe8, 0xfd, 0xca, 0x59, 0x63, 0x1f, 0x7f, 0x0a, 0x36, - 0xa9, 0x03, 0x5f, 0xfd, 0xde, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, 0xcb, 0xc9, - 0x00, 0x01, 0x00, 0x5b, 0xff, 0xec, 0x05, 0x66, 0x05, 0x96, 0x00, 0x17, - 0x00, 0x3a, 0x40, 0x1c, 0x15, 0x14, 0x14, 0x09, 0x03, 0x0f, 0x09, 0x0f, - 0x18, 0x19, 0x15, 0x08, 0x15, 0x08, 0x12, 0x0c, 0x12, 0x00, 0x5f, 0x59, - 0x12, 0x13, 0x0c, 0x06, 0x5f, 0x59, 0x0c, 0x04, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x25, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x20, 0x03, 0x27, 0x36, 0x24, - 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x03, 0x37, 0x1e, 0x01, - 0x02, 0xb9, 0xe9, 0x01, 0x02, 0xfe, 0xf3, 0xe6, 0xfe, 0xdd, 0x97, 0x9c, - 0x58, 0x01, 0x37, 0xd0, 0x01, 0x42, 0x01, 0x6a, 0xfe, 0x96, 0xfe, 0xbf, - 0xfe, 0x3c, 0x8f, 0xb5, 0x2d, 0xd8, 0x88, 0x01, 0x2a, 0x01, 0x09, 0x01, - 0x04, 0x01, 0x3a, 0xfe, 0xdb, 0x4e, 0xb6, 0xbe, 0xfe, 0x78, 0xfe, 0xad, - 0xfe, 0xae, 0xfe, 0x83, 0x01, 0x5d, 0x3c, 0x78, 0x85, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x68, 0xff, 0xec, 0x06, 0x49, 0x06, 0x50, 0x00, 0x25, - 0x00, 0x4f, 0x40, 0x28, 0x08, 0x09, 0x09, 0x23, 0x1b, 0x15, 0x22, 0x03, - 0x10, 0x22, 0x10, 0x27, 0x26, 0x19, 0x1e, 0x5f, 0x59, 0x19, 0x13, 0x15, - 0x23, 0x13, 0x08, 0x23, 0x08, 0x23, 0x0c, 0x13, 0x13, 0x00, 0x5f, 0x59, - 0x13, 0x04, 0x0c, 0x06, 0x5f, 0x59, 0x0c, 0x13, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, - 0x12, 0x39, 0x10, 0xc4, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x00, - 0x11, 0x10, 0x00, 0x33, 0x20, 0x13, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, - 0x02, 0x35, 0x10, 0x00, 0x21, 0x20, 0x17, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x07, 0x2e, 0x01, 0x03, - 0x18, 0xea, 0xfe, 0xfc, 0x01, 0x0f, 0xe7, 0x01, 0x28, 0x95, 0x9c, 0x57, - 0xfe, 0xc5, 0xd0, 0xd5, 0xfe, 0xc9, 0xa3, 0x01, 0x6c, 0x01, 0x42, 0x01, - 0x13, 0xa5, 0x89, 0x7a, 0x36, 0x42, 0x38, 0x20, 0x47, 0x3e, 0xb5, 0x31, - 0xd9, 0x04, 0xfa, 0xfe, 0xd3, 0xfe, 0xfa, 0xfe, 0xfd, 0xfe, 0xc5, 0x01, - 0x25, 0x4e, 0xb6, 0xbe, 0xb1, 0x01, 0x49, 0xe1, 0x01, 0x51, 0x01, 0x7e, - 0x85, 0x17, 0x8a, 0x9e, 0x0f, 0x9d, 0x12, 0x47, 0x4d, 0xe9, 0x3c, 0x7b, - 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0xff, 0xec, 0x04, 0x8c, - 0x05, 0x03, 0x00, 0x24, 0x00, 0x4f, 0x40, 0x28, 0x06, 0x07, 0x07, 0x1f, - 0x18, 0x12, 0x1e, 0x00, 0x0d, 0x1e, 0x0d, 0x26, 0x25, 0x15, 0x1a, 0x50, - 0x59, 0x15, 0x10, 0x12, 0x1f, 0x10, 0x06, 0x1f, 0x06, 0x1f, 0x0a, 0x10, - 0x10, 0x22, 0x50, 0x59, 0x10, 0x10, 0x0a, 0x03, 0x50, 0x59, 0x0a, 0x16, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x10, 0xc4, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, - 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x17, 0x3e, 0x01, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x01, 0x13, 0x88, 0x89, 0x60, 0x81, 0x0f, 0xb6, 0x15, 0xe0, - 0xac, 0xe3, 0xef, 0xf0, 0xe0, 0x96, 0x6a, 0x09, 0x83, 0x76, 0x2f, 0x34, - 0x24, 0x2b, 0x42, 0x37, 0xb9, 0x0e, 0x72, 0x69, 0x8f, 0x80, 0x02, 0x22, - 0xd8, 0xd0, 0x68, 0x6c, 0x0c, 0x9c, 0xba, 0x01, 0x1f, 0x01, 0x13, 0x01, - 0x11, 0x01, 0x1f, 0x48, 0x79, 0x84, 0x0c, 0x96, 0x10, 0x47, 0x4d, 0xd2, - 0x0e, 0x5a, 0x6a, 0xbe, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x65, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, - 0x00, 0x00, 0x06, 0x17, 0x05, 0x81, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x3c, - 0x40, 0x1e, 0x16, 0x00, 0x1b, 0x05, 0x0a, 0x0f, 0x0f, 0x05, 0x00, 0x03, - 0x21, 0x20, 0x0d, 0x0d, 0x05, 0x12, 0x1a, 0x07, 0x12, 0x07, 0x60, 0x59, - 0x12, 0x03, 0x05, 0x1b, 0x5f, 0x59, 0x05, 0x12, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x02, 0x04, 0x23, 0x21, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x17, 0x07, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x20, 0x00, 0x03, 0x10, - 0x00, 0x29, 0x01, 0x11, 0x21, 0x32, 0x36, 0x12, 0x06, 0x17, 0xaa, 0xfe, - 0xc8, 0xcc, 0xfd, 0xf1, 0x1d, 0x4d, 0x42, 0x12, 0x9b, 0x11, 0xac, 0x9a, - 0x01, 0xd2, 0x01, 0x66, 0x01, 0x85, 0xc0, 0xfe, 0xe1, 0xfe, 0xf0, 0xfe, - 0xf1, 0x01, 0x3a, 0x9b, 0xeb, 0x7e, 0x02, 0xcf, 0xda, 0xfe, 0xb9, 0xae, - 0x04, 0xed, 0x44, 0x47, 0x31, 0x38, 0x11, 0x4a, 0x3d, 0x82, 0x90, 0xfe, - 0x99, 0xfe, 0xb5, 0x01, 0x06, 0x01, 0x13, 0xfb, 0xb1, 0x88, 0x01, 0x00, - 0x00, 0x02, 0x00, 0x51, 0x00, 0x00, 0x04, 0x98, 0x05, 0x81, 0x00, 0x0c, - 0x00, 0x15, 0x00, 0x3f, 0x40, 0x20, 0x06, 0x0d, 0x0d, 0x00, 0x04, 0x11, - 0x11, 0x09, 0x00, 0x09, 0x16, 0x17, 0x03, 0x13, 0x5f, 0x59, 0x03, 0x03, - 0x0a, 0x07, 0x0a, 0x10, 0x5f, 0x59, 0x0a, 0x12, 0x07, 0x06, 0x5f, 0x59, - 0x07, 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x24, 0x33, 0x21, - 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x22, 0x24, 0x37, 0x14, 0x16, 0x33, - 0x21, 0x11, 0x21, 0x22, 0x06, 0x51, 0x01, 0x05, 0xec, 0x01, 0x97, 0xfd, - 0x08, 0x03, 0xb7, 0xfd, 0x9e, 0xe2, 0xfe, 0xfd, 0xc0, 0x9c, 0xa4, 0x01, - 0x88, 0xfe, 0x80, 0xa4, 0xa4, 0x01, 0x9d, 0xbe, 0xd2, 0x01, 0xb8, 0x9c, - 0xfa, 0x7f, 0xe2, 0xb9, 0x7c, 0x88, 0x01, 0xfe, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x52, 0xff, 0xec, 0x03, 0xeb, 0x05, 0xcc, 0x00, 0x19, - 0x00, 0x25, 0x00, 0x4b, 0x40, 0x27, 0x14, 0x09, 0x20, 0x20, 0x0e, 0x0b, - 0x1a, 0x1a, 0x00, 0x0e, 0x00, 0x27, 0x26, 0x18, 0x1d, 0x50, 0x59, 0x18, - 0x16, 0x14, 0x15, 0x07, 0x15, 0x07, 0x03, 0x11, 0x15, 0x0c, 0x0b, 0x53, - 0x59, 0x0c, 0x00, 0x03, 0x23, 0x50, 0x59, 0x03, 0x10, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x10, 0x12, 0x33, 0x32, - 0x16, 0x17, 0x33, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x11, 0x14, 0x17, - 0x23, 0x2e, 0x01, 0x35, 0x23, 0x0e, 0x01, 0x23, 0x20, 0x13, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x52, 0xc1, 0xcd, - 0x7a, 0xa5, 0x32, 0x04, 0x04, 0xfd, 0xcc, 0x02, 0xe8, 0x06, 0xae, 0x02, - 0x08, 0x02, 0x33, 0xa3, 0x7b, 0xfe, 0x72, 0xbd, 0x79, 0x88, 0x97, 0x8a, - 0x8a, 0x99, 0x87, 0x78, 0x02, 0x22, 0x01, 0x18, 0x01, 0x14, 0x5a, 0x68, - 0x58, 0x41, 0x01, 0x08, 0x9f, 0xfb, 0x13, 0xa9, 0x36, 0x09, 0x80, 0x1f, - 0x63, 0x59, 0x02, 0x30, 0xe1, 0xca, 0xca, 0xd6, 0xe0, 0xd2, 0xc5, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x4e, 0x00, 0x12, - 0x00, 0x1f, 0x00, 0x3e, 0x40, 0x20, 0x0f, 0x01, 0x00, 0x11, 0x00, 0x19, - 0x07, 0x11, 0x13, 0x0d, 0x07, 0x0d, 0x20, 0x21, 0x12, 0x00, 0x50, 0x59, - 0x12, 0x1b, 0x0f, 0x1c, 0x50, 0x59, 0x0f, 0x15, 0x0a, 0x16, 0x50, 0x59, - 0x0a, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x21, 0x26, 0x2f, 0x01, 0x2e, - 0x01, 0x35, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x05, 0x01, 0x15, - 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x3e, 0x01, 0xbd, 0x02, 0x07, 0x64, 0x6e, 0xd9, 0x69, 0x5a, 0xf3, 0xf2, - 0xfb, 0xe7, 0xfe, 0x44, 0x01, 0x64, 0xfc, 0xf8, 0x02, 0xa3, 0x82, 0xa0, - 0xa1, 0x8a, 0x89, 0x97, 0x71, 0x7d, 0x3f, 0xfe, 0xe8, 0x59, 0x57, 0xaf, - 0x58, 0xe6, 0xa8, 0x01, 0x17, 0x01, 0x0a, 0xfe, 0xfa, 0xfe, 0xe5, 0xfd, - 0xf1, 0x19, 0xfe, 0xd6, 0x84, 0x03, 0xd6, 0xdc, 0xc0, 0xc4, 0xd8, 0xd4, - 0xd0, 0x55, 0xb9, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x04, 0xaf, - 0x05, 0x81, 0x00, 0x0b, 0x00, 0x3a, 0x40, 0x1f, 0x06, 0x02, 0x02, 0x0b, - 0x00, 0x09, 0x05, 0x0b, 0x04, 0x0d, 0x0c, 0x05, 0x04, 0x5f, 0x59, 0x05, - 0x05, 0x00, 0x09, 0x09, 0x08, 0x5f, 0x59, 0x09, 0x03, 0x00, 0x01, 0x5f, - 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x33, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, - 0x21, 0x35, 0x21, 0x11, 0x59, 0x03, 0x97, 0xfc, 0xce, 0x03, 0x32, 0xfc, - 0x92, 0x04, 0x2d, 0x9c, 0x01, 0xeb, 0x9a, 0x01, 0xc4, 0x9c, 0xfa, 0x7f, - 0x00, 0x02, 0x00, 0x5e, 0xff, 0xec, 0x05, 0xa7, 0x05, 0x96, 0x00, 0x06, - 0x00, 0x1f, 0x00, 0x45, 0x40, 0x23, 0x07, 0x03, 0x03, 0x15, 0x0d, 0x0e, - 0x0e, 0x04, 0x1d, 0x15, 0x1d, 0x21, 0x20, 0x1f, 0x04, 0x5f, 0x59, 0x1f, - 0x0d, 0x1f, 0x0d, 0x19, 0x11, 0x19, 0x00, 0x60, 0x59, 0x19, 0x13, 0x11, - 0x0a, 0x5f, 0x59, 0x11, 0x04, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x25, 0x32, 0x12, 0x37, 0x21, 0x16, 0x00, 0x01, 0x26, 0x24, 0x23, - 0x22, 0x06, 0x07, 0x27, 0x36, 0x24, 0x33, 0x32, 0x04, 0x12, 0x15, 0x14, - 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x37, 0x03, 0x04, 0xe3, - 0xfb, 0x0b, 0xfc, 0x27, 0x11, 0x01, 0x04, 0x02, 0xbd, 0x19, 0xff, 0x00, - 0xc7, 0x9b, 0xd5, 0x39, 0xb6, 0x4e, 0x01, 0x33, 0xde, 0xd0, 0x01, 0x30, - 0xa1, 0xa4, 0xfe, 0xce, 0xcd, 0xd1, 0xfe, 0xcd, 0xa2, 0x05, 0x7e, 0x01, - 0x13, 0xfb, 0xf7, 0xfe, 0xe9, 0x02, 0xac, 0xda, 0xf6, 0x85, 0x79, 0x39, - 0xa8, 0xb9, 0xae, 0xfe, 0xb9, 0xda, 0xdb, 0xfe, 0xb3, 0xb3, 0xb2, 0x01, - 0x4d, 0xdc, 0x25, 0x3e, 0x00, 0x01, 0x00, 0x58, 0xff, 0xec, 0x04, 0x8a, - 0x05, 0x95, 0x00, 0x26, 0x00, 0x58, 0x40, 0x2d, 0x07, 0x19, 0x0f, 0x16, - 0x09, 0x09, 0x1e, 0x04, 0x10, 0x0f, 0x0f, 0x23, 0x24, 0x04, 0x24, 0x27, - 0x28, 0x07, 0x18, 0x1b, 0x18, 0x1b, 0x60, 0x59, 0x23, 0x18, 0x10, 0x10, - 0x18, 0x23, 0x03, 0x00, 0x0c, 0x0c, 0x13, 0x5f, 0x59, 0x0c, 0x04, 0x00, - 0x21, 0x5f, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x05, 0x22, - 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x24, 0x11, 0x34, 0x24, 0x33, 0x32, - 0x04, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x21, 0x33, - 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x20, 0x13, 0x17, 0x06, - 0x04, 0x02, 0x60, 0x99, 0xed, 0x82, 0xa4, 0x9e, 0xfe, 0xe8, 0x01, 0x03, - 0xd2, 0xc7, 0x01, 0x09, 0x46, 0xb2, 0x32, 0xad, 0x7e, 0x82, 0x9b, 0x01, - 0x62, 0x47, 0x47, 0xca, 0xc0, 0xb3, 0x9b, 0x01, 0x07, 0x77, 0xa5, 0x55, - 0xfe, 0xf6, 0x14, 0x67, 0xbd, 0x77, 0x8e, 0xb3, 0x18, 0x37, 0x01, 0x04, - 0xaa, 0xd0, 0xa8, 0xad, 0x3d, 0x81, 0x76, 0x74, 0x65, 0xff, 0x94, 0x76, - 0x85, 0x80, 0x8e, 0x01, 0x10, 0x4d, 0xba, 0xa2, 0x00, 0x01, 0xff, 0xc6, - 0xfe, 0x57, 0x04, 0x91, 0x05, 0x81, 0x00, 0x12, 0x00, 0x3a, 0x40, 0x1e, - 0x01, 0x05, 0x05, 0x0a, 0x0f, 0x0f, 0x03, 0x11, 0x03, 0x14, 0x13, 0x01, - 0x04, 0x5f, 0x59, 0x01, 0x01, 0x08, 0x10, 0x10, 0x00, 0x5f, 0x59, 0x10, - 0x03, 0x08, 0x0d, 0x5f, 0x59, 0x08, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, - 0x11, 0x21, 0x15, 0x01, 0x67, 0x03, 0x12, 0xfc, 0xee, 0x8f, 0x83, 0x3d, - 0x52, 0x23, 0x33, 0x24, 0x68, 0x03, 0xe9, 0x04, 0xe5, 0xfd, 0xf4, 0x9e, - 0xfd, 0x43, 0x8f, 0x98, 0x14, 0x9c, 0x11, 0x9d, 0x05, 0xee, 0x9c, 0x00, - 0x00, 0x01, 0x00, 0xc0, 0xfe, 0x4e, 0x03, 0xc3, 0x05, 0xae, 0x00, 0x15, - 0x00, 0x43, 0x40, 0x23, 0x07, 0x05, 0x0a, 0x0a, 0x10, 0x0e, 0x0b, 0x0b, - 0x15, 0x16, 0x17, 0x09, 0x0d, 0x0e, 0x0d, 0x50, 0x59, 0x06, 0x0e, 0x0e, - 0x0a, 0x13, 0x13, 0x02, 0x51, 0x59, 0x0f, 0x13, 0x7f, 0x13, 0xaf, 0x13, - 0x03, 0x13, 0x0a, 0x00, 0x2f, 0x2f, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x26, 0x23, - 0x22, 0x06, 0x0f, 0x01, 0x33, 0x07, 0x23, 0x03, 0x23, 0x13, 0x23, 0x37, - 0x33, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x03, 0xa4, 0x33, 0x3b, 0x3c, - 0x40, 0x13, 0x1a, 0xd3, 0x19, 0xd5, 0xfe, 0xb4, 0xfe, 0x98, 0x1b, 0x97, - 0x1d, 0x1f, 0x95, 0x85, 0x4f, 0x46, 0x05, 0x20, 0x0f, 0x4a, 0x5e, 0x89, - 0x83, 0xfa, 0xd3, 0x05, 0x2d, 0x83, 0x98, 0x99, 0x7f, 0x14, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x67, 0xff, 0xec, 0x06, 0x5e, 0x06, 0x61, 0x00, 0x2a, - 0x00, 0x58, 0x40, 0x2e, 0x23, 0x1e, 0x00, 0x2a, 0x2a, 0x0c, 0x11, 0x06, - 0x18, 0x18, 0x0f, 0x11, 0x03, 0x2c, 0x2b, 0x21, 0x26, 0x5f, 0x59, 0x21, - 0x1b, 0x0f, 0x0e, 0x5f, 0x59, 0x1d, 0x00, 0x1b, 0x0f, 0x00, 0x0f, 0x00, - 0x14, 0x1b, 0x1b, 0x03, 0x5f, 0x59, 0x1b, 0x04, 0x14, 0x09, 0x5f, 0x59, - 0x14, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x2b, 0x00, 0x18, 0x10, - 0xc4, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x00, - 0x11, 0x10, 0x00, 0x33, 0x32, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, - 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x20, 0x17, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, - 0x01, 0x04, 0xcb, 0x3c, 0xd3, 0x9d, 0xf4, 0xfe, 0xfe, 0x01, 0x12, 0xf2, - 0x8a, 0xef, 0x4a, 0xfe, 0x5b, 0x02, 0x55, 0x70, 0xfe, 0xbb, 0xbe, 0xdd, - 0xfe, 0xc0, 0xa9, 0x01, 0x70, 0x01, 0x4d, 0x01, 0x21, 0x9e, 0x89, 0x7a, - 0x36, 0x42, 0x38, 0x20, 0x47, 0x3e, 0x04, 0x14, 0x78, 0x6e, 0xfe, 0xd9, - 0xfe, 0xf4, 0xfe, 0xf5, 0xfe, 0xcb, 0x54, 0x48, 0xfe, 0xa0, 0xfe, 0x1a, - 0x72, 0x7d, 0xb0, 0x01, 0x4b, 0xe0, 0x01, 0x57, 0x01, 0x78, 0x7b, 0x1e, - 0x8a, 0x9e, 0x0f, 0x9d, 0x12, 0x47, 0x4d, 0xe9, 0x00, 0x02, 0x00, 0x0a, - 0xfe, 0x57, 0x04, 0xf4, 0x05, 0x81, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x3f, - 0x40, 0x22, 0x09, 0x08, 0x19, 0x0d, 0x16, 0x0a, 0x07, 0x04, 0x03, 0x13, - 0x10, 0x0b, 0x0c, 0x0c, 0x10, 0x03, 0x08, 0x04, 0x1f, 0x20, 0x0a, 0x07, - 0x0d, 0x16, 0x04, 0x00, 0x0b, 0x08, 0x03, 0x00, 0x1c, 0x5f, 0x59, 0x00, - 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x32, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x01, - 0x33, 0x09, 0x01, 0x33, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x03, 0x34, - 0x26, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0x81, - 0x73, 0x86, 0x1b, 0x2a, 0x4f, 0xfd, 0xee, 0xc9, 0x01, 0xad, 0x01, 0xab, - 0xc9, 0xfd, 0xee, 0x59, 0x3f, 0x85, 0x1e, 0x34, 0x22, 0x22, 0x34, 0x2e, - 0x28, 0x28, 0x2e, 0xfe, 0x57, 0x8f, 0x7a, 0x2d, 0x69, 0x69, 0x98, 0x04, - 0x8a, 0xfc, 0x17, 0x03, 0xe9, 0xfb, 0x76, 0xa2, 0xb4, 0x41, 0x79, 0x90, - 0x01, 0x06, 0x39, 0xa5, 0x47, 0x47, 0xa4, 0x3a, 0x35, 0x3b, 0x3a, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0xff, 0xec, 0x06, 0x84, 0x05, 0xcc, 0x00, 0x24, - 0x00, 0x45, 0x40, 0x24, 0x12, 0x0f, 0x0b, 0x0b, 0x0c, 0x19, 0x03, 0x1f, - 0x22, 0x22, 0x03, 0x0c, 0x03, 0x25, 0x26, 0x20, 0x0f, 0x12, 0x15, 0x00, - 0x15, 0x07, 0x50, 0x59, 0x15, 0x10, 0x0d, 0x00, 0x0c, 0x15, 0x00, 0x1c, - 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x05, - 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, - 0x11, 0x33, 0x11, 0x14, 0x06, 0x07, 0x33, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, - 0x04, 0xe8, 0xc7, 0xd4, 0x73, 0x80, 0x7f, 0x99, 0xb4, 0xb4, 0x07, 0x01, - 0x03, 0x63, 0xf7, 0xb7, 0xb4, 0x6e, 0x79, 0x7a, 0x6c, 0xb5, 0xd5, 0x14, - 0xc9, 0xb4, 0x01, 0x45, 0x99, 0x7c, 0xb0, 0x95, 0xfd, 0x82, 0x05, 0xcc, - 0xfe, 0x7e, 0x3d, 0x82, 0x0a, 0xcd, 0xba, 0xc3, 0xfe, 0xb9, 0x9c, 0x79, - 0x79, 0x9c, 0x02, 0xb0, 0xfd, 0x33, 0xb4, 0xcd, 0x00, 0x01, 0x00, 0x8a, - 0x00, 0x00, 0x01, 0x3e, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, - 0x03, 0x00, 0x00, 0x04, 0x05, 0x01, 0x00, 0x00, 0x12, 0x00, 0x3f, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, - 0x8a, 0xb4, 0x05, 0xcc, 0xfa, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, - 0x00, 0x00, 0x02, 0x21, 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x2c, 0x40, 0x15, - 0x07, 0x0b, 0x0b, 0x04, 0x00, 0x00, 0x0d, 0x0c, 0x0a, 0x02, 0x03, 0x02, - 0x60, 0x59, 0x07, 0x03, 0x03, 0x05, 0x00, 0x00, 0x12, 0x00, 0x3f, 0x3f, - 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0xc4, 0xa6, 0xa6, 0xb4, 0xa9, 0xa9, - 0x02, 0xa0, 0x8d, 0x02, 0x9f, 0xfd, 0x61, 0x8d, 0xfd, 0x60, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x3f, 0x05, 0x91, 0x00, 0x14, - 0x00, 0x48, 0x40, 0x24, 0x01, 0x0a, 0x13, 0x03, 0x12, 0x0f, 0x0f, 0x03, - 0x03, 0x04, 0x11, 0x12, 0x12, 0x00, 0x14, 0x04, 0x14, 0x15, 0x16, 0x02, - 0x01, 0x10, 0x10, 0x13, 0x04, 0x11, 0x03, 0x08, 0x0d, 0x5f, 0x59, 0x08, - 0x04, 0x00, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, - 0x31, 0x30, 0x21, 0x01, 0x07, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, 0x11, 0x01, 0x33, 0x09, 0x01, 0x04, - 0x52, 0xfd, 0xcd, 0xb8, 0xbf, 0x98, 0x8c, 0x42, 0x42, 0x32, 0x39, 0x7e, - 0x02, 0xa7, 0xe1, 0xfd, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x8c, 0xfd, 0xe4, - 0x04, 0x69, 0x8f, 0x99, 0x0f, 0xa5, 0x12, 0x94, 0xfe, 0x64, 0x02, 0xc2, - 0xfd, 0x9c, 0xfc, 0xe3, 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, - 0x05, 0xda, 0x00, 0x14, 0x00, 0x55, 0x40, 0x2b, 0x02, 0x0e, 0x05, 0x03, - 0x14, 0x01, 0x14, 0x07, 0x07, 0x08, 0x08, 0x16, 0x15, 0x00, 0x01, 0x01, - 0x04, 0x03, 0x03, 0x16, 0x0f, 0x0f, 0x00, 0x0c, 0x0c, 0x11, 0x53, 0x59, - 0x0c, 0x01, 0x02, 0x05, 0x51, 0x59, 0x14, 0x02, 0x14, 0x02, 0x04, 0x08, - 0x15, 0x00, 0x0f, 0x00, 0x3f, 0x3f, 0x33, 0x39, 0x39, 0x2f, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x33, 0x09, 0x01, 0x23, - 0x01, 0x07, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, - 0x23, 0x22, 0x15, 0x11, 0x03, 0x19, 0xd3, 0xfe, 0x49, 0x01, 0xce, 0xd3, - 0xfe, 0x92, 0x84, 0xb4, 0x98, 0x8c, 0x42, 0x42, 0x32, 0x42, 0x80, 0x04, - 0x3a, 0xfe, 0x2f, 0xfd, 0x97, 0x01, 0xee, 0x6d, 0xfe, 0x7f, 0x04, 0xb2, - 0x8f, 0x99, 0x0f, 0xa5, 0x12, 0x94, 0xfd, 0x89, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x01, 0xa5, 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x2c, 0x40, 0x15, - 0x07, 0x0b, 0x0b, 0x04, 0x00, 0x00, 0x0c, 0x0d, 0x0a, 0x02, 0x03, 0x02, - 0x50, 0x59, 0x07, 0x03, 0x03, 0x05, 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, - 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x84, 0x70, 0x70, 0xb4, 0x6d, 0x6d, - 0x02, 0xa0, 0x8d, 0x02, 0x9f, 0xfd, 0x61, 0x8d, 0xfd, 0x60, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x03, 0xee, 0x05, 0xcc, 0x00, 0x13, - 0x00, 0x41, 0x40, 0x21, 0x09, 0x0a, 0x11, 0x10, 0x10, 0x06, 0x0b, 0x03, - 0x02, 0x02, 0x0b, 0x0a, 0x03, 0x14, 0x15, 0x06, 0x0a, 0x12, 0x0f, 0x01, - 0x0c, 0x04, 0x13, 0x0d, 0x13, 0x0d, 0x13, 0x0a, 0x10, 0x00, 0x03, 0x0a, - 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x17, - 0x39, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x07, 0x01, 0x23, 0x03, - 0x26, 0x27, 0x0e, 0x01, 0x01, 0x23, 0x01, 0x27, 0x07, 0x27, 0x37, 0x27, - 0x33, 0x17, 0x37, 0x02, 0xca, 0x9f, 0x01, 0xc3, 0xbe, 0xcf, 0x29, 0x18, - 0x0f, 0x2b, 0xfe, 0xe3, 0xbb, 0x01, 0xc1, 0x44, 0xb8, 0x2e, 0xbc, 0x49, - 0xb1, 0x36, 0x9d, 0x04, 0xfb, 0x3a, 0xfb, 0x3f, 0x02, 0x41, 0x70, 0x66, - 0x2e, 0x6b, 0xfd, 0x82, 0x03, 0xca, 0xbd, 0x43, 0x76, 0x45, 0xcd, 0x93, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xff, 0xec, 0x06, 0x81, - 0x05, 0x81, 0x00, 0x21, 0x00, 0x46, 0x40, 0x24, 0x1f, 0x18, 0x18, 0x1b, - 0x13, 0x02, 0x10, 0x09, 0x06, 0x06, 0x10, 0x1b, 0x03, 0x23, 0x22, 0x1e, - 0x12, 0x02, 0x1f, 0x04, 0x19, 0x11, 0x07, 0x03, 0x04, 0x0d, 0x5f, 0x59, - 0x04, 0x13, 0x00, 0x16, 0x5f, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x3f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x27, 0x06, 0x23, 0x20, 0x19, 0x01, - 0x33, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x23, 0x27, - 0x0e, 0x01, 0x04, 0xab, 0xd0, 0x5c, 0x78, 0xcc, 0xfe, 0x63, 0xbc, 0x30, - 0x63, 0x58, 0x77, 0x6f, 0xbd, 0x64, 0x77, 0xf7, 0xbd, 0x0a, 0xaa, 0x07, - 0x32, 0x96, 0x14, 0xa7, 0xa7, 0x01, 0xec, 0x03, 0xa9, 0xfc, 0x67, 0x80, - 0x9a, 0x47, 0x9a, 0x97, 0x03, 0xc9, 0xfc, 0x47, 0xa3, 0x9e, 0x01, 0x43, - 0x03, 0xb7, 0xfb, 0x66, 0x92, 0x55, 0x92, 0x51, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xd0, 0xfe, 0x57, 0x05, 0x20, 0x05, 0x81, 0x00, 0x16, - 0x00, 0x31, 0x40, 0x18, 0x08, 0x04, 0x04, 0x07, 0x01, 0x0c, 0x0c, 0x16, - 0x07, 0x16, 0x18, 0x17, 0x0f, 0x14, 0x5f, 0x59, 0x0f, 0x02, 0x09, 0x08, - 0x12, 0x05, 0x00, 0x03, 0x00, 0x3f, 0x32, 0x3f, 0x39, 0x39, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x33, 0x01, 0x26, 0x35, 0x11, 0x33, 0x11, 0x23, - 0x01, 0x1f, 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x35, 0xa8, 0xde, 0x02, 0xfa, 0x0c, 0xac, 0xe6, 0xfd, 0x0e, 0x05, - 0x05, 0x87, 0x82, 0x48, 0x31, 0x2c, 0x38, 0x73, 0x05, 0x81, 0xfb, 0x48, - 0xc4, 0x58, 0x03, 0x9c, 0xfa, 0x7f, 0x04, 0xb0, 0x61, 0xa7, 0xfb, 0xd6, - 0x90, 0x97, 0x0b, 0xa2, 0x0e, 0x9d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, - 0xfe, 0x56, 0x03, 0xee, 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x33, 0x40, 0x19, - 0x00, 0x1a, 0x12, 0x09, 0x09, 0x0d, 0x0a, 0x1a, 0x0a, 0x1c, 0x1b, 0x12, - 0x16, 0x0a, 0x16, 0x05, 0x50, 0x59, 0x16, 0x10, 0x0d, 0x0f, 0x0a, 0x15, - 0x00, 0x00, 0x2f, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, - 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x11, 0x03, 0x39, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, - 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0xfe, - 0x56, 0x04, 0x58, 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x8d, 0x03, 0x53, - 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0xfb, 0x85, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x12, 0x06, - 0x04, 0x99, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xff, 0xec, 0x06, 0xad, - 0x05, 0x96, 0x00, 0x19, 0x00, 0x25, 0x00, 0x48, 0x40, 0x25, 0x20, 0x08, - 0x12, 0x11, 0x15, 0x15, 0x1a, 0x18, 0x0e, 0x00, 0x08, 0x00, 0x26, 0x27, - 0x0e, 0x18, 0x60, 0x59, 0x0e, 0x12, 0x0e, 0x12, 0x04, 0x13, 0x03, 0x0b, - 0x1d, 0x5f, 0x59, 0x0b, 0x04, 0x04, 0x23, 0x5f, 0x59, 0x04, 0x13, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, - 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x3e, - 0x01, 0x35, 0x23, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07, 0x16, 0x07, 0x10, - 0x00, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x05, 0xd7, - 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, 0xc5, 0xa6, 0x01, 0x72, 0x01, 0x4a, - 0xf4, 0x01, 0x4c, 0x48, 0x58, 0x45, 0x58, 0xc3, 0x73, 0x7d, 0x1a, 0xc3, - 0xfe, 0xf9, 0xf0, 0xf2, 0xfe, 0xf8, 0x01, 0x0b, 0xed, 0xf4, 0x01, 0x05, - 0x02, 0xc7, 0xdd, 0xfe, 0xb4, 0xb2, 0xb0, 0x01, 0x4d, 0xde, 0x01, 0x52, - 0x01, 0x7d, 0xd7, 0xc4, 0x2c, 0x6a, 0x49, 0xa7, 0x6a, 0x7b, 0xb7, 0x3d, - 0x6a, 0x77, 0x01, 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, 0xf5, 0xfe, 0xf7, - 0xfe, 0xc9, 0x01, 0x2d, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x05, 0x03, - 0x04, 0x4e, 0x00, 0x14, 0x00, 0x20, 0x00, 0x47, 0x40, 0x23, 0x1b, 0x06, - 0x0b, 0x15, 0x15, 0x00, 0x0e, 0x0d, 0x11, 0x11, 0x14, 0x00, 0x06, 0x00, - 0x21, 0x22, 0x0b, 0x0e, 0x0b, 0x0e, 0x03, 0x0f, 0x0f, 0x08, 0x18, 0x50, - 0x59, 0x08, 0x10, 0x03, 0x1e, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x36, 0x35, 0x23, 0x35, 0x33, - 0x15, 0x14, 0x06, 0x0f, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfa, 0xee, 0xed, 0xf2, 0x01, 0xe5, - 0xd5, 0xe5, 0x1d, 0x86, 0x58, 0xc3, 0x78, 0x70, 0xbb, 0x85, 0x9d, 0x9e, - 0x8d, 0x8b, 0x95, 0xa2, 0x8b, 0x02, 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x01, - 0x21, 0x01, 0x11, 0x02, 0x30, 0xc8, 0xc8, 0x41, 0x9a, 0xa7, 0x6a, 0x81, - 0xc0, 0x30, 0x47, 0xe0, 0xcb, 0xcf, 0xdc, 0xd6, 0xd7, 0xd0, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0xfe, 0x58, 0x06, 0x4c, 0x05, 0x96, 0x00, 0x13, - 0x00, 0x1e, 0x00, 0x40, 0x40, 0x20, 0x19, 0x07, 0x00, 0x1e, 0x11, 0x10, - 0x10, 0x1e, 0x07, 0x03, 0x1f, 0x20, 0x11, 0x12, 0x0e, 0x04, 0x13, 0x0d, - 0x0d, 0x0b, 0x03, 0x0b, 0x16, 0x5f, 0x59, 0x0b, 0x04, 0x03, 0x1c, 0x5f, - 0x59, 0x03, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x33, 0x3f, 0x33, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, - 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x17, 0x25, 0x33, - 0x11, 0x23, 0x11, 0x2f, 0x01, 0x26, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, - 0x33, 0x32, 0x37, 0x04, 0xb6, 0x6d, 0xbf, 0x77, 0xd5, 0xfe, 0xc8, 0xa5, - 0xa6, 0x01, 0x3a, 0xd4, 0xa3, 0xcb, 0x01, 0x9e, 0x2b, 0xb4, 0xe2, 0xb4, - 0x64, 0x89, 0xec, 0xfe, 0xfa, 0x01, 0x09, 0xe7, 0x8a, 0x65, 0x55, 0x34, - 0x35, 0xb2, 0x01, 0x4c, 0xdd, 0xdc, 0x01, 0x47, 0xac, 0x47, 0x40, 0xf8, - 0xc9, 0x06, 0x6d, 0x02, 0x05, 0x2e, 0xfe, 0xd4, 0xfe, 0xf9, 0xfe, 0xf8, - 0xfe, 0xc8, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0xc4, - 0x04, 0x4e, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x42, 0x40, 0x22, 0x15, 0x09, - 0x03, 0x1a, 0x00, 0x11, 0x11, 0x1a, 0x09, 0x03, 0x1d, 0x1e, 0x01, 0x0f, - 0x10, 0x02, 0x0e, 0x0e, 0x06, 0x0b, 0x0b, 0x12, 0x50, 0x59, 0x0b, 0x10, - 0x06, 0x18, 0x50, 0x59, 0x06, 0x16, 0x00, 0x1b, 0x00, 0x3f, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x3f, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x16, 0x17, 0x25, 0x33, 0x11, 0x01, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x37, 0x03, 0x26, 0x04, 0x15, 0xbd, 0x39, 0x99, - 0x51, 0xed, 0xf2, 0x01, 0xe5, 0x52, 0x95, 0x33, 0x01, 0x44, 0x2b, 0xfd, - 0x7a, 0x9e, 0x8d, 0x8b, 0x95, 0x40, 0x38, 0x01, 0x34, 0xfe, 0x57, 0x05, - 0x3f, 0xfc, 0xa9, 0x27, 0x2c, 0x01, 0x21, 0x01, 0x11, 0x02, 0x30, 0x2b, - 0x1f, 0x41, 0xfa, 0x12, 0x05, 0x72, 0xcf, 0xdc, 0xd6, 0xd7, 0x16, 0x03, - 0x2e, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x05, 0x95, - 0x05, 0x81, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x42, 0x40, 0x22, 0x0e, 0x13, - 0x1b, 0x08, 0x08, 0x09, 0x17, 0x03, 0x03, 0x09, 0x13, 0x03, 0x1e, 0x1f, - 0x1b, 0x07, 0x5f, 0x59, 0x1b, 0x11, 0x1b, 0x11, 0x09, 0x16, 0x1a, 0x0b, - 0x16, 0x0b, 0x60, 0x59, 0x16, 0x03, 0x09, 0x12, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x23, - 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x01, 0x10, 0x29, 0x01, 0x11, 0x21, 0x20, 0x03, 0xa4, 0xed, 0x01, - 0x04, 0xfe, 0xfb, 0xe0, 0xfe, 0x62, 0xbf, 0x16, 0x4d, 0x42, 0x12, 0x9b, - 0x11, 0xac, 0x9a, 0x03, 0x7b, 0xfe, 0xb8, 0xfe, 0x85, 0x01, 0x83, 0x01, - 0x40, 0x05, 0x81, 0xde, 0xca, 0xc8, 0xec, 0xfd, 0xdb, 0x04, 0xed, 0x44, - 0x47, 0x31, 0x38, 0x11, 0x4a, 0x3d, 0x82, 0x90, 0xfe, 0x56, 0x01, 0x11, - 0xfd, 0xd4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8a, 0xfe, 0x57, 0x04, 0x1d, - 0x05, 0xda, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x46, 0x40, 0x25, 0x1d, 0x00, - 0x24, 0x15, 0x08, 0x08, 0x09, 0x09, 0x11, 0x00, 0x03, 0x2b, 0x2a, 0x04, - 0x16, 0x02, 0x1a, 0x1a, 0x20, 0x50, 0x59, 0x1a, 0x10, 0x0d, 0x13, 0x53, - 0x59, 0x0d, 0x01, 0x09, 0x1b, 0x02, 0x27, 0x50, 0x59, 0x02, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x27, 0x23, - 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x15, - 0x26, 0x23, 0x22, 0x15, 0x11, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, - 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x04, 0x1d, 0xfe, 0x72, 0xfa, 0x56, 0x05, 0x04, 0xb4, 0x92, 0x8f, 0x36, - 0x27, 0x25, 0x38, 0x3c, 0x7d, 0x04, 0x30, 0x9e, 0x81, 0xc8, 0xc6, 0xbd, - 0x7a, 0x85, 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x86, 0x7b, 0x02, 0x22, 0xfd, - 0xca, 0xbc, 0x08, 0xa2, 0xfe, 0x59, 0x06, 0x5b, 0x91, 0x97, 0x08, 0x08, - 0xa6, 0x14, 0x94, 0xfe, 0xe8, 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xdd, 0xe2, - 0xc2, 0x5a, 0xbf, 0x99, 0xd5, 0xca, 0xc5, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0xfe, 0xc1, 0x05, 0x43, 0x05, 0x81, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x49, - 0x40, 0x25, 0x00, 0x0f, 0x0f, 0x10, 0x0e, 0x01, 0x0b, 0x15, 0x15, 0x07, - 0x03, 0x03, 0x04, 0x0b, 0x04, 0x1a, 0x19, 0x0e, 0x02, 0x15, 0x02, 0x5f, - 0x59, 0x07, 0x14, 0x5f, 0x59, 0x15, 0x07, 0x15, 0x07, 0x04, 0x05, 0x03, - 0x04, 0x12, 0x00, 0x00, 0x2f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x39, 0x32, 0x32, 0x11, 0x33, 0x31, - 0x30, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x15, 0x21, 0x32, 0x04, - 0x15, 0x14, 0x06, 0x07, 0x09, 0x01, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, - 0x32, 0x36, 0x04, 0x67, 0xfe, 0x7d, 0xfe, 0x83, 0xbf, 0xbb, 0x01, 0xa2, - 0xee, 0x01, 0x03, 0xb7, 0xa1, 0x01, 0xa5, 0xfe, 0xf3, 0xa7, 0x9d, 0xfe, - 0x75, 0x01, 0x93, 0x97, 0xa5, 0xfe, 0xc1, 0x02, 0xee, 0xfe, 0x51, 0x05, - 0x81, 0x9a, 0xd5, 0xbe, 0x9d, 0xd6, 0x1c, 0xfc, 0xfc, 0x04, 0x91, 0x7b, - 0x81, 0xfd, 0xf8, 0x8d, 0x00, 0x01, 0x00, 0x62, 0xff, 0xec, 0x04, 0xfc, - 0x05, 0x96, 0x00, 0x2a, 0x00, 0x3b, 0x40, 0x1d, 0x25, 0x09, 0x15, 0x1e, - 0x0f, 0x00, 0x15, 0x00, 0x2c, 0x2b, 0x24, 0x09, 0x1e, 0x12, 0x28, 0x28, - 0x20, 0x5f, 0x59, 0x28, 0x13, 0x0e, 0x12, 0x12, 0x0b, 0x60, 0x59, 0x12, - 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x02, - 0x35, 0x34, 0x21, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x20, 0x04, - 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x21, 0x32, 0x3e, - 0x01, 0x37, 0x17, 0x06, 0x04, 0x21, 0x20, 0x24, 0x62, 0x3e, 0x78, 0xbe, - 0x9c, 0x9f, 0x9a, 0x50, 0xfe, 0xac, 0x9b, 0xb3, 0x1f, 0xbc, 0x33, 0xfd, - 0xf7, 0x01, 0x02, 0x01, 0x0e, 0x32, 0x5e, 0xa3, 0xba, 0xbd, 0xa1, 0x4b, - 0x01, 0x76, 0x80, 0xaa, 0x66, 0x1e, 0xb9, 0x34, 0xfe, 0xd4, 0xff, 0x00, - 0xfe, 0xeb, 0xfe, 0xdb, 0x01, 0x7e, 0x5a, 0x8b, 0x67, 0x4b, 0x1d, 0x1e, - 0x3e, 0x59, 0x40, 0xdf, 0x77, 0x81, 0x21, 0xbf, 0xa8, 0xc4, 0xb5, 0x4d, - 0x75, 0x55, 0x44, 0x28, 0x29, 0x49, 0x67, 0x4d, 0xf3, 0x42, 0x82, 0x7e, - 0x25, 0xe2, 0xd0, 0xcf, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x03, 0xc3, - 0x04, 0x4b, 0x00, 0x25, 0x00, 0x3b, 0x40, 0x1d, 0x1c, 0x0e, 0x00, 0x21, - 0x08, 0x14, 0x00, 0x14, 0x26, 0x27, 0x20, 0x08, 0x1c, 0x11, 0x23, 0x23, - 0x1e, 0x50, 0x59, 0x23, 0x16, 0x0d, 0x11, 0x11, 0x0a, 0x50, 0x59, 0x11, - 0x10, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x01, 0x37, 0x3e, 0x02, - 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x0e, 0x01, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x33, 0x32, 0x37, - 0x17, 0x02, 0x21, 0x22, 0x26, 0x4f, 0x51, 0x92, 0x99, 0x98, 0x5c, 0x31, - 0xd6, 0x6f, 0x82, 0x14, 0xa2, 0x1f, 0xd2, 0xb7, 0xb7, 0xcd, 0x4c, 0x8b, - 0x91, 0xa2, 0x64, 0x33, 0xf4, 0xf8, 0x3a, 0x9f, 0x4c, 0xfe, 0x7b, 0xc2, - 0xe1, 0x01, 0x2b, 0x5b, 0x7b, 0x51, 0x23, 0x23, 0x2b, 0x3d, 0x2e, 0x95, - 0x56, 0x60, 0x14, 0x97, 0x93, 0x9c, 0x93, 0x52, 0x71, 0x4e, 0x22, 0x27, - 0x2f, 0x43, 0x33, 0xa8, 0xd0, 0x1f, 0xfe, 0xc6, 0xa7, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6c, 0x00, 0x00, 0x04, 0xa1, 0x05, 0x81, 0x12, 0x06, - 0x03, 0x55, 0x00, 0x00, 0x00, 0x02, 0x00, 0x43, 0xfe, 0x57, 0x02, 0xf9, - 0x05, 0xd5, 0x00, 0x18, 0x00, 0x24, 0x00, 0x3b, 0x40, 0x1f, 0x1f, 0x07, - 0x12, 0x19, 0x00, 0x00, 0x12, 0x0c, 0x03, 0x26, 0x25, 0x1c, 0x16, 0x51, - 0x59, 0x1c, 0x1c, 0x0f, 0x03, 0x0f, 0x0a, 0x53, 0x59, 0x0f, 0x1b, 0x03, - 0x22, 0x51, 0x59, 0x03, 0x01, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, - 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x43, 0x6f, 0x5e, 0x86, - 0x84, 0x3b, 0x3a, 0x36, 0x34, 0x45, 0x41, 0x80, 0x8d, 0x0f, 0x3d, 0x1b, - 0x54, 0x68, 0x4d, 0x3c, 0x30, 0x31, 0x3c, 0x3b, 0x32, 0x30, 0x3c, 0x05, - 0x16, 0x5a, 0x65, 0x98, 0x89, 0xfa, 0xd0, 0x44, 0x4b, 0x0d, 0x9e, 0x0d, - 0x99, 0x8f, 0x04, 0xfd, 0x0b, 0x12, 0x67, 0x55, 0x31, 0x3c, 0x3c, 0x31, - 0x30, 0x3c, 0x3c, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xfe, 0x57, 0x02, 0x2a, - 0x05, 0x2c, 0x00, 0x1e, 0x00, 0x45, 0x40, 0x24, 0x0a, 0x00, 0x15, 0x19, - 0x19, 0x12, 0x04, 0x0e, 0x0e, 0x17, 0x00, 0x03, 0x20, 0x1f, 0x18, 0x10, - 0x11, 0x10, 0x51, 0x59, 0x15, 0x13, 0x11, 0x0f, 0x0b, 0x1c, 0x50, 0x59, - 0x0b, 0x16, 0x02, 0x07, 0x53, 0x59, 0x02, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0xc6, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x05, 0x10, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, - 0x36, 0x3d, 0x01, 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, - 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x02, 0x2a, - 0xfd, 0x43, 0x44, 0x38, 0x32, 0x3c, 0x36, 0x0e, 0xd8, 0x7d, 0x84, 0x35, - 0x78, 0xc8, 0xc8, 0x33, 0x3f, 0x24, 0x44, 0x8f, 0xfe, 0xe6, 0x11, 0xa0, - 0x12, 0x42, 0x47, 0x71, 0xf5, 0x02, 0xd2, 0x83, 0xf2, 0xf2, 0x83, 0xfd, - 0x55, 0x4e, 0x3f, 0x0e, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x04, 0xb4, - 0x05, 0x81, 0x00, 0x11, 0x00, 0x33, 0x40, 0x19, 0x01, 0x02, 0x09, 0x07, - 0x0c, 0x0c, 0x02, 0x10, 0x03, 0x13, 0x12, 0x0a, 0x0a, 0x02, 0x0f, 0x00, - 0x04, 0x0f, 0x04, 0x5f, 0x59, 0x0f, 0x03, 0x02, 0x12, 0x00, 0x3f, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, - 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x21, 0x15, 0x02, 0xd0, 0xbe, 0xd5, 0x4d, 0x42, 0x12, 0x9b, 0x11, - 0x9b, 0x97, 0x03, 0x6e, 0x04, 0xe5, 0xfb, 0x1b, 0x04, 0xe5, 0x3c, 0x47, - 0x31, 0x38, 0x11, 0x4a, 0x3d, 0x86, 0x8c, 0x9c, 0x00, 0x01, 0x00, 0x1f, - 0xff, 0xf0, 0x02, 0x2d, 0x05, 0xda, 0x00, 0x1e, 0x00, 0x40, 0x40, 0x21, - 0x15, 0x19, 0x19, 0x08, 0x04, 0x1e, 0x17, 0x0e, 0x04, 0x0e, 0x1f, 0x20, - 0x0c, 0x11, 0x53, 0x59, 0x0c, 0x01, 0x18, 0x06, 0x07, 0x06, 0x51, 0x59, - 0x15, 0x07, 0x0f, 0x02, 0x1c, 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x25, 0x06, 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, - 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x02, 0x2a, 0x59, - 0x5d, 0xd8, 0x7d, 0x84, 0x8c, 0x86, 0x42, 0x36, 0x38, 0x2e, 0x3f, 0x38, - 0xc8, 0xc8, 0x33, 0x3f, 0x24, 0x44, 0x08, 0x18, 0xf5, 0x02, 0xd2, 0x83, - 0x6e, 0x98, 0x9a, 0x0e, 0xa8, 0x14, 0x49, 0x4b, 0x6a, 0x83, 0xfd, 0x55, - 0x4e, 0x3f, 0x0e, 0x00, 0x00, 0x01, 0x00, 0x2e, 0xfe, 0x57, 0x04, 0xb4, - 0x05, 0x81, 0x00, 0x11, 0x00, 0x2b, 0x40, 0x16, 0x0a, 0x05, 0x10, 0x02, - 0x10, 0x00, 0x03, 0x12, 0x13, 0x0d, 0x08, 0x5f, 0x59, 0x0d, 0x04, 0x00, - 0x01, 0x00, 0x5f, 0x59, 0x01, 0x03, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x31, - 0x30, 0x13, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x15, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x2e, 0x04, 0x86, 0xfe, 0x1c, - 0x30, 0x34, 0x3c, 0x32, 0x46, 0x3e, 0x81, 0x8b, 0x04, 0xe5, 0x9c, 0x9c, - 0xfa, 0xae, 0x51, 0x4c, 0x10, 0x9e, 0x11, 0x94, 0x88, 0x05, 0x72, 0x00, - 0x00, 0x01, 0x00, 0x9e, 0xff, 0xec, 0x06, 0x80, 0x05, 0x81, 0x00, 0x1e, - 0x00, 0x40, 0x40, 0x20, 0x07, 0x04, 0x14, 0x13, 0x17, 0x17, 0x10, 0x0d, - 0x1b, 0x04, 0x1b, 0x1f, 0x20, 0x10, 0x1a, 0x60, 0x59, 0x10, 0x14, 0x10, - 0x14, 0x00, 0x15, 0x0e, 0x05, 0x03, 0x00, 0x0a, 0x5f, 0x59, 0x00, 0x13, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x24, 0x26, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x3e, - 0x01, 0x35, 0x23, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07, 0x11, 0x14, 0x06, - 0x04, 0x02, 0xdb, 0xad, 0xfe, 0xfe, 0x8e, 0xbf, 0xc4, 0xb9, 0xbe, 0xd3, - 0xbe, 0x79, 0x73, 0x58, 0xc3, 0xa9, 0xae, 0x91, 0xfe, 0xf7, 0x14, 0x7e, - 0xf0, 0xa6, 0x03, 0x81, 0xfc, 0x8f, 0xc1, 0xc8, 0xcf, 0xc7, 0x03, 0x64, - 0xfe, 0x6d, 0x19, 0x74, 0x5f, 0xa7, 0x6a, 0xa2, 0xc8, 0x1a, 0xfe, 0x7f, - 0xab, 0xf8, 0x83, 0x00, 0x00, 0x01, 0x00, 0x85, 0xff, 0xec, 0x05, 0x1c, - 0x04, 0x3a, 0x00, 0x25, 0x00, 0x52, 0x40, 0x2a, 0x01, 0x24, 0x0f, 0x0e, - 0x12, 0x12, 0x16, 0x19, 0x08, 0x08, 0x0b, 0x16, 0x24, 0x16, 0x26, 0x27, - 0x1d, 0x1e, 0x0b, 0x15, 0x51, 0x59, 0x1e, 0x0b, 0x0f, 0x0f, 0x0b, 0x1e, - 0x03, 0x19, 0x10, 0x09, 0x25, 0x0f, 0x21, 0x05, 0x50, 0x59, 0x21, 0x16, - 0x19, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, - 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, - 0x35, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x35, 0x23, 0x35, 0x33, 0x15, 0x14, - 0x06, 0x07, 0x11, 0x14, 0x17, 0x23, 0x2e, 0x02, 0x27, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x3a, 0x2a, 0x5c, 0x59, 0x82, 0x96, - 0xb4, 0x73, 0x59, 0x58, 0xc3, 0x90, 0xa7, 0x06, 0xaa, 0x01, 0x02, 0x03, - 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x04, 0x3a, 0xfd, 0x52, 0x6b, - 0x76, 0x34, 0xb2, 0x9e, 0x02, 0x73, 0xfe, 0x62, 0x23, 0x6f, 0x65, 0xa7, - 0x6a, 0x9f, 0xc1, 0x2f, 0xfe, 0xa6, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, - 0x70, 0x5d, 0xb1, 0xcc, 0x02, 0xd1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0xff, 0xeb, 0x05, 0xa3, 0x05, 0x81, 0x00, 0x23, 0x00, 0x4b, 0x40, 0x26, - 0x1b, 0x15, 0x0c, 0x06, 0x1e, 0x18, 0x06, 0x18, 0x21, 0x0f, 0x09, 0x03, - 0x21, 0x03, 0x25, 0x24, 0x18, 0x0c, 0x1a, 0x00, 0x1a, 0x1c, 0x5f, 0x59, - 0x1a, 0x03, 0x0a, 0x09, 0x5f, 0x59, 0x0a, 0x03, 0x00, 0x12, 0x5f, 0x59, - 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, 0x32, 0x31, - 0x30, 0x05, 0x20, 0x00, 0x11, 0x34, 0x12, 0x37, 0x06, 0x2b, 0x01, 0x35, - 0x21, 0x15, 0x06, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x02, 0x27, 0x35, 0x21, 0x15, 0x23, 0x22, 0x27, 0x16, 0x12, 0x15, 0x10, - 0x00, 0x02, 0xfd, 0xfe, 0xd1, 0xfe, 0xa5, 0xd7, 0xd1, 0x9a, 0x36, 0xf4, - 0x02, 0x4d, 0xb3, 0xbb, 0xee, 0xd8, 0xda, 0xee, 0xba, 0xb4, 0x02, 0x4d, - 0xf4, 0x36, 0x9a, 0xd0, 0xd8, 0xfe, 0xa5, 0x15, 0x01, 0x4f, 0x01, 0x26, - 0xc9, 0x01, 0x54, 0x73, 0x0b, 0x9c, 0xe0, 0x5f, 0xfe, 0xe3, 0xb8, 0xe8, - 0xfe, 0xfe, 0xe8, 0xb7, 0x01, 0x1d, 0x60, 0xe0, 0x9c, 0x0b, 0x71, 0xfe, - 0xab, 0xca, 0xfe, 0xda, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, - 0xff, 0xec, 0x05, 0x26, 0x05, 0x8d, 0x00, 0x1b, 0x00, 0x2d, 0x40, 0x17, - 0x07, 0x04, 0x13, 0x0d, 0x18, 0x04, 0x18, 0x1c, 0x1d, 0x15, 0x10, 0x5f, - 0x59, 0x15, 0x04, 0x05, 0x03, 0x00, 0x0a, 0x5f, 0x59, 0x00, 0x13, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x2e, 0x01, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x12, 0x11, 0x34, 0x26, 0x23, - 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x10, 0x02, 0x04, 0x02, - 0xbf, 0xa5, 0xf5, 0x87, 0xbf, 0xc1, 0xb1, 0xc8, 0xd1, 0x4e, 0x5b, 0x3a, - 0x32, 0x07, 0x43, 0x4e, 0xa1, 0xa8, 0x87, 0xfe, 0xee, 0x14, 0x83, 0xfb, - 0xb4, 0x03, 0x63, 0xfc, 0xad, 0xc8, 0xdf, 0x01, 0x94, 0x01, 0x9a, 0xa9, - 0x90, 0x0a, 0x9d, 0x0c, 0xe0, 0xd9, 0xfe, 0x89, 0xfe, 0x5d, 0xce, 0x00, - 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x05, 0xfd, 0x05, 0x8d, 0x00, 0x14, - 0x00, 0x2c, 0x40, 0x16, 0x10, 0x0f, 0x0c, 0x0d, 0x03, 0x0d, 0x0f, 0x03, - 0x15, 0x16, 0x11, 0x0d, 0x0f, 0x03, 0x0d, 0x12, 0x00, 0x07, 0x5f, 0x59, - 0x00, 0x04, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x12, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, - 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x01, 0x11, 0x23, - 0x11, 0x01, 0x33, 0x09, 0x01, 0x3e, 0x01, 0x05, 0x01, 0x3c, 0x85, 0x3b, - 0x54, 0x1a, 0x5e, 0x25, 0x24, 0x31, 0x20, 0xfe, 0x72, 0xbe, 0xfd, 0xe2, - 0xd6, 0x01, 0xac, 0x01, 0x54, 0x37, 0x78, 0x05, 0x8d, 0x2d, 0x33, 0x88, - 0x18, 0x2d, 0x1d, 0x30, 0xfd, 0xab, 0xfd, 0xb8, 0x02, 0x48, 0x03, 0x39, - 0xfd, 0x61, 0x02, 0x0e, 0x56, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, - 0xfe, 0x57, 0x05, 0x8a, 0x05, 0xd4, 0x00, 0x1f, 0x00, 0x3c, 0x40, 0x20, - 0x0f, 0x08, 0x17, 0x09, 0x17, 0x21, 0x0a, 0x09, 0x09, 0x02, 0x20, 0x21, - 0x15, 0x1a, 0x53, 0x59, 0x15, 0x01, 0x0f, 0x00, 0x09, 0x0f, 0x00, 0x05, - 0x50, 0x59, 0x00, 0x03, 0x50, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x2b, - 0x00, 0x18, 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x01, 0x33, 0x13, 0x1e, 0x02, - 0x17, 0x37, 0x01, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, - 0x07, 0x01, 0x0e, 0x01, 0xbf, 0x4a, 0x32, 0x26, 0x2e, 0xa8, 0x62, 0x11, - 0xfe, 0x53, 0xc0, 0xe4, 0x05, 0x0e, 0x4c, 0x03, 0x46, 0x01, 0x2a, 0x20, - 0x4d, 0x63, 0x51, 0x82, 0x6c, 0x52, 0x44, 0x48, 0x61, 0x33, 0xfe, 0x44, - 0x5d, 0xbb, 0xfe, 0x57, 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0x04, 0x35, 0xfd, - 0xaa, 0x0e, 0x27, 0xde, 0x0d, 0xc5, 0x03, 0x58, 0x59, 0x6a, 0x30, 0x5d, - 0x80, 0x3e, 0x89, 0xfb, 0x54, 0xef, 0xba, 0x00, 0x00, 0x01, 0x00, 0x3e, - 0x00, 0x00, 0x04, 0xa4, 0x05, 0x81, 0x00, 0x11, 0x00, 0x47, 0x40, 0x25, - 0x11, 0x0b, 0x0f, 0x02, 0x06, 0x09, 0x0c, 0x0c, 0x06, 0x03, 0x0f, 0x04, - 0x12, 0x13, 0x0a, 0x11, 0x00, 0x11, 0x60, 0x59, 0x07, 0x00, 0x00, 0x0e, - 0x04, 0x0e, 0x0b, 0x5f, 0x59, 0x0e, 0x12, 0x04, 0x03, 0x5f, 0x59, 0x04, - 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x21, 0x01, - 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, - 0x35, 0x01, 0x21, 0x3e, 0x02, 0x0a, 0x01, 0x53, 0xfc, 0xef, 0x03, 0xea, - 0xfe, 0xa1, 0x01, 0x8f, 0xfe, 0x0a, 0xfe, 0x6c, 0x03, 0x89, 0xfb, 0x9e, - 0x01, 0xa0, 0xfe, 0x5d, 0x03, 0x2e, 0x01, 0xb7, 0x9c, 0x8b, 0xfe, 0x38, - 0x85, 0xfd, 0xf3, 0x9c, 0x8f, 0x02, 0x1a, 0x00, 0x00, 0x01, 0x00, 0x2f, - 0x00, 0x00, 0x03, 0xb7, 0x04, 0x3a, 0x00, 0x11, 0x00, 0x45, 0x40, 0x24, - 0x08, 0x02, 0x06, 0x11, 0x0b, 0x0f, 0x0f, 0x03, 0x06, 0x0c, 0x04, 0x13, - 0x12, 0x0a, 0x11, 0x00, 0x11, 0x50, 0x59, 0x07, 0x00, 0x00, 0x0e, 0x04, - 0x0e, 0x0b, 0x50, 0x59, 0x0e, 0x15, 0x04, 0x03, 0x50, 0x59, 0x04, 0x0f, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x21, 0x01, 0x21, 0x35, - 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, - 0x21, 0x2f, 0x01, 0x8b, 0x01, 0x0c, 0xfd, 0x93, 0x03, 0x38, 0xfe, 0xf2, - 0x01, 0x34, 0xfe, 0x5f, 0xfe, 0xe5, 0x02, 0xbb, 0xfc, 0x7b, 0x01, 0x1c, - 0xfe, 0xe2, 0x02, 0x69, 0x01, 0x46, 0x8b, 0x89, 0xfe, 0xb8, 0x85, 0xfe, - 0xa7, 0x8b, 0x89, 0x01, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, - 0xfe, 0x56, 0x04, 0x9d, 0x05, 0x81, 0x00, 0x1a, 0x00, 0x4a, 0x40, 0x26, - 0x01, 0x05, 0x05, 0x16, 0x09, 0x06, 0x00, 0x11, 0x02, 0x10, 0x10, 0x00, - 0x09, 0x03, 0x1c, 0x1b, 0x06, 0x1a, 0x60, 0x59, 0x11, 0x06, 0x06, 0x0d, - 0x03, 0x0d, 0x13, 0x5f, 0x59, 0x0d, 0x05, 0x02, 0x03, 0x02, 0x5f, 0x59, - 0x03, 0x03, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x09, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x04, 0x00, 0x11, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x27, 0x37, 0x12, 0x21, 0x32, 0x36, 0x35, 0x34, - 0x24, 0x2b, 0x01, 0x01, 0xa2, 0x01, 0xf4, 0xfc, 0xdb, 0x03, 0xfa, 0xfe, - 0x07, 0x01, 0x0e, 0x01, 0x1d, 0x8f, 0xfe, 0xfa, 0xa3, 0xd0, 0xfe, 0xeb, - 0x53, 0xa2, 0x76, 0x01, 0x19, 0xb5, 0xce, 0xfe, 0xfd, 0xf5, 0x47, 0x02, - 0xf7, 0x01, 0xee, 0x9c, 0xa1, 0xfe, 0x16, 0x12, 0xfe, 0xd5, 0xfe, 0xf2, - 0xae, 0xfe, 0xef, 0x96, 0xa6, 0xb6, 0x48, 0xfe, 0xf1, 0xeb, 0xd5, 0xd7, - 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0xfe, 0x56, 0x04, 0xb6, - 0x05, 0x81, 0x00, 0x1a, 0x00, 0x46, 0x40, 0x25, 0x19, 0x15, 0x15, 0x04, - 0x11, 0x14, 0x00, 0x0a, 0x0b, 0x0b, 0x18, 0x00, 0x11, 0x04, 0x1b, 0x1c, - 0x15, 0x19, 0x16, 0x19, 0x5f, 0x59, 0x14, 0x01, 0x60, 0x59, 0x0a, 0x14, - 0x14, 0x0e, 0x16, 0x03, 0x0e, 0x08, 0x5f, 0x59, 0x0e, 0x00, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x2b, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x22, 0x04, 0x15, 0x14, 0x1e, 0x01, - 0x33, 0x20, 0x13, 0x17, 0x06, 0x04, 0x23, 0x20, 0x00, 0x11, 0x34, 0x00, - 0x25, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x03, 0x41, 0x47, 0xf4, 0xfe, - 0xfc, 0x63, 0xaf, 0x71, 0x01, 0x19, 0x76, 0xa2, 0x53, 0xfe, 0xea, 0xcf, - 0xfe, 0xff, 0xfe, 0xc9, 0x01, 0x25, 0x01, 0x06, 0xfe, 0x07, 0x03, 0xfa, - 0xfc, 0xdb, 0x01, 0xf4, 0x02, 0x6a, 0xe7, 0xd8, 0x8b, 0xc9, 0x6c, 0x01, - 0x0f, 0x48, 0xb6, 0xa6, 0x01, 0x41, 0x01, 0x14, 0xfb, 0x01, 0x33, 0x1d, - 0x01, 0xea, 0xa1, 0x9c, 0xfe, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5d, - 0xfe, 0x55, 0x04, 0x24, 0x04, 0x3b, 0x00, 0x1c, 0x00, 0x46, 0x40, 0x24, - 0x01, 0x1a, 0x1a, 0x07, 0x16, 0x19, 0x02, 0x0e, 0x00, 0x0f, 0x0f, 0x02, - 0x16, 0x03, 0x1d, 0x1e, 0x19, 0x04, 0x51, 0x59, 0x0e, 0x19, 0x19, 0x12, - 0x1b, 0x1b, 0x01, 0x50, 0x59, 0x1b, 0x0f, 0x12, 0x0b, 0x50, 0x59, 0x12, - 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x01, 0x15, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, - 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x01, 0x35, - 0x21, 0x03, 0xf4, 0xfd, 0x4b, 0x01, 0x7f, 0x52, 0x9c, 0xbe, 0x51, 0x89, - 0x51, 0x8b, 0x98, 0x12, 0xb2, 0x17, 0xff, 0xd7, 0x8d, 0xd8, 0x75, 0xd8, - 0xbd, 0xfe, 0x8f, 0x03, 0x73, 0x03, 0xae, 0xfe, 0x7d, 0x90, 0xb8, 0x98, - 0x5c, 0xab, 0x62, 0x78, 0x82, 0x0c, 0xbb, 0xc0, 0x81, 0xe4, 0x8b, 0xc1, - 0xfd, 0x19, 0x01, 0x6d, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, - 0xfe, 0x56, 0x04, 0x1f, 0x04, 0x3a, 0x00, 0x28, 0x00, 0x52, 0x40, 0x2b, - 0x13, 0x17, 0x17, 0x28, 0x00, 0x0e, 0x1b, 0x18, 0x12, 0x23, 0x14, 0x07, - 0x07, 0x12, 0x1b, 0x00, 0x04, 0x2a, 0x29, 0x17, 0x14, 0x15, 0x14, 0x50, - 0x59, 0x18, 0x11, 0x50, 0x59, 0x23, 0x0e, 0x18, 0x18, 0x03, 0x15, 0x0f, - 0x28, 0x03, 0x03, 0x26, 0x50, 0x59, 0x03, 0x00, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x2b, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x06, 0x04, 0x23, - 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, - 0x26, 0x23, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x1e, 0x01, 0x15, - 0x14, 0x0e, 0x01, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x20, 0x37, - 0x04, 0x1f, 0x28, 0xfe, 0xf3, 0xd2, 0x8a, 0xd7, 0x69, 0x55, 0x95, 0xa9, - 0xab, 0x72, 0xc3, 0xc1, 0x01, 0x64, 0xfd, 0x8e, 0x03, 0x64, 0xfe, 0x74, - 0xb2, 0xb6, 0x4f, 0x8a, 0xb0, 0x89, 0x61, 0x34, 0x8c, 0x88, 0x01, 0x12, - 0x42, 0x65, 0x9b, 0xaa, 0x4c, 0x89, 0x5c, 0x4f, 0x6e, 0x4e, 0x2b, 0x2a, - 0x51, 0x3a, 0x4a, 0x3d, 0x8b, 0x01, 0x2a, 0x8c, 0x77, 0xfe, 0xbe, 0x0d, - 0x8b, 0x77, 0x52, 0x6c, 0x48, 0x2b, 0x22, 0x2e, 0x41, 0x30, 0x49, 0x52, - 0xc9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x0c, - 0x05, 0x96, 0x00, 0x24, 0x00, 0x4e, 0x40, 0x28, 0x1c, 0x14, 0x04, 0x11, - 0x0a, 0x0b, 0x0b, 0x1b, 0x1f, 0x00, 0x1f, 0x11, 0x03, 0x26, 0x25, 0x16, - 0x24, 0x00, 0x24, 0x60, 0x59, 0x13, 0x00, 0x00, 0x1e, 0x0e, 0x1e, 0x1b, - 0x5f, 0x59, 0x1e, 0x12, 0x0a, 0x0e, 0x0e, 0x07, 0x60, 0x59, 0x0e, 0x04, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x21, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x21, 0x0e, - 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x02, 0x37, 0x21, 0x5a, 0x02, - 0x50, 0x4a, 0x49, 0x88, 0x79, 0x73, 0x95, 0x0d, 0xb8, 0x14, 0xf7, 0xc2, - 0xd5, 0xe5, 0x7b, 0x8d, 0xfe, 0xec, 0x41, 0x8b, 0x7d, 0x64, 0x1a, 0x02, - 0xdf, 0xfc, 0x5b, 0x25, 0x6c, 0x85, 0x8d, 0xfe, 0x50, 0x02, 0xee, 0x45, - 0x8c, 0x4f, 0x74, 0x80, 0x7d, 0x71, 0x11, 0xa9, 0xc8, 0xc9, 0xb9, 0x92, - 0x94, 0x88, 0x3a, 0x70, 0x70, 0x74, 0x3f, 0x99, 0x7f, 0x57, 0x96, 0x88, - 0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, 0xff, 0xec, 0x04, 0x26, - 0x05, 0x81, 0x00, 0x1b, 0x00, 0x44, 0x40, 0x24, 0x16, 0x0d, 0x00, 0x18, - 0x11, 0x13, 0x07, 0x06, 0x06, 0x11, 0x00, 0x03, 0x1d, 0x1c, 0x17, 0x13, - 0x14, 0x13, 0x5f, 0x59, 0x18, 0x11, 0x5f, 0x59, 0x07, 0x18, 0x18, 0x03, - 0x14, 0x03, 0x03, 0x0a, 0x60, 0x59, 0x03, 0x13, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x00, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x35, 0x21, - 0x15, 0x21, 0x11, 0x33, 0x32, 0x04, 0x04, 0x26, 0xfe, 0xf7, 0xeb, 0xbf, - 0xf8, 0x22, 0xb3, 0x23, 0x95, 0x71, 0x94, 0xa2, 0xad, 0xa3, 0xe5, 0xac, - 0x03, 0x4a, 0xfe, 0x1a, 0x4e, 0xe7, 0x01, 0x03, 0x01, 0xdf, 0xec, 0xfe, - 0xf9, 0xc2, 0xab, 0x15, 0x7e, 0x75, 0xb4, 0xac, 0xa0, 0xa0, 0x01, 0xca, - 0x9c, 0x9c, 0xfe, 0xd1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, - 0xff, 0xec, 0x03, 0x5f, 0x04, 0x3a, 0x00, 0x19, 0x00, 0x47, 0x40, 0x25, - 0x08, 0x00, 0x0e, 0x0a, 0x03, 0x15, 0x05, 0x14, 0x14, 0x03, 0x0e, 0x03, - 0x1b, 0x1a, 0x0a, 0x03, 0x50, 0x59, 0x15, 0x0a, 0x0a, 0x11, 0x06, 0x11, - 0x18, 0x50, 0x59, 0x11, 0x16, 0x09, 0x05, 0x06, 0x05, 0x50, 0x59, 0x06, - 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x34, 0x21, - 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x21, 0x15, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x02, - 0xaa, 0xfe, 0xdb, 0xa7, 0xac, 0x03, 0x0c, 0xfe, 0x42, 0x36, 0xcb, 0xde, - 0xd1, 0xbc, 0xb1, 0xd1, 0x22, 0xae, 0x0d, 0x81, 0x5c, 0xe4, 0x01, 0x55, - 0xd1, 0x01, 0x88, 0x8c, 0x8c, 0xfe, 0xb7, 0xa2, 0xad, 0xbe, 0xa1, 0xaa, - 0x0c, 0x5d, 0x75, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xec, 0x03, 0x98, - 0x05, 0xe3, 0x00, 0x29, 0x00, 0x42, 0x40, 0x22, 0x18, 0x0b, 0x27, 0x01, - 0x01, 0x24, 0x20, 0x11, 0x20, 0x29, 0x0b, 0x04, 0x2b, 0x2a, 0x26, 0x01, - 0x00, 0x22, 0x23, 0x22, 0x51, 0x59, 0x18, 0x0e, 0x27, 0x23, 0x0f, 0x0e, - 0x15, 0x50, 0x59, 0x12, 0x0e, 0x16, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x12, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, - 0x02, 0x27, 0x2e, 0x01, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x11, 0x37, 0x11, - 0x33, 0x15, 0x01, 0x5b, 0x21, 0x52, 0x4c, 0x83, 0x66, 0x48, 0x32, 0x1b, - 0xc8, 0xd1, 0xca, 0xdb, 0x21, 0x9f, 0x17, 0x90, 0x80, 0x80, 0x6a, 0x24, - 0x48, 0x6b, 0x46, 0xa5, 0x80, 0x83, 0x84, 0xb3, 0xb9, 0x03, 0xb7, 0x6b, - 0x54, 0x44, 0x2d, 0x12, 0x22, 0x2a, 0x32, 0x43, 0x52, 0x37, 0x98, 0xa7, - 0x85, 0x8d, 0x1f, 0x57, 0x51, 0x50, 0x58, 0x31, 0x3f, 0x2a, 0x1f, 0x13, - 0x2b, 0x9d, 0x89, 0x7d, 0x83, 0x01, 0x5b, 0x4e, 0xfe, 0x57, 0x83, 0x00, - 0x00, 0x02, 0x00, 0x8a, 0xfe, 0x56, 0x04, 0x1b, 0x04, 0x4d, 0x00, 0x10, - 0x00, 0x1a, 0x00, 0x38, 0x40, 0x1c, 0x17, 0x0a, 0x05, 0x05, 0x06, 0x11, - 0x00, 0x06, 0x00, 0x1b, 0x1c, 0x0b, 0x0e, 0x17, 0x17, 0x04, 0x50, 0x59, - 0x17, 0x15, 0x0e, 0x13, 0x50, 0x59, 0x0e, 0x10, 0x07, 0x0f, 0x00, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x02, 0x04, 0x05, 0x11, 0x23, 0x11, 0x33, 0x16, 0x15, 0x33, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x10, 0x21, 0x22, 0x06, 0x15, 0x11, - 0x3e, 0x02, 0x04, 0x1b, 0x95, 0xfe, 0xca, 0xfe, 0xee, 0xb4, 0xa8, 0x0a, - 0x04, 0x2c, 0xa7, 0x70, 0xc5, 0xd3, 0xbe, 0xff, 0x00, 0x8f, 0x90, 0xc8, - 0xe7, 0x70, 0x02, 0x70, 0xa4, 0xfe, 0xf0, 0xd7, 0x64, 0xfe, 0xd5, 0x05, - 0xe4, 0x69, 0x45, 0x61, 0x60, 0xf5, 0xe8, 0x01, 0x52, 0xcd, 0xd4, 0xfd, - 0xf3, 0x4b, 0xb2, 0xd9, 0x00, 0x01, 0x00, 0xb0, 0x00, 0x00, 0x01, 0x64, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, 0x03, 0x00, 0x00, 0x04, - 0x05, 0x01, 0x00, 0x00, 0x12, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0xb0, 0xb4, 0x05, 0xcc, - 0xfa, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb3, 0x00, 0x00, 0x02, 0x9b, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x20, 0x40, 0x0e, 0x03, 0x00, - 0x04, 0x07, 0x00, 0x07, 0x08, 0x09, 0x05, 0x01, 0x00, 0x04, 0x00, 0x12, - 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0xb3, 0xa5, 0x9e, 0xa5, 0x05, 0xcc, 0xfa, 0x34, 0x05, 0xcc, 0xfa, 0x34, - 0x00, 0x01, 0x00, 0x72, 0x00, 0x00, 0x04, 0x3a, 0x05, 0xcc, 0x00, 0x13, - 0x00, 0x52, 0x40, 0x2a, 0x0f, 0x00, 0x08, 0x04, 0x0c, 0x0c, 0x11, 0x01, - 0x0d, 0x0a, 0x05, 0x05, 0x0d, 0x00, 0x03, 0x14, 0x15, 0x07, 0x13, 0x00, - 0x13, 0x5f, 0x59, 0x04, 0x00, 0x0b, 0x0f, 0x10, 0x0f, 0x5f, 0x59, 0x08, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x02, 0x0d, 0x12, 0x02, 0x00, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, - 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x72, 0x01, 0x8c, 0xae, - 0x01, 0x8e, 0xfe, 0x72, 0x01, 0x8e, 0xfe, 0x72, 0xae, 0xfe, 0x74, 0x01, - 0x8c, 0xfe, 0x74, 0x04, 0x06, 0x01, 0xc6, 0xfe, 0x3a, 0x99, 0xfe, 0xcc, - 0x99, 0xfe, 0x60, 0x01, 0xa0, 0x99, 0x01, 0x34, 0xff, 0xff, 0x00, 0xb9, - 0x00, 0x00, 0x01, 0x7f, 0x05, 0x81, 0x12, 0x06, 0x00, 0x04, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x0a, 0x6a, 0x07, 0x37, 0x10, 0x26, - 0x00, 0x27, 0x00, 0x00, 0x10, 0x27, 0x00, 0x3d, 0x05, 0xc7, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x06, 0xf3, 0x01, 0x64, 0x00, 0x0a, 0xb4, 0x03, - 0x1f, 0x1f, 0x05, 0x26, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x09, 0x61, 0x05, 0xd3, 0x10, 0x26, 0x00, 0x27, 0x00, 0x00, - 0x10, 0x27, 0x00, 0x5d, 0x05, 0xc7, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, - 0x06, 0x48, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x03, 0x1e, 0x1e, 0x11, 0x26, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x07, 0xfe, - 0x05, 0xd3, 0x10, 0x26, 0x00, 0x47, 0x00, 0x00, 0x10, 0x27, 0x00, 0x5d, - 0x04, 0x64, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x04, 0xe5, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x03, 0x2d, 0x2d, 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0xff, 0xec, 0x07, 0xe7, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2d, 0x04, 0x7f, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x06, 0x20, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4d, 0x04, 0xe3, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8a, 0xfe, 0x57, 0x03, 0x12, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x4f, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4d, 0x01, 0xd5, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xff, 0xec, 0x09, 0x2f, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2d, 0x05, 0xc7, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x07, 0x04, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4d, 0x05, 0xc7, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x88, 0xfe, 0x57, 0x05, 0xa1, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x51, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4d, 0x04, 0x64, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x63, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x12, 0x12, 0x05, 0x26, 0x02, 0x14, 0x03, - 0x14, 0x1a, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0xf5, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x32, 0x32, 0x11, 0x26, 0x02, 0x34, 0xb8, 0xff, - 0xdb, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd6, 0x00, 0x00, 0x02, 0x6c, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x09, 0x00, - 0xd6, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x05, 0x05, 0x05, 0x26, 0x01, - 0x07, 0x04, 0x07, 0x0d, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0x89, 0x00, 0x00, 0x02, 0x1f, - 0x05, 0xd3, 0x10, 0x26, 0x09, 0x32, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, - 0x89, 0x00, 0x00, 0x47, 0xb6, 0x01, 0x05, 0x05, 0x11, 0x26, 0x01, 0x07, - 0xb8, 0xff, 0xf2, 0x40, 0x2e, 0x07, 0x0d, 0x01, 0x03, 0x25, 0x1f, 0x0f, - 0x9f, 0x0f, 0xdf, 0x0f, 0xff, 0x0f, 0x04, 0x4f, 0x0f, 0xdf, 0x0f, 0x02, - 0x1f, 0x0f, 0x01, 0x00, 0x0f, 0x70, 0x0f, 0x80, 0x0f, 0xb0, 0x0f, 0xc0, - 0x0f, 0xe0, 0x0f, 0x06, 0x90, 0x0f, 0xa0, 0x0f, 0xb0, 0x0f, 0xc0, 0x0f, - 0xf0, 0x0f, 0x05, 0x71, 0x72, 0x5d, 0x71, 0x72, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x01, 0xc9, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x1c, 0x1c, 0x05, 0x26, - 0x02, 0x1e, 0xb8, 0xff, 0xf8, 0xb4, 0x1e, 0x24, 0x08, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x18, 0x18, 0x11, 0x26, 0x02, 0x1a, 0x05, 0x1a, 0x20, 0x06, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x9e, - 0xff, 0xec, 0x05, 0x29, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x00, 0x01, 0x92, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x15, 0x15, 0x05, 0x26, 0x01, 0x17, 0xb8, 0xff, 0xfa, 0xb4, 0x17, 0x1d, - 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0xdf, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x1c, 0x1c, 0x11, 0x26, 0x01, 0x1e, 0xb8, 0xff, - 0xf2, 0xb4, 0x1e, 0x24, 0x1a, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x33, - 0x02, 0xee, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x03, 0x02, 0x01, 0x1b, - 0x1b, 0x05, 0x26, 0x03, 0x02, 0x01, 0x19, 0x0b, 0x19, 0x17, 0x05, 0x10, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x06, 0x6b, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf5, 0x01, 0x18, 0x00, 0x3f, 0x40, 0x25, - 0x03, 0x9f, 0x26, 0x01, 0x10, 0x26, 0x20, 0x26, 0x30, 0x26, 0x40, 0x26, - 0x04, 0x50, 0x26, 0x60, 0x26, 0x70, 0x26, 0x80, 0x26, 0xa0, 0x26, 0xb0, - 0x26, 0x06, 0x26, 0x02, 0x01, 0x1b, 0x1b, 0x11, 0x26, 0x03, 0x02, 0x01, - 0x1f, 0xb8, 0xff, 0xf3, 0xb4, 0x1f, 0x1d, 0x19, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x2f, 0x5d, 0x71, 0x5d, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x34, - 0x02, 0xee, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x03, 0x02, 0x01, 0x21, - 0x21, 0x05, 0x26, 0x03, 0x02, 0x01, 0x1f, 0x0b, 0x1f, 0x1d, 0x05, 0x10, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x06, 0xfc, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x76, 0x01, 0xa8, 0x01, 0x18, 0x00, 0x29, 0x40, 0x11, - 0x03, 0x9f, 0x26, 0xcf, 0x26, 0x02, 0x26, 0x02, 0x01, 0x1b, 0x1b, 0x11, - 0x26, 0x03, 0x02, 0x01, 0x1f, 0xb8, 0xff, 0xf3, 0xb4, 0x1f, 0x1d, 0x19, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0x2f, 0x5d, 0x35, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x35, - 0x02, 0xee, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x03, 0x02, 0x01, 0x24, - 0x24, 0x05, 0x26, 0x03, 0x02, 0x01, 0x1a, 0x0b, 0x1a, 0x16, 0x05, 0x10, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x06, 0xeb, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x00, 0xe9, 0x01, 0x18, 0x00, 0x29, 0x40, 0x11, - 0x03, 0x9f, 0x26, 0xcf, 0x26, 0x02, 0x26, 0x02, 0x01, 0x1b, 0x1b, 0x11, - 0x26, 0x03, 0x02, 0x01, 0x1f, 0xb8, 0xff, 0xf3, 0xb4, 0x1f, 0x1d, 0x19, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0x2f, 0x5d, 0x35, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x36, - 0x02, 0xee, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x03, 0x02, 0x01, 0x21, - 0x21, 0x05, 0x26, 0x03, 0x02, 0x01, 0x1b, 0x0b, 0x1b, 0x21, 0x05, 0x10, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x06, 0xfc, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0x70, 0x01, 0x18, 0x00, 0x29, 0x40, 0x11, - 0x03, 0x9f, 0x26, 0xcf, 0x26, 0x02, 0x26, 0x02, 0x01, 0x1b, 0x1b, 0x11, - 0x26, 0x03, 0x02, 0x01, 0x1f, 0xb8, 0xff, 0xf3, 0xb4, 0x1f, 0x1d, 0x19, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0x2f, 0x5d, 0x35, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0x17, - 0x04, 0x4e, 0x00, 0x12, 0x00, 0x19, 0x00, 0x41, 0x40, 0x21, 0x00, 0x19, - 0x19, 0x0c, 0x13, 0x07, 0x11, 0x0c, 0x11, 0x1b, 0x1a, 0x12, 0x13, 0x50, - 0x59, 0x12, 0x12, 0x0f, 0x09, 0x0f, 0x16, 0x50, 0x59, 0x0f, 0x16, 0x06, - 0x09, 0x09, 0x03, 0x50, 0x59, 0x09, 0x10, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, - 0x12, 0x11, 0x10, 0x02, 0x23, 0x20, 0x11, 0x35, 0x17, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x37, 0x03, 0x5a, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x61, - 0x01, 0x58, 0xf0, 0xfb, 0xfb, 0xe9, 0xfe, 0x23, 0xba, 0x0f, 0x90, 0x87, - 0x83, 0x99, 0x06, 0x02, 0x43, 0xba, 0xca, 0x5e, 0x48, 0x2d, 0x01, 0x00, - 0xfe, 0xe2, 0xfe, 0xe6, 0xfe, 0xf4, 0xfe, 0xe2, 0x02, 0x3f, 0x18, 0x8a, - 0xab, 0x9d, 0xaf, 0x99, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x33, - 0x02, 0xb0, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x04, 0x03, 0x02, 0x18, - 0x18, 0x05, 0x26, 0x04, 0x03, 0x02, 0x16, 0x05, 0x16, 0x14, 0x04, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0x6b, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf2, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf0, 0x01, 0x18, 0x00, 0x21, 0x40, 0x16, - 0x04, 0x3f, 0x3c, 0x9f, 0x3c, 0x02, 0x10, 0x3c, 0x30, 0x3c, 0x40, 0x3c, - 0x90, 0x3c, 0x04, 0x3c, 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x2f, 0x71, 0x5d, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x37, 0x02, 0xb1, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x14, 0x14, 0x05, 0x26, 0x03, 0x02, 0x17, 0x06, 0x17, 0x18, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0x6b, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9b, 0x01, 0x2e, 0xff, 0xb0, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xdc, 0x01, 0x18, 0x00, 0x21, 0x40, 0x16, - 0x03, 0x7f, 0x37, 0x01, 0x3f, 0x37, 0x9f, 0x37, 0x02, 0x10, 0x37, 0x30, - 0x37, 0x40, 0x37, 0x03, 0x37, 0x02, 0x34, 0x34, 0x11, 0x26, 0x00, 0x2b, - 0x11, 0x35, 0x2f, 0x71, 0x5d, 0x71, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0xa8, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x88, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x03, 0xde, 0x01, 0x49, 0x00, 0x18, 0xb6, 0x02, - 0x16, 0x16, 0x05, 0x26, 0x02, 0x17, 0xb8, 0x01, 0x43, 0xb4, 0x17, 0x18, - 0x04, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x06, 0xc2, 0x05, 0x53, 0x12, 0x26, - 0x00, 0xa8, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x02, 0x58, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x03, 0x3d, 0x3d, 0x11, 0x26, 0x03, 0x3e, 0x1b, - 0x3e, 0x3f, 0x12, 0x27, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x01, 0x00, 0x67, 0xff, 0xec, 0x06, 0x20, 0x05, 0x96, 0x00, 0x26, - 0x00, 0x6a, 0x40, 0x39, 0x01, 0x25, 0x25, 0x17, 0x08, 0x06, 0x0a, 0x03, - 0x26, 0x1e, 0x11, 0x11, 0x26, 0x0a, 0x03, 0x28, 0x27, 0x09, 0x26, 0x00, - 0x26, 0x60, 0x59, 0x06, 0x00, 0x04, 0x03, 0x5f, 0x59, 0x4f, 0x00, 0x01, - 0x0f, 0x04, 0x01, 0x0b, 0x03, 0x00, 0x04, 0x00, 0x04, 0x0d, 0x14, 0x14, - 0x1b, 0x5f, 0x59, 0x18, 0x18, 0x14, 0x04, 0x0d, 0x21, 0x5f, 0x59, 0x0d, - 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x11, - 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, 0x15, 0x06, - 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, - 0x07, 0x2e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x36, - 0x37, 0x35, 0x21, 0x03, 0x4c, 0x01, 0xa4, 0xfe, 0x5b, 0x02, 0x55, 0x80, - 0x80, 0x70, 0xfe, 0xbb, 0xbe, 0xdd, 0xfe, 0xc0, 0xa9, 0x01, 0x70, 0x01, - 0x4d, 0xea, 0x01, 0x24, 0x4f, 0xb6, 0x3c, 0xd3, 0x9d, 0xf4, 0xfe, 0xfe, - 0x01, 0x12, 0xf2, 0x8a, 0xef, 0x4a, 0xfe, 0x5c, 0x01, 0xb6, 0x6b, 0xa0, - 0xfe, 0xf5, 0x82, 0x59, 0x72, 0x7d, 0xb0, 0x01, 0x4b, 0xe0, 0x01, 0x57, - 0x01, 0x78, 0x9e, 0xae, 0x36, 0x78, 0x6e, 0xfe, 0xd9, 0xfe, 0xf4, 0xfe, - 0xf5, 0xfe, 0xcb, 0x54, 0x48, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x68, 0x04, 0x4b, 0x00, 0x29, 0x00, 0x36, 0x00, 0x68, - 0x40, 0x38, 0x31, 0x16, 0x04, 0x0c, 0x2a, 0x03, 0x2a, 0x1c, 0x0a, 0x0e, - 0x0e, 0x24, 0x24, 0x03, 0x16, 0x03, 0x37, 0x38, 0x04, 0x00, 0x27, 0x0b, - 0x0c, 0x0b, 0x51, 0x59, 0x24, 0x0c, 0x13, 0x40, 0x13, 0x34, 0x50, 0x59, - 0x13, 0x40, 0x09, 0x0e, 0x48, 0x13, 0x13, 0x00, 0x20, 0x0f, 0x19, 0x2e, - 0x50, 0x59, 0x19, 0x10, 0x00, 0x07, 0x50, 0x59, 0x00, 0x1b, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x2b, - 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x12, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x12, 0x39, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x37, 0x35, - 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x11, 0x10, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x33, 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x11, 0x33, 0x15, 0x23, - 0x0e, 0x01, 0x13, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x02, 0x24, 0xb1, 0xd2, 0x1e, 0xb5, 0x12, 0x7b, 0x64, - 0x69, 0x78, 0x18, 0xfe, 0x72, 0x01, 0xa0, 0x02, 0x02, 0x33, 0xb2, 0x77, - 0xc6, 0xbc, 0xcb, 0xcb, 0x73, 0xa9, 0x2e, 0x02, 0x08, 0x04, 0xab, 0x06, - 0x7f, 0x8c, 0x1f, 0xd8, 0x51, 0x48, 0x82, 0x54, 0x8a, 0x7e, 0x77, 0x8e, - 0x82, 0x9f, 0xfe, 0x57, 0x8b, 0x80, 0x1a, 0x4b, 0x51, 0x58, 0x5c, 0x82, - 0x35, 0xd8, 0x68, 0x69, 0xf1, 0x01, 0x06, 0x01, 0x08, 0xfa, 0x69, 0x61, - 0x1e, 0x94, 0x07, 0x36, 0xaa, 0xfc, 0xbc, 0x82, 0x9e, 0x9f, 0x03, 0xf3, - 0x76, 0xaa, 0x5b, 0xb4, 0xc7, 0xc7, 0xac, 0xc6, 0xff, 0xff, 0x00, 0x67, - 0xff, 0xec, 0x05, 0xa0, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x00, 0x01, 0xd7, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x20, 0x20, 0x05, 0x26, 0x01, 0x22, 0x1e, 0x22, 0x28, 0x00, 0x18, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x03, 0xef, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x89, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x30, 0x30, 0x11, 0x26, 0x02, 0x32, 0xb8, 0xff, 0xe5, 0xb4, 0x32, 0x38, - 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x3f, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x2e, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x40, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0d, 0x0d, 0x05, 0x26, 0x01, 0x0f, 0xb8, 0xff, - 0x98, 0xb4, 0x0f, 0x15, 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, - 0x07, 0x12, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x00, 0xc8, 0x00, 0x14, 0x00, 0x18, 0xb6, 0x01, 0x0d, 0x0d, 0x05, 0x26, - 0x01, 0x0f, 0xb8, 0xff, 0xcd, 0xb4, 0x0f, 0x15, 0x05, 0x0b, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xfe, 0x55, 0x05, 0xd7, 0x05, 0x96, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x10, 0x07, 0x02, 0x9d, 0x02, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x55, 0x04, 0x1d, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x10, 0x07, 0x02, 0x9d, 0x01, 0x72, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xfe, 0x55, 0x05, 0xd7, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9d, 0x02, 0x6c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x01, 0xd1, 0x01, 0x49, 0x00, 0x14, 0x40, 0x0c, 0x03, 0x30, 0x05, 0x26, - 0x03, 0x30, 0x00, 0x30, 0x2f, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x55, 0x04, 0x1d, - 0x05, 0x53, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9d, - 0x01, 0x72, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf3, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x03, 0x2c, 0x11, 0x26, 0x03, 0x2c, 0x00, 0x2c, - 0x2b, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x2d, 0xfe, 0x56, 0x04, 0x9d, 0x06, 0xfe, 0x12, 0x26, - 0x01, 0x79, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x21, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1c, 0x1c, 0x05, 0x26, 0x01, 0x1e, 0x07, - 0x1e, 0x24, 0x10, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x44, 0xfe, 0x57, 0x04, 0x0b, 0x05, 0xd3, 0x12, 0x26, - 0x02, 0x54, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0xea, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1d, 0x1d, 0x11, 0x26, 0x01, 0x1f, 0x0d, - 0x1f, 0x25, 0x0d, 0x06, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0xff, 0x92, 0xfe, 0x57, 0x02, 0x28, 0x05, 0xd3, 0x12, 0x26, - 0x01, 0xf9, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x92, 0x00, 0x00, 0x16, - 0x40, 0x0d, 0x01, 0x0e, 0x0e, 0x11, 0x26, 0x01, 0x10, 0x57, 0x10, 0x16, - 0x06, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x0a, 0x6a, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x27, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3d, 0x05, 0xc7, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x09, 0x61, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x27, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5d, 0x05, 0xc7, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x07, 0xfe, 0x05, 0xcc, 0x10, 0x26, - 0x00, 0x47, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5d, 0x04, 0x64, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x02, 0x47, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x24, 0x24, 0x05, 0x26, 0x01, 0x20, 0x5f, - 0x20, 0x23, 0x00, 0x18, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x4a, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x6b, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x34, 0x34, 0x11, 0x26, 0x02, 0x30, 0x64, - 0x30, 0x33, 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x01, 0x00, 0xa8, 0xff, 0xec, 0x07, 0xc0, 0x05, 0x81, 0x00, 0x19, - 0x00, 0x61, 0x40, 0x1a, 0x06, 0x09, 0x17, 0x00, 0x0f, 0x16, 0x12, 0x12, - 0x13, 0x13, 0x0f, 0x09, 0x03, 0x1b, 0x1a, 0x16, 0x11, 0x5f, 0x59, 0x50, - 0x16, 0x01, 0xe0, 0x16, 0x01, 0x16, 0xb8, 0xff, 0xe1, 0x40, 0x1c, 0x13, - 0x49, 0x79, 0x16, 0x89, 0x16, 0x02, 0x0f, 0x16, 0x01, 0x08, 0x03, 0x16, - 0x16, 0x13, 0x18, 0x14, 0x03, 0x13, 0x12, 0x0c, 0x03, 0x60, 0x59, 0x0c, - 0x13, 0x07, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x71, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, - 0x33, 0x11, 0x21, 0x11, 0x33, 0x05, 0x20, 0x76, 0x80, 0x80, 0x75, 0xb5, - 0xe2, 0xc9, 0xcc, 0xe8, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0x01, - 0x8a, 0x93, 0x82, 0x81, 0x94, 0x02, 0xb0, 0xfd, 0x33, 0xb1, 0xd0, 0xcc, - 0xb2, 0x01, 0x23, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0x00, - 0x00, 0x02, 0x00, 0xa8, 0xfe, 0x57, 0x04, 0x99, 0x05, 0x96, 0x00, 0x0e, - 0x00, 0x1a, 0x00, 0x3a, 0x40, 0x1d, 0x17, 0x09, 0x05, 0x05, 0x06, 0x0f, - 0x00, 0x06, 0x00, 0x1b, 0x1c, 0x09, 0x17, 0x0c, 0x17, 0x04, 0x5f, 0x59, - 0x17, 0x12, 0x0c, 0x12, 0x5f, 0x59, 0x0c, 0x04, 0x07, 0x03, 0x05, 0x00, - 0x2f, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x02, 0x00, 0x07, 0x11, 0x23, 0x11, 0x33, 0x15, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, - 0x15, 0x11, 0x36, 0x00, 0x12, 0x04, 0x99, 0xe1, 0xfe, 0x83, 0xd4, 0xbf, - 0xb8, 0x3f, 0xbe, 0x6f, 0xdf, 0xee, 0xc3, 0x90, 0x91, 0x5f, 0x99, 0x56, - 0xa2, 0x01, 0x23, 0xaa, 0x03, 0xa3, 0xd9, 0xfe, 0x3b, 0xfe, 0xa3, 0x48, - 0xfe, 0xf7, 0x07, 0x2a, 0xa4, 0x58, 0x61, 0xf9, 0xf9, 0xa6, 0xb1, 0x62, - 0xaa, 0x62, 0xfc, 0x75, 0x3a, 0x01, 0x2d, 0x01, 0x86, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0x57, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x13, 0x13, 0x05, 0x26, 0x01, 0x10, 0xb8, 0xff, - 0xb1, 0xb4, 0x10, 0x13, 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, - 0x00, 0xb1, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x20, 0x20, 0x11, 0x26, - 0x01, 0x1d, 0xb8, 0xff, 0xb4, 0xb4, 0x1d, 0x20, 0x0d, 0x1a, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x3e, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x28, - 0x00, 0x2e, 0x00, 0xa8, 0x40, 0x6a, 0x0a, 0x03, 0x13, 0x07, 0x17, 0x13, - 0x18, 0x06, 0x05, 0x05, 0x08, 0x08, 0x1c, 0x00, 0x22, 0x0d, 0x0d, 0x29, - 0x00, 0x2d, 0x04, 0x09, 0x05, 0x04, 0x04, 0x09, 0x30, 0x2f, 0x30, 0x30, - 0x90, 0x30, 0x02, 0x10, 0x30, 0x40, 0x30, 0x70, 0x30, 0xa0, 0x30, 0xd0, - 0x30, 0x05, 0x0f, 0x30, 0x01, 0x0b, 0x03, 0x29, 0x29, 0x10, 0x10, 0x1f, - 0x8d, 0x59, 0x70, 0x10, 0x80, 0x10, 0x02, 0x10, 0x10, 0x26, 0x7f, 0x2b, - 0x9f, 0x2b, 0xaf, 0x2b, 0xbf, 0x2b, 0x04, 0x2b, 0x40, 0x09, 0x0c, 0x48, - 0x60, 0x2b, 0x01, 0x2b, 0x06, 0x07, 0x18, 0x1f, 0x17, 0x01, 0x17, 0x17, - 0x08, 0x13, 0x0a, 0x03, 0x3f, 0x26, 0x01, 0x00, 0x26, 0x80, 0x26, 0x02, - 0x26, 0x05, 0x05, 0x08, 0x00, 0x2f, 0x33, 0x2f, 0x2f, 0x5d, 0x5d, 0x33, - 0x33, 0x33, 0x12, 0x39, 0x2f, 0x5d, 0x33, 0xcd, 0x32, 0x2f, 0x5d, 0x2b, - 0x5d, 0x12, 0x39, 0x2f, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x01, - 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x07, 0x01, 0x23, 0x03, 0x21, - 0x03, 0x23, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, - 0x07, 0x0e, 0x01, 0x03, 0x21, 0x03, 0x26, 0x27, 0x13, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x33, 0x32, 0x36, 0x03, 0x35, 0x37, - 0x33, 0x15, 0x05, 0x03, 0x9e, 0x3b, 0x2e, 0x02, 0x1d, 0xc3, 0xa1, 0xfd, - 0x7e, 0xa2, 0xc6, 0x02, 0x24, 0x31, 0x3d, 0x8e, 0x64, 0x64, 0x8e, 0xf1, - 0x09, 0x10, 0x35, 0xb9, 0x02, 0x0f, 0xb5, 0x1b, 0x1d, 0x6a, 0x4e, 0x38, - 0x39, 0x4e, 0x48, 0x36, 0x09, 0x3a, 0x4c, 0xf7, 0xd9, 0xcf, 0xfe, 0xca, - 0x05, 0x70, 0x37, 0x61, 0x1c, 0xfb, 0x44, 0x01, 0x73, 0xfe, 0x8d, 0x04, - 0xb9, 0x1c, 0x63, 0x38, 0x5a, 0x7f, 0x80, 0xfe, 0xa9, 0x18, 0x31, 0x85, - 0xfe, 0x55, 0x01, 0xa2, 0x3c, 0x50, 0x01, 0x49, 0x32, 0x47, 0x47, 0x32, - 0x2f, 0x4a, 0x03, 0x4b, 0x01, 0x3a, 0x10, 0xb5, 0x17, 0xae, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x07, 0x3e, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9c, 0x01, 0x14, 0xff, 0x55, - 0x11, 0x07, 0x00, 0x76, 0x01, 0x63, 0x01, 0x5a, 0x00, 0x42, 0x40, 0x26, - 0x04, 0x1f, 0x4e, 0x3f, 0x4e, 0x4f, 0x4e, 0x03, 0xbf, 0x4e, 0x01, 0x00, - 0x4e, 0x70, 0x4e, 0x80, 0x4e, 0xf0, 0x4e, 0x04, 0x4e, 0x03, 0x02, 0x46, - 0x46, 0x10, 0x26, 0x04, 0x49, 0x1a, 0x49, 0x4c, 0x03, 0x1a, 0x25, 0x03, - 0x02, 0x37, 0xb8, 0xff, 0xd4, 0xb4, 0x37, 0x31, 0x03, 0x1a, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x2f, - 0x5d, 0x5d, 0x71, 0x35, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0xa8, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x88, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x03, 0xe4, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, 0x15, 0x05, 0x26, 0x02, - 0x15, 0xb8, 0x01, 0x20, 0xb4, 0x15, 0x18, 0x04, 0x0e, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x42, 0xff, 0xec, 0x06, 0xc2, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0xa8, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x02, 0xaf, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x03, 0x3c, 0x11, 0x26, - 0x03, 0x3c, 0x49, 0x3c, 0x3f, 0x12, 0x26, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x47, 0xff, 0xcb, 0x05, 0xf4, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x9a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x02, 0x4b, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x03, 0x25, 0x05, 0x26, - 0x03, 0x25, 0x49, 0x25, 0x28, 0x08, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xda, 0x04, 0xb4, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0xba, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0xb2, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x03, 0x23, 0x11, 0x26, - 0x03, 0x23, 0x5e, 0x23, 0x26, 0x07, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x4e, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, - 0x02, 0x62, 0x01, 0x6a, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x1c, 0x1c, - 0x05, 0x26, 0x03, 0x02, 0x19, 0xb8, 0xff, 0xb8, 0xb4, 0x19, 0x16, 0x04, - 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, 0x01, 0xe0, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x3c, 0x3c, 0x11, 0x26, 0x03, 0x02, - 0x39, 0xb8, 0xff, 0x7c, 0xb4, 0x39, 0x36, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x24, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd3, 0x02, 0xaf, 0x01, 0x6a, 0x00, 0x14, 0x40, 0x0c, - 0x02, 0x1c, 0x05, 0x26, 0x02, 0x1c, 0x04, 0x1c, 0x14, 0x04, 0x07, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0xba, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd3, 0x02, 0x3e, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x3c, 0x11, 0x26, 0x02, 0x3c, 0xb8, 0xff, 0xd9, 0xb4, 0x3c, 0x34, 0x03, - 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd1, 0x02, 0x74, 0x01, 0x6a, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x17, 0x17, 0x05, 0x26, 0x02, 0x01, 0x14, 0xb8, 0xff, 0xa2, - 0xb4, 0x14, 0x11, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, - 0x01, 0xf4, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x25, 0x25, - 0x11, 0x26, 0x03, 0x02, 0x22, 0xb8, 0xff, 0xbd, 0xb4, 0x22, 0x1f, 0x0c, - 0x12, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x07, 0x24, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, 0x02, 0xd0, 0x01, 0x6a, - 0x00, 0x16, 0xb5, 0x01, 0x17, 0x05, 0x26, 0x01, 0x17, 0xb8, 0xff, 0xfd, - 0xb4, 0x17, 0x0f, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xba, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, 0x02, 0x3a, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x02, 0x25, 0x11, 0x26, 0x02, 0x25, 0x02, 0x25, - 0x1d, 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x69, 0x00, 0x00, 0x02, 0x6c, 0x07, 0x4e, 0x12, 0x26, - 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, 0x00, 0xea, 0x01, 0x6a, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x0f, 0x0f, 0x05, 0x26, 0x02, 0x01, - 0x0c, 0xb8, 0xff, 0xce, 0xb4, 0x0c, 0x09, 0x01, 0x03, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0x57, - 0x00, 0x00, 0x02, 0x5a, 0x05, 0xe4, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd1, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x0f, 0x0f, 0x11, 0x26, 0x02, 0x01, 0x0c, 0xb8, 0xff, 0xbd, - 0xb4, 0x0c, 0x09, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x02, 0x50, - 0x07, 0x24, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, - 0x01, 0x2c, 0x01, 0x6a, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0f, 0x05, 0x26, - 0x01, 0x0f, 0x0f, 0x0f, 0x07, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x02, 0x42, - 0x05, 0xba, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, - 0x01, 0x1e, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x0f, 0x11, 0x26, - 0x01, 0x0f, 0x02, 0x0f, 0x07, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x07, 0x4e, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, - 0x02, 0xc6, 0x01, 0x6a, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x26, 0x26, - 0x05, 0x26, 0x03, 0x02, 0x23, 0xb8, 0xff, 0xab, 0xb4, 0x23, 0x20, 0x08, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, 0x01, 0xf4, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x22, 0x22, 0x11, 0x26, 0x03, 0x02, - 0x1f, 0xb8, 0xff, 0xbb, 0xb4, 0x1f, 0x1c, 0x06, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x07, 0x24, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd3, 0x03, 0x20, 0x01, 0x6a, 0x00, 0x14, 0x40, 0x0c, - 0x02, 0x26, 0x05, 0x26, 0x02, 0x26, 0x04, 0x26, 0x1e, 0x08, 0x00, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0xba, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd3, 0x02, 0x44, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x02, 0x22, 0x11, 0x26, 0x02, 0x22, 0x0a, 0x22, 0x1a, 0x06, 0x00, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x68, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd1, 0x02, 0x6c, 0x01, 0x6a, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x22, 0x22, 0x05, 0x26, 0x03, 0x02, 0x1f, 0xb8, 0xff, 0x65, - 0xb4, 0x1f, 0x1c, 0x05, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x02, 0xc2, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, - 0x01, 0x40, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1f, 0x1f, - 0x11, 0x26, 0x02, 0x01, 0x1c, 0xb8, 0xff, 0xb9, 0xb4, 0x1c, 0x19, 0x03, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x68, 0x07, 0x24, 0x12, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, 0x02, 0xc6, 0x01, 0x6a, - 0x00, 0x16, 0xb5, 0x02, 0x22, 0x05, 0x26, 0x02, 0x22, 0xb8, 0xff, 0xbe, - 0xb4, 0x22, 0x1a, 0x05, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x6c, 0x00, 0x00, 0x02, 0xb4, 0x05, 0xba, 0x12, 0x26, - 0x00, 0x55, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, 0x01, 0x90, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1f, 0x11, 0x26, 0x01, 0x1f, 0x08, 0x1f, - 0x17, 0x03, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, 0x07, 0x4e, 0x12, 0x26, - 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, 0x02, 0xb2, 0x01, 0x6a, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1f, 0x1f, 0x05, 0x26, 0x02, 0x01, - 0x1c, 0xb8, 0xff, 0xcf, 0xb4, 0x1c, 0x19, 0x05, 0x10, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x69, - 0xff, 0xec, 0x03, 0xeb, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd1, 0x01, 0xea, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x26, 0x26, 0x11, 0x26, 0x02, 0x01, 0x23, 0xb8, 0xff, 0xb3, - 0xb4, 0x23, 0x20, 0x1a, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x24, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, - 0x02, 0xf3, 0x01, 0x6a, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1f, 0x05, 0x26, - 0x01, 0x1f, 0x0f, 0x1f, 0x17, 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, - 0x05, 0xba, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd3, - 0x02, 0x32, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, 0x26, 0x11, 0x26, 0x01, - 0x26, 0xb8, 0xff, 0xfa, 0xb4, 0x26, 0x1e, 0x1a, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x5d, 0xfe, 0x4e, 0x04, 0xf8, - 0x05, 0x96, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, - 0x01, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x32, 0x19, 0x32, 0x38, - 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x39, - 0xfe, 0x4e, 0x03, 0xb6, 0x04, 0x4b, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xf9, 0x01, 0x18, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x2f, 0x04, 0x2f, 0x35, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x2e, 0xfe, 0x4e, 0x04, 0xb4, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, 0x01, 0x8d, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x0c, 0x00, 0x0c, 0x12, 0x05, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xfe, 0x4e, 0x02, 0x2a, - 0x05, 0x2c, 0x10, 0x26, 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x08, 0xf9, - 0x00, 0x86, 0x00, 0x00, 0x00, 0xa1, 0x40, 0x8a, 0x0f, 0x21, 0x01, 0x58, - 0x02, 0x0f, 0x21, 0x1f, 0x21, 0x2f, 0x21, 0x03, 0x7d, 0x0f, 0x21, 0x1f, - 0x21, 0x2f, 0x21, 0x3f, 0x21, 0x4f, 0x21, 0x6f, 0x21, 0x7f, 0x21, 0xbf, - 0x21, 0xcf, 0x21, 0xdf, 0x21, 0xef, 0x21, 0xff, 0x21, 0x0c, 0x0f, 0x21, - 0x1f, 0x21, 0x2f, 0x21, 0x5f, 0x21, 0x6f, 0x21, 0x7f, 0x21, 0x8f, 0x21, - 0x9f, 0x21, 0xbf, 0x21, 0xcf, 0x21, 0xdf, 0x21, 0x0b, 0x0f, 0x21, 0x1f, - 0x21, 0x2f, 0x21, 0x3f, 0x21, 0x6f, 0x21, 0x7f, 0x21, 0xaf, 0x21, 0xcf, - 0x21, 0xdf, 0x21, 0xef, 0x21, 0x0a, 0x4d, 0x1f, 0x21, 0xcf, 0x21, 0x02, - 0x6f, 0x21, 0x01, 0x0f, 0x21, 0xbf, 0x21, 0x02, 0x08, 0x00, 0x21, 0x30, - 0x21, 0xb0, 0x21, 0xe0, 0x21, 0x04, 0x3c, 0x40, 0x21, 0x80, 0x21, 0x90, - 0x21, 0x03, 0x20, 0x21, 0x30, 0x21, 0xd0, 0x21, 0xe0, 0x21, 0x04, 0x00, - 0x21, 0x40, 0x21, 0x80, 0x21, 0x03, 0x01, 0x19, 0x45, 0x19, 0x1f, 0x07, - 0x14, 0x25, 0x2b, 0x11, 0x35, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x5e, 0x5d, - 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x5f, 0x5e, 0x5d, 0x00, - 0x00, 0x01, 0x00, 0x40, 0xfe, 0x55, 0x03, 0xf9, 0x05, 0x97, 0x00, 0x22, - 0x00, 0x46, 0x40, 0x21, 0x09, 0x20, 0x0b, 0x0f, 0x1d, 0x1d, 0x06, 0x00, - 0x0b, 0x16, 0x02, 0x00, 0x02, 0x24, 0x23, 0x20, 0x0b, 0x09, 0x09, 0x02, - 0x19, 0x15, 0x15, 0x19, 0x19, 0x12, 0x5f, 0x59, 0x19, 0x04, 0x03, 0x03, - 0x02, 0x00, 0x2f, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x11, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x01, 0x10, 0x01, 0x35, 0x24, 0x00, 0x35, 0x34, 0x26, 0x27, 0x06, 0x05, - 0x35, 0x2c, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, - 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x03, - 0xf9, 0xfc, 0x8f, 0x01, 0x57, 0x01, 0x5e, 0x2a, 0x25, 0xb0, 0xfe, 0x49, - 0x01, 0x75, 0x01, 0x41, 0x8d, 0x89, 0x73, 0x9d, 0x3e, 0x99, 0x55, 0xf2, - 0xa8, 0x87, 0xcf, 0x71, 0x38, 0x55, 0x40, 0x50, 0x01, 0x68, 0xfd, 0xee, - 0xfe, 0xff, 0xa6, 0x61, 0x01, 0x32, 0xc5, 0x49, 0x84, 0x28, 0x87, 0x91, - 0xad, 0x72, 0xf0, 0xa7, 0x86, 0x89, 0x54, 0x6c, 0x4f, 0x90, 0x83, 0x66, - 0xba, 0x74, 0x59, 0x8a, 0x5c, 0x3c, 0xb3, 0x00, 0x00, 0x01, 0x00, 0x21, - 0xfe, 0x56, 0x03, 0x2e, 0x04, 0x4e, 0x00, 0x24, 0x00, 0x44, 0x40, 0x20, - 0x22, 0x0c, 0x0e, 0x12, 0x20, 0x20, 0x09, 0x00, 0x0e, 0x19, 0x03, 0x00, - 0x03, 0x26, 0x25, 0x22, 0x0e, 0x0c, 0x0c, 0x03, 0x1d, 0x18, 0x18, 0x1d, - 0x1d, 0x15, 0x50, 0x59, 0x1d, 0x10, 0x04, 0x03, 0x00, 0x2f, 0x33, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x33, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x25, 0x14, 0x00, 0x05, 0x35, 0x3e, - 0x03, 0x35, 0x34, 0x26, 0x27, 0x06, 0x05, 0x35, 0x2c, 0x01, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x07, 0x1e, 0x01, 0x03, 0x2e, 0xfe, 0xa1, 0xfe, 0x8a, 0xb3, 0xbf, - 0x70, 0x40, 0x29, 0x21, 0xb4, 0xfe, 0xdc, 0x01, 0x15, 0x01, 0x0d, 0x60, - 0x65, 0x65, 0x66, 0x1c, 0xae, 0x1b, 0x69, 0x96, 0x79, 0xbf, 0xbb, 0x72, - 0x32, 0x40, 0xaa, 0xcf, 0xfe, 0xd6, 0x5b, 0x9b, 0x30, 0x58, 0x5f, 0x76, - 0x47, 0x47, 0x75, 0x1d, 0x68, 0x41, 0x94, 0x3c, 0xd1, 0x91, 0x6d, 0x65, - 0x56, 0x5b, 0x21, 0x62, 0x7b, 0x38, 0xa8, 0xb5, 0x9e, 0x7f, 0x29, 0x9f, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x06, 0xfe, 0x12, 0x26, - 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, 0x01, 0x95, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0d, 0x0d, 0x05, 0x26, 0x01, 0x0f, 0xb8, 0xff, - 0xfc, 0xb4, 0x0f, 0x15, 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, - 0x07, 0x12, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x09, 0x00, - 0x01, 0x0e, 0x00, 0x14, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1a, 0x1a, 0x05, - 0x26, 0x01, 0x1c, 0x1b, 0x1c, 0x22, 0x13, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x00, 0x01, 0x00, 0xa4, 0xfe, 0x57, 0x05, 0x03, - 0x05, 0x95, 0x00, 0x14, 0x00, 0x31, 0x40, 0x18, 0x00, 0x14, 0x0d, 0x09, - 0x09, 0x0a, 0x14, 0x0a, 0x16, 0x15, 0x0d, 0x10, 0x0a, 0x10, 0x05, 0x5f, - 0x59, 0x10, 0x04, 0x0b, 0x03, 0x0a, 0x12, 0x00, 0x00, 0x2f, 0x3f, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x34, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x24, 0x33, - 0x32, 0x16, 0x15, 0x11, 0x04, 0x45, 0x3f, 0x84, 0x79, 0x6f, 0xe7, 0x52, - 0xbd, 0xbb, 0x4a, 0x01, 0x05, 0x96, 0xe9, 0xd6, 0xfe, 0x57, 0x05, 0x54, - 0x7d, 0x94, 0x44, 0x62, 0x52, 0xfb, 0xb4, 0x05, 0x81, 0x97, 0x4f, 0x5c, - 0xec, 0xfe, 0xfa, 0xac, 0x00, 0x03, 0x00, 0x56, 0xfe, 0x56, 0x05, 0x74, - 0x05, 0xcc, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x67, 0x40, 0x37, - 0x2e, 0x16, 0x34, 0x10, 0x10, 0x28, 0x1c, 0x0d, 0x20, 0x22, 0x06, 0x06, - 0x1e, 0x20, 0x16, 0x04, 0x3b, 0x3a, 0x1c, 0x20, 0x11, 0x03, 0x13, 0x1a, - 0x1a, 0x37, 0x50, 0x59, 0x1d, 0x1a, 0x0f, 0x00, 0x00, 0x0b, 0x03, 0x08, - 0x08, 0x2b, 0x50, 0x59, 0x08, 0x10, 0x13, 0x31, 0x50, 0x59, 0x13, 0x13, - 0x03, 0x03, 0x25, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, 0x17, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, - 0x36, 0x37, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x03, 0x35, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, - 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, 0x02, 0x41, 0x3c, 0x80, 0x8c, 0x48, - 0x7b, 0x4a, 0xb9, 0x4f, 0x9d, 0x6e, 0x79, 0x6c, 0xfd, 0xda, 0x78, 0x87, - 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0x03, 0xc6, 0x39, 0x3a, 0x26, 0x3e, - 0x20, 0x47, 0x3d, 0x34, 0x3f, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, - 0x02, 0x36, 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfb, 0x13, 0x9f, 0x17, 0x87, - 0x77, 0x53, 0x71, 0x3e, 0xbd, 0xbe, 0x75, 0xa9, 0x60, 0xda, 0x01, 0x70, - 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0xfc, 0x55, 0x30, 0x41, 0x1d, - 0x14, 0x50, 0x5e, 0x39, 0x00, 0x02, 0x00, 0x5d, 0xff, 0xec, 0x04, 0x77, - 0x05, 0x96, 0x00, 0x27, 0x00, 0x32, 0x00, 0x5e, 0x40, 0x32, 0x06, 0x00, - 0x1b, 0x13, 0x04, 0x03, 0x1e, 0x17, 0x17, 0x2e, 0x10, 0x24, 0x03, 0x03, - 0x28, 0x0a, 0x10, 0x0a, 0x33, 0x34, 0x06, 0x13, 0x21, 0x2b, 0x21, 0x2b, - 0x60, 0x59, 0x1a, 0x1b, 0x60, 0x59, 0x21, 0x1a, 0x21, 0x1a, 0x0d, 0x00, - 0x0d, 0x31, 0x60, 0x59, 0x0d, 0x13, 0x00, 0x27, 0x60, 0x59, 0x00, 0x04, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, - 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x35, 0x34, - 0x36, 0x37, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x15, 0x0e, 0x01, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x01, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x20, 0x02, 0x7e, 0xdb, - 0xf8, 0x8e, 0x7e, 0x91, 0xa1, 0xfe, 0xea, 0xf6, 0xfd, 0xfe, 0xef, 0xaa, - 0x84, 0x89, 0x81, 0xe5, 0xdc, 0x89, 0x83, 0xa5, 0x8e, 0x92, 0x9e, 0x91, - 0x8a, 0x01, 0x41, 0xb8, 0xa1, 0x9c, 0xb6, 0xb2, 0xa7, 0x01, 0x52, 0x05, - 0x96, 0x05, 0xc5, 0xa2, 0x7c, 0xb1, 0x17, 0x04, 0x16, 0xb8, 0x8d, 0xc1, - 0xda, 0xd8, 0xc1, 0x8b, 0xbc, 0x14, 0x04, 0x25, 0x7d, 0x61, 0x8a, 0x97, - 0x04, 0x82, 0x04, 0x53, 0x54, 0x59, 0x5e, 0x7f, 0x79, 0x6c, 0x7f, 0x05, - 0xfc, 0x88, 0x7c, 0x8c, 0x98, 0x82, 0x81, 0x8d, 0x00, 0x02, 0x00, 0x5f, - 0xff, 0xec, 0x04, 0x2c, 0x05, 0xd2, 0x00, 0x27, 0x00, 0x34, 0x00, 0x50, - 0x40, 0x29, 0x1a, 0x22, 0x06, 0x0d, 0x04, 0x1e, 0x03, 0x0a, 0x0a, 0x31, - 0x11, 0x25, 0x1e, 0x1e, 0x2b, 0x17, 0x11, 0x17, 0x36, 0x35, 0x1a, 0x0e, - 0x00, 0x28, 0x00, 0x28, 0x51, 0x59, 0x00, 0x00, 0x14, 0x22, 0x07, 0x21, - 0x00, 0x14, 0x2e, 0x50, 0x59, 0x14, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, - 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, - 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x15, 0x14, 0x16, - 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, - 0x01, 0x02, 0x45, 0x7d, 0x8a, 0x51, 0x49, 0x49, 0x8b, 0x7b, 0x7f, 0x70, - 0x82, 0x98, 0xfe, 0xff, 0xe8, 0xe6, 0xfe, 0x98, 0x82, 0x6f, 0x80, 0x7b, - 0x8b, 0x49, 0x49, 0x51, 0x89, 0x7d, 0x8b, 0xa6, 0x9b, 0x97, 0x97, 0x9a, - 0x49, 0x8b, 0x03, 0x6a, 0x88, 0x7d, 0x51, 0x7e, 0x23, 0x71, 0x44, 0xae, - 0x70, 0x7f, 0xae, 0x20, 0x04, 0x1f, 0xc9, 0x8f, 0xd5, 0xe7, 0xe8, 0xd4, - 0x90, 0xc7, 0x20, 0x04, 0x1f, 0xae, 0x80, 0x70, 0xae, 0x44, 0x71, 0x23, - 0x7e, 0x51, 0x7e, 0x87, 0x83, 0xa7, 0x89, 0x9d, 0xa1, 0xa2, 0x9c, 0x57, - 0x8b, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0xff, 0x01, 0x04, 0xaf, - 0x05, 0x81, 0x00, 0x13, 0x00, 0x3c, 0x40, 0x1f, 0x06, 0x00, 0x01, 0x05, - 0x0f, 0x0a, 0x0a, 0x05, 0x02, 0x00, 0x04, 0x14, 0x15, 0x00, 0x06, 0x13, - 0x06, 0x5f, 0x59, 0x0c, 0x40, 0x13, 0x12, 0x05, 0x02, 0x03, 0x02, 0x5f, - 0x59, 0x03, 0x03, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x1a, - 0xcc, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x01, 0x21, 0x35, 0x21, 0x15, - 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x21, 0x41, 0x03, 0x5a, 0xfc, 0xef, 0x03, 0xea, 0xfc, 0xa6, 0x02, - 0x7c, 0x84, 0x95, 0x11, 0x9b, 0x12, 0x47, 0x4d, 0xfc, 0xc0, 0x8f, 0x04, - 0x56, 0x9c, 0x8b, 0xfb, 0xa6, 0x83, 0x7e, 0x4d, 0x4d, 0x22, 0x38, 0x20, - 0x47, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xff, 0x0b, 0x03, 0xd3, - 0x04, 0x3a, 0x00, 0x13, 0x00, 0x3a, 0x40, 0x1e, 0x0f, 0x0a, 0x01, 0x05, - 0x06, 0x00, 0x00, 0x02, 0x05, 0x0a, 0x04, 0x15, 0x14, 0x00, 0x06, 0x13, - 0x06, 0x50, 0x59, 0x0c, 0x13, 0x15, 0x05, 0x02, 0x03, 0x02, 0x50, 0x59, - 0x03, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0xc4, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x37, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, - 0x32, 0x16, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, - 0x31, 0x02, 0x95, 0xfd, 0x93, 0x03, 0x38, 0xfd, 0x6a, 0x01, 0xbf, 0x93, - 0x86, 0x13, 0x9b, 0x14, 0x47, 0x4d, 0xfd, 0x8c, 0x89, 0x03, 0x26, 0x8b, - 0x89, 0xfc, 0xda, 0x70, 0x73, 0x47, 0x56, 0x22, 0x31, 0x27, 0x3f, 0x3c, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0xbb, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x14, 0x14, 0x05, 0x26, 0x02, 0x12, 0x06, - 0x12, 0x14, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x4a, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x34, 0x34, 0x11, 0x26, 0x02, 0x32, 0xb8, 0xff, - 0xdb, 0xb4, 0x32, 0x34, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x4e, 0x04, 0xfe, - 0x05, 0x81, 0x10, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, - 0x01, 0xcd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xfe, 0x4e, 0x04, 0x18, - 0x04, 0x4e, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, - 0x01, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x33, - 0x03, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x04, 0x03, 0x02, 0x22, - 0x22, 0x05, 0x26, 0x04, 0x03, 0x02, 0x20, 0x04, 0x20, 0x1e, 0x08, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0x6b, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xf2, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf2, 0x01, 0x18, 0x00, 0x25, 0x40, 0x1a, - 0x04, 0x0f, 0x21, 0x1f, 0x21, 0x3f, 0x21, 0x9f, 0x21, 0x04, 0x10, 0x21, - 0x30, 0x21, 0x40, 0x21, 0x90, 0x21, 0x04, 0x21, 0x03, 0x02, 0x1b, 0x1b, - 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x2f, 0x71, 0x5d, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x38, 0x03, 0x1c, 0x00, 0x00, - 0x00, 0x18, 0x40, 0x0e, 0x03, 0x02, 0x27, 0x05, 0x26, 0x03, 0x02, 0x27, - 0x00, 0x27, 0x33, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x9d, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9e, - 0x00, 0xf2, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf2, 0x01, 0x4a, - 0x00, 0x1f, 0x40, 0x15, 0x03, 0x2f, 0x32, 0x01, 0x0f, 0x32, 0x3f, 0x32, - 0x4f, 0x32, 0x5f, 0x32, 0x6f, 0x32, 0x05, 0x32, 0x02, 0x17, 0x17, 0x11, - 0x26, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x71, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x02, 0x36, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1e, 0x1e, 0x05, 0x26, 0x02, 0x1c, 0x10, - 0x1c, 0x1e, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x45, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x02, 0x18, 0x01, - 0x18, 0x1a, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x37, 0x03, 0x1c, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x1e, 0x1e, 0x05, 0x26, 0x03, 0x02, - 0x21, 0x00, 0x21, 0x22, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x6b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9b, - 0x01, 0x4b, 0xff, 0xb0, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xf2, 0x01, 0x18, - 0x00, 0x21, 0x40, 0x16, 0x03, 0x7f, 0x1e, 0x01, 0x3f, 0x1e, 0x9f, 0x1e, - 0x02, 0x10, 0x1e, 0x30, 0x1e, 0x40, 0x1e, 0x03, 0x1e, 0x02, 0x1a, 0x1a, - 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x71, 0x5d, 0x71, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x06, 0x9c, 0x12, 0x26, - 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x01, 0x65, 0x01, 0x49, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0a, 0x0a, 0x05, 0x26, 0x01, 0x0b, 0x00, - 0x0b, 0x0c, 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x05, 0x53, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xca, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x18, 0x18, 0x11, 0x26, 0x01, 0x19, 0x0f, - 0x19, 0x1a, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x02, 0xff, 0xa9, 0xfe, 0x56, 0x02, 0xc9, 0x05, 0xcc, 0x00, 0x11, - 0x00, 0x1d, 0x00, 0x3e, 0x40, 0x1f, 0x01, 0x18, 0x18, 0x10, 0x0c, 0x0c, - 0x0e, 0x12, 0x06, 0x06, 0x1f, 0x0e, 0x1e, 0x03, 0x15, 0x50, 0x59, 0x0c, - 0x10, 0x03, 0x03, 0x0a, 0x11, 0x00, 0x0a, 0x1b, 0x50, 0x59, 0x0d, 0x0a, - 0x1b, 0x00, 0x3f, 0xc6, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, - 0x39, 0x2b, 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, 0x33, 0x12, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x36, 0x37, 0x11, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x01, 0x3e, 0x44, 0x3b, 0x80, 0x8c, 0x48, 0x7b, 0x4a, 0xb9, 0x4f, 0x9d, - 0x6e, 0x7f, 0x62, 0x01, 0xa4, 0x39, 0x3a, 0x26, 0x3e, 0x20, 0x47, 0x3d, - 0x34, 0x3f, 0x05, 0xcc, 0xfa, 0x73, 0x18, 0x87, 0x77, 0x53, 0x71, 0x3e, - 0xbd, 0xbe, 0x75, 0xb3, 0x56, 0x05, 0xf8, 0xf9, 0x89, 0x30, 0x41, 0x1d, - 0x14, 0x50, 0x5e, 0x39, 0x00, 0x02, 0x00, 0x88, 0xfe, 0x56, 0x05, 0x74, - 0x04, 0x4e, 0x00, 0x28, 0x00, 0x34, 0x00, 0x66, 0x40, 0x39, 0x0d, 0x08, - 0x08, 0x09, 0x2f, 0x19, 0x19, 0x24, 0x28, 0x29, 0x1e, 0x1e, 0x28, 0x26, - 0x09, 0x04, 0x35, 0x36, 0x24, 0x28, 0x19, 0x03, 0x1b, 0x22, 0x22, 0x32, - 0x50, 0x59, 0x0f, 0x22, 0x1f, 0x22, 0x9f, 0x22, 0x03, 0x0d, 0x03, 0x22, - 0x11, 0x15, 0x08, 0x15, 0x04, 0x50, 0x59, 0x15, 0x10, 0x0c, 0x0f, 0x1b, - 0x2c, 0x50, 0x59, 0x1b, 0x1b, 0x08, 0x15, 0x00, 0x3f, 0x33, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, - 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x23, - 0x22, 0x27, 0x07, 0x27, 0x36, 0x37, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x39, 0x2a, 0x5c, 0x59, 0x82, - 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, - 0xb2, 0xa5, 0x44, 0x3b, 0x7d, 0x8a, 0x48, 0x7b, 0x4a, 0xb9, 0x4f, 0x9d, - 0x6e, 0x79, 0x6c, 0x01, 0xa0, 0x39, 0x3a, 0x26, 0x3e, 0x20, 0x47, 0x3d, - 0x34, 0x3f, 0x02, 0xae, 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x8d, 0x03, - 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0xfd, - 0x6e, 0x18, 0x85, 0x79, 0x53, 0x71, 0x3e, 0xbd, 0xbe, 0x75, 0xa9, 0x60, - 0x7f, 0x30, 0x41, 0x1d, 0x14, 0x50, 0x5e, 0x39, 0x00, 0x02, 0xff, 0xb7, - 0xff, 0xeb, 0x02, 0xd7, 0x05, 0x2c, 0x00, 0x19, 0x00, 0x25, 0x00, 0x5d, - 0x40, 0x31, 0x1a, 0x0e, 0x20, 0x05, 0x09, 0x09, 0x16, 0x14, 0x02, 0x18, - 0x01, 0x18, 0x06, 0x0e, 0x04, 0x27, 0x26, 0x14, 0x1d, 0x0b, 0x1d, 0x50, - 0x59, 0x18, 0x0b, 0x0b, 0x06, 0x12, 0x12, 0x23, 0x50, 0x59, 0x15, 0x12, - 0x16, 0x06, 0x07, 0x51, 0x59, 0x04, 0x40, 0x06, 0x0f, 0x01, 0x00, 0x51, - 0x59, 0x01, 0x0f, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, 0xce, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, - 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x36, 0x37, 0x11, 0x01, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1f, - 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x44, 0x3b, 0x7f, 0x89, 0x48, 0x7b, 0x4a, - 0xb9, 0x4f, 0x9d, 0x6e, 0x79, 0x6c, 0x01, 0xa0, 0x39, 0x3a, 0x26, 0x3a, - 0x20, 0x44, 0x3c, 0x34, 0x3f, 0x03, 0xb7, 0x83, 0xf2, 0xf2, 0x83, 0xfe, - 0x1d, 0x18, 0x87, 0x77, 0x53, 0x71, 0x3e, 0xbd, 0xbe, 0x75, 0xa9, 0x60, - 0x02, 0x4e, 0xfd, 0x33, 0x30, 0x41, 0x1d, 0x14, 0x54, 0x5a, 0x39, 0x00, - 0x00, 0x01, 0xff, 0xce, 0xfe, 0x57, 0x01, 0x3d, 0x04, 0x3a, 0x00, 0x0c, - 0x00, 0x1f, 0x40, 0x0e, 0x0a, 0x00, 0x00, 0x0e, 0x05, 0x0d, 0x0b, 0x0f, - 0x03, 0x07, 0x50, 0x59, 0x03, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x35, 0x11, 0x33, 0x01, 0x3d, - 0x78, 0x78, 0x4d, 0x32, 0x3e, 0x45, 0x38, 0xb4, 0x86, 0x99, 0x8a, 0x09, - 0x8b, 0x06, 0x48, 0x68, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x03, 0x00, 0x53, - 0xff, 0xec, 0x06, 0xc5, 0x05, 0xcc, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x39, - 0x00, 0x63, 0x40, 0x36, 0x2e, 0x19, 0x34, 0x12, 0x10, 0x1f, 0x1f, 0x28, - 0x0d, 0x0c, 0x20, 0x22, 0x06, 0x06, 0x20, 0x19, 0x03, 0x3b, 0x3a, 0x20, - 0x15, 0x1b, 0x37, 0x50, 0x59, 0x1b, 0x16, 0x16, 0x31, 0x50, 0x59, 0x16, - 0x10, 0x0e, 0x00, 0x00, 0x1d, 0x12, 0x0b, 0x04, 0x08, 0x03, 0x08, 0x2b, - 0x50, 0x59, 0x08, 0x10, 0x03, 0x25, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, 0x14, 0x07, - 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x21, 0x22, 0x27, 0x23, - 0x15, 0x23, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x03, 0x32, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, - 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, - 0xc1, 0xfe, 0x72, 0xf7, 0x64, 0x02, 0xa4, 0xfd, 0xda, 0x78, 0x87, 0x99, - 0x8a, 0x8a, 0x97, 0x88, 0x79, 0x04, 0xf8, 0x78, 0x87, 0x98, 0x8b, 0x88, - 0x99, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, - 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfe, 0x59, 0x41, 0x58, 0x68, 0x5a, 0xfe, - 0xec, 0xfe, 0xe8, 0xfd, 0xca, 0xc3, 0xaf, 0xae, 0x01, 0x70, 0xe3, 0xc4, - 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0xe4, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, 0xcb, - 0xc9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x53, 0xfe, 0x57, 0x06, 0xc5, - 0x04, 0x4c, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x5f, 0x40, 0x35, - 0x35, 0x12, 0x29, 0x1b, 0x07, 0x08, 0x08, 0x2f, 0x18, 0x0a, 0x09, 0x22, - 0x00, 0x00, 0x09, 0x12, 0x03, 0x3b, 0x3c, 0x1f, 0x25, 0x50, 0x59, 0x1f, - 0x10, 0x18, 0x1b, 0x04, 0x0c, 0x04, 0x0f, 0x19, 0x0f, 0x14, 0x32, 0x50, - 0x59, 0x14, 0x10, 0x0f, 0x38, 0x50, 0x59, 0x0f, 0x16, 0x09, 0x1b, 0x02, - 0x2c, 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x17, 0x39, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, - 0x22, 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x37, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, - 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x25, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x06, 0xc5, 0xfe, 0x72, - 0xfa, 0x56, 0x05, 0x04, 0xb4, 0x02, 0x04, 0x34, 0x97, 0x84, 0xce, 0xc0, - 0x01, 0x8e, 0x7d, 0x9d, 0x35, 0x04, 0xb0, 0x04, 0x30, 0x9e, 0x81, 0xc8, - 0xc6, 0xbd, 0x7a, 0x85, 0x6b, 0x79, 0x3f, 0x89, 0x98, 0x87, 0x7a, 0xfd, - 0x2a, 0x8a, 0x97, 0x89, 0x78, 0x78, 0x87, 0x9b, 0x88, 0x02, 0x20, 0xfd, - 0xcc, 0xbc, 0x08, 0xa2, 0xfe, 0x59, 0x01, 0xec, 0x65, 0x67, 0x55, 0x01, - 0x14, 0x01, 0x16, 0x02, 0x36, 0x58, 0x64, 0xaa, 0xb0, 0x64, 0x5d, 0xfe, - 0xf4, 0xfe, 0xdd, 0xe2, 0xc2, 0x5a, 0xbf, 0x99, 0xd5, 0xc8, 0xc5, 0xf2, - 0xd3, 0xcc, 0xcc, 0xdf, 0xe1, 0xc4, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x04, - 0xff, 0x95, 0x05, 0x52, 0x05, 0xea, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x19, - 0x00, 0x1c, 0x00, 0x66, 0x40, 0x37, 0x03, 0x17, 0x10, 0x08, 0x07, 0x13, - 0x18, 0x0f, 0x02, 0x1b, 0x1b, 0x0f, 0x13, 0x10, 0x0c, 0x05, 0x04, 0x0a, - 0x0b, 0x0d, 0x0b, 0x04, 0x06, 0x04, 0x1d, 0x1e, 0x19, 0x01, 0x5f, 0x59, - 0x19, 0x19, 0x0e, 0x0e, 0x1c, 0x5f, 0x59, 0x17, 0x09, 0x07, 0x0e, 0x0e, - 0x06, 0x07, 0x07, 0x13, 0x60, 0x59, 0x0a, 0x07, 0x03, 0x04, 0x00, 0x06, - 0x12, 0x00, 0x3f, 0x33, 0xc6, 0x3f, 0xc6, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x12, 0x39, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, 0x21, 0x03, - 0x21, 0x01, 0x23, 0x37, 0x23, 0x01, 0x33, 0x17, 0x13, 0x33, 0x09, 0x02, - 0x33, 0x13, 0x2e, 0x01, 0x27, 0x07, 0x06, 0x07, 0x17, 0x07, 0x33, 0x01, - 0x13, 0x23, 0x04, 0x8f, 0xa1, 0xfe, 0x71, 0xfe, 0xc2, 0xa2, 0x41, 0xbc, - 0x02, 0x3f, 0xd9, 0x66, 0xdd, 0xa2, 0xfe, 0xc2, 0x01, 0x8f, 0xfc, 0x54, - 0x71, 0xfd, 0x36, 0x2c, 0x05, 0x09, 0x19, 0x31, 0xf9, 0x99, 0xfb, 0xfd, - 0x26, 0xe1, 0x50, 0x01, 0x9c, 0xfd, 0xf9, 0x6b, 0x05, 0x81, 0xff, 0x01, - 0x68, 0xfd, 0xf8, 0xfc, 0x1e, 0x02, 0x31, 0x01, 0x9d, 0x8c, 0x87, 0x10, - 0x1c, 0x53, 0x82, 0xd4, 0xfb, 0xfd, 0xfa, 0x01, 0x71, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x68, 0xff, 0x95, 0x05, 0x79, 0x05, 0xea, 0x00, 0x1d, - 0x00, 0x25, 0x00, 0x81, 0x40, 0x4f, 0x0e, 0x0d, 0x0d, 0x15, 0x16, 0x09, - 0x0a, 0x1c, 0x1d, 0x21, 0x03, 0x03, 0x1d, 0x00, 0x11, 0x24, 0x0b, 0x0a, - 0x16, 0x08, 0x27, 0x26, 0x1b, 0x00, 0x11, 0x23, 0x04, 0x19, 0x00, 0x15, - 0x10, 0x15, 0x40, 0x15, 0x50, 0x15, 0x90, 0x15, 0xa0, 0x15, 0xd0, 0x15, - 0xe0, 0x15, 0x08, 0x0c, 0x03, 0x15, 0x15, 0x1c, 0x19, 0x40, 0x19, 0x13, - 0x5f, 0x59, 0x19, 0x13, 0x10, 0x24, 0x0b, 0x08, 0x04, 0x06, 0x0f, 0x0e, - 0x01, 0x0d, 0x03, 0x0e, 0x0e, 0x06, 0x06, 0x1e, 0x5f, 0x59, 0x09, 0x06, - 0x04, 0x00, 0x3f, 0xce, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x12, 0x17, 0x39, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x33, - 0x2f, 0x5f, 0x5e, 0x5d, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x25, 0x26, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x17, 0x37, 0x33, - 0x07, 0x16, 0x17, 0x07, 0x26, 0x27, 0x01, 0x16, 0x33, 0x20, 0x13, 0x17, - 0x06, 0x04, 0x23, 0x22, 0x27, 0x07, 0x23, 0x01, 0x22, 0x00, 0x11, 0x10, - 0x17, 0x01, 0x26, 0x01, 0x56, 0x77, 0x77, 0x01, 0x6c, 0x01, 0x42, 0xa2, - 0x81, 0x4e, 0xa2, 0x74, 0x7a, 0x3d, 0xb5, 0x1f, 0x3f, 0xfd, 0xcc, 0x70, - 0x8b, 0x01, 0x28, 0x95, 0x9c, 0x57, 0xfe, 0xc5, 0xd0, 0xbb, 0x90, 0x5b, - 0xa2, 0x02, 0x49, 0xea, 0xfe, 0xfc, 0x8d, 0x02, 0x2d, 0x5b, 0x7b, 0x62, - 0x01, 0x2e, 0xbc, 0x01, 0x51, 0x01, 0x7e, 0x31, 0x85, 0xc6, 0x57, 0x94, - 0x3c, 0x4e, 0x3d, 0xfc, 0x3f, 0x3e, 0x01, 0x25, 0x4e, 0xb6, 0xbe, 0x44, - 0x9b, 0x05, 0x65, 0xfe, 0xd3, 0xfe, 0xfa, 0xfe, 0xf5, 0x9b, 0x03, 0xb3, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xfe, 0x57, 0x03, 0xec, - 0x05, 0xcc, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x65, 0x40, 0x39, 0x08, 0x09, - 0x0d, 0x0c, 0x0c, 0x15, 0x16, 0x1e, 0x02, 0x1c, 0x1d, 0x1d, 0x02, 0x00, - 0x1b, 0x10, 0x21, 0x07, 0x0a, 0x16, 0x09, 0x0a, 0x27, 0x26, 0x1b, 0x00, - 0x10, 0x20, 0x04, 0x19, 0x15, 0x15, 0x1c, 0x19, 0x40, 0x19, 0x12, 0x50, - 0x59, 0x19, 0x16, 0x0f, 0x21, 0x0a, 0x07, 0x04, 0x05, 0x0d, 0x0d, 0x05, - 0x05, 0x23, 0x50, 0x59, 0x08, 0x05, 0x10, 0x00, 0x3f, 0xce, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x12, 0x17, 0x39, 0x3f, 0x2b, 0x00, 0x1a, 0x18, - 0x10, 0xce, 0x33, 0x2f, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x37, 0x26, 0x11, 0x10, 0x12, 0x33, 0x32, 0x17, 0x13, 0x33, 0x03, - 0x16, 0x17, 0x07, 0x26, 0x27, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, - 0x0e, 0x01, 0x23, 0x22, 0x27, 0x03, 0x23, 0x01, 0x14, 0x17, 0x01, 0x26, - 0x23, 0x22, 0x06, 0xef, 0x98, 0xf0, 0xe0, 0x49, 0x3c, 0xb2, 0x8e, 0xc9, - 0x81, 0x20, 0xb9, 0x0b, 0x22, 0xfe, 0xbe, 0x37, 0x51, 0x60, 0x81, 0x0f, - 0xb6, 0x15, 0xe0, 0xac, 0x74, 0x58, 0xc5, 0x8e, 0x01, 0x09, 0x2d, 0x01, - 0x30, 0x22, 0x2c, 0x8f, 0x80, 0x59, 0x90, 0x01, 0x35, 0x01, 0x11, 0x01, - 0x1f, 0x10, 0x01, 0x8e, 0xfe, 0x3d, 0x56, 0xa8, 0x0e, 0x44, 0x2e, 0xfd, - 0x2e, 0x23, 0x68, 0x6c, 0x0c, 0x9c, 0xba, 0x25, 0xfe, 0x46, 0x03, 0xcb, - 0xb0, 0x65, 0x02, 0xaa, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1a, - 0x00, 0x00, 0x04, 0x2f, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x3f, 0x40, 0x1f, - 0x04, 0x08, 0x08, 0x0d, 0x01, 0x06, 0x0b, 0x09, 0x0b, 0x09, 0x0e, 0x0f, - 0x07, 0x0d, 0x00, 0x0d, 0x5f, 0x59, 0x04, 0x00, 0x00, 0x0b, 0x02, 0x0b, - 0x08, 0x5f, 0x59, 0x0b, 0x12, 0x02, 0x03, 0x00, 0x3f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x32, 0x32, 0x32, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x23, 0x1a, 0x8e, 0xbf, 0x01, 0x8f, 0xfe, 0x71, 0x02, 0xc8, - 0xfc, 0x79, 0x8e, 0x03, 0x2a, 0x02, 0x57, 0xfd, 0xa9, 0x9c, 0xfe, 0x0e, - 0x9c, 0x02, 0x8e, 0x00, 0x00, 0x02, 0x00, 0x2e, 0xff, 0x95, 0x04, 0xb4, - 0x05, 0xea, 0x00, 0x10, 0x00, 0x13, 0x00, 0x4c, 0x40, 0x29, 0x0c, 0x11, - 0x02, 0x02, 0x12, 0x00, 0x0d, 0x07, 0x03, 0x05, 0x06, 0x0a, 0x06, 0x03, - 0x0d, 0x04, 0x15, 0x14, 0x0e, 0x00, 0x5f, 0x59, 0x0e, 0x13, 0x09, 0x0a, - 0x09, 0x5f, 0x59, 0x11, 0x01, 0x07, 0x04, 0x04, 0x03, 0x0c, 0x0a, 0x03, - 0x06, 0x03, 0x12, 0x00, 0x3f, 0xc4, 0x3f, 0xc6, 0x12, 0x17, 0x39, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, - 0x09, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x21, 0x35, 0x21, - 0x37, 0x33, 0x07, 0x33, 0x15, 0x01, 0x13, 0x23, 0x04, 0x11, 0xfe, 0xbf, - 0xbe, 0xfe, 0xbf, 0xa2, 0x01, 0xe3, 0xfe, 0x1c, 0x03, 0xa0, 0x41, 0xa2, - 0x40, 0x43, 0xfe, 0x1c, 0x9f, 0x9f, 0x04, 0xe5, 0xfd, 0xf3, 0xfd, 0x28, - 0x01, 0xa1, 0xfd, 0xf4, 0x03, 0x15, 0x02, 0x3b, 0x9c, 0x69, 0x69, 0x9c, - 0xfe, 0xfc, 0x01, 0x04, 0x00, 0x01, 0x00, 0x47, 0xfe, 0x56, 0x03, 0xb6, - 0x04, 0x4b, 0x00, 0x3b, 0x00, 0x52, 0x40, 0x29, 0x2c, 0x0d, 0x0d, 0x1e, - 0x00, 0x05, 0x33, 0x33, 0x17, 0x26, 0x00, 0x26, 0x3d, 0x3c, 0x1e, 0x33, - 0x03, 0x29, 0x29, 0x30, 0x50, 0x59, 0x2d, 0x29, 0x10, 0x0c, 0x03, 0x10, - 0x10, 0x09, 0x50, 0x59, 0x10, 0x03, 0x03, 0x1b, 0x50, 0x59, 0x18, 0x03, - 0x16, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x27, 0x17, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, - 0x26, 0x27, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x2f, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x1e, - 0x03, 0x03, 0xb6, 0xe7, 0xd0, 0x21, 0x46, 0xc3, 0x1b, 0x45, 0x1b, 0x22, - 0x36, 0x1d, 0x60, 0x38, 0x67, 0x38, 0x9a, 0x7e, 0x8d, 0x49, 0x43, 0x4d, - 0x0f, 0x85, 0x39, 0x85, 0x75, 0x89, 0x7f, 0x58, 0x62, 0x81, 0x9b, 0x83, - 0x4a, 0xd3, 0xca, 0xb3, 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, 0x74, - 0x30, 0x5e, 0x97, 0x8f, 0x7e, 0x49, 0x28, 0x01, 0x2b, 0x99, 0xa6, 0x0a, - 0xd2, 0x1d, 0x18, 0x1c, 0x21, 0x71, 0x3b, 0x2a, 0x9a, 0xa5, 0x52, 0x54, - 0x61, 0x17, 0x57, 0x58, 0x3d, 0x54, 0x54, 0x40, 0x50, 0x1a, 0x22, 0x28, - 0x4d, 0x6e, 0x50, 0x94, 0x9b, 0x7e, 0x8b, 0x14, 0x48, 0x4d, 0x4a, 0x4b, - 0x2e, 0x3c, 0x2a, 0x25, 0x24, 0x3d, 0x4a, 0x61, 0x00, 0x01, 0x00, 0x31, - 0xfe, 0x56, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x1d, 0x00, 0x3b, 0x40, 0x1e, - 0x1a, 0x00, 0x17, 0x19, 0x0b, 0x1d, 0x17, 0x1d, 0x1e, 0x1f, 0x1b, 0x1a, - 0x50, 0x59, 0x1b, 0x0f, 0x0a, 0x0e, 0x0e, 0x08, 0x50, 0x59, 0x0e, 0x17, - 0x17, 0x00, 0x50, 0x59, 0x17, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, - 0xc4, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x37, 0x32, 0x1e, - 0x01, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0x23, - 0x22, 0x2e, 0x01, 0x2f, 0x01, 0x2e, 0x01, 0x2b, 0x01, 0x35, 0x01, 0x21, - 0x35, 0x21, 0x15, 0xfb, 0x3e, 0x51, 0x42, 0x44, 0xaa, 0x1d, 0x32, 0x20, - 0x34, 0x3c, 0x60, 0x38, 0x67, 0x38, 0x31, 0x4e, 0x45, 0x3a, 0xa0, 0x25, - 0x44, 0x4e, 0x9c, 0x02, 0x95, 0xfd, 0x93, 0x03, 0x38, 0x8b, 0x15, 0x2f, - 0x50, 0xc9, 0x23, 0x1c, 0x44, 0x71, 0x3b, 0x31, 0x1e, 0x38, 0x47, 0xc1, - 0x2c, 0x20, 0x8b, 0x03, 0x24, 0x8b, 0x89, 0x00, 0x00, 0x01, 0x00, 0x33, - 0x00, 0x00, 0x04, 0x4c, 0x05, 0x96, 0x00, 0x16, 0x00, 0x38, 0x40, 0x1d, - 0x05, 0x12, 0x16, 0x00, 0x0b, 0x0c, 0x0c, 0x00, 0x12, 0x03, 0x18, 0x17, - 0x03, 0x15, 0x60, 0x59, 0x03, 0x03, 0x00, 0x0b, 0x0f, 0x0f, 0x08, 0x60, - 0x59, 0x0f, 0x04, 0x00, 0x12, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x12, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x16, 0x33, 0x20, 0x11, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x24, 0x33, 0x20, 0x00, - 0x11, 0x14, 0x02, 0x07, 0x11, 0x01, 0xbd, 0x34, 0x4b, 0x01, 0x54, 0xad, - 0xb4, 0x84, 0xa9, 0x1a, 0xb5, 0x24, 0x01, 0x09, 0xd3, 0x01, 0x05, 0x01, - 0x14, 0xff, 0xdc, 0x02, 0x18, 0x0e, 0x01, 0x80, 0xc6, 0xb9, 0x75, 0x76, - 0x1d, 0xa5, 0xb6, 0xfe, 0xf5, 0xfe, 0xfb, 0xea, 0xfe, 0xe8, 0x08, 0xfe, - 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x03, 0x50, - 0x04, 0x4e, 0x00, 0x14, 0x00, 0x3c, 0x40, 0x1f, 0x09, 0x0a, 0x14, 0x00, - 0x04, 0x10, 0x10, 0x00, 0x0a, 0x03, 0x15, 0x16, 0x01, 0x13, 0x51, 0x59, - 0x01, 0x01, 0x00, 0x0d, 0x09, 0x09, 0x0d, 0x0d, 0x07, 0x50, 0x59, 0x0d, - 0x10, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x07, 0x11, 0x01, 0x62, 0x8f, 0xa3, 0x6d, 0x7f, 0xbf, 0x1c, 0xb9, - 0x1a, 0xd7, 0xa3, 0xcd, 0xdb, 0xa3, 0x97, 0x01, 0xb0, 0x90, 0x7b, 0x85, - 0x81, 0xc4, 0x0e, 0x96, 0xad, 0xd2, 0xc3, 0x8f, 0xca, 0x26, 0xfe, 0xc6, - 0x00, 0x03, 0x00, 0x21, 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x00, 0x11, - 0x00, 0x1d, 0x00, 0x26, 0x00, 0x69, 0x40, 0x35, 0x08, 0x18, 0x23, 0x1e, - 0x05, 0x05, 0x12, 0x0b, 0x23, 0x16, 0x1a, 0x1a, 0x11, 0x01, 0x0f, 0x0b, - 0x0f, 0x28, 0x27, 0x08, 0x23, 0x15, 0x19, 0x11, 0x00, 0x11, 0x60, 0x59, - 0x16, 0x00, 0x00, 0x15, 0x0f, 0x23, 0x15, 0x5f, 0x59, 0x23, 0x23, 0x0f, - 0x02, 0x0f, 0x1a, 0x5f, 0x59, 0x0f, 0x12, 0x02, 0x22, 0x5f, 0x59, 0x02, - 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x39, 0x31, 0x30, 0x13, 0x33, 0x11, 0x21, 0x20, 0x11, 0x14, 0x06, 0x07, - 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x23, 0x25, 0x34, 0x29, - 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x32, 0x36, 0x03, 0x34, 0x26, - 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x21, 0x87, 0x02, 0x00, 0x01, 0xf0, - 0x8c, 0x80, 0xa8, 0xb6, 0xfe, 0xee, 0xf4, 0xfd, 0xc4, 0x87, 0x04, 0x08, - 0xfe, 0xa2, 0xfe, 0x9c, 0x01, 0x5c, 0xfe, 0xa4, 0x01, 0x73, 0xaf, 0xa0, - 0x51, 0x9c, 0x94, 0xfe, 0xbf, 0x01, 0x41, 0x99, 0x97, 0x01, 0xda, 0x03, - 0xa7, 0xfe, 0xaa, 0x7d, 0xaa, 0x1d, 0x14, 0xb9, 0x8d, 0xbc, 0xd1, 0x01, - 0x55, 0x47, 0xf9, 0xbb, 0x85, 0xbc, 0x82, 0x02, 0xf9, 0x72, 0x62, 0xfe, - 0x42, 0x73, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0xff, 0xec, 0x05, 0x9e, - 0x05, 0x81, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x4d, 0x40, 0x26, 0x04, 0x1d, - 0x1d, 0x16, 0x01, 0x14, 0x05, 0x1a, 0x1a, 0x0a, 0x08, 0x0c, 0x14, 0x0c, - 0x20, 0x21, 0x1c, 0x0b, 0x16, 0x00, 0x16, 0x5f, 0x59, 0x08, 0x04, 0x00, - 0x00, 0x10, 0x02, 0x10, 0x17, 0x5f, 0x59, 0x10, 0x13, 0x06, 0x02, 0x03, - 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, - 0x23, 0x15, 0x14, 0x06, 0x04, 0x23, 0x22, 0x24, 0x26, 0x3d, 0x01, 0x23, - 0x01, 0x32, 0x36, 0x3d, 0x01, 0x21, 0x15, 0x14, 0x16, 0x29, 0x75, 0xbf, - 0x03, 0x0e, 0xbe, 0x75, 0x75, 0x91, 0xfe, 0xf7, 0xb4, 0xad, 0xfe, 0xfe, - 0x8e, 0x75, 0x02, 0xb1, 0xbe, 0xd3, 0xfc, 0xf2, 0xc4, 0x03, 0x29, 0x02, - 0x58, 0xfd, 0xa8, 0x02, 0x58, 0xfd, 0xa8, 0x99, 0x7e, 0xab, 0xf8, 0x83, - 0x7e, 0xf0, 0xa6, 0x90, 0xfd, 0xf7, 0xcf, 0xc7, 0x73, 0x80, 0xc1, 0xc8, - 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x05, 0x4d, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x38, 0x40, 0x1f, 0x03, 0x02, 0x01, 0x00, 0x05, 0x07, 0x08, 0x08, - 0x05, 0x02, 0x03, 0x0a, 0x09, 0x6f, 0x0a, 0x01, 0x30, 0x0a, 0x01, 0x2f, - 0x0a, 0x01, 0x00, 0x0a, 0x01, 0x05, 0x03, 0x08, 0x12, 0x00, 0x03, 0x00, - 0x3f, 0x3f, 0x33, 0x39, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, - 0x01, 0x23, 0x01, 0x27, 0x07, 0x01, 0x23, 0x02, 0x48, 0xc6, 0x02, 0x3f, - 0xc9, 0xfe, 0x7a, 0x54, 0x54, 0xfe, 0x7c, 0xc9, 0x05, 0x81, 0xfa, 0x7f, - 0x03, 0xe0, 0xf9, 0xf9, 0xfc, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, - 0xff, 0x20, 0x04, 0xfe, 0x06, 0x12, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, - 0x00, 0x94, 0x40, 0x55, 0x0c, 0x08, 0x10, 0x01, 0x19, 0x1a, 0x15, 0x16, - 0x05, 0x06, 0x00, 0x06, 0x05, 0x14, 0x18, 0x18, 0x02, 0x13, 0x00, 0x00, - 0x02, 0x02, 0x05, 0x10, 0x03, 0x1d, 0x1c, 0x11, 0x10, 0x5f, 0x59, 0x11, - 0x12, 0x08, 0x09, 0x5f, 0x59, 0x05, 0x40, 0x08, 0x03, 0x0c, 0x0d, 0x5f, - 0x59, 0x0c, 0x0c, 0x14, 0x14, 0x1b, 0x5f, 0x59, 0x8f, 0x14, 0x01, 0xba, - 0x14, 0x01, 0x79, 0x14, 0x89, 0x14, 0x02, 0x0f, 0x14, 0x01, 0x08, 0x03, - 0x14, 0x14, 0x03, 0x02, 0x03, 0x17, 0x5f, 0x59, 0x03, 0x03, 0x02, 0x18, - 0x5f, 0x59, 0x00, 0x02, 0x12, 0x00, 0x3f, 0xce, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, - 0x71, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, - 0xcc, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x17, 0x37, 0x23, 0x11, 0x21, 0x37, - 0x33, 0x07, 0x33, 0x15, 0x23, 0x03, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, - 0x21, 0x07, 0x03, 0x21, 0x13, 0x21, 0x11, 0x33, 0x13, 0x21, 0xe6, 0x6b, - 0xa9, 0x03, 0x4c, 0x46, 0x8e, 0x46, 0x53, 0x9d, 0xd9, 0x01, 0x3a, 0xfe, - 0x7c, 0xeb, 0x02, 0xd4, 0xfc, 0xe2, 0x6b, 0x0e, 0x01, 0x6a, 0xd9, 0xfd, - 0xbd, 0x35, 0xeb, 0xfe, 0xe0, 0xe0, 0xe0, 0x05, 0x81, 0x91, 0x91, 0x9c, - 0xfe, 0x3c, 0x9a, 0xfe, 0x15, 0x9c, 0xe0, 0x04, 0x01, 0x01, 0xc4, 0xfb, - 0xb7, 0x01, 0xeb, 0x00, 0x00, 0x04, 0x00, 0x44, 0xfe, 0x58, 0x04, 0x26, - 0x05, 0xcc, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x89, - 0x40, 0x4a, 0x15, 0x16, 0x16, 0x27, 0x0d, 0x01, 0x10, 0x1c, 0x0f, 0x08, - 0x29, 0x0b, 0x07, 0x0a, 0x00, 0x0a, 0x09, 0x22, 0x23, 0x23, 0x03, 0x1b, - 0x00, 0x00, 0x03, 0x03, 0x09, 0x0d, 0x03, 0x2c, 0x2b, 0x1b, 0x1b, 0x22, - 0x23, 0x50, 0x59, 0x22, 0x22, 0x2a, 0x15, 0x15, 0x0f, 0x18, 0x2a, 0x0f, - 0x50, 0x59, 0x2a, 0x2a, 0x06, 0x1a, 0x01, 0x10, 0x03, 0x25, 0x25, 0x18, - 0x18, 0x12, 0x50, 0x59, 0x18, 0x16, 0x29, 0x1f, 0x06, 0x1f, 0x50, 0x59, - 0x0b, 0x09, 0x06, 0x10, 0x00, 0x3f, 0xce, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x17, 0x39, 0x12, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x33, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x1b, 0x01, 0x26, 0x11, 0x10, 0x12, 0x33, - 0x32, 0x17, 0x13, 0x33, 0x03, 0x16, 0x11, 0x15, 0x21, 0x03, 0x16, 0x33, - 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x27, 0x03, 0x01, 0x13, 0x26, - 0x23, 0x22, 0x06, 0x0f, 0x01, 0x14, 0x17, 0x13, 0x25, 0x26, 0x27, 0x07, - 0x44, 0xd8, 0xc5, 0xfb, 0xe9, 0x5e, 0x4a, 0xb5, 0x8e, 0xcd, 0xbf, 0xfe, - 0x58, 0xa4, 0x34, 0x42, 0x75, 0x8d, 0x19, 0x9e, 0x61, 0xfe, 0xa8, 0x60, - 0x50, 0xbf, 0x01, 0x4c, 0x8b, 0x33, 0x3f, 0x83, 0x99, 0x06, 0x02, 0x4d, - 0x81, 0x01, 0x7c, 0x0d, 0x3c, 0x67, 0xfe, 0x58, 0x01, 0xe3, 0x87, 0x01, - 0x62, 0x01, 0x0c, 0x01, 0x1e, 0x16, 0x01, 0x94, 0xfe, 0x34, 0x88, 0xfe, - 0x97, 0x18, 0xfe, 0x90, 0x14, 0x5e, 0x48, 0x2d, 0xff, 0x00, 0x17, 0xfe, - 0x55, 0x04, 0x29, 0x01, 0x36, 0x12, 0xaf, 0x99, 0x8a, 0xbc, 0x64, 0x01, - 0x20, 0x8a, 0x97, 0x51, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, - 0xff, 0xec, 0x03, 0xef, 0x05, 0x81, 0x00, 0x18, 0x00, 0x52, 0x40, 0x29, - 0x10, 0x03, 0x18, 0x18, 0x0f, 0x0a, 0x01, 0x16, 0x16, 0x08, 0x06, 0x0a, - 0x0f, 0x0a, 0x19, 0x1a, 0x09, 0x18, 0x00, 0x18, 0x5f, 0x59, 0x06, 0x00, - 0x00, 0x0d, 0x04, 0x0d, 0x13, 0x5f, 0x59, 0x10, 0x10, 0x0d, 0x13, 0x04, - 0x03, 0x5f, 0x59, 0x04, 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x21, 0x11, 0x21, - 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, 0x23, 0x20, 0x03, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x21, 0x01, 0xa4, 0x01, - 0x06, 0xfe, 0xf1, 0x01, 0xcd, 0x87, 0x87, 0xde, 0xc1, 0xfe, 0x9a, 0x43, - 0xbb, 0x12, 0x7e, 0x5f, 0x68, 0x78, 0xfe, 0xfa, 0x03, 0x29, 0x01, 0xbc, - 0x9c, 0xfd, 0xa8, 0x98, 0xed, 0xcd, 0xeb, 0x01, 0x72, 0x1f, 0x74, 0x82, - 0x8f, 0x8a, 0xf1, 0x00, 0x00, 0x02, 0xff, 0xce, 0xfe, 0x57, 0x01, 0xac, - 0x05, 0xcc, 0x00, 0x14, 0x00, 0x18, 0x00, 0x4c, 0x40, 0x27, 0x10, 0x19, - 0x04, 0x15, 0x12, 0x0e, 0x0e, 0x18, 0x02, 0x00, 0x04, 0x04, 0x1a, 0x09, - 0x19, 0x16, 0x15, 0x53, 0x59, 0x16, 0x00, 0x03, 0x10, 0x11, 0x10, 0x50, - 0x59, 0x00, 0x11, 0x11, 0x07, 0x13, 0x0f, 0x07, 0x0b, 0x50, 0x59, 0x07, - 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, - 0x01, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x17, - 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x27, 0x35, 0x33, - 0x15, 0x01, 0x3d, 0x6f, 0x6f, 0x78, 0x78, 0x4d, 0x32, 0x3e, 0x45, 0x38, - 0x70, 0x70, 0xb4, 0xb4, 0xb4, 0x02, 0x69, 0x85, 0xfd, 0x96, 0x99, 0x8a, - 0x09, 0x8b, 0x06, 0x48, 0x68, 0x02, 0x4f, 0x85, 0x01, 0xd1, 0xe6, 0xac, - 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x61, 0xfe, 0x57, 0x06, 0x06, - 0x05, 0x96, 0x00, 0x18, 0x00, 0x23, 0x00, 0x44, 0x40, 0x22, 0x1b, 0x0b, - 0x0b, 0x05, 0x00, 0x21, 0x11, 0x00, 0x11, 0x25, 0x24, 0x0c, 0x16, 0x0e, - 0x17, 0x03, 0x14, 0x1e, 0x5f, 0x59, 0x14, 0x04, 0x08, 0x03, 0x5f, 0x59, - 0x08, 0x0e, 0x0e, 0x19, 0x5f, 0x59, 0x0e, 0x13, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x10, 0xc4, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, - 0x23, 0x22, 0x26, 0x3d, 0x01, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, - 0x21, 0x32, 0x17, 0x37, 0x33, 0x01, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, - 0x00, 0x11, 0x10, 0x00, 0x05, 0x35, 0x38, 0x37, 0x33, 0x2f, 0x3a, 0x4e, - 0x83, 0x85, 0xb6, 0xaa, 0xfe, 0xb9, 0xfe, 0x92, 0x01, 0x72, 0x01, 0x4a, - 0xc3, 0xa0, 0x96, 0x1f, 0xfd, 0xe1, 0xea, 0x76, 0x73, 0xe6, 0xf1, 0xfe, - 0xf7, 0x01, 0x0b, 0x73, 0x51, 0x43, 0x0e, 0xa2, 0x0e, 0x97, 0x91, 0xc8, - 0x5b, 0x01, 0x86, 0x01, 0x55, 0x01, 0x52, 0x01, 0x7d, 0x4d, 0x38, 0xfb, - 0x04, 0x67, 0x03, 0xad, 0x64, 0xfe, 0xd7, 0xfe, 0xf3, 0xfe, 0xf1, 0xfe, - 0xcd, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0xae, - 0x04, 0x4e, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x49, 0x40, 0x26, 0x21, 0x0e, - 0x01, 0x20, 0x20, 0x1a, 0x15, 0x27, 0x08, 0x15, 0x08, 0x2e, 0x2d, 0x1d, - 0x18, 0x50, 0x59, 0x1d, 0x1b, 0x01, 0x02, 0x02, 0x0e, 0x05, 0x11, 0x10, - 0x0a, 0x24, 0x50, 0x59, 0x0a, 0x10, 0x05, 0x2a, 0x50, 0x59, 0x05, 0x16, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, 0x25, 0x37, 0x23, - 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, - 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x15, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x35, 0x04, 0x02, 0x36, 0x9e, - 0x7f, 0xce, 0xc0, 0x01, 0x8e, 0x7b, 0xa0, 0x36, 0x02, 0x08, 0x04, 0xad, - 0x07, 0x38, 0x37, 0x26, 0x30, 0x32, 0x4a, 0x7c, 0x81, 0x8a, 0x97, 0x89, - 0x78, 0x79, 0x86, 0x99, 0x8a, 0x31, 0x81, 0x6b, 0x5b, 0x01, 0x16, 0x01, - 0x16, 0x02, 0x36, 0x57, 0x65, 0x1e, 0x93, 0x05, 0x3b, 0xec, 0xfc, 0x6c, - 0x51, 0x43, 0x0c, 0xa2, 0x0c, 0x95, 0x93, 0x02, 0xab, 0xd3, 0xcc, 0xcc, - 0xdf, 0xe3, 0xc4, 0xda, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x68, - 0x05, 0x81, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x4f, 0x40, 0x27, 0x00, 0x11, - 0x11, 0x12, 0x10, 0x01, 0x0d, 0x17, 0x17, 0x03, 0x03, 0x08, 0x06, 0x04, - 0x0d, 0x04, 0x1c, 0x1b, 0x10, 0x02, 0x06, 0x07, 0x06, 0x5f, 0x59, 0x17, - 0x07, 0x07, 0x04, 0x09, 0x09, 0x16, 0x5f, 0x59, 0x09, 0x03, 0x00, 0x04, - 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x32, 0x32, 0x11, - 0x33, 0x31, 0x30, 0x21, 0x01, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, - 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x03, 0x34, 0x26, - 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, 0x8c, 0xfe, 0x92, 0xfe, 0x49, - 0xbf, 0xa8, 0xa8, 0x02, 0x97, 0xee, 0x01, 0x03, 0xb7, 0xa1, 0x01, 0x90, - 0xf8, 0xa7, 0x9d, 0xfe, 0x3b, 0x01, 0xcd, 0x97, 0xa5, 0x02, 0x49, 0xfd, - 0xb7, 0x02, 0x49, 0x96, 0x02, 0xa2, 0xd5, 0xbe, 0x9d, 0xd6, 0x1c, 0xfd, - 0xa1, 0x03, 0xec, 0x7b, 0x81, 0xfd, 0xf8, 0x8d, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x19, 0x00, 0x45, 0x40, 0x23, - 0x15, 0x0a, 0x19, 0x19, 0x17, 0x10, 0x05, 0x04, 0x02, 0x00, 0x10, 0x00, - 0x1b, 0x1a, 0x0e, 0x13, 0x53, 0x59, 0x0e, 0x10, 0x18, 0x02, 0x03, 0x02, - 0x50, 0x59, 0x15, 0x0a, 0x07, 0x03, 0x03, 0x07, 0x0f, 0x00, 0x15, 0x00, - 0x3f, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x12, - 0x39, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, - 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, - 0x15, 0x26, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x11, 0x8e, 0x7a, 0x7a, - 0x06, 0xaa, 0x08, 0x04, 0x2b, 0x70, 0x66, 0x24, 0x25, 0x24, 0x3c, 0xce, - 0x16, 0xb5, 0xb7, 0x01, 0xe6, 0x92, 0xc6, 0x72, 0x8a, 0xb8, 0x25, 0x8b, - 0x66, 0x0a, 0xa5, 0x0a, 0xfe, 0xcf, 0x92, 0xfe, 0x1a, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x05, 0x81, 0x00, 0x11, - 0x00, 0x14, 0x00, 0x44, 0x40, 0x24, 0x02, 0x05, 0x06, 0x00, 0x13, 0x12, - 0x14, 0x0b, 0x05, 0x11, 0x09, 0x0c, 0x0c, 0x06, 0x11, 0x03, 0x16, 0x15, - 0x14, 0x03, 0x09, 0x0a, 0x09, 0x60, 0x59, 0x0e, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x10, 0x0c, 0x03, 0x06, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x39, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, - 0x01, 0x33, 0x15, 0x23, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x35, 0x33, - 0x27, 0x33, 0x17, 0x21, 0x37, 0x33, 0x01, 0x13, 0x21, 0x04, 0x91, 0x93, - 0xf3, 0xfe, 0xd8, 0xbe, 0xfe, 0xd9, 0xf2, 0x92, 0x97, 0xd2, 0x93, 0x02, - 0x32, 0x93, 0xd2, 0xfd, 0x83, 0xbb, 0xfe, 0x88, 0x04, 0x9b, 0x92, 0xfe, - 0x3f, 0xfd, 0xb8, 0x02, 0x48, 0x01, 0xc1, 0x92, 0xe6, 0xe6, 0xe6, 0xfd, - 0x61, 0x01, 0x27, 0x00, 0x00, 0x02, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, - 0x04, 0x3a, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x58, 0x40, 0x2e, 0x01, 0x1b, - 0x10, 0x03, 0x18, 0x10, 0x17, 0x11, 0x05, 0x1a, 0x12, 0x0b, 0x15, 0x1a, - 0x15, 0x24, 0x23, 0x19, 0x0f, 0x17, 0x1e, 0x50, 0x59, 0x17, 0x17, 0x14, - 0x03, 0x11, 0x14, 0x11, 0x50, 0x59, 0x00, 0x1b, 0x10, 0x14, 0x14, 0x08, - 0x16, 0x0f, 0x08, 0x0d, 0x50, 0x59, 0x08, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x33, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, - 0x01, 0x33, 0x15, 0x23, 0x03, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x35, 0x16, - 0x33, 0x32, 0x3f, 0x01, 0x03, 0x23, 0x35, 0x33, 0x03, 0x33, 0x13, 0x21, - 0x13, 0x33, 0x01, 0x3f, 0x01, 0x21, 0x17, 0x1e, 0x02, 0x03, 0x79, 0x6f, - 0xa7, 0xe5, 0x43, 0x74, 0x8d, 0x59, 0x4a, 0x32, 0x26, 0x2e, 0xa8, 0x62, - 0x11, 0xeb, 0xa2, 0x68, 0x88, 0xc0, 0x82, 0x01, 0x82, 0x75, 0xbe, 0xfe, - 0x0f, 0x46, 0x46, 0xfe, 0xe7, 0x2b, 0x05, 0x0e, 0x4c, 0x02, 0xe5, 0x92, - 0xfd, 0xad, 0xad, 0xa9, 0x53, 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0x02, 0x4e, - 0x92, 0x01, 0x55, 0xfe, 0xab, 0x01, 0x55, 0xfc, 0x8a, 0xc5, 0xca, 0x6f, - 0x0e, 0x27, 0xde, 0x00, 0x00, 0x02, 0x00, 0x01, 0xff, 0xec, 0x04, 0x1d, - 0x04, 0x4e, 0x00, 0x23, 0x00, 0x30, 0x00, 0x57, 0x40, 0x2e, 0x29, 0x20, - 0x08, 0x08, 0x14, 0x0e, 0x0f, 0x0f, 0x2e, 0x03, 0x03, 0x14, 0x1a, 0x03, - 0x31, 0x32, 0x1d, 0x18, 0x51, 0x59, 0x1d, 0x10, 0x29, 0x07, 0x51, 0x59, - 0x21, 0x29, 0x29, 0x00, 0x11, 0x0e, 0x0e, 0x11, 0x11, 0x0b, 0x50, 0x59, - 0x11, 0x16, 0x00, 0x24, 0x50, 0x59, 0x00, 0x10, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, - 0x39, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, - 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, - 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x17, - 0x22, 0x0e, 0x01, 0x1d, 0x01, 0x37, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x02, - 0xd6, 0xa3, 0xa4, 0xe5, 0xee, 0xf3, 0x70, 0x78, 0x7b, 0x6d, 0x0a, 0xbc, - 0x2e, 0xfe, 0x7c, 0xcc, 0xce, 0x2a, 0x3b, 0x1a, 0x21, 0x44, 0x47, 0x64, - 0x5b, 0x06, 0x06, 0x40, 0xb9, 0x5d, 0x63, 0x9a, 0x59, 0xc5, 0x7f, 0x83, - 0x46, 0x5f, 0x04, 0x4e, 0xac, 0x96, 0xad, 0xb1, 0x04, 0x04, 0x3b, 0x84, - 0x72, 0x54, 0x58, 0x11, 0xfe, 0xdc, 0xbb, 0xb1, 0x01, 0xd2, 0x50, 0x51, - 0x07, 0x70, 0x10, 0x69, 0x70, 0x78, 0x6b, 0x87, 0x5a, 0x9d, 0x53, 0x59, - 0x04, 0x02, 0x30, 0x63, 0x52, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xff, 0xec, 0x03, 0xef, 0x04, 0x4e, 0x00, 0x16, 0x00, 0x22, 0x00, 0x3e, - 0x40, 0x1f, 0x0d, 0x00, 0x1d, 0x1d, 0x10, 0x17, 0x06, 0x10, 0x06, 0x24, - 0x23, 0x13, 0x15, 0x0e, 0x0f, 0x0b, 0x00, 0x08, 0x03, 0x08, 0x20, 0x50, - 0x59, 0x08, 0x10, 0x03, 0x1a, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, - 0x16, 0x17, 0x33, 0x27, 0x35, 0x33, 0x11, 0x14, 0x17, 0x23, 0x2e, 0x01, - 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x03, 0x35, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, - 0x32, 0x02, 0x02, 0xb4, 0x06, 0xac, 0x03, 0x07, 0xfd, 0xda, 0x78, 0x87, - 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, - 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0x2f, 0xfc, 0xa5, 0xa9, 0x36, 0x10, - 0x74, 0x2a, 0x01, 0x70, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, - 0x00, 0x02, 0x00, 0x7e, 0xff, 0xec, 0x04, 0x17, 0x04, 0x4e, 0x00, 0x16, - 0x00, 0x22, 0x00, 0x3e, 0x40, 0x1f, 0x17, 0x06, 0x0d, 0x00, 0x1d, 0x1d, - 0x0f, 0x06, 0x0f, 0x24, 0x23, 0x12, 0x0f, 0x0f, 0x15, 0x00, 0x0b, 0x03, - 0x08, 0x08, 0x20, 0x50, 0x59, 0x08, 0x16, 0x03, 0x1a, 0x50, 0x59, 0x03, - 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, - 0x11, 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, 0x17, 0x15, 0x23, 0x11, 0x34, - 0x27, 0x33, 0x1e, 0x01, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x38, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, - 0xfe, 0x72, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, 0x06, 0xac, 0x03, 0x07, - 0x02, 0x26, 0x78, 0x87, 0x99, 0x8a, 0x89, 0x98, 0x88, 0x79, 0x03, 0x8c, - 0x68, 0x5a, 0xfe, 0xec, 0xfe, 0xe8, 0xfd, 0xca, 0x5a, 0x62, 0x79, 0x2f, - 0x03, 0x5b, 0xa9, 0x36, 0x10, 0x74, 0x2a, 0xfe, 0x90, 0xe3, 0xc4, 0xd4, - 0xdf, 0xd6, 0xc9, 0xc9, 0x00, 0x02, 0x00, 0x84, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xda, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x46, 0x40, 0x25, 0x21, 0x00, - 0x19, 0x05, 0x27, 0x27, 0x0c, 0x0c, 0x13, 0x00, 0x03, 0x2e, 0x2d, 0x1a, - 0x05, 0x1e, 0x02, 0x1e, 0x24, 0x50, 0x59, 0x1e, 0x10, 0x10, 0x15, 0x50, - 0x59, 0x10, 0x01, 0x0a, 0x15, 0x02, 0x2a, 0x50, 0x59, 0x02, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x26, 0x27, - 0x23, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x07, 0x33, 0x3e, 0x01, - 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfe, 0x72, 0x7b, 0xa3, 0x33, 0x02, 0x08, - 0x02, 0xae, 0x06, 0x96, 0x91, 0x42, 0x4f, 0x3a, 0x45, 0x3f, 0x45, 0x05, - 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xbd, 0x78, 0x87, 0x98, 0x8b, 0x88, - 0x99, 0x88, 0x79, 0x02, 0x22, 0xfd, 0xca, 0x59, 0x63, 0x1f, 0x7f, 0x0a, - 0x36, 0xa9, 0x03, 0xd3, 0x8f, 0x99, 0x11, 0xa6, 0x15, 0x4c, 0x48, 0x7f, - 0x99, 0x68, 0x5a, 0xfe, 0xec, 0xfe, 0xe2, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, - 0xcb, 0xc9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0xff, 0xec, 0x03, 0xb0, - 0x04, 0x4e, 0x00, 0x19, 0x00, 0x36, 0x40, 0x1b, 0x06, 0x07, 0x07, 0x13, - 0x00, 0x0d, 0x13, 0x0d, 0x1a, 0x1b, 0x10, 0x17, 0x50, 0x59, 0x14, 0x14, - 0x10, 0x16, 0x06, 0x06, 0x0a, 0x0a, 0x03, 0x50, 0x59, 0x0a, 0x10, 0x00, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, - 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x02, 0xf4, 0x81, 0x8e, 0x69, 0x72, 0x0e, 0xb9, 0x1d, 0xd9, - 0xa7, 0xe0, 0xf0, 0xef, 0xe3, 0xab, 0xe1, 0x15, 0xb6, 0x0f, 0x81, 0x60, - 0x8a, 0x87, 0x02, 0x22, 0xe2, 0xbd, 0x6a, 0x5a, 0x0e, 0x97, 0xac, 0xfe, - 0xe1, 0xfe, 0xef, 0xfe, 0xed, 0xfe, 0xe1, 0xba, 0x9c, 0x0c, 0x6c, 0x68, - 0xd1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4d, 0xff, 0xa4, 0x03, 0xc5, - 0x04, 0x4e, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x64, 0x40, 0x38, 0x16, 0x05, - 0x09, 0x10, 0x0f, 0x0f, 0x24, 0x1c, 0x1c, 0x2a, 0x18, 0x02, 0x07, 0x09, - 0x06, 0x2c, 0x2d, 0x18, 0x2a, 0x07, 0x02, 0x04, 0x04, 0x1a, 0x1a, 0x27, - 0x50, 0x59, 0x10, 0x0c, 0x0f, 0x1a, 0x1f, 0x1a, 0x02, 0x09, 0x03, 0x1a, - 0x1a, 0x00, 0x0c, 0x0c, 0x13, 0x50, 0x59, 0x0c, 0x10, 0x04, 0x04, 0x00, - 0x00, 0x20, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x12, 0x39, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x05, 0x22, 0x27, 0x06, 0x07, 0x27, 0x36, 0x37, 0x26, 0x35, 0x10, 0x12, - 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x17, 0x36, 0x33, 0x20, 0x15, 0x14, 0x0e, 0x01, 0x27, 0x32, 0x3e, 0x01, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x16, 0x02, 0x31, 0xa1, 0x70, - 0x34, 0x23, 0x7c, 0x48, 0x25, 0x63, 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, - 0x0e, 0x72, 0x69, 0x8f, 0x80, 0x22, 0xbf, 0xc6, 0x01, 0x0b, 0x65, 0xb3, - 0x7d, 0x53, 0x71, 0x3d, 0x40, 0x3c, 0x53, 0xa3, 0x40, 0x44, 0x14, 0x4f, - 0x4e, 0x49, 0x5c, 0x74, 0x32, 0x90, 0xe8, 0x01, 0x11, 0x01, 0x1f, 0xac, - 0x97, 0x0e, 0x5a, 0x6a, 0xbe, 0xe1, 0x82, 0x66, 0xc4, 0xe5, 0x58, 0x8e, - 0x47, 0x86, 0x2a, 0x44, 0x29, 0x39, 0x32, 0x67, 0x53, 0x48, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0xae, 0x05, 0xcc, 0x00, 0x1b, - 0x00, 0x27, 0x00, 0x47, 0x40, 0x24, 0x22, 0x13, 0x04, 0x04, 0x16, 0x1c, - 0x0c, 0x16, 0x0c, 0x28, 0x00, 0x29, 0x14, 0x00, 0x11, 0x05, 0x0e, 0x09, - 0x0e, 0x25, 0x50, 0x59, 0x0e, 0x10, 0x09, 0x1f, 0x50, 0x59, 0x09, 0x16, - 0x02, 0x19, 0x50, 0x59, 0x02, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, - 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x31, 0x30, 0x01, 0x06, 0x23, 0x22, 0x19, 0x01, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, - 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x01, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0xae, 0x32, 0x4a, 0xf7, - 0x04, 0x32, 0xa7, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, - 0x02, 0xb4, 0x38, 0x37, 0x26, 0x30, 0xfc, 0x65, 0x78, 0x87, 0x99, 0x8a, - 0x8a, 0x97, 0x88, 0x79, 0xfe, 0x63, 0x0c, 0x01, 0x28, 0x01, 0x2f, 0x68, - 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0x01, 0xc1, - 0xf9, 0xc1, 0x51, 0x43, 0x0c, 0x03, 0x19, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, - 0xc8, 0xc9, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0xd7, - 0x05, 0xda, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x45, 0x40, 0x24, 0x14, 0x06, - 0x25, 0x25, 0x00, 0x1f, 0x0d, 0x00, 0x0d, 0x2b, 0x19, 0x2c, 0x17, 0x1c, - 0x50, 0x59, 0x17, 0x01, 0x12, 0x06, 0x0f, 0x0a, 0x0f, 0x28, 0x50, 0x59, - 0x0f, 0x10, 0x0a, 0x22, 0x50, 0x59, 0x0a, 0x16, 0x03, 0x15, 0x00, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x25, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x35, - 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, - 0x33, 0x27, 0x35, 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, - 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x03, 0xe9, 0x06, 0xac, 0x03, 0x07, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, - 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0x01, 0x1b, 0x41, 0x46, 0x3a, - 0x3b, 0x79, 0xfd, 0x2a, 0x78, 0x87, 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, - 0xdf, 0xa9, 0x36, 0x10, 0x74, 0x2a, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, - 0x02, 0x36, 0x5a, 0x62, 0x79, 0xa7, 0x01, 0x28, 0x0f, 0xa8, 0x15, 0x94, - 0xfd, 0x7a, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x04, 0x4e, 0x00, 0x12, - 0x00, 0x19, 0x00, 0x4b, 0x40, 0x25, 0x13, 0x12, 0x12, 0x06, 0x0c, 0x0b, - 0x0b, 0x19, 0x00, 0x06, 0x00, 0x1b, 0x1a, 0x0c, 0x0c, 0x00, 0x0f, 0x19, - 0x00, 0x50, 0x59, 0x19, 0x19, 0x09, 0x03, 0x09, 0x0f, 0x50, 0x59, 0x09, - 0x16, 0x03, 0x16, 0x50, 0x59, 0x03, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x10, 0x21, 0x32, - 0x12, 0x11, 0x10, 0x02, 0x23, 0x20, 0x03, 0x37, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x35, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x57, 0x01, 0xdd, - 0xe9, 0xfb, 0xfb, 0xf0, 0xfe, 0xa8, 0x61, 0x9e, 0x19, 0x8d, 0x75, 0x93, - 0x9b, 0x02, 0x06, 0x9a, 0x82, 0x87, 0x90, 0x0f, 0x01, 0xf7, 0x18, 0x02, - 0x3f, 0xfe, 0xe2, 0xfe, 0xf4, 0xfe, 0xe6, 0xfe, 0xe2, 0x01, 0x00, 0x2d, - 0x48, 0x5e, 0xc9, 0xbb, 0x8a, 0x9a, 0xae, 0x9d, 0xab, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x04, 0x4e, 0x00, 0x12, - 0x00, 0x19, 0x00, 0x45, 0x40, 0x23, 0x00, 0x19, 0x19, 0x0c, 0x06, 0x07, - 0x07, 0x13, 0x11, 0x0c, 0x11, 0x1b, 0x1a, 0x12, 0x13, 0x50, 0x59, 0x12, - 0x06, 0x12, 0x06, 0x0f, 0x09, 0x0f, 0x16, 0x50, 0x59, 0x0f, 0x16, 0x09, - 0x03, 0x50, 0x59, 0x09, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, - 0x12, 0x11, 0x10, 0x02, 0x23, 0x20, 0x11, 0x35, 0x17, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x37, 0x03, 0x5b, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x61, - 0x01, 0x58, 0xf0, 0xfb, 0xfb, 0xe9, 0xfe, 0x23, 0xba, 0x0f, 0x90, 0x87, - 0x83, 0x99, 0x06, 0x02, 0x43, 0xba, 0xca, 0x5e, 0x48, 0x2d, 0x01, 0x00, - 0xfe, 0xe2, 0xfe, 0xe6, 0xfe, 0xf4, 0xfe, 0xe2, 0x02, 0x3f, 0x18, 0x8a, - 0xab, 0x9d, 0xaf, 0x99, 0x00, 0x02, 0x00, 0x57, 0xff, 0xec, 0x05, 0xe3, - 0x04, 0x4e, 0x00, 0x20, 0x00, 0x28, 0x00, 0x5f, 0x40, 0x32, 0x06, 0x07, - 0x07, 0x21, 0x1f, 0x00, 0x27, 0x27, 0x0b, 0x1a, 0x13, 0x1a, 0x1f, 0x03, - 0x29, 0x2a, 0x10, 0x15, 0x53, 0x59, 0x18, 0x28, 0x00, 0x28, 0x50, 0x59, - 0x06, 0x06, 0x03, 0x20, 0x0b, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1d, 0x09, - 0x1d, 0x24, 0x50, 0x59, 0x1d, 0x16, 0x09, 0x03, 0x50, 0x59, 0x09, 0x10, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x11, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x12, 0x21, 0x20, 0x13, 0x37, 0x17, 0x1e, 0x01, 0x33, - 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x27, 0x16, 0x15, 0x10, 0x02, - 0x23, 0x20, 0x11, 0x35, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x27, - 0x03, 0x4c, 0x1e, 0x92, 0x6f, 0x75, 0x8d, 0x19, 0x9e, 0x61, 0x01, 0x58, - 0x01, 0x7b, 0x58, 0x94, 0x1c, 0x0f, 0x33, 0x32, 0x34, 0x50, 0x3b, 0x7e, - 0x55, 0x63, 0x85, 0x14, 0x04, 0xfb, 0xe9, 0xfe, 0x23, 0xb7, 0x0f, 0x8e, - 0x8c, 0x8b, 0x9e, 0x03, 0x02, 0xd3, 0x7f, 0x75, 0x5e, 0x48, 0x2d, 0x01, - 0x00, 0xfe, 0xa4, 0x1a, 0x81, 0x44, 0x43, 0x28, 0x93, 0x34, 0x90, 0x7e, - 0x28, 0x35, 0xfe, 0xf4, 0xfe, 0xe2, 0x02, 0x3f, 0x18, 0x6f, 0xb8, 0xab, - 0xc7, 0xbc, 0x4f, 0x00, 0x00, 0x01, 0x00, 0x48, 0xff, 0xed, 0x03, 0x76, - 0x04, 0x4e, 0x00, 0x25, 0x00, 0x72, 0x40, 0x41, 0x15, 0x03, 0x0b, 0x11, - 0x05, 0x05, 0x1a, 0x00, 0x0c, 0x0b, 0x0b, 0x1f, 0x20, 0x00, 0x20, 0x26, - 0x27, 0x03, 0x14, 0x17, 0x14, 0x17, 0x50, 0x59, 0x00, 0x1f, 0x10, 0x1f, - 0x60, 0x1f, 0x03, 0x09, 0xaf, 0x14, 0x01, 0x0f, 0x14, 0xcf, 0x14, 0xdf, - 0x14, 0x03, 0x0b, 0x03, 0x1f, 0x14, 0x0c, 0x0c, 0x14, 0x1f, 0x03, 0x23, - 0x08, 0x23, 0x1d, 0x50, 0x59, 0x23, 0x16, 0x08, 0x0e, 0x50, 0x59, 0x08, - 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, - 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x5e, 0x5d, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x13, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0x23, - 0x22, 0x26, 0x48, 0x80, 0x79, 0xdc, 0xc9, 0xb0, 0xa2, 0xca, 0x15, 0xb3, - 0x1f, 0xad, 0x5d, 0x6a, 0x71, 0x5c, 0x5a, 0x60, 0x75, 0x6f, 0x77, 0x69, - 0xd5, 0x14, 0xb1, 0x10, 0xd4, 0xb6, 0xc1, 0xd3, 0x01, 0x21, 0x6f, 0x8a, - 0x14, 0x43, 0xb2, 0x8b, 0xa0, 0xa8, 0x99, 0x10, 0xcc, 0x5a, 0x55, 0x4e, - 0x5c, 0x8d, 0x60, 0x57, 0x58, 0x63, 0xdf, 0x0e, 0xad, 0xa8, 0xa5, 0x00, - 0x00, 0x01, 0x00, 0x35, 0xff, 0xed, 0x03, 0x63, 0x04, 0x4e, 0x00, 0x25, - 0x00, 0x7a, 0x40, 0x46, 0x23, 0x10, 0x1b, 0x15, 0x21, 0x21, 0x0c, 0x00, - 0x1a, 0x1b, 0x1b, 0x07, 0x06, 0x00, 0x06, 0x27, 0x26, 0x00, 0x27, 0x01, - 0x0a, 0x03, 0x23, 0x11, 0x10, 0x11, 0x10, 0x50, 0x59, 0x00, 0x07, 0x10, - 0x07, 0x60, 0x07, 0x03, 0x09, 0xaf, 0x11, 0x01, 0x0f, 0x11, 0xcf, 0x11, - 0xdf, 0x11, 0x03, 0x0b, 0x03, 0x07, 0x11, 0x1a, 0x1a, 0x11, 0x07, 0x03, - 0x03, 0x1e, 0x1e, 0x18, 0x50, 0x59, 0x1e, 0x10, 0x03, 0x09, 0x50, 0x59, - 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x5e, 0x5d, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x03, 0x63, 0xd4, 0xc0, 0xb7, 0xd3, - 0x10, 0xb1, 0x14, 0xd5, 0x6c, 0x74, 0x70, 0x74, 0x60, 0x5a, 0x5d, 0x70, - 0x69, 0x5e, 0xad, 0x1f, 0xb3, 0x15, 0xca, 0xa2, 0xb1, 0xc8, 0xdc, 0x79, - 0x80, 0x01, 0x21, 0x8f, 0xa5, 0xa8, 0xad, 0x0e, 0xdf, 0x5e, 0x5d, 0x57, - 0x60, 0x8d, 0x5c, 0x4e, 0x52, 0x5d, 0xcc, 0x10, 0x98, 0xa9, 0xa2, 0x89, - 0xb2, 0x43, 0x14, 0x8a, 0x00, 0x01, 0x00, 0x35, 0xff, 0xed, 0x05, 0x07, - 0x04, 0x4e, 0x00, 0x33, 0x00, 0x7e, 0x40, 0x47, 0x31, 0x10, 0x1b, 0x23, - 0x15, 0x2f, 0x2f, 0x0c, 0x00, 0x1a, 0x1b, 0x1b, 0x07, 0x06, 0x06, 0x00, - 0x2a, 0x03, 0x35, 0x34, 0x31, 0x11, 0x10, 0x11, 0x10, 0x50, 0x59, 0x26, - 0x2c, 0x53, 0x59, 0x2f, 0x21, 0x21, 0x1a, 0x1e, 0xaf, 0x11, 0x01, 0x0f, - 0x11, 0xcf, 0x11, 0xdf, 0x11, 0x03, 0x0b, 0x03, 0x07, 0x11, 0x26, 0x1a, - 0x1a, 0x26, 0x11, 0x07, 0x04, 0x03, 0x1e, 0x1e, 0x18, 0x50, 0x59, 0x1e, - 0x10, 0x03, 0x09, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, - 0x5f, 0x5e, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x11, 0x33, 0x2b, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x27, - 0x06, 0x07, 0x1e, 0x01, 0x03, 0x63, 0xd4, 0xc0, 0xb7, 0xd3, 0x10, 0xb1, - 0x14, 0xd5, 0x6c, 0x74, 0x70, 0x74, 0x60, 0x5a, 0x5d, 0x70, 0x69, 0x5e, - 0xad, 0x1f, 0xb3, 0x15, 0xca, 0xa2, 0x8a, 0xba, 0x22, 0x89, 0x1c, 0x0f, - 0x2f, 0x32, 0x25, 0x3d, 0x22, 0x3b, 0x7e, 0x55, 0x5b, 0x80, 0x1a, 0x21, - 0xb4, 0x79, 0x80, 0x01, 0x21, 0x8f, 0xa5, 0xa8, 0xad, 0x0e, 0xdf, 0x5e, - 0x5d, 0x57, 0x60, 0x8d, 0x5c, 0x4e, 0x52, 0x5d, 0xcc, 0x10, 0x98, 0xa9, - 0x65, 0x5c, 0x18, 0x81, 0x44, 0x43, 0x17, 0x11, 0x93, 0x34, 0x79, 0x70, - 0x82, 0x37, 0x14, 0x8a, 0x00, 0x02, 0x00, 0x4b, 0xff, 0xed, 0x03, 0xcf, - 0x04, 0x4e, 0x00, 0x15, 0x00, 0x26, 0x00, 0x54, 0x40, 0x2d, 0x00, 0x1e, - 0x0c, 0x16, 0x10, 0x1c, 0x1c, 0x07, 0x21, 0x16, 0x21, 0x27, 0x28, 0x1e, - 0x0c, 0x0b, 0x0c, 0x0b, 0x50, 0x59, 0x0f, 0x0c, 0xcf, 0x0c, 0xdf, 0x0c, - 0x03, 0x0b, 0x03, 0x0c, 0x0c, 0x24, 0x19, 0x24, 0x04, 0x50, 0x59, 0x24, - 0x16, 0x19, 0x13, 0x50, 0x59, 0x19, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x32, 0x31, 0x30, 0x01, 0x14, 0x1e, 0x01, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x10, 0x12, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x02, 0x01, - 0x08, 0x43, 0x7e, 0x72, 0x6c, 0x74, 0x70, 0x74, 0x60, 0x5a, 0x5d, 0x70, - 0x69, 0x5e, 0xa1, 0x8e, 0xbd, 0xf6, 0xe3, 0xbc, 0xd2, 0xdc, 0x79, 0x80, - 0xd4, 0xc0, 0xfb, 0xf5, 0x02, 0x2c, 0x9f, 0xc1, 0x5b, 0x5e, 0x5d, 0x57, - 0x60, 0x8d, 0x5c, 0x4e, 0x52, 0x5d, 0xd1, 0xcc, 0x01, 0x05, 0x01, 0x1d, - 0x9f, 0x8c, 0xb2, 0x43, 0x14, 0x8a, 0x6f, 0x8f, 0xa5, 0x01, 0x20, 0x00, - 0x00, 0x01, 0x00, 0x08, 0xfe, 0x56, 0x02, 0x27, 0x04, 0x3a, 0x00, 0x15, - 0x00, 0x3c, 0x40, 0x20, 0x03, 0x00, 0x00, 0x06, 0x13, 0x15, 0x0d, 0x0d, - 0x13, 0x04, 0x03, 0x17, 0x16, 0x14, 0x15, 0x51, 0x59, 0x14, 0x15, 0x0a, - 0x0f, 0x50, 0x59, 0x0a, 0x06, 0x03, 0x51, 0x59, 0x06, 0x15, 0x01, 0x0f, - 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x37, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x23, 0x35, - 0xdb, 0xb4, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, 0x45, 0x3e, - 0xd3, 0x83, 0x03, 0xb7, 0xfc, 0x49, 0x83, 0x94, 0x94, 0x82, 0x0c, 0x89, - 0x08, 0x46, 0x5c, 0x7b, 0x83, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0xd5, 0x05, 0xda, 0x00, 0x27, 0x00, 0x35, 0x00, 0x54, - 0x40, 0x2c, 0x28, 0x1b, 0x0b, 0x0b, 0x00, 0x06, 0x05, 0x05, 0x2f, 0x13, - 0x00, 0x13, 0x36, 0x22, 0x37, 0x1e, 0x24, 0x50, 0x59, 0x1e, 0x01, 0x19, - 0x0c, 0x16, 0x10, 0x16, 0x2c, 0x50, 0x59, 0x16, 0x10, 0x10, 0x32, 0x50, - 0x59, 0x10, 0x15, 0x02, 0x09, 0x50, 0x59, 0x06, 0x02, 0x1b, 0x00, 0x3f, - 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x25, 0x10, 0x21, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x20, 0x11, - 0x35, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, - 0x16, 0x17, 0x33, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x03, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x03, 0xe9, 0xfe, 0x3b, 0xb1, 0xd2, - 0x1e, 0xb5, 0x12, 0x7b, 0x64, 0x01, 0x0d, 0x02, 0x33, 0xb2, 0x77, 0xc7, - 0xbb, 0xc9, 0xcd, 0x73, 0xa8, 0x2e, 0x02, 0x92, 0x8f, 0x20, 0x26, 0x37, - 0x32, 0x39, 0x40, 0x41, 0xb3, 0x48, 0x83, 0x53, 0x8a, 0x7e, 0x76, 0x8f, - 0x55, 0x84, 0x48, 0x1f, 0xfe, 0x38, 0x8b, 0x80, 0x1a, 0x4b, 0x51, 0x01, - 0x3b, 0xae, 0x68, 0x69, 0x01, 0x08, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x11, - 0x69, 0x61, 0x01, 0x31, 0x91, 0x97, 0x03, 0x0b, 0xa6, 0x12, 0x4e, 0x46, - 0xfd, 0x79, 0x84, 0xbf, 0x65, 0xc8, 0xe0, 0xde, 0xc2, 0x64, 0xbb, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, 0x04, 0x4b, 0x12, 0x06, - 0x00, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5e, 0xff, 0xec, 0x03, 0xef, - 0x04, 0x4e, 0x00, 0x1c, 0x00, 0x45, 0x40, 0x23, 0x15, 0x1c, 0x08, 0x02, - 0x0f, 0x0e, 0x0e, 0x1a, 0x02, 0x08, 0x02, 0x1d, 0x1e, 0x00, 0x1c, 0x50, - 0x59, 0x00, 0x0f, 0x00, 0x0f, 0x05, 0x0b, 0x0b, 0x12, 0x50, 0x59, 0x0b, - 0x10, 0x05, 0x18, 0x50, 0x59, 0x05, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x32, 0x31, 0x30, 0x01, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, - 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x35, 0x23, 0x02, 0x40, 0x01, 0xaf, - 0x4b, 0xd7, 0x7a, 0xf5, 0xff, 0x00, 0xfb, 0xe5, 0xa6, 0xdb, 0x1c, 0xb9, - 0x0e, 0x72, 0x69, 0x99, 0x88, 0x98, 0x9f, 0x83, 0x67, 0xf9, 0x02, 0x1d, - 0xfe, 0x5e, 0x44, 0x4b, 0x01, 0x1e, 0x01, 0x14, 0x01, 0x0e, 0x01, 0x22, - 0xac, 0x97, 0x0e, 0x5a, 0x6a, 0xcd, 0xd2, 0xde, 0xce, 0x43, 0xdb, 0x00, - 0x00, 0x02, 0x00, 0x07, 0xfe, 0x57, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x11, - 0x00, 0x1b, 0x00, 0x41, 0x40, 0x24, 0x02, 0x01, 0x16, 0x06, 0x14, 0x03, - 0x00, 0x04, 0x0e, 0x12, 0x08, 0x04, 0x05, 0x05, 0x08, 0x0e, 0x01, 0x04, - 0x1c, 0x1d, 0x03, 0x06, 0x00, 0x14, 0x04, 0x0b, 0x01, 0x0b, 0x19, 0x50, - 0x59, 0x0b, 0x1b, 0x04, 0x01, 0x0f, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x12, 0x17, 0x39, 0x32, 0x11, 0x33, 0x31, 0x30, 0x25, 0x01, 0x33, - 0x09, 0x01, 0x33, 0x01, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x3e, 0x01, 0x17, 0x34, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x01, 0x90, 0xfe, 0x77, 0xc0, 0x01, 0x35, 0x01, 0x3e, 0xbf, 0xfe, - 0x6c, 0x7f, 0x7d, 0x6b, 0x6a, 0x7d, 0x17, 0x25, 0xf7, 0x4c, 0x4b, 0x27, - 0x24, 0x25, 0x27, 0x96, 0x03, 0xa4, 0xfd, 0x21, 0x02, 0xdf, 0xfc, 0x5d, - 0xde, 0x75, 0x6d, 0x80, 0x80, 0x6d, 0x28, 0x5a, 0x5c, 0xd8, 0x53, 0x88, - 0x8a, 0x51, 0x2e, 0x34, 0x33, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, - 0xff, 0xe8, 0x04, 0xd5, 0x04, 0x41, 0x00, 0x0c, 0x00, 0x38, 0x00, 0x50, - 0x40, 0x2d, 0x09, 0x21, 0x00, 0x1b, 0x10, 0x1b, 0x18, 0x04, 0x34, 0x24, - 0x21, 0x2c, 0x08, 0x39, 0x3a, 0x34, 0x18, 0x24, 0x04, 0x04, 0x1e, 0x2f, - 0x2b, 0x2b, 0x2f, 0x2f, 0x28, 0x50, 0x59, 0x2f, 0x0f, 0x1e, 0x0b, 0x50, - 0x59, 0x1e, 0x16, 0x0d, 0x14, 0x50, 0x59, 0x11, 0x11, 0x0d, 0x0f, 0x00, - 0x3f, 0x33, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x34, 0x2e, 0x01, - 0x27, 0x0e, 0x03, 0x15, 0x14, 0x33, 0x32, 0x01, 0x32, 0x16, 0x17, 0x07, - 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0x17, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x03, 0x2e, 0x01, 0x23, 0x22, - 0x0f, 0x01, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x02, 0x3f, 0x01, - 0x3e, 0x01, 0x02, 0xbf, 0x0a, 0x15, 0x29, 0x0c, 0x1a, 0x14, 0x0d, 0x47, - 0x48, 0x01, 0x02, 0x4c, 0x90, 0x38, 0x72, 0x21, 0x3f, 0x3f, 0x23, 0x2d, - 0x17, 0x83, 0x33, 0x52, 0x7d, 0x6b, 0x6a, 0x7d, 0x50, 0x31, 0x83, 0x17, - 0x2d, 0x23, 0x3f, 0x3e, 0x22, 0x72, 0x38, 0x90, 0x4c, 0x61, 0x75, 0x29, - 0x37, 0x16, 0x15, 0x37, 0x28, 0x75, 0xd6, 0x15, 0x2a, 0x33, 0x4c, 0x17, - 0x30, 0x30, 0x2f, 0x18, 0x5d, 0x03, 0xc8, 0x60, 0x5c, 0x6f, 0x32, 0x5b, - 0x35, 0x35, 0xfe, 0xd1, 0x5e, 0x91, 0x51, 0x6a, 0x78, 0x78, 0x6a, 0x56, - 0x8c, 0x5d, 0x01, 0x30, 0x35, 0x35, 0x5b, 0x32, 0x6f, 0x5c, 0x60, 0x57, - 0x6e, 0x97, 0x46, 0x46, 0x97, 0x6d, 0x58, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0xfe, 0x6f, 0x03, 0xee, 0x04, 0x3b, 0x00, 0x17, 0x00, 0x2d, 0x40, 0x15, - 0x14, 0x10, 0x13, 0x09, 0x06, 0x13, 0x06, 0x19, 0x18, 0x14, 0x00, 0x03, - 0x11, 0x07, 0x0f, 0x03, 0x0d, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x11, 0x33, 0x11, 0x23, 0x11, 0x3f, 0x01, 0x03, 0x3f, 0x3b, 0xa4, 0x7b, - 0xb0, 0xa7, 0xb5, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0xb4, 0x04, 0x04, - 0xba, 0x6d, 0x60, 0xaf, 0xce, 0x02, 0xd1, 0xfd, 0x52, 0x72, 0x6f, 0x34, - 0xb0, 0x95, 0x02, 0x7e, 0xfa, 0x34, 0x01, 0x82, 0x7f, 0x4a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, 0x05, 0xda, 0x00, 0x1f, - 0x00, 0x37, 0x40, 0x1d, 0x1d, 0x11, 0x11, 0x12, 0x08, 0x07, 0x07, 0x18, - 0x12, 0x03, 0x20, 0x21, 0x15, 0x1a, 0x50, 0x59, 0x15, 0x01, 0x00, 0x03, - 0x08, 0x12, 0x15, 0x03, 0x0d, 0x50, 0x59, 0x03, 0x10, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, - 0x22, 0x1d, 0x01, 0x14, 0x07, 0x01, 0x3d, 0x3a, 0xa3, 0x7d, 0xb0, 0xa7, - 0xb5, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0x01, 0x1c, 0x45, 0x49, 0x35, - 0x42, 0x7e, 0x09, 0x03, 0x81, 0x6a, 0x63, 0xaf, 0xce, 0xfd, 0x2f, 0x02, - 0xae, 0x72, 0x6f, 0x34, 0xb0, 0x95, 0xfd, 0x82, 0x04, 0xb2, 0x01, 0x28, - 0x10, 0xa5, 0x13, 0x8e, 0x60, 0x8a, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0xfe, 0x57, 0x03, 0xee, 0x05, 0xda, 0x00, 0x27, 0x00, 0x42, 0x40, 0x24, - 0x13, 0x0a, 0x02, 0x00, 0x1c, 0x1c, 0x1d, 0x1d, 0x23, 0x0e, 0x0a, 0x04, - 0x29, 0x28, 0x20, 0x25, 0x50, 0x59, 0x20, 0x01, 0x02, 0x06, 0x1d, 0x15, - 0x0c, 0x11, 0x50, 0x59, 0x0c, 0x1b, 0x06, 0x18, 0x50, 0x59, 0x06, 0x10, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x07, 0x33, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, - 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x10, - 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, 0x01, 0x43, 0x09, 0x03, - 0x3a, 0xa3, 0x7d, 0xb0, 0xa7, 0xfe, 0xe7, 0x33, 0x55, 0x3a, 0x3d, 0x75, - 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0x01, 0x1c, 0x45, 0x49, 0x35, 0x42, - 0x7e, 0x04, 0x4a, 0x8a, 0x3f, 0x6a, 0x63, 0xaf, 0xce, 0xfc, 0xae, 0xfe, - 0xd8, 0x10, 0xa7, 0x15, 0x94, 0x03, 0x21, 0x72, 0x6f, 0x34, 0xb0, 0x95, - 0xfd, 0x82, 0x04, 0xb2, 0x01, 0x28, 0x10, 0xa5, 0x13, 0x8e, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x01, 0xaf, 0x05, 0xcc, 0x00, 0x0b, - 0x00, 0x0f, 0x00, 0x37, 0x40, 0x1c, 0x0f, 0x08, 0x08, 0x0c, 0x09, 0x09, - 0x10, 0x11, 0x0d, 0x0c, 0x53, 0x59, 0x0d, 0x00, 0x07, 0x0b, 0x00, 0x0b, - 0x50, 0x59, 0x04, 0x00, 0x00, 0x02, 0x09, 0x15, 0x02, 0x0f, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x13, - 0x35, 0x33, 0x15, 0x18, 0x71, 0xb4, 0x72, 0x72, 0xb4, 0x71, 0x71, 0xb4, - 0x02, 0x69, 0x01, 0xd1, 0xfe, 0x2f, 0x85, 0xfe, 0x1c, 0x01, 0xe4, 0x03, - 0x3c, 0xac, 0xac, 0x00, 0x00, 0x01, 0x00, 0x56, 0xff, 0xef, 0x01, 0xc7, - 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x1f, 0x40, 0x0e, 0x00, 0x0a, 0x05, 0x0a, - 0x0e, 0x0d, 0x0b, 0x0f, 0x08, 0x03, 0x53, 0x59, 0x08, 0x16, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x19, - 0x01, 0x33, 0x01, 0x0a, 0x39, 0x37, 0x21, 0x2c, 0x32, 0x2d, 0xfe, 0xee, - 0xb4, 0x01, 0x25, 0x51, 0x46, 0x0b, 0xa0, 0x0a, 0x01, 0x28, 0x03, 0x23, - 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x02, 0x96, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x37, 0x40, 0x1c, 0x0a, 0x01, 0x00, 0x05, 0x07, 0x03, 0x03, 0x05, - 0x01, 0x03, 0x0d, 0x0c, 0x0b, 0x07, 0x08, 0x07, 0x50, 0x59, 0x08, 0x0f, - 0x00, 0x04, 0x03, 0x04, 0x50, 0x59, 0x03, 0x15, 0x00, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x33, 0x15, - 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x01, 0xc7, 0xcf, - 0xfd, 0xae, 0xce, 0xce, 0x02, 0x52, 0xcf, 0x8c, 0x8c, 0x8c, 0x03, 0x23, - 0x8b, 0x8b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9d, - 0x05, 0xcc, 0x00, 0x1a, 0x00, 0x44, 0x40, 0x22, 0x0e, 0x1a, 0x1a, 0x0b, - 0x00, 0x00, 0x07, 0x14, 0x14, 0x1c, 0x07, 0x1b, 0x10, 0x17, 0x50, 0x59, - 0x13, 0x13, 0x10, 0x10, 0x0a, 0x07, 0x07, 0x03, 0x0a, 0x03, 0x50, 0x59, - 0x0a, 0x0a, 0x0c, 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x39, 0x2f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x33, 0x2f, 0x33, 0x2f, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x33, 0x11, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, - 0x33, 0x17, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, - 0x06, 0x23, 0x22, 0x27, 0x11, 0xf8, 0x1a, 0x1a, 0x27, 0x1b, 0x82, 0x02, - 0x6b, 0x54, 0x37, 0xb4, 0x10, 0x20, 0x1f, 0x1a, 0x06, 0x82, 0x5a, 0x60, - 0x23, 0x14, 0x02, 0xcb, 0x08, 0x30, 0x2f, 0x68, 0x7c, 0x05, 0x02, 0x79, - 0xfd, 0x42, 0x06, 0x2f, 0x30, 0x72, 0x72, 0x05, 0xfd, 0x78, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x5a, 0x05, 0xba, 0x00, 0x10, - 0x00, 0x18, 0x00, 0x48, 0x40, 0x25, 0x16, 0x08, 0x11, 0x0c, 0x03, 0x03, - 0x0f, 0x02, 0x00, 0x02, 0x08, 0x03, 0x19, 0x1a, 0x12, 0x13, 0x0c, 0x13, - 0x51, 0x59, 0x01, 0x04, 0x11, 0x04, 0x51, 0x59, 0x0f, 0x11, 0x0c, 0x11, - 0x0c, 0x11, 0x03, 0x0d, 0x00, 0x03, 0x15, 0x00, 0x3f, 0x3f, 0x12, 0x39, - 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x21, 0x35, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x33, 0x02, 0x5a, 0xa9, 0xb4, 0x05, 0x64, 0x85, - 0x81, 0x66, 0x07, 0xb4, 0xa9, 0xfe, 0xa3, 0x07, 0x33, 0x3b, 0x6e, 0x02, - 0x59, 0xfd, 0xa7, 0x02, 0x59, 0x83, 0x6b, 0x63, 0x7b, 0x01, 0x95, 0xfd, - 0x20, 0xd8, 0x3c, 0x33, 0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x86, - 0xfe, 0x57, 0x02, 0x11, 0x05, 0xcc, 0x00, 0x0c, 0x00, 0x1f, 0x40, 0x0e, - 0x00, 0x0a, 0x0a, 0x0d, 0x05, 0x0e, 0x0b, 0x00, 0x08, 0x03, 0x50, 0x59, - 0x08, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x12, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x15, - 0x06, 0x23, 0x20, 0x19, 0x01, 0x33, 0x01, 0x3a, 0x01, 0x39, 0x37, 0x37, - 0x2f, 0x45, 0x2d, 0xfe, 0xe7, 0xb4, 0x73, 0x51, 0x43, 0x0f, 0xa2, 0x0f, - 0x01, 0x28, 0x06, 0x4d, 0x00, 0x01, 0x00, 0x83, 0xfe, 0x57, 0x04, 0x4f, - 0x05, 0xcc, 0x00, 0x1f, 0x00, 0x57, 0x40, 0x2e, 0x1d, 0x05, 0x05, 0x17, - 0x09, 0x06, 0x1c, 0x11, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x1c, 0x09, 0x03, - 0x21, 0x20, 0x11, 0x11, 0x0d, 0x00, 0x0d, 0x13, 0x50, 0x59, 0x0d, 0x1b, - 0x05, 0x1e, 0x03, 0x1e, 0x50, 0x59, 0x06, 0x1b, 0x51, 0x59, 0x06, 0x06, - 0x03, 0x0f, 0x01, 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x2f, - 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, - 0x11, 0x21, 0x15, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x2b, - 0x01, 0x35, 0x01, 0x21, 0x11, 0x83, 0xb4, 0x02, 0xf4, 0xfe, 0x8f, 0xbd, - 0xd8, 0x7f, 0xe7, 0x92, 0xbc, 0xe9, 0x27, 0xb1, 0x37, 0xe3, 0x61, 0x94, - 0x4f, 0xbd, 0x9d, 0x52, 0x01, 0x7f, 0xfd, 0xca, 0x05, 0xcc, 0xfe, 0x6e, - 0xb2, 0xfe, 0x94, 0x18, 0xfe, 0xc1, 0x89, 0xe4, 0x81, 0x98, 0x96, 0x15, - 0xb6, 0x5f, 0xa7, 0x61, 0x98, 0xb8, 0x90, 0x01, 0x82, 0xfc, 0x53, 0x00, - 0x00, 0x01, 0x00, 0x89, 0xff, 0xec, 0x06, 0x24, 0x04, 0x3a, 0x00, 0x29, - 0x00, 0x48, 0x40, 0x25, 0x22, 0x1f, 0x18, 0x01, 0x28, 0x11, 0x07, 0x07, - 0x0c, 0x0a, 0x0a, 0x28, 0x1f, 0x03, 0x2a, 0x2b, 0x18, 0x11, 0x1c, 0x29, - 0x08, 0x20, 0x0f, 0x1c, 0x25, 0x50, 0x59, 0x1c, 0x16, 0x15, 0x04, 0x50, - 0x59, 0x15, 0x16, 0x0d, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x17, 0x23, 0x2e, 0x02, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x03, 0xac, 0x56, 0x70, 0x73, - 0x86, 0xb3, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3a, 0x96, 0x6c, - 0x7b, 0x8f, 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, 0xb2, 0x56, 0x70, - 0x76, 0x83, 0x04, 0x3a, 0xfd, 0x52, 0x9d, 0x78, 0xb0, 0xa0, 0x02, 0x73, - 0xfc, 0xad, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, - 0x6d, 0x60, 0xb2, 0xcb, 0x02, 0xd1, 0xfd, 0x52, 0x9d, 0x78, 0xaf, 0xa1, - 0x02, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0xfe, 0x57, 0x06, 0x1e, - 0x04, 0x3a, 0x00, 0x23, 0x00, 0x44, 0x40, 0x23, 0x07, 0x0b, 0x0b, 0x0a, - 0x01, 0x22, 0x1c, 0x19, 0x19, 0x22, 0x0a, 0x03, 0x25, 0x24, 0x12, 0x0c, - 0x16, 0x23, 0x08, 0x1a, 0x0f, 0x16, 0x1f, 0x50, 0x59, 0x16, 0x16, 0x0f, - 0x04, 0x50, 0x59, 0x0f, 0x16, 0x0b, 0x1b, 0x00, 0x3f, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, - 0x11, 0x23, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x11, 0x03, 0xac, 0x56, 0x70, 0x73, 0x86, 0xb3, 0xb1, 0x37, 0x95, - 0x6e, 0x7b, 0x8f, 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, 0xb2, 0x56, - 0x70, 0x76, 0x83, 0x04, 0x3a, 0xfd, 0x52, 0x9d, 0x78, 0xb0, 0xa0, 0x02, - 0x73, 0xfa, 0x1d, 0x02, 0x58, 0x6b, 0x58, 0x62, 0x6b, 0x6d, 0x60, 0xb2, - 0xcb, 0x02, 0xd1, 0xfd, 0x52, 0x9d, 0x78, 0xaf, 0xa1, 0x02, 0x73, 0x00, - 0x00, 0x01, 0x00, 0x88, 0xfe, 0x57, 0x06, 0x23, 0x04, 0x4e, 0x00, 0x31, - 0x00, 0x51, 0x40, 0x2c, 0x19, 0x10, 0x10, 0x11, 0x20, 0x07, 0x07, 0x08, - 0x31, 0x28, 0x28, 0x2d, 0x08, 0x11, 0x04, 0x32, 0x33, 0x2a, 0x2f, 0x50, - 0x59, 0x2a, 0x1b, 0x24, 0x03, 0x50, 0x59, 0x24, 0x10, 0x20, 0x19, 0x1d, - 0x11, 0x1d, 0x0c, 0x50, 0x59, 0x1d, 0x10, 0x14, 0x0f, 0x08, 0x11, 0x15, - 0x00, 0x3f, 0x33, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, - 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, - 0x05, 0x71, 0x56, 0x70, 0x76, 0x83, 0xb2, 0x56, 0x70, 0x73, 0x86, 0xb3, - 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3a, 0x96, 0x6c, 0x7b, 0x8f, - 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, 0xfe, 0xe7, 0x33, 0x55, 0x32, - 0x45, 0x78, 0x02, 0xae, 0x9d, 0x78, 0xaf, 0xa1, 0xfd, 0x8d, 0x02, 0xae, - 0x9d, 0x78, 0xb0, 0xa0, 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, - 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, 0x6d, 0x60, 0xb2, 0xcb, 0xfc, 0xae, - 0xfe, 0xd8, 0x10, 0xa4, 0x12, 0x94, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa1, - 0xfe, 0x57, 0x03, 0xee, 0x04, 0x4e, 0x00, 0x22, 0x00, 0x3a, 0x40, 0x1e, - 0x10, 0x0f, 0x07, 0x19, 0x19, 0x1e, 0x02, 0x22, 0x0f, 0x22, 0x24, 0x23, - 0x1b, 0x20, 0x50, 0x59, 0x1b, 0x1b, 0x07, 0x0b, 0x10, 0x15, 0x0b, 0x15, - 0x50, 0x59, 0x0b, 0x10, 0x02, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x27, 0x33, - 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, - 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x10, 0x21, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x8e, 0x06, 0xaa, 0x01, 0x02, 0x03, - 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0xb5, 0x2a, 0x5c, 0x59, 0x82, - 0x96, 0xfe, 0xe7, 0x33, 0x55, 0x2f, 0x48, 0x76, 0x03, 0x53, 0xbd, 0x2a, - 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0xfd, 0x2f, 0x02, 0xae, - 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x0c, 0xfe, 0xd8, 0x10, 0xa3, 0x11, - 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0xfe, 0x57, 0x04, 0xcd, - 0x04, 0x4e, 0x00, 0x22, 0x00, 0x3d, 0x40, 0x1f, 0x09, 0x00, 0x1b, 0x12, - 0x12, 0x16, 0x13, 0x00, 0x13, 0x23, 0x04, 0x24, 0x1b, 0x1f, 0x13, 0x1f, - 0x0e, 0x50, 0x59, 0x1f, 0x10, 0x16, 0x0f, 0x13, 0x15, 0x07, 0x02, 0x50, - 0x59, 0x07, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x33, 0x32, 0x37, - 0x15, 0x06, 0x23, 0x20, 0x19, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x03, 0xee, 0x75, 0x3e, 0x2c, 0x40, 0x3b, - 0xfe, 0xe7, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, - 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x73, 0x94, 0x10, 0xa4, - 0x0e, 0x01, 0x28, 0x03, 0x2f, 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x8d, - 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xed, 0x04, 0x3a, 0x00, 0x10, - 0x00, 0x2e, 0x40, 0x15, 0x08, 0x04, 0x04, 0x07, 0x00, 0x0e, 0x0e, 0x0f, - 0x0f, 0x07, 0x11, 0x12, 0x03, 0x0b, 0x0f, 0x05, 0x10, 0x0f, 0x08, 0x0f, - 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x09, 0x01, 0x16, 0x17, 0x27, 0x11, 0x33, 0x11, 0x23, 0x01, 0x26, 0x27, - 0x16, 0x15, 0x11, 0x23, 0x11, 0x01, 0x3c, 0x01, 0xd1, 0x15, 0x25, 0x04, - 0xaa, 0xa7, 0xfe, 0x33, 0x28, 0x21, 0x07, 0xa9, 0x04, 0x3a, 0xfd, 0x53, - 0x1e, 0x4a, 0x7d, 0x02, 0x98, 0xfb, 0xc6, 0x02, 0xbb, 0x3a, 0x47, 0x62, - 0x41, 0xfd, 0x67, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x04, 0x4e, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x18, - 0x00, 0x4b, 0x40, 0x29, 0x16, 0x0e, 0x0e, 0x00, 0x15, 0x0f, 0x0f, 0x06, - 0x00, 0x06, 0x1a, 0x19, 0x15, 0x0f, 0x50, 0x59, 0x0f, 0x15, 0xcf, 0x15, - 0xdf, 0x15, 0x03, 0x0b, 0x03, 0x15, 0x15, 0x03, 0x08, 0x08, 0x12, 0x50, - 0x59, 0x08, 0x10, 0x03, 0x0b, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x12, 0x01, 0x32, 0x36, 0x37, 0x21, 0x1e, 0x01, 0x13, - 0x22, 0x06, 0x07, 0x21, 0x2e, 0x01, 0x04, 0x1d, 0xfa, 0xee, 0xed, 0xf2, - 0x01, 0xe5, 0xf8, 0xea, 0xfe, 0x16, 0x95, 0x8c, 0x0a, 0xfd, 0xb7, 0x0a, - 0x8b, 0x94, 0x90, 0x8e, 0x0b, 0x02, 0x49, 0x0a, 0x86, 0x02, 0x1e, 0xfe, - 0xe4, 0xfe, 0xea, 0x01, 0x21, 0x01, 0x11, 0x02, 0x30, 0xfe, 0xef, 0xfd, - 0x34, 0xae, 0xb7, 0xb0, 0xb5, 0x03, 0x58, 0xac, 0xb4, 0xb4, 0xac, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x06, 0x0e, 0x04, 0x4e, 0x00, 0x15, - 0x00, 0x21, 0x00, 0x6b, 0x40, 0x3a, 0x13, 0x00, 0x04, 0x15, 0x03, 0x03, - 0x16, 0x10, 0x06, 0x1c, 0x0c, 0x0c, 0x06, 0x04, 0x03, 0x23, 0x22, 0x15, - 0x02, 0x51, 0x59, 0x0f, 0x15, 0x01, 0x0b, 0x03, 0x15, 0x15, 0x06, 0x11, - 0x11, 0x14, 0x50, 0x59, 0x11, 0x0f, 0x10, 0x07, 0x0e, 0x09, 0x0e, 0x19, - 0x50, 0x59, 0x0e, 0x10, 0x09, 0x1f, 0x50, 0x59, 0x09, 0x15, 0x06, 0x03, - 0x50, 0x59, 0x06, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x31, 0x30, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x06, - 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x35, 0x21, 0x15, 0x21, - 0x11, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x05, 0xc9, 0xfe, 0x47, 0x01, 0xfe, 0xfd, 0x57, 0x73, 0xbd, 0xed, - 0xf2, 0x01, 0xe5, 0xb4, 0x76, 0x02, 0x92, 0xfe, 0x19, 0xb0, 0x85, 0x9d, - 0x9e, 0x8d, 0x8b, 0x95, 0xa2, 0x8b, 0x02, 0x71, 0x82, 0xfe, 0x96, 0x85, - 0x5d, 0x71, 0x01, 0x21, 0x01, 0x11, 0x02, 0x30, 0x71, 0x5d, 0x89, 0xfe, - 0xc0, 0x53, 0xe0, 0xcb, 0xcf, 0xdc, 0xd6, 0xd7, 0xd0, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x57, 0xff, 0xec, 0x05, 0xe8, 0x04, 0x4e, 0x00, 0x16, - 0x00, 0x28, 0x00, 0x48, 0x40, 0x25, 0x07, 0x1a, 0x20, 0x01, 0x01, 0x15, - 0x0f, 0x26, 0x26, 0x15, 0x1a, 0x03, 0x2a, 0x29, 0x20, 0x16, 0x16, 0x23, - 0x17, 0x23, 0x12, 0x50, 0x59, 0x23, 0x16, 0x1d, 0x04, 0x50, 0x59, 0x1d, - 0x16, 0x17, 0x0b, 0x50, 0x59, 0x17, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x3d, 0x01, 0x13, 0x20, 0x00, 0x11, 0x14, 0x02, 0x23, 0x22, 0x26, - 0x27, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x35, 0x10, 0x00, 0x03, 0x75, 0x70, - 0x72, 0x77, 0x69, 0x83, 0xee, 0xa7, 0xa6, 0xee, 0x83, 0x69, 0x77, 0x72, - 0x70, 0x55, 0x01, 0x4d, 0x01, 0x7c, 0xca, 0xb8, 0x81, 0xaa, 0x1d, 0x1b, - 0xa9, 0x81, 0xb7, 0xcb, 0x01, 0x7a, 0x02, 0x4d, 0x60, 0xc3, 0xba, 0xb0, - 0xbb, 0x97, 0xe4, 0x6f, 0x6f, 0xe4, 0x97, 0xbb, 0xb0, 0xba, 0xc3, 0x60, - 0x02, 0x01, 0xfe, 0xb3, 0xfe, 0xda, 0xec, 0xfe, 0xfd, 0x7f, 0x78, 0x7a, - 0x7d, 0x01, 0x02, 0xed, 0x01, 0x25, 0x01, 0x4e, 0x00, 0x03, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x1d, 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x1d, - 0x00, 0x52, 0x40, 0x2d, 0x10, 0x0c, 0x14, 0x09, 0x0f, 0x0f, 0x1a, 0x06, - 0x00, 0x17, 0x04, 0x04, 0x00, 0x0c, 0x03, 0x1f, 0x1e, 0x0e, 0x14, 0x50, - 0x59, 0x0e, 0x16, 0x09, 0x13, 0x50, 0x59, 0x09, 0x10, 0x07, 0x00, 0x06, - 0x1b, 0x50, 0x59, 0x06, 0x10, 0x01, 0x1a, 0x50, 0x59, 0x01, 0x16, 0x00, - 0x1b, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x26, 0x02, 0x11, 0x10, 0x25, 0x11, 0x33, 0x11, 0x16, 0x12, - 0x11, 0x10, 0x05, 0x11, 0x13, 0x34, 0x26, 0x27, 0x11, 0x3e, 0x01, 0x25, - 0x14, 0x16, 0x17, 0x11, 0x0e, 0x01, 0x01, 0xe2, 0xbd, 0xcf, 0x01, 0x8c, - 0xa4, 0xd4, 0xc3, 0xfe, 0x69, 0xda, 0x68, 0x72, 0x71, 0x69, 0xfd, 0xb3, - 0x65, 0x6a, 0x6c, 0x63, 0xfe, 0x57, 0x01, 0x9a, 0x17, 0x01, 0x13, 0x01, - 0x03, 0x01, 0xf9, 0x32, 0x01, 0x83, 0xfe, 0x7e, 0x14, 0xfe, 0xeb, 0xfe, - 0xfd, 0xfe, 0x00, 0x2d, 0xfe, 0x66, 0x03, 0xc7, 0xc7, 0xca, 0x14, 0xfc, - 0xb5, 0x16, 0xcf, 0xc1, 0xb8, 0xd0, 0x1c, 0x03, 0x44, 0x1a, 0xcc, 0x00, - 0x00, 0x01, 0x00, 0x2b, 0xff, 0xec, 0x02, 0x2b, 0x04, 0x3a, 0x00, 0x14, - 0x00, 0x2a, 0x40, 0x14, 0x05, 0x13, 0x13, 0x01, 0x0e, 0x01, 0x15, 0x16, - 0x07, 0x04, 0x14, 0x0f, 0x0b, 0x10, 0x53, 0x59, 0x0b, 0x16, 0x04, 0x15, - 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x17, - 0x23, 0x2f, 0x01, 0x23, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x36, 0x35, 0x11, 0x02, 0x25, 0x06, 0xaa, 0x05, 0x03, 0x04, 0x22, - 0x3f, 0x5b, 0x45, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x04, 0x3a, 0xfc, - 0xc2, 0x78, 0x84, 0x71, 0x6c, 0x68, 0x5e, 0x2b, 0x0a, 0xa5, 0x0a, 0xc1, - 0xb4, 0x02, 0x34, 0x00, 0x00, 0x01, 0x00, 0x2b, 0xff, 0xec, 0x02, 0x2b, - 0x05, 0xcb, 0x00, 0x14, 0x00, 0x2a, 0x40, 0x14, 0x05, 0x13, 0x13, 0x01, - 0x0e, 0x01, 0x15, 0x16, 0x07, 0x04, 0x14, 0x00, 0x0b, 0x10, 0x53, 0x59, - 0x0b, 0x16, 0x04, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x14, 0x17, 0x23, 0x2f, 0x01, 0x23, 0x0e, 0x02, 0x23, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x02, 0x25, 0x06, 0xaa, - 0x05, 0x03, 0x04, 0x22, 0x3f, 0x5b, 0x45, 0x24, 0x25, 0x24, 0x3c, 0x70, - 0x76, 0x05, 0xcb, 0xfb, 0x31, 0x78, 0x84, 0x71, 0x6c, 0x68, 0x5e, 0x2b, - 0x0a, 0xa5, 0x0a, 0xc1, 0xb4, 0x03, 0xc5, 0x00, 0x00, 0x01, 0x00, 0x2b, - 0xfe, 0x57, 0x02, 0xf6, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x33, 0x40, 0x19, - 0x17, 0x0b, 0x0b, 0x01, 0x01, 0x11, 0x19, 0x06, 0x1a, 0x0c, 0x0f, 0x18, - 0x0f, 0x0f, 0x14, 0x53, 0x59, 0x0f, 0x16, 0x09, 0x04, 0x53, 0x59, 0x09, - 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, - 0x19, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x11, 0x02, 0x25, 0x38, 0x37, 0x33, 0x2f, 0x3b, 0x47, 0xfe, 0x26, - 0x76, 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x04, 0x3a, 0xfb, 0x4e, - 0x51, 0x43, 0x0e, 0xa0, 0x0b, 0x01, 0x28, 0x01, 0x41, 0x77, 0x5d, 0x0a, - 0xa5, 0x0a, 0xc1, 0xb4, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, - 0xfe, 0x57, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x13, 0x00, 0x28, 0x40, 0x14, - 0x06, 0x13, 0x13, 0x01, 0x00, 0x00, 0x0c, 0x14, 0x15, 0x0a, 0x0f, 0x53, - 0x59, 0x0a, 0x10, 0x06, 0x03, 0x0f, 0x00, 0x1b, 0x00, 0x3f, 0x3f, 0x39, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x13, 0x11, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, 0x01, - 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x8e, 0x06, - 0xaa, 0x08, 0x04, 0x2b, 0x70, 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, - 0xfe, 0x57, 0x04, 0xe7, 0x72, 0x8a, 0xb8, 0x25, 0x8b, 0x66, 0x0a, 0xa5, - 0x0a, 0xc1, 0xb4, 0xfc, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, - 0xfe, 0x57, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x36, 0x40, 0x1c, - 0x05, 0x12, 0x12, 0x00, 0x1d, 0x1d, 0x18, 0x0b, 0x03, 0x1f, 0x1e, 0x05, - 0x1b, 0x02, 0x1b, 0x15, 0x53, 0x59, 0x1b, 0x1b, 0x09, 0x0e, 0x53, 0x59, - 0x09, 0x10, 0x02, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x15, 0x07, 0x06, 0x23, 0x20, 0x11, 0x8e, 0x06, - 0xaa, 0x08, 0x04, 0x2b, 0x70, 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, - 0x38, 0x37, 0x36, 0x2b, 0x22, 0x1f, 0x2e, 0xfe, 0xeb, 0x03, 0x3e, 0x72, - 0x8a, 0xb8, 0x25, 0x8b, 0x66, 0x0a, 0xa5, 0x0a, 0xc1, 0xb4, 0xfd, 0x59, - 0x51, 0x43, 0x0d, 0xa4, 0x05, 0x06, 0x01, 0x28, 0x00, 0x01, 0x00, 0x8e, - 0x00, 0x00, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x0e, 0x00, 0x1d, 0x40, 0x0e, - 0x0e, 0x00, 0x07, 0x00, 0x10, 0x0f, 0x05, 0x0a, 0x53, 0x59, 0x05, 0x10, - 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x31, 0x30, 0x33, 0x11, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x15, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x8e, 0x5c, 0xbe, 0x80, 0x3b, 0x25, - 0x24, 0x3c, 0x7d, 0x6d, 0x02, 0xae, 0x80, 0xba, 0x66, 0x0a, 0xa5, 0x0a, - 0x8d, 0xa7, 0xfd, 0x8b, 0x00, 0x01, 0x00, 0x20, 0xfe, 0x57, 0x02, 0x1a, - 0x04, 0x4e, 0x00, 0x0e, 0x00, 0x1d, 0x40, 0x0e, 0x00, 0x0e, 0x0e, 0x06, - 0x10, 0x0f, 0x09, 0x04, 0x53, 0x59, 0x09, 0x10, 0x00, 0x1b, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x1e, 0x01, - 0x15, 0x11, 0x01, 0x66, 0x6e, 0x78, 0x3c, 0x24, 0x25, 0x3b, 0x80, 0xbe, - 0x5c, 0xfe, 0x57, 0x04, 0x01, 0xaf, 0xa2, 0x0a, 0xa5, 0x0a, 0x66, 0xba, - 0x80, 0xfb, 0xa9, 0x00, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x04, 0x30, - 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x49, 0x40, 0x25, 0x0b, 0x0a, - 0x09, 0x0c, 0x06, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x12, 0x06, 0x0a, 0x06, - 0x01, 0x03, 0x16, 0x17, 0x09, 0x0d, 0x0f, 0x0d, 0x50, 0x59, 0x0f, 0x0f, - 0x01, 0x02, 0x02, 0x0e, 0x50, 0x59, 0x02, 0x0f, 0x0b, 0x01, 0x15, 0x00, - 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, - 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x23, 0x01, 0x23, 0x19, - 0x01, 0x21, 0x32, 0x35, 0x34, 0x26, 0x23, 0x01, 0x42, 0xb4, 0x01, 0xce, - 0xb8, 0xd8, 0x95, 0x8a, 0x01, 0x63, 0xda, 0xfe, 0xb4, 0xc8, 0x01, 0x12, - 0xdb, 0x74, 0x6b, 0x04, 0x3a, 0xa4, 0x91, 0x81, 0xaa, 0x19, 0xfe, 0x3f, - 0x01, 0xb7, 0x01, 0xfa, 0xfe, 0x8e, 0xbb, 0x5c, 0x5b, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x04, 0x30, 0x04, 0x3a, 0x00, 0x0d, - 0x00, 0x15, 0x00, 0x42, 0x40, 0x21, 0x01, 0x04, 0x00, 0x02, 0x03, 0x03, - 0x11, 0x07, 0x00, 0x15, 0x15, 0x0b, 0x07, 0x0b, 0x17, 0x16, 0x00, 0x14, - 0x50, 0x59, 0x04, 0x00, 0x00, 0x0b, 0x02, 0x0c, 0x0f, 0x0b, 0x15, 0x50, - 0x59, 0x0b, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x33, - 0x01, 0x33, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x33, - 0x01, 0x32, 0x36, 0x35, 0x34, 0x23, 0x21, 0x11, 0x01, 0x42, 0xc8, 0x01, - 0x4c, 0xda, 0xfe, 0x9d, 0x8a, 0x95, 0xd9, 0xb7, 0xfe, 0x32, 0xb4, 0x01, - 0x0e, 0x6c, 0x73, 0xdb, 0xfe, 0xee, 0x02, 0x83, 0x01, 0xb7, 0xfe, 0x3f, - 0x19, 0xab, 0x80, 0x91, 0xa4, 0x04, 0x3a, 0xfc, 0x4f, 0x5b, 0x5c, 0xbb, - 0xfe, 0x8e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0xfe, 0x57, 0x03, 0xb6, - 0x04, 0x4b, 0x00, 0x35, 0x00, 0x54, 0x40, 0x2d, 0x00, 0x2a, 0x2a, 0x34, - 0x1b, 0x0e, 0x0e, 0x34, 0x15, 0x14, 0x14, 0x06, 0x24, 0x24, 0x2e, 0x34, - 0x03, 0x36, 0x37, 0x32, 0x2c, 0x50, 0x59, 0x32, 0x1b, 0x29, 0x06, 0x1b, - 0x03, 0x11, 0x27, 0x27, 0x03, 0x50, 0x59, 0x00, 0x27, 0x16, 0x11, 0x18, - 0x50, 0x59, 0x15, 0x11, 0x10, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, - 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x15, 0x14, 0x33, - 0x32, 0x37, 0x15, 0x07, 0x06, 0x23, 0x20, 0x19, 0x01, 0xd8, 0x17, 0x90, - 0x80, 0x89, 0x7f, 0x58, 0x62, 0x81, 0x9b, 0x83, 0x4a, 0xd3, 0xca, 0xb3, - 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, 0x74, 0x30, 0x5e, 0x97, 0x8f, - 0x7e, 0x49, 0x28, 0xe7, 0xd0, 0xad, 0x6f, 0x7a, 0x39, 0x2a, 0x22, 0x24, - 0x2b, 0xfe, 0xea, 0x01, 0x1d, 0x57, 0x51, 0x54, 0x54, 0x40, 0x50, 0x1a, - 0x22, 0x28, 0x4d, 0x6e, 0x50, 0x94, 0x9b, 0x7e, 0x8b, 0x14, 0x48, 0x4d, - 0x4a, 0x4b, 0x2e, 0x3c, 0x2a, 0x25, 0x24, 0x3d, 0x4a, 0x61, 0x3e, 0x99, - 0xa6, 0x3b, 0x9f, 0x8f, 0x0c, 0xa2, 0x05, 0x07, 0x01, 0x28, 0x01, 0x7f, - 0x00, 0x01, 0xff, 0x8a, 0xfe, 0x57, 0x02, 0x4e, 0x05, 0xcc, 0x00, 0x18, - 0x00, 0x28, 0x40, 0x14, 0x16, 0x09, 0x09, 0x19, 0x0f, 0x1a, 0x02, 0x19, - 0x0d, 0x12, 0x53, 0x59, 0x0d, 0x00, 0x00, 0x05, 0x53, 0x59, 0x00, 0x1b, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x3e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x10, 0x4f, 0x37, 0x3c, 0x39, - 0x36, 0x3d, 0x1b, 0x97, 0x93, 0x6b, 0x2c, 0x31, 0x42, 0x4d, 0x4b, 0x98, - 0xfe, 0x57, 0x13, 0xa0, 0x18, 0x2c, 0x55, 0x68, 0x04, 0x8f, 0xad, 0xb5, - 0x12, 0xa7, 0x1b, 0x69, 0x80, 0xfb, 0x75, 0xb4, 0xaf, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xc3, 0xfe, 0x57, 0x02, 0x87, 0x05, 0xcc, 0x00, 0x20, - 0x00, 0x46, 0x40, 0x25, 0x11, 0x0e, 0x0e, 0x1f, 0x01, 0x00, 0x01, 0x21, - 0x0f, 0x07, 0x22, 0x18, 0x21, 0x20, 0x00, 0x50, 0x59, 0x20, 0x15, 0x15, - 0x1a, 0x53, 0x59, 0x15, 0x1b, 0x11, 0x0e, 0x50, 0x59, 0x11, 0x15, 0x05, - 0x0a, 0x53, 0x59, 0x05, 0x00, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x37, 0x33, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x23, 0x05, 0xc1, 0x98, - 0x9e, 0x59, 0x32, 0x31, 0x42, 0x4d, 0x4b, 0xaa, 0xaa, 0x98, 0x9b, 0x4f, - 0x37, 0x3c, 0x39, 0x36, 0x3d, 0x1b, 0xc1, 0x8c, 0x03, 0xde, 0xb2, 0xb0, - 0x12, 0xa7, 0x1b, 0x69, 0x80, 0xfc, 0x47, 0x8c, 0x46, 0xb4, 0xaf, 0x13, - 0xa0, 0x18, 0x2c, 0x55, 0x68, 0x25, 0x00, 0x00, 0x00, 0x01, 0xff, 0x82, - 0xfe, 0x57, 0x02, 0x3a, 0x04, 0x4e, 0x00, 0x18, 0x00, 0x28, 0x40, 0x14, - 0x10, 0x03, 0x03, 0x19, 0x16, 0x1a, 0x09, 0x19, 0x0c, 0x07, 0x53, 0x59, - 0x0c, 0x10, 0x00, 0x14, 0x53, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, - 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, - 0x37, 0x15, 0x06, 0x01, 0xb4, 0x99, 0x90, 0x4b, 0x4b, 0x42, 0x31, 0x2c, - 0x57, 0xa2, 0x9a, 0x18, 0x38, 0x34, 0x39, 0x3c, 0x37, 0xfe, 0x57, 0xac, - 0xb7, 0x03, 0x0d, 0x83, 0x66, 0x1b, 0xa7, 0x12, 0xa9, 0xae, 0xfc, 0xe4, - 0x66, 0x57, 0x2c, 0x18, 0xa0, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0xfe, 0x56, 0x03, 0x4b, 0x05, 0xcc, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x51, - 0x40, 0x2a, 0x1c, 0x08, 0x02, 0x19, 0x19, 0x22, 0x0d, 0x08, 0x0d, 0x27, - 0x1b, 0x13, 0x28, 0x02, 0x22, 0x19, 0x0d, 0x04, 0x0b, 0x00, 0x0b, 0x24, - 0x50, 0x59, 0x0b, 0x0b, 0x04, 0x10, 0x10, 0x15, 0x53, 0x59, 0x10, 0x00, - 0x00, 0x04, 0x04, 0x1f, 0x50, 0x59, 0x04, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x10, 0xc6, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, - 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x01, 0x33, 0x33, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x2f, 0x01, - 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, - 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x16, - 0x17, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x23, 0x22, 0x06, - 0x02, 0xb7, 0x46, 0x54, 0x51, 0xbf, 0x49, 0x7b, 0x49, 0x8b, 0x81, 0x40, - 0x44, 0x01, 0x24, 0x6b, 0x2c, 0x31, 0x42, 0x4d, 0x4b, 0x6c, 0x79, 0xfd, - 0x76, 0x41, 0x2f, 0x3e, 0x49, 0x4e, 0x39, 0x3a, 0x36, 0xfe, 0x56, 0x58, - 0x65, 0xbc, 0x3d, 0x71, 0x54, 0x76, 0x88, 0x18, 0x04, 0x2b, 0x01, 0x62, - 0x12, 0xa7, 0x1b, 0x69, 0x80, 0xfb, 0x8f, 0x60, 0xa9, 0x8a, 0x38, 0x36, - 0x5f, 0x4f, 0x31, 0x41, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xff, 0x02, 0x2a, - 0x05, 0x95, 0x00, 0x14, 0x00, 0x41, 0x40, 0x22, 0x05, 0x08, 0x08, 0x0e, - 0x0b, 0x14, 0x0d, 0x0b, 0x03, 0x15, 0x06, 0x16, 0x05, 0x08, 0x51, 0x59, - 0x05, 0x05, 0x0e, 0x0e, 0x0b, 0x51, 0x59, 0x0e, 0x0e, 0x02, 0x0a, 0x15, - 0x02, 0x12, 0x50, 0x59, 0x02, 0x00, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x01, - 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x36, 0x33, 0x32, 0x15, 0x11, 0x33, 0x15, 0x23, 0x07, 0x23, 0x35, 0x23, - 0x35, 0x33, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x1f, 0x59, 0x5d, 0xd8, - 0x7d, 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x33, 0x3f, 0x24, 0x44, 0x05, 0x7d, - 0x18, 0xf5, 0xfc, 0xd4, 0x83, 0xf2, 0xf2, 0x83, 0x03, 0x05, 0x4e, 0x3f, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xfe, 0x57, 0x02, 0x2a, - 0x05, 0x2c, 0x00, 0x14, 0x00, 0x36, 0x40, 0x1c, 0x0b, 0x0f, 0x0f, 0x08, - 0x04, 0x06, 0x04, 0x0d, 0x14, 0x04, 0x16, 0x15, 0x0e, 0x06, 0x07, 0x06, - 0x51, 0x59, 0x0b, 0x09, 0x07, 0x0f, 0x02, 0x12, 0x50, 0x59, 0x02, 0x1b, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0xc6, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x06, 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, - 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x02, 0x2a, 0x59, - 0x5d, 0xd8, 0x7d, 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x33, 0x3f, 0x24, 0x44, - 0xfe, 0x6f, 0x18, 0xf5, 0x04, 0x6b, 0x83, 0xf2, 0xf2, 0x83, 0xfb, 0xc1, - 0x4e, 0x3f, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x1a, 0xff, 0xec, 0x04, 0x51, - 0x04, 0x3a, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x52, 0x40, 0x29, 0x10, 0x20, - 0x20, 0x09, 0x02, 0x05, 0x05, 0x09, 0x01, 0x23, 0x23, 0x1b, 0x17, 0x09, - 0x17, 0x28, 0x27, 0x22, 0x08, 0x19, 0x1a, 0x19, 0x50, 0x59, 0x05, 0x01, - 0x10, 0x1a, 0x1a, 0x14, 0x03, 0x1c, 0x0f, 0x14, 0x1d, 0x50, 0x59, 0x14, - 0x16, 0x0c, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, - 0x39, 0x2f, 0x39, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, - 0x33, 0x15, 0x23, 0x15, 0x14, 0x17, 0x23, 0x2e, 0x02, 0x27, 0x23, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x11, 0x01, 0x32, - 0x36, 0x3d, 0x01, 0x21, 0x15, 0x14, 0x1e, 0x01, 0x01, 0x3a, 0x01, 0xf7, - 0xb4, 0x6c, 0x6c, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, - 0x79, 0xb2, 0xa5, 0x6b, 0x6b, 0x01, 0x94, 0x82, 0x96, 0xfe, 0x09, 0x2a, - 0x5c, 0x04, 0x3a, 0xfe, 0x2f, 0x01, 0xd1, 0xfe, 0x2f, 0x85, 0xfd, 0xbd, - 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0x7b, 0x85, 0x01, - 0xd1, 0xfc, 0x3d, 0xba, 0x9e, 0x15, 0x58, 0x6b, 0x76, 0x34, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x54, 0xff, 0xec, 0x04, 0x36, 0x04, 0x3a, 0x00, 0x2f, - 0x00, 0x4d, 0x40, 0x29, 0x24, 0x1b, 0x11, 0x08, 0x28, 0x1f, 0x08, 0x1f, - 0x2d, 0x15, 0x0c, 0x03, 0x2d, 0x03, 0x31, 0x30, 0x22, 0x25, 0x50, 0x59, - 0x22, 0x0f, 0x1b, 0x15, 0x28, 0x08, 0x04, 0x0d, 0x00, 0x0d, 0x0c, 0x50, - 0x59, 0x0d, 0x0f, 0x00, 0x18, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x32, 0x32, 0x31, 0x30, 0x05, 0x22, 0x00, 0x35, 0x34, - 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x27, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x17, 0x16, 0x15, 0x14, 0x00, 0x02, 0x45, 0xe1, 0xfe, 0xf0, - 0x54, 0x33, 0x21, 0x2b, 0x2b, 0x52, 0x7c, 0x59, 0x6d, 0x43, 0x44, 0xa7, - 0x8f, 0x8e, 0xa8, 0x43, 0x44, 0x6e, 0x58, 0x7c, 0x52, 0x2b, 0x2b, 0x20, - 0x34, 0x54, 0xfe, 0xf2, 0x14, 0x01, 0x00, 0xd4, 0x8c, 0x76, 0x48, 0x40, - 0x1c, 0x1f, 0x2a, 0x8b, 0x67, 0x57, 0x5f, 0x74, 0x74, 0x5d, 0x9f, 0xbe, - 0xbe, 0x9f, 0x5d, 0x74, 0x74, 0x5f, 0x58, 0x66, 0x8b, 0x2a, 0x1f, 0x1d, - 0x3e, 0x49, 0x76, 0x8c, 0xd1, 0xfe, 0xfd, 0x00, 0x00, 0x01, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xe5, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x29, 0x40, 0x13, - 0x09, 0x06, 0x11, 0x0e, 0x0e, 0x00, 0x06, 0x00, 0x15, 0x16, 0x11, 0x07, - 0x0f, 0x03, 0x0c, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x16, 0x33, 0x20, 0x11, 0x34, 0x02, 0x27, 0x33, 0x16, 0x12, - 0x03, 0xe5, 0xea, 0xda, 0xd7, 0xc5, 0xb5, 0x70, 0x7f, 0x01, 0x03, 0x41, - 0x31, 0xbc, 0x35, 0x3a, 0x02, 0x3b, 0xfe, 0xea, 0xfe, 0xc7, 0xd2, 0xe5, - 0x02, 0x97, 0xfd, 0x63, 0x92, 0x94, 0x01, 0xc0, 0x8b, 0x01, 0x17, 0x61, - 0x76, 0xfe, 0xec, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x03, 0xf9, - 0x04, 0x3a, 0x00, 0x09, 0x00, 0x2a, 0x40, 0x14, 0x03, 0x02, 0x01, 0x00, - 0x05, 0x08, 0x09, 0x09, 0x05, 0x02, 0x03, 0x0b, 0x0a, 0x05, 0x03, 0x03, - 0x09, 0x15, 0x00, 0x0f, 0x00, 0x3f, 0x3f, 0x33, 0x11, 0x39, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x33, 0x01, 0x23, 0x03, 0x27, 0x0f, 0x01, 0x03, 0x23, 0x01, 0x9b, - 0xd5, 0x01, 0x89, 0xc0, 0xff, 0x34, 0x23, 0x27, 0xf6, 0xbf, 0x04, 0x3a, - 0xfb, 0xc6, 0x02, 0xf6, 0xb7, 0x75, 0x76, 0xfd, 0x3e, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x05, 0xc1, 0x04, 0x3a, 0x00, 0x18, - 0x00, 0x2b, 0x40, 0x16, 0x0a, 0x09, 0x17, 0x18, 0x18, 0x04, 0x09, 0x03, - 0x1a, 0x19, 0x0a, 0x18, 0x15, 0x0e, 0x14, 0x04, 0x03, 0x11, 0x15, 0x07, - 0x00, 0x0f, 0x00, 0x3f, 0x32, 0x3f, 0x17, 0x39, 0x3f, 0x33, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x13, - 0x16, 0x17, 0x3f, 0x01, 0x13, 0x33, 0x01, 0x23, 0x03, 0x2e, 0x01, 0x27, - 0x07, 0x03, 0x23, 0x03, 0x26, 0x27, 0x0f, 0x01, 0x03, 0x23, 0x01, 0x30, - 0xd1, 0xaf, 0x1a, 0x1a, 0x13, 0x23, 0xb0, 0xd0, 0x01, 0x27, 0xb2, 0xaf, - 0x09, 0x1f, 0x03, 0x2f, 0xc2, 0xc1, 0xbf, 0x2b, 0x03, 0x07, 0x26, 0xb3, - 0xb0, 0x04, 0x3a, 0xfd, 0x4d, 0x67, 0x8c, 0x5d, 0x9a, 0x02, 0xaf, 0xfb, - 0xc6, 0x02, 0xca, 0x23, 0x98, 0x1f, 0xd2, 0xfd, 0x2e, 0x02, 0xd5, 0xad, - 0x22, 0x26, 0xb1, 0xfd, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, - 0x00, 0x00, 0x03, 0xf2, 0x05, 0xe3, 0x00, 0x15, 0x00, 0x2c, 0x40, 0x16, - 0x0a, 0x09, 0x10, 0x11, 0x11, 0x09, 0x0e, 0x02, 0x04, 0x17, 0x16, 0x0e, - 0x00, 0x0a, 0x11, 0x15, 0x00, 0x05, 0x50, 0x59, 0x00, 0x01, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, - 0x22, 0x0f, 0x01, 0x01, 0x23, 0x03, 0x2e, 0x01, 0x27, 0x07, 0x03, 0x23, - 0x01, 0x3e, 0x02, 0x03, 0x42, 0x4a, 0x32, 0x26, 0x2e, 0xa8, 0x62, 0x11, - 0x01, 0xa3, 0xc0, 0xdc, 0x14, 0x48, 0x04, 0x44, 0xe5, 0xbe, 0x01, 0x96, - 0x40, 0x72, 0x8f, 0x05, 0xe3, 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0xfb, 0xcb, - 0x02, 0x56, 0x36, 0xd8, 0x12, 0xc5, 0xfd, 0x4f, 0x04, 0x3a, 0xa9, 0xaa, - 0x56, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x04, 0x0d, - 0x04, 0x3a, 0x00, 0x08, 0x00, 0x26, 0x40, 0x12, 0x05, 0x06, 0x08, 0x00, - 0x03, 0x02, 0x02, 0x00, 0x06, 0x03, 0x0a, 0x09, 0x04, 0x05, 0x02, 0x0f, - 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x33, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x01, 0x33, - 0x09, 0x01, 0x33, 0x01, 0x11, 0x01, 0xb4, 0xfe, 0x67, 0xca, 0x01, 0x2c, - 0x01, 0x35, 0xc7, 0xfe, 0x5b, 0x01, 0xb8, 0x02, 0x82, 0xfe, 0x12, 0x01, - 0xee, 0xfd, 0x7b, 0xfe, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xfe, 0x57, 0x04, 0x72, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x3b, 0x40, 0x20, - 0x0a, 0x00, 0x0e, 0x12, 0x13, 0x0c, 0x0c, 0x0f, 0x12, 0x00, 0x04, 0x15, - 0x05, 0x16, 0x10, 0x0f, 0x50, 0x59, 0x10, 0x0f, 0x0c, 0x13, 0x50, 0x59, - 0x0c, 0x15, 0x08, 0x03, 0x50, 0x59, 0x08, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x16, - 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x11, 0x35, 0x21, 0x35, 0x01, - 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x03, 0xb6, 0x2b, 0x37, 0x35, 0x25, - 0x43, 0x3a, 0xf0, 0xfd, 0x2c, 0x02, 0x95, 0xfd, 0x93, 0x03, 0x38, 0xfd, - 0x6a, 0x02, 0xbb, 0x73, 0x51, 0x43, 0x0b, 0xa1, 0x0c, 0x01, 0x28, 0x81, - 0x89, 0x03, 0x26, 0x8b, 0x89, 0xfc, 0xda, 0x00, 0x00, 0x02, 0x00, 0x31, - 0xff, 0x4e, 0x04, 0x29, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x20, 0x00, 0x59, - 0x40, 0x2f, 0x0a, 0x0e, 0x1a, 0x00, 0x0e, 0x00, 0x16, 0x1e, 0x1e, 0x06, - 0x11, 0x15, 0x16, 0x0f, 0x0f, 0x12, 0x15, 0x06, 0x04, 0x22, 0x21, 0x15, - 0x12, 0x13, 0x12, 0x50, 0x59, 0x03, 0x17, 0x50, 0x59, 0x03, 0x03, 0x0f, - 0x13, 0x0f, 0x1a, 0x10, 0x16, 0x0f, 0x16, 0x50, 0x59, 0x0c, 0x0a, 0x0f, - 0x15, 0x00, 0x3f, 0x33, 0xc4, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, 0x3f, - 0x12, 0x39, 0x2f, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x2b, 0x01, 0x06, 0x07, 0x27, 0x37, 0x21, 0x35, 0x01, 0x21, - 0x35, 0x21, 0x15, 0x01, 0x25, 0x22, 0x06, 0x07, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x01, 0xa8, 0x65, 0xbd, 0x61, 0x76, 0x88, 0x8c, 0x98, 0xfd, - 0x30, 0x22, 0x8b, 0x37, 0xfe, 0xcf, 0x02, 0x95, 0xfd, 0x93, 0x03, 0x38, - 0xfd, 0x6a, 0x02, 0x2e, 0x2f, 0x64, 0x46, 0xac, 0x4d, 0x46, 0x36, 0x8b, - 0xaa, 0x9e, 0x7b, 0x67, 0x78, 0x79, 0x5e, 0x54, 0x3d, 0x75, 0x89, 0x03, - 0x26, 0x8b, 0x89, 0xfc, 0xda, 0xb7, 0x51, 0x66, 0x2c, 0x37, 0x27, 0x2d, - 0x00, 0x01, 0x00, 0x44, 0xfe, 0x57, 0x04, 0x0b, 0x04, 0x3a, 0x00, 0x1b, - 0x00, 0x50, 0x40, 0x29, 0x03, 0x18, 0x18, 0x1b, 0x1a, 0x02, 0x02, 0x14, - 0x06, 0x0d, 0x1b, 0x06, 0x03, 0x1d, 0x1c, 0x19, 0x03, 0x03, 0x18, 0x50, - 0x59, 0x03, 0x03, 0x0a, 0x00, 0x0a, 0x11, 0x50, 0x59, 0x0e, 0x0e, 0x0a, - 0x1b, 0x02, 0x1b, 0x00, 0x1b, 0x50, 0x59, 0x00, 0x0f, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, - 0x15, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, - 0x01, 0x21, 0x74, 0x03, 0x73, 0xfe, 0x81, 0xc4, 0xdf, 0x76, 0xd8, 0x8c, - 0xd8, 0xfe, 0x17, 0xb2, 0x13, 0x9a, 0x88, 0x89, 0xa2, 0xb7, 0xa3, 0x52, - 0x01, 0x89, 0xfd, 0x41, 0x04, 0x3a, 0xb2, 0xfe, 0x98, 0x19, 0xfb, 0xc7, - 0x8b, 0xe4, 0x7f, 0xbe, 0xbb, 0x0c, 0x85, 0x77, 0xc7, 0xa4, 0x9c, 0xb4, - 0x90, 0x01, 0x82, 0x00, 0x00, 0x02, 0x00, 0x6c, 0xfe, 0x56, 0x04, 0x4b, - 0x04, 0x3b, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x6a, 0x40, 0x3c, 0x28, 0x07, - 0x14, 0x18, 0x19, 0x12, 0x12, 0x23, 0x0c, 0x01, 0x1e, 0x05, 0x20, 0x07, - 0x20, 0x0e, 0x1c, 0x1c, 0x18, 0x15, 0x07, 0x04, 0x2b, 0x2c, 0x18, 0x15, - 0x16, 0x15, 0x50, 0x59, 0x01, 0x23, 0x1e, 0x0c, 0x04, 0x0a, 0x00, 0x0a, - 0x25, 0x50, 0x59, 0x19, 0x12, 0x50, 0x59, 0x0a, 0x19, 0x0a, 0x19, 0x03, - 0x16, 0x0f, 0x00, 0x03, 0x03, 0x21, 0x51, 0x59, 0x03, 0x1b, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x2b, - 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x27, 0x06, 0x23, 0x22, 0x2e, - 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x35, 0x34, 0x26, 0x2b, - 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x16, 0x12, 0x15, 0x14, - 0x07, 0x16, 0x17, 0x25, 0x32, 0x37, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x03, 0xe7, 0x7c, 0x94, 0xd9, 0x7f, 0xb4, 0x5f, 0xaa, 0x9d, 0xba, - 0xd6, 0x13, 0xc0, 0x99, 0x52, 0x01, 0x87, 0xfd, 0x43, 0x03, 0x73, 0xfe, - 0x85, 0xbd, 0xe1, 0x41, 0x3e, 0x43, 0xfd, 0x9c, 0xb5, 0x61, 0xae, 0xa4, - 0x49, 0x53, 0x78, 0xfe, 0x56, 0x88, 0x87, 0x45, 0x7a, 0x4a, 0x75, 0x82, - 0x95, 0x44, 0x45, 0x9b, 0xb5, 0x90, 0x01, 0x83, 0x8d, 0xb2, 0xfe, 0x98, - 0x18, 0xfe, 0xfd, 0xc1, 0x81, 0x70, 0x38, 0x49, 0x06, 0x69, 0x8d, 0x3a, - 0x35, 0x3d, 0x4a, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, 0x03, 0xb0, - 0x05, 0xcc, 0x00, 0x17, 0x00, 0x3c, 0x40, 0x1f, 0x0c, 0x0d, 0x17, 0x00, - 0x06, 0x13, 0x13, 0x00, 0x0d, 0x03, 0x18, 0x19, 0x03, 0x16, 0x50, 0x59, - 0x03, 0x03, 0x00, 0x10, 0x0c, 0x0c, 0x10, 0x10, 0x09, 0x50, 0x59, 0x10, - 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, - 0x12, 0x11, 0x14, 0x02, 0x07, 0x11, 0x01, 0x6c, 0x2e, 0x3d, 0x91, 0x8c, - 0x87, 0x92, 0x69, 0x72, 0x0e, 0xb9, 0x1d, 0xd9, 0xa7, 0xe4, 0xf6, 0xcf, - 0xc1, 0x02, 0x1e, 0x12, 0xc7, 0xd7, 0xdb, 0xba, 0x6a, 0x5a, 0x0e, 0x97, - 0xac, 0xfe, 0xeb, 0xfe, 0xef, 0xf3, 0xfe, 0xdf, 0x10, 0xfe, 0x7e, 0x00, - 0x00, 0x01, 0x00, 0x5b, 0x00, 0x00, 0x03, 0xc8, 0x05, 0xcc, 0x00, 0x17, - 0x00, 0x3a, 0x40, 0x1e, 0x0b, 0x0a, 0x17, 0x00, 0x11, 0x04, 0x04, 0x00, - 0x0a, 0x03, 0x19, 0x18, 0x14, 0x01, 0x50, 0x59, 0x14, 0x14, 0x00, 0x07, - 0x07, 0x0e, 0x50, 0x59, 0x0b, 0x0b, 0x07, 0x00, 0x00, 0x15, 0x00, 0x3f, - 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x11, 0x26, 0x02, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, - 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, - 0x01, 0xeb, 0xc2, 0xce, 0xef, 0xe1, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, - 0x69, 0x90, 0x7f, 0x8b, 0x92, 0x3d, 0x2e, 0x01, 0x82, 0x11, 0x01, 0x20, - 0xf3, 0x01, 0x11, 0x01, 0x15, 0xac, 0x97, 0x0e, 0x5a, 0x6a, 0xb5, 0xe0, - 0xd5, 0xc9, 0x12, 0xfd, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, - 0xff, 0xec, 0x03, 0xb0, 0x05, 0xcc, 0x00, 0x17, 0x00, 0x33, 0x40, 0x1a, - 0x11, 0x04, 0x01, 0x16, 0x0a, 0x16, 0x04, 0x03, 0x19, 0x18, 0x17, 0x00, - 0x07, 0x0e, 0x50, 0x59, 0x0b, 0x0b, 0x07, 0x16, 0x01, 0x14, 0x50, 0x59, - 0x01, 0x0f, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x00, - 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x16, 0x12, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, - 0x11, 0x02, 0x20, 0xc2, 0xce, 0xf5, 0xe5, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, - 0x72, 0x69, 0x93, 0x86, 0x8b, 0x92, 0x3d, 0x2e, 0x05, 0xcc, 0xfe, 0x6a, - 0x11, 0xfe, 0xe0, 0xf3, 0xfe, 0xf0, 0xfe, 0xea, 0xac, 0x97, 0x0e, 0x5a, - 0x6a, 0xbb, 0xda, 0xd3, 0xc4, 0x12, 0x02, 0x39, 0x00, 0x01, 0x00, 0x57, - 0xfe, 0x56, 0x03, 0xca, 0x04, 0x4e, 0x00, 0x1b, 0x00, 0x39, 0x40, 0x1b, - 0x0e, 0x1b, 0x07, 0x06, 0x06, 0x14, 0x15, 0x1b, 0x15, 0x1c, 0x1d, 0x14, - 0x14, 0x18, 0x18, 0x11, 0x50, 0x59, 0x18, 0x03, 0x0a, 0x50, 0x59, 0x07, - 0x07, 0x03, 0x10, 0x00, 0x3f, 0x33, 0x2f, 0x2b, 0x00, 0x18, 0x2f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x10, 0x12, 0x33, 0x32, - 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x57, - 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, 0x69, 0x91, 0x88, 0x8f, - 0x8c, 0x60, 0x81, 0x0f, 0xb6, 0x15, 0xe0, 0xac, 0xe3, 0xef, 0x02, 0x1e, - 0x01, 0x11, 0x01, 0x1f, 0xac, 0x97, 0x0e, 0x5a, 0x6a, 0xc0, 0xdf, 0xfe, - 0x6a, 0xd3, 0xd5, 0x68, 0x6c, 0x0c, 0x9c, 0xba, 0x01, 0x1f, 0x01, 0x13, - 0x00, 0x03, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x00, 0x0e, - 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x3c, 0x40, 0x1d, 0x0f, 0x1e, 0x1b, 0x1b, - 0x00, 0x15, 0x08, 0x00, 0x08, 0x20, 0x1f, 0x1c, 0x1b, 0x1c, 0x1b, 0x0b, - 0x04, 0x0b, 0x12, 0x53, 0x59, 0x0b, 0x04, 0x04, 0x18, 0x53, 0x59, 0x04, - 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, - 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, - 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, 0x07, 0x10, 0x00, - 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x25, 0x35, 0x33, - 0x15, 0x05, 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, 0xc5, 0xa6, 0x01, - 0x72, 0x01, 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xc3, 0xfe, 0xf9, 0xf0, 0xf2, - 0xfe, 0xf8, 0x01, 0x0b, 0xed, 0xf4, 0x01, 0x05, 0xfd, 0xa8, 0xc3, 0x02, - 0xc7, 0xdd, 0xfe, 0xb4, 0xb2, 0xb0, 0x01, 0x4d, 0xde, 0x01, 0x52, 0x01, - 0x7d, 0xab, 0xfe, 0xba, 0xde, 0x01, 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, - 0xf5, 0xfe, 0xf7, 0xfe, 0xc9, 0x01, 0x2d, 0xaa, 0xdb, 0xdb, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xe7, 0x04, 0x3a, 0x00, 0x0f, - 0x00, 0x18, 0x00, 0x21, 0x00, 0x70, 0x40, 0x14, 0x06, 0x1a, 0x03, 0x1a, - 0x10, 0x10, 0x0e, 0x1e, 0x03, 0x03, 0x14, 0x0a, 0x0e, 0x0a, 0x22, 0x23, - 0x30, 0x23, 0x01, 0x23, 0xb8, 0xff, 0xc0, 0x40, 0x28, 0x1e, 0x23, 0x48, - 0x0f, 0x23, 0x2f, 0x23, 0xdf, 0x23, 0x03, 0x09, 0x03, 0x06, 0x1a, 0x18, - 0x1a, 0x18, 0x51, 0x59, 0x0f, 0x1a, 0x01, 0x0b, 0x03, 0x1a, 0x1a, 0x0e, - 0x0f, 0x0f, 0x19, 0x50, 0x59, 0x0f, 0x0f, 0x0e, 0x10, 0x50, 0x59, 0x0e, - 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x01, 0x5f, - 0x5e, 0x5d, 0x2b, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x32, - 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, - 0x21, 0x11, 0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x19, - 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x34, 0xc8, 0xc8, - 0x72, 0x6d, 0x81, 0x81, 0xdb, 0xc1, 0xfe, 0x43, 0xb4, 0xec, 0x8a, 0x70, - 0x77, 0x8f, 0xe0, 0xd8, 0x80, 0x6d, 0x66, 0x79, 0x04, 0x3a, 0x8c, 0x83, - 0x5d, 0x7c, 0x15, 0x07, 0x11, 0x82, 0x6b, 0x93, 0xa5, 0x04, 0x3a, 0xfc, - 0x4b, 0x55, 0x5d, 0x65, 0x53, 0x01, 0xc2, 0xfe, 0xc0, 0x48, 0x5a, 0x52, - 0x4c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x49, 0xff, 0xed, 0x03, 0xcd, - 0x04, 0x4e, 0x00, 0x15, 0x00, 0x26, 0x00, 0x52, 0x40, 0x2a, 0x00, 0x1e, - 0x06, 0x06, 0x21, 0x21, 0x0b, 0x16, 0x0f, 0x1c, 0x16, 0x1c, 0x28, 0x27, - 0x1e, 0x09, 0x0c, 0x09, 0x0c, 0x50, 0x59, 0x0f, 0x09, 0x01, 0x0b, 0x03, - 0x09, 0x09, 0x19, 0x24, 0x24, 0x03, 0x50, 0x59, 0x24, 0x10, 0x19, 0x12, - 0x50, 0x59, 0x19, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x3e, 0x01, 0x37, 0x10, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x03, 0x10, 0x8e, - 0xa1, 0x5d, 0x6a, 0x71, 0x5c, 0x5a, 0x60, 0x75, 0x6f, 0x73, 0x6d, 0x73, - 0x82, 0x3e, 0xbd, 0xf5, 0xfb, 0xbc, 0xd8, 0xf9, 0x6f, 0x6d, 0xd3, 0xbb, - 0xe3, 0xf6, 0x02, 0x2c, 0xce, 0xcf, 0x5a, 0x55, 0x4e, 0x5c, 0x8d, 0x60, - 0x57, 0x5c, 0x5f, 0x60, 0xc6, 0x95, 0xfe, 0xe1, 0xfe, 0xe0, 0xa9, 0x93, - 0xdc, 0x29, 0x22, 0x71, 0x58, 0x8e, 0xa7, 0xfe, 0xe3, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x5e, 0xff, 0xec, 0x04, 0xa3, 0x05, 0x03, 0x00, 0x27, - 0x00, 0x58, 0x40, 0x2e, 0x1b, 0x00, 0x27, 0x27, 0x0b, 0x10, 0x06, 0x16, - 0x21, 0x16, 0x0e, 0x10, 0x03, 0x29, 0x28, 0x1e, 0x23, 0x50, 0x59, 0x1e, - 0x19, 0x0e, 0x0d, 0x50, 0x59, 0x1b, 0x00, 0x19, 0x0e, 0x00, 0x0e, 0x00, - 0x13, 0x19, 0x19, 0x03, 0x50, 0x59, 0x19, 0x10, 0x13, 0x09, 0x50, 0x59, - 0x13, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x2b, 0x00, 0x18, 0x10, - 0xc4, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x32, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x35, 0x23, 0x35, 0x21, 0x11, 0x0e, - 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x12, 0x33, 0x32, 0x17, 0x3e, 0x01, - 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x03, 0x22, - 0x0e, 0x72, 0x69, 0x99, 0x88, 0x98, 0x9f, 0x83, 0x67, 0xf9, 0x01, 0xaf, - 0x4b, 0xd7, 0x7a, 0xf5, 0xff, 0x00, 0xfb, 0xe5, 0x96, 0x6a, 0x09, 0x83, - 0x76, 0x2f, 0x34, 0x24, 0x2b, 0x42, 0x37, 0x02, 0xfd, 0x5a, 0x6a, 0xcd, - 0xd2, 0xde, 0xce, 0x43, 0xdb, 0x89, 0xfe, 0x5e, 0x44, 0x4b, 0x01, 0x1e, - 0x01, 0x14, 0x01, 0x0e, 0x01, 0x22, 0x48, 0x79, 0x84, 0x0c, 0x96, 0x10, - 0x47, 0x4d, 0xd2, 0x00, 0x00, 0x01, 0x00, 0x86, 0x00, 0x00, 0x03, 0xe5, - 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x57, 0x40, 0x1e, 0x01, 0x09, 0x09, 0x0a, - 0x02, 0x06, 0x06, 0x05, 0x0a, 0x05, 0x0c, 0x0d, 0x40, 0x0d, 0x50, 0x0d, - 0x60, 0x0d, 0x03, 0x40, 0x0d, 0x80, 0x0d, 0x02, 0x00, 0x0d, 0x01, 0x10, - 0x03, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x13, 0x17, 0x48, 0x01, 0x08, - 0x51, 0x59, 0x2f, 0x01, 0x01, 0x01, 0x01, 0x0a, 0x03, 0x0b, 0x0f, 0x06, - 0x0a, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x5d, 0x2b, - 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, - 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x3a, 0x01, - 0xf7, 0xb4, 0xb4, 0xfe, 0x09, 0xb4, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, - 0xfb, 0xc6, 0x01, 0xed, 0xfe, 0x13, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x01, - 0xfe, 0x57, 0x03, 0x29, 0x05, 0xcc, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x20, - 0x00, 0x52, 0x40, 0x2b, 0x1d, 0x07, 0x15, 0x15, 0x20, 0x0c, 0x0a, 0x0e, - 0x1a, 0x03, 0x0e, 0x03, 0x22, 0x21, 0x1e, 0x1d, 0x53, 0x59, 0x1e, 0x00, - 0x0d, 0x17, 0x06, 0x17, 0x50, 0x59, 0x0a, 0x0f, 0x06, 0x01, 0x0a, 0x03, - 0x06, 0x06, 0x00, 0x08, 0x0f, 0x00, 0x12, 0x50, 0x59, 0x00, 0x1b, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, - 0x15, 0x23, 0x15, 0x14, 0x0e, 0x01, 0x27, 0x32, 0x36, 0x3d, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x13, 0x35, 0x33, 0x15, 0x01, 0x57, 0x9f, - 0xb7, 0x92, 0x9d, 0xbd, 0xb4, 0x88, 0x88, 0x4f, 0x94, 0x83, 0x56, 0x5c, - 0xb7, 0x4d, 0x41, 0x51, 0xf4, 0xb4, 0xfe, 0x57, 0x8b, 0x7d, 0x7e, 0x81, - 0x03, 0xdc, 0xfc, 0x24, 0x8b, 0x25, 0x62, 0x9c, 0x59, 0x8e, 0x6b, 0x6b, - 0x18, 0x3c, 0x39, 0x38, 0x41, 0x06, 0x3b, 0xac, 0xac, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x01, 0xfe, 0x6e, 0x03, 0x7a, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x3e, 0x40, 0x1e, 0x0a, 0x01, 0x0b, 0x02, 0x02, 0x06, 0x06, 0x05, - 0x08, 0x09, 0x09, 0x00, 0x0b, 0x05, 0x0b, 0x0d, 0x0c, 0x07, 0x02, 0x02, - 0x01, 0x0a, 0x03, 0x09, 0x03, 0x0b, 0x0f, 0x06, 0x09, 0x15, 0x00, 0x3f, - 0xc6, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x01, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x01, 0x23, 0x09, 0x01, 0xd4, 0x01, 0x6e, 0x84, 0xb4, 0xb4, 0xfe, 0x25, - 0xd3, 0x01, 0xb7, 0xfe, 0x32, 0x04, 0x3a, 0xfe, 0x12, 0x6d, 0x01, 0x81, - 0xfa, 0x34, 0x03, 0x9f, 0xfd, 0xf3, 0x01, 0xd1, 0x02, 0x69, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x86, 0x00, 0x00, 0x02, 0xfd, 0x04, 0x3a, 0x00, 0x05, - 0x00, 0x1f, 0x40, 0x0e, 0x04, 0x01, 0x00, 0x01, 0x07, 0x06, 0x02, 0x0f, - 0x01, 0x04, 0x50, 0x59, 0x01, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x11, - 0x33, 0x11, 0x21, 0x02, 0xfd, 0xfd, 0x89, 0xb1, 0x01, 0xc6, 0x04, 0x3a, - 0xfc, 0x5b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0xda, - 0x05, 0xda, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x47, 0x40, 0x24, 0x1d, 0x0a, - 0x17, 0x17, 0x16, 0x23, 0x03, 0x16, 0x03, 0x29, 0x10, 0x2a, 0x17, 0x1b, - 0x0d, 0x13, 0x50, 0x59, 0x0d, 0x01, 0x08, 0x19, 0x05, 0x00, 0x05, 0x20, - 0x50, 0x59, 0x05, 0x10, 0x00, 0x26, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x05, 0x22, 0x02, 0x11, 0x10, - 0x21, 0x32, 0x16, 0x17, 0x33, 0x11, 0x34, 0x36, 0x33, 0x32, 0x1f, 0x01, - 0x15, 0x26, 0x23, 0x22, 0x15, 0x11, 0x23, 0x11, 0x37, 0x23, 0x0e, 0x01, - 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x01, 0xe4, 0xce, 0xc0, 0x01, 0x8e, 0x7b, 0xa0, 0x36, 0x02, 0x92, 0x8f, - 0x36, 0x27, 0x25, 0x38, 0x3c, 0x7d, 0xb4, 0x04, 0x02, 0x36, 0x9e, 0xd2, - 0x8a, 0x97, 0x89, 0x78, 0x79, 0x86, 0x99, 0x8a, 0x14, 0x01, 0x16, 0x01, - 0x16, 0x02, 0x36, 0x57, 0x65, 0x01, 0x20, 0x91, 0x97, 0x08, 0x08, 0xa6, - 0x14, 0x94, 0xf9, 0xb3, 0x01, 0xb7, 0xa4, 0x6b, 0x5b, 0x02, 0x3e, 0xd3, - 0xcc, 0xcc, 0xdf, 0xe3, 0xc4, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, - 0x00, 0x00, 0x03, 0xb0, 0x05, 0xcc, 0x00, 0x1f, 0x00, 0x66, 0x40, 0x39, - 0x0d, 0x00, 0x0e, 0x18, 0x1c, 0x1c, 0x01, 0x1d, 0x1a, 0x07, 0x14, 0x14, - 0x1d, 0x0e, 0x03, 0x20, 0x21, 0x00, 0x1f, 0x51, 0x59, 0x00, 0x00, 0x18, - 0x18, 0x1b, 0x51, 0x59, 0x04, 0x17, 0x50, 0x59, 0x0f, 0x04, 0x1f, 0x04, - 0x3f, 0x04, 0x03, 0x09, 0x03, 0x18, 0x04, 0x18, 0x04, 0x11, 0x1d, 0x15, - 0x0d, 0x0d, 0x11, 0x11, 0x0a, 0x50, 0x59, 0x11, 0x00, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x13, 0x21, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x12, - 0x11, 0x14, 0x02, 0x07, 0x15, 0x21, 0x15, 0x21, 0x15, 0x23, 0x35, 0x21, - 0x2f, 0x01, 0x3d, 0x2e, 0x3d, 0x91, 0x8c, 0x87, 0x92, 0x69, 0x72, 0x0e, - 0xb9, 0x1d, 0xd9, 0xa7, 0xe4, 0xf6, 0xcf, 0xc1, 0x01, 0x4b, 0xfe, 0xb5, - 0xb4, 0xfe, 0xc3, 0x01, 0x14, 0x01, 0x0a, 0x12, 0xc7, 0xd7, 0xdb, 0xba, - 0x6a, 0x5a, 0x0e, 0x97, 0xac, 0xfe, 0xeb, 0xfe, 0xef, 0xf3, 0xfe, 0xdf, - 0x10, 0x6e, 0x7b, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, - 0x00, 0x00, 0x03, 0xd0, 0x05, 0xcc, 0x00, 0x1f, 0x00, 0x63, 0x40, 0x36, - 0x18, 0x05, 0x0b, 0x1e, 0x02, 0x02, 0x07, 0x03, 0x1f, 0x12, 0x11, 0x11, - 0x03, 0x0b, 0x03, 0x20, 0x21, 0x01, 0x05, 0x06, 0x05, 0x51, 0x59, 0x1e, - 0x06, 0x1b, 0x08, 0x50, 0x59, 0x0f, 0x1b, 0x1f, 0x1b, 0x3f, 0x1b, 0x03, - 0x09, 0x03, 0x06, 0x1b, 0x06, 0x1b, 0x03, 0x0e, 0x0e, 0x15, 0x50, 0x59, - 0x12, 0x12, 0x0e, 0x00, 0x03, 0x15, 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, - 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, - 0x30, 0x25, 0x21, 0x15, 0x23, 0x35, 0x21, 0x35, 0x21, 0x35, 0x26, 0x02, - 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x03, 0xd0, 0xfe, - 0xc3, 0xb4, 0xfe, 0xb5, 0x01, 0x4b, 0xc2, 0xce, 0xf5, 0xe5, 0xa6, 0xdb, - 0x1c, 0xb9, 0x0e, 0x72, 0x69, 0x93, 0x86, 0x8b, 0x92, 0x3d, 0x2e, 0x01, - 0x3d, 0x99, 0x99, 0x99, 0x7b, 0x6e, 0x11, 0x01, 0x20, 0xf3, 0x01, 0x10, - 0x01, 0x16, 0xac, 0x97, 0x0e, 0x5a, 0x6a, 0xbb, 0xda, 0xd5, 0xc9, 0x12, - 0xfe, 0xf6, 0x00, 0x00, 0x00, 0x03, 0x00, 0x56, 0xff, 0xec, 0x07, 0x80, - 0x05, 0xcc, 0x00, 0x19, 0x00, 0x25, 0x00, 0x28, 0x00, 0x63, 0x40, 0x35, - 0x1a, 0x0a, 0x17, 0x26, 0x26, 0x13, 0x13, 0x20, 0x03, 0x12, 0x27, 0x16, - 0x18, 0x16, 0x12, 0x0a, 0x04, 0x29, 0x2a, 0x16, 0x27, 0x15, 0x27, 0x50, - 0x59, 0x15, 0x0f, 0x12, 0x00, 0x0f, 0x03, 0x0c, 0x07, 0x0c, 0x23, 0x50, - 0x59, 0x0c, 0x10, 0x07, 0x1d, 0x50, 0x59, 0x07, 0x16, 0x17, 0x26, 0x00, - 0x26, 0x50, 0x59, 0x00, 0x15, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x2e, 0x01, 0x35, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, 0x21, 0x15, - 0x01, 0x21, 0x15, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x09, 0x01, 0x21, 0x03, 0x43, 0x03, 0x07, 0x04, 0x32, - 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, - 0x03, 0x72, 0xfd, 0x56, 0x02, 0xcf, 0xf9, 0x93, 0x78, 0x87, 0x99, 0x8a, - 0x8a, 0x97, 0x88, 0x79, 0x02, 0xd6, 0x02, 0xa7, 0xfd, 0x59, 0x10, 0x74, - 0x2a, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, - 0x01, 0xc1, 0xfe, 0x6e, 0x89, 0xfc, 0xda, 0x8b, 0x02, 0x1e, 0xe3, 0xc4, - 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0xfd, 0x8b, 0x03, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x56, 0x07, 0x08, 0x05, 0xcc, 0x00, 0x31, - 0x00, 0x3d, 0x00, 0x8a, 0x40, 0x49, 0x13, 0x28, 0x28, 0x38, 0x23, 0x23, - 0x16, 0x29, 0x11, 0x38, 0x0e, 0x1d, 0x1c, 0x1c, 0x0e, 0x2a, 0x0f, 0x0f, - 0x2e, 0x0e, 0x32, 0x06, 0x06, 0x0e, 0x11, 0x16, 0x04, 0x3f, 0x3e, 0x1d, - 0x1a, 0x2e, 0x13, 0x27, 0x50, 0x59, 0x13, 0x13, 0x10, 0x2e, 0x15, 0x12, - 0x2a, 0x10, 0x2a, 0x50, 0x59, 0x10, 0x0f, 0x0e, 0x00, 0x0b, 0x00, 0x08, - 0x03, 0x08, 0x3b, 0x50, 0x59, 0x08, 0x10, 0x1a, 0x20, 0x50, 0x59, 0x1a, - 0x03, 0x03, 0x35, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x10, 0xc4, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x12, 0x39, 0x2f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x25, 0x0e, - 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, - 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x16, 0x12, 0x15, 0x14, 0x0e, 0x01, - 0x23, 0x20, 0x03, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x35, - 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x03, 0x35, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, - 0x02, 0x02, 0xb4, 0x02, 0xfb, 0xfe, 0x85, 0xbe, 0xe1, 0x7b, 0xdc, 0x8b, - 0xfe, 0x90, 0x58, 0xa4, 0x23, 0x8c, 0x6f, 0x86, 0xad, 0xb8, 0xa2, 0x52, - 0x01, 0x85, 0xfd, 0xbd, 0x06, 0xac, 0x03, 0x07, 0xfd, 0xda, 0x78, 0x87, - 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, - 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfe, 0x6e, 0xb2, 0xfe, - 0x97, 0x19, 0xff, 0x00, 0xc1, 0x85, 0xe6, 0x84, 0x01, 0x10, 0x27, 0x5b, - 0x50, 0xcd, 0x9c, 0x9c, 0xb4, 0x90, 0x01, 0x82, 0xfd, 0x32, 0xa9, 0x36, - 0x10, 0x74, 0x2a, 0x01, 0x70, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, - 0x00, 0x04, 0x00, 0x56, 0xff, 0x4e, 0x07, 0xde, 0x05, 0xcc, 0x00, 0x26, - 0x00, 0x32, 0x00, 0x35, 0x00, 0x3f, 0x00, 0x83, 0x40, 0x47, 0x27, 0x06, - 0x13, 0x33, 0x33, 0x0f, 0x0f, 0x2d, 0x00, 0x0e, 0x1e, 0x39, 0x39, 0x22, - 0x14, 0x35, 0x12, 0x3d, 0x1a, 0x1a, 0x12, 0x14, 0x0e, 0x06, 0x05, 0x40, - 0x41, 0x13, 0x34, 0x23, 0x34, 0x50, 0x59, 0x20, 0x23, 0x15, 0x1e, 0x3a, - 0x50, 0x59, 0x1e, 0x15, 0x17, 0x36, 0x50, 0x59, 0x17, 0x11, 0x35, 0x50, - 0x59, 0x11, 0x0f, 0x0e, 0x00, 0x0b, 0x00, 0x08, 0x03, 0x08, 0x30, 0x50, - 0x59, 0x08, 0x10, 0x03, 0x2a, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x3f, - 0x2b, 0x00, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, - 0x21, 0x15, 0x01, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, - 0x2b, 0x01, 0x06, 0x07, 0x27, 0x37, 0x21, 0x2e, 0x01, 0x35, 0x01, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x25, 0x11, - 0x01, 0x13, 0x22, 0x06, 0x07, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03, - 0x35, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, - 0x02, 0xb4, 0x03, 0x73, 0xfd, 0x54, 0xad, 0x65, 0xbd, 0x61, 0x76, 0x88, - 0x8c, 0x98, 0xfd, 0x30, 0x22, 0x8b, 0x37, 0xfe, 0x2c, 0x03, 0x07, 0xfd, - 0xda, 0x78, 0x87, 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0x02, 0xd6, 0x02, - 0xa8, 0x4d, 0x2f, 0x64, 0x46, 0xac, 0x4d, 0x46, 0x36, 0xae, 0x68, 0x5a, - 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfe, - 0x6e, 0x89, 0xfc, 0xda, 0xaa, 0x9e, 0x7b, 0x67, 0x78, 0x79, 0x5e, 0x54, - 0x3d, 0x75, 0x10, 0x74, 0x2a, 0x01, 0x70, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, - 0xc8, 0xc9, 0xaf, 0xfc, 0xdd, 0x03, 0x23, 0xfd, 0x93, 0x51, 0x66, 0x2c, - 0x37, 0x27, 0x2d, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x05, 0x64, - 0x05, 0x2c, 0x00, 0x22, 0x00, 0x35, 0x00, 0x5f, 0x40, 0x32, 0x14, 0x13, - 0x13, 0x26, 0x00, 0x1a, 0x2e, 0x0d, 0x32, 0x32, 0x0a, 0x08, 0x06, 0x06, - 0x2e, 0x00, 0x03, 0x37, 0x36, 0x1a, 0x26, 0x10, 0x04, 0x10, 0x17, 0x50, - 0x59, 0x14, 0x10, 0x10, 0x0d, 0x31, 0x51, 0x59, 0x0d, 0x0f, 0x0b, 0x09, - 0x09, 0x08, 0x51, 0x59, 0x09, 0x10, 0x04, 0x35, 0x50, 0x59, 0x04, 0x15, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x21, - 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x21, 0x36, 0x33, - 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, - 0x01, 0x17, 0x1e, 0x03, 0x05, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, - 0x2e, 0x02, 0x35, 0x34, 0x37, 0x23, 0x11, 0x14, 0x16, 0x33, 0x05, 0x64, - 0xde, 0xd9, 0xfd, 0xd1, 0xd8, 0x7d, 0x84, 0x35, 0x78, 0x01, 0xaf, 0x4a, - 0x5c, 0xb3, 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, 0x74, 0x30, 0x5e, - 0x97, 0x8f, 0x7e, 0x49, 0x28, 0xfe, 0x49, 0x8f, 0x79, 0x58, 0x62, 0x81, - 0x9b, 0x83, 0x4a, 0x28, 0xe0, 0x33, 0x3f, 0x01, 0x2b, 0x93, 0x98, 0xf5, - 0x02, 0xc2, 0x83, 0xf2, 0xf2, 0x11, 0x7e, 0x8b, 0x14, 0x48, 0x4d, 0x4a, - 0x4b, 0x2e, 0x3c, 0x2a, 0x25, 0x24, 0x3d, 0x4a, 0x61, 0xdd, 0x46, 0x4b, - 0x40, 0x50, 0x1a, 0x22, 0x28, 0x4d, 0x6e, 0x50, 0x59, 0x42, 0xfd, 0x65, - 0x4e, 0x42, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0xfe, 0x57, 0x03, 0xf0, - 0x05, 0xcc, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x64, 0x40, 0x37, 0x28, 0x17, - 0x0a, 0x0a, 0x23, 0x15, 0x2b, 0x2b, 0x12, 0x10, 0x0e, 0x0f, 0x23, 0x01, - 0x00, 0x0e, 0x01, 0x0a, 0x06, 0x0e, 0x03, 0x23, 0x03, 0x2e, 0x1d, 0x2f, - 0x1a, 0x1f, 0x50, 0x59, 0x1a, 0x00, 0x2a, 0x10, 0x11, 0x10, 0x51, 0x59, - 0x15, 0x14, 0x40, 0x11, 0x0f, 0x0c, 0x26, 0x50, 0x59, 0x0c, 0x16, 0x00, - 0x05, 0x50, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x1a, 0xcc, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x2b, 0x11, 0x01, 0x33, 0x12, 0x17, 0x39, 0x5f, 0x5e, 0x5d, 0x5d, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x06, - 0x23, 0x22, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, - 0x14, 0x06, 0x03, 0x32, 0x37, 0x11, 0x23, 0x11, 0x14, 0x16, 0x01, 0xb2, - 0x4f, 0x37, 0x3c, 0x39, 0x36, 0x3d, 0x1b, 0x58, 0x59, 0xd8, 0x7d, 0x84, - 0x35, 0x78, 0xd5, 0x97, 0x93, 0x6b, 0x2c, 0x31, 0x42, 0x4d, 0x4b, 0x98, - 0x81, 0x26, 0x3d, 0xd5, 0x33, 0xfe, 0x57, 0x13, 0xa0, 0x18, 0x2c, 0x55, - 0x68, 0x2b, 0x16, 0xf5, 0x02, 0xd2, 0x83, 0xf2, 0xf2, 0x30, 0xad, 0xb5, - 0x12, 0xa7, 0x1b, 0x69, 0x80, 0xfb, 0x75, 0xb4, 0xaf, 0x02, 0x36, 0x0d, - 0x03, 0x1d, 0xfd, 0x63, 0x4e, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, - 0xff, 0xec, 0x05, 0x7f, 0x05, 0x2c, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x7c, - 0x40, 0x45, 0x0e, 0x12, 0x12, 0x0b, 0x09, 0x07, 0x26, 0x10, 0x19, 0x20, - 0x1f, 0x1f, 0x35, 0x2d, 0x2d, 0x3b, 0x28, 0x02, 0x17, 0x19, 0x07, 0x07, - 0x3d, 0x3e, 0x1c, 0x23, 0x50, 0x59, 0x20, 0x20, 0x1c, 0x10, 0x28, 0x17, - 0x3b, 0x02, 0x04, 0x04, 0x2b, 0x2b, 0x38, 0x50, 0x59, 0x2b, 0x2b, 0x00, - 0x0a, 0x11, 0x09, 0x0a, 0x09, 0x51, 0x59, 0x0e, 0x0c, 0x0a, 0x10, 0x04, - 0x15, 0x50, 0x59, 0x04, 0x16, 0x00, 0x31, 0x50, 0x59, 0x00, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0xc6, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x17, 0x39, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, - 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x33, - 0x20, 0x15, 0x14, 0x0e, 0x01, 0x27, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x07, 0x16, 0x03, 0xeb, 0xb1, 0x77, 0x7e, 0xa1, 0x7a, - 0x8e, 0x7d, 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x3c, 0x4a, 0x4b, 0x46, 0x56, - 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, 0x69, 0x8f, 0x80, 0x26, - 0x6f, 0xbc, 0x56, 0x01, 0x0b, 0x5c, 0xb1, 0x88, 0x53, 0x71, 0x3d, 0x40, - 0x3c, 0x47, 0x94, 0x58, 0x42, 0x14, 0x64, 0x64, 0x87, 0x7c, 0x02, 0xc8, - 0x83, 0xf2, 0xf2, 0x83, 0xfd, 0x6b, 0x57, 0x44, 0x35, 0x8d, 0xd5, 0x01, - 0x11, 0x01, 0x1f, 0xac, 0x97, 0x0e, 0x5a, 0x6a, 0xbe, 0xe1, 0x82, 0x72, - 0x6f, 0x61, 0xe8, 0x56, 0x85, 0x4f, 0x86, 0x2a, 0x44, 0x29, 0x39, 0x32, - 0x57, 0x65, 0x46, 0x00, 0x00, 0x01, 0x00, 0x1d, 0xfe, 0x57, 0x05, 0x92, - 0x05, 0xca, 0x00, 0x32, 0x00, 0x64, 0x40, 0x38, 0x32, 0x20, 0x20, 0x25, - 0x23, 0x21, 0x00, 0x1b, 0x1b, 0x1c, 0x12, 0x09, 0x09, 0x0e, 0x1c, 0x2b, - 0x21, 0x05, 0x33, 0x34, 0x32, 0x1f, 0x51, 0x59, 0x32, 0x0f, 0x29, 0x2e, - 0x50, 0x59, 0x29, 0x00, 0x24, 0x23, 0x51, 0x59, 0x24, 0x10, 0x21, 0x15, - 0x01, 0x05, 0x1b, 0x15, 0x0b, 0x10, 0x50, 0x59, 0x0b, 0x1b, 0x05, 0x17, - 0x50, 0x59, 0x05, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x39, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x17, - 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x21, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x23, 0x11, 0x27, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, - 0x01, 0x02, 0xe0, 0x08, 0x03, 0x3c, 0x9c, 0x78, 0xb2, 0xa5, 0xfe, 0xe7, - 0x33, 0x55, 0x32, 0x45, 0x75, 0x2a, 0x5c, 0x59, 0x80, 0x8e, 0xb4, 0x01, - 0xd2, 0xb4, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, 0x45, 0x3e, - 0x04, 0x3a, 0xae, 0x6c, 0x56, 0xb1, 0xcc, 0xfc, 0xae, 0xfe, 0xd8, 0x10, - 0xa4, 0x12, 0x94, 0x03, 0x21, 0x6b, 0x76, 0x34, 0xae, 0xa2, 0xfd, 0x8d, - 0x03, 0x53, 0x64, 0xfc, 0x49, 0x03, 0xb7, 0x83, 0x7a, 0x94, 0x82, 0x0c, - 0x89, 0x08, 0x46, 0x5c, 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, - 0xff, 0xec, 0x04, 0xfa, 0x05, 0xcc, 0x00, 0x2e, 0x00, 0x4e, 0x40, 0x29, - 0x2d, 0x03, 0x03, 0x00, 0x1e, 0x11, 0x18, 0x17, 0x09, 0x27, 0x27, 0x17, - 0x11, 0x00, 0x04, 0x2f, 0x30, 0x1e, 0x09, 0x14, 0x2a, 0x2a, 0x06, 0x50, - 0x59, 0x2a, 0x16, 0x2d, 0x00, 0x14, 0x14, 0x1b, 0x50, 0x59, 0x18, 0x14, - 0x10, 0x01, 0x00, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x33, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x16, 0x04, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, - 0x01, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x15, - 0x8a, 0xb4, 0x4e, 0x00, 0xff, 0x8f, 0x94, 0x9d, 0x58, 0x62, 0x81, 0x9b, - 0x83, 0x4a, 0xd3, 0xca, 0xb3, 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, - 0x74, 0x30, 0x5e, 0x97, 0x8f, 0x7e, 0x49, 0x28, 0xfe, 0xfa, 0xda, 0x8a, - 0xff, 0x53, 0x05, 0xcc, 0xfb, 0x52, 0x51, 0x58, 0x57, 0x51, 0x40, 0x50, - 0x1a, 0x22, 0x28, 0x4d, 0x6e, 0x50, 0x94, 0x9b, 0x7e, 0x8b, 0x14, 0x48, - 0x4d, 0x4a, 0x4b, 0x2e, 0x3c, 0x2a, 0x25, 0x24, 0x3d, 0x4a, 0x61, 0x3e, - 0x92, 0xad, 0x47, 0x3c, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8a, - 0x00, 0x00, 0x04, 0xe3, 0x05, 0xcc, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, - 0x40, 0x1f, 0x0b, 0x05, 0x06, 0x03, 0x0a, 0x0a, 0x00, 0x00, 0x05, 0x08, - 0x03, 0x0d, 0x0c, 0x05, 0x09, 0x03, 0x09, 0x50, 0x59, 0x03, 0x0f, 0x01, - 0x00, 0x06, 0x0a, 0x00, 0x0a, 0x50, 0x59, 0x00, 0x15, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x21, 0x15, 0x01, 0x11, 0x01, - 0x8a, 0xb4, 0x03, 0x80, 0xfd, 0x42, 0x02, 0xe3, 0xfc, 0x5b, 0x02, 0xb5, - 0x05, 0xcc, 0xfe, 0x6e, 0x89, 0xfc, 0xda, 0x8b, 0x03, 0xaf, 0xfc, 0xde, - 0x03, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x03, 0xc9, - 0x05, 0xcc, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x46, 0x40, 0x27, 0x0c, 0x19, - 0x0f, 0x02, 0x05, 0x12, 0x06, 0x1a, 0x1b, 0x0f, 0x17, 0x14, 0x03, 0x0e, - 0x18, 0x18, 0x13, 0x07, 0x0a, 0x02, 0x03, 0x09, 0x01, 0x01, 0x03, 0x16, - 0x13, 0x13, 0x06, 0x10, 0x15, 0x0e, 0x15, 0x0c, 0x00, 0x09, 0x00, 0x06, - 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0xce, - 0x32, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x03, - 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, - 0x03, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x05, 0x85, 0x8f, - 0x94, 0x85, 0xbf, 0x7c, 0x86, 0x99, 0x7b, 0x9b, 0x85, 0x7a, 0xc4, 0x85, - 0x8f, 0x94, 0x85, 0xbf, 0x7c, 0x86, 0x99, 0x7b, 0x9b, 0x85, 0x7a, 0x03, - 0x09, 0x02, 0x23, 0xfd, 0xdd, 0x02, 0xc3, 0xfd, 0xc8, 0x02, 0x38, 0xfd, - 0xc8, 0x02, 0x38, 0xfa, 0x35, 0x02, 0x23, 0xfd, 0xdd, 0x02, 0xc3, 0xfd, - 0xc8, 0x02, 0x38, 0xfd, 0xc8, 0x02, 0x38, 0x00, 0x00, 0x02, 0x00, 0x63, - 0x00, 0x00, 0x03, 0xd5, 0x05, 0xcc, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x44, - 0x40, 0x22, 0x04, 0x0c, 0x0c, 0x05, 0x0d, 0x01, 0x09, 0x09, 0x00, 0x08, - 0x0d, 0x08, 0x10, 0x11, 0x0e, 0x0b, 0x53, 0x59, 0x01, 0x05, 0x0e, 0x05, - 0x0e, 0x05, 0x06, 0x09, 0x0d, 0x15, 0x06, 0x03, 0x53, 0x59, 0x06, 0x00, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x11, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, 0x21, - 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, - 0x03, 0xd5, 0xae, 0xfd, 0xeb, 0xaf, 0x03, 0x72, 0xae, 0xfd, 0xeb, 0xaf, - 0x03, 0x72, 0x03, 0xe5, 0x01, 0x3f, 0xfe, 0xc1, 0x01, 0xe7, 0xfa, 0x34, - 0x01, 0x3f, 0xfe, 0xc1, 0x01, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, - 0xfe, 0x56, 0x04, 0xfc, 0x04, 0x4c, 0x00, 0x20, 0x00, 0x3b, 0x40, 0x1e, - 0x1c, 0x20, 0x20, 0x1f, 0x15, 0x07, 0x0f, 0x07, 0x1f, 0x03, 0x22, 0x21, - 0x00, 0x04, 0x1d, 0x0f, 0x11, 0x0c, 0x50, 0x59, 0x11, 0x10, 0x20, 0x04, - 0x04, 0x19, 0x50, 0x59, 0x04, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, - 0xc6, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x23, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x04, 0x47, 0x03, 0x35, 0xa1, 0x7b, - 0xb0, 0xa7, 0x23, 0x4f, 0x46, 0x59, 0x3a, 0x2a, 0x50, 0x83, 0xa7, 0xb0, - 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0xb5, 0x90, 0x50, 0x55, 0xaf, 0xce, - 0x01, 0x10, 0x86, 0x71, 0x3b, 0x26, 0x9f, 0x29, 0xd0, 0xd6, 0xfe, 0xe5, - 0x72, 0x6f, 0x34, 0xb0, 0x95, 0x02, 0x7f, 0xfa, 0x1c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x27, 0xfe, 0x57, 0x06, 0x5a, 0x04, 0x4c, 0x00, 0x29, - 0x00, 0x41, 0x40, 0x23, 0x24, 0x2b, 0x15, 0x07, 0x1f, 0x1c, 0x29, 0x29, - 0x07, 0x0f, 0x03, 0x2a, 0x2b, 0x26, 0x21, 0x50, 0x59, 0x26, 0x1b, 0x00, - 0x04, 0x1d, 0x0f, 0x11, 0x0c, 0x50, 0x59, 0x11, 0x10, 0x04, 0x19, 0x50, - 0x59, 0x04, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x23, 0x0e, 0x01, 0x23, - 0x22, 0x26, 0x35, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x27, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, - 0x35, 0x04, 0x47, 0x03, 0x35, 0xa1, 0x7b, 0xb0, 0xa7, 0x23, 0x4f, 0x46, - 0x59, 0x3a, 0x2a, 0x50, 0x7b, 0xb2, 0xad, 0x2a, 0x60, 0x55, 0x7f, 0x99, - 0xb4, 0xbe, 0x3b, 0x48, 0x1d, 0x61, 0x50, 0xaa, 0xb8, 0x90, 0x50, 0x55, - 0xaf, 0xce, 0x01, 0x10, 0x86, 0x71, 0x3b, 0x26, 0x9f, 0x29, 0xc4, 0xde, - 0xfe, 0xe1, 0x72, 0x6f, 0x34, 0xb0, 0x95, 0x02, 0x7f, 0xfb, 0xb2, 0xf3, - 0x14, 0x9f, 0x17, 0xce, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0x01, 0xea, 0x02, 0xad, 0x06, 0x00, 0x10, 0x07, 0x03, 0x2c, 0x01, 0x8a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x61, 0x01, 0xea, 0x02, 0xad, - 0x06, 0x0a, 0x00, 0x1e, 0x00, 0x40, 0x40, 0x23, 0x08, 0x07, 0x1c, 0x10, - 0x10, 0x11, 0x11, 0x17, 0x07, 0x03, 0x20, 0x1f, 0x14, 0x19, 0xe5, 0x59, - 0x14, 0x00, 0x1e, 0x1e, 0x03, 0x08, 0x11, 0xe8, 0x03, 0x0c, 0xe4, 0x59, - 0x00, 0x03, 0x20, 0x03, 0x02, 0x03, 0xec, 0x00, 0x3f, 0x5d, 0x2b, 0x00, - 0x18, 0x3f, 0x33, 0x12, 0x39, 0x11, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, - 0x22, 0x1d, 0x01, 0x14, 0x07, 0xd8, 0x29, 0x6f, 0x54, 0x76, 0x73, 0x7b, - 0x46, 0x52, 0x58, 0x66, 0x7b, 0xc1, 0x31, 0x30, 0x22, 0x2f, 0x56, 0x06, - 0x04, 0x62, 0x4d, 0x44, 0x7b, 0x92, 0xfe, 0x04, 0x01, 0xe4, 0x71, 0x52, - 0x7d, 0x68, 0xfe, 0x3e, 0x03, 0x4f, 0xd1, 0x0b, 0x75, 0x0e, 0x64, 0x44, - 0x70, 0x1e, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe9, 0x00, 0xbf, 0x00, 0xe2, - 0x06, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x2e, 0x40, 0x16, 0x00, 0x0e, - 0x0e, 0x03, 0x04, 0x04, 0x12, 0x09, 0x11, 0x0f, 0xeb, 0x07, 0x0b, 0xe4, - 0x59, 0x07, 0x01, 0x00, 0xe5, 0x59, 0x01, 0xea, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x11, 0x14, - 0x06, 0x23, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x35, 0x11, 0x33, 0x68, - 0x7a, 0x50, 0x53, 0x39, 0x1d, 0x2a, 0x30, 0x25, 0x7a, 0x05, 0x87, 0x79, - 0x79, 0xfc, 0x05, 0x6b, 0x62, 0x06, 0x62, 0x04, 0x34, 0x48, 0x03, 0x46, - 0x00, 0x01, 0x00, 0x67, 0x01, 0xea, 0x01, 0xc3, 0x04, 0xf3, 0x00, 0x12, - 0x00, 0x2d, 0x40, 0x16, 0x05, 0x12, 0x12, 0x01, 0x00, 0x00, 0x0b, 0x13, - 0x14, 0x05, 0x09, 0x00, 0x09, 0x0e, 0xe5, 0x59, 0x09, 0xec, 0x03, 0xeb, - 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x11, 0x34, 0x27, 0x33, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x15, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x6b, 0x04, 0x74, 0x05, 0x03, 0x1e, - 0x4a, 0x46, 0x16, 0x1c, 0x1c, 0x25, 0x4e, 0x4f, 0x01, 0xea, 0x02, 0x4a, - 0x71, 0x40, 0x9b, 0x62, 0x47, 0x07, 0x74, 0x07, 0x8a, 0x7d, 0xfe, 0x72, - 0x00, 0x01, 0x00, 0x28, 0x01, 0xdc, 0x01, 0x84, 0x04, 0xe5, 0x00, 0x12, - 0x00, 0x2e, 0x40, 0x16, 0x05, 0x11, 0x11, 0x01, 0x01, 0x0b, 0x14, 0x13, - 0x05, 0x06, 0x06, 0x04, 0x12, 0xeb, 0x09, 0x0e, 0xe5, 0x59, 0x09, 0xe9, - 0x04, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x14, 0x17, 0x23, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0x80, 0x04, 0x74, 0x05, - 0x03, 0x1c, 0x4c, 0x46, 0x16, 0x1c, 0x1c, 0x25, 0x4f, 0x4e, 0x04, 0xe5, - 0xfd, 0xb6, 0x71, 0x40, 0x9b, 0x60, 0x49, 0x07, 0x74, 0x07, 0x8a, 0x7d, - 0x01, 0x8e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, 0x00, 0xbe, 0x01, 0xfd, - 0x04, 0xe5, 0x00, 0x18, 0x00, 0x36, 0x40, 0x1a, 0x0b, 0x17, 0x17, 0x01, - 0x01, 0x12, 0x19, 0x07, 0x1a, 0x0c, 0x0f, 0x18, 0xeb, 0x09, 0x04, 0xe5, - 0x59, 0x09, 0x0f, 0x40, 0x0f, 0x14, 0xe5, 0x59, 0x0f, 0xe9, 0x00, 0x3f, - 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, - 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x3d, - 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x11, 0x01, 0x6e, 0x26, 0x26, 0x27, 0x1c, 0x33, 0x26, 0xad, 0x19, 0x4e, - 0x48, 0x16, 0x1c, 0x1e, 0x24, 0x4d, 0x4f, 0x04, 0xe5, 0xfc, 0xb0, 0x39, - 0x2f, 0x0a, 0x71, 0x08, 0xd1, 0xe2, 0x50, 0x45, 0x07, 0x74, 0x07, 0x8a, - 0x7d, 0x01, 0x8e, 0x00, 0x00, 0x02, 0x00, 0x64, 0x01, 0xea, 0x02, 0xdc, - 0x04, 0xe5, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x44, 0x40, 0x22, 0x04, 0x01, - 0x03, 0x00, 0x00, 0x14, 0x14, 0x0b, 0x02, 0x03, 0x03, 0x10, 0x07, 0x0b, - 0x07, 0x15, 0x16, 0x00, 0x13, 0xe4, 0x59, 0x04, 0x00, 0x00, 0x0b, 0x02, - 0x0c, 0xeb, 0x0b, 0x14, 0xe4, 0x59, 0x0b, 0xe8, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, 0x13, 0x33, 0x03, 0x1e, 0x01, 0x15, - 0x14, 0x06, 0x23, 0x21, 0x11, 0x33, 0x13, 0x32, 0x35, 0x34, 0x2b, 0x01, - 0x11, 0xde, 0x88, 0xe2, 0x94, 0xf1, 0x5d, 0x66, 0x93, 0x7d, 0xfe, 0xc6, - 0x7a, 0xb8, 0x97, 0x94, 0xbb, 0x03, 0xb0, 0x01, 0x35, 0xfe, 0xc4, 0x12, - 0x78, 0x5c, 0x66, 0x73, 0x02, 0xfb, 0xfd, 0x65, 0x81, 0x85, 0xfe, 0xfa, - 0x00, 0x01, 0xff, 0xf2, 0x01, 0xeb, 0x03, 0xe5, 0x04, 0xe5, 0x00, 0x16, - 0x00, 0x2e, 0x40, 0x16, 0x15, 0x16, 0x16, 0x04, 0x17, 0x18, 0x0a, 0x09, - 0x09, 0x17, 0x12, 0x0d, 0x04, 0x03, 0x08, 0x15, 0x0f, 0x09, 0xeb, 0x00, - 0x08, 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x17, 0x39, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x03, 0x26, 0x27, 0x0e, 0x01, 0x03, 0x23, 0x03, 0x33, 0x13, - 0x16, 0x17, 0x37, 0x13, 0x33, 0x13, 0x17, 0x3f, 0x01, 0x13, 0x33, 0x03, - 0x12, 0x8e, 0x75, 0x0b, 0x19, 0x0a, 0x0f, 0x85, 0x8d, 0xce, 0x79, 0x7c, - 0x16, 0x08, 0x0e, 0x97, 0x83, 0x81, 0x1f, 0x0d, 0x12, 0x81, 0x78, 0x01, - 0xeb, 0x01, 0xec, 0x27, 0x7e, 0x30, 0x49, 0xfd, 0xe8, 0x02, 0xfa, 0xfd, - 0xfa, 0x52, 0x39, 0x3c, 0x02, 0x55, 0xfd, 0xf5, 0x86, 0x3e, 0x4d, 0x02, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf5, 0x00, 0xbe, 0x02, 0xa8, - 0x04, 0xe5, 0x00, 0x11, 0x00, 0x31, 0x40, 0x17, 0x0d, 0x0e, 0x0e, 0x03, - 0x0b, 0x12, 0x13, 0x09, 0x08, 0x08, 0x12, 0x0d, 0xeb, 0x0b, 0x07, 0x00, - 0x09, 0xeb, 0x00, 0x04, 0xe4, 0x59, 0x00, 0x00, 0x2f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x39, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x22, 0x27, 0x35, 0x17, - 0x32, 0x36, 0x37, 0x01, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x01, 0x0e, - 0x01, 0x74, 0x31, 0x23, 0x39, 0x38, 0x5d, 0x2b, 0xfe, 0xdc, 0x83, 0x9b, - 0x43, 0x2f, 0xa1, 0x82, 0xfe, 0xe5, 0x41, 0x7f, 0xbe, 0x08, 0x5f, 0x04, - 0x58, 0x74, 0x02, 0xf8, 0xfe, 0x5a, 0xcb, 0x8b, 0x01, 0xe6, 0xfd, 0x05, - 0xac, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, 0x03, 0xc6, 0x01, 0x20, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0x03, 0xc6, 0x02, 0x80, 0x05, 0x81, 0x12, 0x06, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7f, 0x04, 0x03, 0x01, 0x48, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x20, 0x40, 0x0d, 0x07, 0x05, 0x00, 0x05, 0x00, 0x09, 0x09, 0x0a, - 0x0b, 0x07, 0x07, 0x05, 0x00, 0x00, 0x2f, 0xcc, 0x39, 0x2f, 0x11, 0x12, - 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x13, 0x35, - 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x33, 0x15, 0x7f, 0x25, 0x2b, 0x79, - 0x5f, 0x59, 0x04, 0x03, 0x92, 0x61, 0x93, 0x43, 0x89, 0x7d, 0xc3, 0x00, - 0x00, 0x01, 0x00, 0x76, 0x04, 0x03, 0x01, 0x3f, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x20, 0x40, 0x0d, 0x04, 0x05, 0x00, 0x08, 0x05, 0x08, 0x0a, 0x0b, - 0x07, 0x07, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, - 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x01, 0x3f, 0x25, 0x2b, - 0x79, 0x5f, 0x59, 0x05, 0xcc, 0x92, 0x61, 0x93, 0x43, 0x89, 0x7d, 0xc3, - 0x00, 0x01, 0x00, 0x8a, 0x04, 0x03, 0x01, 0x53, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x1e, 0x40, 0x0c, 0x02, 0x08, 0x08, 0x04, 0x01, 0x01, 0x0b, 0x0a, - 0x02, 0x02, 0x00, 0x05, 0x00, 0x2f, 0xcc, 0x39, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x15, 0x23, 0x14, - 0x17, 0x23, 0x2e, 0x01, 0x3d, 0x01, 0x01, 0x4d, 0x59, 0x5f, 0x79, 0x2c, - 0x24, 0x05, 0xcc, 0xc3, 0x7d, 0x89, 0x46, 0x93, 0x5e, 0x92, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xf6, 0x04, 0x78, 0x01, 0xaf, 0x05, 0xf3, 0x00, 0x0d, - 0x00, 0x20, 0x40, 0x0d, 0x06, 0x0d, 0x03, 0x0a, 0x0d, 0x0a, 0x0e, 0x0f, - 0x06, 0x00, 0x07, 0x80, 0x0d, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0xf6, 0x2a, 0x37, 0x37, 0x2a, 0x54, 0x65, 0x65, 0x54, 0x04, 0xcd, 0x38, - 0x31, 0x31, 0x37, 0x55, 0x66, 0x57, 0x57, 0x67, 0x00, 0x01, 0x00, 0xfa, - 0x04, 0x78, 0x01, 0xb3, 0x05, 0xf3, 0x00, 0x0d, 0x00, 0x20, 0x40, 0x0d, - 0x0a, 0x03, 0x07, 0x00, 0x03, 0x00, 0x0e, 0x0f, 0x07, 0x0d, 0x06, 0x80, - 0x00, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x01, 0xb3, 0x55, 0x64, - 0x64, 0x55, 0x2a, 0x37, 0x37, 0x2a, 0x04, 0x78, 0x68, 0x56, 0x57, 0x66, - 0x55, 0x37, 0x31, 0x31, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x34, - 0x01, 0xea, 0x02, 0x8f, 0x05, 0xcc, 0x00, 0x16, 0x00, 0x3e, 0x40, 0x1f, - 0x06, 0x12, 0x16, 0x00, 0x0b, 0x0c, 0x0c, 0x00, 0x12, 0x03, 0x18, 0x17, - 0x0b, 0x0b, 0x0f, 0x03, 0x15, 0xe4, 0x59, 0x03, 0x03, 0x00, 0x0f, 0x0f, - 0x09, 0xe4, 0x59, 0x0f, 0xe6, 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, - 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x01, - 0x05, 0x1e, 0x2a, 0x69, 0x59, 0x57, 0x68, 0x89, 0x15, 0x7e, 0x14, 0x95, - 0x70, 0x9e, 0xa4, 0x8c, 0x84, 0x01, 0xea, 0x01, 0x62, 0x0d, 0x93, 0x87, - 0x8e, 0x85, 0x85, 0x0a, 0x68, 0x73, 0xc0, 0xb6, 0xa5, 0xc4, 0x0b, 0xf8, - 0x00, 0x01, 0x00, 0x33, 0x01, 0xea, 0x02, 0x8e, 0x05, 0xcc, 0x00, 0x16, - 0x00, 0x3c, 0x40, 0x1f, 0x10, 0x04, 0x16, 0x00, 0x0b, 0x0a, 0x0a, 0x00, - 0x04, 0x03, 0x17, 0x18, 0x13, 0x01, 0xe4, 0x59, 0x13, 0x13, 0x00, 0x07, - 0x0b, 0x0b, 0x07, 0x07, 0x0d, 0xe4, 0x59, 0x07, 0xe6, 0x00, 0xe8, 0x00, - 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, - 0x11, 0x01, 0x43, 0x84, 0x8c, 0xa4, 0x9e, 0x71, 0x94, 0x14, 0x7e, 0x15, - 0x89, 0x68, 0x57, 0x59, 0x69, 0x2a, 0x1e, 0x01, 0xea, 0xf8, 0x0b, 0xc4, - 0xa5, 0xb5, 0xc1, 0x73, 0x68, 0x0a, 0x85, 0x85, 0x8e, 0x87, 0x93, 0x0d, - 0xfe, 0x9e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0x00, 0x9a, 0x04, 0x48, - 0x04, 0xaa, 0x12, 0x06, 0x00, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, - 0x00, 0x9a, 0x04, 0x48, 0x04, 0xaa, 0x12, 0x06, 0x00, 0x21, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x65, 0x00, 0xed, 0x04, 0x46, 0x04, 0xb8, 0x00, 0x06, - 0x00, 0x1a, 0x40, 0x0b, 0x00, 0x02, 0x04, 0x03, 0x07, 0x08, 0x02, 0x01, - 0x06, 0x04, 0x01, 0x00, 0x2f, 0x33, 0x2f, 0x12, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x31, 0x30, 0x25, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x04, - 0x46, 0xa7, 0xfe, 0xb5, 0xfe, 0xb8, 0xa7, 0x01, 0x9a, 0xa8, 0xed, 0x03, - 0x0e, 0xfc, 0xf2, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, - 0x00, 0xed, 0x04, 0x46, 0x04, 0xb8, 0x00, 0x06, 0x00, 0x1a, 0x40, 0x0b, - 0x06, 0x04, 0x02, 0x03, 0x07, 0x08, 0x04, 0x01, 0x05, 0x03, 0x01, 0x00, - 0x2f, 0x2f, 0x33, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, - 0x25, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0xa7, 0xa8, 0xfe, 0x66, - 0xa7, 0x01, 0x48, 0x01, 0x4b, 0xa7, 0xed, 0x03, 0xcb, 0xfc, 0xf2, 0x03, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0xb1, 0x02, 0x96, - 0x05, 0xd3, 0x00, 0x09, 0x00, 0x21, 0x40, 0x0f, 0x09, 0x08, 0x03, 0x03, - 0x01, 0x06, 0x01, 0x06, 0x0b, 0x0a, 0x01, 0x08, 0x94, 0x5b, 0x01, 0x00, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, - 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, - 0x33, 0x02, 0x96, 0x69, 0xdb, 0x02, 0xe8, 0x68, 0xea, 0xcc, 0x04, 0xc5, - 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x04, 0xb1, 0x02, 0x96, 0x05, 0xd3, 0x00, 0x09, 0x00, 0x21, 0x40, 0x0f, - 0x00, 0x01, 0x05, 0x05, 0x08, 0x03, 0x08, 0x03, 0x0b, 0x0a, 0x01, 0x03, - 0x94, 0x5b, 0x01, 0x00, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x12, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x23, 0x03, 0x35, 0x33, - 0x17, 0x33, 0x37, 0x33, 0x15, 0x01, 0xb6, 0xcc, 0xea, 0x68, 0xe8, 0x02, - 0xdb, 0x69, 0x04, 0xb1, 0x01, 0x0e, 0x14, 0xa9, 0xa9, 0x14, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x1c, 0x04, 0x80, 0x01, 0x8d, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x15, 0xb7, 0x00, 0x01, 0x01, 0x04, 0x05, 0x03, 0x80, 0x01, 0x00, - 0x2f, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x23, 0x11, 0x33, 0x01, 0x8d, 0x71, 0x71, 0x04, 0x80, 0x01, 0x4c, 0x00, - 0x00, 0x01, 0x00, 0x33, 0x04, 0xd4, 0x02, 0x58, 0x05, 0x53, 0x00, 0x03, - 0x00, 0x19, 0x40, 0x0c, 0x01, 0x00, 0x04, 0x05, 0x01, 0x02, 0x8e, 0x59, - 0x0f, 0x01, 0x01, 0x01, 0x00, 0x2f, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x02, 0x58, 0xfd, 0xdb, 0x02, - 0x25, 0x04, 0xd4, 0x7f, 0x00, 0x01, 0x00, 0xc7, 0x04, 0xb5, 0x02, 0x18, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x00, 0x03, 0x06, 0x07, 0x03, - 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x35, 0x13, 0x33, 0x15, 0x07, 0xc7, 0x82, 0xcf, 0xf3, 0x04, - 0xb5, 0x14, 0x01, 0x03, 0x1d, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x95, - 0x04, 0xb5, 0x01, 0xe6, 0x05, 0xcc, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x01, - 0x04, 0x06, 0x07, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x27, 0x35, 0x33, 0x13, 0x15, 0x01, - 0x88, 0xf3, 0xcf, 0x82, 0x04, 0xb5, 0xfa, 0x1d, 0xfe, 0xfd, 0x14, 0x00, - 0x00, 0x01, 0x01, 0x1c, 0xfe, 0x6a, 0x01, 0x8d, 0xff, 0xb6, 0x00, 0x03, - 0x00, 0x15, 0xb7, 0x00, 0x01, 0x01, 0x04, 0x05, 0x01, 0x80, 0x03, 0x00, - 0x2f, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x23, 0x11, 0x33, 0x01, 0x8d, 0x71, 0x71, 0xfe, 0x6a, 0x01, 0x4c, 0x00, - 0x00, 0x01, 0x00, 0x43, 0xfe, 0xec, 0x02, 0x68, 0xff, 0x6b, 0x00, 0x03, - 0x00, 0x11, 0xb5, 0x01, 0x00, 0x04, 0x05, 0x00, 0x03, 0x00, 0x2f, 0xcd, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x02, - 0x68, 0xfd, 0xdb, 0x02, 0x25, 0xfe, 0xec, 0x7f, 0x00, 0x01, 0x00, 0x77, - 0xfe, 0x6a, 0x01, 0xc8, 0xff, 0x81, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x01, - 0x04, 0x06, 0x07, 0x00, 0x80, 0x03, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x27, 0x35, 0x33, 0x13, 0x15, 0x01, - 0x6a, 0xf3, 0xcf, 0x82, 0xfe, 0x6a, 0xfa, 0x1d, 0xfe, 0xfd, 0x14, 0x00, - 0x00, 0x01, 0x00, 0xe5, 0xfe, 0x6a, 0x02, 0x36, 0xff, 0x81, 0x00, 0x05, - 0x00, 0x13, 0xb6, 0x00, 0x03, 0x06, 0x07, 0x00, 0x80, 0x03, 0x00, 0x2f, - 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x13, 0x35, 0x13, - 0x33, 0x15, 0x07, 0xe5, 0x82, 0xcf, 0xf3, 0xfe, 0x6a, 0x14, 0x01, 0x03, - 0x1d, 0xfa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb1, 0x00, 0x00, 0x01, 0x88, - 0x04, 0x3a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1b, 0x40, 0x0d, 0x00, 0x07, - 0x04, 0x03, 0x04, 0x08, 0x09, 0x06, 0x04, 0x15, 0x01, 0x03, 0x0f, 0x00, - 0x3f, 0xcd, 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x01, - 0x07, 0x23, 0x27, 0x11, 0x37, 0x33, 0x17, 0x01, 0x88, 0x65, 0x0d, 0x65, - 0x65, 0x0d, 0x65, 0x04, 0x3a, 0xd7, 0xd7, 0xfb, 0xc6, 0xd7, 0xd7, 0x00, - 0x00, 0x01, 0x00, 0xb1, 0x03, 0x63, 0x01, 0x88, 0x04, 0x3a, 0x00, 0x03, - 0x00, 0x12, 0xb6, 0x03, 0x00, 0x04, 0x05, 0x01, 0x03, 0x0f, 0x00, 0x3f, - 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x07, 0x23, 0x27, - 0x01, 0x88, 0x65, 0x0d, 0x65, 0x04, 0x3a, 0xd7, 0xd7, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xf6, 0x00, 0x5c, 0x01, 0xaf, 0x01, 0xd7, 0x00, 0x0d, - 0x00, 0x20, 0x40, 0x0d, 0x03, 0x0a, 0x06, 0x0d, 0x0a, 0x0d, 0x0f, 0x0e, - 0x06, 0x00, 0x07, 0x80, 0x0d, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0xf6, 0x2a, 0x37, 0x37, 0x2a, 0x54, 0x65, 0x65, 0x54, 0xb1, 0x38, 0x31, - 0x31, 0x37, 0x55, 0x66, 0x57, 0x57, 0x67, 0x00, 0x00, 0x01, 0x00, 0xfa, - 0x00, 0x5c, 0x01, 0xb3, 0x01, 0xd7, 0x00, 0x0d, 0x00, 0x20, 0x40, 0x0d, - 0x0a, 0x03, 0x07, 0x00, 0x03, 0x00, 0x0e, 0x0f, 0x07, 0x0d, 0x06, 0x80, - 0x00, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x01, 0xb3, 0x55, 0x64, - 0x64, 0x55, 0x2a, 0x37, 0x37, 0x2a, 0x5c, 0x68, 0x56, 0x57, 0x66, 0x55, - 0x37, 0x31, 0x31, 0x38, 0x00, 0x01, 0x00, 0xa1, 0x00, 0xad, 0x02, 0x08, - 0x01, 0xfe, 0x00, 0x07, 0x00, 0x20, 0x40, 0x0e, 0x06, 0x03, 0x00, 0x03, - 0x01, 0x03, 0x08, 0x09, 0x06, 0x02, 0x02, 0x05, 0x80, 0x01, 0x00, 0x2f, - 0x1a, 0xcc, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x25, 0x21, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x02, 0x08, - 0xfe, 0x99, 0x7b, 0x71, 0x7b, 0xad, 0x6c, 0xe5, 0xe5, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa1, 0x00, 0xad, 0x02, 0x08, 0x01, 0xfe, 0x00, 0x07, - 0x00, 0x20, 0x40, 0x0e, 0x02, 0x03, 0x07, 0x03, 0x05, 0x03, 0x08, 0x09, - 0x01, 0x05, 0x05, 0x07, 0x80, 0x03, 0x00, 0x2f, 0x1a, 0xcc, 0x32, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, - 0x15, 0x23, 0x35, 0x23, 0x35, 0x21, 0x02, 0x08, 0x7b, 0x71, 0x7b, 0x01, - 0x67, 0x01, 0x92, 0xe5, 0xe5, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, - 0x00, 0xa3, 0x02, 0x08, 0x02, 0x08, 0x00, 0x0b, 0x00, 0x2c, 0x40, 0x14, - 0x0a, 0x02, 0x02, 0x07, 0x03, 0x00, 0x03, 0x05, 0x03, 0x0c, 0x0d, 0x0a, - 0x06, 0x01, 0x05, 0x06, 0x05, 0x09, 0xc0, 0x03, 0x00, 0x2f, 0x1a, 0xcd, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x15, 0x23, 0x35, 0x23, - 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x02, 0x08, 0x7b, 0x71, 0x7b, 0x7b, - 0x71, 0x7b, 0x01, 0x20, 0x7d, 0x7d, 0x6c, 0x7c, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1d, 0x01, 0x13, 0x02, 0x8d, 0x01, 0xa0, 0x00, 0x03, - 0x00, 0x11, 0xb5, 0x00, 0x01, 0x05, 0x04, 0x02, 0x01, 0x00, 0x2f, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x02, - 0x8d, 0xfd, 0x90, 0x02, 0x70, 0x01, 0x13, 0x8d, 0x00, 0x01, 0xff, 0xdd, - 0x04, 0xb1, 0x02, 0x77, 0x05, 0xe6, 0x00, 0x0b, 0x00, 0x31, 0x40, 0x1b, - 0x09, 0x0d, 0x03, 0x0c, 0x08, 0x50, 0x03, 0x60, 0x03, 0x02, 0x80, 0x03, - 0xf0, 0x03, 0x02, 0x0f, 0x03, 0x01, 0x09, 0x03, 0x03, 0x00, 0x00, 0x06, - 0x8f, 0x59, 0x00, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x5f, 0x5e, - 0x5d, 0x5d, 0x71, 0x32, 0x11, 0x01, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, - 0x22, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x01, - 0x29, 0x84, 0xb6, 0x12, 0x75, 0x1c, 0xbd, 0xba, 0x1d, 0x75, 0x15, 0xb3, - 0x04, 0xb1, 0xaa, 0x8b, 0x99, 0x99, 0x8e, 0xa7, 0x00, 0x01, 0x00, 0x9c, - 0x05, 0x20, 0x01, 0x50, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x17, 0x40, 0x0a, - 0x03, 0x00, 0x00, 0x05, 0x04, 0x00, 0x01, 0x90, 0x59, 0x00, 0x00, 0x2f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, - 0x15, 0x9c, 0xb4, 0x05, 0x20, 0xac, 0xac, 0x00, 0x00, 0x02, 0x00, 0x33, - 0x04, 0x90, 0x02, 0x17, 0x06, 0x73, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x4a, - 0x40, 0x2f, 0x0c, 0x00, 0x12, 0x06, 0x00, 0x06, 0x19, 0x18, 0x09, 0x0f, - 0x8d, 0x59, 0xf0, 0x09, 0x01, 0x0f, 0x09, 0x1f, 0x09, 0x02, 0x09, 0x03, - 0x09, 0x03, 0x40, 0x03, 0x15, 0x8d, 0x59, 0x0f, 0x03, 0x2f, 0x03, 0x3f, - 0x03, 0x4f, 0x03, 0x7f, 0x03, 0x9f, 0x03, 0xbf, 0x03, 0xef, 0x03, 0x08, - 0x03, 0x00, 0x2f, 0x5d, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x5f, 0x5e, - 0x5d, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x36, 0x02, 0x17, 0x8e, 0x64, 0x64, 0x8e, 0x8e, 0x64, 0x63, 0x8f, - 0x6c, 0x4e, 0x38, 0x39, 0x4e, 0x4c, 0x3b, 0x3a, 0x4c, 0x05, 0x82, 0x64, - 0x8e, 0x8e, 0x64, 0x65, 0x8c, 0x8d, 0x64, 0x38, 0x4e, 0x4e, 0x38, 0x37, - 0x52, 0x51, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0xfe, 0x55, 0x01, 0xae, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x39, 0x40, 0x23, 0x09, 0x0e, 0x0e, 0x05, - 0x00, 0x05, 0x15, 0x14, 0x08, 0x40, 0x07, 0x0a, 0x48, 0x08, 0x02, 0x11, - 0x8d, 0x59, 0x10, 0x02, 0x01, 0x20, 0x02, 0x50, 0x02, 0x60, 0x02, 0x70, - 0x02, 0xb0, 0x02, 0xc0, 0x02, 0x06, 0x02, 0x00, 0x2f, 0x5d, 0x71, 0x2b, - 0x00, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, - 0x33, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x01, 0xae, 0x3f, - 0x4c, 0x69, 0x6a, 0x57, 0x44, 0x85, 0x19, 0x34, 0x2b, 0x1b, 0x31, 0x2d, - 0x36, 0x3d, 0xfe, 0x70, 0x1b, 0x66, 0x55, 0x46, 0x84, 0x26, 0x0e, 0x2d, - 0x3b, 0x46, 0x27, 0x2a, 0x30, 0x18, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x00, 0x17, 0x02, 0x04, 0x40, 0xff, - 0x15, 0x19, 0x09, 0x18, 0x14, 0x14, 0x0d, 0x0d, 0x05, 0x8f, 0x59, 0x20, - 0x0d, 0x01, 0xb0, 0x0d, 0xc0, 0x0d, 0xd0, 0x0d, 0x03, 0x0f, 0x0d, 0x1f, - 0x0d, 0x2f, 0x0d, 0x03, 0x09, 0x03, 0x0d, 0x00, 0x40, 0x00, 0x12, 0x8f, - 0x59, 0x08, 0x00, 0x9d, 0x19, 0x01, 0x8d, 0x19, 0x01, 0x79, 0x19, 0x01, - 0x69, 0x19, 0x01, 0x5b, 0x19, 0x01, 0x49, 0x19, 0x01, 0x39, 0x19, 0x01, - 0x2b, 0x19, 0x01, 0x1b, 0x19, 0x01, 0x09, 0x19, 0x01, 0xf6, 0x19, 0x01, - 0xe6, 0x19, 0x01, 0xd6, 0x19, 0x01, 0x96, 0x19, 0x01, 0x86, 0x19, 0x01, - 0x74, 0x19, 0x01, 0x62, 0x19, 0x01, 0x52, 0x19, 0x01, 0x42, 0x19, 0x01, - 0x32, 0x19, 0x01, 0x22, 0x19, 0x01, 0x12, 0x19, 0x01, 0x02, 0x19, 0x01, - 0x67, 0xf2, 0x19, 0x01, 0xe2, 0x19, 0x01, 0xd4, 0x19, 0x01, 0xc0, 0x19, - 0x01, 0xb0, 0x19, 0x01, 0xa2, 0x19, 0x01, 0x92, 0x19, 0x01, 0x80, 0x19, - 0x01, 0x72, 0x19, 0x01, 0x62, 0x19, 0x01, 0x52, 0x19, 0x01, 0x44, 0x19, - 0x01, 0x34, 0x19, 0x01, 0x24, 0x19, 0x01, 0x16, 0x19, 0x01, 0x04, 0x19, - 0x01, 0xf0, 0x19, 0x01, 0xe2, 0x19, 0x01, 0xd0, 0x19, 0x01, 0xc0, 0x19, - 0x01, 0xb2, 0x19, 0x01, 0xa2, 0x19, 0x01, 0x92, 0x19, 0x01, 0x84, 0x19, - 0x01, 0x74, 0x19, 0x01, 0x64, 0x19, 0x01, 0x56, 0x19, 0x01, 0x46, 0x19, - 0x01, 0x36, 0x19, 0x01, 0x22, 0x19, 0x01, 0x12, 0x19, 0x01, 0x00, 0x19, - 0x01, 0xf2, 0x19, 0x01, 0xe2, 0x19, 0x01, 0xd2, 0x19, 0x01, 0xc4, 0x19, - 0x01, 0xb4, 0x19, 0x01, 0xa4, 0x19, 0x01, 0x96, 0x19, 0x01, 0x86, 0x19, - 0x01, 0x76, 0x19, 0x01, 0x66, 0x19, 0x01, 0x56, 0x19, 0x01, 0x42, 0x19, - 0x01, 0x01, 0x30, 0x19, 0x01, 0x20, 0x19, 0x01, 0x10, 0x19, 0x01, 0x00, - 0x19, 0x01, 0x37, 0x40, 0x74, 0xf0, 0x19, 0x01, 0xe0, 0x19, 0x01, 0xd4, - 0x19, 0x01, 0xc4, 0x19, 0x01, 0xb0, 0x19, 0x01, 0xa4, 0x19, 0x01, 0x94, - 0x19, 0x01, 0x84, 0x19, 0x01, 0x70, 0x19, 0x01, 0x60, 0x19, 0x01, 0x50, - 0x19, 0x01, 0x44, 0x19, 0x01, 0x34, 0x19, 0x01, 0x24, 0x19, 0x01, 0x00, - 0x19, 0x01, 0xf0, 0x19, 0x01, 0xe4, 0x19, 0x01, 0xd4, 0x19, 0x01, 0xc4, - 0x19, 0x01, 0xa0, 0x19, 0x01, 0x90, 0x19, 0x01, 0x84, 0x19, 0x01, 0x74, - 0x19, 0x01, 0x64, 0x19, 0x01, 0x54, 0x19, 0x01, 0x44, 0x19, 0x01, 0x34, - 0x19, 0x01, 0x04, 0x19, 0x01, 0xc4, 0x19, 0x01, 0xb4, 0x19, 0x01, 0xa0, - 0x19, 0x01, 0x02, 0x90, 0x19, 0x01, 0x80, 0x19, 0x01, 0x70, 0x19, 0x01, - 0x3f, 0x19, 0x01, 0x2f, 0x19, 0x01, 0x1f, 0x19, 0x01, 0x0f, 0x19, 0x01, - 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x2f, 0x32, 0x2b, 0x00, - 0x1a, 0x18, 0x10, 0xcd, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, - 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, - 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x01, 0xec, 0x2a, 0x54, 0x4e, - 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, 0x30, 0x51, 0x3f, 0x2c, 0x54, - 0x4e, 0x45, 0x1e, 0x64, 0x11, 0x5c, 0x11, 0x64, 0x04, 0xb1, 0x25, 0x2d, - 0x25, 0x3e, 0x39, 0x66, 0x69, 0x3d, 0x25, 0x2d, 0x25, 0x77, 0x94, 0x78, - 0x00, 0x02, 0x00, 0x16, 0x04, 0xb1, 0x03, 0x19, 0x05, 0xe4, 0x00, 0x05, - 0x00, 0x0b, 0x00, 0x24, 0x40, 0x10, 0x06, 0x0a, 0x04, 0x00, 0x0a, 0x00, - 0x0d, 0x0c, 0x08, 0x02, 0x00, 0x02, 0x95, 0x5b, 0x06, 0x00, 0x00, 0x2f, - 0x32, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x32, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x13, 0x33, 0x15, 0x01, 0x33, 0x35, - 0x13, 0x33, 0x15, 0x01, 0x16, 0xd9, 0xcf, 0xfe, 0xb6, 0xfd, 0xd9, 0xcf, - 0xfe, 0xb6, 0x04, 0xb1, 0x14, 0x01, 0x1f, 0x1d, 0xfe, 0xea, 0x14, 0x01, - 0x1f, 0x1d, 0xfe, 0xea, 0x00, 0x01, 0xff, 0xe6, 0x01, 0x65, 0x02, 0x1a, - 0x03, 0x0c, 0x00, 0x0d, 0x00, 0x1c, 0x40, 0x0b, 0x02, 0x00, 0x0c, 0x0c, - 0x08, 0x0e, 0x0f, 0x0c, 0x05, 0x01, 0x0a, 0x00, 0x2f, 0xcc, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x03, 0x37, - 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x03, 0x07, - 0x1a, 0xe5, 0x1d, 0x0e, 0x33, 0x32, 0x34, 0x50, 0x3b, 0x7e, 0x55, 0xd2, - 0x2a, 0x4e, 0x02, 0xe9, 0x23, 0x88, 0x44, 0x3c, 0x28, 0x93, 0x34, 0x01, - 0x0c, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x03, 0x2d, 0x02, 0xa7, - 0x05, 0xd1, 0x00, 0x0b, 0x00, 0x2c, 0x40, 0x16, 0x0a, 0x0b, 0x08, 0x02, - 0x05, 0x04, 0x00, 0x06, 0x04, 0x00, 0x04, 0x0d, 0x0c, 0x08, 0x0b, 0x05, - 0x02, 0x04, 0x09, 0x07, 0x03, 0x01, 0x00, 0x2f, 0x33, 0xcd, 0x32, 0x17, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x17, 0x39, 0x32, - 0x31, 0x30, 0x01, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, - 0x17, 0x07, 0x02, 0xa7, 0x58, 0xfa, 0xfa, 0x58, 0xfb, 0xfb, 0x58, 0xfa, - 0xfa, 0x58, 0xfb, 0x03, 0x85, 0x58, 0xfb, 0xfb, 0x58, 0xfa, 0xfa, 0x58, - 0xfb, 0xfb, 0x58, 0xfa, 0x00, 0x02, 0xff, 0xf2, 0x00, 0xbe, 0x02, 0xa0, - 0x04, 0xe5, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x3b, 0x40, 0x1f, 0x17, 0x0f, - 0x12, 0x09, 0x09, 0x06, 0x03, 0x15, 0x00, 0x0f, 0x06, 0x01, 0x04, 0x05, - 0x05, 0x1d, 0x02, 0x01, 0x01, 0x1c, 0x15, 0x00, 0x06, 0x03, 0x04, 0x04, - 0x1a, 0x0c, 0x04, 0x01, 0xeb, 0x00, 0x3f, 0x33, 0x2f, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x01, 0x33, 0x1b, 0x01, - 0x33, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x37, 0x17, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0xfd, - 0xfe, 0xf5, 0x82, 0xd2, 0xd9, 0x81, 0xfe, 0xee, 0x2a, 0x2c, 0x55, 0x49, - 0x4a, 0x53, 0x4a, 0x87, 0x13, 0x21, 0x33, 0x1b, 0x18, 0x34, 0x02, 0x54, - 0x02, 0x91, 0xfd, 0xfa, 0x02, 0x06, 0xfd, 0x6f, 0x48, 0x7f, 0x28, 0x4c, - 0x5b, 0x5b, 0x4c, 0x54, 0x88, 0xd7, 0x17, 0x40, 0x43, 0x63, 0x37, 0x20, - 0x25, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x01, 0xea, 0x00, 0xde, - 0x06, 0x00, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, 0x00, 0x03, 0x03, 0x04, - 0x05, 0x01, 0xea, 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x64, 0x7a, 0x01, 0xea, - 0x04, 0x16, 0xfb, 0xea, 0x00, 0x01, 0x00, 0x2c, 0x01, 0xde, 0x02, 0x8b, - 0x04, 0xf3, 0x00, 0x27, 0x00, 0x40, 0x40, 0x21, 0x07, 0x06, 0x20, 0x14, - 0x1b, 0x1a, 0x0c, 0x00, 0x00, 0x1a, 0x14, 0x06, 0x04, 0x28, 0x29, 0x20, - 0x0c, 0x17, 0x03, 0x17, 0x1d, 0xe4, 0x59, 0x1b, 0x17, 0xec, 0x03, 0x0a, - 0xe4, 0x59, 0x07, 0x03, 0xe9, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x35, 0x34, - 0x2e, 0x01, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x02, - 0x02, 0x8b, 0x9b, 0x8f, 0x80, 0x9c, 0x19, 0x6c, 0x10, 0x62, 0x57, 0xb3, - 0x21, 0x3d, 0x78, 0x67, 0x5b, 0x33, 0x90, 0x89, 0x7a, 0x8f, 0x13, 0x6e, - 0x15, 0x99, 0x53, 0x4f, 0x36, 0x41, 0x50, 0x79, 0x57, 0x34, 0x02, 0xbf, - 0x6c, 0x75, 0x56, 0x6b, 0x16, 0x3d, 0x39, 0x76, 0x24, 0x2d, 0x1f, 0x20, - 0x1c, 0x36, 0x4d, 0x39, 0x69, 0x6d, 0x58, 0x63, 0x0e, 0x69, 0x33, 0x36, - 0x28, 0x32, 0x12, 0x16, 0x21, 0x36, 0x54, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x01, 0xea, 0x02, 0x9d, 0x04, 0xe5, 0x10, 0x07, 0x03, 0x31, 0x01, 0x4e, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, 0x01, 0xea, 0x02, 0x8e, - 0x05, 0xcc, 0x12, 0x06, 0x02, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x05, 0x00, 0x1a, 0x40, 0x0b, - 0x01, 0x00, 0x03, 0x00, 0x06, 0x07, 0x03, 0x04, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x02, 0x70, 0x88, 0xfe, 0xb8, 0x01, - 0xd0, 0x04, 0xf9, 0x88, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x24, 0x40, 0x10, 0x05, 0x01, 0x01, 0x00, - 0x03, 0x00, 0x08, 0x09, 0x03, 0x04, 0x04, 0x01, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, - 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xb8, 0x01, 0x48, 0x88, 0x03, 0xe3, - 0x88, 0x01, 0x16, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x24, 0x40, 0x10, 0x05, 0x01, 0x01, 0x00, - 0x03, 0x00, 0x08, 0x09, 0x03, 0x04, 0x04, 0x01, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, - 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xb8, 0x01, 0x48, 0x88, 0x02, 0x9b, - 0x88, 0x02, 0x5e, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x24, 0x40, 0x10, 0x05, 0x01, 0x01, 0x00, - 0x03, 0x00, 0x08, 0x09, 0x03, 0x04, 0x04, 0x01, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, - 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xb8, 0x01, 0x48, 0x88, 0x01, 0x56, - 0x88, 0x03, 0xa3, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x05, 0x00, 0x1a, 0x40, 0x0b, 0x03, 0x00, 0x01, 0x00, - 0x06, 0x07, 0x04, 0x03, 0x02, 0x01, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x35, 0x21, - 0x11, 0x33, 0x02, 0x70, 0xfe, 0x30, 0x01, 0x48, 0x88, 0x88, 0x04, 0xf9, - 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x02, 0x49, 0x03, 0x70, 0x00, 0x05, - 0x00, 0x18, 0x40, 0x09, 0x04, 0x01, 0x01, 0x00, 0x06, 0x07, 0x04, 0x03, - 0x01, 0x00, 0x2f, 0xcd, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x02, 0x49, 0xfe, 0x19, - 0x88, 0x01, 0x5f, 0x03, 0x70, 0xfd, 0x09, 0x00, 0x00, 0x01, 0x00, 0x62, - 0x00, 0x00, 0x02, 0x49, 0x03, 0x70, 0x00, 0x07, 0x00, 0x20, 0x40, 0x0d, - 0x06, 0x02, 0x02, 0x03, 0x03, 0x00, 0x08, 0x09, 0x01, 0x06, 0x06, 0x05, - 0x03, 0x00, 0x2f, 0xcd, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, - 0x11, 0x21, 0x02, 0x49, 0xfe, 0x8d, 0x74, 0x74, 0x01, 0x73, 0x01, 0x89, - 0xfe, 0x77, 0x03, 0x70, 0xfe, 0x7d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0xfe, 0x58, 0x02, 0x96, 0xff, 0x7a, 0x10, 0x07, 0x02, 0x89, 0x00, 0x00, - 0xf9, 0xa7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1d, 0x04, 0xd7, 0x02, 0x8d, - 0x06, 0x1c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x20, 0x40, 0x0d, 0x05, 0x01, - 0x04, 0x00, 0x01, 0x00, 0x08, 0x09, 0x01, 0x06, 0x03, 0x80, 0x05, 0x00, - 0x2f, 0x1a, 0xcc, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, - 0x02, 0x8d, 0xfd, 0x90, 0x02, 0x70, 0xfd, 0x90, 0x02, 0x70, 0x05, 0xa6, - 0x76, 0xfe, 0xbb, 0x76, 0x00, 0x02, 0x00, 0x50, 0x04, 0x03, 0x02, 0x4e, - 0x05, 0xcc, 0x00, 0x09, 0x00, 0x13, 0x00, 0x30, 0x40, 0x15, 0x11, 0x0f, - 0x12, 0x07, 0x12, 0x0b, 0x05, 0x01, 0x08, 0x0b, 0x08, 0x15, 0x14, 0x12, - 0x08, 0x08, 0x13, 0x00, 0x80, 0x0f, 0x05, 0x00, 0x2f, 0x33, 0x1a, 0xcc, - 0x32, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x15, 0x14, 0x06, - 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x21, 0x15, 0x14, 0x06, 0x07, 0x23, - 0x36, 0x35, 0x23, 0x35, 0x01, 0x19, 0x25, 0x2b, 0x79, 0x5f, 0x59, 0x01, - 0xf8, 0x25, 0x2b, 0x79, 0x5f, 0x59, 0x05, 0xcc, 0x92, 0x61, 0x93, 0x43, - 0x89, 0x7d, 0xc3, 0x92, 0x61, 0x93, 0x43, 0x89, 0x7d, 0xc3, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x81, 0xfe, 0x9f, 0x02, 0x25, 0xff, 0xb8, 0x00, 0x06, - 0x00, 0x18, 0x40, 0x09, 0x06, 0x02, 0x08, 0x07, 0x04, 0x01, 0x80, 0x05, - 0x03, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x23, 0x03, 0x33, 0x17, 0x37, 0x33, 0x01, 0x7c, 0x52, - 0xa9, 0x72, 0x60, 0x60, 0x72, 0xfe, 0x9f, 0x01, 0x19, 0xaa, 0xaa, 0x00, - 0x00, 0x01, 0x00, 0x81, 0xfe, 0x9f, 0x02, 0x25, 0xff, 0xb8, 0x00, 0x06, - 0x00, 0x18, 0x40, 0x09, 0x04, 0x00, 0x07, 0x08, 0x02, 0x04, 0x01, 0x80, - 0x06, 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x23, 0x27, 0x07, 0x23, 0x13, 0x33, 0x02, 0x25, 0x72, - 0x60, 0x60, 0x72, 0xa9, 0x52, 0xfe, 0x9f, 0xaa, 0xaa, 0x01, 0x19, 0x00, - 0x00, 0x01, 0x00, 0xc8, 0xfe, 0x56, 0x01, 0xe1, 0xff, 0xfa, 0x00, 0x06, - 0x00, 0x1e, 0x40, 0x0c, 0x04, 0x00, 0x02, 0x05, 0x00, 0x05, 0x08, 0x07, - 0x02, 0x04, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x15, 0x07, 0x17, - 0x15, 0x25, 0x35, 0x01, 0xe1, 0xaa, 0xaa, 0xfe, 0xe7, 0x06, 0x72, 0x60, - 0x60, 0x72, 0xa9, 0x52, 0x00, 0x01, 0x00, 0xc8, 0xfe, 0x56, 0x01, 0xe1, - 0xff, 0xfa, 0x00, 0x06, 0x00, 0x1e, 0x40, 0x0c, 0x05, 0x02, 0x04, 0x01, - 0x02, 0x01, 0x07, 0x08, 0x04, 0x02, 0x80, 0x06, 0x00, 0x2f, 0x1a, 0xce, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x05, 0x15, 0x05, 0x35, 0x37, 0x27, 0x35, 0x01, 0xe1, 0xfe, 0xe7, 0xaa, - 0xaa, 0xaf, 0x52, 0xa9, 0x72, 0x60, 0x60, 0x72, 0x00, 0x02, 0x00, 0x8d, - 0xfe, 0x57, 0x02, 0x1d, 0xff, 0xd4, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x20, - 0x40, 0x0d, 0x0c, 0x00, 0x12, 0x06, 0x00, 0x06, 0x19, 0x18, 0x15, 0x03, - 0x80, 0x0f, 0x09, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0x1d, 0x78, 0x50, - 0x50, 0x78, 0x77, 0x51, 0x52, 0x76, 0x60, 0x3b, 0x2d, 0x2d, 0x3c, 0x3c, - 0x2d, 0x2d, 0x3b, 0xea, 0x51, 0x6e, 0x6f, 0x50, 0x50, 0x6e, 0x6e, 0x50, - 0x2d, 0x37, 0x37, 0x2d, 0x2d, 0x39, 0x39, 0x00, 0x00, 0x01, 0x00, 0x8d, - 0x01, 0x0f, 0x02, 0x0d, 0x02, 0x42, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x04, - 0x01, 0x07, 0x06, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x09, 0x01, 0x35, 0x33, 0x13, 0x15, 0x01, - 0xaf, 0xfe, 0xde, 0xcf, 0xb1, 0x01, 0x0f, 0x01, 0x16, 0x1d, 0xfe, 0xe1, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe6, 0x01, 0x0f, 0x02, 0xc1, - 0x02, 0x42, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x20, 0x40, 0x0d, 0x02, 0x0b, - 0x08, 0x04, 0x04, 0x0d, 0x08, 0x0c, 0x03, 0x09, 0x80, 0x00, 0x06, 0x00, - 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x09, 0x01, 0x35, 0x33, 0x13, 0x15, 0x21, 0x01, - 0x35, 0x33, 0x13, 0x15, 0x02, 0x63, 0xfe, 0xde, 0xcf, 0xb1, 0xfe, 0x47, - 0xfe, 0xde, 0xcf, 0xb1, 0x01, 0x0f, 0x01, 0x16, 0x1d, 0xfe, 0xe1, 0x14, - 0x01, 0x16, 0x1d, 0xfe, 0xe1, 0x14, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe7, - 0x01, 0x0f, 0x02, 0xc2, 0x02, 0x42, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x20, - 0x40, 0x0d, 0x06, 0x04, 0x00, 0x09, 0x09, 0x0d, 0x00, 0x0c, 0x08, 0x03, - 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcd, 0x32, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x03, 0x35, 0x13, 0x33, - 0x15, 0x01, 0x33, 0x35, 0x13, 0x33, 0x15, 0x01, 0x19, 0xb1, 0xcf, 0xfe, - 0xde, 0xfd, 0xb1, 0xcf, 0xfe, 0xde, 0x01, 0x0f, 0x14, 0x01, 0x1f, 0x1d, - 0xfe, 0xea, 0x14, 0x01, 0x1f, 0x1d, 0xfe, 0xea, 0x00, 0x01, 0xff, 0xe9, - 0xfe, 0x6c, 0x02, 0xb6, 0xff, 0x78, 0x00, 0x17, 0x00, 0x1c, 0x40, 0x0b, - 0x15, 0x19, 0x09, 0x18, 0x12, 0x05, 0x09, 0x00, 0x80, 0x14, 0x0d, 0x00, - 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, - 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x01, - 0xec, 0x2a, 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, 0x30, - 0x51, 0x3f, 0x2c, 0x54, 0x4e, 0x45, 0x1e, 0x64, 0x11, 0x5c, 0x11, 0x64, - 0xfe, 0x6c, 0x25, 0x2d, 0x25, 0x3e, 0x39, 0x66, 0x69, 0x3d, 0x25, 0x2d, - 0x25, 0x77, 0x94, 0x78, 0x00, 0x02, 0x00, 0xbb, 0x01, 0x92, 0x01, 0x7e, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, 0x40, 0x0f, 0x00, 0x04, - 0x04, 0x03, 0x07, 0x07, 0x08, 0x09, 0x05, 0x00, 0x05, 0x00, 0x02, 0x04, - 0x02, 0x00, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, - 0x03, 0x35, 0x33, 0x15, 0xbb, 0xc3, 0xc3, 0xc3, 0x04, 0xfd, 0xcf, 0xcf, - 0xfc, 0x95, 0xcf, 0xcf, 0x00, 0x01, 0x00, 0x8a, 0x04, 0x7c, 0x02, 0x20, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x1a, 0x40, 0x0a, 0x02, 0x03, 0x03, 0x00, - 0x06, 0x07, 0x01, 0x05, 0x80, 0x03, 0x00, 0x2f, 0x1a, 0xcc, 0x32, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x15, 0x23, - 0x11, 0x21, 0x02, 0x20, 0xfe, 0xec, 0x82, 0x01, 0x96, 0x05, 0x51, 0xd5, - 0x01, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0x04, 0x7c, 0x02, 0x20, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x1a, 0x40, 0x0a, 0x03, 0x02, 0x00, 0x02, - 0x06, 0x07, 0x05, 0x01, 0x80, 0x03, 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x11, 0x23, - 0x35, 0x21, 0x8a, 0x01, 0x96, 0x82, 0xfe, 0xec, 0x05, 0xcc, 0xfe, 0xb0, - 0xd5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0xfe, 0x57, 0x02, 0x20, - 0xff, 0xa7, 0x00, 0x05, 0x00, 0x1e, 0x40, 0x0d, 0x04, 0x01, 0x01, 0x00, - 0x06, 0x07, 0x04, 0x7f, 0x01, 0x01, 0x01, 0x80, 0x03, 0x00, 0x2f, 0x1a, - 0xcd, 0x5d, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x11, 0x33, 0x15, 0x21, 0x02, 0x20, 0xfe, 0x6a, 0x82, 0x01, - 0x14, 0xfe, 0x57, 0x01, 0x50, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, - 0xfe, 0x57, 0x02, 0x20, 0xff, 0xa7, 0x00, 0x05, 0x00, 0x1e, 0x40, 0x0d, - 0x01, 0x04, 0x00, 0x04, 0x06, 0x07, 0x00, 0x7f, 0x05, 0x01, 0x05, 0x80, - 0x03, 0x00, 0x2f, 0x1a, 0xcc, 0x5d, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x35, 0x33, 0x11, 0x21, 0x8a, 0x01, - 0x14, 0x82, 0xfe, 0x6a, 0xfe, 0xd2, 0xd5, 0xfe, 0xb0, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1e, 0xfe, 0x57, 0x03, 0x10, 0xff, 0xa7, 0x00, 0x07, - 0x00, 0x24, 0x40, 0x10, 0x04, 0x01, 0x05, 0x00, 0x01, 0x00, 0x08, 0x09, - 0x04, 0x7f, 0x01, 0x01, 0x01, 0x80, 0x06, 0x03, 0x00, 0x2f, 0x33, 0x1a, - 0xcd, 0x5d, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x03, 0x10, - 0xfd, 0x0e, 0x88, 0x01, 0xe1, 0x89, 0xfe, 0x57, 0x01, 0x50, 0xc9, 0xc9, - 0x00, 0x01, 0x00, 0x17, 0xfe, 0x58, 0x03, 0x0f, 0xff, 0xa7, 0x00, 0x05, - 0x00, 0x1e, 0x40, 0x0d, 0x02, 0x05, 0x03, 0x05, 0x07, 0x06, 0x02, 0x7f, - 0x05, 0x01, 0x05, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x5d, 0x32, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x17, 0x33, 0x15, 0x21, - 0x15, 0x21, 0x17, 0x8f, 0x02, 0x69, 0xfd, 0x08, 0x59, 0xc8, 0x87, 0x00, - 0x00, 0x01, 0x00, 0x3a, 0xfe, 0x58, 0x02, 0x71, 0x00, 0x9c, 0x00, 0x09, - 0x00, 0x38, 0x40, 0x12, 0x02, 0x07, 0x00, 0x07, 0x04, 0x03, 0x0a, 0x0b, - 0x02, 0x40, 0x0d, 0x10, 0x48, 0x02, 0x02, 0x00, 0x09, 0x07, 0xb8, 0xff, - 0xc0, 0x40, 0x0b, 0x0d, 0x10, 0x48, 0x07, 0x07, 0x10, 0x09, 0x20, 0x09, - 0x02, 0x09, 0x00, 0x2f, 0x5d, 0x33, 0x2f, 0x2b, 0x10, 0xcd, 0x32, 0x2f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x05, 0x21, - 0x17, 0x23, 0x03, 0x35, 0x13, 0x33, 0x07, 0x21, 0x02, 0x71, 0xfe, 0x56, - 0xb9, 0x70, 0xd6, 0xd6, 0x70, 0xb9, 0x01, 0xaa, 0xb5, 0xf3, 0x01, 0x1b, - 0x0e, 0x01, 0x1b, 0xf3, 0x00, 0x01, 0xfd, 0xfc, 0x06, 0x0c, 0xff, 0x4d, - 0x07, 0x23, 0x00, 0x05, 0x00, 0x0a, 0xb2, 0x03, 0x80, 0x00, 0x00, 0x2f, - 0x1a, 0xcd, 0x31, 0x30, 0x01, 0x27, 0x35, 0x33, 0x13, 0x15, 0xfe, 0xef, - 0xf3, 0xcf, 0x82, 0x06, 0x0c, 0xfa, 0x1d, 0xfe, 0xfd, 0x14, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0x95, 0x06, 0x0c, 0xff, 0xe6, 0x07, 0x23, 0x00, 0x05, - 0x00, 0x0a, 0xb2, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x31, 0x30, - 0x01, 0x35, 0x13, 0x33, 0x15, 0x07, 0xfe, 0x95, 0x82, 0xcf, 0xf3, 0x06, - 0x0c, 0x14, 0x01, 0x03, 0x1d, 0xfa, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xb5, - 0x04, 0xb1, 0x01, 0x4b, 0x05, 0xd3, 0x00, 0x09, 0x00, 0x10, 0xb5, 0x03, - 0x04, 0x09, 0x80, 0x06, 0x02, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, - 0x31, 0x30, 0x01, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, - 0x01, 0x4b, 0x69, 0xdb, 0x02, 0xe8, 0x68, 0xea, 0xcc, 0x04, 0xc5, 0x14, - 0xa9, 0xa9, 0x14, 0x01, 0x0e, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xed, 0x04, 0xd4, 0x01, 0x12, 0x05, 0x53, 0x00, 0x03, - 0x00, 0x0b, 0xb4, 0x01, 0x02, 0x8e, 0x59, 0x01, 0x00, 0x2f, 0x2b, 0x31, - 0x30, 0x01, 0x21, 0x35, 0x21, 0x01, 0x12, 0xfd, 0xdb, 0x02, 0x25, 0x04, - 0xd4, 0x7f, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xab, 0x06, 0x23, 0x02, 0x54, - 0x06, 0xa5, 0x00, 0x03, 0x00, 0x0b, 0xb4, 0x00, 0x01, 0x8e, 0x59, 0x00, - 0x00, 0x2f, 0x2b, 0x31, 0x30, 0x01, 0x35, 0x21, 0x15, 0xfd, 0xab, 0x04, - 0xa9, 0x06, 0x23, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xdc, - 0x04, 0xb6, 0x01, 0x24, 0x05, 0xba, 0x00, 0x0d, 0x00, 0x0e, 0xb4, 0x0a, - 0x04, 0x80, 0x07, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcc, 0x32, 0x31, 0x30, - 0x11, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, - 0x0e, 0x01, 0x78, 0x9d, 0x0f, 0x69, 0x0c, 0x63, 0x4c, 0x4a, 0x63, 0x0e, - 0x69, 0x12, 0x9a, 0x04, 0xb6, 0x8d, 0x77, 0x3b, 0x49, 0x47, 0x3d, 0x7a, - 0x8a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa6, 0x04, 0xd5, 0x00, 0x5a, - 0x05, 0x81, 0x00, 0x03, 0x00, 0x0b, 0xb4, 0x00, 0x02, 0x90, 0x59, 0x00, - 0x00, 0x2f, 0x2b, 0x31, 0x30, 0x03, 0x35, 0x33, 0x15, 0x5a, 0xb4, 0x04, - 0xd5, 0xac, 0xac, 0x00, 0x00, 0x02, 0xfe, 0xe9, 0x04, 0xc3, 0x01, 0x16, - 0x05, 0x7b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0xb7, 0x05, 0x02, 0x00, - 0x02, 0x91, 0x59, 0x04, 0x00, 0x00, 0x2f, 0x32, 0x2b, 0x11, 0x00, 0x33, - 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x73, 0xa3, - 0xfd, 0xd3, 0xa5, 0x04, 0xc3, 0xb8, 0xb8, 0xb8, 0xb8, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0x17, 0x05, 0xc9, 0xff, 0xc8, 0x07, 0x2b, 0x00, 0x12, - 0x00, 0x20, 0x40, 0x0c, 0x03, 0x10, 0x70, 0x08, 0xd0, 0x08, 0xe0, 0x08, - 0xf0, 0x08, 0x04, 0x08, 0xb8, 0xff, 0xc0, 0xb4, 0x2b, 0x2f, 0x48, 0x08, - 0x0f, 0x00, 0x2f, 0xcc, 0x2b, 0x71, 0x39, 0x39, 0x31, 0x30, 0x03, 0x34, - 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x07, - 0x15, 0x23, 0x35, 0x3e, 0x01, 0xdf, 0x33, 0x2a, 0x48, 0x46, 0x1f, 0x5a, - 0x6a, 0xed, 0x51, 0x5b, 0x70, 0x45, 0x30, 0x06, 0x81, 0x1f, 0x22, 0x18, - 0x63, 0x1e, 0x95, 0x3b, 0x55, 0x0b, 0x32, 0x78, 0x03, 0x1e, 0x00, 0x00, - 0x00, 0x02, 0xff, 0x38, 0x04, 0xe5, 0x00, 0xc8, 0x06, 0x62, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x0e, 0xb4, 0x0f, 0x09, 0x80, 0x15, 0x03, 0x00, 0x2f, - 0x33, 0x1a, 0xcc, 0x32, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xc8, 0x78, 0x50, 0x50, 0x78, 0x77, - 0x51, 0x52, 0x76, 0x60, 0x3b, 0x2d, 0x2d, 0x3c, 0x3c, 0x2d, 0x2d, 0x3b, - 0x05, 0xa4, 0x51, 0x6e, 0x6f, 0x50, 0x50, 0x6e, 0x6e, 0x50, 0x2d, 0x37, - 0x37, 0x2d, 0x2d, 0x39, 0x39, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x7f, - 0x04, 0xb1, 0x01, 0x82, 0x05, 0xe4, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0e, - 0xb4, 0x08, 0x03, 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcd, 0x32, - 0x31, 0x30, 0x01, 0x35, 0x13, 0x33, 0x15, 0x01, 0x33, 0x35, 0x13, 0x33, - 0x15, 0x01, 0xfe, 0x7f, 0xd9, 0xcf, 0xfe, 0xb6, 0xfd, 0xd9, 0xcf, 0xfe, - 0xb6, 0x04, 0xb1, 0x14, 0x01, 0x1f, 0x1d, 0xfe, 0xea, 0x14, 0x01, 0x1f, - 0x1d, 0xfe, 0xea, 0x00, 0x00, 0x01, 0xfe, 0xb5, 0x04, 0xb1, 0x01, 0x4b, - 0x05, 0xd3, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x05, 0x07, 0x04, 0x80, 0x01, - 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x39, 0x31, 0x30, 0x13, 0x23, 0x03, 0x35, - 0x33, 0x17, 0x33, 0x37, 0x33, 0x15, 0x6b, 0xcc, 0xea, 0x68, 0xe8, 0x02, - 0xdb, 0x69, 0x04, 0xb1, 0x01, 0x0e, 0x14, 0xa9, 0xa9, 0x14, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xc9, 0x04, 0x80, 0x00, 0x3a, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x0a, 0xb2, 0x03, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x31, 0x30, - 0x13, 0x23, 0x11, 0x33, 0x3a, 0x71, 0x71, 0x04, 0x80, 0x01, 0x4c, 0x00, - 0x00, 0x02, 0xff, 0x59, 0x04, 0x80, 0x00, 0xa7, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x0e, 0xb4, 0x06, 0x03, 0x80, 0x05, 0x01, 0x00, 0x2f, - 0x33, 0x1a, 0xcd, 0x32, 0x31, 0x30, 0x03, 0x23, 0x11, 0x33, 0x13, 0x23, - 0x11, 0x33, 0x36, 0x71, 0x71, 0xdd, 0x71, 0x71, 0x04, 0x80, 0x01, 0x4c, - 0xfe, 0xb4, 0x01, 0x4c, 0x00, 0x02, 0xfe, 0x7f, 0x04, 0xb1, 0x01, 0x82, - 0x05, 0xe4, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x12, 0xb7, 0x08, 0x80, 0x03, - 0x01, 0x03, 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcd, 0x5d, 0x32, - 0x31, 0x30, 0x09, 0x01, 0x35, 0x33, 0x13, 0x15, 0x21, 0x01, 0x35, 0x33, - 0x13, 0x15, 0x01, 0x24, 0xfe, 0xb6, 0xcf, 0xd9, 0xfe, 0x47, 0xfe, 0xb6, - 0xcf, 0xd9, 0x04, 0xb1, 0x01, 0x16, 0x1d, 0xfe, 0xe1, 0x14, 0x01, 0x16, - 0x1d, 0xfe, 0xe1, 0x14, 0x00, 0x02, 0xfe, 0xdc, 0x04, 0xb3, 0x01, 0x24, - 0x06, 0x64, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x12, 0xb6, 0x0e, 0x10, 0x0a, - 0x03, 0x80, 0x07, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcd, 0x32, 0x32, 0x2f, - 0x31, 0x30, 0x11, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, - 0x37, 0x33, 0x0e, 0x01, 0x03, 0x15, 0x23, 0x35, 0x78, 0x9d, 0x0f, 0x69, - 0x0c, 0x63, 0x4c, 0x4a, 0x63, 0x0e, 0x69, 0x12, 0x9a, 0x1d, 0xb4, 0x04, - 0xb3, 0x8d, 0x77, 0x3b, 0x49, 0x47, 0x3d, 0x7a, 0x8a, 0x01, 0xb1, 0xac, - 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xdc, 0x04, 0xb6, 0x01, 0x24, - 0x05, 0xba, 0x00, 0x0d, 0x00, 0x0e, 0xb4, 0x07, 0x00, 0x80, 0x0b, 0x04, - 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x31, 0x30, 0x11, 0x32, 0x16, 0x17, - 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x77, 0x9b, - 0x12, 0x69, 0x0f, 0x62, 0x4a, 0x4c, 0x63, 0x0c, 0x69, 0x0f, 0x9e, 0x05, - 0xba, 0x89, 0x7b, 0x3e, 0x46, 0x49, 0x3b, 0x77, 0x8d, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x9b, 0x03, 0xeb, 0x00, 0x64, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x0e, 0xb4, 0x07, 0x07, 0x05, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcc, - 0x39, 0x2f, 0x31, 0x30, 0x03, 0x35, 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, - 0x33, 0x15, 0x65, 0x26, 0x28, 0x7b, 0x5e, 0x58, 0x03, 0xeb, 0xa8, 0x6a, - 0x8e, 0x41, 0x88, 0x7e, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9b, - 0x03, 0xeb, 0x00, 0x64, 0x05, 0xcc, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x08, - 0x08, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, - 0x13, 0x15, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x64, 0x26, - 0x28, 0x7b, 0x5e, 0x58, 0x05, 0xcc, 0xa8, 0x6a, 0x8e, 0x41, 0x88, 0x7e, - 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9b, 0x03, 0xeb, 0x00, 0x64, - 0x05, 0xcc, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x02, 0x02, 0x00, 0x80, 0x05, - 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, 0x13, 0x15, 0x23, 0x14, - 0x17, 0x23, 0x2e, 0x01, 0x3d, 0x01, 0x5e, 0x58, 0x5e, 0x7b, 0x28, 0x26, - 0x05, 0xcc, 0xdb, 0x7e, 0x88, 0x40, 0x91, 0x68, 0xa8, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x9b, 0x03, 0xeb, 0x00, 0x64, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x0e, 0xb4, 0x08, 0x08, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, - 0x39, 0x2f, 0x31, 0x30, 0x13, 0x15, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, - 0x23, 0x35, 0x64, 0x26, 0x28, 0x7b, 0x5e, 0x58, 0x05, 0xcc, 0xa8, 0x6a, - 0x8e, 0x41, 0x88, 0x7e, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x5b, - 0xfe, 0x69, 0x00, 0xac, 0xff, 0x80, 0x00, 0x05, 0x00, 0x0e, 0xb6, 0x00, - 0x00, 0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x2f, 0xcd, 0x5d, 0x31, 0x30, - 0x13, 0x27, 0x35, 0x33, 0x13, 0x15, 0x4e, 0xf3, 0xcf, 0x82, 0xfe, 0x69, - 0xfa, 0x1d, 0xfe, 0xfd, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x4f, - 0xfe, 0x6a, 0x00, 0xa0, 0xff, 0x81, 0x00, 0x05, 0x00, 0x0e, 0xb6, 0x00, - 0x00, 0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x2f, 0xcd, 0x5d, 0x31, 0x30, - 0x03, 0x35, 0x13, 0x33, 0x15, 0x07, 0xb1, 0x82, 0xcf, 0xf3, 0xfe, 0x6a, - 0x14, 0x01, 0x03, 0x1d, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x3f, - 0xfe, 0x5f, 0x00, 0xa2, 0xff, 0xb5, 0x00, 0x07, 0x00, 0x21, 0x40, 0x13, - 0x03, 0x04, 0x04, 0x0f, 0x01, 0x1f, 0x01, 0x02, 0x07, 0x01, 0xc0, 0x5f, - 0x07, 0x6f, 0x07, 0x7f, 0x07, 0x03, 0x07, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, - 0x5e, 0x5d, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x13, 0x23, 0x35, 0x23, 0x35, - 0x33, 0x35, 0x33, 0xa2, 0x6f, 0xf4, 0xf4, 0x6f, 0xfe, 0x5f, 0x73, 0x71, - 0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x5e, 0xfe, 0x5f, 0x00, 0xc1, - 0xff, 0xb5, 0x00, 0x07, 0x00, 0x21, 0x40, 0x13, 0x05, 0x02, 0x02, 0x0f, - 0x07, 0x1f, 0x07, 0x02, 0x07, 0x07, 0xc0, 0x5f, 0x01, 0x6f, 0x01, 0x7f, - 0x01, 0x03, 0x01, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, 0x5e, 0x5d, 0x39, 0x2f, - 0x33, 0x31, 0x30, 0x07, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0xa2, - 0x6f, 0xf4, 0xf4, 0x6f, 0x4b, 0x72, 0x71, 0x73, 0x00, 0x01, 0xfe, 0x87, - 0x04, 0xc5, 0x01, 0x79, 0x06, 0x88, 0x00, 0x05, 0x00, 0x0c, 0xb3, 0x03, - 0x05, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x31, 0x30, 0x01, 0x23, - 0x11, 0x21, 0x35, 0x21, 0x01, 0x79, 0x8f, 0xfd, 0x9d, 0x02, 0xf2, 0x04, - 0xc5, 0x01, 0x39, 0x8a, 0x00, 0x01, 0x00, 0x3e, 0x04, 0x03, 0x01, 0x07, - 0x05, 0xcc, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x08, 0x08, 0x00, 0x80, 0x05, - 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, 0x01, 0x15, 0x14, 0x06, - 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x01, 0x07, 0x25, 0x2b, 0x79, 0x5f, - 0x59, 0x05, 0xcc, 0x92, 0x61, 0x93, 0x43, 0x89, 0x7d, 0xc3, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xa6, 0xfe, 0x57, 0x00, 0x5f, 0xff, 0xd2, 0x00, 0x0d, - 0x00, 0x12, 0xb7, 0x0d, 0x07, 0x0f, 0x00, 0x01, 0x00, 0x80, 0x06, 0x00, - 0x2f, 0x1a, 0xce, 0x71, 0x39, 0x39, 0x31, 0x30, 0x13, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x5f, 0x55, - 0x64, 0x64, 0x55, 0x2a, 0x37, 0x37, 0x2a, 0xfe, 0x57, 0x68, 0x56, 0x57, - 0x66, 0x55, 0x37, 0x31, 0x31, 0x38, 0x00, 0x00, 0x00, 0x01, 0xff, 0x4c, - 0xfe, 0x57, 0x00, 0xb3, 0xff, 0xa8, 0x00, 0x07, 0x00, 0x15, 0x40, 0x09, - 0x06, 0x02, 0x02, 0x7f, 0x01, 0x01, 0x01, 0x80, 0x05, 0x00, 0x2f, 0x1a, - 0xcc, 0x5d, 0x32, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x35, 0x33, 0x35, - 0x33, 0x15, 0x33, 0xb3, 0xfe, 0x99, 0x7b, 0x71, 0x7b, 0xfe, 0x57, 0x6c, - 0xe5, 0xe5, 0x00, 0x00, 0x00, 0x01, 0xff, 0x4d, 0xfe, 0x57, 0x00, 0xb4, - 0xff, 0xa8, 0x00, 0x07, 0x00, 0x15, 0x40, 0x09, 0x04, 0x00, 0x00, 0x7f, - 0x03, 0x01, 0x03, 0x80, 0x07, 0x00, 0x2f, 0x1a, 0xcc, 0x5d, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x17, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x21, 0xb4, - 0x7b, 0x71, 0x7b, 0x01, 0x67, 0xc4, 0xe5, 0xe5, 0x6c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x4b, 0xfe, 0x57, 0x00, 0xb2, 0xff, 0xbc, 0x00, 0x0b, - 0x00, 0x1d, 0x40, 0x0e, 0x01, 0x05, 0x05, 0x0a, 0x06, 0x06, 0x03, 0x80, - 0x6f, 0x09, 0x7f, 0x09, 0x02, 0x09, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, 0x39, - 0x2f, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x23, 0x15, 0x23, 0x35, - 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0xb2, 0x7b, 0x71, 0x7b, 0x7b, - 0x71, 0x7b, 0xfe, 0xd4, 0x7d, 0x7d, 0x6c, 0x7c, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xc9, 0xfe, 0xd6, 0x01, 0x39, 0xff, 0x63, 0x00, 0x03, - 0x00, 0x0b, 0xb4, 0x03, 0x00, 0x8f, 0x59, 0x03, 0x00, 0x2f, 0x2b, 0x31, - 0x30, 0x01, 0x21, 0x35, 0x21, 0x01, 0x39, 0xfd, 0x90, 0x02, 0x70, 0xfe, - 0xd6, 0x8d, 0x00, 0x00, 0x00, 0x01, 0xff, 0x11, 0xfe, 0x57, 0x00, 0xb2, - 0x00, 0x9b, 0x00, 0x0b, 0x00, 0x10, 0xb6, 0x08, 0x7f, 0x03, 0x01, 0x03, - 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcc, 0x5d, 0x32, 0x31, 0x30, 0x37, 0x11, - 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0xb2, 0xfe, - 0xe7, 0x33, 0x55, 0x32, 0x45, 0x78, 0x9b, 0xfe, 0xe4, 0xfe, 0xd8, 0x10, - 0xa4, 0x12, 0x94, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0xfe, 0x57, 0x01, 0xa1, 0x00, 0x9b, 0x00, 0x0b, 0x00, 0x10, 0xb6, 0x03, - 0x7f, 0x08, 0x01, 0x08, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcc, 0x5d, 0x32, - 0x31, 0x30, 0x37, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, - 0x19, 0x01, 0xb2, 0x78, 0x45, 0x32, 0x55, 0x33, 0xfe, 0xe7, 0x9b, 0xfe, - 0xf2, 0x94, 0x12, 0xa4, 0x10, 0x01, 0x28, 0x01, 0x1c, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xc9, 0xfd, 0xb3, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xe9, - 0xfe, 0x57, 0x01, 0x16, 0xff, 0x0f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, - 0xb7, 0x04, 0x00, 0x02, 0x00, 0x91, 0x59, 0x05, 0x02, 0x00, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x21, 0x35, - 0x33, 0x15, 0x73, 0xa3, 0xfd, 0xd3, 0xa5, 0xfe, 0x57, 0xb8, 0xb8, 0xb8, - 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x38, 0xfe, 0x57, 0x00, 0xc8, - 0xff, 0xd4, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x12, 0xb7, 0x15, 0x0f, 0x03, - 0x01, 0x03, 0x80, 0x0f, 0x09, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x71, 0x32, - 0x31, 0x30, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x36, 0xc8, 0x78, 0x50, 0x50, 0x78, 0x77, 0x51, 0x52, 0x76, 0x60, - 0x3b, 0x2d, 0x2d, 0x3c, 0x3c, 0x2d, 0x2d, 0x3b, 0xea, 0x51, 0x6e, 0x6f, - 0x50, 0x50, 0x6e, 0x6e, 0x50, 0x2d, 0x37, 0x37, 0x2d, 0x2d, 0x39, 0x39, - 0x00, 0x01, 0xff, 0x99, 0xfe, 0x39, 0x00, 0x62, 0xff, 0x9e, 0x00, 0x09, - 0x00, 0x15, 0x40, 0x0a, 0x07, 0x07, 0x04, 0x80, 0x00, 0x09, 0x10, 0x09, - 0x02, 0x09, 0x00, 0x2f, 0x5d, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, 0x17, - 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x33, 0x62, 0x2c, 0x28, - 0x75, 0x5e, 0x58, 0xc3, 0xcc, 0x57, 0x75, 0x2f, 0x64, 0x5a, 0xa7, 0x00, - 0x00, 0x01, 0xff, 0x4a, 0xfe, 0x44, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x12, 0xb6, 0x0c, 0x11, 0x11, 0x07, 0x02, 0x80, 0x10, 0x00, 0x2f, - 0x1a, 0xcc, 0x32, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x14, 0x21, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x07, 0x37, - 0x33, 0x07, 0x1e, 0x01, 0xb6, 0xfe, 0xee, 0x39, 0x21, 0x31, 0x25, 0x93, - 0x3d, 0x48, 0x1c, 0x1d, 0x41, 0x6b, 0x27, 0x5e, 0x5e, 0xfe, 0xfe, 0xba, - 0x04, 0x62, 0x06, 0x56, 0x28, 0x2a, 0x02, 0xb6, 0x64, 0x03, 0x53, 0x00, - 0x00, 0x01, 0xff, 0x4c, 0xfe, 0x55, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x0c, 0xb3, 0x0f, 0x02, 0x80, 0x09, 0x00, 0x2f, 0x1a, 0xcc, 0x32, - 0x31, 0x30, 0x13, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, - 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0xaa, 0x3f, 0x4c, 0x69, - 0x6a, 0x57, 0x44, 0x85, 0x40, 0x53, 0x31, 0x2d, 0x36, 0x3d, 0xfe, 0x70, - 0x1b, 0x66, 0x55, 0x46, 0x84, 0x26, 0x24, 0x7d, 0x42, 0x2a, 0x30, 0x18, - 0x00, 0x01, 0xff, 0xbd, 0xfe, 0x57, 0x00, 0x43, 0xff, 0xb5, 0x00, 0x03, - 0x00, 0x10, 0xb7, 0x6f, 0x01, 0x7f, 0x01, 0x02, 0x01, 0x80, 0x03, 0x00, - 0x2f, 0x1a, 0xcd, 0x5d, 0x31, 0x30, 0x13, 0x23, 0x11, 0x33, 0x43, 0x86, - 0x86, 0xfe, 0x57, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x87, - 0xfe, 0x57, 0x01, 0x79, 0xff, 0xa7, 0x00, 0x07, 0x00, 0x12, 0xb7, 0x05, - 0x7f, 0x01, 0x01, 0x01, 0x80, 0x02, 0x07, 0x00, 0x2f, 0x33, 0x1a, 0xcd, - 0x5d, 0x32, 0x31, 0x30, 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x21, - 0x01, 0x79, 0x89, 0xfe, 0x1f, 0x88, 0x02, 0xf2, 0xfe, 0x57, 0xc9, 0xc9, - 0x01, 0x50, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x9d, 0xfe, 0x90, 0x01, 0x63, - 0xff, 0x7d, 0x00, 0x19, 0x00, 0x1d, 0x40, 0x0d, 0x11, 0x0a, 0x0a, 0x18, - 0x03, 0x80, 0x14, 0x0d, 0x0f, 0x07, 0x01, 0x08, 0x07, 0x00, 0x2f, 0x5e, - 0x5d, 0x33, 0x33, 0x1a, 0xcc, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, 0x11, - 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x06, 0x23, - 0x22, 0x18, 0x4d, 0x44, 0x5e, 0x5c, 0x61, 0x2e, 0x2e, 0x37, 0x41, 0x5c, - 0x41, 0x37, 0x2e, 0x2e, 0x61, 0x5c, 0x5e, 0x72, 0xfe, 0xeb, 0x26, 0x35, - 0x81, 0x6c, 0x4c, 0x43, 0x4a, 0x45, 0x45, 0x4a, 0x44, 0x4b, 0x6c, 0x81, - 0x00, 0x01, 0xfe, 0xb9, 0xfe, 0x57, 0x01, 0x45, 0xff, 0x5b, 0x00, 0x09, - 0x00, 0x1d, 0x40, 0x0f, 0x05, 0x06, 0xdf, 0x01, 0x01, 0x01, 0x80, 0x07, - 0x0f, 0x04, 0x1f, 0x04, 0x02, 0x07, 0x04, 0x00, 0x2f, 0x5e, 0x5d, 0x33, - 0x1a, 0xcd, 0x5d, 0x32, 0x39, 0x31, 0x30, 0x13, 0x23, 0x27, 0x35, 0x33, - 0x17, 0x33, 0x37, 0x33, 0x15, 0x65, 0xcc, 0xe0, 0x68, 0xde, 0x02, 0xdb, - 0x69, 0xfe, 0x57, 0xef, 0x15, 0x8b, 0x8b, 0x15, 0x00, 0x01, 0xfe, 0xb5, - 0xfe, 0x57, 0x01, 0x41, 0xff, 0x5b, 0x00, 0x09, 0x00, 0x1b, 0x40, 0x0e, - 0x03, 0x06, 0xdf, 0x02, 0x01, 0x02, 0x80, 0x0f, 0x09, 0x1f, 0x09, 0x02, - 0x07, 0x09, 0x00, 0x2f, 0x5e, 0x5d, 0x1a, 0xcd, 0x5d, 0x32, 0x39, 0x31, - 0x30, 0x01, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x37, 0x33, 0x01, - 0x41, 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, 0xcc, 0xfe, 0x6c, 0x15, 0x8b, - 0x8b, 0x15, 0xef, 0x00, 0x00, 0x01, 0xfe, 0xdc, 0xfe, 0x72, 0x01, 0x24, - 0xff, 0x76, 0x00, 0x0d, 0x00, 0x15, 0x40, 0x09, 0x07, 0x00, 0x80, 0x0a, - 0x0f, 0x04, 0x01, 0x08, 0x04, 0x00, 0x2f, 0x5e, 0x5d, 0x33, 0x1a, 0xcc, - 0x32, 0x31, 0x30, 0x11, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x01, 0x78, 0x9d, 0x0f, 0x69, 0x0c, 0x63, 0x4c, - 0x4a, 0x63, 0x0e, 0x69, 0x12, 0x9a, 0xfe, 0x72, 0x8d, 0x77, 0x3b, 0x49, - 0x47, 0x3d, 0x7a, 0x8a, 0x00, 0x01, 0xfe, 0xdc, 0xfe, 0x72, 0x01, 0x24, - 0xff, 0x76, 0x00, 0x0d, 0x00, 0x15, 0x40, 0x09, 0x0b, 0x04, 0x80, 0x07, - 0x0f, 0x00, 0x01, 0x08, 0x00, 0x00, 0x2f, 0x5e, 0x5d, 0x32, 0x1a, 0xcc, - 0x32, 0x31, 0x30, 0x15, 0x32, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x07, 0x23, 0x3e, 0x01, 0x77, 0x9b, 0x12, 0x69, 0x0f, 0x62, 0x4a, - 0x4c, 0x63, 0x0c, 0x69, 0x0f, 0x9e, 0x8a, 0x89, 0x7b, 0x3e, 0x46, 0x49, - 0x3b, 0x77, 0x8d, 0x00, 0x00, 0x01, 0xfe, 0x9a, 0xfe, 0x57, 0x01, 0x67, - 0xff, 0x63, 0x00, 0x17, 0x00, 0x1f, 0x40, 0x10, 0x12, 0x05, 0x09, 0xdf, - 0x00, 0x01, 0x00, 0x80, 0x14, 0x0f, 0x0d, 0x1f, 0x0d, 0x02, 0x07, 0x0d, - 0x00, 0x2f, 0x5e, 0x5d, 0x33, 0x1a, 0xcd, 0x5d, 0x32, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, - 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x9d, 0x2a, - 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, 0x30, 0x51, 0x3f, - 0x2c, 0x54, 0x4e, 0x45, 0x1e, 0x64, 0x11, 0x5c, 0x11, 0x64, 0xfe, 0x57, - 0x25, 0x2d, 0x25, 0x3e, 0x39, 0x66, 0x69, 0x3d, 0x25, 0x2d, 0x25, 0x77, - 0x94, 0x78, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xed, 0xfe, 0xbc, 0x01, 0x12, - 0xff, 0x3b, 0x00, 0x03, 0x00, 0x0b, 0xb4, 0x03, 0x00, 0x8e, 0x59, 0x03, - 0x00, 0x2f, 0x2b, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x01, 0x12, 0xfd, - 0xdb, 0x02, 0x25, 0xfe, 0xbc, 0x7f, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xab, - 0xfe, 0x69, 0x02, 0x54, 0xfe, 0xeb, 0x00, 0x03, 0x00, 0x0b, 0xb4, 0x02, - 0x03, 0x8e, 0x59, 0x02, 0x00, 0x2f, 0x2b, 0x31, 0x30, 0x01, 0x35, 0x21, - 0x15, 0xfd, 0xab, 0x04, 0xa9, 0xfe, 0x69, 0x82, 0x82, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xc9, 0xfe, 0x57, 0x01, 0x39, 0xff, 0x9c, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x1b, 0x40, 0x0f, 0x00, 0x06, 0x10, 0x05, 0x20, 0x05, - 0x30, 0x05, 0x03, 0x7f, 0x05, 0x01, 0x05, 0x80, 0x03, 0x00, 0x2f, 0x1a, - 0xcc, 0x5d, 0x71, 0x39, 0x39, 0x31, 0x30, 0x05, 0x21, 0x35, 0x21, 0x11, - 0x21, 0x35, 0x21, 0x01, 0x39, 0xfd, 0x90, 0x02, 0x70, 0xfd, 0x90, 0x02, - 0x70, 0xda, 0x76, 0xfe, 0xbb, 0x76, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x9a, - 0x00, 0xf1, 0x01, 0x67, 0x01, 0xfd, 0x00, 0x17, 0x00, 0x12, 0xb6, 0x12, - 0x05, 0x14, 0x0d, 0x80, 0x09, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcd, 0x32, - 0x39, 0x39, 0x31, 0x30, 0x37, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, - 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, - 0x01, 0x9d, 0x2a, 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, - 0x30, 0x51, 0x3f, 0x2c, 0x54, 0x4e, 0x45, 0x1e, 0x64, 0x11, 0x5c, 0x11, - 0x64, 0xf1, 0x25, 0x2d, 0x25, 0x3e, 0x39, 0x66, 0x69, 0x3d, 0x25, 0x2d, - 0x25, 0x77, 0x94, 0x78, 0x00, 0x01, 0xfe, 0xa1, 0x01, 0x12, 0x01, 0x5f, - 0x01, 0xa1, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x02, 0x01, 0x00, 0x2f, 0x33, - 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x01, 0x5f, 0xfd, 0x42, 0x02, 0xbe, - 0x01, 0x12, 0x8f, 0x00, 0x00, 0x01, 0xfd, 0xad, 0x01, 0x1c, 0x02, 0x56, - 0x01, 0x99, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x02, 0x01, 0x00, 0x2f, 0x33, - 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x02, 0x56, 0xfb, 0x57, 0x04, 0xa9, - 0x01, 0x1c, 0x7d, 0x00, 0x00, 0x01, 0xfe, 0x00, 0xff, 0xe4, 0x02, 0x00, - 0x03, 0xe3, 0x00, 0x03, 0x00, 0x0c, 0xb3, 0x00, 0x03, 0x02, 0x01, 0x00, - 0x2f, 0x33, 0x2f, 0x33, 0x31, 0x30, 0x09, 0x01, 0x27, 0x01, 0x02, 0x00, - 0xfc, 0x63, 0x63, 0x03, 0x9d, 0x03, 0x82, 0xfc, 0x62, 0x61, 0x03, 0x9e, - 0x00, 0x01, 0xfe, 0xe6, 0xff, 0xdd, 0x01, 0x1f, 0x05, 0xe7, 0x00, 0x03, - 0x00, 0x08, 0xb1, 0x01, 0x00, 0x00, 0x2f, 0x2f, 0x31, 0x30, 0x09, 0x01, - 0x23, 0x01, 0x01, 0x1f, 0xfe, 0x58, 0x91, 0x01, 0xa9, 0x05, 0xe7, 0xf9, - 0xf6, 0x06, 0x0a, 0x00, 0x00, 0x01, 0xff, 0xa3, 0xfe, 0x4e, 0x00, 0x5c, - 0xff, 0xc9, 0x00, 0x0d, 0x00, 0x19, 0x40, 0x0d, 0x06, 0x00, 0x0f, 0x0d, - 0x01, 0xaf, 0x0d, 0xbf, 0x0d, 0x02, 0x0d, 0x80, 0x07, 0x00, 0x2f, 0x1a, - 0xce, 0x5d, 0x71, 0x39, 0x39, 0x31, 0x30, 0x03, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x5d, 0x2a, 0x37, - 0x37, 0x2a, 0x54, 0x65, 0x65, 0x54, 0xfe, 0xa3, 0x38, 0x31, 0x31, 0x37, - 0x55, 0x66, 0x57, 0x57, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x87, - 0xfe, 0x57, 0x01, 0x79, 0xff, 0xa7, 0x00, 0x07, 0x00, 0x12, 0xb7, 0x04, - 0x7f, 0x01, 0x01, 0x01, 0x80, 0x06, 0x03, 0x00, 0x2f, 0x33, 0x1a, 0xcd, - 0x5d, 0x32, 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, - 0x01, 0x79, 0xfd, 0x0e, 0x88, 0x01, 0xe1, 0x89, 0xfe, 0x57, 0x01, 0x50, - 0xc9, 0xc9, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0xfe, 0x57, 0x00, 0xbc, - 0xff, 0xcf, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0xb7, 0x07, 0x0f, 0x01, - 0x01, 0x01, 0x80, 0x05, 0x03, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x71, 0x32, - 0x31, 0x30, 0x13, 0x21, 0x11, 0x21, 0x03, 0x35, 0x23, 0x15, 0xbc, 0xfe, - 0x88, 0x01, 0x78, 0x5f, 0xba, 0xfe, 0x57, 0x01, 0x78, 0xfe, 0xe7, 0xba, - 0xba, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xa2, 0xfe, 0x95, 0x01, 0x5e, - 0xff, 0x82, 0x00, 0x17, 0x00, 0x1d, 0x40, 0x0c, 0x00, 0x0b, 0x0b, 0x0f, - 0x02, 0x09, 0x09, 0x11, 0x06, 0x80, 0x14, 0x0f, 0x00, 0x2f, 0x33, 0x1a, - 0xcc, 0x39, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2f, 0x33, 0x31, 0x30, 0x13, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x07, 0x23, - 0x3e, 0x01, 0x33, 0x32, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0xfc, - 0x11, 0x4a, 0x37, 0x3c, 0x5c, 0x3c, 0x37, 0x4a, 0x11, 0x62, 0x0d, 0x5a, - 0x4e, 0x70, 0x39, 0x20, 0x4e, 0x36, 0x4e, 0x5f, 0x0d, 0xfe, 0xda, 0x4a, - 0x4a, 0x45, 0x45, 0x4a, 0x4a, 0x4e, 0x5a, 0x5b, 0x33, 0x28, 0x5a, 0x4e, - 0x00, 0x01, 0xff, 0x25, 0x04, 0x72, 0x00, 0xda, 0x06, 0x25, 0x00, 0x0b, - 0x00, 0x16, 0x40, 0x0a, 0x08, 0x0b, 0x05, 0x02, 0x04, 0x09, 0x07, 0x80, - 0x03, 0x01, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x17, 0x39, 0x31, 0x30, - 0x13, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, - 0xda, 0x57, 0x84, 0x83, 0x56, 0x83, 0x84, 0x57, 0x84, 0x84, 0x56, 0x84, - 0x04, 0xc7, 0x55, 0x86, 0x85, 0x53, 0x85, 0x85, 0x55, 0x85, 0x84, 0x53, - 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x97, 0x04, 0x6c, 0x00, 0x69, - 0x06, 0x89, 0x00, 0x18, 0x00, 0x12, 0xb6, 0x14, 0x08, 0x11, 0x10, 0x80, - 0x05, 0x04, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x39, 0x39, 0x31, 0x30, - 0x13, 0x14, 0x0e, 0x01, 0x07, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x02, - 0x35, 0x34, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x02, 0x69, - 0x2f, 0x50, 0x53, 0x2c, 0x31, 0x1d, 0x23, 0x1d, 0x5f, 0x73, 0x2d, 0x30, - 0x1d, 0x23, 0x1d, 0x05, 0x0a, 0x31, 0x3f, 0x24, 0x0a, 0x4d, 0x06, 0x26, - 0x2a, 0x17, 0x31, 0x35, 0x3c, 0x22, 0x44, 0x4e, 0x0d, 0x4c, 0x08, 0x24, - 0x2c, 0x18, 0x32, 0x35, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xac, - 0x06, 0x0c, 0x02, 0x55, 0x07, 0x30, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, - 0xb4, 0x07, 0x01, 0x06, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x35, 0x21, 0x15, 0x25, 0x35, 0x21, 0x15, 0xfd, 0xac, - 0x04, 0xa9, 0xfb, 0x57, 0x04, 0xa9, 0x06, 0x0c, 0x66, 0x66, 0xbe, 0x66, - 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xb3, 0x04, 0xaa, 0xff, 0xef, - 0x05, 0xc2, 0x00, 0x05, 0x00, 0x0a, 0xb2, 0x00, 0x80, 0x03, 0x00, 0x2f, - 0x1a, 0xcd, 0x31, 0x30, 0x03, 0x13, 0x15, 0x23, 0x03, 0x35, 0x9a, 0x89, - 0x78, 0xc4, 0x05, 0xc2, 0xfe, 0xf4, 0x0c, 0x01, 0x09, 0x0f, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x12, 0x04, 0xaa, 0x01, 0x4e, 0x05, 0xc2, 0x00, 0x05, - 0x00, 0x0a, 0xb2, 0x00, 0x80, 0x03, 0x00, 0x2f, 0x1a, 0xcd, 0x31, 0x30, - 0x01, 0x15, 0x03, 0x23, 0x35, 0x13, 0x01, 0x4e, 0xc4, 0x78, 0x89, 0x05, - 0xc2, 0x0f, 0xfe, 0xf7, 0x0c, 0x01, 0x0c, 0x00, 0x00, 0x01, 0xfe, 0xa4, - 0x04, 0xb1, 0x01, 0x5d, 0x05, 0xbd, 0x00, 0x15, 0x00, 0x1b, 0x40, 0x0b, - 0x10, 0x05, 0x00, 0x12, 0x12, 0x0b, 0x00, 0x80, 0x08, 0x08, 0x00, 0x00, - 0x2f, 0x32, 0x2f, 0x1a, 0x10, 0xcd, 0x32, 0x2f, 0x11, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, 0x12, 0x33, - 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x8c, 0x2a, 0x47, - 0x41, 0x41, 0x25, 0x2f, 0x33, 0x09, 0x65, 0x1d, 0xae, 0x2c, 0x49, 0x44, - 0x41, 0x24, 0x5b, 0x0f, 0x66, 0x0f, 0x69, 0x04, 0xbb, 0x1f, 0x25, 0x1f, - 0x34, 0x39, 0x01, 0x02, 0x1f, 0x25, 0x1f, 0x6d, 0x88, 0x7a, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x9c, 0x04, 0x03, 0x00, 0x65, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x0e, 0xb4, 0x08, 0x08, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, - 0x39, 0x2f, 0x31, 0x30, 0x13, 0x15, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, - 0x23, 0x35, 0x65, 0x25, 0x2b, 0x79, 0x5f, 0x59, 0x05, 0xcc, 0x92, 0x61, - 0x93, 0x43, 0x89, 0x7d, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xab, - 0x04, 0xcf, 0x01, 0x53, 0x05, 0xe3, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, - 0x00, 0x14, 0xb7, 0x0b, 0x07, 0x07, 0x00, 0x80, 0x0a, 0x06, 0x03, 0x00, - 0x2f, 0x33, 0x33, 0x1a, 0xcd, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x13, 0x15, - 0x03, 0x23, 0x35, 0x13, 0x01, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, - 0xb1, 0xbd, 0x75, 0x83, 0xfe, 0xa9, 0x96, 0x01, 0x7c, 0x96, 0x05, 0xe3, - 0x0f, 0xfe, 0xfb, 0x0c, 0x01, 0x08, 0xfe, 0xec, 0xac, 0xac, 0xac, 0xac, - 0x00, 0x01, 0xff, 0xba, 0xfe, 0x57, 0x00, 0x9a, 0xff, 0x81, 0x00, 0x0c, - 0x00, 0x17, 0x40, 0x0b, 0x03, 0x1f, 0x08, 0x01, 0x08, 0x80, 0x0f, 0x0c, - 0x01, 0x08, 0x0c, 0x00, 0x2f, 0x5e, 0x5d, 0x1a, 0xcc, 0x71, 0x32, 0x31, - 0x30, 0x17, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x3d, - 0x01, 0x33, 0x3e, 0x15, 0x18, 0x0e, 0x21, 0x2c, 0x26, 0x8e, 0x84, 0xfc, - 0x21, 0x17, 0x06, 0x70, 0x0b, 0x98, 0x92, 0x00, 0x00, 0x01, 0xfe, 0x87, - 0x04, 0xd2, 0x01, 0x79, 0x06, 0x22, 0x00, 0x07, 0x00, 0x0e, 0xb4, 0x03, - 0x07, 0x80, 0x05, 0x01, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x31, 0x30, - 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x21, 0x01, 0x79, 0x89, 0xfe, - 0x1f, 0x88, 0x02, 0xf2, 0x04, 0xd2, 0xc9, 0xc9, 0x01, 0x50, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0x0d, 0xfe, 0x57, 0x01, 0xf0, 0xff, 0x7e, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x1d, 0x40, 0x0f, 0x00, 0x05, 0x1f, 0x04, 0x01, 0x90, - 0x04, 0x01, 0x04, 0x80, 0x0f, 0x02, 0x01, 0x08, 0x02, 0x00, 0x2f, 0x5e, - 0x5d, 0x1a, 0xcc, 0x5d, 0x71, 0x39, 0x39, 0x31, 0x30, 0x05, 0x35, 0x21, - 0x15, 0x05, 0x35, 0x21, 0x15, 0xfe, 0x0d, 0x03, 0xe3, 0xfc, 0x1d, 0x03, - 0xe3, 0xec, 0x6a, 0x6a, 0xbd, 0x6a, 0x6a, 0x00, 0x00, 0x02, 0xff, 0x47, - 0xfe, 0x57, 0x00, 0xbe, 0xff, 0xb5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x15, - 0x40, 0x0a, 0x05, 0x6f, 0x01, 0x7f, 0x01, 0x02, 0x01, 0x80, 0x06, 0x03, - 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x5d, 0x32, 0x31, 0x30, 0x03, 0x23, 0x11, - 0x33, 0x13, 0x23, 0x11, 0x33, 0x33, 0x86, 0x86, 0xf1, 0x86, 0x86, 0xfe, - 0x57, 0x01, 0x5e, 0xfe, 0xa2, 0x01, 0x5e, 0x00, 0x00, 0x01, 0xff, 0x35, - 0xfe, 0x57, 0x00, 0xcb, 0xff, 0xa7, 0x00, 0x05, 0x00, 0x10, 0xb6, 0x05, - 0x7f, 0x03, 0x01, 0x03, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x5d, 0x33, - 0x31, 0x30, 0x07, 0x21, 0x11, 0x23, 0x35, 0x21, 0xcb, 0x01, 0x96, 0x82, - 0xfe, 0xec, 0x59, 0xfe, 0xb0, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x99, - 0x04, 0x75, 0x01, 0x66, 0x05, 0xf9, 0x00, 0x1a, 0x00, 0x17, 0x40, 0x09, - 0x10, 0x02, 0x12, 0x0c, 0x09, 0x80, 0x19, 0x04, 0x16, 0x00, 0x2f, 0x33, - 0x33, 0x1a, 0xcd, 0x32, 0x32, 0x39, 0x39, 0x31, 0x30, 0x03, 0x26, 0x23, - 0x22, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, - 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x51, - 0x28, 0x1d, 0x63, 0x13, 0x5b, 0x0b, 0x30, 0x51, 0x3f, 0x3e, 0x4f, 0x3d, - 0x61, 0x3d, 0x2a, 0x19, 0x64, 0x11, 0x5c, 0x11, 0x64, 0x55, 0x3b, 0x51, - 0x3d, 0x61, 0x05, 0x18, 0x13, 0x7a, 0x66, 0x69, 0x3d, 0x30, 0x6c, 0x36, - 0x6c, 0x14, 0x7a, 0x94, 0x78, 0x31, 0x6d, 0x37, 0x00, 0x03, 0xfe, 0x9f, - 0x04, 0x62, 0x01, 0x70, 0x07, 0x02, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, - 0x00, 0x29, 0x40, 0x12, 0x15, 0x12, 0x05, 0x0d, 0x08, 0x00, 0x1d, 0x1e, - 0x0d, 0x1a, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x19, 0x1e, 0x19, 0x00, 0x2f, - 0x2f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, 0x11, 0x12, 0x39, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x32, 0x31, 0x30, 0x13, 0x22, 0x2e, 0x02, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x01, 0x05, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, - 0x15, 0xa5, 0x2b, 0x51, 0x4c, 0x45, 0x1f, 0x37, 0x32, 0x09, 0x68, 0x0b, - 0x30, 0x52, 0x3f, 0x2c, 0x52, 0x4b, 0x44, 0x1e, 0x36, 0x32, 0x08, 0x6a, - 0x11, 0x65, 0xfe, 0xac, 0xb4, 0xb4, 0xb4, 0x05, 0x37, 0x20, 0x27, 0x21, - 0x35, 0x33, 0x59, 0x5d, 0x36, 0x21, 0x27, 0x21, 0x37, 0x32, 0x81, 0x6b, - 0xd5, 0xac, 0xac, 0x01, 0xf4, 0xac, 0xac, 0x00, 0x00, 0x02, 0xfe, 0x9f, - 0x04, 0xc1, 0x01, 0x70, 0x06, 0xb5, 0x00, 0x18, 0x00, 0x31, 0x00, 0x1f, - 0x40, 0x0d, 0x2b, 0x1e, 0x2e, 0x26, 0x21, 0x19, 0x19, 0x12, 0x05, 0x15, - 0x0d, 0x08, 0x00, 0x00, 0x2f, 0x32, 0xcd, 0x32, 0x39, 0x39, 0x32, 0x2f, - 0x33, 0xcd, 0x32, 0x39, 0x39, 0x31, 0x30, 0x13, 0x22, 0x2e, 0x02, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x01, 0x03, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, - 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, - 0x33, 0x0e, 0x01, 0xa5, 0x2b, 0x51, 0x4c, 0x45, 0x1f, 0x37, 0x32, 0x09, - 0x68, 0x0b, 0x30, 0x52, 0x3f, 0x2c, 0x52, 0x4b, 0x44, 0x1e, 0x36, 0x32, - 0x08, 0x6a, 0x11, 0x65, 0x55, 0x2b, 0x51, 0x4c, 0x45, 0x1f, 0x37, 0x32, - 0x09, 0x68, 0x0b, 0x30, 0x52, 0x3f, 0x2c, 0x52, 0x4b, 0x44, 0x1e, 0x36, - 0x32, 0x08, 0x6a, 0x11, 0x65, 0x04, 0xc1, 0x20, 0x27, 0x21, 0x35, 0x33, - 0x59, 0x5d, 0x36, 0x21, 0x27, 0x21, 0x37, 0x32, 0x81, 0x6b, 0x01, 0x08, - 0x20, 0x27, 0x21, 0x35, 0x33, 0x59, 0x5d, 0x36, 0x21, 0x27, 0x21, 0x37, - 0x32, 0x81, 0x6b, 0x00, 0x00, 0x01, 0xfe, 0xef, 0xfe, 0x57, 0x01, 0x11, - 0xff, 0xb9, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x07, 0x03, 0x04, 0x06, 0x04, - 0x00, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x31, 0x30, 0x05, 0x07, 0x35, 0x23, - 0x15, 0x27, 0x37, 0x15, 0x33, 0x35, 0x01, 0x11, 0x96, 0xf6, 0x96, 0x96, - 0xf6, 0xf6, 0xb3, 0x80, 0x80, 0xb3, 0xaf, 0x76, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x4f, 0xfe, 0x57, 0x00, 0xb1, 0xff, 0xd4, 0x00, 0x06, - 0x00, 0x15, 0x40, 0x09, 0x05, 0x02, 0x02, 0x0f, 0x00, 0x01, 0x00, 0x80, - 0x03, 0x00, 0x2f, 0x1a, 0xcd, 0x71, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x03, - 0x35, 0x23, 0x37, 0x17, 0x23, 0x15, 0x3b, 0x76, 0xb1, 0xb1, 0x7c, 0xfe, - 0x57, 0xee, 0x8f, 0x8f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x18, 0xfd, 0x16, - 0x00, 0x00, 0x02, 0xea, 0x05, 0xcc, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, - 0x00, 0x15, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x3d, - 0x00, 0x45, 0x00, 0x4b, 0x00, 0x51, 0x00, 0x59, 0x00, 0x61, 0x00, 0x69, - 0x00, 0x71, 0x00, 0x79, 0x00, 0x81, 0x00, 0x89, 0x00, 0x91, 0x00, 0x99, - 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa7, 0x00, 0xac, 0x40, 0x5a, 0xa0, 0x4e, - 0xa6, 0xa6, 0xa3, 0x07, 0x03, 0x47, 0x47, 0x30, 0x34, 0x18, 0x38, 0x38, - 0x1c, 0x3c, 0x01, 0x49, 0x10, 0x54, 0x54, 0x14, 0x58, 0x20, 0x6c, 0x6c, - 0x24, 0x70, 0x0c, 0x9c, 0x28, 0x74, 0x74, 0x2c, 0x78, 0x40, 0x84, 0x84, - 0x44, 0x88, 0x0b, 0x9b, 0x5c, 0x94, 0x94, 0x60, 0x98, 0x64, 0x8c, 0x8c, - 0x68, 0x90, 0x50, 0xa4, 0x7c, 0x80, 0x34, 0x3c, 0x49, 0x58, 0x70, 0x9c, - 0x78, 0x88, 0x9b, 0x98, 0x90, 0xa4, 0x80, 0x80, 0xa4, 0x90, 0x98, 0x9b, - 0x88, 0x78, 0x9c, 0x70, 0x58, 0x49, 0x3c, 0x34, 0x0d, 0x08, 0x04, 0x4a, - 0x9f, 0x4d, 0xa3, 0x12, 0x00, 0x3f, 0x33, 0x33, 0xc6, 0x32, 0x32, 0x17, - 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x32, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x35, 0x23, 0x35, 0x21, 0x05, 0x21, 0x35, 0x21, 0x01, 0x23, - 0x11, 0x33, 0x25, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x27, 0x14, - 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x13, 0x14, 0x23, 0x22, 0x35, 0x34, - 0x33, 0x32, 0x17, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, - 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, 0x35, 0x34, - 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x01, 0x23, - 0x15, 0x23, 0x11, 0x21, 0x01, 0x21, 0x35, 0x33, 0x35, 0x33, 0x01, 0x14, - 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, - 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, - 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, 0x35, 0x34, - 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x25, 0x14, - 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x13, 0x14, 0x23, 0x22, 0x35, 0x34, - 0x33, 0x32, 0x27, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x25, 0x23, - 0x11, 0x33, 0x01, 0x21, 0x35, 0x21, 0x05, 0x21, 0x11, 0x33, 0x15, 0x33, - 0x02, 0xea, 0x6d, 0xe0, 0x01, 0x4d, 0xfd, 0xbd, 0xfe, 0xb2, 0x01, 0x4e, - 0x02, 0x43, 0x6d, 0x6d, 0xfe, 0x91, 0x34, 0x38, 0x38, 0x34, 0x95, 0x34, - 0x39, 0x39, 0x34, 0xf9, 0x37, 0x36, 0x38, 0x35, 0x24, 0x34, 0x38, 0x38, - 0x34, 0xfe, 0x34, 0x36, 0x37, 0x37, 0x36, 0xae, 0x38, 0x35, 0x35, 0x38, - 0x02, 0x56, 0x37, 0x36, 0x36, 0x37, 0xfc, 0x84, 0xe0, 0x6d, 0x01, 0x4d, - 0x04, 0x87, 0xfe, 0xb3, 0xe0, 0x6d, 0xfc, 0x09, 0x36, 0x36, 0x36, 0x36, - 0x02, 0x8a, 0x36, 0x36, 0x36, 0x36, 0x96, 0x35, 0x38, 0x38, 0x35, 0xfd, - 0xa9, 0x35, 0x38, 0x36, 0x37, 0x23, 0x36, 0x36, 0x36, 0x36, 0x01, 0xca, - 0x36, 0x37, 0x37, 0x36, 0xfe, 0x59, 0x37, 0x36, 0x36, 0x37, 0xf9, 0x38, - 0x35, 0x35, 0x38, 0x96, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x90, 0x6d, 0x6d, - 0x03, 0x24, 0xfe, 0xb2, 0x01, 0x4e, 0xfd, 0xbc, 0xfe, 0xb3, 0x6d, 0xe0, - 0x04, 0x83, 0xdc, 0x6d, 0x6d, 0x6d, 0xfc, 0x73, 0x01, 0x4e, 0x93, 0x36, - 0x36, 0x37, 0x2c, 0x36, 0x36, 0x37, 0xfe, 0xd1, 0x38, 0x38, 0x35, 0xe5, - 0x36, 0x36, 0x37, 0x01, 0x96, 0x38, 0x38, 0x35, 0x5a, 0x36, 0x36, 0x37, - 0xfd, 0x72, 0x35, 0x35, 0x38, 0x02, 0xfb, 0xdc, 0x01, 0x49, 0xfa, 0x34, - 0x6d, 0xdc, 0x02, 0xd7, 0x36, 0x33, 0x3a, 0xfd, 0x3e, 0x35, 0x35, 0x37, - 0x9a, 0x34, 0x34, 0x39, 0x02, 0x20, 0x38, 0x38, 0x35, 0xe5, 0x36, 0x36, - 0x37, 0xfd, 0xff, 0x37, 0x37, 0x35, 0xe6, 0x35, 0x35, 0x38, 0xfe, 0xd2, - 0x38, 0x34, 0x39, 0x2a, 0x35, 0x35, 0x37, 0x73, 0x01, 0x4e, 0xfc, 0x73, - 0x6d, 0x6d, 0x01, 0x49, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x74, - 0x04, 0x7d, 0x00, 0x8d, 0x06, 0x21, 0x00, 0x06, 0x00, 0x0c, 0xb3, 0x04, - 0x06, 0x80, 0x02, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x31, 0x30, 0x13, 0x15, - 0x05, 0x35, 0x37, 0x27, 0x35, 0x8d, 0xfe, 0xe7, 0xaa, 0xaa, 0x05, 0x78, - 0x52, 0xa9, 0x72, 0x60, 0x60, 0x72, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa3, - 0x04, 0x78, 0x00, 0x5c, 0x05, 0xf3, 0x00, 0x0d, 0x00, 0x0e, 0xb4, 0x07, - 0x06, 0x80, 0x0d, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xce, 0x32, 0x31, 0x30, - 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x5c, 0x55, 0x64, 0x64, 0x55, 0x2a, 0x37, 0x37, 0x2a, 0x04, - 0x78, 0x68, 0x56, 0x57, 0x66, 0x55, 0x37, 0x31, 0x31, 0x38, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xdc, 0x04, 0xd5, 0x01, 0x24, 0x06, 0x86, 0x00, 0x0d, - 0x00, 0x11, 0x00, 0x17, 0x40, 0x09, 0x04, 0x0b, 0x0f, 0x0b, 0x0f, 0x0b, - 0x07, 0x00, 0x0e, 0x00, 0x2f, 0xcc, 0x32, 0x39, 0x39, 0x2f, 0x2f, 0x11, - 0x33, 0x31, 0x30, 0x11, 0x32, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x07, 0x23, 0x3e, 0x01, 0x13, 0x35, 0x33, 0x15, 0x77, 0x9b, 0x12, - 0x69, 0x0f, 0x62, 0x4a, 0x4c, 0x63, 0x0c, 0x69, 0x0f, 0x9e, 0x1e, 0xb4, - 0x06, 0x86, 0x89, 0x7b, 0x3e, 0x46, 0x49, 0x3b, 0x77, 0x8d, 0xfe, 0x4f, - 0xac, 0xac, 0x00, 0x00, 0x00, 0x01, 0xff, 0x25, 0xfe, 0x42, 0x00, 0xda, - 0xff, 0xf5, 0x00, 0x0b, 0x00, 0x16, 0x40, 0x0a, 0x08, 0x0b, 0x05, 0x02, - 0x04, 0x03, 0x01, 0x80, 0x09, 0x07, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, - 0x17, 0x39, 0x31, 0x30, 0x13, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, - 0x17, 0x37, 0x17, 0x07, 0xda, 0x57, 0x84, 0x83, 0x56, 0x83, 0x84, 0x57, - 0x84, 0x84, 0x56, 0x84, 0xfe, 0x97, 0x55, 0x86, 0x85, 0x53, 0x85, 0x85, - 0x55, 0x85, 0x84, 0x53, 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x74, - 0xfe, 0x56, 0x00, 0x8d, 0xff, 0xfa, 0x00, 0x06, 0x00, 0x10, 0xb5, 0x02, - 0x03, 0x04, 0x80, 0x01, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xce, 0x32, 0x39, - 0x31, 0x30, 0x17, 0x15, 0x07, 0x17, 0x15, 0x25, 0x35, 0x8d, 0xaa, 0xaa, - 0xfe, 0xe7, 0x06, 0x72, 0x60, 0x60, 0x72, 0xa9, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x74, 0xfe, 0x56, 0x00, 0x8d, 0xff, 0xfa, 0x00, 0x06, - 0x00, 0x10, 0xb5, 0x04, 0x03, 0x02, 0x80, 0x05, 0x06, 0x00, 0x2f, 0x33, - 0x1a, 0xce, 0x32, 0x39, 0x31, 0x30, 0x17, 0x15, 0x05, 0x35, 0x37, 0x27, - 0x35, 0x8d, 0xfe, 0xe7, 0xaa, 0xaa, 0xaf, 0x52, 0xa9, 0x72, 0x60, 0x60, - 0x72, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xe8, 0xfe, 0x56, 0x01, 0xad, - 0xff, 0xfa, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x40, 0x0a, 0x09, 0x08, - 0x0b, 0x0c, 0x04, 0x03, 0x02, 0x80, 0x05, 0x06, 0x00, 0x2f, 0x33, 0x1a, - 0xce, 0x32, 0x39, 0x2f, 0xcd, 0x32, 0x39, 0x31, 0x30, 0x17, 0x15, 0x05, - 0x35, 0x37, 0x27, 0x35, 0x01, 0x23, 0x27, 0x07, 0x23, 0x13, 0x33, 0x01, - 0xfe, 0xe7, 0xaa, 0xaa, 0x02, 0xc5, 0x72, 0x60, 0x60, 0x72, 0xa9, 0x52, - 0xaf, 0x52, 0xa9, 0x72, 0x60, 0x60, 0x72, 0xfe, 0xa5, 0xaa, 0xaa, 0x01, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa4, 0x04, 0x78, 0x00, 0x5d, - 0x05, 0xf3, 0x00, 0x0d, 0x00, 0x0e, 0xb4, 0x06, 0x07, 0x80, 0x00, 0x0d, - 0x00, 0x2f, 0x33, 0x1a, 0xce, 0x32, 0x31, 0x30, 0x03, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x5c, 0x2a, - 0x37, 0x37, 0x2a, 0x54, 0x65, 0x65, 0x54, 0x04, 0xcd, 0x38, 0x31, 0x31, - 0x37, 0x55, 0x66, 0x57, 0x57, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf5, - 0x04, 0xa7, 0x01, 0xb3, 0x05, 0x65, 0x00, 0x0b, 0x00, 0x08, 0xb1, 0x03, - 0x09, 0x00, 0x2f, 0xcd, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xf5, 0x38, 0x27, 0x27, 0x38, 0x39, - 0x26, 0x27, 0x38, 0x05, 0x06, 0x27, 0x38, 0x39, 0x26, 0x27, 0x38, 0x38, - 0x00, 0x01, 0xff, 0x41, 0xfe, 0x56, 0x00, 0xbe, 0xff, 0xc3, 0x00, 0x0e, - 0x00, 0x29, 0x40, 0x13, 0x02, 0x01, 0x01, 0x0a, 0x0b, 0x03, 0x09, 0x06, - 0x06, 0x00, 0x0c, 0x0b, 0x0c, 0x07, 0xbf, 0x05, 0x01, 0x05, 0x0e, 0x00, - 0x2f, 0xcc, 0x5d, 0x32, 0x39, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x17, 0x37, 0x17, 0x07, 0x17, - 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x27, 0x33, 0x20, 0x85, - 0x19, 0x8e, 0x5d, 0x43, 0x4b, 0x4e, 0x42, 0x5e, 0x8c, 0x19, 0x86, 0x09, - 0x53, 0xca, 0x33, 0x4b, 0x25, 0x7a, 0x29, 0x7f, 0x7e, 0x29, 0x79, 0x25, - 0x4c, 0x35, 0x8e, 0x00, 0x00, 0x03, 0xfe, 0xbf, 0xfe, 0x57, 0x01, 0x45, - 0xff, 0xbd, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x1f, 0x40, 0x0d, - 0x0f, 0x05, 0x03, 0x23, 0x11, 0x11, 0x1d, 0x0d, 0x29, 0x03, 0x03, 0x17, - 0x07, 0x00, 0x2f, 0xcd, 0x33, 0x2f, 0xcd, 0x2f, 0xcd, 0x33, 0x2f, 0xcd, - 0x12, 0x39, 0x39, 0x31, 0x30, 0x05, 0x14, 0x06, 0x23, 0x22, 0x27, 0x06, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, - 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x01, 0x45, 0x69, 0x4e, 0x59, 0x33, 0x33, 0x59, 0x4f, 0x68, 0x69, - 0x4e, 0x5a, 0x32, 0x32, 0x5a, 0x4f, 0x68, 0xfd, 0xc8, 0x3d, 0x2c, 0x2c, - 0x3b, 0x3b, 0x2c, 0x2c, 0x3d, 0x01, 0xea, 0x3d, 0x2c, 0x2c, 0x3b, 0x3b, - 0x2c, 0x2c, 0x3d, 0xf6, 0x4e, 0x65, 0x49, 0x49, 0x65, 0x4e, 0x4e, 0x65, - 0x48, 0x48, 0x65, 0x4e, 0x33, 0x36, 0x3d, 0x2c, 0x2c, 0x3d, 0x36, 0x33, - 0x33, 0x36, 0x3d, 0x2c, 0x2c, 0x3d, 0x36, 0x00, 0x00, 0x01, 0xff, 0x38, - 0x04, 0x67, 0x00, 0xc8, 0x06, 0x34, 0x00, 0x07, 0x00, 0x0d, 0xb4, 0x01, - 0x03, 0x06, 0x00, 0x03, 0x00, 0x3f, 0xce, 0xdd, 0xcd, 0x31, 0x30, 0x13, - 0x03, 0x23, 0x37, 0x21, 0x13, 0x33, 0x07, 0xc8, 0x5f, 0x71, 0x40, 0xff, - 0x00, 0x5f, 0x71, 0x40, 0x05, 0x81, 0xfe, 0xe6, 0xb3, 0x01, 0x1a, 0xb3, - 0x00, 0x01, 0xff, 0x53, 0xfe, 0x57, 0x05, 0x86, 0xff, 0xca, 0x00, 0x0b, - 0x00, 0x0e, 0xb4, 0x0b, 0x05, 0x05, 0x08, 0x02, 0x00, 0x2f, 0xcd, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x02, 0x21, 0x20, 0x03, 0x33, 0x16, 0x04, - 0x33, 0x32, 0x24, 0x37, 0x05, 0x86, 0xe9, 0xfd, 0xd0, 0xfd, 0xcf, 0xe9, - 0x85, 0x5e, 0x01, 0x4a, 0xec, 0xec, 0x01, 0x4b, 0x5e, 0x36, 0xfe, 0x8d, - 0x01, 0x73, 0x82, 0x76, 0x76, 0x82, 0x00, 0x00, 0x00, 0x01, 0xff, 0x53, - 0x04, 0xbf, 0x05, 0x86, 0x06, 0x32, 0x00, 0x0b, 0x00, 0x0e, 0xb4, 0x04, - 0x00, 0x80, 0x08, 0x02, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x31, 0x30, - 0x01, 0x02, 0x21, 0x20, 0x03, 0x33, 0x16, 0x04, 0x33, 0x32, 0x24, 0x37, - 0x05, 0x86, 0xe9, 0xfd, 0xd0, 0xfd, 0xcf, 0xe9, 0x85, 0x5e, 0x01, 0x4a, - 0xec, 0xec, 0x01, 0x4b, 0x5e, 0x06, 0x32, 0xfe, 0x8d, 0x01, 0x73, 0x82, - 0x76, 0x76, 0x82, 0x00, 0x00, 0x01, 0xff, 0x53, 0x05, 0x1d, 0x03, 0x9d, - 0x05, 0x9c, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x02, 0x01, 0x00, 0x2f, 0x33, - 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x03, 0x9d, 0xfb, 0xb6, 0x04, 0x4a, - 0x05, 0x1d, 0x7f, 0x00, 0x00, 0x01, 0xff, 0x53, 0xfe, 0xd6, 0x03, 0x9d, - 0xff, 0x55, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x01, 0x03, 0x00, 0x2f, 0x33, - 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x03, 0x9d, 0xfb, 0xb6, 0x04, 0x4a, - 0xfe, 0xd6, 0x7f, 0x00, 0x00, 0x01, 0xff, 0x53, 0x04, 0xc3, 0x05, 0x85, - 0x05, 0xff, 0x00, 0x15, 0x00, 0x12, 0xb6, 0x07, 0x13, 0x15, 0x0e, 0x80, - 0x0a, 0x03, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, 0x39, 0x31, 0x30, - 0x01, 0x0e, 0x01, 0x23, 0x22, 0x25, 0x24, 0x23, 0x22, 0x06, 0x07, 0x23, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x04, 0x33, 0x32, 0x37, 0x05, 0x85, - 0x2d, 0xb4, 0x86, 0x99, 0xfe, 0xe9, 0xfe, 0xe8, 0x8e, 0x5e, 0x74, 0x1e, - 0x85, 0x2d, 0xc2, 0x7b, 0x59, 0xcd, 0x91, 0x01, 0x0f, 0xaa, 0x9a, 0x39, - 0x05, 0xff, 0xa0, 0x97, 0x56, 0x55, 0x54, 0x5c, 0x94, 0xa3, 0x28, 0x2d, - 0x56, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xff, 0x53, 0x04, 0xc3, 0x05, 0x86, - 0x06, 0x36, 0x00, 0x0b, 0x00, 0x0e, 0xb4, 0x04, 0x0a, 0x80, 0x08, 0x01, - 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x31, 0x30, 0x01, 0x23, 0x26, 0x24, - 0x23, 0x22, 0x04, 0x07, 0x23, 0x12, 0x21, 0x20, 0x05, 0x86, 0x85, 0x5e, - 0xfe, 0xb5, 0xec, 0xec, 0xfe, 0xb6, 0x5e, 0x85, 0xea, 0x02, 0x30, 0x02, - 0x2f, 0x04, 0xc3, 0x82, 0x76, 0x76, 0x82, 0x01, 0x73, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x53, 0xfe, 0x57, 0x03, 0xcf, 0xff, 0xb9, 0x00, 0x06, - 0x00, 0x0e, 0xb4, 0x05, 0x02, 0x01, 0x06, 0x01, 0x00, 0x2f, 0x2f, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x05, 0x07, 0x35, 0x21, 0x35, 0x21, 0x35, 0x03, - 0xcf, 0x96, 0xfc, 0x1a, 0x03, 0xe6, 0xf6, 0xb3, 0x80, 0x6c, 0x76, 0x00, - 0xff, 0xff, 0xfe, 0xbb, 0x01, 0xdc, 0x01, 0x87, 0x04, 0xf3, 0x10, 0x07, - 0x05, 0x63, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xba, - 0x01, 0xdc, 0x01, 0x48, 0x04, 0xf3, 0x10, 0x07, 0x05, 0x69, 0xfe, 0x7f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x01, 0xea, 0x00, 0x3d, - 0x06, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0d, 0xb4, 0x07, 0x03, 0x01, - 0x06, 0xeb, 0x00, 0x3f, 0xcc, 0x39, 0x2f, 0x31, 0x30, 0x03, 0x35, 0x33, - 0x15, 0x03, 0x11, 0x33, 0x11, 0x3c, 0x79, 0x79, 0x79, 0x05, 0x87, 0x79, - 0x79, 0xfc, 0x63, 0x02, 0xfb, 0xfd, 0x05, 0x00, 0xff, 0xff, 0xfe, 0xb9, - 0x01, 0xdc, 0x01, 0x4a, 0x04, 0xf3, 0x10, 0x07, 0x05, 0x72, 0xfe, 0x7e, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xda, 0x01, 0xdc, 0x01, 0x29, - 0x04, 0xe5, 0x10, 0x07, 0x05, 0x78, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xcd, 0x01, 0xdc, 0x01, 0x26, 0x04, 0xf4, 0x00, 0x17, - 0x00, 0x1d, 0x40, 0x0f, 0x0f, 0x15, 0xe4, 0x59, 0x13, 0x0f, 0xec, 0x05, - 0x09, 0x09, 0x02, 0xe4, 0x59, 0x09, 0xe9, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x33, 0x2b, 0x31, 0x30, 0x03, 0x10, 0x33, 0x32, 0x36, - 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0xb3, 0xba, 0x42, 0x56, 0x0b, - 0x7c, 0x0e, 0x97, 0x77, 0x98, 0xa5, 0xa1, 0x9b, 0x72, 0x93, 0x14, 0x7e, - 0x16, 0x89, 0x62, 0x56, 0x03, 0x6c, 0xfe, 0xd5, 0x49, 0x4c, 0x08, 0x6d, - 0x85, 0xc9, 0xc4, 0xbe, 0xcd, 0x78, 0x6c, 0x0a, 0x8a, 0x88, 0x00, 0x00, - 0xff, 0xff, 0xfe, 0xc8, 0x01, 0xdc, 0x01, 0x3a, 0x06, 0x00, 0x10, 0x07, - 0x05, 0x68, 0xfe, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xd7, - 0x01, 0xea, 0x01, 0x23, 0x06, 0x00, 0x00, 0x16, 0x00, 0x19, 0x40, 0x0b, - 0x08, 0x10, 0x13, 0x03, 0x40, 0x03, 0x0c, 0xe4, 0x59, 0x03, 0xec, 0x00, - 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xce, 0x2f, 0x33, 0x31, 0x30, 0x03, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x14, 0x07, 0xb2, 0x29, - 0x6f, 0x54, 0x76, 0x73, 0x7b, 0x46, 0x52, 0x58, 0x66, 0x7b, 0x7b, 0x06, - 0x04, 0x62, 0x4d, 0x44, 0x7b, 0x92, 0xfe, 0x04, 0x01, 0xe4, 0x71, 0x52, - 0x7d, 0x68, 0xfe, 0x3e, 0x04, 0x16, 0xfe, 0xf0, 0x70, 0x1e, 0x00, 0x00, - 0xff, 0xff, 0xfe, 0x19, 0x01, 0xea, 0x01, 0xe9, 0x04, 0xf3, 0x10, 0x07, - 0x05, 0x70, 0xfd, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x63, - 0x01, 0xea, 0x00, 0xbf, 0x04, 0xf3, 0x00, 0x12, 0x00, 0x14, 0x40, 0x09, - 0x12, 0x09, 0x0e, 0xe5, 0x59, 0x09, 0xec, 0x03, 0xeb, 0x00, 0x3f, 0x3f, - 0x2b, 0x00, 0x18, 0x2f, 0x31, 0x30, 0x03, 0x11, 0x34, 0x27, 0x33, 0x17, - 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x11, 0x99, 0x04, 0x74, 0x05, 0x03, 0x1e, 0x4a, 0x46, 0x16, 0x1c, 0x1c, - 0x25, 0x4e, 0x4f, 0x01, 0xea, 0x02, 0x4a, 0x71, 0x40, 0x9b, 0x62, 0x47, - 0x07, 0x74, 0x07, 0x8a, 0x7d, 0xfe, 0x72, 0x00, 0xff, 0xff, 0xff, 0x57, - 0x01, 0xdf, 0x00, 0xbb, 0x05, 0x8f, 0x10, 0x07, 0x05, 0x77, 0xff, 0x37, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xaa, 0x01, 0xea, 0x01, 0x59, - 0x04, 0xe5, 0x10, 0x07, 0x05, 0x7b, 0xfe, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xb6, 0x01, 0xea, 0x01, 0x4f, 0x04, 0xe5, 0x00, 0x0b, - 0x00, 0x17, 0x40, 0x0b, 0x01, 0x04, 0x0a, 0x07, 0x04, 0x02, 0x08, 0x05, - 0xeb, 0x00, 0x02, 0x00, 0x2f, 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x31, - 0x30, 0x13, 0x0b, 0x01, 0x23, 0x01, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, - 0x01, 0xc7, 0xc6, 0xc7, 0x84, 0x01, 0x05, 0xf9, 0x87, 0xb8, 0xb6, 0x89, - 0xfa, 0x01, 0x09, 0x01, 0xea, 0x01, 0x3a, 0xfe, 0xc6, 0x01, 0x89, 0x01, - 0x72, 0xfe, 0xd8, 0x01, 0x28, 0xfe, 0x8f, 0xfe, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xf9, 0x04, 0xab, 0x02, 0x36, 0x05, 0xcc, 0x00, 0x05, - 0x00, 0x13, 0xb6, 0x03, 0x00, 0x07, 0x06, 0x03, 0x80, 0x00, 0x00, 0x2f, - 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x13, 0x35, 0x13, - 0x33, 0x15, 0x03, 0xf9, 0x6e, 0xcf, 0xdf, 0x04, 0xab, 0x14, 0x01, 0x0d, - 0x1d, 0xfe, 0xfc, 0x00, 0x00, 0x01, 0x00, 0x75, 0xfe, 0x57, 0x01, 0xb2, - 0xff, 0x78, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x03, 0x00, 0x06, 0x07, 0x03, - 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, - 0x30, 0x05, 0x15, 0x03, 0x23, 0x35, 0x13, 0x01, 0xb2, 0x6e, 0xcf, 0xdf, - 0x88, 0x14, 0xfe, 0xf3, 0x1d, 0x01, 0x04, 0x00, 0xff, 0xff, 0x00, 0xf0, - 0xfe, 0x57, 0x01, 0xd0, 0xff, 0x81, 0x10, 0x07, 0x03, 0x07, 0x01, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0xec, 0x03, 0xb1, - 0x04, 0x4e, 0x00, 0x19, 0x00, 0x62, 0x40, 0x41, 0x06, 0x07, 0x07, 0x13, - 0x00, 0x0d, 0x13, 0x0d, 0x1a, 0x1b, 0x10, 0x17, 0x50, 0x59, 0x20, 0x14, - 0x70, 0x14, 0x80, 0x14, 0xd0, 0x14, 0xe0, 0x14, 0x05, 0x00, 0x14, 0x10, - 0x14, 0x60, 0x14, 0x70, 0x14, 0x80, 0x14, 0xc0, 0x14, 0xd0, 0x14, 0x07, - 0x09, 0x14, 0x14, 0x10, 0x16, 0x0f, 0x06, 0x6f, 0x06, 0x7f, 0x06, 0xcf, - 0x06, 0x04, 0x0a, 0x03, 0x06, 0x06, 0x0a, 0x0a, 0x03, 0x50, 0x59, 0x0a, - 0x10, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x3f, 0x33, 0x2f, 0x5e, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, - 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x02, 0xf5, - 0x81, 0x8e, 0x69, 0x72, 0x0e, 0xb9, 0x1d, 0xd9, 0xa7, 0xe0, 0xf0, 0xef, - 0xe3, 0xab, 0xe1, 0x15, 0xb6, 0x0f, 0x81, 0x60, 0x8a, 0x87, 0x02, 0x22, - 0xe2, 0xbd, 0x6a, 0x5a, 0x0e, 0x97, 0xac, 0xfe, 0xe1, 0xfe, 0xef, 0xfe, - 0xed, 0xfe, 0xe1, 0xba, 0x9c, 0x0c, 0x6c, 0x68, 0xd1, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x03, 0xca, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x46, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x47, 0xfc, 0xff, - 0x00, 0x28, 0x40, 0x1d, 0x01, 0x34, 0x1b, 0x54, 0x1b, 0x64, 0x1b, 0x84, - 0x1b, 0xa4, 0x1b, 0xb4, 0x1b, 0xd4, 0x1b, 0x07, 0x00, 0x1b, 0x01, 0x02, - 0x1b, 0x01, 0x1b, 0x00, 0x1b, 0x1c, 0x00, 0x14, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2f, 0x5f, 0x5d, 0x5d, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3e, - 0xff, 0xec, 0x03, 0xb1, 0x04, 0x4e, 0x12, 0x26, 0x03, 0x35, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x00, 0xcf, 0xfc, 0xff, 0x00, 0x28, 0x40, 0x1d, - 0x01, 0x34, 0x1b, 0x54, 0x1b, 0x64, 0x1b, 0x84, 0x1b, 0xa4, 0x1b, 0xb4, - 0x1b, 0xd4, 0x1b, 0x07, 0x00, 0x1b, 0x01, 0x02, 0x1b, 0x01, 0x1b, 0x00, - 0x1b, 0x1c, 0x14, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2f, 0x5f, 0x5d, - 0x5d, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0xfe, 0xfa, 0x01, 0x81, - 0x04, 0x3a, 0x10, 0x06, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xcd, - 0x04, 0xc2, 0x01, 0xe1, 0x06, 0x07, 0x00, 0x05, 0x00, 0x11, 0xb5, 0x00, - 0x03, 0x06, 0x07, 0x02, 0x00, 0x00, 0x2f, 0xcd, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x31, 0x30, 0x13, 0x35, 0x13, 0x33, 0x15, 0x03, 0xcd, 0x45, 0xcf, - 0xc9, 0x04, 0xc2, 0x21, 0x01, 0x24, 0x25, 0xfe, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x1d, 0x04, 0xb0, 0x02, 0x8b, 0x06, 0x41, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x0d, 0x00, 0x3a, 0x40, 0x1f, 0x09, 0x06, 0x04, 0x01, - 0x0a, 0x0d, 0x0d, 0x01, 0x06, 0x03, 0x0e, 0x0f, 0x0b, 0x07, 0x06, 0x07, - 0x90, 0x59, 0x02, 0x00, 0x00, 0x0a, 0xc0, 0x06, 0x01, 0x0f, 0x06, 0x3f, - 0x06, 0x02, 0x06, 0x00, 0x2f, 0x5d, 0x5d, 0x33, 0x33, 0x2f, 0xcd, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x13, 0x33, 0x15, 0x03, 0x25, 0x35, - 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0xfa, 0x45, 0xbb, 0xb5, 0xfe, 0xd8, - 0x96, 0x01, 0x42, 0x96, 0x04, 0xb0, 0x21, 0x01, 0x70, 0x25, 0xfe, 0x94, - 0x1f, 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x05, 0x83, 0x10, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x39, 0xff, 0x6c, 0xff, 0x7c, 0x00, 0x2d, 0xb1, 0x02, - 0x14, 0xb8, 0xff, 0x0a, 0x40, 0x1b, 0x14, 0x14, 0x05, 0x05, 0x25, 0x2f, - 0x18, 0x01, 0x50, 0x18, 0xb0, 0x18, 0x02, 0x30, 0x18, 0x60, 0x18, 0x90, - 0x18, 0xc0, 0x18, 0xf0, 0x18, 0x05, 0x02, 0x13, 0x03, 0x00, 0x3f, 0x35, - 0x01, 0x5d, 0x71, 0x5d, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x01, 0x00, 0xbb, - 0x01, 0xbe, 0x01, 0x7e, 0x02, 0x9a, 0x00, 0x03, 0x00, 0xff, 0x40, 0x0f, - 0x03, 0x00, 0x05, 0x04, 0x02, 0x05, 0x01, 0xd4, 0x05, 0xe4, 0x05, 0xf4, - 0x05, 0x03, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x77, 0x7c, 0x48, 0x52, - 0x05, 0x62, 0x05, 0x02, 0x01, 0x20, 0x05, 0x30, 0x05, 0x40, 0x05, 0x03, - 0x04, 0x05, 0x14, 0x05, 0x02, 0x70, 0x05, 0xb8, 0xff, 0x80, 0x40, 0x09, - 0x67, 0x6f, 0x48, 0x44, 0x05, 0x54, 0x05, 0x02, 0x05, 0xb8, 0xff, 0xc0, - 0xb3, 0x63, 0x66, 0x48, 0x05, 0xb8, 0xff, 0x80, 0xb3, 0x5c, 0x5f, 0x48, - 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x57, 0x5b, 0x48, 0x05, 0xb8, 0xff, 0x80, - 0x40, 0x15, 0x51, 0x56, 0x48, 0x24, 0x05, 0x34, 0x05, 0x44, 0x05, 0x03, - 0xe4, 0x05, 0x01, 0xb0, 0x05, 0xc0, 0x05, 0xd0, 0x05, 0x03, 0x05, 0xb8, - 0xff, 0xc0, 0x40, 0x10, 0x43, 0x46, 0x48, 0x30, 0x05, 0x01, 0x24, 0x05, - 0x01, 0x00, 0x05, 0x10, 0x05, 0x02, 0x3c, 0x05, 0xb8, 0xff, 0xc0, 0x40, - 0x0c, 0x38, 0x3b, 0x48, 0xbb, 0x05, 0x01, 0x80, 0x05, 0x90, 0x05, 0x02, - 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x2b, 0x2d, 0x30, 0x48, 0x0b, 0x05, 0x01, - 0xd0, 0x05, 0xe0, 0x05, 0x02, 0xa4, 0x05, 0xb4, 0x05, 0xc4, 0x05, 0x03, - 0x20, 0x05, 0x30, 0x05, 0x02, 0x02, 0x00, 0x05, 0x10, 0x05, 0x02, 0xf0, - 0x05, 0x01, 0x9f, 0x05, 0xaf, 0x05, 0x02, 0x00, 0x05, 0x01, 0x09, 0x03, - 0x05, 0xb8, 0xff, 0xc0, 0xb7, 0x0d, 0x11, 0x48, 0x01, 0x00, 0x9b, 0x59, - 0x01, 0x00, 0x2f, 0x2b, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, - 0x5f, 0x71, 0x71, 0x71, 0x72, 0x2b, 0x72, 0x72, 0x2b, 0x5e, 0x5d, 0x5d, - 0x5d, 0x2b, 0x5d, 0x5d, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, 0x72, 0x2b, 0x5e, - 0x5d, 0x5d, 0x5f, 0x5d, 0x2b, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x35, 0x33, 0x15, 0xbb, 0xc3, 0x01, 0xbe, 0xdc, 0xdc, 0x00, - 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x05, 0xee, 0x05, 0x83, 0x10, 0x27, - 0x00, 0x28, 0x00, 0xf0, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, 0xff, 0x28, - 0xff, 0x7c, 0x00, 0x2d, 0x40, 0x0a, 0x01, 0x0e, 0x03, 0x01, 0x0f, 0x04, - 0x0f, 0x14, 0x0f, 0x02, 0xb8, 0xff, 0x71, 0x40, 0x10, 0x0f, 0x0f, 0x01, - 0x01, 0x25, 0x00, 0x2f, 0x00, 0x01, 0x02, 0xbf, 0x00, 0x01, 0xd0, 0x00, - 0x01, 0x5d, 0x5d, 0x5f, 0x5d, 0x35, 0x2b, 0x5d, 0x11, 0x35, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x06, 0x0d, - 0x05, 0x83, 0x10, 0x27, 0x00, 0x2b, 0x00, 0xed, 0x00, 0x00, 0x11, 0x07, - 0x03, 0x39, 0xff, 0x25, 0xff, 0x7c, 0x00, 0x36, 0x40, 0x15, 0x50, 0x13, - 0x80, 0x13, 0xa0, 0x13, 0xb0, 0x13, 0xc0, 0x13, 0x05, 0x01, 0x0e, 0x03, - 0x01, 0x0f, 0x00, 0x0f, 0x10, 0x0f, 0x02, 0xb8, 0xff, 0x71, 0x40, 0x0f, - 0x0f, 0x0f, 0x05, 0x05, 0x25, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0xbf, 0x00, - 0xcf, 0x00, 0x04, 0x5d, 0x35, 0x2b, 0x5d, 0x11, 0x35, 0x00, 0x3f, 0x35, - 0x01, 0x5d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x02, 0x55, - 0x05, 0x83, 0x10, 0x27, 0x00, 0x2c, 0x00, 0xd9, 0x00, 0x00, 0x11, 0x07, - 0x03, 0x39, 0xff, 0x1b, 0xff, 0x7c, 0x00, 0x40, 0x40, 0x14, 0x0b, 0x0b, - 0x2b, 0x0b, 0x02, 0x34, 0x0b, 0x84, 0x0b, 0x02, 0x01, 0x06, 0x03, 0x01, - 0x07, 0x04, 0x07, 0x14, 0x07, 0x02, 0xb8, 0xff, 0x66, 0x40, 0x16, 0x07, - 0x07, 0x01, 0x01, 0x25, 0x00, 0x2f, 0x00, 0x01, 0x02, 0x4f, 0x00, 0x5f, - 0x00, 0x6f, 0x00, 0x7f, 0x00, 0x04, 0x80, 0x00, 0x01, 0x5d, 0x5d, 0x5f, - 0x5d, 0x35, 0x2b, 0x5d, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x01, 0x5d, 0x5d, - 0xff, 0xff, 0xff, 0xbb, 0xff, 0xec, 0x05, 0xd3, 0x05, 0x96, 0x10, 0x26, - 0x00, 0x32, 0xfc, 0x00, 0x11, 0x07, 0x03, 0x39, 0xfe, 0xee, 0xff, 0x7c, - 0x00, 0x25, 0x40, 0x0a, 0x02, 0x1d, 0x03, 0x02, 0x1b, 0x00, 0x1b, 0xc0, - 0x1b, 0x02, 0xb8, 0xff, 0x5e, 0x40, 0x0a, 0x1b, 0x1b, 0x08, 0x08, 0x25, - 0x01, 0x00, 0x2f, 0x00, 0x01, 0x5d, 0x35, 0x35, 0x2b, 0x5d, 0x11, 0x35, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x06, 0xab, - 0x05, 0x83, 0x10, 0x27, 0x00, 0x3c, 0x01, 0x82, 0x00, 0x00, 0x11, 0x07, - 0x03, 0x39, 0xff, 0x74, 0xff, 0x7c, 0x01, 0xdc, 0x40, 0xff, 0x09, 0x10, - 0x01, 0x99, 0x28, 0x10, 0x01, 0x18, 0x10, 0x48, 0x10, 0x58, 0x10, 0xb8, - 0x10, 0xc8, 0x10, 0xe8, 0x10, 0x06, 0x08, 0x10, 0x68, 0x10, 0x78, 0x10, - 0x88, 0x10, 0x04, 0xc7, 0x18, 0x10, 0x38, 0x10, 0x02, 0xa8, 0x10, 0xc8, - 0x10, 0x02, 0x08, 0x10, 0x18, 0x10, 0x58, 0x10, 0xc8, 0x10, 0xd8, 0x10, - 0xf8, 0x10, 0x06, 0x97, 0x08, 0x10, 0x01, 0x0b, 0x17, 0x10, 0x87, 0x10, - 0xa7, 0x10, 0x03, 0x47, 0x10, 0x67, 0x10, 0xd7, 0x10, 0x03, 0x07, 0x10, - 0x17, 0x10, 0x02, 0xb6, 0xa7, 0x10, 0x01, 0x07, 0x10, 0x37, 0x10, 0xf7, - 0x10, 0x03, 0x07, 0x10, 0x37, 0x10, 0x57, 0x10, 0x67, 0x10, 0x77, 0x10, - 0x97, 0x10, 0xe7, 0x10, 0x07, 0x82, 0x57, 0x10, 0x01, 0x07, 0x10, 0x17, - 0x10, 0x77, 0x10, 0x87, 0x10, 0xa7, 0x10, 0x05, 0x3c, 0x27, 0x10, 0x67, - 0x10, 0x87, 0x10, 0x97, 0x10, 0xf7, 0x10, 0x05, 0x07, 0x10, 0x17, 0x10, - 0x27, 0x10, 0x37, 0x10, 0x47, 0x10, 0x57, 0x10, 0x77, 0x10, 0xb7, 0x10, - 0xc7, 0x10, 0xd7, 0x10, 0xe7, 0x10, 0x0b, 0x07, 0x10, 0x27, 0x10, 0x37, - 0x10, 0x57, 0x10, 0x97, 0x10, 0xa7, 0x10, 0xc7, 0x10, 0xd7, 0x10, 0xe7, - 0x10, 0xf7, 0x10, 0x0a, 0x0c, 0x06, 0x10, 0x16, 0x10, 0x02, 0x06, 0x10, - 0x36, 0x10, 0x76, 0x10, 0x96, 0x10, 0xa6, 0x10, 0xe6, 0x10, 0x06, 0x83, - 0x56, 0x10, 0xc6, 0x10, 0xe6, 0x10, 0x03, 0x06, 0x10, 0x26, 0x10, 0x86, - 0x10, 0xa6, 0x10, 0xc6, 0x10, 0x05, 0x06, 0x10, 0x26, 0x10, 0x56, 0x10, - 0x76, 0x10, 0x96, 0x10, 0xa6, 0x10, 0xb6, 0x10, 0xf6, 0x10, 0x08, 0x40, - 0x06, 0x10, 0x16, 0x10, 0x36, 0x10, 0x66, 0x10, 0x76, 0x10, 0x86, 0x10, - 0x96, 0x10, 0xa6, 0x10, 0xe6, 0x10, 0xf6, 0x10, 0x0a, 0x26, 0x10, 0x46, - 0x10, 0x40, 0x8d, 0x56, 0x10, 0x66, 0x10, 0xb6, 0x10, 0xc6, 0x10, 0xd6, - 0x10, 0xf6, 0x10, 0x08, 0x06, 0x10, 0x76, 0x10, 0x02, 0x10, 0x05, 0x10, - 0x25, 0x10, 0x45, 0x10, 0x95, 0x10, 0xa5, 0x10, 0xb5, 0x10, 0x06, 0x71, - 0x05, 0x10, 0x25, 0x10, 0x35, 0x10, 0x55, 0x10, 0x65, 0x10, 0x75, 0x10, - 0x95, 0x10, 0xc5, 0x10, 0xe5, 0x10, 0xf5, 0x10, 0x0a, 0x25, 0x10, 0x35, - 0x10, 0x45, 0x10, 0x55, 0x10, 0x65, 0x10, 0x85, 0x10, 0xa5, 0x10, 0xc5, - 0x10, 0xd5, 0x10, 0xe5, 0x10, 0xf5, 0x10, 0x0b, 0x05, 0x10, 0x75, 0x10, - 0xb5, 0x10, 0xc5, 0x10, 0xd5, 0x10, 0x05, 0x41, 0x04, 0x10, 0x24, 0x10, - 0x44, 0x10, 0x54, 0x10, 0x74, 0x10, 0xb4, 0x10, 0xc4, 0x10, 0xe4, 0x10, - 0xf4, 0x10, 0x09, 0x04, 0x10, 0x74, 0x10, 0x94, 0x10, 0x03, 0x62, 0x03, - 0x10, 0x73, 0x10, 0x02, 0x78, 0x00, 0x01, 0x0b, 0x03, 0x01, 0x0c, 0x00, - 0x0c, 0x10, 0x0c, 0x40, 0x0c, 0x60, 0x0c, 0x70, 0x0c, 0x80, 0x0c, 0x06, - 0xb8, 0xff, 0xa6, 0x40, 0x0b, 0x0c, 0x0c, 0x04, 0x04, 0x25, 0x00, 0x00, - 0x00, 0xb0, 0x00, 0x02, 0x5d, 0x35, 0x2b, 0x5d, 0x11, 0x35, 0x00, 0x3f, - 0x35, 0x01, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x71, 0x5e, 0x5d, 0x71, 0x72, - 0x5e, 0x5d, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, - 0x71, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x5e, 0x5d, 0x71, 0x72, - 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, - 0x71, 0x72, 0x5e, 0x5d, 0xff, 0xff, 0xff, 0xbb, 0x00, 0x00, 0x05, 0xad, - 0x05, 0x96, 0x10, 0x26, 0x03, 0x5b, 0x0a, 0x00, 0x11, 0x07, 0x03, 0x39, - 0xfe, 0xee, 0xff, 0x7c, 0x00, 0x36, 0x40, 0x0d, 0xaf, 0x2b, 0x01, 0x01, - 0x26, 0x03, 0x01, 0x24, 0x10, 0x24, 0x90, 0x24, 0x02, 0xb8, 0xff, 0x3e, - 0x40, 0x16, 0x24, 0x24, 0x21, 0x21, 0x25, 0x00, 0x1f, 0x00, 0x5f, 0x00, - 0x9f, 0x00, 0x03, 0x1f, 0x00, 0x9f, 0x00, 0xaf, 0x00, 0xdf, 0x00, 0x04, - 0x5d, 0x71, 0x35, 0x2b, 0x5d, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x01, 0x5d, - 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x02, 0x1e, 0x06, 0x41, 0x10, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x03, 0x3a, 0x93, 0x00, 0x00, 0xf8, - 0x40, 0xbe, 0x0f, 0x19, 0x1f, 0x19, 0xef, 0x19, 0xff, 0x19, 0x04, 0xd4, - 0x2f, 0x19, 0x3f, 0x19, 0x4f, 0x19, 0xff, 0x19, 0x04, 0x2f, 0x19, 0x01, - 0x0f, 0x19, 0x3f, 0x19, 0x4f, 0x19, 0xdf, 0x19, 0x04, 0xa4, 0x0f, 0x19, - 0xcf, 0x19, 0xdf, 0x19, 0xef, 0x19, 0x04, 0x6f, 0x19, 0x7f, 0x19, 0x02, - 0x0f, 0x19, 0x1f, 0x19, 0xaf, 0x19, 0x03, 0x6d, 0x8f, 0x19, 0xcf, 0x19, - 0xdf, 0x19, 0x03, 0x2f, 0x19, 0xdf, 0x19, 0xef, 0x19, 0xff, 0x19, 0x04, - 0x0f, 0x19, 0x01, 0x38, 0x0f, 0x19, 0x1f, 0x19, 0x2f, 0x19, 0xbf, 0x19, - 0xef, 0x19, 0xff, 0x19, 0x06, 0x0f, 0x19, 0x5f, 0x19, 0x02, 0x0f, 0x19, - 0x1f, 0x19, 0xff, 0x19, 0x03, 0x08, 0x00, 0x19, 0x01, 0xdf, 0x00, 0x19, - 0x10, 0x19, 0xd0, 0x19, 0xe0, 0x19, 0x04, 0x20, 0x19, 0xf0, 0x19, 0x02, - 0x00, 0x19, 0x10, 0x19, 0x02, 0xae, 0x40, 0x19, 0x50, 0x19, 0xd0, 0x19, - 0xe0, 0x19, 0x04, 0x00, 0x19, 0xe0, 0x19, 0x02, 0x73, 0x00, 0x19, 0x10, - 0x19, 0xd0, 0x19, 0x03, 0x20, 0x19, 0x70, 0x19, 0x02, 0x00, 0x19, 0x01, - 0x3d, 0x90, 0x19, 0xa0, 0x19, 0xb0, 0x19, 0x03, 0xb0, 0x19, 0xc0, 0x19, - 0xd0, 0x19, 0x03, 0x00, 0x19, 0x90, 0x19, 0xa0, 0x19, 0xe0, 0x19, 0x04, - 0x07, 0x03, 0x02, 0x01, 0x0a, 0x0a, 0x11, 0x26, 0x03, 0x02, 0x01, 0x10, - 0xb8, 0xff, 0xdc, 0xb4, 0x10, 0x16, 0x03, 0x09, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x01, 0x5e, 0x5d, 0x71, - 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x72, 0x5e, 0x5d, 0x71, 0x72, - 0x5e, 0x5d, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, - 0x71, 0x72, 0x5e, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x05, 0x81, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, 0x00, 0x01, 0x04, 0x2f, - 0x05, 0x82, 0x00, 0x05, 0x00, 0x1d, 0x40, 0x0e, 0x03, 0x04, 0x00, 0x04, - 0x07, 0x06, 0x05, 0x02, 0x5f, 0x59, 0x05, 0x03, 0x03, 0x12, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x15, 0x21, 0x11, 0x23, 0x11, 0x04, 0x2f, 0xfd, 0x38, 0xbf, 0x05, 0x82, - 0x9c, 0xfb, 0x1b, 0x05, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3d, - 0x00, 0x00, 0x05, 0x1a, 0x05, 0x81, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x3e, - 0x40, 0x21, 0x06, 0x02, 0x01, 0x00, 0x0a, 0x0e, 0x05, 0x05, 0x0a, 0x02, - 0x03, 0x10, 0x0f, 0x10, 0x10, 0x01, 0x0f, 0x10, 0x01, 0x0b, 0x03, 0x05, - 0x02, 0x0e, 0x04, 0x0e, 0x5f, 0x59, 0x04, 0x12, 0x0a, 0x00, 0x03, 0x00, - 0x3f, 0x32, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x01, 0x5f, 0x5e, 0x5d, - 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x33, 0x01, 0x15, 0x21, 0x37, 0x25, 0x01, 0x2e, 0x01, - 0x27, 0x07, 0x06, 0x07, 0x01, 0x02, 0x43, 0xd9, 0x01, 0xfe, 0xfb, 0x23, - 0x01, 0x04, 0x14, 0xfe, 0xae, 0x1e, 0x33, 0x02, 0x09, 0x1f, 0x2b, 0xfe, - 0xad, 0x05, 0x81, 0xfb, 0x0c, 0x8d, 0x8d, 0x0f, 0x03, 0x5e, 0x4a, 0xa1, - 0x0c, 0x20, 0x6f, 0x6a, 0xfc, 0xa4, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x05, 0x81, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x41, 0x00, 0x00, 0x04, 0xa3, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x1e, - 0x00, 0x4f, 0x40, 0x2b, 0x1e, 0x15, 0x0f, 0x0f, 0x00, 0x15, 0x08, 0x00, - 0x08, 0x20, 0x1f, 0x00, 0x20, 0x60, 0x20, 0x02, 0x0b, 0x03, 0x1b, 0x1e, - 0x5f, 0x59, 0x0f, 0x1b, 0x01, 0x0b, 0x03, 0x1b, 0x1b, 0x04, 0x0b, 0x0b, - 0x12, 0x5f, 0x59, 0x0b, 0x04, 0x04, 0x18, 0x5f, 0x59, 0x04, 0x13, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, - 0x07, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, - 0x01, 0x21, 0x15, 0x21, 0x05, 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, - 0xc5, 0xa6, 0x01, 0x72, 0x01, 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xc3, 0xfe, - 0xf9, 0xf0, 0xf2, 0xfe, 0xf8, 0x01, 0x0b, 0xed, 0xf4, 0x01, 0x05, 0xfc, - 0xe2, 0x02, 0x4b, 0xfd, 0xb5, 0x02, 0xc7, 0xdd, 0xfe, 0xb4, 0xb2, 0xb0, - 0x01, 0x4d, 0xde, 0x01, 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, 0xde, 0x01, - 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, 0xf5, 0xfe, 0xf7, 0xfe, 0xc9, 0x01, - 0x2d, 0x01, 0x66, 0xa0, 0xff, 0xff, 0x00, 0xbd, 0x00, 0x00, 0x01, 0x7c, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x3f, 0x05, 0x81, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x05, 0x4e, 0x05, 0x82, 0x00, 0x08, - 0x00, 0x3e, 0x40, 0x24, 0x08, 0x07, 0x03, 0x05, 0x06, 0x01, 0x00, 0x06, - 0x03, 0x00, 0x03, 0x0a, 0x09, 0x76, 0x03, 0x86, 0x03, 0x02, 0x03, 0x07, - 0x03, 0x06, 0x00, 0x12, 0x6f, 0x0a, 0x01, 0x30, 0x0a, 0x01, 0x2f, 0x0a, - 0x01, 0x00, 0x0a, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x3f, 0x32, 0x3f, - 0x33, 0x5d, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x25, 0x23, 0x01, 0x27, 0x07, 0x01, 0x23, 0x01, - 0x33, 0x05, 0x4e, 0xc9, 0xfe, 0x7c, 0x54, 0x54, 0xfe, 0x7a, 0xc9, 0x02, - 0x3f, 0xc6, 0x01, 0x03, 0xe0, 0xf9, 0xf9, 0xfc, 0x20, 0x05, 0x81, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x02, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5a, - 0x00, 0x00, 0x04, 0xd9, 0x05, 0x81, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, - 0x00, 0x3b, 0x40, 0x1e, 0x03, 0x0a, 0x09, 0x06, 0x02, 0x05, 0x06, 0x05, - 0x0c, 0x0d, 0x0b, 0x0a, 0x5f, 0x59, 0x0b, 0x0b, 0x07, 0x00, 0x06, 0x07, - 0x5f, 0x59, 0x06, 0x12, 0x00, 0x03, 0x5f, 0x59, 0x00, 0x03, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x39, 0x32, 0x31, - 0x30, 0x13, 0x21, 0x15, 0x21, 0x01, 0x15, 0x21, 0x35, 0x01, 0x15, 0x21, - 0x35, 0x7d, 0x04, 0x39, 0xfb, 0xc7, 0x04, 0x5c, 0xfb, 0x81, 0x03, 0xe4, - 0xfc, 0xb7, 0x05, 0x81, 0x9c, 0xfb, 0xb7, 0x9c, 0x9c, 0x02, 0x85, 0x9a, - 0x9a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x05, 0x96, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x20, 0x05, 0x81, 0x00, 0x07, 0x00, 0x3f, 0x40, 0x17, - 0x00, 0x07, 0x03, 0x04, 0x07, 0x04, 0x09, 0x08, 0x00, 0x09, 0x01, 0x00, - 0x09, 0x80, 0x09, 0x90, 0x09, 0xa0, 0x09, 0x04, 0x0b, 0x03, 0x09, 0xb8, - 0xff, 0xc0, 0x40, 0x0c, 0x0e, 0x11, 0x48, 0x05, 0x02, 0x5f, 0x59, 0x05, - 0x03, 0x04, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x3f, 0x2b, 0x01, 0x2b, 0x5f, - 0x5e, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x04, 0x61, 0xfd, - 0x06, 0xbf, 0x04, 0x78, 0x04, 0xe0, 0xfb, 0x20, 0x05, 0x81, 0xfa, 0x7f, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x04, 0xa1, - 0x05, 0x81, 0x00, 0x0c, 0x00, 0x45, 0x40, 0x23, 0x07, 0x03, 0x03, 0x0a, - 0x08, 0x02, 0x02, 0x06, 0x01, 0x0b, 0x01, 0x0b, 0x0d, 0x0e, 0x03, 0x07, - 0x04, 0x07, 0x5f, 0x59, 0x09, 0x02, 0x08, 0x03, 0x00, 0x04, 0x03, 0x01, - 0x0a, 0x00, 0x0a, 0x5f, 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x12, 0x17, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x32, 0x32, 0x11, - 0x33, 0x31, 0x30, 0x33, 0x35, 0x09, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, - 0x15, 0x01, 0x21, 0x15, 0x6c, 0x02, 0x1a, 0xfd, 0xf7, 0x03, 0xe7, 0xfc, - 0xf0, 0x01, 0xca, 0xfe, 0x16, 0x03, 0x6d, 0xa2, 0x02, 0x43, 0x01, 0xfb, - 0xa1, 0x9c, 0xfe, 0x43, 0x7c, 0xfd, 0xf0, 0x9c, 0xff, 0xff, 0x00, 0x2e, - 0x00, 0x00, 0x04, 0xb4, 0x05, 0x81, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x3c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x75, 0xff, 0xf5, 0x05, 0xee, - 0x05, 0x8b, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x28, 0x00, 0x7e, 0x40, 0x2c, - 0x20, 0x0d, 0x1c, 0x14, 0x06, 0x06, 0x24, 0x11, 0x07, 0x18, 0x00, 0x00, - 0x07, 0x0d, 0x03, 0x29, 0x2a, 0xb4, 0x2a, 0xe4, 0x2a, 0x02, 0xa0, 0x2a, - 0x01, 0x24, 0x2a, 0x44, 0x2a, 0x64, 0x2a, 0x94, 0x2a, 0x04, 0x10, 0x2a, - 0x01, 0x02, 0x00, 0x2a, 0x01, 0x0f, 0x03, 0x2a, 0xb8, 0xff, 0xc0, 0x40, - 0x1c, 0x0a, 0x0d, 0x48, 0x1c, 0x23, 0x09, 0x23, 0x60, 0x59, 0x05, 0x09, - 0x1b, 0x26, 0x10, 0x26, 0x60, 0x59, 0x14, 0x10, 0x09, 0x10, 0x09, 0x10, - 0x06, 0x12, 0x03, 0x06, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x01, 0x2b, 0x01, 0x15, 0x23, - 0x35, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x00, 0x21, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x20, 0x00, 0x07, 0x10, 0x21, 0x23, 0x11, 0x33, 0x32, 0x36, - 0x25, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x05, 0xee, 0x7f, - 0xee, 0xa0, 0x53, 0xb9, 0x53, 0xa1, 0xee, 0x7e, 0x01, 0x17, 0x01, 0x01, - 0x48, 0xb9, 0x47, 0x01, 0x02, 0x01, 0x17, 0xc0, 0xfe, 0x90, 0x30, 0x38, - 0xae, 0xba, 0xfc, 0x07, 0xba, 0xae, 0x38, 0x34, 0xb6, 0xb6, 0x02, 0xe0, - 0x99, 0xed, 0x82, 0xe3, 0xe3, 0x83, 0xed, 0x98, 0xee, 0x01, 0x07, 0xb6, - 0xb6, 0xfe, 0xf8, 0xf1, 0x01, 0x6f, 0xfd, 0x16, 0xc0, 0xbb, 0xbb, 0xc0, - 0x02, 0xea, 0xb4, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x2b, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, - 0x00, 0x00, 0x06, 0x1e, 0x05, 0x81, 0x00, 0x1d, 0x00, 0x7c, 0x40, 0x39, - 0x14, 0x17, 0x10, 0x1d, 0x1d, 0x0d, 0x00, 0x09, 0x06, 0x06, 0x00, 0x17, - 0x03, 0x1f, 0x1e, 0x04, 0x1f, 0x44, 0x1f, 0x84, 0x1f, 0x94, 0x1f, 0x04, - 0xa4, 0x1f, 0xb4, 0x1f, 0xc4, 0x1f, 0xe4, 0x1f, 0xf4, 0x1f, 0x05, 0x60, - 0x1f, 0x01, 0x44, 0x1f, 0x54, 0x1f, 0x02, 0x20, 0x1f, 0x30, 0x1f, 0x02, - 0x14, 0x1f, 0x01, 0x00, 0x1f, 0x01, 0x0d, 0x02, 0x1f, 0xb8, 0xff, 0xc0, - 0x40, 0x15, 0x09, 0x0c, 0x48, 0x1c, 0x02, 0x0c, 0x02, 0x60, 0x59, 0x10, - 0xef, 0x0c, 0x01, 0x0c, 0x0c, 0x15, 0x0e, 0x07, 0x03, 0x00, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x33, 0x39, 0x2f, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x11, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x0e, 0x01, 0x2b, 0x01, 0x11, 0x02, 0xfb, 0x53, 0xa1, - 0xf4, 0x82, 0xbf, 0xc7, 0xac, 0x38, 0xb9, 0x38, 0xb0, 0xc3, 0xbf, 0x83, - 0xf3, 0xa1, 0x53, 0x01, 0xab, 0x83, 0xed, 0x97, 0x01, 0xcf, 0xfe, 0x2d, - 0xac, 0xca, 0x03, 0x49, 0xfc, 0xb7, 0xc7, 0xaf, 0x01, 0xd3, 0xfe, 0x31, - 0x95, 0xee, 0x84, 0xfe, 0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0x00, 0x00, 0x05, 0xa3, 0x05, 0x96, 0x00, 0x23, 0x00, 0x53, 0x40, 0x2a, - 0x1e, 0x19, 0x06, 0x0b, 0x19, 0x0b, 0x15, 0x0f, 0x15, 0x1a, 0x21, 0x0f, - 0x0a, 0x03, 0x21, 0x03, 0x24, 0x25, 0x0f, 0x25, 0x01, 0x0e, 0x03, 0x1e, - 0x18, 0x0c, 0x08, 0x06, 0x1b, 0x1a, 0x1b, 0x5f, 0x59, 0x0b, 0x1a, 0x12, - 0x00, 0x12, 0x5f, 0x59, 0x00, 0x04, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x01, 0x5f, 0x5e, - 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x20, 0x00, - 0x11, 0x14, 0x02, 0x07, 0x3f, 0x01, 0x33, 0x15, 0x21, 0x35, 0x36, 0x12, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x12, 0x17, 0x15, 0x21, - 0x35, 0x33, 0x1f, 0x01, 0x26, 0x02, 0x35, 0x10, 0x00, 0x02, 0xfd, 0x01, - 0x2f, 0x01, 0x5b, 0xd7, 0xd1, 0x51, 0x7f, 0xf4, 0xfd, 0xb3, 0xb3, 0xbb, - 0xee, 0xd8, 0xda, 0xee, 0xba, 0xb4, 0xfd, 0xb3, 0xf4, 0x7f, 0x51, 0xd0, - 0xd8, 0x01, 0x5b, 0x05, 0x96, 0xfe, 0xb1, 0xfe, 0xda, 0xc9, 0xfe, 0xac, - 0x73, 0x05, 0x06, 0x9c, 0xe0, 0x5f, 0x01, 0x1d, 0xb8, 0xe8, 0xfe, 0xfe, - 0xe8, 0xb7, 0xfe, 0xe3, 0x60, 0xe0, 0x9c, 0x06, 0x05, 0x71, 0x01, 0x55, - 0xca, 0x01, 0x26, 0x01, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, - 0x00, 0x00, 0x02, 0x34, 0x06, 0xb2, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, - 0x11, 0x06, 0x09, 0x01, 0xda, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, - 0x04, 0x04, 0x05, 0x26, 0x02, 0x01, 0x08, 0x01, 0x08, 0x06, 0x00, 0x02, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x06, 0xb2, 0x00, 0x08, - 0x00, 0x0c, 0x00, 0x10, 0x01, 0xb5, 0x40, 0xff, 0x09, 0x0c, 0x10, 0x0d, - 0x0c, 0x06, 0x0d, 0x0c, 0x04, 0x11, 0x12, 0x0a, 0x0e, 0x0d, 0x0e, 0x91, - 0x59, 0x09, 0x0d, 0x06, 0x00, 0x03, 0x08, 0x03, 0x18, 0x03, 0x48, 0x03, - 0x03, 0x0c, 0x03, 0x01, 0x08, 0x04, 0x03, 0x01, 0x12, 0x76, 0x12, 0x01, - 0x62, 0x12, 0x01, 0x54, 0x12, 0x01, 0x46, 0x12, 0x01, 0x36, 0x12, 0x01, - 0x24, 0x12, 0x01, 0x16, 0x12, 0x01, 0x04, 0x12, 0x01, 0xf2, 0x12, 0x01, - 0x01, 0xe0, 0x12, 0x01, 0xd0, 0x12, 0x01, 0xc4, 0x12, 0x01, 0xb0, 0x12, - 0x01, 0xa0, 0x12, 0x01, 0x94, 0x12, 0x01, 0x70, 0x12, 0x01, 0x64, 0x12, - 0x01, 0x40, 0x12, 0x01, 0x34, 0x12, 0x01, 0x24, 0x12, 0x01, 0x14, 0x12, - 0x01, 0x00, 0x12, 0x01, 0x69, 0xf4, 0x12, 0x01, 0xe4, 0x12, 0x01, 0xd0, - 0x12, 0x01, 0xc4, 0x12, 0x01, 0xb4, 0x12, 0x01, 0xa4, 0x12, 0x01, 0x90, - 0x12, 0x01, 0x80, 0x12, 0x01, 0x74, 0x12, 0x01, 0x60, 0x12, 0x01, 0x50, - 0x12, 0x01, 0x44, 0x12, 0x01, 0x20, 0x12, 0x01, 0x14, 0x12, 0x01, 0x04, - 0x12, 0x01, 0xf4, 0x12, 0x01, 0xe0, 0x12, 0x01, 0xd4, 0x12, 0x01, 0xc4, - 0x12, 0x01, 0xb0, 0x12, 0x01, 0xa4, 0x12, 0x01, 0x94, 0x12, 0x01, 0x74, - 0x12, 0x01, 0x64, 0x12, 0x01, 0x54, 0x12, 0x01, 0x40, 0x12, 0x01, 0x30, - 0x12, 0x01, 0x24, 0x12, 0x01, 0x00, 0x12, 0x01, 0xf4, 0x12, 0x01, 0xc4, - 0x12, 0x01, 0x90, 0x12, 0x01, 0x84, 0x12, 0x01, 0x74, 0x12, 0x01, 0x54, - 0x12, 0x01, 0x44, 0x12, 0x01, 0x24, 0x12, 0x01, 0x14, 0x12, 0x01, 0x04, - 0x12, 0x01, 0x39, 0xe0, 0x12, 0x01, 0xd4, 0x12, 0x01, 0xa4, 0x12, 0x01, - 0x84, 0x12, 0x01, 0x70, 0x12, 0x01, 0x64, 0x12, 0x01, 0x54, 0x12, 0x01, - 0x34, 0x12, 0x01, 0x24, 0x12, 0x01, 0x04, 0x12, 0x01, 0xf4, 0x12, 0x40, - 0x38, 0x01, 0xe4, 0x12, 0x01, 0xc0, 0x12, 0x01, 0xb4, 0x12, 0x01, 0x90, - 0x12, 0x01, 0x84, 0x12, 0x01, 0x54, 0x12, 0x01, 0x34, 0x12, 0x01, 0x14, - 0x12, 0x01, 0x04, 0x12, 0x01, 0xe4, 0x12, 0x01, 0xd4, 0x12, 0x01, 0xbb, - 0x12, 0x01, 0xa4, 0x12, 0x01, 0x70, 0x12, 0x01, 0x02, 0x60, 0x12, 0x01, - 0x30, 0x12, 0x01, 0x2f, 0x12, 0x01, 0x0f, 0x12, 0x01, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x3f, 0x33, 0x12, - 0x39, 0x5e, 0x5d, 0x11, 0x33, 0x33, 0xce, 0x32, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x23, 0x13, 0x01, 0x33, 0x09, 0x01, 0x33, 0x25, 0x35, 0x33, 0x15, - 0x21, 0x35, 0x33, 0x15, 0x03, 0x09, 0xbe, 0x02, 0xfd, 0xe0, 0xcd, 0x01, - 0xb2, 0x01, 0xb0, 0xcd, 0xfd, 0xf9, 0xa3, 0xfd, 0xd3, 0xa5, 0x02, 0x48, - 0xfd, 0xb8, 0x02, 0x48, 0x03, 0x39, 0xfd, 0x61, 0x02, 0x9f, 0x79, 0xb8, - 0xb8, 0xb8, 0xb8, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0x21, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x27, 0x11, 0x26, - 0x02, 0x27, 0x1a, 0x27, 0x2a, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xff, 0xec, 0x03, 0x6a, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x00, 0xca, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x27, 0x11, 0x26, - 0x01, 0x27, 0x49, 0x27, 0x2a, 0x0a, 0x04, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0x39, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1a, 0x11, 0x26, - 0x01, 0x1a, 0x64, 0x1a, 0x1d, 0x0d, 0x18, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, 0x00, 0x00, 0x01, 0xb2, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x03, 0x39, - 0xd1, 0x00, 0x00, 0x1a, 0x40, 0x11, 0x01, 0x0a, 0x11, 0x26, 0x01, 0x0a, - 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x1d, 0x0a, 0x0d, 0x03, 0x09, 0x25, 0x2b, - 0x5d, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0x41, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x3a, 0x00, 0xde, 0x00, 0x00, 0x00, 0x21, 0x40, 0x0b, - 0x03, 0x02, 0x01, 0x16, 0x16, 0x11, 0x26, 0x03, 0x02, 0x01, 0x1c, 0xb8, - 0xff, 0xf1, 0xb4, 0x1c, 0x22, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x55, - 0x40, 0x2d, 0x0f, 0x10, 0x10, 0x13, 0x13, 0x0c, 0x00, 0x21, 0x21, 0x28, - 0x1b, 0x06, 0x17, 0x16, 0x06, 0x16, 0x27, 0x28, 0x00, 0x28, 0x01, 0x0a, - 0x03, 0x00, 0x21, 0x13, 0x0c, 0x04, 0x10, 0x16, 0x15, 0x10, 0x0f, 0x09, - 0x24, 0x50, 0x59, 0x09, 0x10, 0x03, 0x1e, 0x50, 0x59, 0x03, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x12, 0x17, - 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, - 0x16, 0x17, 0x33, 0x36, 0x37, 0x33, 0x06, 0x02, 0x07, 0x16, 0x12, 0x17, - 0x23, 0x2e, 0x01, 0x27, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x2e, - 0x01, 0x23, 0x22, 0x06, 0x03, 0x4b, 0x3f, 0xaf, 0x79, 0xcd, 0xc1, 0xd9, - 0xd1, 0x7e, 0xb3, 0x2d, 0x02, 0x17, 0x32, 0xbc, 0x32, 0x54, 0x08, 0x05, - 0x3b, 0x2f, 0xb7, 0x18, 0x23, 0x05, 0xfd, 0xc4, 0x72, 0x84, 0x78, 0xa5, - 0x1a, 0x1d, 0x98, 0x77, 0x88, 0x79, 0xed, 0x88, 0x79, 0x01, 0x14, 0x01, - 0x18, 0x01, 0x1c, 0x01, 0x1a, 0x86, 0x79, 0x77, 0x74, 0x6a, 0xfe, 0xcd, - 0x62, 0xa0, 0xfe, 0xcc, 0x67, 0x3d, 0x8f, 0x21, 0x01, 0x31, 0xde, 0xc9, - 0xe7, 0xc4, 0xd3, 0xd4, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, - 0xfe, 0x57, 0x04, 0x49, 0x05, 0xcc, 0x00, 0x15, 0x00, 0x29, 0x00, 0x59, - 0x40, 0x2d, 0x13, 0x1f, 0x11, 0x1f, 0x0a, 0x1c, 0x1c, 0x00, 0x23, 0x11, - 0x11, 0x00, 0x16, 0x09, 0x09, 0x0a, 0x00, 0x0a, 0x2b, 0x2a, 0x13, 0x20, - 0x1f, 0x20, 0x1f, 0x50, 0x59, 0x20, 0x20, 0x0e, 0x03, 0x0e, 0x26, 0x50, - 0x59, 0x0e, 0x00, 0x09, 0x1b, 0x03, 0x19, 0x50, 0x59, 0x03, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x27, 0x23, - 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x07, 0x1e, 0x01, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x04, - 0x49, 0xed, 0xdc, 0xb7, 0x87, 0x06, 0x06, 0xb4, 0xe4, 0xe2, 0xc5, 0xd1, - 0xdf, 0x94, 0xaa, 0xfc, 0xf9, 0x40, 0xa5, 0x51, 0x8d, 0x98, 0xad, 0xa3, - 0x7f, 0x71, 0x79, 0x6e, 0x93, 0x81, 0x01, 0x95, 0xc6, 0xe3, 0x5e, 0x72, - 0x58, 0xfe, 0xd7, 0x05, 0xac, 0xed, 0xdc, 0xb7, 0xa6, 0xfd, 0x57, 0x1d, - 0xcc, 0xfe, 0x9b, 0x2b, 0x31, 0x9a, 0x87, 0x91, 0x9c, 0x8e, 0x1b, 0x8b, - 0x7a, 0x62, 0x70, 0x9b, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, - 0xfe, 0x58, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x12, 0x00, 0x4d, 0x40, 0x1d, - 0x0a, 0x0b, 0x12, 0x0c, 0x07, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x10, 0x07, - 0x0b, 0x04, 0x14, 0x13, 0x40, 0x14, 0x01, 0x00, 0x14, 0x30, 0x14, 0x60, - 0x14, 0x90, 0x14, 0x04, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x15, 0x1a, - 0x48, 0x0c, 0x07, 0x12, 0x12, 0x0f, 0x1b, 0x0a, 0x0a, 0x00, 0x0f, 0x00, - 0x3f, 0x32, 0x2f, 0x3f, 0x39, 0x11, 0x33, 0x33, 0x01, 0x2b, 0x5d, 0x71, - 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x33, 0x13, 0x1e, 0x03, 0x17, 0x36, 0x37, 0x13, - 0x33, 0x01, 0x06, 0x02, 0x07, 0x23, 0x36, 0x37, 0x07, 0xc0, 0xf5, 0x07, - 0x15, 0x14, 0x11, 0x04, 0x16, 0x34, 0xef, 0xbf, 0xfe, 0x7a, 0x22, 0x3a, - 0x0d, 0xbf, 0x19, 0x40, 0x04, 0x3a, 0xfd, 0x5d, 0x16, 0x3f, 0x43, 0x3f, - 0x16, 0x5b, 0x90, 0x02, 0xa5, 0xfb, 0xfb, 0x5a, 0xfe, 0xf1, 0x74, 0xc0, - 0xf3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xcc, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x3f, 0x40, 0x20, 0x07, 0x0e, - 0x1d, 0x04, 0x1c, 0x1d, 0x03, 0x19, 0x00, 0x20, 0x13, 0x19, 0x13, 0x21, - 0x22, 0x1d, 0x0d, 0x1e, 0x0d, 0x50, 0x59, 0x04, 0x1c, 0x16, 0x1e, 0x00, - 0x16, 0x0a, 0x50, 0x59, 0x16, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x12, 0x39, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, - 0x34, 0x2e, 0x01, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x01, 0x27, 0x01, 0x1e, 0x02, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, - 0x34, 0x12, 0x37, 0x01, 0x35, 0x21, 0x15, 0x03, 0x60, 0x35, 0x53, 0x54, - 0xb3, 0xbe, 0x9d, 0x8b, 0x90, 0x95, 0xfe, 0xff, 0x9a, 0x01, 0x3c, 0x79, - 0x69, 0x3a, 0xfe, 0xfe, 0xe0, 0xe2, 0xfe, 0xfd, 0xea, 0xe7, 0xfe, 0xc1, - 0x02, 0xdd, 0x01, 0xd7, 0x57, 0x99, 0x83, 0x57, 0x40, 0xee, 0x9c, 0xa9, - 0xbd, 0xb4, 0x04, 0x23, 0x08, 0xfe, 0xbc, 0x7c, 0x9f, 0xaf, 0x67, 0xe3, - 0xfe, 0xf4, 0x01, 0x06, 0xe7, 0xc2, 0x01, 0x17, 0x50, 0x01, 0x53, 0x77, - 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xec, 0x03, 0x6a, - 0x04, 0x4e, 0x00, 0x26, 0x00, 0x64, 0x40, 0x37, 0x24, 0x1c, 0x11, 0x20, - 0x0d, 0x11, 0x03, 0x0a, 0x16, 0x04, 0x0a, 0x04, 0x27, 0x28, 0x0f, 0x28, - 0x4f, 0x28, 0x02, 0x0a, 0x00, 0x28, 0x01, 0x21, 0x03, 0x0d, 0x1f, 0x20, - 0x1f, 0x20, 0x50, 0x59, 0x0f, 0x1f, 0x01, 0x0b, 0x03, 0x1f, 0x1f, 0x07, - 0x14, 0x14, 0x19, 0x50, 0x59, 0x17, 0x14, 0x10, 0x07, 0x00, 0x50, 0x59, - 0x03, 0x07, 0x16, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x25, 0x32, - 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, - 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, 0x0e, 0x01, 0x15, 0x14, - 0x16, 0x01, 0xc8, 0x57, 0xa7, 0x3b, 0x69, 0x50, 0xda, 0x84, 0xb5, 0xc1, - 0x95, 0x73, 0x6a, 0x7d, 0xcb, 0xa5, 0xfb, 0x7d, 0x80, 0x5c, 0x9b, 0x5b, - 0x60, 0x9c, 0xca, 0x99, 0x98, 0x51, 0x6b, 0x72, 0x59, 0x48, 0x64, 0x61, - 0x62, 0xa6, 0x95, 0x6e, 0x94, 0x0b, 0x02, 0x0c, 0x88, 0x63, 0x82, 0x9f, - 0xb9, 0x58, 0x8b, 0x55, 0x4a, 0x5b, 0x55, 0x87, 0x27, 0x56, 0x4b, 0x57, - 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0xfe, 0x9f, 0x03, 0x60, - 0x05, 0xcc, 0x00, 0x24, 0x00, 0x5b, 0x40, 0x15, 0x1c, 0x22, 0x22, 0x10, - 0x09, 0x1f, 0x00, 0x1a, 0x09, 0x1a, 0x26, 0x25, 0x22, 0x1f, 0x20, 0x1f, - 0x50, 0x59, 0x04, 0x14, 0x00, 0xb8, 0xff, 0xf0, 0x40, 0x1f, 0x13, 0x16, - 0x48, 0x87, 0x00, 0x97, 0x00, 0x02, 0xda, 0x1a, 0x01, 0xa9, 0x1a, 0xb9, - 0x1a, 0xc9, 0x1a, 0x03, 0x88, 0x1a, 0x98, 0x1a, 0x02, 0x14, 0x1a, 0x00, - 0x03, 0x0c, 0x20, 0x00, 0x0c, 0x00, 0x2f, 0x3f, 0x12, 0x17, 0x39, 0x5d, - 0x5d, 0x5d, 0x5d, 0x2b, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x1e, 0x01, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, - 0x27, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x27, 0x2e, 0x04, 0x35, 0x10, - 0x01, 0x35, 0x07, 0x21, 0x35, 0x21, 0x15, 0x08, 0x01, 0x01, 0x15, 0x30, - 0x5d, 0x85, 0x36, 0x6f, 0x5a, 0x3a, 0x24, 0x2f, 0x7e, 0x17, 0x20, 0x2a, - 0x53, 0x80, 0x73, 0x5b, 0x4f, 0x37, 0x1f, 0x02, 0x3d, 0x7f, 0xfe, 0xa7, - 0x02, 0x82, 0xfe, 0xde, 0xfe, 0xfa, 0x01, 0x7b, 0x43, 0x53, 0x35, 0x23, - 0x0f, 0x22, 0x39, 0x58, 0x44, 0x2c, 0x6d, 0x4f, 0x38, 0x1f, 0x52, 0x1c, - 0x24, 0x30, 0x24, 0x1e, 0x1b, 0x26, 0x35, 0x4b, 0x65, 0x42, 0x01, 0x86, - 0x02, 0x61, 0x04, 0x04, 0x83, 0x7f, 0xfe, 0xb9, 0xfe, 0x23, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, 0x04, 0x4e, 0x00, 0x19, - 0x00, 0x4d, 0x40, 0x16, 0x00, 0x19, 0x11, 0x09, 0x09, 0x0a, 0x19, 0x0a, - 0x1b, 0x1a, 0x80, 0x1b, 0x01, 0x8f, 0x1b, 0x01, 0x00, 0x1b, 0x01, 0x10, - 0x03, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x13, 0x17, 0x48, 0x19, 0x1b, - 0x11, 0x15, 0x09, 0x15, 0x05, 0x50, 0x59, 0x15, 0x10, 0x0d, 0x0f, 0x09, - 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, - 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x34, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x01, - 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x03, 0x39, 0x2a, - 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x24, 0xaa, 0x11, 0x15, 0x03, 0x3e, 0xa3, - 0x79, 0xb2, 0xa5, 0xfe, 0x58, 0x04, 0x56, 0x6b, 0x76, 0x34, 0xb2, 0x9e, - 0xfd, 0x8d, 0x03, 0x53, 0x7b, 0x6c, 0x27, 0x69, 0x29, 0x70, 0x5d, 0xb1, - 0xcc, 0xfb, 0x87, 0x00, 0x00, 0x03, 0x00, 0x6a, 0xff, 0xec, 0x04, 0x09, - 0x05, 0xcb, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x18, 0x00, 0x55, 0x40, 0x10, - 0x15, 0x0f, 0x0f, 0x06, 0x0e, 0x16, 0x16, 0x00, 0x06, 0x00, 0x19, 0x1a, - 0x60, 0x1a, 0x01, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x1e, 0x23, 0x48, - 0x0f, 0x1a, 0x01, 0x16, 0x03, 0x15, 0x0f, 0x50, 0x59, 0x15, 0x15, 0x03, - 0x08, 0x08, 0x12, 0x50, 0x59, 0x08, 0x00, 0x03, 0x0b, 0x50, 0x59, 0x03, - 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, 0x5d, 0x11, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x12, 0x01, 0x32, - 0x12, 0x13, 0x21, 0x1a, 0x01, 0x13, 0x22, 0x02, 0x03, 0x21, 0x0a, 0x01, - 0x04, 0x09, 0xf0, 0xe4, 0xe0, 0xeb, 0x01, 0xd1, 0xef, 0xdf, 0xfe, 0x2a, - 0x8f, 0x84, 0x05, 0xfd, 0xdd, 0x05, 0x81, 0x90, 0x8e, 0x82, 0x06, 0x02, - 0x23, 0x05, 0x7d, 0x02, 0xdd, 0xfe, 0x83, 0xfe, 0x8c, 0x01, 0x7d, 0x01, - 0x74, 0x02, 0xee, 0xfe, 0x8f, 0xfc, 0x17, 0x01, 0x11, 0x01, 0x1f, 0xfe, - 0xec, 0xfe, 0xe4, 0x04, 0xd9, 0xfe, 0xf5, 0xfe, 0xe5, 0x01, 0x1b, 0x01, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0x00, 0x00, 0x01, 0x8d, - 0x04, 0x3a, 0x00, 0x09, 0x00, 0xbc, 0x40, 0x83, 0x09, 0x06, 0x06, 0x03, - 0x03, 0x0a, 0x0b, 0x04, 0x0f, 0x00, 0x15, 0xdf, 0x0b, 0x01, 0x90, 0x0b, - 0x01, 0x4f, 0x0b, 0x01, 0x3f, 0x0b, 0x01, 0x00, 0x0b, 0x01, 0x6a, 0xef, - 0x0b, 0x01, 0xdf, 0x0b, 0x01, 0x9f, 0x0b, 0x01, 0x70, 0x0b, 0x01, 0x60, - 0x0b, 0x01, 0x0f, 0x0b, 0x01, 0xff, 0x0b, 0x01, 0xef, 0x0b, 0x01, 0xd0, - 0x0b, 0x01, 0x80, 0x0b, 0x01, 0x3f, 0x0b, 0x01, 0x60, 0x0b, 0x01, 0x1f, - 0x0b, 0x01, 0x0f, 0x0b, 0x01, 0x37, 0xff, 0x0b, 0x01, 0xcf, 0x0b, 0x01, - 0xb0, 0x0b, 0x01, 0xa0, 0x0b, 0x01, 0x90, 0x0b, 0x01, 0x3f, 0x0b, 0x01, - 0x2f, 0x0b, 0x01, 0x1f, 0x0b, 0x01, 0xd0, 0x0b, 0x01, 0xc0, 0x0b, 0x01, - 0xb0, 0x0b, 0x01, 0x6f, 0x0b, 0x01, 0x1f, 0x0b, 0x01, 0x0f, 0x0b, 0x01, - 0xe0, 0x0b, 0x01, 0xa0, 0x0b, 0x01, 0x90, 0x0b, 0x01, 0x3f, 0x0b, 0x01, - 0x1f, 0x0b, 0x01, 0x00, 0x0b, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x33, 0x2e, 0x01, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, - 0xc7, 0x1e, 0x20, 0xb4, 0x2b, 0x25, 0x20, 0x87, 0x45, 0x03, 0x4e, 0xfc, - 0xa9, 0x41, 0x7a, 0x28, 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, - 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x41, 0x40, 0x25, 0x00, 0x0d, 0x07, 0x03, - 0x03, 0x04, 0x08, 0x09, 0x09, 0x0a, 0x04, 0x03, 0x0c, 0x0b, 0x0d, 0x80, - 0x0d, 0xc0, 0x0d, 0xe0, 0x0d, 0x03, 0x3f, 0x0d, 0x01, 0x02, 0x01, 0x07, - 0x0a, 0x04, 0x08, 0x08, 0x05, 0x0f, 0x04, 0x00, 0x15, 0x00, 0x3f, 0x32, - 0x3f, 0x33, 0x11, 0x17, 0x39, 0x01, 0x5d, 0x5d, 0x11, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x03, - 0x30, 0xfe, 0x92, 0x84, 0xb4, 0xb4, 0x01, 0xdb, 0xd3, 0xfe, 0x49, 0x01, - 0xce, 0x01, 0xee, 0x6d, 0xfe, 0x7f, 0x04, 0x3a, 0xfd, 0xf3, 0x02, 0x0d, - 0xfe, 0x2f, 0xfd, 0x97, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xcc, 0x00, 0x16, 0x00, 0x44, 0x40, 0x27, 0x0f, 0x0e, 0x12, 0x0d, - 0x00, 0x15, 0x16, 0x16, 0x00, 0x08, 0x0e, 0x04, 0x18, 0x17, 0x00, 0x18, - 0x30, 0x18, 0x60, 0x18, 0xa0, 0x18, 0xb0, 0x18, 0x05, 0x09, 0x03, 0x12, - 0x00, 0x0a, 0x16, 0x0e, 0x15, 0x0a, 0x05, 0x50, 0x59, 0x0a, 0x00, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x01, 0x5f, 0x5e, - 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, - 0x16, 0x17, 0x01, 0x23, 0x03, 0x26, 0x27, 0x0e, 0x01, 0x01, 0x23, 0x01, - 0xcf, 0x44, 0x2b, 0x2b, 0x36, 0x27, 0x1d, 0x14, 0x23, 0x43, 0x3e, 0x6b, - 0x88, 0x4b, 0x01, 0xab, 0xbe, 0xcf, 0x29, 0x18, 0x0f, 0x2b, 0xfe, 0xe3, - 0xbb, 0x03, 0xc5, 0xbc, 0x64, 0x3b, 0x1c, 0x0a, 0x82, 0x18, 0x92, 0xc5, - 0xfb, 0x8b, 0x02, 0x41, 0x70, 0x66, 0x2e, 0x6b, 0xfd, 0x82, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8a, 0xfe, 0x77, 0x04, 0x06, 0x04, 0x3a, 0x00, 0x1d, - 0x00, 0x4c, 0x40, 0x14, 0x03, 0x19, 0x19, 0x1a, 0x12, 0x0e, 0x0e, 0x0f, - 0x1a, 0x0f, 0x1f, 0x1e, 0x00, 0x1f, 0x20, 0x1f, 0x02, 0x0f, 0x03, 0x1f, - 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x14, 0x17, 0x48, 0x03, 0x0a, 0x10, 0x1d, - 0x15, 0x19, 0x10, 0x0f, 0x0e, 0x07, 0x15, 0x50, 0x59, 0x07, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x2f, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x39, 0x01, - 0x2b, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x2e, 0x01, 0x27, 0x23, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x33, - 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, - 0x03, 0x5e, 0x02, 0x07, 0x01, 0x04, 0x3c, 0x85, 0x65, 0x52, 0x78, 0x20, - 0x04, 0x04, 0xb6, 0xb6, 0x7e, 0x82, 0x7c, 0x8f, 0xb5, 0x06, 0x0c, 0x8b, - 0x27, 0x76, 0x5c, 0x40, 0x3a, 0x2b, 0x4f, 0xfe, 0x8b, 0x05, 0xc3, 0xfd, - 0x7c, 0xa1, 0x9c, 0xb6, 0xa2, 0x02, 0x69, 0xfc, 0xaf, 0xbf, 0x2a, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xb2, 0x04, 0x3a, 0x00, 0x0d, - 0x01, 0x1c, 0x40, 0xd8, 0x09, 0x00, 0x04, 0x03, 0x07, 0x06, 0x05, 0x05, - 0x07, 0x00, 0x03, 0x0f, 0x0e, 0x9b, 0x0f, 0x01, 0x84, 0x0f, 0x01, 0x60, - 0x0f, 0x01, 0x44, 0x0f, 0x54, 0x0f, 0x02, 0x20, 0x0f, 0x01, 0x04, 0x0f, - 0x14, 0x0f, 0x02, 0xe0, 0x0f, 0x01, 0xc4, 0x0f, 0xd4, 0x0f, 0x02, 0xa0, - 0x0f, 0x01, 0x84, 0x0f, 0x94, 0x0f, 0x02, 0x60, 0x0f, 0x01, 0x04, 0x0f, - 0x14, 0x0f, 0x44, 0x0f, 0x54, 0x0f, 0x04, 0x67, 0x04, 0x0f, 0x14, 0x0f, - 0x44, 0x0f, 0x54, 0x0f, 0x84, 0x0f, 0x94, 0x0f, 0xc4, 0x0f, 0xd4, 0x0f, - 0x08, 0xdb, 0x0f, 0x01, 0xc4, 0x0f, 0x01, 0x9b, 0x0f, 0x01, 0x84, 0x0f, - 0x01, 0x5b, 0x0f, 0x01, 0x44, 0x0f, 0x01, 0x1b, 0x0f, 0x01, 0x04, 0x0f, - 0x01, 0xdb, 0x0f, 0x01, 0xc4, 0x0f, 0x01, 0x0b, 0x0f, 0x1b, 0x0f, 0x4b, - 0x0f, 0x5b, 0x0f, 0x8b, 0x0f, 0x9b, 0x0f, 0x06, 0x37, 0x4b, 0x0f, 0x5b, - 0x0f, 0x8b, 0x0f, 0x9b, 0x0f, 0xcb, 0x0f, 0xdb, 0x0f, 0x06, 0x3f, 0x0f, - 0x01, 0x20, 0x0f, 0x01, 0x04, 0x0f, 0x14, 0x0f, 0x02, 0xe0, 0x0f, 0x01, - 0xc4, 0x0f, 0xd4, 0x0f, 0x02, 0xa0, 0x0f, 0x01, 0x84, 0x0f, 0x94, 0x0f, - 0x02, 0x60, 0x0f, 0x01, 0x44, 0x0f, 0x54, 0x0f, 0x02, 0x20, 0x0f, 0x01, - 0x04, 0x0f, 0x14, 0x0f, 0x02, 0xc4, 0x0f, 0xd4, 0x0f, 0x02, 0xa0, 0x0f, - 0x01, 0x84, 0x0f, 0x94, 0x0f, 0x02, 0x60, 0x0f, 0x01, 0x02, 0x50, 0x0f, - 0x01, 0x2f, 0x0f, 0x01, 0x00, 0x0f, 0x10, 0x0f, 0x02, 0x07, 0x0b, 0x05, - 0x0f, 0x07, 0x04, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x01, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x02, 0x07, 0x23, 0x01, 0x33, 0x01, 0x00, 0x11, 0x34, 0x27, 0x33, 0x16, - 0x03, 0xb2, 0xcf, 0xb3, 0xaa, 0xfe, 0x7a, 0xbd, 0x01, 0x37, 0x01, 0x0a, - 0x31, 0xb1, 0x34, 0x03, 0x4e, 0xae, 0xfe, 0x3b, 0xdb, 0x04, 0x3a, 0xfc, - 0x60, 0x01, 0x5b, 0x01, 0x50, 0x87, 0x6e, 0x61, 0x00, 0x01, 0x00, 0x56, - 0xfe, 0x9f, 0x03, 0x6a, 0x05, 0xcc, 0x00, 0x34, 0x00, 0x7c, 0x40, 0x1e, - 0x1b, 0x2b, 0x24, 0x13, 0x07, 0x0d, 0x07, 0x03, 0x03, 0x00, 0x18, 0x0b, - 0x10, 0x10, 0x24, 0x00, 0x24, 0x35, 0x36, 0x03, 0x17, 0x18, 0x17, 0x18, - 0x50, 0x59, 0x13, 0x07, 0x0e, 0x1b, 0xb8, 0xff, 0xf0, 0x40, 0x25, 0x13, - 0x16, 0x48, 0x77, 0x1b, 0x01, 0x00, 0x10, 0x13, 0x16, 0x48, 0x78, 0x00, - 0x01, 0x24, 0x00, 0x1b, 0x03, 0x27, 0x00, 0x17, 0x01, 0x0b, 0x03, 0x17, - 0x17, 0x0e, 0x27, 0x10, 0x0b, 0x0d, 0x0e, 0x0d, 0x50, 0x59, 0x0e, 0x00, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, 0x2f, 0x12, 0x39, 0x2f, - 0x5f, 0x5e, 0x5d, 0x12, 0x17, 0x39, 0x5d, 0x2b, 0x5d, 0x2b, 0x12, 0x39, - 0x39, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, - 0x31, 0x30, 0x13, 0x34, 0x36, 0x37, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, - 0x37, 0x35, 0x07, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x1e, - 0x01, 0x17, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x1e, 0x03, - 0x15, 0x14, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x27, - 0x2e, 0x04, 0x56, 0xf1, 0xdc, 0x96, 0xae, 0x90, 0x81, 0xfe, 0x4a, 0x02, - 0x7a, 0xcf, 0xc2, 0x4d, 0x8f, 0x8a, 0xed, 0xf5, 0x30, 0x5d, 0x85, 0x36, - 0x72, 0x5e, 0x3d, 0x24, 0x2f, 0x7e, 0x17, 0x20, 0x2d, 0x58, 0x82, 0x73, - 0x5b, 0x4f, 0x37, 0x1f, 0x01, 0x62, 0xb3, 0xf4, 0x21, 0x02, 0x0b, 0x92, - 0x71, 0x67, 0x8d, 0x1b, 0x08, 0x08, 0x83, 0x7d, 0x18, 0x80, 0x6b, 0x45, - 0x5a, 0x34, 0x0c, 0x83, 0x1f, 0xbd, 0x93, 0x43, 0x53, 0x35, 0x23, 0x0f, - 0x22, 0x39, 0x58, 0x44, 0x2c, 0x6d, 0x4f, 0x38, 0x1f, 0x52, 0x1c, 0x24, - 0x30, 0x24, 0x1e, 0x1b, 0x26, 0x35, 0x4b, 0x65, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x04, 0x4e, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x05, 0x2b, 0x04, 0x3a, 0x00, 0x1f, - 0x00, 0x4a, 0x40, 0x28, 0x09, 0x0a, 0x0a, 0x11, 0x05, 0x0e, 0x19, 0x03, - 0x1d, 0x16, 0x16, 0x03, 0x0e, 0x03, 0x20, 0x21, 0x0f, 0x21, 0x2f, 0x21, - 0x02, 0x09, 0x03, 0x18, 0x05, 0x0e, 0x15, 0x0e, 0x50, 0x59, 0x15, 0x0f, - 0x0a, 0x15, 0x00, 0x1c, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x01, 0x5f, 0x5e, 0x5d, - 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x11, 0x21, 0x15, 0x14, - 0x02, 0x07, 0x23, 0x36, 0x12, 0x3d, 0x01, 0x22, 0x06, 0x07, 0x35, 0x3e, - 0x01, 0x33, 0x21, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x37, 0x15, 0x06, - 0x04, 0x66, 0x73, 0x66, 0xfe, 0x6e, 0x34, 0x2e, 0xbc, 0x34, 0x3a, 0x42, - 0xa0, 0x1a, 0x18, 0x6b, 0x34, 0x04, 0x25, 0xea, 0x2a, 0x34, 0x56, 0x4d, - 0x14, 0x71, 0x86, 0x02, 0xd4, 0x48, 0xe5, 0xfe, 0x2b, 0xb5, 0xce, 0x01, - 0xcf, 0xca, 0x50, 0x16, 0x0f, 0x8b, 0x0c, 0x11, 0x83, 0xfd, 0x53, 0x4c, - 0x45, 0x08, 0x81, 0x14, 0x00, 0x02, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x3b, - 0x04, 0x4f, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x52, 0x40, 0x0e, 0x13, 0x00, - 0x19, 0x0a, 0x0a, 0x0b, 0x00, 0x0b, 0x20, 0x1f, 0xd0, 0x20, 0x01, 0x20, - 0xb8, 0xff, 0xc0, 0x40, 0x1e, 0x1e, 0x23, 0x48, 0x7f, 0x20, 0x01, 0x00, - 0x20, 0x20, 0x20, 0x02, 0x0f, 0x03, 0x06, 0x0f, 0x03, 0x0f, 0x16, 0x50, - 0x59, 0x0f, 0x10, 0x0a, 0x1b, 0x03, 0x1c, 0x50, 0x59, 0x03, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x01, - 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, - 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, - 0x12, 0x07, 0x34, 0x26, 0x23, 0x20, 0x19, 0x01, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x04, 0x3b, 0xf3, 0xc2, 0x6e, 0xa0, 0x40, 0x04, 0x04, 0xb4, 0xf2, - 0xd5, 0x8e, 0xe4, 0x7e, 0xc1, 0xab, 0x90, 0xfe, 0xf9, 0x37, 0xa8, 0x58, - 0x7f, 0x8c, 0x02, 0x04, 0xee, 0xfe, 0xd6, 0x44, 0x4b, 0x3c, 0x3f, 0xfe, - 0x57, 0x03, 0xee, 0xf5, 0x01, 0x15, 0x91, 0xfe, 0xf3, 0xa5, 0xd1, 0xed, - 0xfe, 0x77, 0xfe, 0xc3, 0x45, 0x4e, 0xd4, 0x00, 0x00, 0x01, 0x00, 0x56, - 0xfe, 0x9f, 0x03, 0x9c, 0x04, 0x4e, 0x00, 0x22, 0x00, 0x67, 0x40, 0x11, - 0x20, 0x11, 0x0a, 0x04, 0x18, 0x0a, 0x18, 0x24, 0x23, 0x5f, 0x24, 0x01, - 0xb0, 0x24, 0x01, 0x03, 0x24, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x1e, 0x23, - 0x48, 0x07, 0x14, 0x18, 0x10, 0x13, 0x16, 0x48, 0x0f, 0x18, 0x1f, 0x18, - 0x02, 0x00, 0x04, 0x10, 0x04, 0x02, 0x11, 0x06, 0x04, 0xb8, 0xff, 0xf0, - 0x40, 0x11, 0x13, 0x16, 0x48, 0x14, 0x04, 0x18, 0x03, 0x0d, 0x21, 0x1d, - 0x1d, 0x00, 0x50, 0x59, 0x1d, 0x10, 0x0d, 0x00, 0x2f, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x12, 0x17, 0x39, 0x2b, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x11, - 0x33, 0x01, 0x2b, 0x5f, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, - 0x1f, 0x01, 0x16, 0x15, 0x14, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x35, 0x34, - 0x26, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x26, 0x02, 0x46, 0x52, 0x85, 0x5a, 0x81, 0xc3, 0x6e, 0xd5, 0x24, - 0x2f, 0x7e, 0x17, 0x20, 0x64, 0xa3, 0xb2, 0xa6, 0x4d, 0x4f, 0x81, 0xb1, - 0x6f, 0x65, 0x96, 0x41, 0x74, 0x5f, 0x03, 0xc1, 0x7a, 0xf6, 0x79, 0x81, - 0x83, 0x3f, 0x23, 0x46, 0xa5, 0x2c, 0x6d, 0x4f, 0x38, 0x1f, 0x52, 0x1c, - 0x30, 0x42, 0x2c, 0x30, 0x71, 0xb1, 0x87, 0x6f, 0xf9, 0xad, 0x5e, 0x36, - 0x44, 0x77, 0x64, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0xd1, - 0x04, 0x3a, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x2f, 0x40, 0x17, 0x17, 0x06, - 0x11, 0x0b, 0x00, 0x06, 0x00, 0x1c, 0x1d, 0x0d, 0x14, 0x09, 0x14, 0x50, - 0x59, 0x09, 0x0f, 0x03, 0x19, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x00, 0x23, 0x22, - 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x15, 0x23, 0x27, 0x15, 0x1e, 0x01, - 0x07, 0x10, 0x27, 0x23, 0x22, 0x06, 0x15, 0x10, 0x21, 0x32, 0x36, 0x04, - 0x30, 0xfe, 0xfb, 0xe5, 0xf0, 0xff, 0x00, 0x01, 0x2c, 0x01, 0x16, 0x02, - 0x39, 0xa5, 0x94, 0x51, 0x47, 0xbd, 0x7c, 0x59, 0xb8, 0xd2, 0x01, 0x2a, - 0x97, 0x9e, 0x01, 0xeb, 0xf1, 0xfe, 0xf2, 0x01, 0x19, 0x01, 0x07, 0x01, - 0x09, 0x01, 0x25, 0x83, 0x06, 0x04, 0x79, 0xde, 0x7a, 0x00, 0xff, 0xd0, - 0xe0, 0xc9, 0xfe, 0x63, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, - 0xff, 0xec, 0x03, 0x18, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x4c, 0x40, 0x18, - 0x10, 0x09, 0x03, 0x0b, 0x0b, 0x15, 0x15, 0x17, 0x18, 0x3f, 0x18, 0x01, - 0xc0, 0x18, 0x01, 0x8f, 0x18, 0x01, 0x00, 0x18, 0x01, 0x0a, 0x03, 0x18, - 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x0e, 0x11, 0x48, 0x12, 0x0e, 0x50, 0x59, - 0x12, 0x16, 0x0a, 0x16, 0x07, 0x16, 0x50, 0x59, 0x07, 0x0f, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, - 0x5d, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x31, 0x30, 0x01, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x21, 0x15, - 0x21, 0x11, 0x14, 0x16, 0x33, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x35, - 0x11, 0x01, 0x19, 0x42, 0xa0, 0x1a, 0x18, 0x6b, 0x34, 0x02, 0x44, 0xfe, - 0xd0, 0x2a, 0x34, 0x56, 0x4d, 0x42, 0x73, 0x66, 0x03, 0xb7, 0x16, 0x0f, - 0x8b, 0x0c, 0x11, 0x83, 0xfd, 0x53, 0x4c, 0x45, 0x08, 0x81, 0x14, 0x71, - 0x86, 0x02, 0xd4, 0x00, 0x00, 0x01, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x04, 0x3a, 0x00, 0x15, 0x00, 0x43, 0x40, 0x12, 0x0f, 0x00, 0x09, 0x06, - 0x00, 0x06, 0x17, 0x16, 0xe0, 0x17, 0x01, 0xef, 0x17, 0x01, 0x60, 0x17, - 0x01, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x14, 0x17, 0x48, 0x0f, 0x17, - 0x01, 0x0a, 0x03, 0x12, 0x07, 0x0f, 0x03, 0x0c, 0x50, 0x59, 0x03, 0x16, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, - 0x5d, 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x02, 0x27, 0x33, 0x16, 0x12, 0x03, - 0xfe, 0xea, 0xe7, 0xdf, 0xc9, 0xb5, 0x75, 0x86, 0x93, 0x7d, 0x46, 0x2c, - 0xbc, 0x35, 0x3a, 0x02, 0x3b, 0xfe, 0xdb, 0xfe, 0xd6, 0xd4, 0xe3, 0x02, - 0x97, 0xfd, 0x63, 0x92, 0x94, 0xcf, 0xf1, 0x80, 0x01, 0x2e, 0x55, 0x76, - 0xfe, 0xec, 0x00, 0x00, 0x00, 0x02, 0x00, 0x55, 0xfe, 0x57, 0x04, 0xda, - 0x04, 0x52, 0x00, 0x19, 0x00, 0x22, 0x00, 0x56, 0x40, 0x2e, 0x0d, 0x10, - 0x10, 0x09, 0x20, 0x04, 0x04, 0x13, 0x05, 0x1a, 0x00, 0x00, 0x05, 0x09, - 0x03, 0x23, 0x24, 0x00, 0x24, 0x01, 0x1d, 0x03, 0x0c, 0x0d, 0x50, 0x59, - 0x0c, 0x0c, 0x17, 0x17, 0x1d, 0x50, 0x59, 0x17, 0x10, 0x20, 0x13, 0x06, - 0x13, 0x50, 0x59, 0x03, 0x06, 0x16, 0x04, 0x1b, 0x00, 0x3f, 0x3f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, - 0x02, 0x07, 0x11, 0x23, 0x11, 0x26, 0x02, 0x11, 0x34, 0x12, 0x37, 0x17, - 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x12, - 0x07, 0x34, 0x26, 0x23, 0x22, 0x19, 0x01, 0x3e, 0x01, 0x04, 0xda, 0xfd, - 0xf7, 0xaa, 0xf2, 0xf5, 0xdf, 0xc5, 0x15, 0x7c, 0x80, 0x93, 0x97, 0x9a, - 0x9e, 0xa7, 0xbf, 0xbd, 0x57, 0x50, 0x90, 0xa2, 0x95, 0x02, 0x35, 0xfe, - 0xf0, 0xfe, 0xd7, 0x0e, 0xfe, 0x69, 0x01, 0x97, 0x0b, 0x01, 0x1e, 0x01, - 0x0a, 0xe7, 0x01, 0x2a, 0x20, 0x88, 0x1b, 0xda, 0xb8, 0xd5, 0xc9, 0x08, - 0x02, 0x44, 0xc1, 0xd4, 0xfe, 0xdc, 0xf5, 0xc1, 0xd3, 0xfe, 0xf3, 0xfd, - 0xb9, 0x07, 0xda, 0x00, 0x00, 0x01, 0x00, 0x15, 0xfe, 0x58, 0x04, 0x1b, - 0x04, 0x50, 0x00, 0x15, 0x00, 0x70, 0x40, 0x19, 0x11, 0x12, 0x12, 0x15, - 0x13, 0x10, 0x00, 0x03, 0x04, 0x14, 0x0a, 0x01, 0x02, 0x14, 0x02, 0x17, - 0x16, 0x24, 0x17, 0x01, 0x0b, 0x17, 0x01, 0x09, 0x10, 0xb8, 0xff, 0xd0, - 0x40, 0x28, 0x0e, 0x11, 0x48, 0x16, 0x10, 0x01, 0x05, 0x10, 0x01, 0x0c, - 0x1b, 0x00, 0x01, 0x0d, 0x00, 0x01, 0x10, 0x02, 0x00, 0x20, 0x0c, 0x0f, - 0x48, 0x00, 0x13, 0x03, 0x10, 0x04, 0x01, 0x11, 0x0f, 0x0c, 0x07, 0x50, - 0x59, 0x0c, 0x10, 0x15, 0x01, 0x1b, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x17, 0x39, 0x2b, 0x5f, 0x5e, 0x5d, 0x5d, 0x5e, 0x5d, - 0x5d, 0x2b, 0x01, 0x5e, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x12, 0x17, 0x39, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, 0x25, 0x01, - 0x23, 0x01, 0x03, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, - 0x16, 0x17, 0x13, 0x01, 0x33, 0x09, 0x01, 0x23, 0x02, 0x1e, 0xfe, 0xb3, - 0xbc, 0x01, 0xb8, 0xaa, 0x49, 0x43, 0x26, 0x1b, 0x17, 0x22, 0x35, 0x41, - 0x56, 0x6b, 0x50, 0x8e, 0x01, 0x08, 0xbb, 0xfe, 0x90, 0x01, 0x96, 0xbe, - 0xef, 0xfd, 0x69, 0x03, 0x39, 0x01, 0x57, 0x91, 0x4a, 0x0a, 0x83, 0x14, - 0x64, 0xa6, 0xfe, 0xd9, 0x02, 0x1b, 0xfd, 0x47, 0xfc, 0xd7, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x87, 0xfe, 0x57, 0x05, 0x2c, 0x05, 0x3c, 0x00, 0x17, - 0x00, 0x60, 0x40, 0x3a, 0x12, 0x0f, 0x00, 0x0a, 0x0a, 0x15, 0x0b, 0x03, - 0x06, 0x06, 0x0b, 0x0f, 0x03, 0x18, 0x19, 0x30, 0x19, 0x60, 0x19, 0x90, - 0x19, 0x03, 0x1f, 0x19, 0x01, 0xd0, 0x19, 0x01, 0xaf, 0x19, 0x01, 0x00, - 0x19, 0x30, 0x19, 0x40, 0x19, 0x70, 0x19, 0x04, 0x0e, 0x03, 0x16, 0x16, - 0x04, 0x10, 0x0f, 0x00, 0x15, 0x0c, 0x15, 0x50, 0x59, 0x09, 0x0c, 0x16, - 0x0a, 0x1b, 0x00, 0x3f, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x33, 0x33, 0x2f, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x25, 0x3e, 0x01, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x05, - 0x11, 0x23, 0x11, 0x24, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, - 0x11, 0x33, 0x03, 0x2e, 0xb7, 0x91, 0xb6, 0xf1, 0xfe, 0xf3, 0xaa, 0xfe, - 0xf5, 0xf2, 0xb5, 0x90, 0xb8, 0xaa, 0x77, 0x02, 0x8d, 0xae, 0x02, 0x86, - 0xfd, 0x7c, 0xf1, 0xd7, 0x02, 0xfe, 0x6b, 0x01, 0x95, 0x02, 0xd6, 0xf2, - 0x02, 0x84, 0xfd, 0x7a, 0xaa, 0x91, 0x02, 0x04, 0xc5, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, 0x04, 0x4f, 0x00, 0x2a, - 0x00, 0x7a, 0x40, 0x1c, 0x1f, 0x09, 0x22, 0x06, 0x22, 0x1b, 0x14, 0x00, - 0x00, 0x28, 0x06, 0x0e, 0x0e, 0x28, 0x1b, 0x03, 0x2b, 0x2c, 0x00, 0x2c, - 0x01, 0x30, 0x2c, 0x01, 0xf0, 0x2c, 0x01, 0x2c, 0xb8, 0xff, 0xc0, 0x40, - 0x28, 0x1e, 0x23, 0x48, 0xaf, 0x2c, 0xdf, 0x2c, 0x02, 0x00, 0x2c, 0x20, - 0x2c, 0x40, 0x2c, 0x03, 0x09, 0x03, 0x15, 0x29, 0x29, 0x18, 0x0a, 0x03, - 0x25, 0x18, 0x25, 0x50, 0x59, 0x11, 0x18, 0x16, 0x1f, 0x09, 0x0a, 0x09, - 0x50, 0x59, 0x1e, 0x0a, 0x10, 0x00, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, - 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x5d, 0x71, 0x72, 0x11, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x27, 0x37, 0x1e, 0x02, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, - 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x37, 0x17, 0x0e, - 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x03, 0x73, - 0x72, 0x66, 0x72, 0x71, 0x84, 0x7a, 0x17, 0x82, 0xbd, 0x65, 0xcf, 0xbe, - 0x7e, 0x9d, 0x22, 0x04, 0x22, 0x9d, 0x7e, 0xbe, 0xcf, 0xe2, 0xc2, 0x17, - 0x77, 0x87, 0x6f, 0x72, 0x66, 0x76, 0xa6, 0x01, 0xc1, 0x9d, 0xad, 0xba, - 0xcf, 0xb9, 0xef, 0x1c, 0x8b, 0x15, 0xa1, 0xfd, 0x97, 0xff, 0x00, 0xfe, - 0xe7, 0x81, 0x8a, 0x8a, 0x81, 0x01, 0x19, 0x01, 0x00, 0xea, 0x01, 0x40, - 0x20, 0x8b, 0x1a, 0xeb, 0xbf, 0xce, 0xbb, 0xad, 0x9d, 0xfc, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xcd, 0x00, 0x00, 0x01, 0xfa, 0x05, 0x7b, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0xa0, 0x00, 0x00, 0x1d, - 0x40, 0x09, 0x02, 0x01, 0x0a, 0x0a, 0x11, 0x26, 0x02, 0x01, 0x0e, 0xb8, - 0xff, 0xd9, 0xb4, 0x0e, 0x0c, 0x03, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x05, 0x7b, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x16, 0x16, 0x11, 0x26, 0x02, 0x01, 0x1a, 0xb8, 0xff, 0xf4, - 0xb4, 0x1a, 0x18, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x07, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0x29, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x02, 0x17, 0x11, 0x26, - 0x02, 0x17, 0x46, 0x17, 0x1a, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x00, 0xfc, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x16, 0x11, 0x26, - 0x01, 0x16, 0x11, 0x16, 0x19, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0xff, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x2b, 0x11, 0x26, - 0x01, 0x2b, 0x37, 0x2b, 0x2e, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0x00, 0x03, 0x00, 0x73, 0xff, 0xec, 0x04, 0x23, - 0x05, 0xcc, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x31, 0x00, 0x5e, 0x40, 0x34, - 0x1c, 0x02, 0x02, 0x00, 0x2e, 0x10, 0x28, 0x17, 0x17, 0x22, 0x09, 0x10, - 0x09, 0x32, 0x33, 0x06, 0x25, 0x50, 0x59, 0x30, 0x1a, 0x50, 0x59, 0x03, - 0x20, 0x06, 0x01, 0x0f, 0x30, 0x1f, 0x30, 0x02, 0x09, 0x03, 0x06, 0x30, - 0x06, 0x30, 0x0c, 0x13, 0x13, 0x2b, 0x50, 0x59, 0x13, 0x00, 0x0c, 0x1f, - 0x51, 0x59, 0x0c, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x39, - 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x39, 0x32, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, 0x15, 0x17, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x02, - 0x11, 0x10, 0x12, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, - 0x03, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x16, 0x33, 0x32, 0x01, 0x3b, - 0x26, 0x05, 0x2a, 0xbd, 0x63, 0xd6, 0xe9, 0xeb, 0xd6, 0xa6, 0xdd, 0x6c, - 0xf6, 0xfa, 0x5e, 0x98, 0x59, 0xb1, 0x8f, 0xa3, 0x79, 0x8b, 0x81, 0x81, - 0x8b, 0x8a, 0x80, 0x82, 0x8c, 0x01, 0xb5, 0x5c, 0x4e, 0x4e, 0x81, 0x29, - 0x73, 0x8f, 0xa0, 0x04, 0x2a, 0x83, 0x95, 0x74, 0x4b, 0x5d, 0xdf, 0xcc, - 0xcd, 0xe2, 0x96, 0x01, 0x3c, 0x01, 0x24, 0x01, 0x7b, 0x01, 0x6f, 0x3d, - 0x74, 0x51, 0x72, 0x85, 0xfd, 0xc6, 0x91, 0x9a, 0x9b, 0x90, 0x92, 0x96, - 0x99, 0x02, 0xa6, 0x36, 0x3d, 0x48, 0x48, 0x4f, 0x00, 0x02, 0x00, 0x09, - 0xff, 0xec, 0x04, 0x50, 0x05, 0xcc, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x5d, - 0x40, 0x32, 0x2c, 0x2a, 0x2a, 0x20, 0x01, 0x15, 0x0b, 0x31, 0x24, 0x19, - 0x07, 0x10, 0x07, 0x24, 0x0b, 0x01, 0x05, 0x35, 0x34, 0x12, 0x0d, 0x50, - 0x59, 0x01, 0x20, 0x2c, 0x20, 0x50, 0x59, 0x2a, 0x2c, 0x19, 0x12, 0x2c, - 0x12, 0x2c, 0x05, 0x27, 0x27, 0x2f, 0x51, 0x59, 0x27, 0x00, 0x05, 0x1c, - 0x50, 0x59, 0x05, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x39, 0x11, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x14, - 0x02, 0x06, 0x23, 0x20, 0x11, 0x34, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, - 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x12, 0x35, 0x26, 0x24, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x12, 0x13, 0x33, 0x07, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, - 0x16, 0x04, 0x50, 0x61, 0x85, 0xe9, 0x96, 0xfe, 0xd1, 0x18, 0x18, 0x3a, - 0x31, 0x60, 0x18, 0x6a, 0x4f, 0x5d, 0x68, 0x18, 0x19, 0x52, 0x46, 0x67, - 0x9e, 0x5e, 0xc7, 0xfe, 0xe1, 0x8a, 0xcc, 0xaa, 0xc4, 0xd0, 0x04, 0x61, - 0xff, 0x84, 0x76, 0xce, 0xed, 0x02, 0xf9, 0xde, 0xfe, 0x91, 0xc0, 0x01, - 0x0c, 0x31, 0x5d, 0x5d, 0x23, 0x3c, 0x31, 0x8d, 0x36, 0x63, 0x58, 0x32, - 0x5d, 0x5d, 0x32, 0x42, 0x49, 0x9d, 0x01, 0x3b, 0xb1, 0x03, 0x61, 0xac, - 0x76, 0x99, 0xb4, 0xfe, 0xd8, 0xfe, 0xe0, 0x01, 0xc9, 0xfe, 0xc9, 0x7b, - 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, 0x06, 0x09, - 0x05, 0x8d, 0x00, 0x14, 0x00, 0x2e, 0x40, 0x17, 0x10, 0x0f, 0x0c, 0x0d, - 0x03, 0x0d, 0x0f, 0x03, 0x15, 0x16, 0x0a, 0x11, 0x0d, 0x0f, 0x03, 0x0d, - 0x12, 0x00, 0x07, 0x5f, 0x59, 0x00, 0x04, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x3e, - 0x01, 0x05, 0x0d, 0x3c, 0x85, 0x3b, 0x54, 0x1a, 0x5e, 0x25, 0x24, 0x31, - 0x20, 0xfe, 0x72, 0xbe, 0xfd, 0xe2, 0xd6, 0x01, 0xac, 0x01, 0x54, 0x37, - 0x78, 0x05, 0x8d, 0x2d, 0x33, 0x88, 0x18, 0x2d, 0x1d, 0x30, 0xfd, 0xab, - 0xfd, 0xb8, 0x02, 0x48, 0x03, 0x39, 0xfd, 0x61, 0x02, 0x0e, 0x56, 0x47, - 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x85, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x83, 0x01, 0x7c, 0x00, 0x00, 0x11, 0x07, 0x03, 0x32, 0xff, 0x23, - 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x18, 0x03, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x39, 0x00, 0x00, 0x06, 0x09, 0x06, 0xb2, 0x12, 0x26, - 0x03, 0x83, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x01, 0x79, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1c, 0x1c, 0x05, 0x26, 0x02, 0x01, - 0x1a, 0xb8, 0xff, 0x9c, 0xb4, 0x1a, 0x18, 0x0f, 0x03, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x03, 0x00, 0x50, - 0xfe, 0x57, 0x04, 0x2b, 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x1d, - 0x00, 0x52, 0x40, 0x2d, 0x10, 0x0c, 0x14, 0x09, 0x0f, 0x0f, 0x1a, 0x06, - 0x00, 0x17, 0x04, 0x04, 0x00, 0x0c, 0x03, 0x1f, 0x1e, 0x0e, 0x14, 0x50, - 0x59, 0x0e, 0x15, 0x09, 0x13, 0x50, 0x59, 0x09, 0x0f, 0x07, 0x00, 0x06, - 0x1b, 0x50, 0x59, 0x06, 0x0f, 0x01, 0x1a, 0x50, 0x59, 0x01, 0x15, 0x00, - 0x1b, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x26, 0x02, 0x35, 0x10, 0x25, 0x11, 0x33, 0x11, 0x16, 0x12, - 0x11, 0x10, 0x05, 0x11, 0x13, 0x34, 0x26, 0x27, 0x11, 0x3e, 0x01, 0x25, - 0x14, 0x16, 0x17, 0x11, 0x0e, 0x01, 0x01, 0xe6, 0xc9, 0xcd, 0x01, 0x96, - 0xa4, 0xd4, 0xcd, 0xfe, 0x5f, 0xea, 0x70, 0x7a, 0x7a, 0x70, 0xfd, 0x93, - 0x6b, 0x74, 0x75, 0x6a, 0xfe, 0x57, 0x01, 0xa6, 0x19, 0x01, 0x13, 0xf5, - 0x01, 0xea, 0x34, 0x01, 0x90, 0xfe, 0x71, 0x14, 0xfe, 0xf8, 0xfe, 0xfd, - 0xfe, 0x0d, 0x2e, 0xfe, 0x5a, 0x03, 0xc7, 0xbd, 0xc6, 0x15, 0xfc, 0xce, - 0x18, 0xcb, 0xb7, 0xaf, 0xca, 0x1f, 0x03, 0x2b, 0x1d, 0xc9, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x52, 0xff, 0xec, 0x05, 0xed, 0x04, 0x3a, 0x00, 0x17, - 0x00, 0x2d, 0x00, 0x5b, 0x40, 0x2f, 0x03, 0x1b, 0x1b, 0x02, 0x06, 0x2b, - 0x0c, 0x28, 0x16, 0x22, 0x22, 0x17, 0x13, 0x13, 0x28, 0x06, 0x03, 0x2f, - 0x2e, 0x0d, 0x10, 0x00, 0x10, 0x25, 0x50, 0x59, 0x10, 0x16, 0x29, 0x29, - 0x03, 0x18, 0x09, 0x18, 0x50, 0x59, 0x09, 0x16, 0x03, 0x1f, 0x17, 0x00, - 0x17, 0x50, 0x59, 0x00, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, - 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x34, 0x36, 0x37, 0x23, 0x01, - 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x21, 0x0e, 0x01, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x52, 0x05, 0x9b, - 0x6c, 0x30, 0x39, 0xcf, 0xbe, 0x7e, 0x9d, 0x22, 0x04, 0x22, 0x9d, 0x7e, - 0xbe, 0xcf, 0x36, 0x33, 0x69, 0x03, 0xfa, 0x74, 0x74, 0x3e, 0x30, 0xfc, - 0xaf, 0x31, 0x3c, 0x74, 0x74, 0x66, 0x76, 0xa6, 0x76, 0x04, 0x3a, 0x8b, - 0x5d, 0xe8, 0x65, 0xff, 0x00, 0xfe, 0xe7, 0x81, 0x8a, 0x8a, 0x81, 0x01, - 0x19, 0x01, 0x00, 0x6a, 0xde, 0x62, 0xfc, 0xc8, 0xc0, 0xc9, 0x76, 0xf0, - 0x49, 0x4b, 0xf1, 0x73, 0xca, 0xbf, 0xad, 0x9d, 0x01, 0x60, 0xfe, 0xa0, - 0x9d, 0xad, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x57, 0x04, 0x9f, - 0x04, 0x3e, 0x00, 0x2d, 0x00, 0x4e, 0x40, 0x2b, 0x02, 0x09, 0x0e, 0x01, - 0x04, 0x2a, 0x13, 0x17, 0x26, 0x1c, 0x1c, 0x17, 0x21, 0x04, 0x09, 0x05, - 0x2e, 0x2f, 0x27, 0x19, 0x50, 0x59, 0x27, 0x16, 0x1e, 0x23, 0x53, 0x59, - 0x1e, 0x1b, 0x12, 0x00, 0x02, 0x13, 0x0f, 0x0b, 0x06, 0x53, 0x59, 0x0b, - 0x0f, 0x02, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, - 0x39, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x09, 0x01, 0x21, 0x12, 0x11, 0x34, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, - 0x32, 0x16, 0x15, 0x14, 0x02, 0x07, 0x17, 0x01, 0x21, 0x06, 0x02, 0x15, - 0x14, 0x33, 0x32, 0x37, 0x11, 0x10, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x36, 0x3d, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x12, 0x37, 0x03, 0x74, - 0xfd, 0xd9, 0xfe, 0xf7, 0xee, 0x77, 0x1d, 0x38, 0x22, 0x42, 0x4b, 0x7c, - 0x7a, 0x36, 0x24, 0x05, 0x02, 0x20, 0x01, 0x0d, 0x6f, 0x79, 0x77, 0x2a, - 0x32, 0xf0, 0x40, 0x43, 0x2b, 0x35, 0x37, 0x38, 0x63, 0x61, 0x35, 0x22, - 0x03, 0x1f, 0xfc, 0xe1, 0x01, 0x50, 0x01, 0x69, 0xe7, 0x0e, 0x99, 0x13, - 0x98, 0xb5, 0x75, 0xfe, 0xee, 0x49, 0x02, 0x03, 0x1b, 0x96, 0xfe, 0x8c, - 0xbf, 0xe7, 0x0d, 0xfe, 0xe8, 0xfe, 0xd8, 0x0c, 0xa1, 0x0d, 0x44, 0x51, - 0x64, 0x0e, 0x95, 0xa6, 0x8c, 0x01, 0x16, 0x42, 0x00, 0x02, 0x00, 0x61, - 0xfe, 0x57, 0x05, 0xd7, 0x05, 0x96, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x32, - 0x40, 0x1a, 0x10, 0x0b, 0x0f, 0x00, 0x16, 0x04, 0x04, 0x00, 0x0b, 0x03, - 0x1d, 0x1c, 0x07, 0x13, 0x5f, 0x59, 0x07, 0x04, 0x01, 0x19, 0x5f, 0x59, - 0x0e, 0x01, 0x13, 0x00, 0x00, 0x2f, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x24, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x04, - 0x12, 0x15, 0x10, 0x00, 0x05, 0x11, 0x01, 0x10, 0x00, 0x23, 0x22, 0x00, - 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x02, 0xbf, 0xfe, 0xe4, 0xfe, 0xbe, - 0x01, 0x72, 0x01, 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xfe, 0xbe, 0xfe, 0xe9, - 0x01, 0x96, 0xfe, 0xf9, 0xf0, 0xf2, 0xfe, 0xf8, 0x01, 0x0b, 0xed, 0xf4, - 0x01, 0x05, 0xfe, 0x57, 0x01, 0x9a, 0x1a, 0x01, 0x80, 0x01, 0x3c, 0x01, - 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, 0xde, 0xfe, 0xca, 0xfe, 0x7f, 0x1e, - 0xfe, 0x65, 0x04, 0x70, 0x01, 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, 0xf5, - 0xfe, 0xf7, 0xfe, 0xc9, 0x01, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x4e, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x33, - 0x40, 0x1b, 0x14, 0x04, 0x0d, 0x00, 0x0e, 0x09, 0x09, 0x00, 0x04, 0x03, - 0x1a, 0x1b, 0x06, 0x11, 0x50, 0x59, 0x06, 0x10, 0x01, 0x17, 0x51, 0x59, - 0x0c, 0x01, 0x16, 0x00, 0x1b, 0x00, 0x3f, 0x3f, 0x33, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x11, 0x26, 0x02, 0x11, 0x10, 0x21, 0x32, 0x12, - 0x11, 0x10, 0x02, 0x07, 0x11, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0xdc, 0xba, 0xcc, 0x01, 0xe5, 0xf8, - 0xea, 0xcc, 0xc1, 0xd0, 0x85, 0x9d, 0x9e, 0x8d, 0x8b, 0x95, 0xa2, 0x8b, - 0xfe, 0x57, 0x01, 0x9b, 0x19, 0x01, 0x12, 0x01, 0x01, 0x02, 0x30, 0xfe, - 0xef, 0xfe, 0xe1, 0xff, 0x00, 0xfe, 0xec, 0x18, 0xfe, 0x65, 0x03, 0xc7, - 0xe0, 0xcb, 0xcf, 0xdc, 0xd6, 0xd7, 0xd0, 0x00, 0x00, 0x01, 0x00, 0x72, - 0x00, 0x00, 0x05, 0x50, 0x05, 0x96, 0x00, 0x19, 0x00, 0x3a, 0x40, 0x1e, - 0x0d, 0x0c, 0x19, 0x00, 0x14, 0x05, 0x05, 0x00, 0x0c, 0x03, 0x1b, 0x1a, - 0x17, 0x01, 0x5f, 0x59, 0x17, 0x0d, 0x17, 0x0d, 0x00, 0x09, 0x09, 0x10, - 0x5f, 0x59, 0x09, 0x04, 0x00, 0x12, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x26, 0x24, - 0x26, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, - 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x04, 0x33, 0x37, 0x11, 0x02, 0xa8, - 0xaa, 0xfe, 0xff, 0x8b, 0xa5, 0x01, 0x25, 0xbe, 0xdb, 0x01, 0x23, 0x58, - 0xb0, 0x33, 0xdf, 0x93, 0x8d, 0xd0, 0x6f, 0x01, 0x0b, 0xf0, 0x3d, 0x01, - 0x1d, 0x0c, 0x95, 0xfb, 0x9a, 0x9d, 0x01, 0x0d, 0x99, 0xa9, 0xb7, 0x43, - 0x7e, 0x89, 0x6f, 0xc1, 0x76, 0xc9, 0xd7, 0x03, 0xfe, 0x49, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x5a, 0xfe, 0x57, 0x03, 0xce, 0x04, 0x4e, 0x00, 0x2c, - 0x00, 0x3b, 0x40, 0x1d, 0x0e, 0x00, 0x20, 0x26, 0x15, 0x15, 0x08, 0x20, - 0x08, 0x2e, 0x2d, 0x27, 0x00, 0x15, 0x23, 0x0b, 0x23, 0x2a, 0x50, 0x59, - 0x23, 0x1b, 0x0b, 0x12, 0x50, 0x59, 0x0f, 0x0b, 0x10, 0x00, 0x3f, 0x33, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x32, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, - 0x30, 0x05, 0x34, 0x2e, 0x01, 0x27, 0x2e, 0x02, 0x35, 0x10, 0x12, 0x33, - 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, - 0x03, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x02, 0xf0, 0x28, 0x50, 0x67, 0xa9, 0xb8, - 0x56, 0xed, 0xe6, 0xa7, 0xdd, 0x1d, 0xb9, 0x0e, 0x76, 0x69, 0x91, 0x84, - 0x18, 0x2c, 0x44, 0x5c, 0x7f, 0x39, 0x6d, 0x57, 0x35, 0xd3, 0xd8, 0x5d, - 0xa3, 0x32, 0x6e, 0x87, 0x44, 0x76, 0x76, 0x77, 0x29, 0x36, 0x25, 0x14, - 0x1e, 0x80, 0xd4, 0x97, 0x01, 0x0d, 0x01, 0x17, 0xac, 0x97, 0x0e, 0x5a, - 0x6a, 0xbd, 0xde, 0x4b, 0x6b, 0x4c, 0x33, 0x25, 0x1d, 0x0d, 0x1e, 0x3c, - 0x63, 0x52, 0x9a, 0xa2, 0x1d, 0x17, 0xa8, 0x2b, 0x1d, 0x4a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x91, 0x05, 0x81, 0x00, 0x0b, - 0x00, 0x3a, 0x40, 0x1d, 0x01, 0x07, 0x07, 0x08, 0x0b, 0x04, 0x03, 0x08, - 0x03, 0x0c, 0x0d, 0x01, 0x06, 0x5f, 0x59, 0x04, 0x01, 0x04, 0x01, 0x08, - 0x09, 0x09, 0x00, 0x5f, 0x59, 0x09, 0x03, 0x08, 0x12, 0x00, 0x3f, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, - 0x01, 0x67, 0x02, 0xbc, 0xb5, 0xfd, 0xf9, 0xbf, 0x03, 0xe9, 0x04, 0xe5, - 0xfe, 0x45, 0xfe, 0x91, 0xd1, 0xfd, 0x74, 0x05, 0x81, 0x9c, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x88, 0xfe, 0x58, 0x02, 0xeb, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x39, 0x40, 0x1c, 0x05, 0x00, 0x04, 0x02, 0x08, 0x08, 0x09, 0x04, - 0x09, 0x0d, 0x0c, 0x02, 0x07, 0x50, 0x59, 0x05, 0x02, 0x05, 0x02, 0x09, - 0x0a, 0x0a, 0x01, 0x50, 0x59, 0x0a, 0x0f, 0x09, 0x00, 0x2f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, - 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x21, 0x02, - 0xeb, 0xfe, 0x4c, 0x01, 0x82, 0x9e, 0xe4, 0xaf, 0x02, 0x63, 0x03, 0xaf, - 0xfe, 0xdf, 0xfe, 0xb2, 0xb9, 0xfc, 0x5f, 0x05, 0xe2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x01, 0xff, 0xed, 0x04, 0xf6, 0x05, 0xcd, 0x00, 0x2a, - 0x00, 0x4a, 0x40, 0x25, 0x26, 0x16, 0x19, 0x0e, 0x00, 0x03, 0x09, 0x03, - 0x19, 0x20, 0x04, 0x2b, 0x2c, 0x11, 0x2a, 0x29, 0x15, 0x2a, 0x15, 0x2a, - 0x15, 0x0b, 0x1f, 0x22, 0x22, 0x1d, 0x5f, 0x59, 0x22, 0x08, 0x0b, 0x0b, - 0x06, 0x5f, 0x59, 0x0b, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x06, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x37, 0x06, 0x07, - 0x06, 0x07, 0x27, 0x36, 0x12, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x02, 0x07, 0x01, 0x04, - 0x62, 0x25, 0x3f, 0x3f, 0x3b, 0x1f, 0x3b, 0x24, 0x40, 0x54, 0x82, 0x87, - 0x1f, 0x15, 0x85, 0xf0, 0xe4, 0x90, 0x1d, 0x20, 0x40, 0x14, 0x2d, 0x27, - 0x20, 0x3a, 0x24, 0x40, 0x54, 0x5a, 0x6b, 0x32, 0x1e, 0x12, 0x02, 0xe7, - 0x04, 0x4e, 0x94, 0xfe, 0x3d, 0x94, 0x64, 0x6d, 0x0f, 0xa0, 0x14, 0xa2, - 0xb1, 0x75, 0x01, 0x13, 0x65, 0x5e, 0x9c, 0x95, 0x66, 0x0b, 0x7d, 0x01, - 0xea, 0xad, 0x55, 0x4f, 0x2d, 0x0f, 0xa0, 0x14, 0x49, 0x8a, 0x80, 0x77, - 0xfe, 0xca, 0x57, 0x01, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, - 0x00, 0x00, 0x04, 0x0a, 0x05, 0x81, 0x00, 0x09, 0x00, 0x32, 0x40, 0x18, - 0x07, 0x06, 0x06, 0x08, 0x04, 0x02, 0x01, 0x01, 0x03, 0x00, 0x04, 0x00, - 0x0a, 0x0b, 0x08, 0x04, 0x50, 0x59, 0x08, 0x08, 0x02, 0x06, 0x02, 0x15, - 0x00, 0x3f, 0x2f, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x09, 0x01, 0x23, 0x13, 0x21, 0x35, 0x01, 0x33, 0x03, 0x21, 0x04, 0x0a, - 0xfe, 0xec, 0xc2, 0xe8, 0xfd, 0x16, 0x01, 0x14, 0xc2, 0xe8, 0x02, 0xea, - 0x02, 0xfc, 0xfd, 0x04, 0x02, 0x8c, 0x31, 0x02, 0xc4, 0xfd, 0xac, 0x00, - 0x00, 0x01, 0x00, 0x2e, 0xfe, 0x59, 0x05, 0xb6, 0x05, 0xcc, 0x00, 0x1e, - 0x00, 0x45, 0x40, 0x22, 0x11, 0x0c, 0x07, 0x07, 0x00, 0x18, 0x10, 0x04, - 0x0b, 0x00, 0x05, 0x20, 0x1f, 0x0a, 0x09, 0x08, 0x0c, 0x0f, 0x0e, 0x11, - 0x0c, 0x11, 0x03, 0x1b, 0x17, 0x17, 0x1b, 0x1b, 0x14, 0x60, 0x59, 0x1b, - 0x04, 0x03, 0x00, 0x2f, 0x33, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, - 0x10, 0x00, 0x05, 0x27, 0x24, 0x00, 0x11, 0x35, 0x27, 0x01, 0x27, 0x01, - 0x26, 0x27, 0x01, 0x27, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x04, 0x07, 0x27, - 0x36, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0xb6, 0xfe, 0x79, 0xfe, 0x4f, - 0x2e, 0x01, 0x50, 0x01, 0x63, 0x01, 0xfd, 0xb6, 0x42, 0x02, 0x7d, 0x18, - 0x38, 0xfd, 0x85, 0x42, 0x02, 0x71, 0x5a, 0xf4, 0x92, 0x8b, 0xfe, 0xfe, - 0x5a, 0x62, 0x81, 0x01, 0x2a, 0xc3, 0xde, 0x01, 0x68, 0xd4, 0x02, 0x08, - 0xfe, 0x7f, 0xfe, 0x3a, 0x68, 0x97, 0x3e, 0x01, 0x93, 0x01, 0x42, 0x12, - 0x11, 0xfe, 0xe3, 0x84, 0x01, 0x36, 0x8a, 0x75, 0xfe, 0xcb, 0x84, 0x01, - 0x30, 0x7b, 0x7e, 0x86, 0x78, 0x74, 0x97, 0x85, 0xfc, 0xfe, 0x39, 0x00, - 0x00, 0x01, 0x00, 0x63, 0xfe, 0x56, 0x04, 0x69, 0x05, 0xd4, 0x00, 0x14, - 0x00, 0x31, 0x40, 0x18, 0x0f, 0x0a, 0x05, 0x00, 0x00, 0x09, 0x0e, 0x11, - 0x04, 0x15, 0x16, 0x0d, 0x0c, 0x0f, 0x08, 0x07, 0x0a, 0x0f, 0x0a, 0x03, - 0x12, 0x00, 0x03, 0x1b, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x33, 0x31, 0x30, 0x25, 0x14, 0x03, 0x07, 0x12, 0x35, 0x34, 0x27, 0x05, - 0x27, 0x25, 0x26, 0x27, 0x05, 0x27, 0x25, 0x02, 0x25, 0x37, 0x04, 0x00, - 0x04, 0x69, 0x2e, 0xc2, 0x37, 0x2c, 0xfe, 0x9c, 0x46, 0x01, 0x7e, 0x2d, - 0x47, 0xfe, 0x84, 0x47, 0x01, 0x70, 0xd2, 0xfe, 0xa4, 0xac, 0x01, 0x9c, - 0x01, 0xbe, 0x6a, 0xdc, 0xfe, 0xfe, 0x36, 0x01, 0x1b, 0xea, 0xce, 0x92, - 0xad, 0x8f, 0xbb, 0x77, 0x71, 0xb9, 0x90, 0xb5, 0x01, 0x08, 0xab, 0x55, - 0xc4, 0xfd, 0x33, 0x00, 0x00, 0x01, 0x00, 0xa6, 0xfe, 0x58, 0x06, 0x7d, - 0x05, 0x81, 0x00, 0x2b, 0x00, 0x51, 0x40, 0x2a, 0x24, 0x21, 0x1c, 0x01, - 0x2a, 0x07, 0x14, 0x14, 0x0a, 0x0a, 0x2a, 0x0f, 0x21, 0x04, 0x2c, 0x2d, - 0x15, 0x1d, 0x1f, 0x2b, 0x08, 0x22, 0x03, 0x1f, 0x27, 0x60, 0x59, 0x1f, - 0x13, 0x0f, 0x10, 0x60, 0x59, 0x0f, 0x19, 0x40, 0x19, 0x04, 0x60, 0x59, - 0x19, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x0e, 0x01, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x3d, - 0x01, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x06, 0x23, 0x20, - 0x19, 0x01, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x03, - 0xf4, 0x5d, 0x73, 0x74, 0x88, 0xbd, 0x60, 0xd3, 0xaf, 0xfc, 0x13, 0x03, - 0xe6, 0xa1, 0x99, 0x04, 0x2a, 0x94, 0x7a, 0x7b, 0xa1, 0x25, 0x03, 0x5e, - 0xed, 0xfe, 0xa3, 0xbd, 0x5b, 0x74, 0x77, 0x8e, 0x05, 0x81, 0xfc, 0x0d, - 0x99, 0x7c, 0xb2, 0x9e, 0x03, 0xb8, 0xfa, 0xdd, 0xc4, 0xdb, 0x67, 0x93, - 0xa3, 0xb4, 0x59, 0x58, 0x57, 0x56, 0x63, 0xb9, 0x01, 0x7d, 0x04, 0x18, - 0xfc, 0x0d, 0x97, 0x7e, 0xb2, 0x9e, 0x03, 0xb8, 0x00, 0x01, 0x00, 0x84, - 0xfe, 0x58, 0x06, 0x1d, 0x04, 0x3a, 0x00, 0x2d, 0x00, 0x4f, 0x40, 0x29, - 0x26, 0x23, 0x1c, 0x01, 0x2c, 0x07, 0x15, 0x15, 0x0a, 0x0a, 0x2c, 0x23, - 0x0f, 0x04, 0x2e, 0x2f, 0x1d, 0x16, 0x20, 0x2d, 0x08, 0x24, 0x0f, 0x0f, - 0x10, 0x50, 0x59, 0x0f, 0x20, 0x20, 0x29, 0x50, 0x59, 0x20, 0x16, 0x19, - 0x04, 0x50, 0x59, 0x19, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x10, 0xc4, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x01, 0x23, 0x21, 0x35, 0x21, 0x32, - 0x36, 0x3f, 0x01, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x35, 0x11, 0x03, 0xab, 0x56, 0x70, 0x73, 0x86, 0xb3, 0x61, 0xd3, - 0xae, 0xfc, 0x49, 0x03, 0xc0, 0x9a, 0x96, 0x04, 0x04, 0x04, 0x38, 0x9e, - 0x70, 0x7b, 0x8f, 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, 0xb2, 0x56, - 0x70, 0x76, 0x83, 0x04, 0x3a, 0xfd, 0x52, 0x9d, 0x78, 0xb0, 0xa0, 0x02, - 0x73, 0xfc, 0x32, 0xc6, 0xe2, 0x6c, 0x8b, 0x9f, 0xaa, 0x8d, 0x6d, 0x60, - 0x62, 0x6b, 0x6d, 0x60, 0xb2, 0xcb, 0x02, 0xd1, 0xfd, 0x52, 0x9d, 0x78, - 0xaf, 0xa1, 0x02, 0x73, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x04, 0xbf, - 0x05, 0x96, 0x00, 0x1b, 0x00, 0x37, 0x40, 0x1c, 0x0b, 0x0f, 0x0f, 0x1b, - 0x0e, 0x05, 0x15, 0x0e, 0x15, 0x1d, 0x1c, 0x18, 0x02, 0x5f, 0x59, 0x18, - 0x04, 0x08, 0x12, 0x5f, 0x59, 0x08, 0x08, 0x0c, 0x0f, 0x12, 0x0c, 0x03, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x32, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x23, 0x22, 0x00, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0xad, 0x48, 0x55, 0x77, 0x77, 0xad, - 0xa2, 0x5e, 0xe9, 0x49, 0xbe, 0xbe, 0xdd, 0xb6, 0xf6, 0xfe, 0xec, 0xd9, - 0xd1, 0x54, 0x78, 0x33, 0x04, 0xc8, 0x34, 0xa8, 0xa0, 0xa4, 0xb4, 0x36, - 0x24, 0x02, 0xcc, 0xfa, 0x7e, 0x02, 0x15, 0x53, 0x01, 0x04, 0xe8, 0xee, - 0xfa, 0x27, 0x26, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xd8, 0x00, 0x1c, 0x00, 0x45, 0x40, 0x26, 0x12, 0x07, 0x19, 0x00, - 0x00, 0x1c, 0x1c, 0x0d, 0x07, 0x03, 0x1d, 0x1e, 0x16, 0x04, 0x50, 0x59, - 0x01, 0x1a, 0x0f, 0x16, 0x1f, 0x16, 0x02, 0x09, 0x03, 0x16, 0x16, 0x00, - 0x1a, 0x00, 0x0a, 0x0f, 0x53, 0x59, 0x0a, 0x01, 0x00, 0x15, 0x00, 0x3f, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x12, - 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, - 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, 0x11, 0x14, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x03, 0x39, 0x33, 0xa5, - 0x7c, 0xb0, 0xa7, 0x01, 0x19, 0x33, 0x55, 0x3a, 0x3d, 0x75, 0x2a, 0x60, - 0x55, 0x7f, 0x99, 0xb4, 0x02, 0x29, 0x5b, 0x50, 0xaf, 0xce, 0x01, 0xb5, - 0x01, 0x28, 0x10, 0xa7, 0x15, 0x94, 0xfe, 0x7c, 0x72, 0x6f, 0x34, 0xb0, - 0x95, 0x02, 0x7e, 0xfa, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, - 0xfe, 0x58, 0x04, 0xff, 0x05, 0x82, 0x00, 0x1f, 0x00, 0x38, 0x40, 0x1c, - 0x12, 0x0e, 0x0e, 0x1f, 0x0f, 0x07, 0x18, 0x0f, 0x18, 0x20, 0x21, 0x15, - 0x0a, 0x5f, 0x59, 0x12, 0x15, 0x15, 0x0f, 0x10, 0x03, 0x1f, 0x00, 0x5f, - 0x59, 0x1f, 0x0f, 0x12, 0x00, 0x3f, 0xc6, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x2f, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x32, 0x3e, 0x03, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, - 0x36, 0x33, 0x20, 0x00, 0x11, 0x14, 0x0e, 0x03, 0x23, 0x21, 0xa4, 0x01, - 0x2e, 0xb8, 0xab, 0x81, 0x5a, 0x31, 0xbc, 0xb3, 0x55, 0xc4, 0x57, 0xbe, - 0xbe, 0x46, 0x91, 0xa0, 0x01, 0x02, 0x01, 0x24, 0x37, 0x6a, 0xa7, 0xf2, - 0xc8, 0xfe, 0xa7, 0xfe, 0xed, 0x22, 0x4d, 0x87, 0xd0, 0x92, 0xdb, 0xea, - 0x30, 0x2a, 0xfd, 0x50, 0x05, 0x82, 0xfd, 0xcb, 0x1d, 0x3a, 0xfe, 0xc1, - 0xfe, 0xe6, 0x9b, 0xf1, 0xb0, 0x79, 0x3e, 0x00, 0x00, 0x02, 0x00, 0x0a, - 0xff, 0xec, 0x03, 0xe5, 0x04, 0x96, 0x00, 0x27, 0x00, 0x32, 0x00, 0x5d, - 0x40, 0x33, 0x2c, 0x15, 0x07, 0x02, 0x20, 0x31, 0x04, 0x24, 0x1e, 0x05, - 0x09, 0x24, 0x09, 0x33, 0x34, 0x15, 0x15, 0x20, 0x31, 0x07, 0x02, 0x04, - 0x00, 0x22, 0x2f, 0x22, 0x50, 0x59, 0x18, 0x12, 0x50, 0x59, 0x2f, 0x18, - 0x2f, 0x18, 0x00, 0x0d, 0x0d, 0x1c, 0x50, 0x59, 0x0d, 0x16, 0x00, 0x28, - 0x50, 0x59, 0x04, 0x00, 0x10, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x2b, 0x11, - 0x12, 0x00, 0x17, 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x12, 0x17, 0x39, 0x32, 0x32, 0x31, 0x30, 0x01, 0x32, 0x17, - 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, - 0x2e, 0x02, 0x23, 0x22, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x33, 0x20, 0x11, 0x34, 0x27, 0x06, 0x23, 0x20, 0x35, 0x34, 0x3e, 0x01, - 0x17, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x01, - 0xf9, 0xa9, 0x70, 0x34, 0x23, 0x7c, 0x48, 0x25, 0x63, 0x72, 0xc9, 0x85, - 0x43, 0x5f, 0x48, 0x37, 0x1b, 0x3d, 0x98, 0x6d, 0x54, 0x4f, 0x57, 0x56, - 0x4f, 0x01, 0x09, 0x22, 0xbf, 0xc6, 0xfe, 0xf5, 0x62, 0xaf, 0x84, 0x53, - 0x71, 0x3d, 0x40, 0x3c, 0xa1, 0x95, 0x44, 0x04, 0x4e, 0x4f, 0x4e, 0x49, - 0x5c, 0x74, 0x32, 0x90, 0xe8, 0xb4, 0xfb, 0x81, 0x1e, 0x23, 0x1e, 0x4b, - 0x69, 0x76, 0x32, 0x32, 0x01, 0x9d, 0x82, 0x66, 0xc4, 0xe5, 0x5a, 0x8d, - 0x46, 0x86, 0x2a, 0x44, 0x29, 0x39, 0x32, 0xba, 0x48, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x6e, 0xff, 0xec, 0x05, 0x09, 0x05, 0x96, 0x00, 0x32, - 0x00, 0x49, 0x40, 0x25, 0x22, 0x00, 0x11, 0x12, 0x0b, 0x18, 0x28, 0x2d, - 0x2d, 0x18, 0x12, 0x00, 0x04, 0x33, 0x34, 0x22, 0x0b, 0x30, 0x15, 0x2b, - 0x2b, 0x30, 0x30, 0x25, 0x5f, 0x59, 0x30, 0x13, 0x11, 0x11, 0x15, 0x15, - 0x0e, 0x60, 0x59, 0x15, 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x03, 0x37, 0x3e, 0x03, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x24, 0x21, 0x32, 0x04, 0x15, - 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x04, 0x21, 0x20, 0x24, 0x6e, - 0x2b, 0x4e, 0x6c, 0x83, 0xae, 0x4f, 0x8f, 0x6c, 0x3f, 0xac, 0xa0, 0xa5, - 0xb4, 0x1d, 0xbc, 0x30, 0x01, 0x02, 0x01, 0x01, 0xf7, 0x01, 0x0e, 0x35, - 0x63, 0xad, 0xa8, 0x60, 0x9e, 0x72, 0x3f, 0xc7, 0xbb, 0xce, 0xd4, 0x35, - 0xac, 0x43, 0xfe, 0xbe, 0xfe, 0xed, 0xfe, 0xeb, 0xfe, 0xcf, 0x01, 0x85, - 0x4d, 0x73, 0x54, 0x3d, 0x2d, 0x28, 0x12, 0x24, 0x36, 0x51, 0x3f, 0x6e, - 0x71, 0x65, 0x70, 0x21, 0xad, 0x97, 0xc6, 0xb3, 0x4e, 0x7a, 0x5b, 0x4b, - 0x25, 0x16, 0x26, 0x38, 0x56, 0x45, 0x7a, 0x80, 0x8a, 0x89, 0x59, 0x68, - 0x36, 0x7a, 0x75, 0xc5, 0xeb, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6e, - 0xff, 0xec, 0x04, 0xc7, 0x05, 0x96, 0x00, 0x2c, 0x00, 0x45, 0x40, 0x23, - 0x10, 0x1c, 0x15, 0x16, 0x26, 0x05, 0x05, 0x16, 0x00, 0x1c, 0x04, 0x2e, - 0x2d, 0x10, 0x26, 0x19, 0x02, 0x15, 0x15, 0x19, 0x19, 0x12, 0x50, 0x59, - 0x19, 0x00, 0x2c, 0x2c, 0x02, 0x02, 0x29, 0x50, 0x59, 0x02, 0x16, 0x00, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x06, 0x21, 0x20, 0x24, - 0x35, 0x34, 0x3e, 0x03, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x21, 0x22, 0x06, - 0x07, 0x27, 0x36, 0x24, 0x33, 0x20, 0x04, 0x15, 0x14, 0x0e, 0x02, 0x07, - 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0xc2, 0xe0, - 0xfe, 0xe0, 0xfe, 0xe5, 0xfe, 0xc7, 0x2b, 0x4e, 0x6c, 0x83, 0xae, 0x4f, - 0x8f, 0x6c, 0x3f, 0xfe, 0xad, 0x9f, 0xb4, 0x1c, 0xbc, 0x2f, 0x01, 0x06, - 0xf9, 0x01, 0x00, 0x01, 0x0a, 0x35, 0x63, 0xad, 0xa8, 0x60, 0x9e, 0x72, - 0x3f, 0xda, 0xbd, 0x85, 0xe7, 0x87, 0x2b, 0x3f, 0xdb, 0xbe, 0x4d, 0x73, - 0x54, 0x3d, 0x2d, 0x28, 0x12, 0x24, 0x36, 0x51, 0x3f, 0xdf, 0x69, 0x6c, - 0x21, 0xaa, 0x9a, 0xc3, 0xb6, 0x4e, 0x7a, 0x5b, 0x4b, 0x25, 0x16, 0x26, - 0x38, 0x56, 0x45, 0x79, 0x81, 0x1d, 0x28, 0x00, 0x00, 0x02, 0x00, 0x07, - 0x00, 0x00, 0x04, 0xd6, 0x05, 0x96, 0x00, 0x22, 0x00, 0x25, 0x00, 0x56, - 0x40, 0x30, 0x0b, 0x25, 0x1f, 0x10, 0x04, 0x23, 0x24, 0x24, 0x0d, 0x23, - 0x0e, 0x18, 0x0e, 0x0d, 0x03, 0x04, 0x27, 0x26, 0x25, 0x0b, 0x10, 0x1f, - 0x04, 0x0d, 0x17, 0x1b, 0x1b, 0x14, 0x5f, 0x59, 0x1b, 0x04, 0x0f, 0x0c, - 0x24, 0x0d, 0x24, 0x5f, 0x59, 0x0d, 0x12, 0x00, 0x07, 0x5f, 0x59, 0x04, - 0x00, 0x04, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x17, 0x39, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, - 0x31, 0x30, 0x01, 0x32, 0x16, 0x17, 0x07, 0x27, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x03, 0x01, 0x15, 0x21, 0x35, 0x01, 0x03, 0x2e, 0x01, 0x23, 0x22, - 0x0f, 0x01, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x37, 0x3e, - 0x01, 0x01, 0x21, 0x03, 0x03, 0xac, 0x4c, 0x9e, 0x40, 0x66, 0x22, 0x46, - 0x41, 0x29, 0x31, 0x14, 0x7c, 0x01, 0x3b, 0xfc, 0xb2, 0x01, 0x36, 0x7c, - 0x13, 0x32, 0x29, 0x41, 0x45, 0x23, 0x66, 0x40, 0x9e, 0x4c, 0x5f, 0x74, - 0x28, 0x43, 0x42, 0x25, 0x74, 0xfe, 0x3e, 0x01, 0xd6, 0xee, 0x05, 0x96, - 0x65, 0x6c, 0x6e, 0x33, 0x66, 0x26, 0x2e, 0xfe, 0xd6, 0xfd, 0x1f, 0x91, - 0x91, 0x02, 0xe1, 0x01, 0x2a, 0x2e, 0x26, 0x66, 0x33, 0x6e, 0x6c, 0x65, - 0x5d, 0x71, 0xc0, 0xc0, 0x6d, 0x61, 0xfb, 0x0b, 0x02, 0x48, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x04, 0xad, 0x04, 0x41, 0x00, 0x02, - 0x00, 0x23, 0x00, 0x4f, 0x40, 0x2d, 0x01, 0x10, 0x02, 0x0f, 0x06, 0x0f, - 0x0d, 0x00, 0x21, 0x12, 0x10, 0x1a, 0x08, 0x24, 0x25, 0x00, 0x12, 0x0d, - 0x21, 0x04, 0x10, 0x19, 0x1d, 0x1d, 0x16, 0x50, 0x59, 0x1d, 0x0f, 0x11, - 0x0e, 0x01, 0x10, 0x01, 0x50, 0x59, 0x10, 0x15, 0x03, 0x0a, 0x50, 0x59, - 0x07, 0x03, 0x0f, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x17, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x03, 0x33, 0x13, 0x32, 0x16, 0x17, 0x07, 0x27, 0x26, 0x23, 0x22, 0x07, - 0x03, 0x13, 0x15, 0x21, 0x35, 0x13, 0x03, 0x2e, 0x01, 0x23, 0x22, 0x0f, - 0x01, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x37, 0x36, 0x02, - 0x63, 0x6d, 0xdd, 0xc6, 0x4c, 0x90, 0x38, 0x68, 0x21, 0x42, 0x3c, 0x4c, - 0x25, 0x79, 0xa9, 0xfd, 0xfb, 0xa7, 0x7a, 0x15, 0x38, 0x23, 0x3c, 0x41, - 0x22, 0x68, 0x38, 0x90, 0x4c, 0x62, 0x79, 0x24, 0x38, 0x39, 0x4a, 0x01, - 0x94, 0xfe, 0xfd, 0x03, 0xb0, 0x60, 0x5c, 0x6f, 0x33, 0x62, 0x5e, 0xfe, - 0xd1, 0xfe, 0x6d, 0x8b, 0x8b, 0x01, 0x92, 0x01, 0x33, 0x35, 0x26, 0x62, - 0x33, 0x6f, 0x5c, 0x60, 0x76, 0x6d, 0xab, 0xab, 0xe3, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x61, 0xff, 0xec, 0x05, 0x7f, 0x05, 0x81, 0x00, 0x15, - 0x00, 0x21, 0x00, 0x4b, 0x40, 0x28, 0x11, 0x1c, 0x1c, 0x06, 0x0c, 0x16, - 0x16, 0x00, 0x06, 0x00, 0x22, 0x23, 0x13, 0x19, 0x60, 0x59, 0x11, 0x00, - 0x13, 0x10, 0x13, 0x02, 0x09, 0x03, 0x13, 0x13, 0x03, 0x0a, 0x0a, 0x0d, - 0x5f, 0x59, 0x0a, 0x03, 0x03, 0x1f, 0x60, 0x59, 0x03, 0x13, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x00, 0x21, 0x20, - 0x00, 0x11, 0x10, 0x12, 0x24, 0x29, 0x01, 0x15, 0x21, 0x22, 0x0e, 0x01, - 0x07, 0x36, 0x21, 0x20, 0x00, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x05, 0x7f, 0xfe, 0xa5, 0xfe, 0xcb, 0xfe, - 0xba, 0xfe, 0xb8, 0x8e, 0x01, 0x2f, 0x01, 0x1a, 0x01, 0x8b, 0xfe, 0x7c, - 0xb3, 0xc0, 0x7a, 0x18, 0xa2, 0x01, 0x15, 0x01, 0x3f, 0x01, 0x4f, 0xbe, - 0xe3, 0xed, 0xf1, 0xe2, 0xe9, 0xe8, 0xed, 0xe5, 0x02, 0x2c, 0xfe, 0xee, - 0xfe, 0xd2, 0x01, 0x47, 0x01, 0x3c, 0x01, 0x14, 0x01, 0x5a, 0xa4, 0x95, - 0x3b, 0x7f, 0x6c, 0x88, 0xfe, 0xeb, 0xfe, 0xf3, 0xd1, 0xc8, 0xc4, 0xd5, - 0xd8, 0xe1, 0xdb, 0x00, 0x00, 0x01, 0x00, 0x49, 0xff, 0xec, 0x04, 0x2a, - 0x04, 0x4e, 0x00, 0x22, 0x00, 0x3d, 0x40, 0x1f, 0x1d, 0x11, 0x11, 0x06, - 0x17, 0x0c, 0x00, 0x06, 0x00, 0x23, 0x24, 0x20, 0x1a, 0x50, 0x59, 0x20, - 0x20, 0x03, 0x09, 0x09, 0x0d, 0x50, 0x59, 0x09, 0x10, 0x03, 0x14, 0x50, - 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x00, 0x25, 0x36, 0x33, 0x15, 0x05, 0x0e, 0x02, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0f, 0x01, - 0x35, 0x36, 0x33, 0x32, 0x16, 0x04, 0x2a, 0xfe, 0xf4, 0xea, 0xee, 0xfd, - 0x01, 0x37, 0x01, 0x41, 0x9b, 0x7d, 0xfe, 0xda, 0xc1, 0xa6, 0x4a, 0x9d, - 0xa0, 0x9c, 0x9e, 0x86, 0xa7, 0x48, 0x3b, 0x2f, 0x73, 0x65, 0xe1, 0xd7, - 0x01, 0x7a, 0xb8, 0xd6, 0x01, 0x24, 0x01, 0x16, 0x01, 0x0a, 0x01, 0x0f, - 0x0a, 0x05, 0x96, 0x07, 0x08, 0x50, 0xae, 0x9e, 0xc9, 0xd4, 0x8c, 0x80, - 0x76, 0x6f, 0x0b, 0x08, 0x86, 0x17, 0xb9, 0x00, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x03, 0xa2, 0x05, 0x82, 0x00, 0x1b, 0x00, 0x44, 0x40, 0x22, - 0x05, 0x00, 0x19, 0x09, 0x09, 0x16, 0x0a, 0x0e, 0x13, 0x13, 0x0a, 0x00, - 0x03, 0x1d, 0x1c, 0x02, 0x11, 0x08, 0x0c, 0x15, 0x0c, 0x5f, 0x59, 0x19, - 0x15, 0x11, 0x15, 0x11, 0x15, 0x0a, 0x17, 0x03, 0x0a, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x07, 0x27, 0x36, 0x35, - 0x34, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x22, 0x15, 0x14, 0x17, 0x07, - 0x26, 0x35, 0x10, 0x21, 0x33, 0x35, 0x33, 0x15, 0x33, 0x20, 0x03, 0xa2, - 0x13, 0x93, 0x0e, 0x9a, 0x36, 0xbf, 0x36, 0x99, 0x0e, 0x93, 0x13, 0x01, - 0x39, 0x2e, 0xbf, 0x30, 0x01, 0x38, 0x03, 0x78, 0x42, 0x41, 0x1f, 0x38, - 0x1d, 0x82, 0xfc, 0x15, 0x03, 0xeb, 0x82, 0x1d, 0x38, 0x1f, 0x41, 0x42, - 0x01, 0x10, 0xfa, 0xfa, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf1, 0x03, 0x1f, - 0x05, 0xd8, 0x00, 0x11, 0x00, 0x30, 0x40, 0x18, 0x10, 0x0b, 0x0b, 0x02, - 0x05, 0x0a, 0x05, 0x11, 0x03, 0x13, 0x12, 0x0c, 0x01, 0x01, 0x07, 0x0a, - 0x07, 0x50, 0x59, 0x10, 0x0a, 0x0f, 0x02, 0x16, 0x00, 0x3f, 0x3f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x25, 0x35, 0x33, - 0x11, 0x23, 0x07, 0x23, 0x11, 0x21, 0x11, 0x05, 0x15, 0x23, 0x11, 0x21, - 0x03, 0x1f, 0xfe, 0xdf, 0xfe, 0xed, 0x65, 0xc6, 0x4a, 0x18, 0x01, 0x28, - 0x01, 0x13, 0x65, 0x01, 0x21, 0x03, 0xae, 0xfc, 0x43, 0x64, 0x1c, 0x03, - 0x3d, 0x94, 0x01, 0x20, 0x01, 0x9e, 0x64, 0x1b, 0xfe, 0xe1, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x44, 0xff, 0xec, 0x04, 0xa5, 0x04, 0x3e, 0x00, 0x24, - 0x00, 0x3c, 0x40, 0x21, 0x0e, 0x01, 0x04, 0x21, 0x13, 0x17, 0x1c, 0x17, - 0x04, 0x09, 0x02, 0x05, 0x25, 0x26, 0x1e, 0x19, 0x53, 0x59, 0x1e, 0x16, - 0x12, 0x00, 0x02, 0x13, 0x0f, 0x0b, 0x06, 0x53, 0x59, 0x0b, 0x0f, 0x02, - 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x09, 0x01, 0x21, 0x12, 0x11, 0x34, 0x23, 0x22, 0x07, 0x27, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x02, 0x07, 0x17, 0x01, 0x21, 0x06, - 0x02, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x12, 0x37, 0x03, 0x74, 0xfd, 0xd9, 0xfe, 0xf7, 0xee, 0x77, 0x1d, - 0x38, 0x22, 0x42, 0x4b, 0x7c, 0x7a, 0x36, 0x24, 0x05, 0x02, 0x20, 0x01, - 0x0d, 0x6f, 0x79, 0x77, 0x1d, 0x38, 0x22, 0x42, 0x4b, 0x7c, 0x7a, 0x35, - 0x22, 0x03, 0x1f, 0xfc, 0xe1, 0x01, 0x50, 0x01, 0x69, 0xe7, 0x0e, 0x99, - 0x13, 0x98, 0xb5, 0x75, 0xfe, 0xee, 0x49, 0x02, 0x03, 0x1b, 0x96, 0xfe, - 0x8c, 0xbf, 0xe7, 0x0e, 0x99, 0x13, 0x98, 0xb5, 0x8c, 0x01, 0x16, 0x42, - 0x00, 0x02, 0x00, 0x62, 0xfe, 0x57, 0x04, 0x44, 0x04, 0x4e, 0x00, 0x1f, - 0x00, 0x2c, 0x00, 0x40, 0x40, 0x21, 0x20, 0x15, 0x0d, 0x27, 0x00, 0x08, - 0x08, 0x00, 0x2e, 0x2d, 0x1a, 0x11, 0x50, 0x59, 0x1a, 0x1a, 0x16, 0x1b, - 0x0d, 0x0b, 0x05, 0x0b, 0x2a, 0x50, 0x59, 0x0b, 0x15, 0x05, 0x24, 0x50, - 0x59, 0x05, 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x3f, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x12, 0x39, 0x39, 0x33, 0x33, 0x31, 0x30, 0x13, 0x34, 0x12, 0x3e, - 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x27, 0x1e, 0x02, - 0x33, 0x32, 0x1e, 0x01, 0x17, 0x23, 0x2e, 0x02, 0x23, 0x22, 0x2e, 0x03, - 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x62, 0x36, 0x77, 0xc1, 0x88, 0xfd, 0xef, 0xfd, 0xf5, 0xe4, 0x7a, - 0x06, 0x60, 0xb5, 0xb4, 0x9b, 0x89, 0x42, 0x07, 0x9f, 0x06, 0x24, 0x4f, - 0x94, 0x88, 0xbb, 0x7b, 0x45, 0x1f, 0x03, 0x25, 0x3f, 0x7d, 0x70, 0xa4, - 0x91, 0x90, 0x9a, 0xa8, 0x8f, 0x01, 0x61, 0xf1, 0x01, 0x08, 0xa3, 0x51, - 0xfe, 0xf2, 0xfe, 0xe8, 0xfe, 0xec, 0xfe, 0xec, 0x97, 0x86, 0x9f, 0x48, - 0x24, 0x56, 0x59, 0x16, 0x16, 0x09, 0x3d, 0x6c, 0x9d, 0xc4, 0x01, 0x92, - 0x94, 0xb8, 0x55, 0xcd, 0xd4, 0xd2, 0xd1, 0xca, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x04, 0x4e, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xce, 0xfe, 0x57, 0x01, 0x3d, 0x05, 0xcc, 0x12, 0x06, - 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x05, 0x96, 0x12, 0x06, 0x04, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x03, 0x39, 0x04, 0x3a, 0x00, 0x13, 0x00, 0x47, 0x40, 0x25, - 0x09, 0x00, 0x0d, 0x10, 0x10, 0x0f, 0x04, 0x00, 0x00, 0x04, 0x15, 0x14, - 0x0d, 0x10, 0x50, 0x59, 0x0f, 0x0d, 0x01, 0x0b, 0x03, 0x0d, 0x0d, 0x01, - 0x07, 0x07, 0x0a, 0x50, 0x59, 0x07, 0x0f, 0x01, 0x12, 0x50, 0x59, 0x01, - 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x12, 0x39, 0x32, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x22, - 0x02, 0x11, 0x10, 0x00, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x21, - 0x15, 0x21, 0x10, 0x29, 0x01, 0x03, 0x39, 0xfe, 0xe9, 0xe5, 0xed, 0x00, - 0xff, 0xe4, 0x01, 0x06, 0xfe, 0xf2, 0x8b, 0x97, 0x01, 0x77, 0xfe, 0x89, - 0x01, 0x23, 0x01, 0x0d, 0x01, 0x0f, 0x01, 0x04, 0x01, 0x00, 0x01, 0x27, - 0x8c, 0xae, 0x9b, 0x84, 0xfe, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x03, 0x39, 0x04, 0x3a, 0x00, 0x13, 0x00, 0x45, 0x40, 0x25, - 0x06, 0x03, 0x03, 0x0f, 0x0a, 0x00, 0x00, 0x04, 0x0f, 0x03, 0x15, 0x14, - 0x05, 0x04, 0x50, 0x59, 0x0f, 0x05, 0x01, 0x0b, 0x03, 0x05, 0x05, 0x13, - 0x0b, 0x13, 0x00, 0x50, 0x59, 0x13, 0x15, 0x0b, 0x0a, 0x50, 0x59, 0x0b, - 0x0f, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x21, 0x20, 0x11, 0x21, - 0x35, 0x21, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x00, 0x11, 0x10, - 0x02, 0x23, 0x21, 0x50, 0x01, 0x0d, 0x01, 0x23, 0xfe, 0x89, 0x01, 0x77, - 0x96, 0x8c, 0xfe, 0xf2, 0x01, 0x06, 0xe3, 0x01, 0x00, 0xec, 0xe6, 0xfe, - 0xe9, 0x8c, 0x01, 0x55, 0x84, 0x9c, 0xad, 0x8c, 0xfe, 0xd9, 0xff, 0x00, - 0xfe, 0xfd, 0xfe, 0xf0, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, - 0x05, 0x81, 0x12, 0x06, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8a, - 0xfe, 0x57, 0x04, 0x1d, 0x05, 0xcc, 0x12, 0x06, 0x00, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x05, 0x79, 0x05, 0x96, 0x12, 0x06, - 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x02, - 0x05, 0x81, 0x00, 0x0c, 0x00, 0x39, 0x40, 0x1c, 0x08, 0x05, 0x05, 0x06, - 0x0a, 0x00, 0x00, 0x0c, 0x0c, 0x09, 0x06, 0x03, 0x0d, 0x0e, 0x0b, 0x03, - 0x09, 0x04, 0x01, 0x07, 0x03, 0x03, 0x06, 0x07, 0x03, 0x00, 0x06, 0x12, - 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x33, 0x3f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x21, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, - 0x09, 0x01, 0x33, 0x11, 0x05, 0x56, 0xfe, 0x45, 0x86, 0xfe, 0x3d, 0xaa, - 0xfb, 0x01, 0xb6, 0x01, 0xb4, 0xf5, 0x04, 0xd8, 0xfd, 0x94, 0x02, 0x6c, - 0xfb, 0x28, 0x05, 0x81, 0xfd, 0xab, 0x02, 0x55, 0xfa, 0x7f, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x57, 0x04, 0xf3, 0x04, 0x3a, 0x00, 0x14, - 0x00, 0x35, 0x40, 0x1b, 0x08, 0x05, 0x05, 0x06, 0x0e, 0x11, 0x11, 0x10, - 0x06, 0x10, 0x15, 0x16, 0x14, 0x02, 0x0b, 0x03, 0x0e, 0x11, 0x15, 0x0e, - 0x0f, 0x07, 0x0f, 0x06, 0x1b, 0x01, 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, - 0x3f, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x16, 0x15, - 0x11, 0x23, 0x11, 0x21, 0x13, 0x16, 0x17, 0x36, 0x37, 0x13, 0x21, 0x11, - 0x23, 0x11, 0x3f, 0x01, 0x03, 0x13, 0x99, 0xfe, 0xbc, 0x06, 0xae, 0x01, - 0x18, 0xdc, 0x34, 0x10, 0x16, 0x2e, 0xdc, 0x01, 0x0d, 0xad, 0x03, 0x05, - 0x03, 0xb7, 0x9c, 0x47, 0xfb, 0x83, 0x05, 0xe3, 0xfd, 0x6b, 0x8f, 0x8f, - 0xa1, 0x7d, 0x02, 0x95, 0xfb, 0xc6, 0x02, 0xd4, 0x72, 0x73, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x0a, 0xfe, 0x57, 0x04, 0x3b, 0x04, 0x4f, 0x00, 0x1a, - 0x00, 0x26, 0x00, 0x51, 0x40, 0x29, 0x20, 0x14, 0x14, 0x0f, 0x0a, 0x0e, - 0x0e, 0x12, 0x0f, 0x1b, 0x00, 0x00, 0x0c, 0x0f, 0x03, 0x27, 0x28, 0x06, - 0x17, 0x03, 0x17, 0x1e, 0x50, 0x59, 0x17, 0x10, 0x10, 0x13, 0x13, 0x0d, - 0x40, 0x0a, 0x0a, 0x03, 0x0e, 0x03, 0x24, 0x50, 0x59, 0x03, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x2f, 0x12, 0x39, 0x2f, 0x1a, 0xcd, 0x33, 0x2f, - 0xcd, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x23, 0x16, 0x1d, 0x01, - 0x21, 0x15, 0x21, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x11, 0x34, 0x12, - 0x33, 0x32, 0x16, 0x12, 0x07, 0x34, 0x26, 0x23, 0x20, 0x19, 0x01, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x04, 0x3b, 0xf3, 0xc2, 0x6e, 0xa0, 0x40, 0x04, - 0x04, 0x01, 0x3f, 0xfe, 0xc1, 0xb4, 0x7a, 0x7a, 0xf2, 0xd5, 0x8e, 0xe4, - 0x7e, 0xc1, 0xab, 0x90, 0xfe, 0xf9, 0x37, 0xa8, 0x58, 0x7f, 0x8c, 0x02, - 0x04, 0xee, 0xfe, 0xd6, 0x44, 0x4b, 0x3c, 0x3f, 0x7d, 0x87, 0xa5, 0xa5, - 0x87, 0x02, 0xc2, 0xf5, 0x01, 0x15, 0x91, 0xfe, 0xf3, 0xa5, 0xd1, 0xed, - 0xfe, 0x77, 0xfe, 0xc3, 0x45, 0x4e, 0xd4, 0x00, 0xff, 0xff, 0x00, 0x5b, - 0xff, 0xec, 0x05, 0x66, 0x05, 0x96, 0x12, 0x06, 0x01, 0x48, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x68, 0xff, 0xec, 0x05, 0x79, 0x05, 0x96, 0x10, 0x26, - 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x00, 0x11, 0x02, 0x00, 0x02, 0x5d, - 0xff, 0xff, 0x00, 0x5b, 0xff, 0xec, 0x05, 0x66, 0x05, 0x96, 0x12, 0x26, - 0x01, 0x48, 0x00, 0x00, 0x10, 0x07, 0x00, 0x11, 0x01, 0xa6, 0x02, 0x5d, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, 0x01, 0x56, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x11, 0x11, 0x05, 0x26, 0x01, 0x0e, 0xb8, 0xff, - 0xc1, 0xb4, 0x0e, 0x11, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, - 0x06, 0xb2, 0x10, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x79, 0x00, 0x00, 0x00, 0x44, 0x40, 0x2a, 0x10, 0x15, 0x40, 0x15, - 0x02, 0x20, 0x15, 0x50, 0x15, 0x80, 0x15, 0xb0, 0x15, 0xe0, 0x15, 0x05, - 0x00, 0x15, 0x30, 0x15, 0x60, 0x15, 0x90, 0x15, 0xc0, 0x15, 0xf0, 0x15, - 0x06, 0xc5, 0x20, 0x15, 0x01, 0x02, 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x02, - 0x01, 0x10, 0xb8, 0xff, 0xea, 0xb4, 0x10, 0x0e, 0x00, 0x0a, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x01, 0x5d, 0x5e, 0x5d, - 0x71, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0xff, 0xec, 0x06, 0x4f, - 0x05, 0x81, 0x00, 0x22, 0x00, 0x52, 0x40, 0x2c, 0x14, 0x08, 0x1f, 0x01, - 0x1c, 0x1c, 0x22, 0x1d, 0x1d, 0x0d, 0x08, 0x03, 0x24, 0x23, 0x00, 0x1f, - 0x20, 0x1f, 0x5f, 0x59, 0x1b, 0x18, 0x04, 0x18, 0x5f, 0x59, 0x01, 0x04, - 0x04, 0x1d, 0x20, 0x03, 0x1d, 0x12, 0x0a, 0x11, 0x5f, 0x59, 0x3f, 0x0e, - 0x01, 0x0e, 0x0a, 0x13, 0x00, 0x3f, 0x33, 0x5d, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, - 0x01, 0x10, 0x21, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, - 0x3d, 0x01, 0x34, 0x26, 0x23, 0x22, 0x04, 0x07, 0x11, 0x23, 0x11, 0x21, - 0x35, 0x21, 0x15, 0x02, 0xd0, 0x75, 0xfb, 0x54, 0xe2, 0xd9, 0xfe, 0xa0, - 0x5e, 0x92, 0x45, 0x6f, 0x3c, 0x59, 0x2f, 0x54, 0x50, 0x81, 0x90, 0x5c, - 0xfe, 0xef, 0x43, 0xbe, 0xfe, 0x1c, 0x04, 0x86, 0x04, 0xe5, 0xfe, 0xa0, - 0x19, 0x22, 0xbb, 0xbc, 0xd6, 0xfe, 0x79, 0x39, 0x42, 0x7b, 0x35, 0x27, - 0x65, 0x6f, 0xdb, 0x77, 0x7a, 0x22, 0x10, 0xfd, 0x0c, 0x04, 0xe5, 0x9c, - 0x9c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x01, 0x04, 0x2f, - 0x06, 0xf0, 0x10, 0x26, 0x03, 0x46, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x01, 0x71, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x06, 0x05, 0x26, - 0x01, 0x06, 0x21, 0x06, 0x09, 0x04, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0xff, 0xec, 0x05, 0x79, - 0x05, 0x96, 0x00, 0x1d, 0x00, 0x83, 0x40, 0x4f, 0x05, 0x0d, 0x03, 0x06, - 0x06, 0x14, 0x1b, 0x1a, 0x1a, 0x0c, 0x0d, 0x14, 0x0d, 0x1e, 0x1f, 0x00, - 0x1f, 0x01, 0x0b, 0x03, 0x03, 0x06, 0x5f, 0x59, 0x5f, 0x03, 0x8f, 0x03, - 0x02, 0x0f, 0x03, 0x01, 0x0b, 0x03, 0x03, 0x10, 0x17, 0x0f, 0x1b, 0x01, - 0x0d, 0x03, 0x1b, 0x1b, 0x17, 0x17, 0x00, 0x5f, 0x59, 0x17, 0x04, 0x00, - 0x0c, 0x10, 0x0c, 0x40, 0x0c, 0x50, 0x0c, 0x90, 0x0c, 0xa0, 0x0c, 0xe0, - 0x0c, 0xf0, 0x0c, 0x08, 0x0c, 0x03, 0x0c, 0x0c, 0x10, 0x10, 0x09, 0x5f, - 0x59, 0x10, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x11, 0x12, 0x39, 0x2f, 0x5e, 0x5d, 0x71, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x22, 0x04, 0x07, 0x21, 0x15, 0x21, - 0x16, 0x00, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, - 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x03, - 0x18, 0xd5, 0xfe, 0xff, 0x15, 0x02, 0x8e, 0xfd, 0x72, 0x12, 0x01, 0x0b, - 0xd6, 0x93, 0xe3, 0x47, 0x9c, 0x61, 0xfe, 0xd1, 0xd2, 0xd5, 0xfe, 0xc9, - 0xa3, 0x01, 0x6c, 0x01, 0x42, 0xe1, 0x01, 0x2e, 0x47, 0xb5, 0x31, 0xd9, - 0x04, 0xfa, 0xfd, 0xe5, 0x9a, 0xe5, 0xfe, 0xf0, 0x94, 0x90, 0x4d, 0xc0, - 0xb4, 0xb1, 0x01, 0x49, 0xe1, 0x01, 0x51, 0x01, 0x7e, 0xb0, 0xad, 0x3c, - 0x7b, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, - 0x05, 0x96, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbd, - 0x00, 0x00, 0x01, 0x7c, 0x05, 0x81, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x02, 0x34, 0x06, 0xb2, 0x12, 0x26, - 0x00, 0x2c, 0x00, 0x00, 0x11, 0x06, 0x09, 0x01, 0xda, 0x00, 0x00, 0x1a, - 0x40, 0x0f, 0x02, 0x01, 0x04, 0x04, 0x05, 0x26, 0x02, 0x01, 0x08, 0x01, - 0x08, 0x06, 0x00, 0x02, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x20, 0xff, 0xec, 0x03, 0x68, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, - 0xff, 0xf0, 0x08, 0x0b, 0x05, 0x81, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x4c, - 0x40, 0x29, 0x1c, 0x00, 0x18, 0x21, 0x21, 0x04, 0x06, 0x16, 0x0e, 0x16, - 0x04, 0x00, 0x04, 0x26, 0x25, 0x18, 0x20, 0x5f, 0x59, 0x18, 0x18, 0x04, - 0x16, 0x16, 0x06, 0x5f, 0x59, 0x16, 0x03, 0x0b, 0x10, 0x5f, 0x59, 0x0b, - 0x13, 0x04, 0x21, 0x5f, 0x59, 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x03, - 0x0a, 0x01, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, - 0x1a, 0x01, 0x13, 0x21, 0x11, 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, - 0x21, 0x11, 0x21, 0x32, 0x36, 0x08, 0x0b, 0xfe, 0xfe, 0xe3, 0xfd, 0xb7, - 0xfe, 0x60, 0x31, 0x33, 0x5f, 0x90, 0x82, 0x3a, 0x1c, 0x13, 0x25, 0x35, - 0x43, 0x3a, 0x3a, 0x3a, 0x2a, 0x03, 0x02, 0x01, 0x7e, 0xec, 0x01, 0x05, - 0xc0, 0xa4, 0xa4, 0xfe, 0x99, 0x01, 0x6f, 0xa4, 0x9c, 0x01, 0x9d, 0xbb, - 0xe2, 0x04, 0xe1, 0xfe, 0x90, 0xfe, 0x72, 0xfe, 0xa2, 0x95, 0x0a, 0x98, - 0x07, 0x41, 0x97, 0x01, 0x29, 0x01, 0xb3, 0x01, 0x42, 0xfd, 0xac, 0xd2, - 0xc0, 0x79, 0x81, 0xfe, 0x02, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0x00, 0x00, 0x07, 0xab, 0x05, 0x81, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x50, - 0x40, 0x2a, 0x0b, 0x07, 0x07, 0x08, 0x0f, 0x18, 0x18, 0x0c, 0x04, 0x13, - 0x00, 0x00, 0x04, 0x08, 0x03, 0x1c, 0x1d, 0x0f, 0x17, 0x5f, 0x59, 0x0f, - 0x0f, 0x0b, 0x0b, 0x06, 0x5f, 0x59, 0x0b, 0x0b, 0x08, 0x0d, 0x09, 0x03, - 0x08, 0x12, 0x04, 0x18, 0x5f, 0x59, 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, - 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, - 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, - 0x07, 0xab, 0xfe, 0xfe, 0xe3, 0xfd, 0xdf, 0xfd, 0xc2, 0xbf, 0xbf, 0x02, - 0x3e, 0xbf, 0x01, 0x56, 0xec, 0x01, 0x05, 0xc0, 0xa4, 0xa4, 0xfe, 0xc1, - 0x01, 0x47, 0xa4, 0x9c, 0x01, 0x9d, 0xbb, 0xe2, 0x02, 0x8d, 0xfd, 0x73, - 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfd, 0xac, 0xd2, 0xc0, 0x79, 0x81, - 0xfe, 0x02, 0x88, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x06, 0x2f, - 0x05, 0x81, 0x00, 0x14, 0x00, 0x65, 0x40, 0x3c, 0x00, 0x14, 0x0f, 0x0a, - 0x07, 0x07, 0x0d, 0x08, 0x14, 0x08, 0x16, 0x15, 0xa0, 0x16, 0xb0, 0x16, - 0xc0, 0x16, 0x03, 0xa0, 0x16, 0xe0, 0x16, 0x02, 0xef, 0x16, 0x01, 0x00, - 0x16, 0x60, 0x16, 0x90, 0x16, 0xa0, 0x16, 0x04, 0x0a, 0x03, 0x06, 0x04, - 0x11, 0x04, 0x5f, 0x59, 0x0f, 0x11, 0x11, 0x00, 0x0b, 0x0e, 0x0a, 0x0b, - 0x0a, 0x5f, 0x59, 0x0b, 0x03, 0x08, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, - 0x15, 0x21, 0x11, 0x24, 0x33, 0x20, 0x19, 0x01, 0x05, 0x71, 0x80, 0x85, - 0xa2, 0xfa, 0xbe, 0xfe, 0x1c, 0x04, 0xb3, 0xfd, 0xef, 0x01, 0x0a, 0x9a, - 0x01, 0xbb, 0x02, 0x3f, 0x7a, 0x6d, 0x32, 0xfd, 0x0c, 0x04, 0xe5, 0x9c, - 0x9c, 0xfe, 0xa0, 0x3b, 0xfe, 0x93, 0xfd, 0xad, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0x9d, 0x06, 0xf0, 0x12, 0x26, 0x03, 0xcb, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x01, 0xac, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x14, 0x05, 0x26, 0x01, 0x14, 0x25, 0x14, 0x17, 0x00, 0x0c, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x18, 0x06, 0xf0, 0x12, 0x26, 0x03, 0xc9, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfd, 0x01, 0x54, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x13, 0x13, 0x05, 0x26, 0x01, 0x10, 0xb8, 0xff, 0xb2, 0xb4, 0x10, 0x13, - 0x01, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x37, 0xff, 0xec, 0x05, 0x1f, 0x07, 0x3a, 0x12, 0x26, - 0x03, 0xd4, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfa, 0x01, 0x5e, 0x01, 0x4a, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x14, 0x14, 0x05, 0x26, 0x01, 0x16, 0x07, - 0x16, 0x1c, 0x0b, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x68, 0x05, 0x18, 0x05, 0x81, 0x00, 0x0b, - 0x00, 0x47, 0x40, 0x28, 0x05, 0x02, 0x0b, 0x00, 0x06, 0x09, 0x09, 0x00, - 0x02, 0x03, 0x0c, 0x0d, 0x10, 0x0d, 0x01, 0x20, 0x0d, 0x80, 0x0d, 0xe0, - 0x0d, 0x03, 0x0f, 0x0d, 0x01, 0x09, 0x03, 0x07, 0x07, 0x03, 0x03, 0x0a, - 0x02, 0x02, 0x05, 0x5f, 0x59, 0x02, 0x12, 0x00, 0x00, 0x2f, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, - 0x71, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, - 0x11, 0x02, 0x86, 0xfe, 0x22, 0xbf, 0x02, 0xf7, 0xba, 0xfe, 0x22, 0xfe, - 0x68, 0x01, 0x98, 0x05, 0x81, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x7f, 0xfe, - 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xd6, 0x05, 0x81, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x5f, - 0x40, 0x0f, 0x09, 0x12, 0x12, 0x04, 0x0d, 0x07, 0x00, 0x04, 0x00, 0x16, - 0x17, 0x60, 0x17, 0x01, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x1e, 0x23, - 0x48, 0x0f, 0x17, 0x01, 0x16, 0x03, 0x09, 0x11, 0x5f, 0x59, 0x00, 0x09, - 0x30, 0x09, 0xa0, 0x09, 0x03, 0x13, 0x03, 0x09, 0x09, 0x04, 0x05, 0x05, - 0x08, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x12, 0x5f, 0x59, 0x04, 0x12, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, 0x5d, 0x11, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x04, - 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, 0xd6, 0xfe, - 0xfe, 0xe3, 0xfd, 0xb7, 0x03, 0x9e, 0xfd, 0x21, 0x01, 0x7e, 0xec, 0x01, - 0x05, 0xc0, 0xa4, 0xa4, 0xfe, 0x99, 0x01, 0x6f, 0xa4, 0x9c, 0x01, 0x9d, - 0xbb, 0xe2, 0x05, 0x81, 0x9c, 0xfe, 0x48, 0xd2, 0xc0, 0x79, 0x81, 0xfe, - 0x02, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x01, 0x04, 0x2f, 0x05, 0x82, 0x10, 0x06, 0x03, 0x46, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x0f, 0xfe, 0x68, 0x05, 0x45, 0x05, 0x81, 0x00, 0x0e, - 0x00, 0x15, 0x00, 0x4c, 0x40, 0x2a, 0x06, 0x07, 0x15, 0x09, 0x11, 0x0d, - 0x00, 0x0f, 0x03, 0x02, 0x02, 0x0f, 0x0d, 0x09, 0x07, 0x05, 0x16, 0x17, - 0x0f, 0x17, 0x2f, 0x17, 0x02, 0x09, 0x03, 0x0d, 0x11, 0x5f, 0x59, 0x0d, - 0x03, 0x08, 0x00, 0x15, 0x05, 0x15, 0x5f, 0x59, 0x05, 0x12, 0x07, 0x02, - 0x00, 0x2f, 0x33, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, 0x3f, 0x2b, - 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x33, 0x11, 0x23, - 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x36, 0x12, 0x1b, 0x01, 0x21, 0x03, - 0x11, 0x21, 0x03, 0x0a, 0x01, 0x07, 0x04, 0x96, 0xaf, 0xb4, 0xfc, 0x32, - 0xb4, 0x90, 0x4e, 0x6d, 0x25, 0x43, 0x02, 0xd4, 0xba, 0xfe, 0x89, 0x31, - 0x25, 0x5a, 0x3f, 0xa0, 0xfd, 0xc8, 0x01, 0x98, 0xfe, 0x68, 0x02, 0x38, - 0x61, 0x01, 0x5f, 0x01, 0x23, 0x01, 0xfe, 0xfb, 0x1f, 0x04, 0x41, 0xfe, - 0x90, 0xfe, 0xee, 0xfe, 0xa6, 0x65, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x05, 0x81, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x47, 0x05, 0x81, 0x00, 0x23, - 0x00, 0x90, 0x40, 0x51, 0x1e, 0x1b, 0x11, 0x17, 0x18, 0x18, 0x1d, 0x1c, - 0x06, 0x03, 0x09, 0x10, 0x10, 0x23, 0x11, 0x22, 0x22, 0x23, 0x0a, 0x09, - 0x09, 0x04, 0x05, 0x05, 0x23, 0x1c, 0x03, 0x25, 0x24, 0x2f, 0x25, 0x01, - 0x02, 0x0f, 0x25, 0x01, 0x09, 0x00, 0x25, 0x30, 0x25, 0x40, 0x25, 0xa0, - 0x25, 0x04, 0x0d, 0x03, 0x1b, 0x06, 0x1e, 0x03, 0x06, 0x03, 0x0f, 0x21, - 0x00, 0x0f, 0x00, 0x60, 0x59, 0x12, 0x7f, 0x0f, 0xaf, 0x0f, 0x02, 0x2f, - 0x0f, 0x01, 0x0f, 0x0f, 0x04, 0x17, 0x10, 0x09, 0x03, 0x23, 0x1d, 0x04, - 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x5d, - 0x71, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x5f, 0x5d, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x01, 0x23, 0x01, 0x26, 0x27, 0x01, - 0x33, 0x13, 0x1e, 0x02, 0x33, 0x11, 0x33, 0x11, 0x32, 0x3e, 0x01, 0x37, - 0x13, 0x33, 0x01, 0x06, 0x07, 0x01, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, - 0x23, 0x03, 0x52, 0x25, 0x6f, 0x19, 0xfe, 0x55, 0xde, 0x01, 0xfd, 0x30, - 0x83, 0xfe, 0xe5, 0xc8, 0xcd, 0x6f, 0x60, 0x58, 0x4b, 0xbf, 0x4b, 0x5a, - 0x62, 0x6b, 0xcd, 0xc8, 0xfe, 0xe5, 0x83, 0x30, 0x01, 0xfd, 0xde, 0xfe, - 0x55, 0x19, 0x6d, 0x27, 0xbf, 0x02, 0x85, 0x1a, 0x0c, 0xfd, 0x55, 0x03, - 0x07, 0x23, 0xbd, 0x01, 0x9a, 0xfe, 0xcf, 0xa7, 0x6b, 0x28, 0x02, 0x6b, - 0xfd, 0x95, 0x29, 0x6f, 0xa2, 0x01, 0x31, 0xfe, 0x66, 0xbd, 0x23, 0xfc, - 0xf9, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x43, - 0xff, 0xec, 0x04, 0x70, 0x05, 0x95, 0x00, 0x27, 0x00, 0x81, 0x40, 0x42, - 0x22, 0x0e, 0x1f, 0x18, 0x19, 0x19, 0x04, 0x03, 0x12, 0x1f, 0x1f, 0x09, - 0x25, 0x03, 0x25, 0x28, 0x29, 0x22, 0x0e, 0x0d, 0x0e, 0x0d, 0x5f, 0x59, - 0x0f, 0x0e, 0x3f, 0x0e, 0x02, 0x20, 0x03, 0x0e, 0x0e, 0x00, 0x1c, 0x18, - 0x40, 0x0d, 0x10, 0x48, 0x18, 0x18, 0x1c, 0x1c, 0x15, 0x5f, 0x59, 0x1c, - 0x04, 0x00, 0x06, 0x5f, 0x59, 0x20, 0x04, 0x30, 0x04, 0x70, 0x04, 0x80, - 0x04, 0x04, 0xd0, 0x04, 0x01, 0x04, 0xb8, 0xff, 0xc0, 0xb6, 0x0d, 0x11, - 0x48, 0x04, 0x04, 0x00, 0x13, 0x00, 0x3f, 0x32, 0x2f, 0x2b, 0x5d, 0x71, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x05, 0x22, 0x24, 0x27, 0x37, - 0x12, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x24, 0x33, - 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x02, - 0x6d, 0xcc, 0xfe, 0xf8, 0x56, 0xa5, 0x77, 0x01, 0x07, 0x99, 0xb0, 0xc0, - 0xca, 0x47, 0x47, 0xb5, 0xad, 0x91, 0x87, 0x7e, 0xac, 0x33, 0xb2, 0x46, - 0x01, 0x08, 0xc8, 0xd4, 0xfc, 0x90, 0x88, 0x98, 0xaa, 0xfe, 0xeb, 0x14, - 0xa1, 0xbb, 0x4d, 0xfe, 0xf0, 0x8e, 0x80, 0x85, 0x76, 0x94, 0x77, 0x7b, - 0x6b, 0x7b, 0x75, 0x82, 0x3d, 0xad, 0xa8, 0xc7, 0xa9, 0x7f, 0xa6, 0x20, - 0x17, 0xaf, 0x84, 0xc3, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x18, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x38, 0x40, 0x1c, - 0x0d, 0x02, 0x02, 0x01, 0x06, 0x09, 0x09, 0x08, 0x01, 0x08, 0x0e, 0x0f, - 0x0f, 0x0f, 0x2f, 0x0f, 0x02, 0x0c, 0x01, 0x06, 0x06, 0x01, 0x03, 0x09, - 0x09, 0x05, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x32, 0x2f, 0x3f, 0x33, 0x2f, - 0x11, 0x33, 0x01, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x14, 0x07, - 0x01, 0x33, 0x11, 0x23, 0x11, 0x34, 0x37, 0x01, 0xa8, 0xac, 0x08, 0x02, - 0xee, 0xde, 0xaa, 0x06, 0xfd, 0x1a, 0x05, 0x81, 0xfc, 0x64, 0x72, 0xa0, - 0x04, 0xae, 0xfa, 0x7f, 0x03, 0xa8, 0x7a, 0x84, 0xfb, 0x5a, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x18, 0x07, 0x3a, 0x12, 0x26, - 0x03, 0xc9, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfa, 0x01, 0x92, 0x01, 0x4a, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0e, 0x0e, 0x05, 0x26, 0x01, 0x10, 0x06, - 0x10, 0x16, 0x00, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x9d, 0x05, 0x81, 0x00, 0x13, - 0x00, 0x50, 0x40, 0x29, 0x0b, 0x0e, 0x08, 0x02, 0x02, 0x12, 0x12, 0x13, - 0x07, 0x08, 0x08, 0x0d, 0x0c, 0x13, 0x0c, 0x14, 0x15, 0x0f, 0x15, 0x01, - 0x0b, 0x03, 0x0e, 0x02, 0x0b, 0x11, 0x02, 0x11, 0x60, 0x59, 0x2f, 0x02, - 0x01, 0x02, 0x02, 0x13, 0x0c, 0x12, 0x07, 0x00, 0x03, 0x00, 0x3f, 0x32, - 0x3f, 0x33, 0x39, 0x2f, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x01, - 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, - 0x11, 0x32, 0x3e, 0x01, 0x37, 0x13, 0x33, 0x01, 0x06, 0x07, 0x01, 0x23, - 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, 0xa8, 0xbf, 0x4b, 0x5a, 0x62, 0x6b, - 0xcd, 0xc8, 0xfe, 0xe5, 0x83, 0x30, 0x01, 0xfd, 0xde, 0xfe, 0x55, 0x19, - 0x6d, 0x27, 0xbf, 0x05, 0x81, 0xfd, 0x95, 0x29, 0x6f, 0xa2, 0x01, 0x31, - 0xfe, 0x66, 0xbd, 0x23, 0xfc, 0xf9, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, - 0x00, 0x01, 0x00, 0x12, 0xff, 0xf0, 0x04, 0x99, 0x05, 0x81, 0x00, 0x14, - 0x00, 0x37, 0x40, 0x1d, 0x13, 0x14, 0x01, 0x11, 0x08, 0x11, 0x14, 0x03, - 0x16, 0x15, 0x00, 0x16, 0x01, 0x11, 0x03, 0x14, 0x12, 0x11, 0x01, 0x5f, - 0x59, 0x11, 0x03, 0x06, 0x0b, 0x5f, 0x59, 0x06, 0x13, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x01, 0x5f, 0x5e, 0x5d, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x03, - 0x0a, 0x01, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, - 0x1a, 0x01, 0x13, 0x21, 0x11, 0x23, 0x03, 0xdf, 0xfe, 0x5e, 0x31, 0x33, - 0x5f, 0x90, 0x82, 0x3a, 0x1c, 0x13, 0x25, 0x35, 0x43, 0x3a, 0x3a, 0x3a, - 0x2a, 0x02, 0xff, 0xba, 0x04, 0xe1, 0xfe, 0x90, 0xfe, 0x72, 0xfe, 0xa2, - 0x95, 0x0a, 0x98, 0x07, 0x41, 0x97, 0x01, 0x29, 0x01, 0xb3, 0x01, 0x42, - 0xfa, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x02, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x20, 0x05, 0x81, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x12, 0x06, - 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa6, 0x00, 0x00, 0x05, 0x1e, - 0x05, 0x81, 0x11, 0x06, 0x03, 0x53, 0xfe, 0x00, 0x00, 0x1c, 0x40, 0x17, - 0x0f, 0x09, 0x01, 0x20, 0x09, 0x01, 0x20, 0x09, 0x50, 0x09, 0x60, 0x09, - 0x70, 0x09, 0x80, 0x09, 0xa0, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0x08, 0x5d, - 0x71, 0x5d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, - 0xff, 0xec, 0x05, 0x79, 0x05, 0x96, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x04, 0xb4, 0x05, 0x81, 0x12, 0x06, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, 0xff, 0xec, 0x05, 0x1f, - 0x05, 0x81, 0x00, 0x13, 0x00, 0x3d, 0x40, 0x1e, 0x0d, 0x0a, 0x0c, 0x0b, - 0x0b, 0x03, 0x0a, 0x03, 0x15, 0x14, 0x0e, 0x0f, 0x0f, 0x15, 0x0d, 0x0a, - 0x0b, 0x00, 0x0e, 0x0e, 0x0b, 0x03, 0x04, 0x06, 0x00, 0x06, 0x5f, 0x59, - 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x37, - 0x16, 0x33, 0x32, 0x3e, 0x01, 0x37, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, - 0x0e, 0x02, 0x01, 0x4c, 0x3e, 0x87, 0x2e, 0x51, 0x5e, 0x48, 0x33, 0x45, - 0x46, 0x66, 0xfd, 0xc3, 0xda, 0x01, 0xc1, 0x01, 0x80, 0xcd, 0xfd, 0xbf, - 0x55, 0x6a, 0x7d, 0x14, 0x26, 0x20, 0x90, 0x3b, 0x27, 0x5f, 0xba, 0x03, - 0xba, 0xfc, 0xf0, 0x03, 0x10, 0xfb, 0xbd, 0xa0, 0x7a, 0x38, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x76, 0xff, 0xf5, 0x05, 0x9f, 0x05, 0x8b, 0x00, 0x17, - 0x00, 0x1f, 0x00, 0x28, 0x00, 0x6a, 0x40, 0x3c, 0x20, 0x0d, 0x1c, 0x14, - 0x06, 0x06, 0x23, 0x11, 0x07, 0x18, 0x00, 0x00, 0x07, 0x0d, 0x03, 0x29, - 0x2a, 0x10, 0x2a, 0x01, 0x60, 0x2a, 0xc0, 0x2a, 0xd0, 0x2a, 0x03, 0x3f, - 0x2a, 0x01, 0x00, 0x2a, 0x01, 0x0a, 0x03, 0x1d, 0x24, 0x09, 0x24, 0x60, - 0x59, 0x05, 0x09, 0x1b, 0x26, 0x10, 0x26, 0x60, 0x59, 0x14, 0x10, 0x09, - 0x10, 0x09, 0x10, 0x06, 0x12, 0x03, 0x06, 0x12, 0x00, 0x3f, 0x3f, 0x12, - 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x11, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x01, 0x2b, 0x01, 0x15, 0x23, - 0x35, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x00, 0x21, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x20, 0x00, 0x07, 0x10, 0x21, 0x23, 0x11, 0x33, 0x32, 0x36, - 0x25, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x05, 0x9f, 0x7f, - 0xee, 0xa0, 0x28, 0xbf, 0x28, 0xa1, 0xee, 0x7e, 0x01, 0x17, 0x01, 0x01, - 0x1d, 0xbf, 0x1c, 0x01, 0x02, 0x01, 0x17, 0xc0, 0xfe, 0x90, 0x05, 0x0d, - 0xae, 0xba, 0xfc, 0x57, 0xba, 0xae, 0x0d, 0x09, 0xb6, 0xb6, 0x02, 0xe0, - 0x99, 0xed, 0x82, 0xe3, 0xe3, 0x83, 0xed, 0x98, 0xee, 0x01, 0x07, 0xb6, - 0xb6, 0xfe, 0xf8, 0xf1, 0x01, 0x6f, 0xfd, 0x16, 0xc0, 0xbb, 0xbb, 0xc0, - 0x02, 0xea, 0xb4, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x2b, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0xfe, 0x68, 0x05, 0xc5, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x41, 0x40, 0x21, - 0x07, 0x04, 0x08, 0x0b, 0x0b, 0x02, 0x02, 0x01, 0x04, 0x01, 0x0c, 0x0d, - 0x00, 0x0d, 0xc0, 0x0d, 0x02, 0x0b, 0x03, 0x09, 0x09, 0x05, 0x03, 0x0b, - 0x0b, 0x07, 0x04, 0x07, 0x5f, 0x59, 0x04, 0x12, 0x02, 0x00, 0x2f, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x2f, 0x01, 0x5f, 0x5e, - 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x25, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, - 0x11, 0x33, 0x11, 0x05, 0xc5, 0xb4, 0xfb, 0x97, 0xbf, 0x02, 0xf5, 0xba, - 0xa0, 0xfd, 0xc8, 0x01, 0x98, 0x05, 0x81, 0xfb, 0x1f, 0x04, 0xe1, 0xfb, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x04, 0xae, - 0x05, 0x81, 0x00, 0x12, 0x00, 0x50, 0x40, 0x13, 0x12, 0x0f, 0x0f, 0x10, - 0x08, 0x07, 0x10, 0x07, 0x14, 0x13, 0x00, 0x14, 0x01, 0x00, 0x14, 0x01, - 0x0b, 0x03, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x0e, 0x11, 0x48, 0x00, - 0x03, 0x0c, 0x03, 0x5f, 0x59, 0x0e, 0x2f, 0x0c, 0x01, 0x0c, 0x0c, 0x07, - 0x11, 0x12, 0x0f, 0x0f, 0x07, 0x03, 0x00, 0x3f, 0x33, 0x2f, 0x3f, 0x12, - 0x39, 0x2f, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x01, 0x2b, 0x5f, 0x5e, - 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x03, 0xf0, 0x9b, - 0xb6, 0x47, 0xde, 0xda, 0xbe, 0x82, 0x86, 0x95, 0xf5, 0xbe, 0xbe, 0x01, - 0xfc, 0x22, 0x18, 0xb5, 0xb8, 0x02, 0x52, 0xfd, 0xc2, 0x7b, 0x6c, 0x31, - 0x02, 0xf4, 0xfa, 0x7f, 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x06, 0xad, - 0x05, 0x81, 0x00, 0x0b, 0x00, 0x55, 0x40, 0x31, 0x08, 0x0b, 0x07, 0x04, - 0x03, 0x00, 0x00, 0x04, 0x0b, 0x03, 0x0d, 0x0c, 0xeb, 0x0d, 0x01, 0xc4, - 0x0d, 0x01, 0xbb, 0x0d, 0x01, 0x84, 0x0d, 0x01, 0x70, 0x0d, 0x01, 0x02, - 0x40, 0x0d, 0x01, 0x0f, 0x0d, 0x01, 0x09, 0x03, 0x09, 0x05, 0x01, 0x03, - 0x07, 0x07, 0x03, 0x00, 0x03, 0x5f, 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x33, 0x01, 0x5f, 0x5e, 0x5d, - 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x21, - 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0xa8, 0xbf, 0x01, 0xe9, 0xba, - 0x01, 0xe9, 0xba, 0x05, 0x81, 0xfb, 0x1f, 0x04, 0xe1, 0xfb, 0x1f, 0x04, - 0xe1, 0xfa, 0x7f, 0x00, 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x68, 0x07, 0x2f, - 0x05, 0x81, 0x00, 0x0f, 0x00, 0x57, 0x40, 0x30, 0x0c, 0x0f, 0x0f, 0x02, - 0x02, 0x01, 0x0b, 0x08, 0x07, 0x04, 0x04, 0x08, 0x01, 0x03, 0x11, 0x10, - 0x30, 0x11, 0x40, 0x11, 0x60, 0x11, 0x03, 0x2f, 0x11, 0x01, 0x00, 0x11, - 0x01, 0x0d, 0x03, 0x0d, 0x09, 0x05, 0x03, 0x0f, 0x0f, 0x07, 0x0b, 0x0b, - 0x07, 0x04, 0x07, 0x5f, 0x59, 0x04, 0x12, 0x02, 0x00, 0x2f, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x33, 0x2f, 0x3f, 0x33, 0x33, 0x01, - 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x11, 0x23, - 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, - 0x11, 0x07, 0x2f, 0xb4, 0xfa, 0x2d, 0xbf, 0x01, 0xd3, 0xba, 0x01, 0xd2, - 0xba, 0xa0, 0xfd, 0xc8, 0x01, 0x98, 0x05, 0x81, 0xfb, 0x1f, 0x04, 0xe1, - 0xfb, 0x1f, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2e, - 0x00, 0x00, 0x05, 0xeb, 0x05, 0x81, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x45, - 0x40, 0x24, 0x0a, 0x00, 0x12, 0x12, 0x08, 0x0d, 0x04, 0x08, 0x04, 0x16, - 0x17, 0x00, 0x17, 0x01, 0x0b, 0x03, 0x00, 0x11, 0x5f, 0x59, 0x00, 0x00, - 0x08, 0x0b, 0x0b, 0x0a, 0x5f, 0x59, 0x0b, 0x03, 0x08, 0x12, 0x5f, 0x59, - 0x08, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x21, 0x32, - 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x01, 0x34, - 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x02, 0xb8, 0x01, 0x42, 0xec, - 0x01, 0x05, 0xfe, 0xfe, 0xe3, 0xfd, 0xf3, 0xfe, 0x35, 0x02, 0x8a, 0x02, - 0x73, 0xa4, 0xa4, 0xfe, 0xd5, 0x01, 0x33, 0xa4, 0x9c, 0x03, 0x2d, 0xd2, - 0xbe, 0xbb, 0xe2, 0x04, 0xe5, 0x9c, 0xfc, 0x1a, 0x79, 0x81, 0xfe, 0x02, - 0x88, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x6d, - 0x05, 0x81, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x17, 0x00, 0x52, 0x40, 0x11, - 0x14, 0x17, 0x00, 0x0b, 0x07, 0x10, 0x10, 0x17, 0x0b, 0x19, 0x04, 0x00, - 0x19, 0x01, 0x11, 0x03, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, 0x0e, - 0x48, 0x07, 0x0f, 0x5f, 0x59, 0x07, 0x07, 0x04, 0x05, 0x15, 0x15, 0x05, - 0x03, 0x14, 0x14, 0x04, 0x04, 0x10, 0x5f, 0x59, 0x04, 0x12, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x2f, 0x11, 0x12, 0x39, - 0x2f, 0x2b, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, - 0x21, 0x11, 0x33, 0x11, 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, 0x21, - 0x11, 0x21, 0x32, 0x36, 0x01, 0x11, 0x33, 0x11, 0x04, 0xd6, 0xfe, 0xfe, - 0xe3, 0xfd, 0xb7, 0xbf, 0x01, 0x7e, 0xec, 0x01, 0x05, 0xc0, 0xa4, 0xa4, - 0xfe, 0x99, 0x01, 0x6f, 0xa4, 0x9c, 0x01, 0x98, 0xbf, 0x01, 0x9d, 0xbb, - 0xe2, 0x05, 0x81, 0xfd, 0xac, 0xd2, 0xc0, 0x79, 0x81, 0xfe, 0x02, 0x88, - 0xfe, 0xe1, 0x05, 0x81, 0xfa, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xd6, 0x05, 0x81, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x42, - 0x40, 0x25, 0x0b, 0x00, 0x07, 0x10, 0x10, 0x04, 0x00, 0x04, 0x14, 0x13, - 0x6f, 0x14, 0x01, 0x00, 0x14, 0x40, 0x14, 0x50, 0x14, 0x03, 0x0d, 0x03, - 0x07, 0x0f, 0x5f, 0x59, 0x07, 0x07, 0x04, 0x05, 0x03, 0x04, 0x10, 0x5f, - 0x59, 0x04, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, - 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x23, 0x21, 0x11, - 0x33, 0x11, 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, - 0x20, 0x04, 0xd6, 0xfe, 0xfe, 0xe3, 0xfd, 0xb7, 0xbf, 0x01, 0x7e, 0xec, - 0x01, 0x05, 0xc0, 0xa4, 0xa4, 0xfe, 0x99, 0x01, 0x6f, 0x01, 0x40, 0x01, - 0x9d, 0xbb, 0xe2, 0x05, 0x81, 0xfd, 0xac, 0xd2, 0xc4, 0x79, 0x83, 0xfe, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xec, 0x05, 0x79, - 0x05, 0x96, 0x00, 0x1c, 0x00, 0x79, 0x40, 0x4a, 0x11, 0x10, 0x03, 0x04, - 0x1a, 0x17, 0x17, 0x0a, 0x04, 0x10, 0x10, 0x18, 0x0a, 0x03, 0x1e, 0x1d, - 0x1a, 0x17, 0x5f, 0x59, 0x5f, 0x1a, 0x8f, 0x1a, 0x02, 0x0f, 0x1a, 0x01, - 0x0b, 0x03, 0x1a, 0x1a, 0x0e, 0x07, 0x0e, 0x14, 0x5f, 0x59, 0x00, 0x11, - 0x10, 0x11, 0x40, 0x11, 0x50, 0x11, 0x90, 0x11, 0xa0, 0x11, 0xe0, 0x11, - 0xf0, 0x11, 0x08, 0x0c, 0x11, 0x11, 0x0e, 0x13, 0x0f, 0x03, 0x01, 0x0d, - 0x03, 0x03, 0x03, 0x07, 0x07, 0x00, 0x5f, 0x59, 0x07, 0x04, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x3f, 0x33, 0x2f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x71, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x06, 0x07, 0x27, - 0x36, 0x24, 0x33, 0x20, 0x00, 0x11, 0x14, 0x02, 0x04, 0x23, 0x20, 0x03, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x00, 0x37, 0x21, 0x35, 0x21, 0x26, 0x24, - 0x02, 0xc9, 0x98, 0xda, 0x2d, 0xb5, 0x47, 0x01, 0x2e, 0xe1, 0x01, 0x42, - 0x01, 0x6c, 0xa2, 0xfe, 0xcb, 0xd7, 0xfe, 0x56, 0xb8, 0x9c, 0x45, 0xe6, - 0x91, 0xd5, 0x01, 0x0b, 0x13, 0xfd, 0x72, 0x02, 0x8e, 0x15, 0xfe, 0xff, - 0x04, 0xfa, 0x87, 0x76, 0x3c, 0xad, 0xb0, 0xfe, 0x82, 0xfe, 0xaf, 0xdf, - 0xfe, 0xb6, 0xb2, 0x01, 0x74, 0x4e, 0x8c, 0x99, 0x01, 0x0f, 0xe6, 0x9a, - 0xe5, 0xfd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, 0xff, 0xec, 0x07, 0xb3, - 0x05, 0x96, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x61, 0x40, 0x38, 0x0d, 0x09, - 0x09, 0x0a, 0x1a, 0x0e, 0x07, 0x14, 0x00, 0x0a, 0x07, 0x00, 0x03, 0x21, - 0x20, 0x00, 0x21, 0x01, 0x11, 0x03, 0x11, 0x17, 0x5f, 0x59, 0x11, 0x04, - 0x0d, 0x08, 0x5f, 0x59, 0x0f, 0x0d, 0x01, 0x08, 0x00, 0x0d, 0x30, 0x0d, - 0xa0, 0x0d, 0x03, 0x13, 0x03, 0x0d, 0x0d, 0x0a, 0x0b, 0x03, 0x0a, 0x12, - 0x04, 0x1d, 0x5f, 0x59, 0x04, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x5e, 0x5d, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, - 0x04, 0x23, 0x20, 0x00, 0x03, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, - 0x12, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x12, 0x33, 0x32, 0x12, 0x07, 0xb3, 0xa0, 0xfe, 0xd4, 0xc8, 0xfe, - 0xd9, 0xfe, 0xa5, 0x0f, 0xfe, 0xd9, 0xbf, 0xbf, 0x01, 0x2a, 0x1b, 0x01, - 0x57, 0x01, 0x1e, 0x01, 0x36, 0x01, 0x5c, 0xc3, 0xf3, 0xdc, 0xdf, 0xf3, - 0xf7, 0xd9, 0xdf, 0xf2, 0x02, 0xc7, 0xdd, 0xfe, 0xb3, 0xb1, 0x01, 0x66, - 0x01, 0x3b, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x01, 0x24, 0x01, 0x45, - 0xfe, 0x81, 0xfe, 0xb0, 0x01, 0x07, 0x01, 0x2c, 0xfe, 0xd8, 0xfe, 0xf5, - 0xfe, 0xf7, 0xfe, 0xc9, 0x01, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, - 0x00, 0x00, 0x05, 0x20, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x59, - 0x40, 0x30, 0x0c, 0x01, 0x01, 0x12, 0x0e, 0x04, 0x04, 0x0d, 0x00, 0x12, - 0x0a, 0x0a, 0x09, 0x00, 0x09, 0x17, 0x18, 0x01, 0x0b, 0x12, 0x0b, 0x5f, - 0x59, 0x0f, 0x12, 0x3f, 0x12, 0x4f, 0x12, 0x6f, 0x12, 0x04, 0x0b, 0x03, - 0x12, 0x12, 0x00, 0x07, 0x07, 0x14, 0x5f, 0x59, 0x07, 0x03, 0x0a, 0x0a, - 0x00, 0x12, 0x00, 0x3f, 0x32, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x33, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x24, - 0x33, 0x21, 0x11, 0x23, 0x11, 0x21, 0x01, 0x13, 0x14, 0x16, 0x33, 0x21, - 0x11, 0x21, 0x22, 0x06, 0x60, 0x01, 0x90, 0xa1, 0xb7, 0x01, 0x02, 0xef, - 0x02, 0x97, 0xbf, 0xfe, 0x49, 0xfe, 0x92, 0x1c, 0xa5, 0x97, 0x01, 0xcd, - 0xfe, 0x3b, 0x9d, 0xa7, 0x02, 0x5f, 0x1c, 0xd6, 0x9d, 0xbe, 0xd5, 0xfa, - 0x7f, 0x02, 0x49, 0xfd, 0xb7, 0x03, 0xec, 0x7f, 0x8d, 0x02, 0x08, 0x81, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x04, 0x4e, 0x12, 0x06, - 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x78, 0xff, 0xec, 0x04, 0x3f, - 0x05, 0xde, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x57, 0x40, 0x13, 0x1c, 0x00, - 0x0f, 0x20, 0x06, 0x06, 0x15, 0x0f, 0x15, 0x24, 0x23, 0x00, 0x24, 0xb0, - 0x24, 0x02, 0x11, 0x03, 0x24, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x1e, 0x23, - 0x48, 0x0c, 0x03, 0x50, 0x59, 0x20, 0x0c, 0x0c, 0x12, 0x1c, 0x00, 0x1b, - 0xb0, 0x1b, 0xf0, 0x1b, 0x03, 0x0d, 0x03, 0x1b, 0x12, 0x09, 0x50, 0x59, - 0x12, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, - 0x12, 0x39, 0x2f, 0x39, 0x2b, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x11, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, - 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x3e, - 0x02, 0x25, 0x15, 0x04, 0x0e, 0x01, 0x07, 0x3e, 0x01, 0x03, 0x82, 0x84, - 0x95, 0x9f, 0x95, 0x8b, 0x95, 0xa1, 0x8c, 0xf3, 0xde, 0xd2, 0xfa, 0xee, - 0xf6, 0xe9, 0x2e, 0x62, 0x9b, 0xeb, 0x01, 0x7e, 0xfe, 0x5d, 0xf7, 0x64, - 0x04, 0x2b, 0xca, 0x01, 0xf6, 0xca, 0xbf, 0xc2, 0xc7, 0xc2, 0xc3, 0xbb, - 0x02, 0xd7, 0xfe, 0xfb, 0xfe, 0xfa, 0xfe, 0xf7, 0xfe, 0xfd, 0x01, 0x42, - 0x01, 0x4e, 0xaa, 0x01, 0x01, 0xba, 0x7c, 0x4c, 0x35, 0xa1, 0x36, 0x62, - 0xd6, 0xd5, 0x7d, 0x8c, 0x00, 0x03, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xe7, - 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x21, 0x00, 0x78, 0x40, 0x14, - 0x06, 0x1a, 0x03, 0x1a, 0x10, 0x10, 0x0e, 0x1e, 0x03, 0x03, 0x14, 0x0a, - 0x0e, 0x0a, 0x22, 0x23, 0x30, 0x23, 0x01, 0x23, 0xb8, 0xff, 0xc0, 0x40, - 0x2f, 0x1e, 0x23, 0x48, 0x0f, 0x23, 0x2f, 0x23, 0xdf, 0x23, 0x03, 0x09, - 0x03, 0x06, 0x1a, 0x18, 0x1a, 0x18, 0x51, 0x59, 0x6f, 0x1a, 0x7f, 0x1a, - 0x8f, 0x1a, 0x03, 0x0f, 0x1a, 0x01, 0x0b, 0x03, 0x1a, 0x1a, 0x0e, 0x0f, - 0x0f, 0x19, 0x50, 0x59, 0x0f, 0x0f, 0x0e, 0x10, 0x50, 0x59, 0x0e, 0x15, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x01, 0x5f, - 0x5e, 0x5d, 0x2b, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x32, - 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, - 0x21, 0x11, 0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x19, - 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x34, 0xc8, 0xc8, - 0x72, 0x6d, 0x81, 0x81, 0xdb, 0xc1, 0xfe, 0x43, 0xb4, 0xec, 0x8a, 0x70, - 0x77, 0x8f, 0xe0, 0xd8, 0x80, 0x6d, 0x66, 0x79, 0x04, 0x3a, 0x8c, 0x83, - 0x5d, 0x7c, 0x15, 0x07, 0x11, 0x82, 0x6b, 0x93, 0xa5, 0x04, 0x3a, 0xfc, - 0x4b, 0x55, 0x5d, 0x65, 0x53, 0x01, 0xc2, 0xfe, 0xc0, 0x48, 0x5a, 0x52, - 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x02, 0xaf, - 0x04, 0x3a, 0x00, 0x05, 0x00, 0x1d, 0x40, 0x0e, 0x03, 0x04, 0x04, 0x00, - 0x06, 0x07, 0x05, 0x02, 0x50, 0x59, 0x05, 0x0f, 0x03, 0x15, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x15, 0x21, 0x11, 0x23, 0x11, 0x02, 0xaf, 0xfe, 0x93, 0xb4, 0x04, 0x3a, - 0x83, 0xfc, 0x49, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, - 0xfe, 0x68, 0x04, 0x88, 0x04, 0x3a, 0x00, 0x05, 0x00, 0x13, 0x00, 0x46, - 0x40, 0x24, 0x05, 0x12, 0x12, 0x07, 0x07, 0x06, 0x01, 0x10, 0x04, 0x0d, - 0x0d, 0x0a, 0x0b, 0x0b, 0x10, 0x06, 0x03, 0x15, 0x14, 0x10, 0x01, 0x50, - 0x59, 0x10, 0x0f, 0x12, 0x04, 0x0c, 0x09, 0x0c, 0x50, 0x59, 0x09, 0x15, - 0x0b, 0x06, 0x00, 0x2f, 0x33, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, - 0x0a, 0x01, 0x07, 0x21, 0x01, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, - 0x36, 0x12, 0x13, 0x21, 0x11, 0x33, 0x03, 0x42, 0xfe, 0xce, 0x25, 0x5a, - 0x40, 0x01, 0xf1, 0x01, 0x46, 0xa3, 0xfc, 0xd2, 0xa3, 0x77, 0x4b, 0x6e, - 0x2e, 0x02, 0x84, 0x92, 0x03, 0xb7, 0xfe, 0xf0, 0xfe, 0x6d, 0x91, 0xfd, - 0xe5, 0x01, 0x98, 0xfe, 0x68, 0x02, 0x1b, 0x7d, 0x01, 0xcc, 0x01, 0x6e, - 0xfc, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x04, 0x4e, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, - 0x00, 0x00, 0x05, 0x53, 0x04, 0x3a, 0x00, 0x23, 0x00, 0xbc, 0x40, 0x49, - 0x06, 0x03, 0x0f, 0x0a, 0x09, 0x09, 0x04, 0x05, 0x1b, 0x1e, 0x18, 0x12, - 0x12, 0x22, 0x22, 0x0f, 0x23, 0x17, 0x18, 0x18, 0x1d, 0x1c, 0x1c, 0x23, - 0x05, 0x03, 0x24, 0x25, 0xcf, 0x25, 0xdf, 0x25, 0x02, 0x70, 0x25, 0x01, - 0x3f, 0x25, 0x6f, 0x25, 0x02, 0x20, 0x25, 0x01, 0x0f, 0x25, 0x01, 0xf0, - 0x25, 0x01, 0x9f, 0x25, 0x01, 0x50, 0x25, 0x60, 0x25, 0x02, 0x1f, 0x25, - 0x2f, 0x25, 0x02, 0x00, 0x25, 0x01, 0x0a, 0x03, 0x1b, 0x06, 0x1e, 0x03, - 0x06, 0xb8, 0xff, 0xf0, 0x40, 0x29, 0x0b, 0x11, 0x48, 0x06, 0x03, 0x0f, - 0x21, 0x00, 0x0f, 0x00, 0x50, 0x59, 0x12, 0x0f, 0x0f, 0x1f, 0x0f, 0x4f, - 0x0f, 0x5f, 0x0f, 0x04, 0x0f, 0x0f, 0x1f, 0x0f, 0x4f, 0x0f, 0x03, 0x07, - 0x0f, 0x0f, 0x04, 0x17, 0x10, 0x09, 0x0f, 0x23, 0x1d, 0x04, 0x15, 0x00, - 0x3f, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x5e, 0x5d, 0x71, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x39, 0x2b, 0x11, 0x33, 0x11, - 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x01, 0x23, - 0x01, 0x26, 0x27, 0x03, 0x33, 0x17, 0x1e, 0x02, 0x33, 0x11, 0x33, 0x11, - 0x32, 0x3e, 0x02, 0x13, 0x33, 0x03, 0x06, 0x07, 0x01, 0x23, 0x01, 0x0e, - 0x01, 0x23, 0x11, 0x23, 0x02, 0x53, 0x1a, 0x41, 0x13, 0xfe, 0xea, 0xc8, - 0x01, 0x61, 0x23, 0x5d, 0xd8, 0xbc, 0x94, 0x42, 0x48, 0x3b, 0x2e, 0xb4, - 0x1e, 0x30, 0x34, 0x42, 0xc3, 0xbc, 0xd8, 0x5d, 0x23, 0x01, 0x61, 0xc8, - 0xfe, 0xea, 0x13, 0x41, 0x1a, 0xb4, 0x01, 0xdd, 0x0c, 0x08, 0xfe, 0x0f, - 0x02, 0x50, 0x1d, 0x88, 0x01, 0x45, 0xef, 0x6a, 0x5d, 0x24, 0x01, 0xda, - 0xfe, 0x26, 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, 0x88, 0x1d, 0xfd, - 0xb0, 0x01, 0xf1, 0x08, 0x0c, 0xfe, 0x23, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xff, 0xec, 0x03, 0x5e, 0x04, 0x4e, 0x00, 0x24, 0x00, 0x8a, 0x40, 0x52, - 0x0c, 0x1e, 0x1b, 0x15, 0x16, 0x16, 0x04, 0x03, 0x0f, 0x1b, 0x1b, 0x09, - 0x22, 0x03, 0x22, 0x25, 0x26, 0x00, 0x26, 0x01, 0x0a, 0x03, 0x1e, 0x0c, - 0x0b, 0x0c, 0x0b, 0x50, 0x59, 0x0f, 0x0c, 0x1f, 0x0c, 0x02, 0xff, 0x0c, - 0x01, 0x0c, 0x0c, 0x18, 0x00, 0x00, 0x15, 0x50, 0x15, 0x60, 0x15, 0x70, - 0x15, 0x04, 0x12, 0x03, 0x15, 0x15, 0x18, 0x18, 0x12, 0x50, 0x59, 0x18, - 0x10, 0x00, 0x06, 0x50, 0x59, 0x60, 0x04, 0x70, 0x04, 0x80, 0x04, 0x03, - 0xef, 0x04, 0x01, 0x20, 0x04, 0x01, 0x04, 0x04, 0x00, 0x16, 0x00, 0x3f, - 0x32, 0x2f, 0x5d, 0x5d, 0x71, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x71, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x21, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, - 0x1e, 0x01, 0x15, 0x14, 0x06, 0x01, 0xca, 0xa7, 0xc5, 0x2d, 0x9f, 0x35, - 0xc9, 0x60, 0x71, 0xfe, 0xb5, 0xa1, 0x98, 0x63, 0x5d, 0x59, 0x71, 0x0c, - 0xa2, 0x2e, 0x01, 0x4b, 0xa8, 0xce, 0x91, 0x67, 0x79, 0x99, 0xd7, 0x14, - 0x7d, 0x81, 0x2c, 0xa4, 0x5e, 0x5b, 0xc8, 0x89, 0x54, 0x58, 0x4a, 0x56, - 0x4a, 0x46, 0x14, 0x01, 0x02, 0x9f, 0x7e, 0x65, 0x88, 0x09, 0x02, 0x0d, - 0x8f, 0x6d, 0x98, 0xac, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xea, - 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x46, 0x40, 0x2b, 0x0b, 0x01, 0x01, 0x0c, - 0x03, 0x06, 0x06, 0x05, 0x0c, 0x05, 0x0e, 0x0f, 0xb0, 0x0f, 0xc0, 0x0f, - 0xd0, 0x0f, 0x03, 0xb0, 0x0f, 0xf0, 0x0f, 0x02, 0x70, 0x0f, 0x80, 0x0f, - 0xa0, 0x0f, 0xb0, 0x0f, 0xc0, 0x0f, 0x05, 0x0a, 0x03, 0x0d, 0x0f, 0x06, - 0x02, 0x0c, 0x15, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x01, 0x5d, - 0x71, 0x72, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x03, 0x01, 0x33, 0x11, 0x23, 0x11, - 0x34, 0x36, 0x37, 0x01, 0x23, 0x11, 0x01, 0x3c, 0x0a, 0x01, 0xf3, 0xc5, - 0xac, 0x07, 0x03, 0xfe, 0x06, 0xc0, 0x04, 0x3a, 0xfd, 0xb0, 0xfe, 0xeb, - 0x03, 0x65, 0xfb, 0xc6, 0x02, 0x94, 0x24, 0x92, 0x1f, 0xfc, 0x97, 0x04, - 0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xea, - 0x05, 0xf0, 0x12, 0x26, 0x03, 0xe9, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfa, - 0x00, 0xea, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0e, 0x0e, 0x11, - 0x26, 0x01, 0x10, 0x02, 0x10, 0x16, 0x0c, 0x04, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x03, 0x8a, - 0x04, 0x3a, 0x00, 0x13, 0x00, 0x64, 0x40, 0x39, 0x0e, 0x0b, 0x02, 0x08, - 0x02, 0x12, 0x12, 0x13, 0x13, 0x14, 0x15, 0x07, 0x08, 0x08, 0x0d, 0x0c, - 0x0c, 0x15, 0x0f, 0x15, 0x2f, 0x15, 0x02, 0x0a, 0x03, 0x0b, 0x11, 0x02, - 0x11, 0x50, 0x59, 0x0f, 0x02, 0x3f, 0x02, 0x4f, 0x02, 0x03, 0x0f, 0x02, - 0x3f, 0x02, 0xff, 0x02, 0x03, 0x08, 0x02, 0x02, 0x0c, 0x13, 0x13, 0x0c, - 0x15, 0x07, 0x07, 0x00, 0x0f, 0x00, 0x3f, 0x32, 0x2f, 0x3f, 0x33, 0x2f, - 0x11, 0x39, 0x2f, 0x5e, 0x5d, 0x71, 0x2b, 0x11, 0x00, 0x33, 0x01, 0x5f, - 0x5e, 0x5d, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, - 0x11, 0x32, 0x3e, 0x02, 0x13, 0x33, 0x03, 0x06, 0x07, 0x01, 0x23, 0x01, - 0x0e, 0x01, 0x23, 0x11, 0x23, 0x8a, 0xb4, 0x1e, 0x30, 0x34, 0x42, 0xc3, - 0xbc, 0xd8, 0x5d, 0x23, 0x01, 0x61, 0xc8, 0xfe, 0xea, 0x13, 0x41, 0x1a, - 0xb4, 0x04, 0x3a, 0xfe, 0x26, 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, - 0x88, 0x1d, 0xfd, 0xb0, 0x01, 0xf1, 0x08, 0x0c, 0xfe, 0x23, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0b, 0xff, 0xec, 0x04, 0x1d, 0x04, 0x3a, 0x00, 0x13, - 0x00, 0x4d, 0x40, 0x33, 0x00, 0x13, 0x02, 0x11, 0x0a, 0x11, 0x13, 0x03, - 0x15, 0x14, 0x70, 0x15, 0x80, 0x15, 0x90, 0x15, 0x03, 0x70, 0x15, 0xb0, - 0x15, 0x02, 0x00, 0x15, 0x20, 0x15, 0x30, 0x15, 0x60, 0x15, 0x70, 0x15, - 0x80, 0x15, 0x06, 0x0d, 0x03, 0x11, 0x02, 0x50, 0x59, 0x11, 0x0f, 0x07, - 0x0c, 0x50, 0x59, 0x07, 0x16, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x21, 0x0a, 0x01, - 0x0e, 0x01, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, 0x1b, - 0x01, 0x21, 0x11, 0x03, 0x68, 0xfe, 0x89, 0x3b, 0x40, 0x4a, 0x6d, 0x56, - 0x32, 0x2c, 0x19, 0x2b, 0x37, 0x43, 0x37, 0x23, 0x2c, 0x02, 0xce, 0x03, - 0xb7, 0xfe, 0x4c, 0xfe, 0xcf, 0x9c, 0x4a, 0x0d, 0x81, 0x09, 0x6e, 0x01, - 0x0e, 0x01, 0x08, 0x01, 0x45, 0xfb, 0xc6, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0x00, 0x00, 0x04, 0xf3, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x46, 0x40, 0x26, - 0x0e, 0x11, 0x11, 0x10, 0x01, 0x00, 0x0b, 0x08, 0x05, 0x05, 0x06, 0x06, - 0x0b, 0x10, 0x03, 0x16, 0x15, 0x80, 0x16, 0xb0, 0x16, 0xc0, 0x16, 0x03, - 0x3f, 0x16, 0x01, 0x14, 0x02, 0x02, 0x0e, 0x07, 0x0f, 0x11, 0x0b, 0x01, - 0x06, 0x15, 0x00, 0x3f, 0x33, 0x33, 0x33, 0x3f, 0x33, 0x33, 0x11, 0x33, - 0x01, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x16, - 0x15, 0x11, 0x23, 0x11, 0x21, 0x13, 0x16, 0x17, 0x36, 0x37, 0x13, 0x21, - 0x11, 0x23, 0x11, 0x3f, 0x01, 0x03, 0x13, 0x99, 0xfe, 0xbc, 0x06, 0xae, - 0x01, 0x18, 0xdc, 0x34, 0x10, 0x16, 0x2e, 0xdc, 0x01, 0x0d, 0xad, 0x03, - 0x05, 0x03, 0xb7, 0x9c, 0x47, 0xfd, 0x2c, 0x04, 0x3a, 0xfd, 0x6b, 0x8f, - 0x8f, 0xa1, 0x7d, 0x02, 0x95, 0xfb, 0xc6, 0x02, 0xd4, 0x72, 0x73, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xdd, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x67, 0x40, 0x1e, 0x01, 0x09, 0x09, 0x0a, 0x02, 0x06, 0x06, 0x05, - 0x0a, 0x05, 0x0c, 0x0d, 0x40, 0x0d, 0x50, 0x0d, 0x60, 0x0d, 0x03, 0x40, - 0x0d, 0x80, 0x0d, 0x02, 0x00, 0x0d, 0x01, 0x10, 0x03, 0x0d, 0xb8, 0xff, - 0xc0, 0x40, 0x21, 0x13, 0x17, 0x48, 0x01, 0x08, 0x50, 0x59, 0xb0, 0x01, - 0xc0, 0x01, 0x02, 0x9f, 0x01, 0xaf, 0x01, 0xbf, 0x01, 0x03, 0x0f, 0x01, - 0x3f, 0x01, 0x02, 0x08, 0x01, 0x01, 0x0a, 0x05, 0x15, 0x03, 0x00, 0x0f, - 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x39, 0x2f, 0x5e, 0x5d, 0x71, 0x72, 0x2b, - 0x01, 0x2b, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, - 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x42, 0x01, - 0xe7, 0xb4, 0xb4, 0xfe, 0x19, 0xb4, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, - 0xfb, 0xc6, 0x01, 0xed, 0xfe, 0x13, 0x04, 0x3a, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x04, 0x4e, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xc7, 0x04, 0x3a, 0x00, 0x07, - 0x00, 0x43, 0x40, 0x2b, 0x05, 0x06, 0x02, 0x01, 0x06, 0x01, 0x08, 0x09, - 0xa0, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0x03, 0xa0, 0x09, 0xe0, 0x09, 0x02, - 0x60, 0x09, 0x90, 0x09, 0xa0, 0x09, 0xb0, 0x09, 0x04, 0x0f, 0x09, 0x01, - 0x0a, 0x03, 0x07, 0x04, 0x50, 0x59, 0x07, 0x0f, 0x06, 0x01, 0x15, 0x00, - 0x3f, 0x33, 0x3f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x72, 0x11, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, - 0x11, 0x21, 0x11, 0x23, 0x11, 0x03, 0xc7, 0xb4, 0xfe, 0x2f, 0xb4, 0x04, - 0x3a, 0xfb, 0xc6, 0x03, 0xb7, 0xfc, 0x49, 0x04, 0x3a, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x4d, 0x12, 0x06, - 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x03, 0xca, - 0x04, 0x4e, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x00, 0x23, - 0x00, 0x00, 0x03, 0x87, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x3b, 0x40, 0x22, - 0x03, 0x06, 0x02, 0x06, 0x07, 0x03, 0x08, 0x09, 0x80, 0x09, 0x01, 0x3f, - 0x09, 0x01, 0x10, 0x09, 0x20, 0x09, 0x02, 0x0f, 0x09, 0x01, 0x0b, 0x03, - 0x04, 0x15, 0x03, 0x06, 0x00, 0x06, 0x51, 0x59, 0x00, 0x0f, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x15, - 0x21, 0x11, 0x23, 0x11, 0x21, 0x23, 0x03, 0x64, 0xfe, 0xa8, 0xb4, 0xfe, - 0xa8, 0x04, 0x3a, 0x83, 0xfc, 0x49, 0x03, 0xb7, 0xff, 0xff, 0x00, 0x05, - 0xfe, 0x57, 0x03, 0xfc, 0x04, 0x3a, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x56, 0xfe, 0x57, 0x06, 0x3e, 0x05, 0xcc, 0x00, 0x25, - 0x00, 0x32, 0x00, 0x40, 0x00, 0xa2, 0x40, 0x67, 0x33, 0x00, 0x3a, 0x2c, - 0x2c, 0x1e, 0x1b, 0x0a, 0x26, 0x14, 0x14, 0x0a, 0x00, 0x03, 0x42, 0x41, - 0x05, 0x0d, 0x1f, 0x19, 0x04, 0x23, 0x03, 0x23, 0x36, 0x50, 0x59, 0x23, - 0x10, 0x1d, 0x00, 0x16, 0x30, 0x50, 0x59, 0x16, 0x10, 0x11, 0x29, 0x50, - 0x59, 0x11, 0x16, 0x09, 0x1b, 0x03, 0x3e, 0x50, 0x59, 0x03, 0x16, 0xa4, - 0x42, 0x01, 0x94, 0x42, 0x01, 0x84, 0x42, 0x01, 0x74, 0x42, 0x01, 0x64, - 0x42, 0x01, 0x54, 0x42, 0x01, 0x34, 0x42, 0x01, 0xdb, 0x42, 0x01, 0x94, - 0x42, 0x01, 0x84, 0x42, 0x01, 0x64, 0x42, 0x01, 0x54, 0x42, 0x01, 0x40, - 0x42, 0x01, 0x02, 0x30, 0x42, 0x01, 0x20, 0x42, 0x01, 0x1f, 0x42, 0x01, - 0x00, 0x42, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x10, 0x02, 0x23, 0x22, 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, - 0x34, 0x37, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, - 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, 0x07, 0x33, 0x3e, 0x01, 0x33, - 0x32, 0x12, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x05, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x1d, 0x01, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x06, 0x3e, 0xb9, 0xb4, 0xe2, 0x4f, 0x06, - 0x05, 0xaa, 0x05, 0x05, 0x2e, 0x95, 0x6f, 0xba, 0xb3, 0x01, 0x6d, 0x70, - 0x95, 0x2d, 0x05, 0x05, 0xaa, 0x03, 0x05, 0x2e, 0x90, 0x72, 0xb7, 0xb6, - 0xfa, 0xd5, 0x6d, 0x76, 0x82, 0x7a, 0x03, 0x77, 0x86, 0x79, 0x6c, 0x04, - 0x6e, 0x6b, 0x78, 0x5e, 0x6a, 0x37, 0x02, 0x7a, 0x81, 0x77, 0x6e, 0x02, - 0x22, 0xfe, 0xe4, 0xfe, 0xe6, 0xbc, 0x57, 0x53, 0xfe, 0x59, 0x01, 0xa7, - 0x6d, 0x43, 0x68, 0x5a, 0x01, 0x13, 0x01, 0x19, 0x02, 0x36, 0x5a, 0x62, - 0x97, 0x01, 0xa3, 0xfe, 0x5c, 0x9c, 0x68, 0x59, 0xfe, 0xef, 0xfe, 0xe2, - 0xe1, 0xc6, 0xc5, 0xd6, 0x18, 0xd3, 0xcc, 0xce, 0xdd, 0xda, 0xca, 0x5c, - 0xbd, 0x99, 0x17, 0xc9, 0xbf, 0xcd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, - 0x00, 0x00, 0x03, 0xea, 0x04, 0x3a, 0x12, 0x06, 0x00, 0x5b, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x68, 0x04, 0x66, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x3a, 0x40, 0x1d, 0x02, 0x05, 0x05, 0x08, 0x08, 0x07, 0x01, 0x0a, - 0x07, 0x0a, 0x0d, 0x0c, 0x0f, 0x0d, 0x01, 0x0e, 0x03, 0x05, 0x01, 0x0a, - 0x01, 0x50, 0x59, 0x0a, 0x15, 0x08, 0x03, 0x00, 0x0f, 0x00, 0x3f, 0x32, - 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, - 0x01, 0x42, 0x01, 0xdd, 0xb4, 0x93, 0xa3, 0xfc, 0xcb, 0x04, 0x3a, 0xfc, - 0x49, 0x03, 0xb7, 0xfc, 0x49, 0xfd, 0xe5, 0x01, 0x98, 0x04, 0x3a, 0x00, - 0x00, 0x01, 0x00, 0x7a, 0x00, 0x00, 0x03, 0x9c, 0x04, 0x3a, 0x00, 0x11, - 0x00, 0x38, 0x40, 0x1d, 0x05, 0x09, 0x09, 0x08, 0x01, 0x10, 0x08, 0x10, - 0x13, 0x12, 0x0a, 0x0d, 0x03, 0x0d, 0x50, 0x59, 0x05, 0x0f, 0x03, 0x1f, - 0x03, 0x02, 0x03, 0x03, 0x08, 0x15, 0x06, 0x00, 0x0f, 0x00, 0x3f, 0x32, - 0x3f, 0x39, 0x2f, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, - 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, 0x07, 0x06, 0x23, - 0x22, 0x26, 0x35, 0x11, 0x01, 0x2e, 0xa6, 0x6e, 0xa6, 0xb4, 0xb4, 0x4e, - 0x92, 0x7e, 0x81, 0x8f, 0x04, 0x3a, 0xfe, 0x6e, 0xa2, 0x2f, 0x02, 0x05, - 0xfb, 0xc6, 0x01, 0xcd, 0x1e, 0x38, 0x9b, 0x8d, 0x01, 0x9b, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x05, 0xdd, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x57, 0x40, 0x21, 0x03, 0x00, 0x07, 0x04, 0x08, 0x0b, 0x0b, 0x04, - 0x00, 0x03, 0x0c, 0x0d, 0xab, 0x0d, 0x01, 0x64, 0x0d, 0x84, 0x0d, 0x02, - 0x30, 0x0d, 0x01, 0x02, 0x20, 0x0d, 0x01, 0x0f, 0x0d, 0x01, 0x0d, 0x03, - 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0c, 0x48, 0x09, 0x05, 0x01, - 0x0f, 0x07, 0x03, 0x00, 0x03, 0x50, 0x59, 0x00, 0x15, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x33, 0x01, 0x2b, 0x5f, 0x5e, 0x5d, - 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, - 0x11, 0x21, 0x11, 0x33, 0x11, 0x8e, 0xb4, 0x01, 0x9a, 0xb4, 0x01, 0x99, - 0xb4, 0x04, 0x3a, 0xfc, 0x49, 0x03, 0xb7, 0xfc, 0x49, 0x03, 0xb7, 0xfb, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x68, 0x06, 0x66, - 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x3b, 0x08, 0x0b, 0x0b, 0x0e, - 0x0e, 0x0d, 0x07, 0x04, 0x03, 0x00, 0x00, 0x04, 0x0d, 0x03, 0x11, 0x10, - 0xdb, 0x11, 0x01, 0xb4, 0x11, 0x01, 0x60, 0x11, 0x90, 0x11, 0x02, 0x02, - 0x40, 0x11, 0x50, 0x11, 0x02, 0x3f, 0x11, 0x01, 0x00, 0x11, 0x10, 0x11, - 0x20, 0x11, 0x03, 0x0a, 0x03, 0x0e, 0x09, 0x05, 0x01, 0x0f, 0x0b, 0x07, - 0x03, 0x00, 0x03, 0x50, 0x59, 0x00, 0x15, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x33, 0x18, 0x3f, 0x33, 0x33, 0x2f, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, - 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, - 0x11, 0x8e, 0xb4, 0x01, 0x95, 0xb4, 0x01, 0x94, 0xb4, 0x93, 0xa3, 0x04, - 0x3a, 0xfc, 0x49, 0x03, 0xb7, 0xfc, 0x49, 0x03, 0xb7, 0xfc, 0x49, 0xfd, - 0xe5, 0x01, 0x98, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x04, 0xac, - 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x69, 0x40, 0x15, 0x0c, 0x09, - 0x0d, 0x0d, 0x07, 0x11, 0x03, 0x03, 0x07, 0x17, 0x16, 0x0f, 0x17, 0x01, - 0x16, 0x00, 0x17, 0x01, 0x1c, 0x03, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x27, - 0x1e, 0x23, 0x48, 0x0c, 0x15, 0x51, 0x59, 0xaf, 0x0c, 0xbf, 0x0c, 0xcf, - 0x0c, 0x03, 0x0f, 0x0c, 0x1f, 0x0c, 0x4f, 0x0c, 0x03, 0x07, 0x03, 0x0c, - 0x0c, 0x07, 0x0a, 0x0a, 0x09, 0x50, 0x59, 0x0a, 0x0f, 0x07, 0x0d, 0x51, - 0x59, 0x07, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x01, 0x2b, 0x5f, - 0x5e, 0x5d, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x21, 0x11, 0x21, 0x35, 0x21, 0x19, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x2b, 0x01, 0x03, 0x0d, 0xcd, 0xd2, 0xd8, 0xc6, 0xfe, 0x67, 0xfe, - 0xb8, 0x01, 0xfc, 0xca, 0x82, 0x78, 0x74, 0x85, 0xcb, 0x02, 0x70, 0x93, - 0x9f, 0x9a, 0xa4, 0x03, 0xb7, 0x83, 0xfe, 0x36, 0xfe, 0x0f, 0x5c, 0x63, - 0x5e, 0x57, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8e, 0x00, 0x00, 0x05, 0x32, - 0x04, 0x3a, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x17, 0x00, 0x52, 0x40, 0x30, - 0x0a, 0x0b, 0x0b, 0x07, 0x03, 0x0f, 0x14, 0x17, 0x17, 0x0f, 0x07, 0x03, - 0x18, 0x19, 0x0a, 0x13, 0x51, 0x59, 0xaf, 0x0a, 0xbf, 0x0a, 0xcf, 0x0a, - 0x03, 0x0f, 0x0a, 0x1f, 0x0a, 0x4f, 0x0a, 0x03, 0x07, 0x03, 0x0a, 0x0a, - 0x07, 0x15, 0x08, 0x0f, 0x14, 0x07, 0x07, 0x0b, 0x51, 0x59, 0x07, 0x15, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, - 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x21, 0x11, 0x33, 0x19, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x33, 0x11, 0x02, 0x26, 0xcd, 0xd2, - 0xd8, 0xc6, 0xfe, 0x67, 0xb4, 0xca, 0x82, 0x78, 0x74, 0x85, 0xcb, 0x03, - 0x3c, 0xb4, 0x02, 0x70, 0x93, 0x9f, 0x9a, 0xa4, 0x04, 0x3a, 0xfe, 0x36, - 0xfe, 0x0f, 0x5c, 0x63, 0x5e, 0x57, 0xfe, 0x0d, 0x04, 0x3a, 0xfb, 0xc6, - 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xd7, 0x04, 0x3a, 0x00, 0x0a, - 0x00, 0x13, 0x00, 0x6a, 0x40, 0x48, 0x0a, 0x0b, 0x0b, 0x07, 0x0f, 0x03, - 0x07, 0x03, 0x14, 0x15, 0x7f, 0x15, 0xff, 0x15, 0x02, 0x0f, 0x15, 0x2f, - 0x15, 0x4f, 0x15, 0x6f, 0x15, 0x8f, 0x15, 0x9f, 0x15, 0xaf, 0x15, 0xcf, - 0x15, 0xff, 0x15, 0x09, 0x0a, 0x03, 0x15, 0x40, 0x23, 0x27, 0x48, 0x0a, - 0x13, 0x51, 0x59, 0xaf, 0x0a, 0xbf, 0x0a, 0xcf, 0x0a, 0x03, 0x0f, 0x0a, - 0x1f, 0x0a, 0x4f, 0x0a, 0x03, 0x07, 0x03, 0x0a, 0x0a, 0x07, 0x08, 0x0f, - 0x07, 0x0b, 0x51, 0x59, 0x07, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x01, 0x2b, 0x5f, 0x5e, - 0x5d, 0x71, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x33, - 0x19, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x02, 0x38, - 0xcd, 0xd2, 0xd8, 0xc6, 0xfe, 0x55, 0xb4, 0xdc, 0x82, 0x78, 0x74, 0x85, - 0xdd, 0x02, 0x70, 0x93, 0x9f, 0x9a, 0xa4, 0x04, 0x3a, 0xfe, 0x36, 0xfe, - 0x0f, 0x5c, 0x63, 0x5e, 0x57, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, - 0xff, 0xec, 0x03, 0xbe, 0x04, 0x4e, 0x00, 0x1b, 0x00, 0x99, 0x40, 0x42, - 0x0a, 0x07, 0x07, 0x16, 0x0f, 0x10, 0x10, 0x01, 0x00, 0x00, 0x08, 0x16, - 0x03, 0x1d, 0x1c, 0x09, 0x08, 0x50, 0x59, 0x0f, 0x09, 0x1f, 0x09, 0x6f, - 0x09, 0x7f, 0x09, 0x8f, 0x09, 0x05, 0x0f, 0x09, 0xcf, 0x09, 0xdf, 0x09, - 0x03, 0x0b, 0x03, 0x09, 0x09, 0x19, 0x13, 0x19, 0x04, 0x50, 0x59, 0x00, - 0x01, 0x10, 0x01, 0x20, 0x01, 0x60, 0x01, 0x70, 0x01, 0x80, 0x01, 0xc0, - 0x01, 0xd0, 0x01, 0x08, 0x09, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x1b, - 0x22, 0x48, 0x01, 0x01, 0x19, 0x16, 0x0f, 0x0f, 0x1f, 0x0f, 0x6f, 0x0f, - 0x7f, 0x0f, 0xcf, 0x0f, 0x05, 0x0a, 0x03, 0x0f, 0x40, 0x1d, 0x20, 0x48, - 0x0f, 0x0f, 0x13, 0x13, 0x0d, 0x50, 0x59, 0x13, 0x10, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x5f, 0x5e, 0x5d, 0x3f, 0x33, 0x2f, - 0x2b, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x37, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x27, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x37, - 0xb6, 0x10, 0x85, 0x64, 0x81, 0x8e, 0x0c, 0xfe, 0x63, 0x01, 0x9d, 0x08, - 0x87, 0x8a, 0xd2, 0x20, 0xb9, 0x1c, 0xdf, 0xab, 0xe6, 0xf5, 0xf5, 0xe8, - 0xb1, 0xe4, 0x01, 0x3b, 0x0c, 0x6c, 0x68, 0xb1, 0xbe, 0x83, 0xbd, 0xa6, - 0xc4, 0x0e, 0x95, 0xa7, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xec, 0xfe, 0xe2, - 0xb4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, 0xff, 0xec, 0x05, 0xaa, - 0x04, 0x4e, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x4f, 0x40, 0x2b, 0x12, 0x00, - 0x18, 0x0d, 0x06, 0x0c, 0x08, 0x08, 0x09, 0x09, 0x06, 0x00, 0x03, 0x1f, - 0x1e, 0x0f, 0x15, 0x50, 0x59, 0x0f, 0x10, 0x0c, 0x07, 0x50, 0x59, 0x0f, - 0x0c, 0x01, 0x0b, 0x03, 0x0c, 0x0c, 0x09, 0x0a, 0x0f, 0x09, 0x15, 0x03, - 0x1b, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x02, 0x27, 0x23, 0x11, - 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x21, 0x32, 0x12, 0x03, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x05, 0xaa, 0xeb, - 0xdf, 0xd4, 0xe3, 0x09, 0xde, 0xb4, 0xb4, 0xdf, 0x21, 0x01, 0xa4, 0xed, - 0xd7, 0xbd, 0x78, 0x8c, 0x8e, 0x7f, 0x7e, 0x85, 0x92, 0x7c, 0x02, 0x1e, - 0xfe, 0xe4, 0xfe, 0xea, 0x01, 0x07, 0xfa, 0xfe, 0x13, 0x04, 0x3a, 0xfe, - 0x36, 0x01, 0xde, 0xfe, 0xe8, 0xfe, 0xe8, 0xe0, 0xcb, 0xcf, 0xdc, 0xda, - 0xd3, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x03, 0xc7, - 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x53, 0x40, 0x2a, 0x00, 0x03, - 0x03, 0x15, 0x05, 0x15, 0x0b, 0x0b, 0x0a, 0x11, 0x05, 0x05, 0x01, 0x02, - 0x0a, 0x02, 0x17, 0x16, 0x03, 0x00, 0x14, 0x00, 0x51, 0x59, 0x0f, 0x14, - 0x01, 0x0b, 0x03, 0x14, 0x14, 0x01, 0x08, 0x08, 0x0e, 0x51, 0x59, 0x08, - 0x0f, 0x0b, 0x01, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x09, 0x01, 0x23, 0x01, 0x26, - 0x11, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x19, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x3b, 0x01, 0x02, 0x17, 0xfe, 0xc5, 0xcb, 0x01, 0x58, - 0xf9, 0xd8, 0xcf, 0x01, 0xb0, 0xb4, 0xea, 0x82, 0x78, 0x6b, 0x7c, 0xfd, - 0x01, 0xca, 0xfe, 0x36, 0x01, 0xd7, 0x33, 0x01, 0x05, 0x95, 0x96, 0xfb, - 0xc6, 0x01, 0xca, 0x01, 0xf1, 0x5c, 0x5d, 0x5e, 0x5d, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, 0x00, 0xc6, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x1f, 0x1f, 0x11, 0x26, 0x02, 0x1c, 0xb8, 0xff, - 0xcd, 0xb4, 0x1c, 0x1f, 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, - 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x1a, 0x1a, - 0x11, 0x26, 0x03, 0x02, 0x1e, 0x04, 0x1e, 0x1c, 0x0c, 0x11, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x01, 0x00, 0x0a, - 0xfe, 0x57, 0x03, 0xee, 0x05, 0xcc, 0x00, 0x29, 0x00, 0x7b, 0x40, 0x41, - 0x0a, 0x07, 0x29, 0x29, 0x04, 0x03, 0x00, 0x00, 0x1b, 0x16, 0x09, 0x04, - 0x2a, 0x20, 0x2b, 0x8f, 0x2b, 0x01, 0x40, 0x2b, 0x50, 0x2b, 0x60, 0x2b, - 0x03, 0x40, 0x2b, 0x80, 0x2b, 0x02, 0x00, 0x2b, 0x30, 0x2b, 0x40, 0x2b, - 0x03, 0x10, 0x03, 0x0e, 0x12, 0x29, 0x15, 0x19, 0x1d, 0x50, 0x59, 0x19, - 0x1b, 0x0a, 0x02, 0x03, 0x02, 0x51, 0x59, 0x07, 0x03, 0x03, 0x12, 0x05, - 0x12, 0x25, 0x50, 0x59, 0x12, 0xb8, 0xff, 0xc0, 0xb6, 0x07, 0x0c, 0x48, - 0x12, 0x0f, 0x05, 0x00, 0x00, 0x3f, 0x3f, 0x2b, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x5d, 0x11, - 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, - 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, - 0x15, 0x14, 0x06, 0x07, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, - 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x35, 0x11, 0x34, - 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x8e, 0x84, 0x84, 0xb4, 0x01, - 0x2c, 0xfe, 0xd4, 0x07, 0x01, 0x03, 0x3a, 0xa3, 0x7d, 0xb0, 0xa7, 0x78, - 0x78, 0x4d, 0x32, 0x3e, 0x46, 0x36, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0x04, - 0xb6, 0x83, 0x93, 0x93, 0x83, 0x94, 0x3d, 0x82, 0x0a, 0x6a, 0x63, 0xaf, - 0xce, 0xfc, 0xd1, 0x99, 0x8a, 0x09, 0x8b, 0x06, 0x48, 0x68, 0x02, 0xf1, - 0x72, 0x6f, 0x34, 0xb0, 0x95, 0xfd, 0xaa, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0x00, 0x00, 0x02, 0xc8, 0x05, 0xe4, 0x12, 0x26, 0x03, 0xe4, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x76, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x06, 0x11, 0x26, 0x01, 0x06, 0x55, 0x06, 0x09, 0x04, 0x00, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xde, 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x9f, 0x40, 0x5c, - 0x0a, 0x09, 0x09, 0x17, 0x18, 0x0f, 0x12, 0x12, 0x03, 0x03, 0x11, 0x18, - 0x03, 0x1c, 0x1b, 0x0f, 0x1c, 0x01, 0x0a, 0x03, 0x0f, 0x12, 0x50, 0x59, - 0x0f, 0x0f, 0x1f, 0x0f, 0x6f, 0x0f, 0x7f, 0x0f, 0x8f, 0x0f, 0x05, 0x0f, - 0x0f, 0xcf, 0x0f, 0xdf, 0x0f, 0x03, 0x0b, 0x03, 0x0f, 0x0f, 0x00, 0x06, - 0x06, 0x0c, 0x50, 0x59, 0x1f, 0x0a, 0x2f, 0x0a, 0x7f, 0x0a, 0x8f, 0x0a, - 0xdf, 0x0a, 0x05, 0x0a, 0x40, 0x1d, 0x20, 0x48, 0x0a, 0x0a, 0x06, 0x10, - 0x00, 0x17, 0x10, 0x17, 0x20, 0x17, 0x60, 0x17, 0x70, 0x17, 0x80, 0x17, - 0xc0, 0x17, 0xd0, 0x17, 0x08, 0x09, 0x03, 0x17, 0xb8, 0xff, 0xc0, 0x40, - 0x0c, 0x1b, 0x22, 0x48, 0x17, 0x17, 0x00, 0x00, 0x14, 0x50, 0x59, 0x00, - 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x5f, 0x5e, - 0x5d, 0x3f, 0x33, 0x2f, 0x2b, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x05, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x21, 0x12, 0x21, 0x32, 0x36, - 0x37, 0x17, 0x0e, 0x01, 0x02, 0x34, 0xe8, 0xf5, 0xf4, 0xe7, 0xab, 0xde, - 0x1d, 0xb9, 0x20, 0xd2, 0x8b, 0x86, 0x08, 0x01, 0x9c, 0xfe, 0x63, 0x12, - 0x01, 0x0a, 0x64, 0x85, 0x10, 0xb6, 0x15, 0xe4, 0x14, 0x01, 0x1f, 0x01, - 0x13, 0x01, 0x0f, 0x01, 0x21, 0xa7, 0x95, 0x0e, 0xc4, 0xa7, 0xbc, 0x83, - 0xfe, 0x91, 0x67, 0x6d, 0x0c, 0x9a, 0xb5, 0x00, 0xff, 0xff, 0x00, 0x39, - 0xff, 0xec, 0x03, 0xb6, 0x04, 0x4b, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x89, 0x00, 0x00, 0x01, 0x3d, 0x05, 0xcc, 0x12, 0x06, - 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x02, 0x25, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, - 0xcb, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x04, 0x04, 0x11, 0x26, - 0x02, 0x01, 0x08, 0xb8, 0xff, 0xf3, 0xb4, 0x08, 0x06, 0x00, 0x02, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xce, 0xfe, 0x57, 0x01, 0x3d, 0x05, 0xcc, 0x12, 0x06, - 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0xff, 0xec, 0x06, 0xec, - 0x04, 0x3a, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x7d, 0x40, 0x14, 0x1f, 0x03, - 0x1a, 0x1b, 0x1b, 0x07, 0x09, 0x18, 0x18, 0x11, 0x11, 0x07, 0x03, 0x03, - 0x25, 0x24, 0x20, 0x25, 0x01, 0x25, 0xb8, 0xff, 0xc0, 0x40, 0x35, 0x1e, - 0x23, 0x48, 0xcf, 0x25, 0x01, 0x00, 0x25, 0x01, 0x0a, 0x03, 0x1a, 0x23, - 0x51, 0x59, 0xaf, 0x1a, 0xbf, 0x1a, 0xcf, 0x1a, 0x03, 0x0f, 0x1a, 0x1f, - 0x1a, 0x4f, 0x1a, 0x03, 0x07, 0x03, 0x1a, 0x1a, 0x07, 0x18, 0x18, 0x09, - 0x50, 0x59, 0x18, 0x0f, 0x0e, 0x13, 0x50, 0x59, 0x0e, 0x16, 0x07, 0x1b, - 0x51, 0x59, 0x07, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x71, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x71, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x0a, - 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, - 0x1b, 0x01, 0x21, 0x19, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, - 0x01, 0x05, 0x4d, 0xcd, 0xd2, 0xd8, 0xc6, 0xfe, 0x3e, 0xfe, 0x65, 0x3b, - 0x40, 0x4a, 0x6d, 0x56, 0x32, 0x2c, 0x19, 0x2b, 0x37, 0x43, 0x37, 0x23, - 0x2c, 0x02, 0xf2, 0xf2, 0x82, 0x78, 0x74, 0x85, 0xf3, 0x02, 0x70, 0x93, - 0x9f, 0x9a, 0xa4, 0x03, 0xb7, 0xfe, 0x4c, 0xfe, 0xcf, 0x9c, 0x4a, 0x0d, - 0x81, 0x09, 0x6e, 0x01, 0x0e, 0x01, 0x08, 0x01, 0x45, 0xfe, 0x36, 0xfe, - 0x0f, 0x5c, 0x63, 0x5e, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, - 0x00, 0x00, 0x06, 0x2c, 0x04, 0x3a, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x7a, - 0x40, 0x15, 0x17, 0x05, 0x01, 0x13, 0x13, 0x11, 0x09, 0x10, 0x0c, 0x0c, - 0x0d, 0x0d, 0x09, 0x05, 0x03, 0x1d, 0x1c, 0x60, 0x1d, 0x01, 0x1d, 0xb8, - 0xff, 0xc0, 0x40, 0x31, 0x1e, 0x23, 0x48, 0x0f, 0x1d, 0x01, 0x16, 0x03, - 0x01, 0x1b, 0x51, 0x59, 0x01, 0x01, 0x10, 0x10, 0x0b, 0x50, 0x59, 0xaf, - 0x10, 0xbf, 0x10, 0xcf, 0x10, 0x03, 0x0f, 0x10, 0x1f, 0x10, 0x4f, 0x10, - 0x03, 0x07, 0x03, 0x10, 0x10, 0x00, 0x0d, 0x15, 0x09, 0x13, 0x51, 0x59, - 0x09, 0x15, 0x0e, 0x00, 0x0f, 0x00, 0x3f, 0x32, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x2b, 0x01, 0x5f, 0x5e, 0x5d, 0x2b, 0x5d, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, - 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x13, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x03, 0xa9, 0xe4, 0xcd, 0xd2, 0xd8, - 0xc6, 0xfe, 0x66, 0xfe, 0x4e, 0xb4, 0xb4, 0x01, 0xb2, 0xb5, 0xca, 0x82, - 0x78, 0x74, 0x85, 0xcb, 0x04, 0x3a, 0xfe, 0x36, 0x93, 0x9f, 0x9a, 0xa4, - 0x01, 0xed, 0xfe, 0x13, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, 0xfc, 0x45, - 0x5c, 0x63, 0x5e, 0x57, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xcc, 0x00, 0x20, 0x00, 0x6f, 0x40, 0x3c, 0x1c, 0x19, 0x11, 0x11, - 0x16, 0x15, 0x12, 0x07, 0x1a, 0x12, 0x03, 0x21, 0x08, 0x22, 0x40, 0x22, - 0x50, 0x22, 0x60, 0x22, 0x03, 0x40, 0x22, 0x80, 0x22, 0x02, 0x8f, 0x22, - 0x01, 0x00, 0x22, 0x30, 0x22, 0x40, 0x22, 0x03, 0x10, 0x03, 0x1c, 0x14, - 0x15, 0x14, 0x51, 0x59, 0x19, 0x15, 0x15, 0x03, 0x17, 0x00, 0x12, 0x07, - 0x15, 0x00, 0x0d, 0x03, 0x0d, 0x50, 0x59, 0x03, 0xb8, 0xff, 0xc0, 0xb4, - 0x07, 0x0c, 0x48, 0x03, 0x0f, 0x00, 0x3f, 0x2b, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x72, 0x11, 0x33, 0x12, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, - 0x15, 0x21, 0x15, 0x14, 0x06, 0x07, 0x01, 0x3d, 0x3a, 0xa3, 0x7d, 0xb0, - 0xa7, 0xb5, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0x84, 0x84, 0xb4, 0x01, - 0x2c, 0xfe, 0xd4, 0x07, 0x01, 0x03, 0x59, 0x6a, 0x63, 0xaf, 0xce, 0xfd, - 0x57, 0x02, 0x86, 0x72, 0x6f, 0x34, 0xb0, 0x95, 0xfd, 0xaa, 0x04, 0xb6, - 0x83, 0x93, 0x93, 0x83, 0x94, 0x3d, 0x82, 0x0a, 0xff, 0xff, 0x00, 0x8a, - 0x00, 0x00, 0x03, 0x8a, 0x05, 0xe4, 0x12, 0x26, 0x03, 0xeb, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x76, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x14, 0x11, 0x26, 0x01, 0x14, 0x51, 0x14, 0x17, 0x00, 0x0c, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0x00, 0x00, 0x03, 0xea, 0x05, 0xe4, 0x12, 0x26, 0x03, 0xe9, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x13, 0x13, 0x11, 0x26, 0x01, 0x10, 0xb8, 0xff, 0xac, 0xb4, 0x10, 0x13, - 0x0d, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xf0, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfa, 0x00, 0xb7, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x17, 0x17, 0x11, 0x26, 0x01, 0x19, 0x0a, - 0x19, 0x1f, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x68, 0x03, 0xdd, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x4c, 0x40, 0x2e, 0x04, 0x07, 0x09, 0x0a, 0x03, 0x00, 0x00, 0x0a, - 0x07, 0x03, 0x0d, 0x0c, 0x40, 0x0d, 0x50, 0x0d, 0x60, 0x0d, 0x03, 0x40, - 0x0d, 0x80, 0x0d, 0x02, 0x00, 0x0d, 0x30, 0x0d, 0x40, 0x0d, 0x50, 0x0d, - 0x04, 0x10, 0x03, 0x09, 0x05, 0x01, 0x0f, 0x08, 0x00, 0x00, 0x03, 0x50, - 0x59, 0x00, 0x00, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, - 0x01, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, - 0x33, 0x11, 0x21, 0x11, 0x23, 0x11, 0x8e, 0xb4, 0x01, 0xe7, 0xb4, 0xfe, - 0xaa, 0xa3, 0x04, 0x3a, 0xfc, 0x49, 0x03, 0xb7, 0xfb, 0xc6, 0xfe, 0x68, - 0x01, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0xff, 0xec, 0x0a, 0x46, - 0x05, 0x96, 0x00, 0x34, 0x00, 0x5a, 0x40, 0x2e, 0x09, 0x0f, 0x03, 0x03, - 0x27, 0x00, 0x00, 0x15, 0x2d, 0x21, 0x15, 0x21, 0x36, 0x35, 0x1b, 0x01, - 0x01, 0x1d, 0x24, 0x24, 0x2a, 0x5f, 0x59, 0x28, 0x24, 0x04, 0x1d, 0x31, - 0x5f, 0x59, 0x1d, 0x13, 0x19, 0x06, 0x5f, 0x59, 0x19, 0x13, 0x0e, 0x12, - 0x12, 0x0c, 0x5f, 0x59, 0x12, 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, - 0x01, 0x11, 0x33, 0x11, 0x1e, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, - 0x23, 0x22, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x14, 0x02, - 0x04, 0x23, 0x20, 0x27, 0x06, 0x21, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, - 0x21, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x00, 0x11, 0x14, 0x12, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x05, 0x02, 0xbf, 0x4a, 0xe1, 0x85, 0xf0, - 0x01, 0x23, 0xfe, 0xfd, 0xeb, 0xba, 0x7f, 0x74, 0x4d, 0xcf, 0x93, 0x01, - 0x42, 0x01, 0x6c, 0xad, 0xfe, 0xbf, 0xd8, 0xfe, 0xa8, 0xcc, 0xce, 0xfe, - 0xaa, 0xd7, 0xfe, 0xbf, 0xae, 0x01, 0x6c, 0x01, 0x42, 0x93, 0xcf, 0x4d, - 0x74, 0x7f, 0xba, 0xea, 0xfe, 0xfc, 0x84, 0xf2, 0x9d, 0x87, 0xe2, 0x4f, - 0x01, 0x32, 0x01, 0x89, 0xfe, 0x71, 0x4c, 0x56, 0x01, 0x3b, 0x01, 0x02, - 0x01, 0x07, 0x01, 0x2c, 0x68, 0x7c, 0x47, 0x41, 0xfe, 0x82, 0xfe, 0xaf, - 0xda, 0xfe, 0xb2, 0xb3, 0xb2, 0xb2, 0xb2, 0x01, 0x4e, 0xdb, 0x01, 0x51, - 0x01, 0x7e, 0x41, 0x47, 0x7c, 0x68, 0xfe, 0xd3, 0xfe, 0xfa, 0xa8, 0xfe, - 0xfa, 0x8f, 0x58, 0x52, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xc9, - 0x04, 0x3a, 0x00, 0x15, 0x00, 0x38, 0x40, 0x1c, 0x13, 0x02, 0x0f, 0x0e, - 0x0e, 0x0c, 0x0b, 0x0a, 0x0a, 0x0c, 0x07, 0x10, 0x02, 0x05, 0x17, 0x16, - 0x10, 0x0c, 0x0c, 0x07, 0x09, 0x15, 0x0e, 0x0a, 0x0f, 0x06, 0x09, 0x15, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x16, 0x15, 0x14, 0x02, 0x07, 0x23, 0x0b, 0x01, 0x23, - 0x01, 0x33, 0x01, 0x13, 0x03, 0x33, 0x13, 0x36, 0x12, 0x35, 0x34, 0x27, - 0x04, 0x97, 0x32, 0x90, 0x8c, 0xa0, 0x6f, 0x87, 0xaa, 0xfe, 0xa2, 0xb7, - 0x01, 0x0b, 0x92, 0x89, 0xb7, 0xe0, 0x53, 0x5c, 0x30, 0x04, 0x3a, 0x79, - 0x8e, 0xa7, 0xfe, 0x5d, 0xe9, 0x01, 0x88, 0xfe, 0x78, 0x04, 0x3a, 0xfc, - 0x6e, 0x01, 0xae, 0x01, 0xe4, 0xfc, 0x6e, 0x9a, 0x01, 0x4b, 0x97, 0x9c, - 0x7a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x05, 0xe8, - 0x05, 0x81, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x4d, 0x40, 0x29, 0x13, 0x0c, - 0x08, 0x04, 0x18, 0x18, 0x01, 0x10, 0x00, 0x10, 0x06, 0x0c, 0x04, 0x1c, - 0x1b, 0x08, 0x17, 0x5f, 0x59, 0x07, 0x12, 0x00, 0x12, 0x60, 0x59, 0x04, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x02, 0x10, 0x18, 0x5f, 0x59, 0x10, - 0x12, 0x02, 0x03, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x21, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x32, - 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, - 0x21, 0x11, 0x21, 0x20, 0x15, 0x01, 0x8c, 0xbf, 0x01, 0x8b, 0xfe, 0x75, - 0x01, 0x97, 0xec, 0x01, 0x05, 0xfe, 0xfe, 0xe3, 0xfd, 0x9e, 0xfe, 0x74, - 0x05, 0x13, 0xa4, 0xa4, 0xfe, 0x80, 0x01, 0x88, 0x01, 0x40, 0x04, 0xaa, - 0xd7, 0xd7, 0x93, 0xea, 0xd2, 0xbe, 0xbb, 0xe2, 0x04, 0x17, 0xfd, 0x80, - 0x79, 0x83, 0xfe, 0x04, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x04, 0xa6, - 0x05, 0xcb, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x4b, 0x40, 0x28, 0x16, 0x0c, - 0x08, 0x04, 0x13, 0x13, 0x01, 0x10, 0x00, 0x10, 0x06, 0x0c, 0x04, 0x1c, - 0x1b, 0x08, 0x1a, 0x51, 0x59, 0x08, 0x08, 0x10, 0x00, 0x10, 0x13, 0x51, - 0x59, 0x10, 0x15, 0x02, 0x00, 0x07, 0x12, 0x00, 0x12, 0x50, 0x59, 0x04, - 0x00, 0x0f, 0x00, 0x3f, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x01, 0x33, 0x32, 0x35, 0x34, 0x26, - 0x2b, 0x01, 0x15, 0x01, 0x2d, 0xb4, 0x01, 0x2a, 0xfe, 0xd6, 0x01, 0x11, - 0xcd, 0xd2, 0xd9, 0xc5, 0xfe, 0x3a, 0xfe, 0xd3, 0x01, 0xe1, 0xf7, 0xfa, - 0x74, 0x85, 0xf8, 0x04, 0x3a, 0x01, 0x91, 0xfe, 0x6f, 0x8b, 0xfe, 0xe5, - 0xa8, 0x9f, 0x9d, 0xb0, 0x03, 0xaf, 0xfc, 0xd0, 0xce, 0x5e, 0x66, 0x00, - 0x00, 0x01, 0x00, 0xbd, 0xff, 0xec, 0x07, 0x40, 0x05, 0x96, 0x00, 0x21, - 0x00, 0x81, 0x40, 0x4b, 0x03, 0x21, 0x21, 0x00, 0x11, 0x09, 0x10, 0x10, - 0x13, 0x13, 0x04, 0x1f, 0x0a, 0x09, 0x09, 0x18, 0x19, 0x19, 0x1f, 0x00, - 0x03, 0x22, 0x23, 0x00, 0x18, 0x10, 0x18, 0x40, 0x18, 0x50, 0x18, 0x90, - 0x18, 0xa0, 0x18, 0xd0, 0x18, 0xe0, 0x18, 0x08, 0x0c, 0x03, 0x18, 0x18, - 0x1c, 0x1c, 0x16, 0x5f, 0x59, 0x1c, 0x13, 0x07, 0x0d, 0x5f, 0x59, 0x0a, - 0x0a, 0x07, 0x04, 0x13, 0x20, 0x03, 0x20, 0x5f, 0x59, 0x10, 0x2f, 0x03, - 0x01, 0x03, 0x03, 0x01, 0x03, 0x00, 0x12, 0x00, 0x3f, 0x3f, 0x39, 0x2f, - 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x12, 0x00, 0x21, 0x20, 0x13, 0x07, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x00, 0x33, 0x20, 0x13, - 0x17, 0x06, 0x04, 0x23, 0x20, 0x00, 0x03, 0x23, 0x11, 0xbd, 0xbf, 0xca, - 0x15, 0x01, 0x61, 0x01, 0x2b, 0x01, 0xbd, 0x8f, 0xb5, 0x32, 0xd0, 0x93, - 0xd4, 0xf8, 0x15, 0x02, 0x7a, 0xfd, 0x86, 0x13, 0x01, 0x02, 0xd4, 0x01, - 0x24, 0x8f, 0x9c, 0x63, 0xfe, 0xda, 0xcf, 0xfe, 0xd1, 0xfe, 0x9f, 0x13, - 0xc9, 0x05, 0x81, 0xfd, 0x96, 0x01, 0x31, 0x01, 0x4e, 0xfe, 0xa3, 0x3c, - 0x7e, 0x7f, 0xfc, 0xe6, 0x9a, 0xe7, 0xfe, 0xf2, 0x01, 0x24, 0x4d, 0xc3, - 0xb1, 0x01, 0x5d, 0x01, 0x35, 0xfd, 0x82, 0x00, 0x00, 0x01, 0x00, 0x88, - 0xff, 0xec, 0x05, 0x78, 0x04, 0x4e, 0x00, 0x21, 0x00, 0x91, 0x40, 0x5a, - 0x0a, 0x19, 0x03, 0x21, 0x21, 0x10, 0x13, 0x13, 0x04, 0x1f, 0x1f, 0x12, - 0x00, 0x19, 0x19, 0x00, 0x23, 0x22, 0x20, 0x18, 0x70, 0x18, 0x80, 0x18, - 0xd0, 0x18, 0xe0, 0x18, 0x05, 0x00, 0x18, 0x10, 0x18, 0x60, 0x18, 0x70, - 0x18, 0x80, 0x18, 0xc0, 0x18, 0xd0, 0x18, 0x07, 0x09, 0x03, 0x18, 0x18, - 0x1c, 0x1c, 0x15, 0x50, 0x59, 0x1c, 0x16, 0x07, 0x0d, 0x50, 0x59, 0x0f, - 0x0b, 0x6f, 0x0b, 0x7f, 0x0b, 0xcf, 0x0b, 0x04, 0x0a, 0x03, 0x0b, 0x0b, - 0x07, 0x10, 0x13, 0x20, 0x03, 0x20, 0x51, 0x59, 0x10, 0x2f, 0x03, 0x01, - 0x03, 0x03, 0x01, 0x0f, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x39, 0x2f, 0x5d, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, 0x5f, 0x5e, 0x5d, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x71, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x32, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, - 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x21, 0x12, 0x21, 0x32, 0x36, 0x37, - 0x17, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x27, 0x23, 0x11, 0x88, 0xb4, 0xb7, - 0x0f, 0xf4, 0xd6, 0xab, 0xde, 0x1d, 0xb9, 0x20, 0xd2, 0x8b, 0x86, 0x08, - 0x01, 0x9c, 0xfe, 0x63, 0x12, 0x01, 0x0a, 0x64, 0x85, 0x10, 0xb6, 0x15, - 0xe4, 0xb1, 0xdb, 0xf3, 0x0e, 0xb6, 0x04, 0x3a, 0xfe, 0x2b, 0xef, 0xfa, - 0xa7, 0x95, 0x0e, 0xc4, 0xa7, 0xbc, 0x83, 0xfe, 0x91, 0x67, 0x6d, 0x0c, - 0x9a, 0xb5, 0x01, 0x00, 0xf6, 0xfe, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x40, - 0x40, 0x20, 0x07, 0x06, 0x02, 0x03, 0x11, 0x0a, 0x0a, 0x10, 0x0b, 0x03, - 0x06, 0x0b, 0x03, 0x16, 0x15, 0x09, 0x01, 0x10, 0x01, 0x5f, 0x59, 0x0c, - 0x04, 0x10, 0x10, 0x03, 0x04, 0x03, 0x0b, 0x07, 0x03, 0x12, 0x00, 0x3f, - 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x03, 0x23, 0x01, 0x33, 0x01, 0x23, - 0x03, 0x23, 0x11, 0x23, 0x13, 0x07, 0x0e, 0x01, 0x03, 0x21, 0x03, 0x26, - 0x27, 0x02, 0x54, 0xb9, 0xd1, 0xc6, 0x02, 0x3f, 0xd9, 0x02, 0x36, 0xc3, - 0xd0, 0xbc, 0xaf, 0x59, 0x09, 0x0c, 0x33, 0x90, 0x01, 0xb1, 0x86, 0x1c, - 0x1c, 0x02, 0x14, 0xfd, 0xec, 0x05, 0x81, 0xfa, 0x7f, 0x02, 0x14, 0xfd, - 0xec, 0x04, 0xf1, 0x1c, 0x27, 0x92, 0xfe, 0x8d, 0x01, 0x59, 0x45, 0x57, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x0e, 0x00, 0x40, 0x40, 0x20, 0x08, 0x09, 0x01, 0x00, 0x0c, 0x04, - 0x04, 0x0e, 0x05, 0x09, 0x05, 0x00, 0x03, 0x10, 0x0f, 0x03, 0x07, 0x0e, - 0x07, 0x50, 0x59, 0x0d, 0x0a, 0x0e, 0x0e, 0x09, 0x0a, 0x0f, 0x05, 0x01, - 0x09, 0x15, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x03, 0x23, - 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x03, - 0xfc, 0xaa, 0x8c, 0x74, 0xa4, 0x70, 0x89, 0xaf, 0x01, 0xa8, 0xa8, 0x42, - 0x98, 0x94, 0x01, 0x70, 0xfe, 0x90, 0x01, 0x70, 0xfe, 0x90, 0x04, 0x3a, - 0xfd, 0xbe, 0x01, 0x92, 0xfe, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbf, - 0x00, 0x00, 0x07, 0x24, 0x05, 0x81, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x52, - 0x40, 0x2a, 0x08, 0x07, 0x03, 0x13, 0x13, 0x00, 0x0f, 0x04, 0x10, 0x19, - 0x0b, 0x0b, 0x18, 0x0c, 0x07, 0x0c, 0x10, 0x00, 0x04, 0x1d, 0x1e, 0x0e, - 0x0a, 0x12, 0x03, 0x12, 0x60, 0x59, 0x18, 0x14, 0x05, 0x03, 0x03, 0x05, - 0x03, 0x01, 0x03, 0x10, 0x0c, 0x08, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x32, - 0x32, 0x3f, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, - 0x33, 0x11, 0x21, 0x01, 0x33, 0x01, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, - 0x23, 0x03, 0x23, 0x13, 0x21, 0x11, 0x01, 0x07, 0x0e, 0x01, 0x03, 0x21, - 0x03, 0x26, 0x27, 0xbf, 0xbf, 0x01, 0x6e, 0x01, 0x29, 0xd9, 0x02, 0x36, - 0xc3, 0xd0, 0xbc, 0xaf, 0xb9, 0xd1, 0xc6, 0xd9, 0xfe, 0xcf, 0x03, 0x01, - 0x09, 0x0c, 0x33, 0x90, 0x01, 0xb1, 0x86, 0x1c, 0x1c, 0x05, 0x81, 0xfd, - 0x28, 0x02, 0xd8, 0xfa, 0x7f, 0x02, 0x14, 0xfd, 0xec, 0x02, 0x14, 0xfd, - 0xec, 0x02, 0x15, 0xfd, 0xeb, 0x04, 0xf1, 0x1c, 0x27, 0x92, 0xfe, 0x8d, - 0x01, 0x59, 0x45, 0x57, 0x00, 0x02, 0x00, 0x86, 0x00, 0x00, 0x05, 0x8c, - 0x04, 0x3a, 0x00, 0x13, 0x00, 0x16, 0x00, 0x51, 0x40, 0x29, 0x08, 0x07, - 0x03, 0x13, 0x13, 0x00, 0x0f, 0x04, 0x10, 0x14, 0x0b, 0x0b, 0x16, 0x0c, - 0x07, 0x0c, 0x10, 0x00, 0x04, 0x17, 0x18, 0x0e, 0x0a, 0x12, 0x03, 0x12, - 0x50, 0x59, 0x16, 0x15, 0x01, 0x03, 0x03, 0x05, 0x01, 0x0f, 0x10, 0x0c, - 0x08, 0x00, 0x15, 0x00, 0x3f, 0x32, 0x32, 0x32, 0x3f, 0x33, 0x39, 0x2f, - 0x12, 0x39, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x21, 0x13, 0x33, - 0x01, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x13, 0x23, - 0x11, 0x01, 0x0b, 0x01, 0x86, 0xb4, 0x01, 0x21, 0xe3, 0xa8, 0x01, 0xa6, - 0xaa, 0x8c, 0x74, 0xa4, 0x70, 0x89, 0xaf, 0x90, 0xec, 0x02, 0xee, 0x98, - 0x94, 0x04, 0x3a, 0xfd, 0xbe, 0x02, 0x42, 0xfb, 0xc6, 0x01, 0x70, 0xfe, - 0x90, 0x01, 0x70, 0xfe, 0x90, 0x01, 0x71, 0xfe, 0x8f, 0x01, 0xf8, 0x01, - 0x92, 0xfe, 0x6e, 0x00, 0x00, 0x02, 0x00, 0x79, 0x00, 0x00, 0x06, 0x29, - 0x05, 0x81, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x59, 0x40, 0x2d, 0x18, 0x04, - 0x03, 0x1b, 0x16, 0x16, 0x0b, 0x1a, 0x00, 0x00, 0x0a, 0x0a, 0x0b, 0x17, - 0x11, 0x11, 0x12, 0x12, 0x0b, 0x03, 0x03, 0x1d, 0x1c, 0x09, 0x0c, 0x16, - 0x0c, 0x60, 0x59, 0x19, 0x00, 0x16, 0x16, 0x12, 0x17, 0x17, 0x1b, 0x5f, - 0x59, 0x17, 0x03, 0x0b, 0x04, 0x12, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, - 0x30, 0x01, 0x04, 0x11, 0x15, 0x23, 0x35, 0x34, 0x2e, 0x01, 0x27, 0x11, - 0x23, 0x11, 0x0e, 0x02, 0x1d, 0x01, 0x23, 0x35, 0x10, 0x00, 0x25, 0x01, - 0x21, 0x09, 0x01, 0x21, 0x04, 0x15, 0x02, 0x14, 0xb4, 0x5b, 0xc6, 0xa4, - 0xbe, 0xa5, 0xc5, 0x5b, 0xb4, 0x01, 0x0a, 0x01, 0x0a, 0xfe, 0x47, 0x04, - 0xfc, 0xfd, 0x83, 0x01, 0x43, 0xfd, 0x78, 0x03, 0x05, 0x2f, 0xfd, 0xf7, - 0xcd, 0xb4, 0xa4, 0xb9, 0x5c, 0x05, 0xfd, 0x8e, 0x02, 0x72, 0x05, 0x5c, - 0xb7, 0xa6, 0xb4, 0xcd, 0x01, 0x09, 0x01, 0x17, 0x18, 0x02, 0x7c, 0xfd, - 0x7d, 0x01, 0xe7, 0x00, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x05, 0x01, - 0x04, 0x3a, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x5f, 0x40, 0x30, 0x15, 0x01, - 0x01, 0x00, 0x1c, 0x13, 0x13, 0x08, 0x1b, 0x16, 0x16, 0x07, 0x07, 0x08, - 0x14, 0x0e, 0x0e, 0x0f, 0x0f, 0x08, 0x00, 0x03, 0x1f, 0x1e, 0x06, 0x09, - 0x1d, 0x09, 0x51, 0x59, 0x16, 0x13, 0x1d, 0x13, 0x1d, 0x13, 0x0f, 0x14, - 0x14, 0x1c, 0x50, 0x59, 0x14, 0x0f, 0x08, 0x01, 0x0f, 0x15, 0x00, 0x3f, - 0x33, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, - 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x34, 0x2e, - 0x01, 0x27, 0x11, 0x23, 0x11, 0x22, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x35, - 0x34, 0x36, 0x37, 0x01, 0x21, 0x01, 0x1e, 0x02, 0x15, 0x01, 0x21, 0x13, - 0x05, 0x01, 0xaa, 0x3b, 0x88, 0x83, 0xa9, 0x7c, 0x8a, 0x3e, 0xaa, 0xb6, - 0xd9, 0xfe, 0xca, 0x03, 0xd8, 0xfe, 0xc8, 0x94, 0xad, 0x4d, 0xfe, 0x98, - 0xfe, 0x4f, 0xd6, 0x46, 0x90, 0x91, 0x44, 0x04, 0xfe, 0x51, 0x01, 0xaf, - 0x45, 0x95, 0x8f, 0x46, 0x46, 0xfe, 0xdc, 0x14, 0x02, 0x06, 0xfd, 0xfa, - 0x0e, 0x6b, 0xc6, 0xaf, 0x03, 0x69, 0xfe, 0x7e, 0x00, 0x02, 0x00, 0xbd, - 0x00, 0x00, 0x07, 0xf6, 0x05, 0x81, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x6b, - 0x40, 0x37, 0x0b, 0x06, 0x0a, 0x20, 0x07, 0x07, 0x11, 0x11, 0x12, 0x21, - 0x04, 0x04, 0x12, 0x1c, 0x05, 0x18, 0x18, 0x19, 0x03, 0x1e, 0x1e, 0x00, - 0x00, 0x19, 0x12, 0x0a, 0x04, 0x23, 0x22, 0x13, 0x10, 0x1d, 0x03, 0x1d, - 0x60, 0x59, 0x1f, 0x07, 0x03, 0x03, 0x00, 0x05, 0x05, 0x21, 0x5f, 0x59, - 0x05, 0x03, 0x01, 0x03, 0x19, 0x12, 0x0b, 0x00, 0x12, 0x00, 0x3f, 0x32, - 0x32, 0x32, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x33, - 0x11, 0x33, 0x11, 0x21, 0x01, 0x21, 0x01, 0x04, 0x11, 0x15, 0x23, 0x35, - 0x34, 0x2e, 0x01, 0x27, 0x11, 0x23, 0x11, 0x0e, 0x02, 0x1d, 0x01, 0x23, - 0x35, 0x10, 0x37, 0x21, 0x11, 0x09, 0x01, 0x21, 0xbd, 0xbf, 0x02, 0xde, - 0xfe, 0x47, 0x04, 0xfc, 0xfe, 0x45, 0x02, 0x14, 0xb4, 0x5b, 0xc6, 0xa4, - 0xbe, 0xa5, 0xc5, 0x5b, 0xb4, 0xa7, 0xfe, 0x8f, 0x03, 0xa4, 0x01, 0x43, - 0xfd, 0x78, 0x05, 0x81, 0xfd, 0x84, 0x02, 0x7c, 0xfd, 0x84, 0x2f, 0xfd, - 0xf7, 0xcd, 0xb4, 0xa4, 0xb9, 0x5c, 0x05, 0xfd, 0x8e, 0x02, 0x72, 0x05, - 0x5c, 0xb7, 0xa6, 0xb4, 0xcd, 0x01, 0x2a, 0x7c, 0xfd, 0x8d, 0x02, 0xfe, - 0x01, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x06, 0x76, - 0x04, 0x3a, 0x00, 0x21, 0x00, 0x24, 0x00, 0x6d, 0x40, 0x38, 0x06, 0x0d, - 0x0d, 0x0c, 0x22, 0x07, 0x07, 0x13, 0x13, 0x14, 0x23, 0x04, 0x04, 0x14, - 0x1f, 0x05, 0x1a, 0x1a, 0x1b, 0x03, 0x21, 0x21, 0x00, 0x00, 0x1b, 0x14, - 0x0c, 0x04, 0x26, 0x25, 0x15, 0x12, 0x20, 0x03, 0x20, 0x50, 0x59, 0x24, - 0x07, 0x03, 0x03, 0x00, 0x05, 0x05, 0x23, 0x50, 0x59, 0x05, 0x0f, 0x01, - 0x0f, 0x1b, 0x14, 0x0d, 0x00, 0x15, 0x00, 0x3f, 0x32, 0x32, 0x32, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, - 0x11, 0x21, 0x01, 0x21, 0x01, 0x1e, 0x02, 0x1d, 0x01, 0x23, 0x35, 0x34, - 0x2e, 0x01, 0x27, 0x11, 0x23, 0x11, 0x22, 0x0e, 0x01, 0x1d, 0x01, 0x23, - 0x35, 0x34, 0x36, 0x37, 0x21, 0x11, 0x01, 0x21, 0x13, 0x88, 0xb4, 0x02, - 0x42, 0xfe, 0xca, 0x03, 0xd8, 0xfe, 0xc8, 0x94, 0xad, 0x4d, 0xaa, 0x3b, - 0x88, 0x83, 0xa9, 0x7c, 0x8a, 0x3e, 0xaa, 0x38, 0x3c, 0xfe, 0xd9, 0x03, - 0xd2, 0xfe, 0x4f, 0xd6, 0x04, 0x3a, 0xfd, 0xfa, 0x02, 0x06, 0xfd, 0xfa, - 0x0e, 0x6b, 0xc6, 0xaf, 0x46, 0x46, 0x90, 0x91, 0x44, 0x04, 0xfe, 0x51, - 0x01, 0xaf, 0x45, 0x95, 0x8f, 0x46, 0x46, 0x9a, 0xa4, 0x2b, 0xfe, 0x51, - 0x03, 0xaf, 0xfe, 0x7e, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x57, 0x04, 0x70, - 0x06, 0xeb, 0x00, 0x54, 0x00, 0x92, 0x40, 0x4d, 0x1c, 0x14, 0x16, 0x29, - 0x16, 0x05, 0x03, 0x26, 0x0f, 0x10, 0x10, 0x36, 0x4b, 0x41, 0x40, 0x09, - 0x26, 0x00, 0x2c, 0x2c, 0x26, 0x40, 0x4b, 0x04, 0x55, 0x56, 0x43, 0x3d, - 0x5f, 0x59, 0x00, 0x43, 0x01, 0x0c, 0x03, 0x43, 0x43, 0x48, 0x29, 0x05, - 0x04, 0x05, 0x04, 0x60, 0x59, 0x32, 0x4f, 0x4f, 0x48, 0x05, 0x05, 0x23, - 0x41, 0x48, 0x48, 0x38, 0x5f, 0x59, 0x48, 0x1f, 0x15, 0x15, 0x1a, 0x23, - 0x40, 0x16, 0x13, 0x23, 0x0f, 0x0f, 0x23, 0x23, 0x0c, 0x60, 0x59, 0x23, - 0x03, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x33, 0x33, - 0x1a, 0x10, 0xcd, 0x32, 0x2f, 0x32, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x12, - 0x39, 0x18, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x11, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x2b, - 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, - 0x27, 0x3e, 0x01, 0x37, 0x03, 0x33, 0x13, 0x37, 0x3e, 0x01, 0x33, 0x32, - 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, - 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x03, 0x07, 0x0e, 0x02, 0x15, - 0x14, 0x33, 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x23, - 0x22, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x3e, - 0x04, 0x03, 0xaf, 0xc0, 0xca, 0x47, 0x47, 0xb5, 0xad, 0x91, 0x87, 0x7e, - 0xac, 0x33, 0xb2, 0x37, 0xc1, 0x97, 0xb8, 0x9c, 0xa3, 0x5b, 0x1d, 0x48, - 0x36, 0x53, 0x2d, 0x42, 0x11, 0x1c, 0x0e, 0x15, 0x0d, 0x58, 0x9d, 0xb4, - 0x90, 0x88, 0x98, 0xaa, 0x30, 0x52, 0x73, 0x8b, 0xa0, 0x97, 0x6d, 0x3b, - 0xa4, 0x3a, 0x6b, 0x63, 0x5d, 0x2d, 0x5e, 0x6d, 0x98, 0x4a, 0x1d, 0x56, - 0x6c, 0x7e, 0x43, 0x88, 0xa2, 0x54, 0x9c, 0xa1, 0x93, 0x6c, 0x57, 0x3f, - 0x23, 0x01, 0x93, 0x85, 0x76, 0x94, 0x77, 0x7b, 0x6b, 0x7b, 0x75, 0x82, - 0x3d, 0x89, 0xa7, 0x1a, 0x01, 0x53, 0xfe, 0xbb, 0xd8, 0x43, 0x38, 0x4d, - 0x3e, 0x1e, 0x0f, 0x1d, 0xc8, 0x1c, 0xbd, 0x8c, 0x7f, 0xa6, 0x20, 0x17, - 0xaf, 0x84, 0x5b, 0x82, 0x5c, 0x3b, 0x24, 0x13, 0x11, 0x20, 0x33, 0x29, - 0x6c, 0x1b, 0x21, 0x1c, 0x82, 0x64, 0x4d, 0x1c, 0x22, 0x1c, 0x90, 0x7a, - 0x57, 0x6e, 0x3e, 0x0f, 0x0e, 0x16, 0x25, 0x3e, 0x59, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x20, 0xfe, 0x57, 0x03, 0x84, 0x05, 0xa9, 0x00, 0x4d, - 0x00, 0x90, 0x40, 0x4c, 0x44, 0x43, 0x08, 0x31, 0x0e, 0x20, 0x18, 0x1a, - 0x2d, 0x1a, 0x0b, 0x03, 0x2a, 0x14, 0x15, 0x15, 0x39, 0x00, 0x00, 0x2a, - 0x31, 0x43, 0x04, 0x4f, 0x4e, 0x46, 0x40, 0x50, 0x59, 0x00, 0x46, 0x01, - 0x0c, 0x03, 0x46, 0x46, 0x4b, 0x35, 0x04, 0x2d, 0x0b, 0x0a, 0x0b, 0x0a, - 0x50, 0x59, 0x04, 0x4b, 0x0b, 0x0b, 0x27, 0x43, 0x4b, 0x4b, 0x3b, 0x50, - 0x59, 0x4b, 0x23, 0x19, 0x19, 0x1e, 0x27, 0x40, 0x1a, 0x17, 0x27, 0x14, - 0x14, 0x27, 0x27, 0x11, 0x51, 0x59, 0x27, 0x0f, 0x00, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x11, 0x33, 0x33, 0x1a, 0x10, 0xcd, 0x32, 0x2f, - 0x32, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x18, 0x2f, 0x12, 0x39, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x33, 0x11, 0x33, 0x18, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x32, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x17, 0x34, 0x3e, 0x01, 0x37, 0x3e, 0x02, 0x35, 0x34, 0x21, - 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, - 0x37, 0x03, 0x33, 0x13, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x07, 0x26, - 0x23, 0x22, 0x06, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x15, - 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x33, - 0x32, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x23, 0x22, 0x0e, - 0x02, 0x23, 0x22, 0x26, 0x20, 0x48, 0x85, 0x8a, 0x84, 0x6b, 0x39, 0xfe, - 0xb5, 0xa1, 0x98, 0x63, 0x5d, 0x59, 0x71, 0x0c, 0xa2, 0x24, 0xd4, 0xbc, - 0x9c, 0xa3, 0x5b, 0x1d, 0x48, 0x36, 0x53, 0x2d, 0x42, 0x11, 0x1c, 0x0e, - 0x15, 0x0d, 0x5b, 0x70, 0x88, 0x91, 0x67, 0x79, 0x99, 0x52, 0xac, 0xb3, - 0x70, 0x4f, 0x2a, 0x98, 0x3a, 0x5c, 0x52, 0x4e, 0x2d, 0x5b, 0x6a, 0x98, - 0x4a, 0x1d, 0x45, 0x57, 0x6c, 0x44, 0x7b, 0x9e, 0x9f, 0x4e, 0x63, 0x3c, - 0x14, 0x13, 0x2d, 0x4c, 0x3d, 0xc8, 0x89, 0x54, 0x58, 0x4a, 0x56, 0x4a, - 0x46, 0x14, 0xca, 0x2c, 0x01, 0x59, 0xfe, 0xbb, 0xd8, 0x43, 0x38, 0x4d, - 0x3e, 0x1e, 0x0f, 0x1d, 0xd0, 0x1a, 0x8f, 0x66, 0x65, 0x88, 0x09, 0x02, - 0x0d, 0x8f, 0x6d, 0x5f, 0x85, 0x50, 0x1a, 0x13, 0x1f, 0x2e, 0x24, 0x74, - 0x1f, 0x24, 0x1f, 0x7d, 0x68, 0x4d, 0x1d, 0x23, 0x1d, 0x96, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x05, 0xec, 0x05, 0x81, 0x00, 0x1c, - 0x00, 0x3c, 0x40, 0x1e, 0x14, 0x17, 0x10, 0x1c, 0x1c, 0x0d, 0x00, 0x08, - 0x07, 0x07, 0x00, 0x17, 0x03, 0x1e, 0x1d, 0x1b, 0x01, 0x0d, 0x01, 0x60, - 0x59, 0x10, 0x0d, 0x0d, 0x15, 0x0e, 0x07, 0x03, 0x00, 0x12, 0x00, 0x3f, - 0x3f, 0x33, 0x33, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x11, 0x22, 0x2e, 0x02, 0x27, 0x03, 0x33, 0x13, 0x1e, - 0x02, 0x33, 0x11, 0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x00, 0x2b, 0x01, 0x11, 0x02, 0xc9, 0x63, 0x98, 0x72, 0x5c, 0x33, - 0x8a, 0xbf, 0x8a, 0x30, 0x50, 0x6d, 0x50, 0xb9, 0x38, 0xb1, 0xc2, 0xbf, - 0xfe, 0xe3, 0xfa, 0x53, 0x01, 0xab, 0x36, 0x6b, 0xb7, 0xaf, 0x01, 0xcf, - 0xfe, 0x2d, 0xa3, 0x87, 0x47, 0x03, 0x44, 0xfc, 0xbc, 0xcc, 0xaf, 0x01, - 0xc9, 0xfe, 0x3b, 0xf4, 0xfe, 0xe3, 0xfe, 0x55, 0x00, 0x01, 0x00, 0x44, - 0xfe, 0x57, 0x05, 0x07, 0x04, 0x3a, 0x00, 0x18, 0x00, 0x3c, 0x40, 0x1e, - 0x12, 0x11, 0x00, 0x0a, 0x0a, 0x16, 0x0b, 0x04, 0x05, 0x05, 0x0b, 0x11, - 0x03, 0x19, 0x1a, 0x17, 0x04, 0x11, 0x0f, 0x00, 0x16, 0x0c, 0x16, 0x50, - 0x59, 0x09, 0x0c, 0x16, 0x0b, 0x1b, 0x00, 0x3f, 0x3f, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x3f, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x3e, - 0x01, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x05, 0x11, 0x23, 0x11, 0x2e, - 0x02, 0x27, 0x03, 0x33, 0x13, 0x1e, 0x01, 0x17, 0x11, 0x33, 0x02, 0xff, - 0xb3, 0x9f, 0xb6, 0xfe, 0xfe, 0xf6, 0xaa, 0x77, 0x92, 0x5c, 0x28, 0x84, - 0xb5, 0x8e, 0x23, 0x54, 0x57, 0xaa, 0x77, 0x02, 0x9d, 0xb2, 0x02, 0x72, - 0xfd, 0x90, 0xf5, 0xe7, 0x02, 0xfe, 0x6b, 0x01, 0x95, 0x02, 0x51, 0xb3, - 0xc4, 0x02, 0x84, 0xfd, 0x52, 0xaa, 0x69, 0x02, 0x03, 0xc3, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x00, 0x0e, - 0x00, 0x1d, 0x00, 0x2e, 0x00, 0x50, 0x40, 0x2b, 0x2c, 0x12, 0x12, 0x00, - 0x21, 0x1b, 0x1b, 0x08, 0x00, 0x08, 0x30, 0x2f, 0x2a, 0x14, 0x5f, 0x59, - 0x24, 0x19, 0x5f, 0x59, 0x0f, 0x24, 0x01, 0x0c, 0x03, 0x2a, 0x24, 0x2a, - 0x24, 0x04, 0x0b, 0x0b, 0x1e, 0x5f, 0x59, 0x0b, 0x04, 0x04, 0x0f, 0x5f, - 0x59, 0x04, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, - 0x00, 0x21, 0x32, 0x04, 0x12, 0x01, 0x32, 0x24, 0x37, 0x06, 0x23, 0x22, - 0x2e, 0x02, 0x23, 0x22, 0x07, 0x16, 0x00, 0x13, 0x22, 0x04, 0x07, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x26, 0x00, - 0x05, 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, 0xc5, 0xa6, 0x01, 0x72, - 0x01, 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xfd, 0x44, 0xda, 0x01, 0x02, 0x18, - 0x85, 0x57, 0x4b, 0x81, 0x78, 0x75, 0x3e, 0x98, 0x7d, 0x15, 0x01, 0x07, - 0xda, 0xde, 0xfe, 0xfb, 0x14, 0x3d, 0x87, 0x51, 0x3e, 0x7d, 0x4c, 0x4f, - 0x71, 0x37, 0x76, 0x63, 0x11, 0xfe, 0xfa, 0x02, 0xc7, 0xdd, 0xfe, 0xb4, - 0xb2, 0xb0, 0x01, 0x4d, 0xde, 0x01, 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, - 0xfc, 0xe2, 0xf6, 0xe7, 0x34, 0x2b, 0x35, 0x2b, 0x49, 0xe7, 0xfe, 0xfc, - 0x04, 0x73, 0xfa, 0xee, 0x1b, 0x28, 0x22, 0x24, 0x25, 0x21, 0x39, 0xf1, - 0x01, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x04, 0x4e, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x28, 0x00, 0x4e, 0x40, 0x2a, - 0x22, 0x0d, 0x06, 0x1c, 0x13, 0x13, 0x00, 0x06, 0x00, 0x29, 0x2a, 0x1a, - 0x15, 0x50, 0x59, 0x24, 0x0b, 0x50, 0x59, 0x0f, 0x1a, 0x01, 0x0b, 0x03, - 0x1a, 0x24, 0x1a, 0x24, 0x03, 0x08, 0x08, 0x1f, 0x50, 0x59, 0x08, 0x10, - 0x03, 0x10, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, - 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, - 0x21, 0x32, 0x12, 0x01, 0x22, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, - 0x06, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x32, 0x37, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x07, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x04, 0x1d, 0xfa, 0xee, 0xed, - 0xf2, 0x01, 0xe5, 0xf8, 0xea, 0xfd, 0x78, 0x45, 0x3d, 0x05, 0x8d, 0x8e, - 0x97, 0x8b, 0x09, 0x49, 0x36, 0x34, 0x57, 0x4e, 0x4a, 0x01, 0x26, 0x3f, - 0x3d, 0x0b, 0x86, 0x8f, 0x89, 0x8c, 0x11, 0x3e, 0x3f, 0x32, 0x4f, 0x4b, - 0x4f, 0x02, 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x01, 0x21, 0x01, 0x11, 0x02, - 0x30, 0xfe, 0xef, 0xfe, 0xe8, 0x23, 0xce, 0xc3, 0xb0, 0xb9, 0x20, 0x21, - 0x29, 0x21, 0x1f, 0x21, 0xb6, 0xae, 0x99, 0xa0, 0x1e, 0x21, 0x28, 0x21, - 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x06, 0x56, 0x05, 0x96, 0x00, 0x14, - 0x00, 0x26, 0x40, 0x14, 0x03, 0x02, 0x02, 0x06, 0x0e, 0x03, 0x16, 0x15, - 0x0b, 0x11, 0x5f, 0x59, 0x0b, 0x04, 0x06, 0x01, 0x02, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x33, 0x01, 0x16, 0x17, 0x3f, - 0x01, 0x01, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x03, 0x0e, 0xc6, 0xfd, 0xc1, 0xc9, 0x01, 0x86, 0x28, 0x2c, 0x19, - 0x3b, 0x01, 0x2d, 0x4c, 0xc4, 0x4b, 0x9e, 0x30, 0x54, 0x4d, 0x61, 0x33, - 0x37, 0x1c, 0x05, 0x81, 0xfc, 0x20, 0x69, 0x90, 0x4e, 0xab, 0x03, 0x2b, - 0xca, 0x37, 0x29, 0x88, 0x45, 0x33, 0x47, 0x00, 0x00, 0x01, 0x00, 0x07, - 0x00, 0x00, 0x04, 0xf1, 0x04, 0x4e, 0x00, 0x12, 0x00, 0x26, 0x40, 0x14, - 0x03, 0x02, 0x0c, 0x06, 0x02, 0x03, 0x13, 0x14, 0x0a, 0x0f, 0x53, 0x59, - 0x0a, 0x10, 0x06, 0x01, 0x02, 0x0f, 0x01, 0x15, 0x00, 0x3f, 0x3f, 0x12, - 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x01, 0x33, 0x13, 0x16, 0x17, 0x37, 0x13, 0x36, 0x33, 0x32, - 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x02, 0x65, 0xd5, 0xfe, 0x77, - 0xc0, 0xee, 0x0d, 0x38, 0x4a, 0xab, 0x42, 0xc0, 0x8e, 0x72, 0x51, 0x41, - 0x54, 0x2e, 0x38, 0x1b, 0x04, 0x3a, 0xfd, 0x40, 0x28, 0xc5, 0xeb, 0x02, - 0x0a, 0xcc, 0x5b, 0x84, 0x3f, 0x34, 0x4c, 0x00, 0xff, 0xff, 0x00, 0x09, - 0x00, 0x00, 0x06, 0x56, 0x07, 0x4c, 0x12, 0x26, 0x04, 0x25, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xd1, 0x02, 0x6d, 0x01, 0x68, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x20, 0x20, 0x05, 0x26, 0x02, 0x01, 0x1d, 0xb8, 0xff, 0x3e, - 0xb4, 0x1d, 0x1a, 0x02, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x04, 0xf1, - 0x05, 0xe4, 0x12, 0x26, 0x04, 0x26, 0x00, 0x00, 0x11, 0x07, 0x02, 0xd1, - 0x01, 0xcc, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1e, 0x1e, - 0x11, 0x26, 0x02, 0x01, 0x1b, 0xb8, 0xff, 0x51, 0xb4, 0x1b, 0x18, 0x02, - 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x00, 0x03, 0x00, 0x61, 0xfe, 0x57, 0x08, 0x8c, 0x05, 0x96, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x28, 0x00, 0x4f, 0x40, 0x2a, 0x12, 0x06, 0x22, 0x21, - 0x21, 0x0c, 0x00, 0x24, 0x25, 0x25, 0x20, 0x1b, 0x00, 0x06, 0x05, 0x29, - 0x2a, 0x23, 0x20, 0x24, 0x18, 0x24, 0x21, 0x0f, 0x18, 0x1d, 0x50, 0x59, - 0x18, 0x1b, 0x09, 0x0f, 0x5f, 0x59, 0x09, 0x04, 0x03, 0x15, 0x5f, 0x59, - 0x03, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, - 0x00, 0x03, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, - 0x12, 0x01, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x01, 0x33, - 0x09, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x04, 0x92, 0xfe, 0xe0, 0xf9, 0xfc, - 0xfe, 0xe4, 0x01, 0x1b, 0xfe, 0xfe, 0x01, 0x1a, 0xbe, 0xb5, 0xa5, 0xa7, - 0xb5, 0xb8, 0xa3, 0xa7, 0xb4, 0x01, 0x8f, 0x4a, 0x32, 0x26, 0x2e, 0xa8, - 0x62, 0x11, 0xfe, 0x67, 0xc0, 0x01, 0x32, 0x01, 0x1f, 0xbe, 0xfe, 0x74, - 0x56, 0xc0, 0x02, 0xc7, 0xfe, 0xae, 0xfe, 0x77, 0x01, 0x84, 0x01, 0x57, - 0x01, 0x53, 0x01, 0x7c, 0xfe, 0x81, 0xfe, 0xb0, 0x01, 0x06, 0x01, 0x2d, - 0xfe, 0xd9, 0xfe, 0xf4, 0xfe, 0xf8, 0xfe, 0xc8, 0x01, 0x2b, 0xfc, 0xa5, - 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0x04, 0x35, 0xfc, 0x8a, 0x03, 0x76, 0xfb, - 0xc6, 0xea, 0xbf, 0x00, 0x00, 0x03, 0x00, 0x55, 0xfe, 0x57, 0x07, 0x1a, - 0x04, 0x4e, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x27, 0x00, 0x4d, 0x40, 0x29, - 0x11, 0x05, 0x21, 0x20, 0x20, 0x00, 0x00, 0x0b, 0x24, 0x1f, 0x19, 0x0b, - 0x05, 0x05, 0x28, 0x29, 0x22, 0x1e, 0x23, 0x17, 0x23, 0x20, 0x0f, 0x17, - 0x1c, 0x50, 0x59, 0x17, 0x1b, 0x08, 0x0e, 0x51, 0x59, 0x08, 0x10, 0x03, - 0x14, 0x51, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x20, 0x11, 0x10, 0x12, 0x33, - 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x36, 0x01, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x01, - 0x33, 0x09, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x03, 0x64, 0xc5, 0xc6, 0xfe, - 0x7c, 0xbf, 0xca, 0xcb, 0xbb, 0xaf, 0x63, 0x72, 0x73, 0x69, 0x66, 0x6e, - 0x77, 0x66, 0x01, 0x46, 0x4a, 0x32, 0x26, 0x2e, 0xa8, 0x62, 0x11, 0xfe, - 0x71, 0xc0, 0x01, 0x28, 0x01, 0x15, 0xbe, 0xfe, 0x7e, 0x50, 0xc3, 0x02, - 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x02, 0x32, 0x01, 0x17, 0x01, 0x19, 0xfe, - 0xf3, 0xfe, 0xdd, 0xe2, 0xcd, 0xcd, 0xe2, 0xda, 0xd7, 0xd3, 0xfd, 0x17, - 0x0b, 0x87, 0x06, 0xf7, 0x2b, 0x04, 0x35, 0xfc, 0x8a, 0x03, 0x76, 0xfb, - 0xc6, 0xe2, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0x8b, 0x06, 0x74, - 0x05, 0xf3, 0x00, 0x18, 0x00, 0x30, 0x00, 0x4a, 0x40, 0x26, 0x25, 0x0c, - 0x28, 0x22, 0x2e, 0x1c, 0x19, 0x00, 0x00, 0x1c, 0x22, 0x0c, 0x04, 0x32, - 0x31, 0x1c, 0x22, 0x10, 0x22, 0x5f, 0x59, 0x2b, 0x1f, 0x28, 0x16, 0x13, - 0x10, 0x13, 0x2e, 0x28, 0x09, 0x28, 0x5f, 0x59, 0x06, 0x03, 0x09, 0x04, - 0x00, 0x3f, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x10, - 0x00, 0x25, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x04, 0x00, 0x11, 0x14, - 0x02, 0x04, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x24, 0x00, 0x13, - 0x14, 0x12, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x36, 0x12, 0x35, - 0x34, 0x02, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x06, 0x02, 0x36, - 0x01, 0x58, 0x01, 0x27, 0x17, 0x54, 0x34, 0x33, 0x55, 0x17, 0x01, 0x28, - 0x01, 0x59, 0x9e, 0xfe, 0xdd, 0xbe, 0x16, 0x56, 0x35, 0x36, 0x55, 0x17, - 0xfe, 0xda, 0xfe, 0xaa, 0xc2, 0xec, 0xcb, 0x15, 0x58, 0x38, 0x37, 0x59, - 0x15, 0xd1, 0xe7, 0xe7, 0xd0, 0x14, 0x5a, 0x38, 0x39, 0x5a, 0x14, 0xd0, - 0xe5, 0x02, 0xc7, 0x01, 0x33, 0x01, 0x81, 0x18, 0x2b, 0x35, 0x35, 0x2b, - 0x18, 0xfe, 0x7e, 0xfe, 0xce, 0xc8, 0xfe, 0xbf, 0xbe, 0x10, 0x2d, 0x38, - 0x37, 0x2d, 0x19, 0x01, 0x8c, 0x01, 0x33, 0xed, 0xfe, 0xca, 0x1d, 0x30, - 0x3c, 0x3c, 0x30, 0x1b, 0x01, 0x31, 0xf4, 0xe8, 0x01, 0x2f, 0x1c, 0x31, - 0x3e, 0x3e, 0x31, 0x1c, 0xfe, 0xd3, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2b, - 0xff, 0x8f, 0x04, 0xbb, 0x04, 0xad, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x49, - 0x40, 0x24, 0x23, 0x2c, 0x1a, 0x26, 0x20, 0x1a, 0x20, 0x0c, 0x18, 0x00, - 0x0c, 0x00, 0x2f, 0x2e, 0x1a, 0x20, 0x0f, 0x20, 0x50, 0x59, 0x29, 0x1d, - 0x09, 0x15, 0x0f, 0x16, 0x2c, 0x26, 0x09, 0x26, 0x50, 0x59, 0x06, 0x03, - 0x09, 0x10, 0x00, 0x3f, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x33, 0x12, 0x39, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, 0x31, - 0x30, 0x13, 0x34, 0x12, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, - 0x12, 0x15, 0x14, 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, - 0x02, 0x37, 0x10, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, - 0x35, 0x34, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x06, 0x2b, - 0xe0, 0xcf, 0x14, 0x52, 0x34, 0x33, 0x52, 0x14, 0xd5, 0xd9, 0xe2, 0xcc, - 0x14, 0x52, 0x33, 0x33, 0x51, 0x14, 0xd0, 0xe1, 0xbd, 0xef, 0x12, 0x55, - 0x36, 0x35, 0x53, 0x13, 0x7b, 0x74, 0x73, 0x7b, 0x13, 0x54, 0x35, 0x35, - 0x53, 0x13, 0xf1, 0x02, 0x1e, 0xf4, 0x01, 0x1e, 0x19, 0x2d, 0x37, 0x37, - 0x2c, 0x17, 0xfe, 0xe6, 0xfb, 0xf3, 0xfe, 0xdf, 0x18, 0x2c, 0x37, 0x35, - 0x2b, 0x15, 0x01, 0x24, 0xf6, 0xfe, 0x85, 0x30, 0x30, 0x3c, 0x3a, 0x2e, - 0x1c, 0xd5, 0xb6, 0xba, 0xd3, 0x1a, 0x2e, 0x3a, 0x39, 0x2d, 0x37, 0x00, - 0x00, 0x03, 0x00, 0x6c, 0xff, 0xec, 0x09, 0x1e, 0x07, 0xd4, 0x00, 0x31, - 0x00, 0x45, 0x00, 0x50, 0x00, 0x7b, 0x40, 0x41, 0x32, 0x2b, 0x4c, 0x46, - 0x4f, 0x00, 0x4f, 0x18, 0x03, 0x06, 0x3c, 0x1f, 0x12, 0x12, 0x0c, 0x06, - 0x03, 0x52, 0x51, 0x45, 0x32, 0x32, 0x3c, 0x4f, 0x4f, 0x50, 0x4b, 0x3c, - 0x50, 0x3c, 0x50, 0x15, 0x3f, 0x3f, 0x38, 0x60, 0x59, 0x3f, 0x15, 0x1c, - 0x5f, 0x59, 0x15, 0x04, 0x0e, 0x22, 0x5f, 0x59, 0x0e, 0x13, 0x0a, 0x28, - 0x5f, 0x59, 0x0a, 0x13, 0x4b, 0x4b, 0x03, 0x03, 0x2e, 0x5f, 0x59, 0x03, - 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x32, 0x32, 0x31, 0x30, 0x01, 0x3e, 0x01, - 0x33, 0x20, 0x00, 0x11, 0x14, 0x02, 0x04, 0x23, 0x20, 0x27, 0x06, 0x21, - 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x07, 0x2e, - 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x36, 0x37, 0x1e, - 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x07, 0x01, - 0x22, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x25, 0x15, 0x14, 0x0e, 0x01, - 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x05, 0x48, 0x4e, 0x8c, 0x52, 0x01, - 0x40, 0x01, 0x6a, 0xa2, 0xfe, 0xcb, 0xd4, 0xfe, 0xf0, 0x9e, 0xa0, 0xfe, - 0xf2, 0xd5, 0xfe, 0xcb, 0xa1, 0x01, 0x6a, 0x01, 0x40, 0x53, 0x8c, 0x4d, - 0x4b, 0x43, 0x67, 0x35, 0xea, 0xff, 0x00, 0x01, 0x0e, 0xe4, 0x7f, 0xe5, - 0x41, 0x41, 0xe5, 0x7f, 0xe4, 0x01, 0x0e, 0xff, 0xeb, 0x34, 0x68, 0x43, - 0x01, 0xf6, 0x66, 0xb9, 0x65, 0x72, 0x89, 0x46, 0x76, 0x87, 0x18, 0x81, - 0x20, 0xdf, 0xa4, 0x41, 0x83, 0x7f, 0x6f, 0xaa, 0x5c, 0xfd, 0x96, 0x0b, - 0x16, 0x25, 0x6a, 0x53, 0x4e, 0x05, 0x57, 0x23, 0x1c, 0xfe, 0x83, 0xfe, - 0xae, 0xe0, 0xfe, 0xb5, 0xb0, 0x6d, 0x6d, 0xb1, 0x01, 0x4c, 0xde, 0x01, - 0x52, 0x01, 0x7d, 0x1c, 0x23, 0x94, 0x20, 0x17, 0xfe, 0xd3, 0xfe, 0xfa, - 0xfe, 0xfb, 0xfe, 0xc2, 0x56, 0x45, 0x45, 0x56, 0x01, 0x3f, 0x01, 0x04, - 0x01, 0x07, 0x01, 0x2c, 0x17, 0x20, 0x01, 0xbb, 0x35, 0x38, 0x3f, 0x2e, - 0x6d, 0x70, 0xa4, 0xb5, 0x2a, 0x40, 0x39, 0x31, 0x03, 0x62, 0x2a, 0x3c, - 0x34, 0x3a, 0x62, 0x47, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x57, - 0xff, 0xec, 0x06, 0x77, 0x06, 0x94, 0x00, 0x25, 0x00, 0x30, 0x00, 0x44, - 0x00, 0x7e, 0x40, 0x46, 0x31, 0x00, 0x2c, 0x2f, 0x27, 0x2e, 0x03, 0x2e, - 0x2f, 0x17, 0x04, 0x08, 0x3b, 0x1a, 0x12, 0x08, 0x12, 0x46, 0x45, 0x31, - 0x3b, 0x2f, 0x2f, 0x2b, 0x00, 0x30, 0x10, 0x30, 0x02, 0x0f, 0x03, 0x30, - 0x3b, 0x2b, 0x2b, 0x3b, 0x30, 0x03, 0x3e, 0x04, 0x3e, 0x37, 0x51, 0x59, - 0x0f, 0x3e, 0xef, 0x3e, 0x02, 0x09, 0x03, 0x3e, 0x17, 0x16, 0x10, 0x0f, - 0x1d, 0x50, 0x59, 0x0f, 0x16, 0x0b, 0x23, 0x50, 0x59, 0x0b, 0x16, 0x03, - 0x04, 0x10, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x33, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x17, - 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x12, 0x39, 0x2f, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x32, 0x32, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, - 0x35, 0x32, 0x1e, 0x01, 0x15, 0x10, 0x02, 0x23, 0x22, 0x27, 0x06, 0x23, - 0x22, 0x02, 0x11, 0x34, 0x3e, 0x01, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x01, 0x15, - 0x14, 0x0e, 0x01, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x05, 0x22, 0x26, - 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x17, 0x1e, 0x01, 0x33, 0x05, 0xbb, 0x89, 0x99, 0x94, 0xda, 0x70, - 0xef, 0xe3, 0xbb, 0x83, 0x85, 0xb9, 0xe3, 0xef, 0x70, 0xd9, 0x95, 0x99, - 0x89, 0x90, 0x92, 0x58, 0xa9, 0x31, 0x2d, 0xab, 0x5a, 0x92, 0x90, 0xfd, - 0xfe, 0x0b, 0x16, 0x25, 0x6a, 0x53, 0x4e, 0x03, 0x15, 0x66, 0xb9, 0x65, - 0x72, 0x89, 0x46, 0x76, 0x87, 0x18, 0x81, 0x20, 0xdf, 0xa4, 0x41, 0x83, - 0x7f, 0x6f, 0xaa, 0x5c, 0x02, 0x22, 0xd2, 0xc4, 0x96, 0x81, 0xf9, 0xb6, - 0xfe, 0xed, 0xfe, 0xe1, 0x53, 0x53, 0x01, 0x1f, 0x01, 0x13, 0xb4, 0xfb, - 0x81, 0x96, 0xc4, 0xd2, 0xd7, 0xd1, 0x3a, 0x2d, 0x2b, 0x3c, 0xd2, 0x04, - 0x72, 0x62, 0x2a, 0x3c, 0x34, 0x3a, 0x62, 0x47, 0x8d, 0x80, 0x35, 0x38, - 0x3f, 0x2e, 0x6d, 0x70, 0xa4, 0xb5, 0x2a, 0x40, 0x39, 0x31, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x72, 0xff, 0xec, 0x0a, 0x46, 0x06, 0xe9, 0x12, 0x26, - 0x04, 0x11, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc5, 0x05, 0x50, 0x01, 0x68, - 0x00, 0x18, 0xb6, 0x01, 0x3f, 0x3f, 0x05, 0x26, 0x01, 0x40, 0xb8, 0xff, - 0xf4, 0xb4, 0x40, 0x35, 0x21, 0x15, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x04, 0xc9, - 0x05, 0x81, 0x12, 0x26, 0x04, 0x12, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc5, - 0x02, 0x6c, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x20, 0x20, 0x11, - 0x26, 0x01, 0x21, 0x00, 0x21, 0x16, 0x0a, 0x02, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x00, 0x01, 0x00, 0x68, 0xfe, 0x55, 0x05, 0x6c, - 0x05, 0x96, 0x00, 0x17, 0x00, 0x34, 0x40, 0x1b, 0x0b, 0x0a, 0x17, 0x00, - 0x11, 0x04, 0x04, 0x00, 0x0a, 0x03, 0x19, 0x18, 0x07, 0x0e, 0x5f, 0x59, - 0x0b, 0x0b, 0x07, 0x04, 0x01, 0x14, 0x5f, 0x59, 0x00, 0x01, 0x13, 0x00, - 0x3f, 0xcd, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, - 0x24, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, - 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x37, 0x11, 0x02, 0xbc, - 0xfe, 0xe2, 0xfe, 0xca, 0x01, 0x6e, 0x01, 0x40, 0xe1, 0x01, 0x2e, 0x47, - 0xb5, 0x31, 0xd9, 0x95, 0xe8, 0xfe, 0xfa, 0x01, 0x0f, 0xee, 0x28, 0x2c, - 0xfe, 0x55, 0x01, 0x9c, 0x1d, 0x01, 0x79, 0x01, 0x37, 0x01, 0x54, 0x01, - 0x84, 0xb0, 0xad, 0x3c, 0x7b, 0x82, 0xfe, 0xcf, 0xfe, 0xf5, 0xfe, 0xfe, - 0xfe, 0xcd, 0x0d, 0xfd, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0xfe, 0x57, 0x03, 0xd5, 0x04, 0x4c, 0x00, 0x17, 0x00, 0x31, 0x40, 0x1a, - 0x17, 0x00, 0x11, 0x04, 0x04, 0x00, 0x0a, 0x03, 0x19, 0x18, 0x07, 0x0e, - 0x50, 0x59, 0x0b, 0x0b, 0x07, 0x10, 0x01, 0x14, 0x50, 0x59, 0x01, 0x15, - 0x00, 0x1b, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x26, 0x02, 0x35, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, - 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x01, - 0xf0, 0xce, 0xd2, 0x01, 0x00, 0xe8, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, - 0x69, 0x99, 0x8e, 0x99, 0x94, 0x3d, 0x2e, 0xfe, 0x57, 0x01, 0x9f, 0x12, - 0x01, 0x22, 0xfc, 0x01, 0x0d, 0x01, 0x19, 0xac, 0x97, 0x0e, 0x5a, 0x6a, - 0xc3, 0xd2, 0xd1, 0xd9, 0x12, 0xfd, 0xc5, 0x00, 0x00, 0x01, 0x00, 0x0b, - 0xff, 0xe0, 0x03, 0xfc, 0x05, 0xda, 0x00, 0x13, 0x00, 0x3f, 0x40, 0x1e, - 0x0e, 0x0a, 0x07, 0x08, 0x12, 0x11, 0x04, 0x00, 0x00, 0x11, 0x08, 0x0a, - 0x04, 0x14, 0x15, 0x10, 0x02, 0x01, 0x01, 0x0f, 0x0c, 0x06, 0x05, 0x05, - 0x0b, 0x0f, 0x0b, 0x07, 0x11, 0x07, 0x00, 0x2f, 0x2f, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x07, 0x25, 0x03, 0x05, 0x07, 0x25, 0x03, 0x23, 0x13, 0x25, - 0x37, 0x05, 0x13, 0x25, 0x37, 0x05, 0x13, 0x33, 0x03, 0x03, 0xfc, 0x29, - 0xfe, 0x9f, 0x4e, 0x01, 0x64, 0x29, 0xfe, 0x9b, 0x80, 0xa1, 0x8c, 0xfe, - 0xa6, 0x29, 0x01, 0x5c, 0x4d, 0xfe, 0xa1, 0x29, 0x01, 0x61, 0x7e, 0x9f, - 0x89, 0x03, 0x91, 0x98, 0x5e, 0xfe, 0xeb, 0x5f, 0x98, 0x60, 0xfe, 0x35, - 0x01, 0xf3, 0x5d, 0x98, 0x5e, 0x01, 0x15, 0x5e, 0x99, 0x5f, 0x01, 0xc3, - 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xa2, 0x04, 0x7b, 0x01, 0x60, - 0x05, 0xe5, 0x00, 0x15, 0x00, 0x0d, 0xb4, 0x08, 0x03, 0x13, 0x0e, 0x03, - 0x00, 0x3f, 0x33, 0xcd, 0x32, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x21, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x60, 0x49, 0x35, 0xfe, 0xa5, 0x43, - 0x2e, 0x32, 0x42, 0x49, 0x35, 0x01, 0x5b, 0x43, 0x2e, 0x32, 0x42, 0x05, - 0x71, 0x32, 0x3c, 0x14, 0x38, 0x3c, 0x40, 0x34, 0x32, 0x3c, 0x14, 0x38, - 0x3c, 0x40, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xbc, 0x04, 0xcb, 0x01, 0x4c, - 0x05, 0xc1, 0x00, 0x13, 0x00, 0x14, 0xb7, 0x04, 0x11, 0x11, 0x0b, 0x01, - 0x09, 0x09, 0x0b, 0x00, 0x2f, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2f, 0x33, - 0x31, 0x30, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x2b, - 0x01, 0x35, 0x33, 0x32, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x01, 0x4c, - 0x59, 0x02, 0x35, 0x35, 0x21, 0x42, 0x26, 0x74, 0x68, 0x66, 0x69, 0x34, - 0x58, 0x2a, 0x61, 0x46, 0x63, 0x67, 0x04, 0xcb, 0x4a, 0x40, 0x26, 0x17, - 0x48, 0x8f, 0x20, 0x14, 0x2e, 0x7d, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9f, - 0x04, 0x49, 0x00, 0x62, 0x05, 0xcc, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x02, - 0x02, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, - 0x13, 0x15, 0x23, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x3d, 0x01, 0x62, 0x59, - 0x4e, 0x77, 0x23, 0x1e, 0x05, 0xcc, 0xba, 0x5e, 0x6b, 0x33, 0x72, 0x4c, - 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9f, 0x04, 0x49, 0x00, 0x62, - 0x05, 0xcc, 0x00, 0x09, 0x00, 0x0e, 0xb4, 0x08, 0x08, 0x00, 0x80, 0x05, - 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x31, 0x30, 0x13, 0x15, 0x14, 0x06, - 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x62, 0x1c, 0x25, 0x77, 0x4e, 0x59, - 0x05, 0xcc, 0x92, 0x4a, 0x6d, 0x3a, 0x6b, 0x5e, 0xba, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfd, 0xd3, 0x05, 0x3b, 0x02, 0x2e, 0x06, 0x94, 0x00, 0x13, - 0x00, 0x10, 0xb5, 0x06, 0x0d, 0x80, 0x13, 0x00, 0x0a, 0x00, 0x2f, 0x33, - 0x32, 0x1a, 0xcd, 0x32, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x1e, - 0x01, 0x33, 0x02, 0x2e, 0x66, 0xb9, 0x65, 0x72, 0x89, 0x46, 0x76, 0x87, - 0x18, 0x81, 0x20, 0xdf, 0xa4, 0x41, 0x83, 0x7f, 0x6f, 0xaa, 0x5c, 0x05, - 0x3e, 0x35, 0x38, 0x3f, 0x2e, 0x6d, 0x70, 0xa4, 0xb5, 0x2a, 0x40, 0x39, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0x25, 0xfe, 0xaa, 0x03, 0xdb, - 0x05, 0xb7, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x31, - 0x00, 0x3b, 0x00, 0x45, 0x00, 0x4f, 0x00, 0x68, 0x40, 0x35, 0x46, 0x23, - 0x1e, 0x4b, 0x3e, 0x43, 0x20, 0x48, 0x48, 0x25, 0x4d, 0x32, 0x0f, 0x0a, - 0x37, 0x0c, 0x34, 0x34, 0x11, 0x39, 0x28, 0x05, 0x00, 0x2d, 0x14, 0x19, - 0x02, 0x2a, 0x2a, 0x07, 0x2f, 0x4b, 0x43, 0x4d, 0x37, 0x39, 0x2d, 0x19, - 0x2f, 0x2f, 0x19, 0x2d, 0x39, 0x37, 0x4d, 0x43, 0x4b, 0x08, 0x1b, 0x41, - 0x3c, 0x16, 0x1b, 0x00, 0x2f, 0x33, 0x2f, 0x33, 0x12, 0x17, 0x39, 0x2f, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x34, 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, - 0x32, 0x15, 0x13, 0x34, 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, 0x32, 0x15, - 0x01, 0x34, 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, 0x32, 0x15, 0x01, 0x34, - 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, 0x32, 0x15, 0x01, 0x34, 0x23, 0x22, - 0x15, 0x23, 0x10, 0x33, 0x32, 0x15, 0x03, 0x34, 0x23, 0x22, 0x15, 0x23, - 0x10, 0x33, 0x32, 0x15, 0x01, 0x34, 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, - 0x32, 0x15, 0x25, 0x34, 0x23, 0x22, 0x15, 0x23, 0x10, 0x33, 0x32, 0x15, - 0x02, 0xfc, 0x72, 0x72, 0x67, 0xd9, 0xd9, 0x11, 0x72, 0x72, 0x67, 0xd9, - 0xd9, 0xfc, 0x8d, 0x72, 0x72, 0x67, 0xd9, 0xd9, 0x02, 0x2d, 0x72, 0x72, - 0x67, 0xd9, 0xd9, 0xfa, 0x85, 0x72, 0x72, 0x67, 0xd9, 0xd9, 0xdf, 0x72, - 0x72, 0x67, 0xd9, 0xd9, 0x02, 0x91, 0x72, 0x72, 0x67, 0xd9, 0xd9, 0xfd, - 0x19, 0x72, 0x72, 0x67, 0xd9, 0xd9, 0x03, 0xc4, 0x95, 0x95, 0x00, 0xff, - 0xff, 0xfe, 0x06, 0x95, 0x95, 0x00, 0xff, 0xff, 0x02, 0xee, 0x95, 0x95, - 0x00, 0xff, 0xff, 0xfa, 0xe6, 0x95, 0x95, 0x00, 0xff, 0xff, 0x04, 0x26, - 0x95, 0x95, 0x00, 0xff, 0xff, 0xfe, 0x06, 0x95, 0x95, 0x00, 0xff, 0xff, - 0xfc, 0xe0, 0x95, 0x95, 0x00, 0xff, 0xff, 0xf4, 0x95, 0x95, 0x00, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0x6b, 0xfe, 0x81, 0x03, 0x9f, - 0x05, 0xe7, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x31, - 0x00, 0x3b, 0x00, 0x45, 0x00, 0x4f, 0x00, 0x25, 0x40, 0x11, 0x4f, 0x4d, - 0x45, 0x40, 0x43, 0x12, 0x30, 0x12, 0x27, 0x25, 0x1e, 0x15, 0x1b, 0x0a, - 0x11, 0x09, 0x08, 0x00, 0x2f, 0x33, 0x2f, 0x33, 0x2f, 0x33, 0x2f, 0x33, - 0x33, 0x3f, 0x3f, 0x33, 0x33, 0x2f, 0x33, 0x31, 0x30, 0x17, 0x15, 0x14, - 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x11, 0x35, 0x34, 0x36, 0x37, - 0x33, 0x06, 0x15, 0x33, 0x15, 0x01, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, - 0x33, 0x35, 0x33, 0x25, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x23, 0x15, - 0x23, 0x03, 0x17, 0x1e, 0x01, 0x17, 0x07, 0x26, 0x27, 0x07, 0x27, 0x01, - 0x27, 0x2e, 0x01, 0x27, 0x37, 0x16, 0x17, 0x37, 0x17, 0x03, 0x07, 0x0e, - 0x01, 0x07, 0x27, 0x36, 0x37, 0x27, 0x37, 0x01, 0x37, 0x3e, 0x01, 0x37, - 0x17, 0x06, 0x07, 0x17, 0x07, 0x45, 0x1a, 0x1c, 0x64, 0x42, 0x4b, 0x1a, - 0x1c, 0x64, 0x42, 0x4b, 0xfd, 0x6a, 0x7a, 0x44, 0x5d, 0x29, 0x58, 0x51, - 0x9b, 0x04, 0xac, 0x7a, 0x44, 0x5d, 0x29, 0x58, 0x51, 0x9b, 0x3d, 0x56, - 0x30, 0x2f, 0x0a, 0x47, 0x0f, 0x39, 0x35, 0x6e, 0xfc, 0x45, 0x56, 0x30, - 0x2f, 0x09, 0x46, 0x0f, 0x39, 0x35, 0x6f, 0x0c, 0x56, 0x31, 0x53, 0x31, - 0x47, 0x6c, 0x3a, 0x35, 0x6e, 0x03, 0xd3, 0x56, 0x30, 0x54, 0x31, 0x47, - 0x6e, 0x39, 0x35, 0x6d, 0x3b, 0x7a, 0x44, 0x5d, 0x29, 0x58, 0x50, 0x9c, - 0x04, 0xde, 0x7a, 0x44, 0x5d, 0x29, 0x58, 0x50, 0x9c, 0xfd, 0x1c, 0x1a, - 0x1c, 0x64, 0x42, 0x4b, 0x34, 0x1a, 0x1c, 0x64, 0x42, 0x4b, 0xfe, 0xf7, - 0x57, 0x30, 0x54, 0x31, 0x46, 0x6d, 0x38, 0x35, 0x6e, 0x03, 0x07, 0x56, - 0x30, 0x54, 0x31, 0x47, 0x6d, 0x39, 0x35, 0x6e, 0xfc, 0x3e, 0x56, 0x30, - 0x2f, 0x0a, 0x47, 0x0f, 0x3a, 0x35, 0x6e, 0x03, 0x88, 0x56, 0x31, 0x2e, - 0x0a, 0x47, 0x0f, 0x39, 0x36, 0x6d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0xfe, 0x66, 0x05, 0xd8, 0x07, 0x3a, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x5c, - 0x40, 0x31, 0x15, 0x14, 0x14, 0x01, 0x11, 0x02, 0x02, 0x01, 0x19, 0x1a, - 0x1a, 0x08, 0x06, 0x0d, 0x0d, 0x0a, 0x09, 0x08, 0x01, 0x08, 0x1c, 0x1d, - 0x0d, 0x08, 0x5f, 0x59, 0x0d, 0x12, 0x17, 0x19, 0x70, 0x14, 0x80, 0x14, - 0xf0, 0x14, 0x03, 0x14, 0x80, 0x12, 0x05, 0x10, 0x00, 0x06, 0x01, 0x03, - 0x0b, 0x00, 0x12, 0x00, 0x3f, 0xc6, 0x3f, 0x33, 0x12, 0x39, 0x39, 0xde, - 0x1a, 0xcc, 0x5d, 0x32, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, - 0x14, 0x07, 0x01, 0x33, 0x11, 0x33, 0x03, 0x23, 0x13, 0x23, 0x11, 0x34, - 0x37, 0x09, 0x01, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x02, - 0xa8, 0xac, 0x08, 0x02, 0xee, 0xde, 0xc0, 0xbc, 0xac, 0x8a, 0x8c, 0x06, - 0xfd, 0x1a, 0x01, 0x58, 0xfe, 0x9c, 0x0b, 0xa4, 0x0c, 0xbf, 0xbf, 0x0c, - 0xa4, 0x0b, 0x05, 0x81, 0xfc, 0x64, 0x72, 0xa0, 0x04, 0xae, 0xfb, 0x2c, - 0xfd, 0xb9, 0x01, 0x9a, 0x03, 0xa8, 0x7a, 0x84, 0xfb, 0x5a, 0x05, 0xfa, - 0x01, 0x40, 0xc7, 0xc7, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, - 0xfe, 0xc9, 0x04, 0x98, 0x05, 0xf0, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x5b, - 0x40, 0x2d, 0x1a, 0x1b, 0x1b, 0x06, 0x04, 0x0b, 0x0b, 0x08, 0x07, 0x06, - 0x16, 0x15, 0x15, 0x12, 0x10, 0x00, 0x00, 0x12, 0x06, 0x12, 0x1e, 0x1d, - 0x18, 0x1a, 0x15, 0x80, 0x13, 0x12, 0x0f, 0x03, 0x0f, 0x04, 0x10, 0x15, - 0x08, 0x0b, 0x40, 0x0b, 0x07, 0x53, 0x59, 0x0b, 0x15, 0x04, 0x0f, 0x00, - 0x3f, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x3f, 0x12, 0x39, 0x39, - 0x3f, 0xde, 0x1a, 0xcc, 0x32, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x07, 0x01, - 0x33, 0x11, 0x33, 0x03, 0x23, 0x13, 0x23, 0x11, 0x34, 0x36, 0x37, 0x01, - 0x23, 0x11, 0x25, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x02, - 0x01, 0x3c, 0x0a, 0x01, 0xf3, 0xc5, 0xae, 0xc2, 0xac, 0x8d, 0x79, 0x07, - 0x03, 0xfe, 0x06, 0xc0, 0x01, 0xb0, 0xfe, 0x9c, 0x0b, 0xa4, 0x0c, 0xbf, - 0xbf, 0x0c, 0xa4, 0x0b, 0x04, 0x3a, 0xfd, 0xb0, 0x43, 0xd2, 0x03, 0x65, - 0xfc, 0x67, 0xfe, 0x28, 0x01, 0x37, 0x02, 0x94, 0x37, 0x8e, 0x10, 0xfc, - 0x97, 0x04, 0x3a, 0x76, 0x01, 0x40, 0xc7, 0xc7, 0xfe, 0xc0, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0xef, 0x05, 0x81, 0x00, 0x12, - 0x00, 0x1a, 0x00, 0x4e, 0x40, 0x28, 0x13, 0x0c, 0x08, 0x06, 0x04, 0x18, - 0x18, 0x12, 0x01, 0x10, 0x0c, 0x10, 0x1c, 0x1b, 0x08, 0x17, 0x5f, 0x59, - 0x07, 0x12, 0x00, 0x12, 0x60, 0x59, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x10, 0x02, 0x10, 0x18, 0x5f, 0x59, 0x10, 0x12, 0x02, 0x03, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, - 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x32, 0x04, 0x15, 0x14, - 0x04, 0x23, 0x21, 0x11, 0x23, 0x01, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, - 0x20, 0x04, 0xa4, 0xbf, 0xb7, 0xb7, 0x01, 0x97, 0xec, 0x01, 0x05, 0xfe, - 0xfe, 0xe3, 0xfd, 0x9e, 0xa4, 0x04, 0x2b, 0xa4, 0xa4, 0xfe, 0x80, 0x01, - 0x88, 0x01, 0x40, 0x04, 0xaa, 0xd7, 0xd7, 0x93, 0xea, 0xd2, 0xbe, 0xbb, - 0xe2, 0x04, 0x17, 0xfd, 0x80, 0x79, 0x83, 0xfe, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x03, 0xed, 0x05, 0xcc, 0x00, 0x12, - 0x00, 0x1b, 0x00, 0x4e, 0x40, 0x28, 0x17, 0x0b, 0x07, 0x05, 0x03, 0x13, - 0x13, 0x11, 0x00, 0x0f, 0x0b, 0x0f, 0x1d, 0x1c, 0x07, 0x1b, 0x51, 0x59, - 0x06, 0x11, 0x12, 0x11, 0x51, 0x59, 0x03, 0x12, 0x07, 0x12, 0x07, 0x12, - 0x0f, 0x01, 0x0f, 0x13, 0x51, 0x59, 0x0f, 0x15, 0x01, 0x00, 0x00, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, - 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x21, 0x11, 0x23, 0x35, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x2b, 0x01, 0x8e, 0xb4, 0x77, 0x77, 0x01, 0x0c, 0xcd, 0xd2, 0xd8, 0xc6, - 0xfe, 0x3f, 0x7a, 0x01, 0x2e, 0xf2, 0x82, 0x78, 0x74, 0x85, 0xf3, 0x05, - 0x13, 0xb9, 0xb9, 0x83, 0xfd, 0xe0, 0x93, 0x9f, 0x9a, 0xa4, 0x04, 0x90, - 0x83, 0xfb, 0x6c, 0x5c, 0x63, 0x5e, 0x57, 0x00, 0x00, 0x02, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x08, 0x05, 0x81, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x5c, - 0x40, 0x30, 0x16, 0x19, 0x00, 0x0c, 0x04, 0x0d, 0x17, 0x0d, 0x0f, 0x17, - 0x0a, 0x13, 0x13, 0x04, 0x04, 0x05, 0x0a, 0x05, 0x1c, 0x1b, 0x00, 0x0c, - 0x16, 0x03, 0x19, 0x0e, 0x0e, 0x03, 0x13, 0x03, 0x5f, 0x59, 0x18, 0x19, - 0x13, 0x19, 0x13, 0x19, 0x05, 0x06, 0x06, 0x12, 0x5f, 0x59, 0x06, 0x03, - 0x05, 0x12, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x17, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x32, 0x32, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x06, 0x23, 0x21, - 0x11, 0x23, 0x11, 0x21, 0x32, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x03, - 0x10, 0x29, 0x01, 0x11, 0x21, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x04, - 0x28, 0x77, 0xac, 0xfe, 0x62, 0xbf, 0x02, 0x51, 0xed, 0x01, 0x04, 0x56, - 0x74, 0x6b, 0x73, 0xfe, 0xb8, 0xfe, 0x85, 0x01, 0x83, 0x7e, 0x4d, 0x73, - 0x6c, 0x66, 0x16, 0x02, 0x6c, 0x47, 0xfd, 0xdb, 0x05, 0x81, 0xde, 0xca, - 0x9f, 0x6e, 0x7d, 0x60, 0x01, 0xe8, 0x01, 0x11, 0xfd, 0xd4, 0x2d, 0x7c, - 0x61, 0x6f, 0x36, 0x00, 0x00, 0x02, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x21, - 0x04, 0x4d, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x5b, 0x40, 0x31, 0x2a, 0x2c, - 0x05, 0x02, 0x04, 0x03, 0x24, 0x03, 0x1d, 0x00, 0x24, 0x12, 0x0d, 0x0d, - 0x0e, 0x00, 0x0e, 0x2f, 0x2e, 0x09, 0x16, 0x07, 0x1a, 0x1a, 0x20, 0x50, - 0x59, 0x1a, 0x10, 0x11, 0x0f, 0x0e, 0x1b, 0x05, 0x02, 0x29, 0x2c, 0x04, - 0x2b, 0x04, 0x2b, 0x27, 0x07, 0x27, 0x50, 0x59, 0x04, 0x07, 0x16, 0x00, - 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x17, 0x39, 0x18, 0x3f, - 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x17, - 0x39, 0x31, 0x30, 0x01, 0x10, 0x07, 0x17, 0x07, 0x27, 0x06, 0x23, 0x22, - 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, - 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, - 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, - 0x04, 0x1d, 0x5e, 0x62, 0x64, 0x5e, 0x57, 0x79, 0xfa, 0x56, 0x05, 0x04, - 0xb4, 0x06, 0xae, 0x01, 0x04, 0x05, 0x04, 0x30, 0x9e, 0x81, 0xc8, 0xc6, - 0xbd, 0x7a, 0x85, 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x58, 0x38, 0x76, 0x65, - 0x5f, 0x23, 0x02, 0x22, 0xfe, 0xeb, 0x8c, 0x6a, 0x5a, 0x65, 0x36, 0xbc, - 0x08, 0xa2, 0xfe, 0x59, 0x05, 0x06, 0xa7, 0x36, 0x04, 0x31, 0x66, 0x13, - 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xdd, 0xe2, 0xc2, 0x5a, 0xbf, 0x99, 0xd5, - 0xca, 0x2a, 0x7f, 0x5b, 0x68, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x01, 0x03, 0xba, 0x07, 0x1c, 0x00, 0x07, 0x00, 0x23, 0x40, 0x11, - 0x05, 0x06, 0x00, 0x03, 0x06, 0x03, 0x08, 0x09, 0x07, 0x04, 0x5f, 0x59, - 0x07, 0x03, 0x05, 0x12, 0x01, 0x00, 0x2f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x33, - 0x11, 0x21, 0x11, 0x23, 0x11, 0x03, 0x06, 0xb4, 0xfd, 0xad, 0xbf, 0x05, - 0x81, 0x01, 0x9b, 0xfd, 0xc9, 0xfb, 0x1c, 0x05, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0x0a, 0x05, 0xcc, 0x00, 0x07, - 0x00, 0x25, 0x40, 0x11, 0x00, 0x01, 0x03, 0x06, 0x01, 0x06, 0x08, 0x09, - 0x04, 0x02, 0x07, 0x50, 0x59, 0x02, 0x0f, 0x00, 0x15, 0x00, 0x3f, 0x3f, - 0x2b, 0x00, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x01, - 0x42, 0xb4, 0x01, 0xd9, 0xa3, 0xfe, 0x38, 0x04, 0x3a, 0x01, 0x92, 0xfd, - 0xeb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x04, 0x2f, - 0x05, 0x82, 0x00, 0x0d, 0x00, 0x3d, 0x40, 0x1e, 0x06, 0x0a, 0x0a, 0x08, - 0x03, 0x0d, 0x01, 0x0b, 0x03, 0x0b, 0x0f, 0x0e, 0x09, 0x0d, 0x00, 0x0d, - 0x60, 0x59, 0x06, 0x00, 0x00, 0x02, 0x0b, 0x12, 0x02, 0x05, 0x5f, 0x59, - 0x02, 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x12, 0x39, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x33, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0xa9, 0x03, - 0x87, 0xfd, 0x38, 0x01, 0xa4, 0xfe, 0x5c, 0xbf, 0xa9, 0x03, 0x26, 0x02, - 0x5c, 0x9c, 0xfe, 0x40, 0x93, 0xfd, 0x6d, 0x02, 0x93, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x02, 0xaf, 0x04, 0x3a, 0x00, 0x0d, - 0x00, 0x3f, 0x40, 0x1f, 0x03, 0x07, 0x07, 0x0c, 0x0a, 0x05, 0x08, 0x00, - 0x08, 0x00, 0x0e, 0x0f, 0x06, 0x0a, 0x0b, 0x0a, 0x50, 0x59, 0x03, 0x0b, - 0x0b, 0x08, 0x0d, 0x0d, 0x02, 0x51, 0x59, 0x0d, 0x0f, 0x08, 0x15, 0x00, - 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x32, 0x32, - 0x32, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x21, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x02, 0xaf, 0xfe, 0x93, 0xcb, - 0xcb, 0xb4, 0x7a, 0x7a, 0x04, 0x3a, 0x83, 0xfe, 0xcf, 0x84, 0xfd, 0xfe, - 0x02, 0x02, 0x84, 0x01, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, - 0xfe, 0x57, 0x04, 0xfc, 0x05, 0x81, 0x00, 0x20, 0x00, 0x4f, 0x40, 0x29, - 0x0e, 0x00, 0x1c, 0x16, 0x16, 0x17, 0x08, 0x07, 0x07, 0x17, 0x17, 0x1a, - 0x00, 0x03, 0x22, 0x21, 0x1e, 0x11, 0x5f, 0x59, 0x1c, 0x1e, 0x1e, 0x17, - 0x18, 0x18, 0x1b, 0x5f, 0x59, 0x18, 0x03, 0x08, 0x17, 0x04, 0x04, 0x0b, - 0x5f, 0x59, 0x04, 0x17, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, 0x2b, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, - 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x26, 0x23, 0x22, - 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, - 0x20, 0x00, 0x04, 0xfc, 0x93, 0xfe, 0xf6, 0xae, 0xbc, 0xfe, 0xfe, 0x3c, - 0xb2, 0x2d, 0x96, 0x83, 0xc2, 0xce, 0xb1, 0xb5, 0x3a, 0x71, 0x6a, 0x5f, - 0xbe, 0x03, 0x98, 0xfd, 0x26, 0xbb, 0xc1, 0x01, 0x09, 0x01, 0x12, 0x01, - 0x21, 0xdc, 0xfe, 0xbb, 0xa9, 0x8f, 0x8f, 0x1e, 0x5a, 0x4d, 0x01, 0x25, - 0x01, 0x0d, 0x01, 0x0e, 0xfa, 0x13, 0x1f, 0x25, 0xfd, 0x31, 0x05, 0x81, - 0x9c, 0xfe, 0x80, 0x5b, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8d, - 0xfe, 0x57, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x20, 0x00, 0x50, 0x40, 0x2a, - 0x0e, 0x00, 0x1b, 0x15, 0x15, 0x16, 0x08, 0x07, 0x07, 0x16, 0x16, 0x19, - 0x00, 0x03, 0x22, 0x21, 0x1d, 0x12, 0x50, 0x59, 0x1b, 0x1d, 0x1d, 0x16, - 0x17, 0x17, 0x1a, 0x50, 0x59, 0x17, 0x0f, 0x08, 0x08, 0x04, 0x16, 0x15, - 0x04, 0x0b, 0x50, 0x59, 0x04, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x12, 0x39, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x01, - 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, - 0x32, 0x1e, 0x01, 0x04, 0x19, 0x74, 0xd3, 0x8b, 0xb1, 0xd0, 0x2e, 0xb2, - 0x1e, 0x79, 0x66, 0x92, 0x95, 0x55, 0x9c, 0x62, 0x74, 0x66, 0xb4, 0x02, - 0x61, 0xfe, 0x53, 0x74, 0x73, 0x92, 0xe3, 0x7c, 0x5c, 0x9f, 0xeb, 0x7b, - 0x8c, 0x8f, 0x0d, 0x54, 0x4b, 0xbd, 0xb6, 0x70, 0xa4, 0x56, 0x20, 0xfe, - 0x63, 0x04, 0x3a, 0x8b, 0xfe, 0x74, 0x23, 0x75, 0xde, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1c, 0xfe, 0x68, 0x07, 0x4e, 0x05, 0x81, 0x00, 0x27, - 0x00, 0x7c, 0x40, 0x40, 0x1b, 0x22, 0x12, 0x17, 0x18, 0x18, 0x20, 0x1d, - 0x12, 0x26, 0x26, 0x27, 0x06, 0x03, 0x09, 0x0f, 0x0f, 0x27, 0x0a, 0x09, - 0x09, 0x04, 0x05, 0x05, 0x27, 0x1d, 0x03, 0x29, 0x28, 0x22, 0x03, 0x1b, - 0x06, 0x25, 0x00, 0x0f, 0x00, 0x60, 0x59, 0x12, 0x0f, 0x03, 0x06, 0x0f, - 0x0f, 0x06, 0x03, 0x03, 0x21, 0x09, 0x21, 0x1c, 0x5f, 0x59, 0x21, 0x12, - 0x1f, 0x17, 0x10, 0x09, 0x03, 0x27, 0x05, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x33, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, - 0x2f, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x01, 0x23, - 0x01, 0x26, 0x27, 0x01, 0x33, 0x13, 0x1e, 0x02, 0x33, 0x11, 0x33, 0x11, - 0x32, 0x3e, 0x01, 0x37, 0x13, 0x33, 0x01, 0x06, 0x07, 0x01, 0x33, 0x11, - 0x23, 0x11, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, 0x03, 0x52, 0x25, - 0x6f, 0x19, 0xfe, 0x55, 0xde, 0x01, 0xfd, 0x30, 0x83, 0xfe, 0xe5, 0xc8, - 0xcd, 0x6f, 0x60, 0x58, 0x4b, 0xbf, 0x4b, 0x5a, 0x62, 0x6b, 0xcd, 0xc8, - 0xfe, 0xe5, 0x83, 0x30, 0x01, 0x94, 0x70, 0xb4, 0x31, 0xfe, 0x55, 0x19, - 0x6d, 0x27, 0xbf, 0x02, 0x85, 0x1a, 0x0c, 0xfd, 0x55, 0x03, 0x07, 0x23, - 0xbd, 0x01, 0x9a, 0xfe, 0xcf, 0xa7, 0x6b, 0x28, 0x02, 0x6b, 0xfd, 0x95, - 0x29, 0x6f, 0xa2, 0x01, 0x31, 0xfe, 0x66, 0xbd, 0x23, 0xfd, 0x99, 0xfd, - 0xc8, 0x01, 0x98, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x07, 0xfe, 0x68, 0x05, 0x53, 0x04, 0x3a, 0x00, 0x27, - 0x00, 0x7c, 0x40, 0x40, 0x00, 0x21, 0x18, 0x1d, 0x1e, 0x1e, 0x23, 0x0c, - 0x09, 0x0f, 0x15, 0x15, 0x05, 0x18, 0x04, 0x04, 0x05, 0x10, 0x0f, 0x0f, - 0x0a, 0x0b, 0x0b, 0x05, 0x23, 0x03, 0x29, 0x28, 0x21, 0x0c, 0x00, 0x09, - 0x15, 0x09, 0x51, 0x59, 0x03, 0x06, 0x15, 0x06, 0x51, 0x59, 0x18, 0x15, - 0x0c, 0x15, 0x0c, 0x15, 0x27, 0x0f, 0x27, 0x22, 0x51, 0x59, 0x27, 0x15, - 0x25, 0x1d, 0x16, 0x0f, 0x0f, 0x05, 0x0b, 0x15, 0x00, 0x3f, 0x33, 0x3f, - 0x33, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, - 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, - 0x11, 0x22, 0x26, 0x27, 0x01, 0x23, 0x01, 0x26, 0x27, 0x03, 0x33, 0x17, - 0x1e, 0x02, 0x33, 0x11, 0x33, 0x11, 0x32, 0x3e, 0x02, 0x13, 0x33, 0x03, - 0x06, 0x07, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x03, 0x75, 0x13, 0x41, - 0x1a, 0xb4, 0x1a, 0x41, 0x13, 0xfe, 0xea, 0xc8, 0x01, 0x61, 0x23, 0x5d, - 0xd8, 0xbc, 0x94, 0x42, 0x48, 0x3b, 0x2e, 0xb4, 0x1e, 0x30, 0x34, 0x42, - 0xc3, 0xbc, 0xd8, 0x5d, 0x23, 0x01, 0x13, 0x4e, 0xa3, 0x25, 0x01, 0xf1, - 0x08, 0x0c, 0xfe, 0x23, 0x01, 0xdd, 0x0c, 0x08, 0xfe, 0x0f, 0x02, 0x50, - 0x1d, 0x88, 0x01, 0x45, 0xef, 0x6a, 0x5d, 0x24, 0x01, 0xda, 0xfe, 0x26, - 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, 0x88, 0x1d, 0xfe, 0x33, 0xfd, - 0xe5, 0x01, 0x98, 0x00, 0x00, 0x01, 0x00, 0x43, 0xfe, 0x57, 0x04, 0x70, - 0x05, 0x95, 0x00, 0x35, 0x00, 0x6f, 0x40, 0x3a, 0x28, 0x14, 0x1f, 0x18, - 0x25, 0x25, 0x0f, 0x2b, 0x30, 0x04, 0x1e, 0x1f, 0x1f, 0x0a, 0x09, 0x09, - 0x00, 0x04, 0x2b, 0x04, 0x37, 0x36, 0x33, 0x02, 0x60, 0x59, 0x33, 0x2e, - 0x40, 0x28, 0x15, 0x12, 0x15, 0x12, 0x60, 0x59, 0x15, 0x15, 0x22, 0x2e, - 0x2e, 0x0c, 0x60, 0x59, 0x0a, 0x0a, 0x06, 0x2e, 0x13, 0x1e, 0x1e, 0x22, - 0x22, 0x1b, 0x5f, 0x59, 0x22, 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x3f, 0x33, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x1a, 0x18, 0x10, 0xcc, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x16, 0x33, - 0x32, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x27, 0x37, 0x12, 0x21, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x01, 0x37, 0x59, 0x56, 0x81, 0x15, 0xc4, 0xfa, 0x51, - 0xa5, 0x77, 0x01, 0x07, 0x99, 0xb0, 0xc0, 0xca, 0x47, 0x47, 0xb5, 0xad, - 0x91, 0x87, 0x7e, 0xac, 0x33, 0xb2, 0x46, 0x01, 0x08, 0xc8, 0xd4, 0xfc, - 0x90, 0x88, 0x98, 0xaa, 0xdd, 0xc1, 0x1f, 0x80, 0x74, 0x73, 0x53, 0xff, - 0x00, 0x23, 0x7f, 0x50, 0x41, 0x05, 0xa3, 0xb3, 0x4d, 0xfe, 0xf0, 0x8e, - 0x80, 0x85, 0x76, 0x94, 0x77, 0x7b, 0x6b, 0x7b, 0x75, 0x82, 0x3d, 0xad, - 0xa8, 0xc7, 0xa9, 0x7f, 0xa6, 0x20, 0x17, 0xaf, 0x84, 0xad, 0xdf, 0x18, - 0x7c, 0x52, 0x5f, 0x6e, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xfe, 0x57, 0x03, 0x5e, 0x04, 0x4e, 0x00, 0x33, 0x00, 0x72, 0x40, 0x3b, - 0x13, 0x25, 0x22, 0x1c, 0x1d, 0x1d, 0x0b, 0x0a, 0x2e, 0x05, 0x16, 0x22, - 0x22, 0x10, 0x29, 0x29, 0x05, 0x00, 0x0a, 0x04, 0x34, 0x35, 0x25, 0x13, - 0x12, 0x13, 0x12, 0x50, 0x59, 0x13, 0x13, 0x1f, 0x07, 0x1c, 0x1c, 0x1f, - 0x1f, 0x19, 0x50, 0x59, 0x1f, 0x10, 0x31, 0x02, 0x51, 0x59, 0x31, 0x07, - 0x40, 0x2c, 0x07, 0x07, 0x0d, 0x50, 0x59, 0x0b, 0x0b, 0x07, 0x16, 0x00, - 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x1a, 0x18, 0x10, 0xcc, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, - 0x2e, 0x01, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x21, 0x35, - 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, - 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, - 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0xad, 0x57, 0x4e, 0x40, - 0x3b, 0x17, 0x9e, 0xbb, 0x2c, 0x9f, 0x35, 0xc9, 0x60, 0x71, 0xfe, 0xb5, - 0xa1, 0x98, 0x63, 0x5d, 0x59, 0x71, 0x0c, 0xa2, 0x2e, 0x01, 0x4b, 0xa8, - 0xce, 0x91, 0x67, 0x79, 0x99, 0x99, 0x8f, 0x21, 0x77, 0x78, 0x67, 0x54, - 0xfe, 0xfc, 0x22, 0x3d, 0x3f, 0x4f, 0x47, 0x04, 0x7c, 0x7e, 0x2c, 0xa4, - 0x5e, 0x5b, 0xc8, 0x89, 0x54, 0x58, 0x4a, 0x56, 0x4a, 0x46, 0x14, 0x01, - 0x02, 0x9f, 0x7e, 0x65, 0x88, 0x09, 0x02, 0x0d, 0x8f, 0x6d, 0x7d, 0xa8, - 0x17, 0x6b, 0x56, 0x6b, 0x71, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0xfe, 0x68, 0x04, 0xa1, 0x05, 0x81, 0x00, 0x17, 0x00, 0x51, 0x40, 0x28, - 0x12, 0x0b, 0x02, 0x08, 0x02, 0x16, 0x16, 0x17, 0x07, 0x08, 0x08, 0x11, - 0x0f, 0x0e, 0x17, 0x0e, 0x18, 0x19, 0x17, 0x12, 0x02, 0x15, 0x60, 0x59, - 0x12, 0x02, 0x12, 0x02, 0x11, 0x00, 0x11, 0x0c, 0x5f, 0x59, 0x11, 0x12, - 0x0f, 0x07, 0x00, 0x03, 0x00, 0x3f, 0x32, 0x2f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, 0x11, 0x32, 0x3e, - 0x01, 0x37, 0x13, 0x33, 0x01, 0x06, 0x07, 0x01, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, 0xa8, 0xbf, 0x4b, 0x5a, 0x62, - 0x6b, 0xcd, 0xc8, 0xfe, 0xe5, 0x83, 0x30, 0x01, 0x94, 0x6d, 0xb4, 0x2e, - 0xfe, 0x55, 0x19, 0x6d, 0x27, 0xbf, 0x05, 0x81, 0xfd, 0x95, 0x29, 0x6f, - 0xa2, 0x01, 0x31, 0xfe, 0x66, 0xbd, 0x23, 0xfd, 0x99, 0xfd, 0xc8, 0x01, - 0x98, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x8a, - 0xfe, 0x68, 0x03, 0x8a, 0x04, 0x3a, 0x00, 0x17, 0x00, 0x54, 0x40, 0x2b, - 0x0b, 0x12, 0x08, 0x02, 0x02, 0x16, 0x16, 0x17, 0x17, 0x18, 0x19, 0x07, - 0x08, 0x08, 0x10, 0x0f, 0x0e, 0x0e, 0x19, 0x17, 0x15, 0x02, 0x15, 0x51, - 0x59, 0x02, 0x12, 0x51, 0x59, 0x02, 0x02, 0x11, 0x00, 0x11, 0x0c, 0x51, - 0x59, 0x11, 0x15, 0x0f, 0x07, 0x00, 0x0f, 0x00, 0x3f, 0x32, 0x2f, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x2b, 0x00, 0x18, 0x3f, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, - 0x11, 0x32, 0x3e, 0x02, 0x13, 0x33, 0x03, 0x06, 0x07, 0x01, 0x33, 0x11, - 0x23, 0x11, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, 0x8a, 0xb4, 0x1e, - 0x30, 0x34, 0x42, 0xc3, 0xbc, 0xd8, 0x5d, 0x23, 0x01, 0x13, 0x4e, 0xa3, - 0x25, 0xfe, 0xea, 0x13, 0x41, 0x1a, 0xb4, 0x04, 0x3a, 0xfe, 0x26, 0x10, - 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, 0x88, 0x1d, 0xfe, 0x33, 0xfd, 0xe5, - 0x01, 0x98, 0x01, 0xf1, 0x08, 0x0c, 0xfe, 0x23, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0x9d, 0x05, 0x81, 0x00, 0x18, 0x00, 0x5c, 0x40, 0x2e, - 0x0c, 0x17, 0x17, 0x09, 0x18, 0x18, 0x13, 0x07, 0x10, 0x07, 0x03, 0x03, - 0x04, 0x0f, 0x10, 0x10, 0x14, 0x04, 0x14, 0x19, 0x1a, 0x16, 0x02, 0x00, - 0x09, 0x00, 0x60, 0x59, 0x13, 0x0c, 0x07, 0x09, 0x18, 0x09, 0x0a, 0x0a, - 0x09, 0x18, 0x03, 0x04, 0x0f, 0x05, 0x03, 0x15, 0x04, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, 0x23, 0x11, 0x23, 0x11, - 0x33, 0x11, 0x32, 0x37, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x13, 0x33, 0x01, - 0x06, 0x07, 0x01, 0x23, 0x01, 0x11, 0x23, 0x01, 0xd2, 0x3a, 0x31, 0xbf, - 0xbf, 0x40, 0x2b, 0x73, 0x21, 0x76, 0xca, 0xc8, 0xfe, 0xe5, 0x83, 0x30, - 0x01, 0xfd, 0xde, 0xfe, 0x86, 0x73, 0x02, 0x95, 0x10, 0xfd, 0x7b, 0x05, - 0x81, 0xfd, 0x95, 0x0f, 0x01, 0x92, 0xfe, 0xc9, 0x27, 0xac, 0x01, 0x2e, - 0xfe, 0x66, 0xbd, 0x23, 0xfc, 0xf9, 0x02, 0x6b, 0xfe, 0x8c, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8a, 0x00, 0x00, 0x03, 0x8a, 0x04, 0x3a, 0x00, 0x16, - 0x00, 0x5c, 0x40, 0x2e, 0x0c, 0x15, 0x15, 0x09, 0x16, 0x11, 0x16, 0x07, - 0x0d, 0x0e, 0x0e, 0x12, 0x12, 0x18, 0x07, 0x03, 0x03, 0x04, 0x04, 0x17, - 0x18, 0x14, 0x02, 0x00, 0x09, 0x00, 0x50, 0x59, 0x11, 0x0c, 0x07, 0x09, - 0x16, 0x09, 0x0a, 0x0a, 0x09, 0x16, 0x03, 0x04, 0x0d, 0x05, 0x0f, 0x13, - 0x04, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x2f, 0x2f, - 0x2f, 0x11, 0x33, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, - 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x32, 0x37, 0x11, 0x33, 0x15, 0x13, - 0x33, 0x03, 0x06, 0x07, 0x01, 0x23, 0x03, 0x15, 0x23, 0x01, 0x7f, 0x25, - 0x1c, 0xb4, 0xb4, 0x28, 0x19, 0x69, 0xdd, 0xbc, 0xd8, 0x5d, 0x23, 0x01, - 0x61, 0xc8, 0xda, 0x69, 0x01, 0xe5, 0x08, 0xfe, 0x23, 0x04, 0x3a, 0xfe, - 0x26, 0x09, 0x01, 0x49, 0xee, 0x01, 0x76, 0xfe, 0xbb, 0x88, 0x1d, 0xfd, - 0xb0, 0x01, 0x97, 0xf7, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x04, 0x9d, - 0x05, 0x81, 0x00, 0x1b, 0x00, 0x55, 0x40, 0x2b, 0x14, 0x11, 0x04, 0x0d, - 0x0e, 0x0e, 0x12, 0x04, 0x18, 0x18, 0x1b, 0x01, 0x19, 0x12, 0x19, 0x1d, - 0x1c, 0x08, 0x17, 0x60, 0x59, 0x14, 0x11, 0x08, 0x07, 0x1b, 0x00, 0x1b, - 0x60, 0x59, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x13, 0x19, 0x12, - 0x0d, 0x02, 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x33, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x33, 0x35, 0x33, 0x15, - 0x33, 0x15, 0x23, 0x11, 0x32, 0x3e, 0x01, 0x37, 0x13, 0x33, 0x01, 0x06, - 0x07, 0x01, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x04, - 0xa4, 0xbf, 0xb7, 0xb7, 0x4b, 0x5a, 0x62, 0x6b, 0xcd, 0xc8, 0xfe, 0xe5, - 0x83, 0x30, 0x01, 0xfd, 0xde, 0xfe, 0x55, 0x19, 0x6d, 0x27, 0xbf, 0xa4, - 0x04, 0xaa, 0xd7, 0xd7, 0x93, 0xfe, 0xff, 0x29, 0x6f, 0xa2, 0x01, 0x31, - 0xfe, 0x66, 0xbd, 0x23, 0xfc, 0xf9, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, - 0x04, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x03, 0x8a, - 0x05, 0xcc, 0x00, 0x1b, 0x00, 0x5b, 0x40, 0x2e, 0x11, 0x14, 0x0e, 0x08, - 0x08, 0x04, 0x18, 0x18, 0x1b, 0x01, 0x19, 0x19, 0x1d, 0x1c, 0x0d, 0x0e, - 0x0e, 0x13, 0x12, 0x12, 0x1d, 0x08, 0x17, 0x51, 0x59, 0x11, 0x08, 0x08, - 0x0d, 0x13, 0x19, 0x15, 0x07, 0x1b, 0x00, 0x1b, 0x51, 0x59, 0x04, 0x00, - 0x00, 0x02, 0x0d, 0x0f, 0x02, 0x00, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, - 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x32, 0x3e, - 0x02, 0x13, 0x33, 0x03, 0x06, 0x07, 0x01, 0x23, 0x01, 0x0e, 0x01, 0x23, - 0x11, 0x23, 0x11, 0x23, 0x0a, 0x80, 0xb4, 0x01, 0x30, 0xfe, 0xd0, 0x1e, - 0x30, 0x34, 0x42, 0xc3, 0xbc, 0xd8, 0x5d, 0x23, 0x01, 0x61, 0xc8, 0xfe, - 0xea, 0x13, 0x41, 0x1a, 0xb4, 0x80, 0x05, 0x39, 0x93, 0x93, 0x83, 0xfd, - 0xaa, 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, 0x88, 0x1d, 0xfd, 0xb0, - 0x01, 0xf1, 0x08, 0x0c, 0xfe, 0x23, 0x04, 0xb6, 0x00, 0x01, 0x00, 0x29, - 0x00, 0x00, 0x05, 0xdf, 0x05, 0x81, 0x00, 0x15, 0x00, 0x4e, 0x40, 0x28, - 0x0b, 0x0e, 0x08, 0x02, 0x02, 0x12, 0x12, 0x13, 0x07, 0x08, 0x08, 0x0d, - 0x0c, 0x0c, 0x13, 0x00, 0x03, 0x16, 0x17, 0x0e, 0x11, 0x02, 0x11, 0x60, - 0x59, 0x0b, 0x02, 0x02, 0x00, 0x0d, 0x13, 0x12, 0x07, 0x03, 0x00, 0x15, - 0x5f, 0x59, 0x00, 0x03, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x21, 0x11, 0x32, 0x3e, 0x01, 0x37, 0x13, - 0x33, 0x01, 0x06, 0x07, 0x01, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x29, 0x02, 0x80, 0x4b, 0x5a, 0x62, 0x6b, 0xcd, 0xc8, 0xfe, - 0xe5, 0x83, 0x30, 0x01, 0xfd, 0xde, 0xfe, 0x55, 0x19, 0x6d, 0x27, 0xbf, - 0xfe, 0x3f, 0x05, 0x81, 0xfd, 0x95, 0x29, 0x6f, 0xa2, 0x01, 0x31, 0xfe, - 0x66, 0xbd, 0x23, 0xfc, 0xf9, 0x02, 0xab, 0x0c, 0x1a, 0xfd, 0x7b, 0x04, - 0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x04, 0x4f, - 0x04, 0x3a, 0x00, 0x15, 0x00, 0x47, 0x40, 0x24, 0x0b, 0x0e, 0x08, 0x02, - 0x08, 0x0d, 0x0c, 0x0c, 0x17, 0x02, 0x12, 0x12, 0x13, 0x00, 0x13, 0x16, - 0x17, 0x02, 0x11, 0x51, 0x59, 0x0b, 0x02, 0x02, 0x00, 0x0d, 0x13, 0x15, - 0x07, 0x0f, 0x00, 0x15, 0x50, 0x59, 0x00, 0x0f, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x21, 0x11, 0x32, 0x3e, 0x02, 0x13, - 0x33, 0x03, 0x06, 0x07, 0x01, 0x23, 0x01, 0x0e, 0x01, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x28, 0x01, 0xdb, 0x1e, 0x30, 0x34, 0x42, 0xc3, 0xbc, 0xd8, - 0x5d, 0x23, 0x01, 0x61, 0xc8, 0xfe, 0xea, 0x13, 0x41, 0x1a, 0xb4, 0xfe, - 0xd9, 0x04, 0x3a, 0xfe, 0x26, 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, - 0x88, 0x1d, 0xfd, 0xb0, 0x01, 0xf1, 0x08, 0x0c, 0xfe, 0x23, 0x03, 0xaf, - 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x68, 0x05, 0xa7, 0x05, 0x81, 0x00, 0x0f, - 0x00, 0x43, 0x40, 0x23, 0x0d, 0x0c, 0x0a, 0x07, 0x0f, 0x06, 0x02, 0x02, - 0x03, 0x03, 0x0f, 0x0c, 0x03, 0x11, 0x10, 0x06, 0x01, 0x5f, 0x59, 0x06, - 0x06, 0x0f, 0x04, 0x0f, 0x0a, 0x5f, 0x59, 0x0f, 0x12, 0x0d, 0x08, 0x04, - 0x03, 0x03, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, - 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x04, 0x61, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0x87, 0xb4, - 0x92, 0x02, 0x8d, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfb, - 0x1f, 0xfd, 0xc8, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0xfe, 0x68, 0x04, 0x57, 0x04, 0x3a, 0x00, 0x10, 0x00, 0x46, 0x40, 0x24, - 0x06, 0x02, 0x02, 0x03, 0x07, 0x10, 0x10, 0x0a, 0x0a, 0x0e, 0x0d, 0x03, - 0x0d, 0x11, 0x12, 0x0b, 0x0a, 0x10, 0x0a, 0x51, 0x59, 0x06, 0x01, 0x51, - 0x59, 0x06, 0x06, 0x04, 0x10, 0x15, 0x0e, 0x08, 0x04, 0x0f, 0x03, 0x15, - 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x23, - 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x37, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x03, 0x29, 0xfe, 0x19, 0xb4, 0xb4, 0x01, 0xe7, 0xb4, 0x01, 0x79, - 0xa3, 0x8b, 0x01, 0xed, 0xfe, 0x13, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, - 0xfc, 0x47, 0x02, 0xfd, 0xe5, 0x01, 0x98, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0x00, 0x00, 0x06, 0xe0, 0x05, 0x81, 0x00, 0x0d, 0x00, 0x3d, 0x40, 0x20, - 0x0d, 0x08, 0x00, 0x07, 0x03, 0x03, 0x04, 0x04, 0x00, 0x0a, 0x03, 0x0f, - 0x0e, 0x07, 0x02, 0x5f, 0x59, 0x07, 0x07, 0x04, 0x09, 0x09, 0x0c, 0x5f, - 0x59, 0x09, 0x03, 0x05, 0x03, 0x00, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, - 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, - 0x11, 0x04, 0x61, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0x02, 0x7f, 0xfe, - 0x40, 0x02, 0x8d, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0x9c, - 0xfb, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x05, 0x0a, - 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x3d, 0x40, 0x1f, 0x01, 0x0b, 0x0b, 0x0c, - 0x07, 0x02, 0x08, 0x04, 0x08, 0x0c, 0x03, 0x0e, 0x0f, 0x0d, 0x0f, 0x01, - 0x0a, 0x51, 0x59, 0x01, 0x01, 0x03, 0x08, 0x0c, 0x15, 0x03, 0x06, 0x50, - 0x59, 0x03, 0x0f, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x11, 0x21, - 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x42, 0x01, - 0xe7, 0x01, 0xe1, 0xfe, 0xd3, 0xb4, 0xfe, 0x19, 0xb4, 0x04, 0x3a, 0xfe, - 0x36, 0x01, 0xca, 0x8b, 0xfc, 0x51, 0x01, 0xed, 0xfe, 0x13, 0x04, 0x3a, - 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x57, 0x08, 0xbb, 0x05, 0x81, 0x00, 0x21, - 0x00, 0x53, 0x40, 0x2b, 0x1a, 0x0c, 0x07, 0x21, 0x21, 0x14, 0x13, 0x13, - 0x00, 0x03, 0x04, 0x04, 0x00, 0x0c, 0x03, 0x23, 0x22, 0x09, 0x1d, 0x5f, - 0x59, 0x07, 0x09, 0x09, 0x04, 0x05, 0x05, 0x02, 0x5f, 0x59, 0x05, 0x03, - 0x14, 0x04, 0x10, 0x10, 0x17, 0x5f, 0x59, 0x10, 0x00, 0x04, 0x12, 0x00, - 0x3f, 0x33, 0xc4, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x36, 0x33, 0x20, - 0x00, 0x11, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24, 0x27, 0x37, 0x1e, 0x01, - 0x33, 0x32, 0x12, 0x11, 0x10, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x04, - 0x61, 0xfd, 0x06, 0xbf, 0x04, 0x78, 0xbb, 0xc5, 0x01, 0x09, 0x01, 0x12, - 0x93, 0xfe, 0xf6, 0xae, 0xbc, 0xfe, 0xfe, 0x3c, 0xb2, 0x2d, 0x96, 0x83, - 0xc2, 0xce, 0xb1, 0xb5, 0x4a, 0xaa, 0x84, 0x04, 0xe4, 0xfb, 0x1c, 0x05, - 0x81, 0xfd, 0xe4, 0x5b, 0xfe, 0xac, 0xfe, 0xb5, 0xdc, 0xfe, 0xbb, 0xa9, - 0x8f, 0x8f, 0x1e, 0x5a, 0x4d, 0x01, 0x25, 0x01, 0x0d, 0x01, 0x0e, 0xfa, - 0x24, 0x33, 0xfd, 0x31, 0x00, 0x01, 0x00, 0x88, 0xfe, 0x57, 0x06, 0xa6, - 0x04, 0x3a, 0x00, 0x22, 0x00, 0x56, 0x40, 0x2d, 0x15, 0x07, 0x01, 0x1c, - 0x1c, 0x1d, 0x0f, 0x0e, 0x0e, 0x1d, 0x20, 0x21, 0x21, 0x1d, 0x07, 0x03, - 0x24, 0x23, 0x03, 0x19, 0x50, 0x59, 0x01, 0x03, 0x03, 0x21, 0x22, 0x22, - 0x1f, 0x50, 0x59, 0x22, 0x0f, 0x0f, 0x0f, 0x0b, 0x1d, 0x21, 0x15, 0x0b, - 0x12, 0x50, 0x59, 0x0b, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x36, 0x33, - 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, - 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x03, 0xce, 0x74, 0x73, 0x92, - 0xe3, 0x7c, 0x74, 0xd3, 0x8b, 0xb1, 0xd0, 0x2e, 0xb2, 0x1e, 0x79, 0x66, - 0x92, 0x95, 0x55, 0x9c, 0x62, 0x74, 0x66, 0xb4, 0xfe, 0x22, 0xb4, 0x04, - 0x3a, 0xfd, 0xe9, 0x23, 0x75, 0xde, 0x97, 0x9f, 0xeb, 0x7b, 0x8c, 0x8f, - 0x0d, 0x54, 0x4b, 0xbd, 0xb6, 0x70, 0xa4, 0x56, 0x20, 0xfe, 0x63, 0x03, - 0xb2, 0xfc, 0x4e, 0x04, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, - 0xff, 0xec, 0x05, 0xdc, 0x05, 0x96, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x5a, - 0x40, 0x33, 0x15, 0x09, 0x0f, 0x2f, 0x2f, 0x1d, 0x35, 0x24, 0x00, 0x24, - 0x27, 0x32, 0x04, 0x1a, 0x1d, 0x09, 0x08, 0x38, 0x39, 0x32, 0x27, 0x1a, - 0x04, 0x04, 0x02, 0x20, 0x20, 0x2c, 0x5f, 0x59, 0x20, 0x20, 0x12, 0x0d, - 0x12, 0x5f, 0x59, 0x0d, 0x04, 0x06, 0x18, 0x5f, 0x59, 0x06, 0x13, 0x02, - 0x29, 0x5f, 0x59, 0x02, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, - 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x06, 0x23, 0x22, 0x27, 0x06, - 0x23, 0x20, 0x00, 0x11, 0x34, 0x12, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, - 0x23, 0x22, 0x02, 0x15, 0x10, 0x12, 0x33, 0x32, 0x37, 0x26, 0x02, 0x35, - 0x34, 0x12, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x02, 0x07, 0x16, 0x33, - 0x32, 0x37, 0x01, 0x22, 0x06, 0x15, 0x14, 0x12, 0x17, 0x36, 0x12, 0x35, - 0x34, 0x26, 0x05, 0xdc, 0x6b, 0x85, 0x9a, 0x87, 0x85, 0xad, 0xfe, 0xdd, - 0xfe, 0xc8, 0x80, 0xe7, 0x9c, 0x84, 0x57, 0x4f, 0x3c, 0x50, 0x95, 0xac, - 0xd6, 0xd3, 0x3c, 0x4f, 0x57, 0x6b, 0xc1, 0xa6, 0x66, 0x9b, 0x53, 0x69, - 0x5c, 0x3d, 0x43, 0x5d, 0x47, 0xfe, 0x4d, 0x57, 0x65, 0x66, 0x51, 0x53, - 0x5f, 0x5f, 0x28, 0x3c, 0x3d, 0x3d, 0x01, 0x7d, 0x01, 0x60, 0xd8, 0x01, - 0x4b, 0xaa, 0x37, 0x85, 0x22, 0xfe, 0xc1, 0xf3, 0xfe, 0xde, 0xfe, 0xdb, - 0x13, 0x60, 0x01, 0x40, 0xb0, 0xee, 0x01, 0x1d, 0x88, 0xf3, 0x99, 0xab, - 0xfe, 0xc8, 0x62, 0x13, 0x2f, 0x03, 0xa0, 0xc4, 0xa3, 0xa8, 0xfe, 0xd8, - 0x49, 0x5b, 0x01, 0x15, 0x9e, 0x9e, 0xd4, 0x00, 0x00, 0x02, 0x00, 0x23, - 0xff, 0xec, 0x04, 0x12, 0x04, 0x4c, 0x00, 0x26, 0x00, 0x32, 0x00, 0x60, - 0x40, 0x34, 0x27, 0x00, 0x21, 0x23, 0x18, 0x30, 0x0e, 0x2d, 0x2d, 0x1b, - 0x14, 0x09, 0x09, 0x1b, 0x30, 0x21, 0x04, 0x34, 0x33, 0x04, 0x18, 0x23, - 0x30, 0x04, 0x1e, 0x02, 0x1e, 0x2a, 0x50, 0x59, 0x1e, 0x1e, 0x06, 0x0c, - 0x0c, 0x11, 0x50, 0x59, 0x0c, 0x10, 0x06, 0x17, 0x51, 0x59, 0x06, 0x16, - 0x02, 0x24, 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, - 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x25, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, - 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, - 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x10, 0x07, - 0x17, 0x32, 0x37, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x17, 0x3e, 0x01, 0x04, 0x12, 0x46, 0x6b, 0x5a, 0x52, 0x51, 0x68, 0xe6, - 0xf3, 0xd6, 0xc4, 0x49, 0x49, 0x40, 0x20, 0x35, 0x6a, 0x7b, 0x9e, 0x93, - 0x32, 0x44, 0x47, 0x92, 0x76, 0x79, 0x8f, 0x8a, 0x30, 0x44, 0x30, 0xbe, - 0x37, 0x2e, 0x2f, 0x34, 0x36, 0x2f, 0x2e, 0x35, 0x23, 0x37, 0x25, 0x25, - 0x01, 0x1d, 0x01, 0x06, 0x01, 0x10, 0x01, 0x2d, 0x1b, 0x7f, 0x14, 0xec, - 0xcb, 0xcc, 0xda, 0x03, 0x4e, 0xdd, 0x75, 0xb2, 0xe2, 0xde, 0xb2, 0xfe, - 0xf7, 0x94, 0x03, 0x27, 0x01, 0x78, 0x76, 0x88, 0x8a, 0x74, 0x69, 0xc1, - 0x34, 0x34, 0xba, 0x00, 0x00, 0x01, 0x00, 0x68, 0xfe, 0x57, 0x05, 0x79, - 0x05, 0x96, 0x00, 0x27, 0x00, 0x76, 0x40, 0x45, 0x25, 0x24, 0x24, 0x08, - 0x09, 0x0e, 0x18, 0x03, 0x1e, 0x1e, 0x14, 0x18, 0x09, 0x04, 0x29, 0x28, - 0x0f, 0x25, 0x01, 0x0d, 0x03, 0x25, 0x25, 0x21, 0x21, 0x00, 0x5f, 0x59, - 0x21, 0x04, 0x14, 0x1a, 0x11, 0x11, 0x16, 0x60, 0x59, 0x11, 0x1a, 0x1a, - 0x0c, 0x00, 0x08, 0x10, 0x08, 0x40, 0x08, 0x50, 0x08, 0x90, 0x08, 0xa0, - 0x08, 0xd0, 0x08, 0xe0, 0x08, 0x08, 0x0c, 0x03, 0x08, 0x08, 0x0c, 0x0c, - 0x06, 0x5f, 0x59, 0x0c, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x33, 0x2f, 0xc4, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x20, - 0x13, 0x17, 0x06, 0x04, 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x24, 0x02, 0x35, 0x10, - 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x03, 0x18, 0xea, 0xfe, - 0xfc, 0x01, 0x0f, 0xe7, 0x01, 0x28, 0x95, 0x9c, 0x4b, 0xfe, 0xfd, 0xaf, - 0x1f, 0x80, 0x74, 0x73, 0x53, 0x59, 0x56, 0x81, 0x15, 0xcd, 0xfe, 0xd6, - 0x9d, 0x01, 0x6c, 0x01, 0x42, 0xe1, 0x01, 0x2e, 0x47, 0xb5, 0x31, 0xd9, - 0x04, 0xfa, 0xfe, 0xd3, 0xfe, 0xfa, 0xfe, 0xfd, 0xfe, 0xc5, 0x01, 0x25, - 0x4e, 0x9d, 0xbb, 0x16, 0x7c, 0x52, 0x5f, 0x6e, 0x22, 0x87, 0x23, 0x7f, - 0x50, 0x41, 0x05, 0xb3, 0x01, 0x48, 0xda, 0x01, 0x51, 0x01, 0x7e, 0xb0, - 0xad, 0x3c, 0x7b, 0x82, 0x00, 0x01, 0x00, 0x57, 0xfe, 0x57, 0x03, 0xca, - 0x04, 0x4e, 0x00, 0x28, 0x00, 0x80, 0x40, 0x52, 0x11, 0x10, 0x10, 0x1d, - 0x1e, 0x23, 0x05, 0x17, 0x0a, 0x0a, 0x00, 0x05, 0x1e, 0x04, 0x2a, 0x29, - 0x1f, 0x11, 0x7f, 0x11, 0x8f, 0x11, 0xdf, 0x11, 0x04, 0x20, 0x1d, 0x70, - 0x1d, 0x80, 0x1d, 0xd0, 0x1d, 0xe0, 0x1d, 0x05, 0x00, 0x1d, 0x10, 0x1d, - 0x60, 0x1d, 0x70, 0x1d, 0x80, 0x1d, 0xc0, 0x1d, 0xd0, 0x1d, 0x07, 0x09, - 0x03, 0x00, 0x00, 0x26, 0x07, 0x26, 0x02, 0x51, 0x59, 0x26, 0x1b, 0x1d, - 0x1d, 0x21, 0x21, 0x1a, 0x51, 0x59, 0x21, 0x15, 0x0d, 0x14, 0x50, 0x59, - 0x11, 0x11, 0x0d, 0x10, 0x07, 0x16, 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x5d, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, - 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x07, - 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x01, 0x15, 0x57, 0x4e, 0x40, - 0x3b, 0x17, 0xde, 0xe9, 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, 0x0e, 0x72, - 0x69, 0x8f, 0x80, 0x88, 0x89, 0x60, 0x81, 0x0f, 0xb6, 0x12, 0xa0, 0x7b, - 0x22, 0x77, 0x78, 0x67, 0x54, 0xfe, 0xfc, 0x22, 0x3d, 0x3f, 0x4f, 0x47, - 0x04, 0x01, 0x20, 0x01, 0x0e, 0x01, 0x11, 0x01, 0x1f, 0xac, 0x97, 0x0e, - 0x5a, 0x6a, 0xbe, 0xe1, 0xd8, 0xd0, 0x68, 0x6c, 0x0c, 0x81, 0xae, 0x1b, - 0x77, 0x4e, 0x6b, 0x71, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, - 0xfe, 0x68, 0x04, 0xb4, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x34, 0x40, 0x1b, - 0x01, 0x06, 0x03, 0x04, 0x0a, 0x04, 0x06, 0x08, 0x04, 0x0c, 0x0d, 0x00, - 0x08, 0x09, 0x08, 0x5f, 0x59, 0x09, 0x03, 0x04, 0x06, 0x06, 0x01, 0x5f, - 0x59, 0x06, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, - 0x21, 0x15, 0x02, 0xd0, 0x8c, 0xb1, 0x99, 0xfe, 0x1c, 0x04, 0x86, 0x04, - 0xe5, 0xfb, 0xbb, 0xfd, 0xc8, 0x01, 0x98, 0x04, 0xe5, 0x9c, 0x9c, 0x00, - 0x00, 0x01, 0x00, 0x23, 0xfe, 0x68, 0x03, 0x87, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x35, 0x40, 0x1b, 0x06, 0x0b, 0x08, 0x09, 0x03, 0x09, 0x0b, 0x01, - 0x04, 0x0c, 0x0d, 0x09, 0x0b, 0x0b, 0x06, 0x51, 0x59, 0x0b, 0x15, 0x05, - 0x01, 0x02, 0x01, 0x51, 0x59, 0x02, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x15, - 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x7b, 0xfe, 0xa8, 0x03, - 0x64, 0xfe, 0xa8, 0x74, 0xa3, 0x85, 0x03, 0xb7, 0x83, 0x83, 0xfc, 0xcc, - 0xfd, 0xe5, 0x01, 0x98, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x04, 0x5f, - 0x05, 0x81, 0x00, 0x0a, 0x00, 0x22, 0x40, 0x0f, 0x0a, 0x01, 0x01, 0x04, - 0x02, 0x02, 0x0b, 0x0c, 0x07, 0x02, 0x09, 0x04, 0x03, 0x02, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x01, 0x17, - 0x37, 0x01, 0x33, 0x02, 0x96, 0xbe, 0xfe, 0x3c, 0xd2, 0x01, 0x26, 0x2d, - 0x2d, 0x01, 0x27, 0xd2, 0x02, 0x48, 0xfd, 0xb8, 0x02, 0x48, 0x03, 0x39, - 0xfd, 0xc0, 0x67, 0x66, 0x02, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, - 0xfe, 0x57, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x20, 0x40, 0x0e, - 0x0a, 0x0c, 0x0c, 0x02, 0x00, 0x00, 0x0e, 0x0d, 0x06, 0x09, 0x02, 0x0f, - 0x00, 0x1b, 0x00, 0x3f, 0x3f, 0x33, 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x01, 0x33, 0x13, 0x16, - 0x17, 0x3f, 0x01, 0x13, 0x33, 0x01, 0x11, 0x01, 0xa2, 0xfe, 0x65, 0xc0, - 0xee, 0x0d, 0x38, 0x10, 0x3a, 0xf6, 0xbf, 0xfe, 0x5d, 0xfe, 0x57, 0x01, - 0xab, 0x04, 0x38, 0xfd, 0x50, 0x28, 0xc5, 0x35, 0xb6, 0x02, 0xb2, 0xfb, - 0xc6, 0xfe, 0x57, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x04, 0x5f, - 0x05, 0x81, 0x00, 0x10, 0x00, 0x36, 0x40, 0x1a, 0x0a, 0x08, 0x0d, 0x0d, - 0x02, 0x00, 0x0e, 0x0e, 0x12, 0x11, 0x0c, 0x10, 0x00, 0x10, 0x5f, 0x59, - 0x09, 0x05, 0x00, 0x00, 0x02, 0x0e, 0x12, 0x07, 0x02, 0x03, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x21, 0x01, 0x33, 0x01, 0x17, 0x37, 0x01, 0x33, 0x01, 0x21, 0x15, - 0x21, 0x11, 0x23, 0x11, 0x21, 0x3e, 0x01, 0x46, 0xfe, 0x90, 0xd2, 0x01, - 0x26, 0x2d, 0x2d, 0x01, 0x27, 0xd2, 0xfe, 0x8b, 0x01, 0x46, 0xfe, 0x66, - 0xbe, 0xfe, 0x66, 0x02, 0xe0, 0x02, 0xa1, 0xfd, 0xc0, 0x67, 0x66, 0x02, - 0x41, 0xfd, 0x5f, 0x98, 0xfd, 0xb8, 0x02, 0x48, 0x00, 0x01, 0x00, 0x07, - 0xfe, 0x57, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x12, 0x00, 0x36, 0x40, 0x1a, - 0x0c, 0x0a, 0x0f, 0x0f, 0x02, 0x00, 0x10, 0x10, 0x13, 0x14, 0x10, 0x1b, - 0x06, 0x00, 0x09, 0x02, 0x0f, 0x0e, 0x12, 0x00, 0x12, 0x50, 0x59, 0x0b, - 0x00, 0x15, 0x00, 0x3f, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, - 0x12, 0x39, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x33, 0x21, 0x01, 0x33, 0x13, 0x16, 0x17, 0x3f, - 0x01, 0x13, 0x33, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x64, - 0x01, 0x3e, 0xfe, 0x65, 0xc0, 0xee, 0x0d, 0x38, 0x10, 0x3a, 0xf6, 0xbf, - 0xfe, 0x5d, 0x01, 0x3e, 0xfe, 0xc2, 0xb4, 0xfe, 0xc2, 0x04, 0x3a, 0xfd, - 0x50, 0x28, 0xc5, 0x35, 0xb6, 0x02, 0xb2, 0xfb, 0xc6, 0x8a, 0xfe, 0xe1, - 0x01, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0xfe, 0x68, 0x05, 0x42, - 0x05, 0x81, 0x00, 0x0f, 0x00, 0x4f, 0x40, 0x2a, 0x03, 0x00, 0x06, 0x09, - 0x04, 0x08, 0x05, 0x04, 0x04, 0x01, 0x02, 0x0a, 0x0d, 0x0d, 0x0c, 0x07, - 0x08, 0x08, 0x0c, 0x02, 0x0c, 0x10, 0x11, 0x06, 0x09, 0x03, 0x00, 0x04, - 0x0f, 0x04, 0x0f, 0x0a, 0x5f, 0x59, 0x0f, 0x12, 0x0d, 0x07, 0x04, 0x03, - 0x02, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, - 0x30, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, - 0x33, 0x11, 0x23, 0x11, 0x23, 0x02, 0xb1, 0xfe, 0x50, 0xd3, 0x02, 0x18, - 0xfe, 0x11, 0xd3, 0x01, 0x88, 0x01, 0x7d, 0xd3, 0xfe, 0x1e, 0x01, 0x9a, - 0x88, 0xb4, 0x36, 0x02, 0x68, 0xfd, 0x98, 0x02, 0xdc, 0x02, 0xa5, 0xfd, - 0xd7, 0x02, 0x29, 0xfd, 0x62, 0xfd, 0xbd, 0xfd, 0xc8, 0x01, 0x98, 0x00, - 0x00, 0x01, 0x00, 0x17, 0xfe, 0x68, 0x03, 0xf2, 0x04, 0x3a, 0x00, 0x0f, - 0x00, 0x4f, 0x40, 0x2a, 0x09, 0x06, 0x00, 0x03, 0x04, 0x08, 0x05, 0x04, - 0x04, 0x01, 0x02, 0x0a, 0x0d, 0x0d, 0x0c, 0x07, 0x08, 0x08, 0x0c, 0x02, - 0x0c, 0x10, 0x11, 0x06, 0x09, 0x03, 0x00, 0x04, 0x0f, 0x04, 0x0f, 0x0a, - 0x51, 0x59, 0x0f, 0x15, 0x0d, 0x07, 0x04, 0x0f, 0x02, 0x15, 0x00, 0x3f, - 0x3f, 0x33, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x09, 0x01, 0x23, - 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x01, 0xfe, 0xfe, 0xdb, 0xc2, 0x01, 0x81, 0xfe, 0x91, 0xc7, 0x01, - 0x0e, 0x01, 0x0c, 0xc9, 0xfe, 0x91, 0x01, 0x2a, 0x64, 0xa3, 0x2e, 0x01, - 0xbc, 0xfe, 0x44, 0x02, 0x2c, 0x02, 0x0e, 0xfe, 0x5b, 0x01, 0xa5, 0xfd, - 0xf4, 0xfe, 0x55, 0xfd, 0xe5, 0x01, 0x98, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xfe, 0x68, 0x07, 0x39, 0x05, 0x81, 0x00, 0x0f, 0x00, 0x3e, 0x40, 0x21, - 0x04, 0x0d, 0x08, 0x05, 0x0b, 0x0a, 0x0a, 0x05, 0x02, 0x0d, 0x00, 0x05, - 0x10, 0x11, 0x08, 0x04, 0x0d, 0x04, 0x5f, 0x59, 0x0b, 0x0d, 0x12, 0x06, - 0x03, 0x03, 0x0f, 0x00, 0x0f, 0x5f, 0x59, 0x00, 0x03, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x3f, 0xc6, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, - 0x11, 0x21, 0x11, 0x21, 0x31, 0x04, 0x96, 0xfe, 0x14, 0x02, 0xf5, 0xba, - 0xaf, 0xb4, 0xfb, 0x97, 0xfe, 0x15, 0x05, 0x81, 0x9c, 0xfb, 0xbb, 0x04, - 0xe1, 0xfb, 0x1f, 0xfd, 0xc8, 0x01, 0x98, 0x04, 0xe5, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x26, 0xfe, 0x68, 0x05, 0x5e, 0x04, 0x3b, 0x00, 0x0f, - 0x00, 0x3f, 0x40, 0x21, 0x04, 0x0d, 0x08, 0x02, 0x05, 0x0b, 0x0a, 0x0a, - 0x05, 0x0d, 0x00, 0x04, 0x10, 0x11, 0x08, 0x04, 0x0d, 0x04, 0x51, 0x59, - 0x0b, 0x0d, 0x15, 0x06, 0x0f, 0x03, 0x0f, 0x00, 0x0f, 0x50, 0x59, 0x00, - 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x3f, 0xc6, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x26, 0x03, 0x4c, - 0xfe, 0xc8, 0x01, 0xdd, 0xb4, 0x93, 0xa3, 0xfc, 0xcb, 0xfe, 0xa0, 0x04, - 0x3b, 0x8c, 0xfc, 0xd4, 0x03, 0xb7, 0xfc, 0x49, 0xfd, 0xe5, 0x01, 0x98, - 0x03, 0xaf, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xfe, 0x68, 0x05, 0x3a, - 0x05, 0x81, 0x00, 0x16, 0x00, 0x3c, 0x40, 0x1f, 0x09, 0x06, 0x11, 0x0e, - 0x16, 0x14, 0x13, 0x13, 0x16, 0x06, 0x03, 0x17, 0x18, 0x0c, 0x03, 0x5f, - 0x59, 0x0c, 0x0c, 0x07, 0x14, 0x16, 0x16, 0x11, 0x5f, 0x59, 0x16, 0x12, - 0x0f, 0x07, 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, - 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, - 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x23, 0x11, 0x23, 0x03, 0xf0, 0x9b, 0xb6, 0x47, 0xde, 0xda, - 0xbe, 0x82, 0x86, 0x95, 0xf5, 0xbe, 0x8c, 0xb4, 0x96, 0x01, 0xfc, 0x22, - 0x18, 0xb5, 0xb8, 0x02, 0x52, 0xfd, 0xc2, 0x7b, 0x6c, 0x31, 0x02, 0xf4, - 0xfb, 0x1f, 0xfd, 0xc8, 0x01, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, - 0xfe, 0xd3, 0x04, 0x17, 0x04, 0x26, 0x00, 0x18, 0x00, 0x3a, 0x40, 0x1e, - 0x01, 0x00, 0x17, 0x14, 0x03, 0x0c, 0x0b, 0x0b, 0x03, 0x00, 0x03, 0x1a, - 0x19, 0x12, 0x06, 0x50, 0x59, 0x12, 0x12, 0x03, 0x15, 0x0c, 0x0f, 0x03, - 0x18, 0x50, 0x59, 0x01, 0x03, 0x15, 0x00, 0x3f, 0xce, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, - 0x11, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x11, 0x33, 0x15, 0x14, 0x1e, - 0x02, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x33, 0x04, 0x17, 0x94, 0x94, - 0xa6, 0x90, 0x6e, 0xbc, 0x4a, 0xb4, 0x1e, 0x3f, 0x59, 0x38, 0x66, 0xa2, - 0xb4, 0x74, 0xfe, 0xd3, 0x01, 0x2d, 0x01, 0xac, 0x34, 0x6f, 0xb4, 0x75, - 0x01, 0x16, 0xc9, 0x85, 0x61, 0x44, 0x24, 0x36, 0x01, 0xe1, 0xfc, 0x6e, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x04, 0xae, 0x05, 0x81, 0x00, 0x17, - 0x00, 0x56, 0x40, 0x2d, 0x06, 0x03, 0x0c, 0x16, 0x16, 0x09, 0x17, 0x0e, - 0x12, 0x12, 0x11, 0x11, 0x17, 0x03, 0x03, 0x18, 0x19, 0x0e, 0x13, 0x60, - 0x59, 0x0e, 0x0e, 0x09, 0x15, 0x00, 0x09, 0x00, 0x5f, 0x59, 0x0c, 0x09, - 0x17, 0x09, 0x0a, 0x0a, 0x09, 0x17, 0x03, 0x04, 0x12, 0x12, 0x0f, 0x04, - 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, - 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x06, 0x07, 0x11, 0x23, 0x02, 0x57, 0xdc, 0xdb, 0xbe, 0x7a, 0x7f, 0x7b, - 0x78, 0xa6, 0xbe, 0xbe, 0xb4, 0x6a, 0x7b, 0x01, 0xc2, 0xb3, 0xba, 0x02, - 0x52, 0xfd, 0xc2, 0x78, 0x6c, 0x03, 0x01, 0xd4, 0xfe, 0x31, 0x0a, 0x22, - 0x02, 0xf4, 0xfa, 0x7f, 0x01, 0xfc, 0x29, 0x0a, 0xfe, 0xf2, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7a, 0x00, 0x00, 0x03, 0x9c, 0x04, 0x3a, 0x00, 0x17, - 0x00, 0x56, 0x40, 0x2d, 0x07, 0x04, 0x0c, 0x16, 0x16, 0x09, 0x17, 0x0e, - 0x12, 0x12, 0x11, 0x11, 0x17, 0x04, 0x03, 0x18, 0x19, 0x0e, 0x13, 0x51, - 0x59, 0x0e, 0x0e, 0x09, 0x15, 0x01, 0x09, 0x01, 0x50, 0x59, 0x0c, 0x09, - 0x17, 0x09, 0x0a, 0x0a, 0x09, 0x17, 0x03, 0x05, 0x12, 0x15, 0x0f, 0x05, - 0x0f, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x07, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x06, 0x07, 0x15, 0x23, 0x01, 0xc0, 0x36, 0x81, 0x8f, 0xb4, 0x92, 0x70, - 0x42, 0x76, 0xb4, 0xb4, 0x77, 0x41, 0x70, 0x01, 0x79, 0x02, 0x9b, 0x8d, - 0x01, 0x9b, 0xfe, 0x6e, 0x98, 0x0a, 0x01, 0x30, 0xfe, 0xd6, 0x07, 0x22, - 0x02, 0x05, 0xfb, 0xc6, 0x01, 0xcd, 0x2f, 0x11, 0xd7, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa9, 0x00, 0x00, 0x04, 0xd5, 0x05, 0x81, 0x00, 0x10, - 0x00, 0x2d, 0x40, 0x16, 0x0b, 0x07, 0x07, 0x08, 0x00, 0x10, 0x08, 0x10, - 0x11, 0x12, 0x0d, 0x04, 0x5f, 0x59, 0x0d, 0x0d, 0x08, 0x09, 0x03, 0x00, - 0x08, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x24, - 0x33, 0x20, 0x19, 0x01, 0x04, 0x17, 0x80, 0x85, 0xb1, 0xfa, 0xbe, 0xbe, - 0x01, 0x0a, 0xa9, 0x01, 0xbb, 0x02, 0x3f, 0x7a, 0x6d, 0x32, 0xfd, 0x0c, - 0x05, 0x81, 0xfe, 0x04, 0x3b, 0xfe, 0x93, 0xfd, 0xad, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, 0x05, 0xcc, 0x12, 0x06, - 0x00, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xec, 0x06, 0x93, - 0x05, 0x96, 0x00, 0x22, 0x00, 0x29, 0x00, 0x5e, 0x40, 0x31, 0x16, 0x11, - 0x26, 0x19, 0x0d, 0x06, 0x07, 0x07, 0x27, 0x20, 0x20, 0x0d, 0x11, 0x03, - 0x2a, 0x2b, 0x00, 0x0e, 0x18, 0x0e, 0x5f, 0x59, 0x26, 0x0f, 0x18, 0x01, - 0x0b, 0x03, 0x18, 0x13, 0x18, 0x13, 0x0a, 0x1c, 0x1c, 0x23, 0x60, 0x59, - 0x1c, 0x04, 0x06, 0x06, 0x0a, 0x0a, 0x03, 0x5f, 0x59, 0x0a, 0x13, 0x00, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x16, 0x00, 0x33, 0x32, 0x36, - 0x37, 0x17, 0x06, 0x04, 0x23, 0x20, 0x00, 0x03, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x3b, 0x01, 0x12, 0x00, 0x21, 0x32, - 0x04, 0x12, 0x15, 0x14, 0x07, 0x01, 0x22, 0x00, 0x07, 0x21, 0x26, 0x00, - 0x02, 0x0b, 0x12, 0x01, 0x00, 0xce, 0x9b, 0xd5, 0x39, 0xb0, 0x52, 0xfe, - 0xc9, 0xd0, 0xfe, 0xd9, 0xfe, 0x9c, 0x14, 0x43, 0x76, 0x89, 0x11, 0xa7, - 0x16, 0x7a, 0x27, 0x19, 0x01, 0x66, 0x01, 0x21, 0xcb, 0x01, 0x34, 0xa7, - 0x05, 0xfd, 0x5f, 0xdc, 0xfe, 0xff, 0x0c, 0x03, 0xd9, 0x12, 0xfe, 0xf5, - 0x02, 0x72, 0xe4, 0xfe, 0xfa, 0x85, 0x79, 0x46, 0xa7, 0xad, 0x01, 0x55, - 0x01, 0x31, 0x87, 0x7f, 0x3a, 0x3b, 0x3b, 0x32, 0x70, 0x01, 0x2e, 0x01, - 0x58, 0xb1, 0xfe, 0xbd, 0xcd, 0x24, 0x3f, 0x02, 0x92, 0xfe, 0xf6, 0xea, - 0xe9, 0x01, 0x0b, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xec, 0x04, 0xfd, - 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x56, 0x40, 0x2c, 0x1e, 0x07, - 0x1d, 0x24, 0x00, 0x00, 0x17, 0x0c, 0x14, 0x0f, 0x0f, 0x0c, 0x1d, 0x03, - 0x26, 0x25, 0x00, 0x0d, 0x16, 0x0d, 0x50, 0x59, 0x24, 0x16, 0x11, 0x16, - 0x11, 0x09, 0x1a, 0x1a, 0x21, 0x50, 0x59, 0x1a, 0x10, 0x06, 0x06, 0x09, - 0x09, 0x03, 0x50, 0x59, 0x09, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x02, 0x03, 0x23, - 0x22, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x3b, 0x01, 0x3e, 0x01, - 0x33, 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x01, - 0xf9, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x61, 0xfe, 0xa8, 0xe8, 0xf8, - 0x0a, 0x34, 0xff, 0x11, 0xa7, 0x16, 0x7a, 0x1a, 0x15, 0xf7, 0xd4, 0x01, - 0xdd, 0xba, 0x0f, 0x90, 0x87, 0x83, 0x99, 0x06, 0x01, 0xf7, 0xba, 0xca, - 0x5e, 0x48, 0x2d, 0xff, 0x00, 0x01, 0x06, 0x01, 0x06, 0xeb, 0x3d, 0x3e, - 0x3b, 0x32, 0x70, 0xe1, 0xec, 0xfd, 0xc1, 0x18, 0x8a, 0xab, 0x9d, 0xaf, - 0x99, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xfe, 0xcb, 0x06, 0x93, - 0x05, 0x96, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x6d, 0x40, 0x39, 0x19, 0x14, - 0x00, 0x29, 0x29, 0x1c, 0x10, 0x0b, 0x0c, 0x2a, 0x07, 0x23, 0x23, 0x0c, - 0x10, 0x14, 0x04, 0x2d, 0x2e, 0x00, 0x11, 0x1b, 0x11, 0x5f, 0x59, 0x29, - 0x0f, 0x1b, 0x01, 0x0b, 0x03, 0x1b, 0x16, 0x1b, 0x16, 0x0d, 0x1f, 0x1f, - 0x26, 0x60, 0x59, 0x1f, 0x04, 0x0c, 0x0d, 0x40, 0x0a, 0x0d, 0x06, 0x06, - 0x0d, 0x0d, 0x03, 0x5f, 0x59, 0x0d, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x11, 0x33, 0x1a, 0x10, 0xcd, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x16, 0x00, - 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x04, 0x07, 0x11, 0x23, 0x11, 0x24, - 0x00, 0x03, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, - 0x3b, 0x01, 0x12, 0x00, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14, 0x07, 0x01, - 0x22, 0x00, 0x07, 0x21, 0x26, 0x00, 0x02, 0x0b, 0x12, 0x01, 0x00, 0xce, - 0x9b, 0xd5, 0x39, 0xb0, 0x49, 0xfe, 0xf3, 0xc3, 0x86, 0xfe, 0xf5, 0xfe, - 0xc4, 0x12, 0x43, 0x76, 0x89, 0x11, 0xa7, 0x16, 0x7a, 0x27, 0x19, 0x01, - 0x66, 0x01, 0x21, 0xcb, 0x01, 0x34, 0xa7, 0x05, 0xfd, 0x5f, 0xdc, 0xfe, - 0xff, 0x0c, 0x03, 0xd9, 0x12, 0xfe, 0xf5, 0x02, 0x72, 0xe4, 0xfe, 0xfa, - 0x85, 0x79, 0x46, 0x94, 0xb0, 0x0e, 0xfe, 0xdd, 0x01, 0x24, 0x14, 0x01, - 0x53, 0x01, 0x1c, 0x87, 0x7f, 0x3a, 0x3b, 0x3b, 0x32, 0x70, 0x01, 0x2e, - 0x01, 0x58, 0xb1, 0xfe, 0xbd, 0xcd, 0x24, 0x3f, 0x02, 0x92, 0xfe, 0xf6, - 0xea, 0xe9, 0x01, 0x0b, 0x00, 0x02, 0x00, 0x0a, 0xfe, 0xca, 0x04, 0xfd, - 0x04, 0x4e, 0x00, 0x1f, 0x00, 0x26, 0x00, 0x6b, 0x40, 0x37, 0x16, 0x14, - 0x11, 0x26, 0x00, 0x00, 0x19, 0x0e, 0x0a, 0x0b, 0x06, 0x07, 0x07, 0x20, - 0x1f, 0x1f, 0x0b, 0x0e, 0x11, 0x04, 0x27, 0x28, 0x00, 0x0f, 0x18, 0x0f, - 0x50, 0x59, 0x26, 0x18, 0x13, 0x18, 0x13, 0x0c, 0x1c, 0x1c, 0x23, 0x50, - 0x59, 0x1c, 0x10, 0x0b, 0x0c, 0x40, 0x09, 0x0c, 0x06, 0x06, 0x0c, 0x0c, - 0x03, 0x51, 0x59, 0x0c, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x11, 0x33, 0x1a, 0x10, 0xcd, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x2f, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x17, 0x06, 0x05, 0x11, 0x23, 0x11, 0x24, 0x03, 0x23, 0x22, - 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x3b, 0x01, 0x3e, 0x01, 0x33, - 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x01, 0xf9, - 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x58, 0xfe, 0xdb, 0x86, 0xfe, 0x72, - 0x12, 0x34, 0xff, 0x11, 0xa7, 0x16, 0x7a, 0x1a, 0x15, 0xf7, 0xd4, 0x01, - 0xdd, 0xba, 0x0f, 0x90, 0x87, 0x83, 0x99, 0x06, 0x01, 0xf7, 0xba, 0xca, - 0x5e, 0x48, 0x2d, 0xe7, 0x17, 0xfe, 0xdc, 0x01, 0x26, 0x28, 0x01, 0xe0, - 0xeb, 0x3d, 0x3e, 0x3b, 0x32, 0x70, 0xe1, 0xec, 0xfd, 0xc1, 0x18, 0x8a, - 0xab, 0x9d, 0xaf, 0x99, 0xff, 0xff, 0x00, 0xbd, 0x00, 0x00, 0x01, 0x7c, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, - 0x00, 0x00, 0x07, 0x47, 0x07, 0x2b, 0x12, 0x26, 0x03, 0xc7, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfa, 0x02, 0x5d, 0x01, 0x3b, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x24, 0x24, 0x05, 0x26, 0x01, 0x26, 0x00, 0x26, 0x2c, 0x05, 0x1c, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x07, - 0x00, 0x00, 0x05, 0x53, 0x05, 0xf0, 0x12, 0x26, 0x03, 0xe7, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfa, 0x01, 0x59, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x24, 0x24, 0x11, 0x26, 0x01, 0x26, 0x00, 0x26, 0x2c, 0x05, 0x1c, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x01, 0x00, 0xa8, - 0xfe, 0x57, 0x04, 0xff, 0x05, 0x81, 0x00, 0x22, 0x00, 0x53, 0x40, 0x29, - 0x20, 0x17, 0x1c, 0x1d, 0x1d, 0x0e, 0x0e, 0x00, 0x17, 0x13, 0x13, 0x14, - 0x08, 0x07, 0x07, 0x14, 0x00, 0x14, 0x24, 0x23, 0x20, 0x17, 0x17, 0x12, - 0x60, 0x59, 0x17, 0x17, 0x1c, 0x15, 0x03, 0x08, 0x14, 0x04, 0x04, 0x0b, - 0x5f, 0x59, 0x04, 0x14, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x3f, 0x33, 0x39, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x31, 0x30, 0x25, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x35, - 0x34, 0x24, 0x21, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x32, 0x3e, 0x01, - 0x37, 0x13, 0x33, 0x01, 0x06, 0x07, 0x04, 0x00, 0x04, 0xff, 0x95, 0xfe, - 0xf6, 0xa7, 0xbe, 0xfe, 0xfe, 0x3c, 0xb2, 0x2e, 0x9c, 0x7e, 0xbb, 0xd1, - 0xfe, 0xf5, 0xfe, 0xf6, 0xc7, 0xbf, 0xbf, 0x4b, 0x5a, 0x62, 0x6b, 0xcd, - 0xc8, 0xfe, 0xe5, 0x70, 0x34, 0x01, 0x1b, 0x01, 0x35, 0xd1, 0xbc, 0xfe, - 0xdf, 0x9d, 0x93, 0x90, 0x1e, 0x5d, 0x4f, 0x01, 0x02, 0xe0, 0xda, 0xe0, - 0xfd, 0x78, 0x05, 0x81, 0xfd, 0x95, 0x29, 0x6f, 0xa2, 0x01, 0x31, 0xfe, - 0x66, 0xa1, 0x32, 0x17, 0xfe, 0xd3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8d, - 0xfe, 0x57, 0x04, 0x19, 0x04, 0x3a, 0x00, 0x23, 0x00, 0x56, 0x40, 0x2b, - 0x21, 0x18, 0x1d, 0x1e, 0x1e, 0x0e, 0x0e, 0x00, 0x18, 0x14, 0x14, 0x15, - 0x08, 0x07, 0x07, 0x15, 0x00, 0x15, 0x25, 0x24, 0x21, 0x18, 0x18, 0x13, - 0x51, 0x59, 0x18, 0x18, 0x15, 0x1d, 0x16, 0x0f, 0x08, 0x08, 0x04, 0x15, - 0x15, 0x04, 0x0b, 0x50, 0x59, 0x04, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x2f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x31, 0x30, - 0x25, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, - 0x11, 0x32, 0x3e, 0x02, 0x13, 0x33, 0x03, 0x06, 0x07, 0x16, 0x00, 0x04, - 0x19, 0x72, 0xd2, 0x8e, 0xb1, 0xd0, 0x2e, 0xb2, 0x1e, 0x79, 0x66, 0x91, - 0x96, 0x6e, 0xc3, 0x7c, 0x80, 0xb4, 0xb4, 0x1e, 0x30, 0x34, 0x42, 0xc3, - 0xbc, 0xd8, 0x54, 0x26, 0xe5, 0x01, 0x02, 0x5c, 0xa1, 0xea, 0x7a, 0x8c, - 0x8f, 0x0d, 0x54, 0x4b, 0xba, 0xb7, 0x7f, 0xb3, 0x5d, 0xfe, 0x20, 0x04, - 0x3a, 0xfe, 0x26, 0x10, 0x33, 0x5c, 0x01, 0x3b, 0xfe, 0xbb, 0x7c, 0x24, - 0x16, 0xfe, 0xf3, 0x00, 0x00, 0x01, 0x00, 0x12, 0xfe, 0x66, 0x05, 0x52, - 0x05, 0x81, 0x00, 0x18, 0x00, 0x3a, 0x40, 0x1f, 0x18, 0x15, 0x13, 0x01, - 0x11, 0x09, 0x11, 0x13, 0x03, 0x1a, 0x19, 0x18, 0x13, 0x5f, 0x59, 0x18, - 0x12, 0x11, 0x01, 0x5f, 0x59, 0x11, 0x03, 0x16, 0x06, 0x06, 0x0b, 0x5f, - 0x59, 0x06, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x21, 0x03, 0x0a, 0x01, 0x06, 0x23, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x1a, 0x01, 0x13, 0x21, 0x11, - 0x33, 0x03, 0x23, 0x13, 0x23, 0x03, 0xdf, 0xfe, 0x5e, 0x31, 0x38, 0x60, - 0x8e, 0x7e, 0x3a, 0x1c, 0x13, 0x25, 0x35, 0x43, 0x3a, 0x3a, 0x3a, 0x2a, - 0x02, 0xff, 0xb9, 0xbc, 0xac, 0x8a, 0x95, 0x04, 0xe1, 0xfe, 0x90, 0xfe, - 0x5a, 0xfe, 0xb0, 0x8b, 0x0a, 0x98, 0x07, 0x41, 0x97, 0x01, 0x29, 0x01, - 0xb3, 0x01, 0x42, 0xfb, 0x2c, 0xfd, 0xb9, 0x01, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0b, 0xfe, 0xc9, 0x04, 0xc7, 0x04, 0x3a, 0x00, 0x17, - 0x00, 0x3a, 0x40, 0x1f, 0x17, 0x16, 0x02, 0x15, 0x04, 0x13, 0x0c, 0x13, - 0x15, 0x03, 0x19, 0x18, 0x13, 0x04, 0x51, 0x59, 0x13, 0x0f, 0x09, 0x0e, - 0x50, 0x59, 0x00, 0x09, 0x16, 0x02, 0x15, 0x53, 0x59, 0x02, 0x15, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0xc6, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x13, 0x23, 0x11, 0x21, 0x0a, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, 0x1b, 0x01, 0x21, 0x11, 0x33, 0x03, - 0x03, 0x59, 0x8d, 0x7e, 0xfe, 0x89, 0x3b, 0x40, 0x4a, 0x6d, 0x56, 0x32, - 0x2c, 0x19, 0x2b, 0x37, 0x43, 0x37, 0x23, 0x2c, 0x02, 0xce, 0xaa, 0xc2, - 0xfe, 0xc9, 0x01, 0x37, 0x03, 0xb7, 0xfe, 0x4c, 0xfe, 0xcf, 0x9c, 0x4a, - 0x0d, 0x81, 0x09, 0x6e, 0x01, 0x0e, 0x01, 0x08, 0x01, 0x45, 0xfc, 0x67, - 0xfe, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x57, 0x05, 0x20, - 0x05, 0x81, 0x00, 0x17, 0x00, 0x46, 0x40, 0x23, 0x00, 0x17, 0x17, 0x0a, - 0x0d, 0x09, 0x09, 0x0a, 0x0e, 0x06, 0x06, 0x11, 0x0a, 0x11, 0x18, 0x19, - 0x0d, 0x08, 0x5f, 0x59, 0x0d, 0x0d, 0x0f, 0x0b, 0x03, 0x00, 0x0a, 0x14, - 0x14, 0x03, 0x5f, 0x59, 0x14, 0x0a, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x3f, 0x33, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x19, 0x01, - 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x10, 0x00, - 0x21, 0x22, 0x24, 0x27, 0x01, 0x70, 0x2e, 0xa7, 0x8c, 0xd4, 0xbc, 0xfd, - 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0xfe, 0xcf, 0xfe, 0xe2, 0xc8, 0xfe, - 0xec, 0x39, 0x68, 0x5c, 0x4e, 0x01, 0x00, 0x01, 0x11, 0x01, 0x8e, 0xfd, - 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfb, 0x6c, 0xfe, 0xbe, 0xfe, - 0xac, 0x9a, 0x93, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x57, 0x03, 0xdd, - 0x04, 0x3a, 0x00, 0x17, 0x00, 0x4d, 0x40, 0x26, 0x0e, 0x06, 0x06, 0x11, - 0x00, 0x17, 0x17, 0x0a, 0x0d, 0x09, 0x09, 0x0a, 0x11, 0x0a, 0x19, 0x18, - 0x00, 0x00, 0x14, 0x0a, 0x14, 0x03, 0x50, 0x59, 0x14, 0x1b, 0x0d, 0x08, - 0x51, 0x59, 0x0d, 0x0d, 0x0a, 0x0f, 0x0b, 0x0f, 0x0a, 0x15, 0x00, 0x3f, - 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, - 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, - 0x49, 0x13, 0x6c, 0x6b, 0x7e, 0x78, 0xfe, 0x19, 0xb4, 0xb4, 0x01, 0xe7, - 0xb4, 0xdf, 0xc5, 0xb3, 0xcd, 0x22, 0x80, 0x56, 0x4a, 0xb2, 0xb5, 0x01, - 0xa6, 0xfe, 0x13, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, 0xfc, 0x05, 0xdf, - 0xfe, 0xf7, 0x85, 0x97, 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x66, 0x05, 0xd8, - 0x05, 0x81, 0x00, 0x0f, 0x00, 0x3d, 0x40, 0x1f, 0x0f, 0x0e, 0x02, 0x0d, - 0x09, 0x05, 0x05, 0x06, 0x0d, 0x06, 0x11, 0x10, 0x09, 0x04, 0x5f, 0x59, - 0x09, 0x09, 0x06, 0x0b, 0x07, 0x03, 0x00, 0x06, 0x12, 0x02, 0x0d, 0x5f, - 0x59, 0x02, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0xc6, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x13, 0x23, 0x11, 0x21, - 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x03, 0x04, - 0x70, 0x8a, 0x99, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0xb8, 0xbc, - 0xfe, 0x66, 0x01, 0x9a, 0x02, 0x8d, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, - 0x02, 0x54, 0xfb, 0x2c, 0xfd, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0xfe, 0xc9, 0x04, 0x98, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x43, 0x40, 0x22, - 0x02, 0x0a, 0x0a, 0x07, 0x06, 0x05, 0x01, 0x0d, 0x0d, 0x0e, 0x05, 0x0e, - 0x11, 0x10, 0x01, 0x0c, 0x51, 0x59, 0x01, 0x01, 0x0a, 0x03, 0x0f, 0x0f, - 0x0e, 0x15, 0x08, 0x0a, 0x0a, 0x05, 0x53, 0x59, 0x0a, 0x15, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, - 0x03, 0x23, 0x13, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x42, 0x01, - 0xe7, 0xb4, 0xbb, 0xc2, 0xac, 0x8d, 0x8e, 0xfe, 0x19, 0xb4, 0x04, 0x3a, - 0xfe, 0x36, 0x01, 0xca, 0xfc, 0x67, 0xfe, 0x28, 0x01, 0x37, 0x01, 0xed, - 0xfe, 0x13, 0x04, 0x3a, 0x00, 0x01, 0x00, 0xa0, 0xfe, 0x68, 0x04, 0xae, - 0x05, 0x81, 0x00, 0x16, 0x00, 0x40, 0x40, 0x21, 0x0b, 0x08, 0x15, 0x16, - 0x10, 0x01, 0x01, 0x13, 0x13, 0x16, 0x08, 0x03, 0x17, 0x18, 0x0e, 0x05, - 0x5f, 0x59, 0x0e, 0x0e, 0x09, 0x16, 0x14, 0x40, 0x14, 0x00, 0x5f, 0x59, - 0x14, 0x12, 0x11, 0x09, 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x1a, - 0x18, 0x10, 0xcd, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x33, - 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, - 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x03, 0x65, 0x8b, - 0x9b, 0xb6, 0x47, 0xde, 0xda, 0xbe, 0x82, 0x86, 0x95, 0xf5, 0xbe, 0x95, - 0xb4, 0xa0, 0x01, 0x5c, 0x22, 0x18, 0xb5, 0xb8, 0x02, 0x52, 0xfd, 0xc2, - 0x7b, 0x6c, 0x31, 0x02, 0xf4, 0xfa, 0x7f, 0xfe, 0x68, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7a, 0xfe, 0x68, 0x03, 0x9c, 0x04, 0x3a, 0x00, 0x15, - 0x00, 0x3c, 0x40, 0x1f, 0x01, 0x14, 0x0a, 0x0b, 0x05, 0x0d, 0x0d, 0x08, - 0x08, 0x0b, 0x14, 0x03, 0x16, 0x17, 0x03, 0x11, 0x50, 0x59, 0x03, 0x03, - 0x09, 0x06, 0x15, 0x0f, 0x09, 0x0c, 0x51, 0x59, 0x0b, 0x09, 0x15, 0x00, - 0x3f, 0xcd, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, - 0x11, 0x23, 0x11, 0x33, 0x11, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, - 0x01, 0x2e, 0xa6, 0x6e, 0xa6, 0xb4, 0x7d, 0xa3, 0x6c, 0x4e, 0x92, 0x7e, - 0x81, 0x8f, 0x04, 0x3a, 0xfe, 0x6e, 0xa2, 0x2f, 0x02, 0x05, 0xfb, 0xc6, - 0xfe, 0x68, 0x02, 0x1b, 0x01, 0x4a, 0x1e, 0x38, 0x9b, 0x8d, 0x01, 0x9b, - 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x66, 0x06, 0xc6, 0x05, 0x81, 0x00, 0x22, - 0x00, 0x47, 0x40, 0x25, 0x19, 0x16, 0x16, 0x17, 0x21, 0x05, 0x05, 0x02, - 0x01, 0x00, 0x00, 0x1d, 0x17, 0x03, 0x23, 0x24, 0x22, 0x03, 0x1d, 0x12, - 0x09, 0x03, 0x16, 0x18, 0x03, 0x0d, 0x16, 0x12, 0x02, 0x05, 0x40, 0x05, - 0x00, 0x5f, 0x59, 0x05, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, - 0xcc, 0x3f, 0x33, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x25, 0x33, 0x03, 0x23, 0x13, 0x23, 0x11, 0x34, 0x3f, 0x01, 0x07, - 0x06, 0x07, 0x01, 0x23, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x1f, 0x01, 0x11, - 0x23, 0x11, 0x33, 0x01, 0x1e, 0x01, 0x17, 0x3e, 0x01, 0x37, 0x01, 0x33, - 0x06, 0x02, 0xc4, 0xbc, 0xac, 0x8a, 0x92, 0x08, 0x01, 0x09, 0x28, 0x27, - 0xfe, 0x94, 0x86, 0xfe, 0x8f, 0x0a, 0x44, 0x05, 0x06, 0x04, 0x03, 0xaa, - 0xfb, 0x01, 0x77, 0x14, 0x25, 0x06, 0x08, 0x33, 0x09, 0x01, 0x70, 0xf5, - 0xad, 0xfd, 0xb9, 0x01, 0x9a, 0x03, 0xac, 0x7d, 0x8f, 0x1f, 0x22, 0x8a, - 0x6b, 0xfc, 0x40, 0x03, 0xc0, 0x18, 0xd7, 0x16, 0x12, 0x70, 0xbb, 0xfc, - 0x54, 0x05, 0x81, 0xfc, 0x2f, 0x3b, 0x87, 0x1e, 0x28, 0xa3, 0x15, 0x03, - 0xd1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xfe, 0xc9, 0x05, 0xa1, - 0x04, 0x3a, 0x00, 0x18, 0x00, 0x47, 0x40, 0x25, 0x0e, 0x15, 0x15, 0x12, - 0x11, 0x10, 0x08, 0x05, 0x05, 0x06, 0x06, 0x0b, 0x10, 0x03, 0x1a, 0x19, - 0x12, 0x15, 0x40, 0x15, 0x10, 0x53, 0x59, 0x15, 0x15, 0x0e, 0x0f, 0x0b, - 0x02, 0x18, 0x03, 0x06, 0x07, 0x0f, 0x01, 0x06, 0x15, 0x00, 0x3f, 0x33, - 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x16, 0x15, 0x11, 0x23, - 0x11, 0x21, 0x13, 0x16, 0x17, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x03, - 0x23, 0x13, 0x23, 0x11, 0x3f, 0x01, 0x03, 0x13, 0x99, 0xfe, 0xbc, 0x06, - 0xae, 0x01, 0x18, 0xdc, 0x34, 0x10, 0x16, 0x2e, 0xdc, 0x01, 0x0d, 0xae, - 0xc2, 0xac, 0x8d, 0x7a, 0x03, 0x05, 0x03, 0xb7, 0x9c, 0x47, 0xfd, 0x2c, - 0x04, 0x3a, 0xfd, 0x6b, 0x8f, 0x8f, 0xa1, 0x7d, 0x02, 0x95, 0xfc, 0x67, - 0xfe, 0x28, 0x01, 0x37, 0x02, 0xd4, 0x72, 0x73, 0xff, 0xff, 0x00, 0x8a, - 0x00, 0x00, 0x01, 0x3e, 0x05, 0xcc, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x06, 0xf3, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, 0x01, 0x7a, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x11, 0x11, 0x05, 0x26, 0x02, 0x14, 0x04, - 0x14, 0x1c, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x05, 0xe6, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0x01, 0x0f, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x31, 0x31, 0x11, 0x26, 0x02, 0x34, 0xb8, 0xff, - 0xd4, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x06, 0xb2, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x6e, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x18, 0x18, - 0x05, 0x26, 0x03, 0x02, 0x16, 0x06, 0x16, 0x14, 0x04, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x38, 0x38, 0x11, 0x26, 0x03, 0x02, 0x36, 0xb8, 0xff, 0xd0, - 0xb4, 0x36, 0x34, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0xa8, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, - 0xff, 0xec, 0x06, 0xc2, 0x04, 0x4e, 0x12, 0x06, 0x00, 0xa8, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x06, 0xf3, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, 0x01, 0x9c, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0f, 0xb8, 0xff, - 0xfe, 0xb4, 0x0f, 0x17, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x05, 0xe6, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, - 0x01, 0x14, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1a, 0x1a, 0x11, - 0x26, 0x02, 0x1d, 0x06, 0x1d, 0x23, 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x5e, 0xff, 0xec, 0x05, 0xa7, - 0x05, 0x96, 0x10, 0x06, 0x01, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x18, 0x04, 0x4e, 0x10, 0x06, 0x02, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x5e, 0xff, 0xec, 0x05, 0xa7, 0x06, 0xb2, 0x12, 0x26, - 0x01, 0x51, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x01, 0xb1, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x27, 0x27, 0x05, 0x26, 0x03, 0x02, - 0x25, 0xb8, 0xff, 0xf2, 0xb4, 0x25, 0x23, 0x1d, 0x15, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x18, 0x05, 0x7b, 0x12, 0x26, 0x02, 0x1b, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x21, 0x21, 0x11, 0x26, 0x03, 0x02, 0x1f, 0xb8, 0xff, 0xf2, - 0xb4, 0x1f, 0x1d, 0x12, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x47, - 0x06, 0xb2, 0x12, 0x26, 0x03, 0xc7, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x02, 0x6d, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x2b, 0x2b, - 0x05, 0x26, 0x02, 0x01, 0x29, 0xb8, 0xff, 0xff, 0xb4, 0x29, 0x27, 0x05, - 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x05, 0x53, 0x05, 0x7b, 0x12, 0x26, - 0x03, 0xe7, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x01, 0x6b, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x2b, 0x2b, 0x11, 0x26, 0x02, 0x01, - 0x29, 0x01, 0x29, 0x27, 0x05, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x43, 0xff, 0xec, 0x04, 0x70, - 0x06, 0xb2, 0x12, 0x26, 0x03, 0xc8, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x29, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x2f, 0x2f, - 0x05, 0x26, 0x02, 0x01, 0x2d, 0x13, 0x2d, 0x2b, 0x03, 0x25, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x31, - 0xff, 0xec, 0x03, 0x5e, 0x05, 0x7b, 0x12, 0x26, 0x03, 0xe8, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x2c, 0x2c, 0x11, 0x26, 0x02, 0x01, 0x2a, 0x08, 0x2a, 0x28, - 0x03, 0x22, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x01, 0x00, 0x4d, 0xff, 0xec, 0x04, 0x86, 0x05, 0x81, 0x00, 0x1a, - 0x00, 0x54, 0x40, 0x2b, 0x04, 0x03, 0x14, 0x0e, 0x0e, 0x11, 0x0f, 0x13, - 0x13, 0x09, 0x17, 0x17, 0x11, 0x03, 0x03, 0x1b, 0x1c, 0x0e, 0x14, 0x14, - 0x0d, 0x60, 0x59, 0x14, 0x14, 0x00, 0x11, 0x13, 0x10, 0x11, 0x10, 0x5f, - 0x59, 0x11, 0x03, 0x00, 0x06, 0x5f, 0x59, 0x04, 0x04, 0x00, 0x13, 0x00, - 0x3f, 0x32, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x05, 0x22, 0x24, 0x27, 0x37, 0x12, 0x21, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x1e, - 0x01, 0x15, 0x14, 0x0e, 0x01, 0x02, 0x77, 0xcc, 0xfe, 0xf8, 0x56, 0xa5, - 0x77, 0x01, 0x07, 0x99, 0xb0, 0xc0, 0xca, 0x3f, 0x01, 0xb8, 0xfc, 0xd6, - 0x04, 0x08, 0xfe, 0x37, 0xce, 0xef, 0x7f, 0xec, 0x14, 0xa1, 0xbb, 0x4d, - 0xfe, 0xf0, 0xa1, 0x87, 0x85, 0x93, 0x92, 0x01, 0x8e, 0x9c, 0xa5, 0xfe, - 0x71, 0x0b, 0xdc, 0xb2, 0x83, 0xd0, 0x75, 0x00, 0xff, 0xff, 0x00, 0x44, - 0xfe, 0x57, 0x04, 0x0b, 0x04, 0x3a, 0x12, 0x06, 0x02, 0x54, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x18, 0x06, 0x9c, 0x12, 0x26, - 0x03, 0xc9, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x01, 0x9b, 0x01, 0x49, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0f, 0x0f, 0x05, 0x26, 0x01, 0x10, 0x00, - 0x10, 0x11, 0x01, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xea, 0x05, 0x53, 0x12, 0x26, - 0x03, 0xe9, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x01, 0x04, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0f, 0x0f, 0x11, 0x26, 0x01, 0x10, 0x0d, - 0x10, 0x11, 0x0d, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x18, 0x06, 0xb2, 0x12, 0x26, - 0x03, 0xc9, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x01, 0x96, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x15, 0x15, 0x05, 0x26, 0x02, 0x01, - 0x13, 0xb8, 0xff, 0xfa, 0xb4, 0x13, 0x11, 0x01, 0x08, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0x00, 0x00, 0x03, 0xea, 0x05, 0x7b, 0x12, 0x26, 0x03, 0xe9, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x15, 0x15, 0x11, 0x26, 0x02, 0x01, 0x13, 0xb8, 0xff, 0xff, - 0xb4, 0x13, 0x11, 0x0d, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x06, 0xb2, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0xe0, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x22, 0x22, - 0x05, 0x26, 0x03, 0x02, 0x20, 0x07, 0x20, 0x1e, 0x08, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0x7b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x1e, 0x1e, 0x11, 0x26, 0x03, 0x02, 0x1c, 0x07, 0x1c, 0x1a, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x03, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x05, 0x96, 0x00, 0x0e, - 0x00, 0x15, 0x00, 0x1c, 0x00, 0x3f, 0x40, 0x20, 0x19, 0x13, 0x13, 0x08, - 0x1a, 0x12, 0x12, 0x00, 0x08, 0x00, 0x1d, 0x1e, 0x19, 0x13, 0x5f, 0x59, - 0x19, 0x19, 0x04, 0x0b, 0x0b, 0x16, 0x5f, 0x59, 0x0b, 0x04, 0x04, 0x0f, - 0x5f, 0x59, 0x04, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, - 0x01, 0x32, 0x00, 0x37, 0x21, 0x16, 0x00, 0x13, 0x22, 0x04, 0x07, 0x21, - 0x26, 0x24, 0x05, 0xd7, 0xa9, 0xfe, 0xc4, 0xd7, 0xd9, 0xfe, 0xc5, 0xa6, - 0x01, 0x72, 0x01, 0x4a, 0xd7, 0x01, 0x3c, 0xa7, 0xfd, 0x44, 0xe7, 0x01, - 0x03, 0x0d, 0xfc, 0x13, 0x0f, 0x01, 0x07, 0xe2, 0xd9, 0xfe, 0xfd, 0x19, - 0x03, 0xe6, 0x19, 0xfe, 0xfc, 0x02, 0xc7, 0xdd, 0xfe, 0xb4, 0xb2, 0xb0, - 0x01, 0x4d, 0xde, 0x01, 0x52, 0x01, 0x7d, 0xab, 0xfe, 0xba, 0xfc, 0xe2, - 0x01, 0x0e, 0xf7, 0xef, 0xfe, 0xea, 0x04, 0x73, 0xf0, 0xdd, 0xdb, 0xf2, - 0x00, 0x03, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x04, 0x4e, 0x00, 0x0a, - 0x00, 0x11, 0x00, 0x18, 0x00, 0x3f, 0x40, 0x20, 0x16, 0x0e, 0x0e, 0x00, - 0x15, 0x0f, 0x0f, 0x06, 0x00, 0x06, 0x1a, 0x19, 0x15, 0x0f, 0x51, 0x59, - 0x15, 0x15, 0x03, 0x08, 0x08, 0x12, 0x50, 0x59, 0x08, 0x10, 0x03, 0x0b, - 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, - 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x12, 0x01, 0x32, 0x36, 0x37, - 0x21, 0x1e, 0x01, 0x13, 0x22, 0x06, 0x07, 0x21, 0x2e, 0x01, 0x04, 0x1d, - 0xfa, 0xee, 0xed, 0xf2, 0x01, 0xe5, 0xf8, 0xea, 0xfe, 0x16, 0x98, 0x8d, - 0x07, 0xfd, 0xb5, 0x07, 0x8b, 0x98, 0x8e, 0x8d, 0x0d, 0x02, 0x47, 0x0b, - 0x84, 0x02, 0x1e, 0xfe, 0xe4, 0xfe, 0xea, 0x01, 0x21, 0x01, 0x11, 0x02, - 0x30, 0xfe, 0xef, 0xfd, 0x34, 0xb6, 0xc7, 0xbe, 0xbf, 0x03, 0x58, 0xa5, - 0xb3, 0xb0, 0xa8, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x06, 0xb2, 0x12, 0x26, 0x04, 0x99, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0xde, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x04, 0x03, 0x24, 0x24, - 0x05, 0x26, 0x04, 0x03, 0x22, 0x05, 0x22, 0x20, 0x08, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x05, 0x7b, 0x12, 0x26, 0x04, 0x9a, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x04, 0x03, 0x20, 0x20, 0x11, 0x26, 0x04, 0x03, 0x1e, 0x04, 0x1e, 0x1c, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x69, 0xff, 0xec, 0x05, 0x79, 0x06, 0xb2, 0x12, 0x26, - 0x03, 0xde, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x01, 0x91, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x24, 0x24, 0x05, 0x26, 0x02, 0x01, - 0x22, 0xb8, 0xff, 0xe4, 0xb4, 0x22, 0x20, 0x10, 0x0a, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x37, - 0xff, 0xec, 0x03, 0xbe, 0x05, 0x7b, 0x12, 0x26, 0x03, 0xfe, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x23, 0x23, 0x11, 0x26, 0x02, 0x01, 0x21, 0xb8, 0xff, 0xfa, - 0xb4, 0x21, 0x1f, 0x00, 0x16, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x37, 0xff, 0xec, 0x05, 0x1f, - 0x06, 0x9c, 0x12, 0x26, 0x03, 0xd4, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x01, 0x78, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x15, 0x15, 0x05, - 0x26, 0x01, 0x16, 0x12, 0x16, 0x17, 0x0b, 0x0f, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, - 0x05, 0x53, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x00, 0xc8, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x18, 0x18, 0x11, - 0x26, 0x01, 0x19, 0x0d, 0x19, 0x1a, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x37, 0xff, 0xec, 0x05, 0x1f, - 0x06, 0xb2, 0x12, 0x26, 0x03, 0xd4, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x7f, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x1b, 0x1b, - 0x05, 0x26, 0x02, 0x01, 0x19, 0x17, 0x19, 0x17, 0x0b, 0x0f, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x05, - 0xfe, 0x57, 0x03, 0xfc, 0x05, 0x7b, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x1e, 0x1e, 0x11, 0x26, 0x02, 0x01, 0x1c, 0x0b, 0x1c, 0x1a, - 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x37, 0xff, 0xec, 0x05, 0x1f, 0x06, 0xf1, 0x12, 0x26, - 0x03, 0xd4, 0x00, 0x00, 0x11, 0x07, 0x09, 0x03, 0x01, 0x7c, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x1f, 0x1f, 0x05, 0x26, 0x02, 0x01, - 0x15, 0x68, 0x15, 0x1e, 0x0b, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9f, - 0x00, 0xd7, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x22, 0x22, - 0x11, 0x26, 0x02, 0x01, 0x18, 0x6e, 0x18, 0x21, 0x09, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0xa0, - 0x00, 0x00, 0x04, 0xae, 0x06, 0xb2, 0x12, 0x26, 0x03, 0xd8, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x01, 0x01, 0x70, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x1a, 0x1a, 0x05, 0x26, 0x02, 0x01, 0x18, 0x0c, 0x18, 0x16, - 0x07, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x7a, 0x00, 0x00, 0x03, 0x9c, 0x05, 0x7b, 0x12, 0x26, - 0x03, 0xf8, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0xd2, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x19, 0x19, 0x11, 0x26, 0x02, 0x01, - 0x17, 0x0a, 0x17, 0x15, 0x11, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x68, 0x04, 0x2f, - 0x05, 0x82, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x18, 0x05, 0x06, 0x03, 0x08, - 0x08, 0x06, 0x00, 0x03, 0x0b, 0x0a, 0x09, 0x02, 0x5f, 0x59, 0x09, 0x03, - 0x06, 0x08, 0x08, 0x03, 0x5f, 0x59, 0x08, 0x12, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x10, 0xc6, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x11, 0x04, 0x2f, 0xfd, 0x38, 0x8b, 0xb1, 0x99, 0x05, 0x82, 0x9c, - 0xfb, 0xba, 0xfd, 0xc8, 0x01, 0x98, 0x05, 0x82, 0x00, 0x01, 0x00, 0x8e, - 0xfe, 0x68, 0x02, 0xaf, 0x04, 0x3a, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x18, - 0x03, 0x08, 0x05, 0x06, 0x00, 0x06, 0x08, 0x03, 0x0a, 0x0b, 0x09, 0x02, - 0x51, 0x59, 0x09, 0x0f, 0x06, 0x08, 0x08, 0x03, 0x51, 0x59, 0x08, 0x15, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x21, 0x11, - 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x02, 0xaf, 0xfe, 0x93, 0x74, 0xa3, - 0x85, 0x04, 0x3a, 0x83, 0xfc, 0xcc, 0xfd, 0xe5, 0x01, 0x98, 0x04, 0x3a, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x6d, 0x06, 0xb2, 0x12, 0x26, - 0x03, 0xdc, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x02, 0x44, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x04, 0x03, 0x1f, 0x1f, 0x05, 0x26, 0x04, 0x03, - 0x1d, 0xb8, 0xff, 0xfd, 0xb4, 0x1d, 0x1b, 0x05, 0x17, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0x00, 0x00, 0x05, 0x32, 0x05, 0x7b, 0x12, 0x26, 0x03, 0xfc, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x6a, 0x01, 0x9a, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x04, 0x03, 0x1f, 0x1f, 0x11, 0x26, 0x04, 0x03, 0x1d, 0xb8, 0xff, 0xfe, - 0xb4, 0x1d, 0x1b, 0x08, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfe, 0x57, 0x04, 0x2f, - 0x05, 0x82, 0x00, 0x19, 0x00, 0x56, 0x40, 0x2d, 0x10, 0x19, 0x19, 0x01, - 0x0a, 0x0e, 0x0e, 0x14, 0x05, 0x03, 0x01, 0x01, 0x0c, 0x07, 0x03, 0x1b, - 0x1a, 0x12, 0x17, 0x5f, 0x59, 0x12, 0x0d, 0x03, 0x04, 0x03, 0x60, 0x59, - 0x0a, 0x04, 0x04, 0x01, 0x06, 0x06, 0x09, 0x5f, 0x59, 0x06, 0x03, 0x01, - 0x0e, 0x5f, 0x59, 0x01, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x23, - 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, - 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x01, 0x15, - 0x6d, 0xa9, 0xa9, 0x03, 0x87, 0xfd, 0x38, 0x01, 0xa4, 0xfe, 0x5c, 0x59, - 0xfe, 0xe7, 0x3b, 0x49, 0x32, 0x45, 0x7b, 0x02, 0x93, 0x93, 0x02, 0x5c, - 0x9c, 0xfe, 0x40, 0x93, 0xfe, 0x08, 0xfe, 0xe4, 0xfe, 0xd8, 0x10, 0xa0, - 0x12, 0x94, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x57, 0x02, 0xaf, - 0x04, 0x3a, 0x00, 0x19, 0x00, 0x5e, 0x40, 0x30, 0x0a, 0x0e, 0x0e, 0x17, - 0x17, 0x19, 0x01, 0x12, 0x12, 0x19, 0x08, 0x0c, 0x0c, 0x03, 0x19, 0x05, - 0x19, 0x1b, 0x1a, 0x0b, 0x01, 0x02, 0x01, 0x50, 0x59, 0x08, 0x02, 0x02, - 0x19, 0x04, 0x19, 0x0c, 0x50, 0x59, 0x19, 0x15, 0x10, 0x15, 0x50, 0x59, - 0x10, 0x1b, 0x04, 0x07, 0x51, 0x59, 0x04, 0x0f, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, - 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x3d, 0x01, 0x23, 0x8e, 0x7a, 0x7a, 0x02, 0x21, 0xfe, - 0x93, 0xcb, 0xcb, 0x53, 0xfe, 0xe7, 0x33, 0x49, 0x31, 0x3e, 0x7e, 0x5f, - 0x02, 0x02, 0x84, 0x01, 0xb4, 0x83, 0xfe, 0xcf, 0x84, 0xfe, 0x99, 0xfe, - 0xe4, 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x91, 0x7a, 0x00, 0x01, 0x00, 0x2e, - 0xfe, 0x57, 0x05, 0x4b, 0x05, 0x81, 0x00, 0x1a, 0x00, 0x47, 0x40, 0x26, - 0x06, 0x18, 0x15, 0x0f, 0x12, 0x05, 0x13, 0x16, 0x17, 0x17, 0x0b, 0x00, - 0x14, 0x13, 0x13, 0x10, 0x11, 0x00, 0x11, 0x1c, 0x1b, 0x16, 0x03, 0x0f, - 0x12, 0x18, 0x15, 0x04, 0x10, 0x14, 0x03, 0x03, 0x08, 0x5f, 0x59, 0x03, - 0x10, 0x12, 0x00, 0x3f, 0xcc, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x17, 0x39, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x05, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x01, - 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x16, - 0x05, 0x4b, 0xa0, 0x80, 0x3b, 0x49, 0x3a, 0x3d, 0x35, 0x43, 0x1f, 0x55, - 0xfe, 0x8f, 0xfe, 0x50, 0xd3, 0x02, 0x18, 0xfe, 0x11, 0xd3, 0x01, 0x88, - 0x01, 0x7d, 0xd3, 0xfe, 0x1e, 0x01, 0xdf, 0x4c, 0xa3, 0x74, 0x92, 0x10, - 0xa0, 0x15, 0x3c, 0x3f, 0x1d, 0x49, 0x7c, 0x02, 0x19, 0xfd, 0x98, 0x02, - 0xdc, 0x02, 0xa5, 0xfd, 0xd7, 0x02, 0x29, 0xfd, 0x62, 0xfd, 0x5b, 0x75, - 0x00, 0x01, 0x00, 0x17, 0xfe, 0x57, 0x03, 0xfe, 0x04, 0x3a, 0x00, 0x1a, - 0x00, 0x46, 0x40, 0x26, 0x12, 0x0f, 0x15, 0x18, 0x06, 0x05, 0x13, 0x16, - 0x17, 0x17, 0x0b, 0x00, 0x14, 0x13, 0x13, 0x10, 0x11, 0x00, 0x11, 0x1c, - 0x1b, 0x03, 0x08, 0x08, 0x59, 0x03, 0x1b, 0x15, 0x18, 0x12, 0x0f, 0x04, - 0x11, 0x16, 0x13, 0x0f, 0x11, 0x15, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x17, - 0x39, 0x10, 0xcc, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, - 0x05, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x2e, 0x01, 0x03, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, - 0x09, 0x01, 0x16, 0x03, 0xfe, 0x91, 0x78, 0x3b, 0x49, 0x3a, 0x38, 0x39, - 0x3a, 0x24, 0x6e, 0xc6, 0xfe, 0xdb, 0xc2, 0x01, 0x81, 0xfe, 0x91, 0xc7, - 0x01, 0x0e, 0x01, 0x0c, 0xc9, 0xfe, 0x91, 0x01, 0x44, 0x56, 0x98, 0x7d, - 0x94, 0x10, 0xa0, 0x15, 0x41, 0x32, 0x25, 0x5b, 0xa9, 0x01, 0x2e, 0xfe, - 0x44, 0x02, 0x2c, 0x02, 0x0e, 0xfe, 0x5b, 0x01, 0xa5, 0xfd, 0xf4, 0xfe, - 0x31, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x2b, - 0x05, 0x81, 0x00, 0x11, 0x00, 0x52, 0x40, 0x28, 0x01, 0x0a, 0x06, 0x0e, - 0x0e, 0x0b, 0x0c, 0x0c, 0x00, 0x11, 0x06, 0x09, 0x08, 0x08, 0x02, 0x03, - 0x11, 0x03, 0x13, 0x12, 0x10, 0x05, 0x06, 0x05, 0x5f, 0x59, 0x0d, 0x01, - 0x03, 0x0a, 0x08, 0x06, 0x06, 0x03, 0x0b, 0x08, 0x03, 0x00, 0x03, 0x12, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x12, 0x39, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x21, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x21, - 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x04, 0x58, - 0xfe, 0x59, 0xfe, 0x50, 0xd3, 0x01, 0xde, 0xfe, 0xa8, 0x01, 0x57, 0xfe, - 0x4c, 0xd3, 0x01, 0x88, 0x01, 0x7d, 0xd3, 0xfe, 0x53, 0x01, 0x4e, 0xfe, - 0xba, 0x01, 0xce, 0x02, 0x68, 0xfd, 0x98, 0x02, 0x91, 0x98, 0x02, 0x58, - 0xfd, 0xd7, 0x02, 0x29, 0xfd, 0xa8, 0x98, 0xfd, 0x6f, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x03, 0xea, 0x04, 0x3a, 0x00, 0x11, - 0x00, 0x52, 0x40, 0x28, 0x0a, 0x01, 0x06, 0x0e, 0x0e, 0x0b, 0x0c, 0x0c, - 0x00, 0x11, 0x06, 0x09, 0x08, 0x08, 0x02, 0x03, 0x11, 0x03, 0x13, 0x12, - 0x10, 0x05, 0x06, 0x05, 0x50, 0x59, 0x0d, 0x01, 0x03, 0x0a, 0x08, 0x06, - 0x06, 0x03, 0x0b, 0x08, 0x0f, 0x00, 0x03, 0x15, 0x00, 0x3f, 0x33, 0x3f, - 0x33, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x21, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0x33, 0x09, 0x01, - 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x03, 0x21, 0xfe, 0xdd, 0xfe, 0xdb, - 0xc2, 0x01, 0x50, 0xfe, 0xcc, 0x01, 0x30, 0xfe, 0xc6, 0xc7, 0x01, 0x0e, - 0x01, 0x0c, 0xc9, 0xfe, 0xc5, 0x01, 0x36, 0xfe, 0xc8, 0x01, 0x54, 0x01, - 0xbc, 0xfe, 0x44, 0x01, 0xe6, 0x92, 0x01, 0xc2, 0xfe, 0x5b, 0x01, 0xa5, - 0xfe, 0x3e, 0x92, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, - 0x00, 0x00, 0x04, 0x9a, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x34, - 0x40, 0x1a, 0x0c, 0x00, 0x05, 0x0f, 0x0f, 0x08, 0x00, 0x08, 0x13, 0x14, - 0x04, 0x11, 0x5f, 0x59, 0x04, 0x04, 0x09, 0x06, 0x09, 0x0e, 0x5f, 0x59, - 0x09, 0x12, 0x06, 0x03, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x01, 0x33, 0x21, 0x11, 0x33, - 0x11, 0x21, 0x22, 0x24, 0x37, 0x10, 0x29, 0x01, 0x11, 0x21, 0x20, 0x58, - 0x73, 0xdc, 0x96, 0x01, 0x9e, 0xbf, 0xfd, 0xaf, 0xed, 0xfe, 0xfc, 0xc0, - 0x01, 0x48, 0x01, 0x7b, 0xfe, 0x7d, 0xfe, 0xc0, 0x01, 0xa8, 0x81, 0xc6, - 0x6d, 0x02, 0x25, 0xfa, 0x7f, 0xde, 0xcc, 0xfe, 0xef, 0x02, 0x2c, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x03, 0xef, 0x05, 0xcc, 0x12, 0x06, - 0x00, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0xff, 0xec, 0x07, 0x39, - 0x05, 0x81, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x4e, 0x40, 0x28, 0x1e, 0x21, - 0x0c, 0x19, 0x19, 0x16, 0x07, 0x07, 0x21, 0x00, 0x12, 0x21, 0x12, 0x28, - 0x27, 0x24, 0x1b, 0x60, 0x59, 0x24, 0x13, 0x1f, 0x1f, 0x15, 0x15, 0x09, - 0x5f, 0x59, 0x0c, 0x15, 0x15, 0x0f, 0x17, 0x03, 0x0f, 0x03, 0x60, 0x59, - 0x0f, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x21, - 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x35, 0x34, 0x24, 0x33, - 0x21, 0x11, 0x33, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x1b, 0xa7, 0x99, 0x7c, 0xaf, 0x55, - 0xfe, 0x88, 0xa4, 0xa4, 0x03, 0x02, 0x4c, 0xe8, 0xa9, 0xe2, 0xfe, 0xfd, - 0x01, 0x05, 0xec, 0x01, 0x8f, 0xbf, 0xfb, 0x7e, 0x71, 0xb5, 0xe5, 0xbe, - 0x8c, 0xc1, 0x01, 0x97, 0x85, 0x8b, 0x51, 0x9c, 0x6e, 0xb1, 0x83, 0xfe, - 0xa9, 0x62, 0x57, 0xe2, 0xbb, 0xbe, 0xd2, 0x02, 0x54, 0xfc, 0x37, 0xfe, - 0xc5, 0x9b, 0x9f, 0x01, 0x91, 0xfe, 0x45, 0xc0, 0xe1, 0x6f, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x06, 0x7b, 0x05, 0xcc, 0x00, 0x1d, - 0x00, 0x29, 0x00, 0x55, 0x40, 0x2c, 0x1d, 0x02, 0x07, 0x17, 0x17, 0x14, - 0x13, 0x24, 0x1e, 0x0d, 0x0d, 0x24, 0x02, 0x03, 0x2b, 0x2a, 0x15, 0x00, - 0x07, 0x0a, 0x13, 0x0f, 0x00, 0x00, 0x0a, 0x0f, 0x0f, 0x27, 0x50, 0x59, - 0x0f, 0x10, 0x0a, 0x21, 0x50, 0x59, 0x0a, 0x16, 0x05, 0x1a, 0x50, 0x59, - 0x05, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x3f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x12, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x15, 0x14, 0x06, 0x23, 0x20, - 0x27, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, - 0x33, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, - 0xc6, 0xb5, 0xe2, 0xc0, 0xfe, 0xfa, 0x5f, 0x3a, 0xc8, 0x8e, 0xcd, 0xc1, - 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, 0x71, 0x7e, 0x7e, 0x70, - 0xfb, 0x4d, 0x78, 0x87, 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0x02, 0x7a, - 0xe9, 0xbf, 0xe6, 0xcb, 0x69, 0x62, 0x01, 0x14, 0x01, 0x18, 0x02, 0x36, - 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfb, 0xe9, 0x9f, 0x9f, 0x9e, 0x9f, 0x6a, - 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x00, 0x01, 0x00, 0x60, - 0xff, 0xec, 0x07, 0x22, 0x05, 0x95, 0x00, 0x29, 0x00, 0x51, 0x40, 0x2a, - 0x19, 0x0c, 0x0c, 0x1f, 0x03, 0x24, 0x27, 0x27, 0x03, 0x08, 0x13, 0x04, - 0x2a, 0x2b, 0x1c, 0x08, 0x07, 0x08, 0x07, 0x60, 0x59, 0x25, 0x25, 0x08, - 0x08, 0x00, 0x16, 0x12, 0x12, 0x16, 0x16, 0x0f, 0x5f, 0x59, 0x16, 0x04, - 0x00, 0x22, 0x60, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x33, 0x2f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, - 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x36, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, - 0x1e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x20, 0x19, 0x01, 0x33, 0x11, 0x14, - 0x06, 0x05, 0x64, 0xcb, 0xdd, 0xbe, 0xd9, 0x47, 0x47, 0xb5, 0xad, 0x91, - 0x87, 0x7e, 0xac, 0x33, 0xb2, 0x46, 0x01, 0x08, 0xc8, 0xd4, 0xfc, 0x90, - 0x88, 0x99, 0xa7, 0x7b, 0x7c, 0x01, 0x08, 0xb5, 0xf9, 0x14, 0xe1, 0xcf, - 0x7e, 0x74, 0x94, 0x77, 0x7b, 0x6b, 0x7b, 0x75, 0x82, 0x3d, 0xad, 0xa8, - 0xc7, 0xa9, 0x7f, 0xa6, 0x20, 0x16, 0x9c, 0x7f, 0x9e, 0x94, 0x01, 0x3a, - 0x01, 0x91, 0xfe, 0x45, 0xbc, 0xe5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x55, - 0xff, 0xec, 0x06, 0x01, 0x04, 0x4e, 0x00, 0x26, 0x00, 0x51, 0x40, 0x2a, - 0x1c, 0x02, 0x02, 0x15, 0x09, 0x21, 0x24, 0x10, 0x05, 0x09, 0x24, 0x04, - 0x28, 0x27, 0x18, 0x06, 0x05, 0x06, 0x05, 0x50, 0x59, 0x22, 0x22, 0x06, - 0x06, 0x00, 0x12, 0x0f, 0x0f, 0x12, 0x12, 0x0c, 0x50, 0x59, 0x12, 0x10, - 0x00, 0x1f, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x33, 0x2f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x20, 0x03, 0x2e, 0x01, - 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, - 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x17, - 0x1e, 0x01, 0x33, 0x32, 0x11, 0x35, 0x33, 0x15, 0x14, 0x06, 0x04, 0x4f, - 0xfe, 0x8f, 0x2e, 0x0e, 0x93, 0xbb, 0xa1, 0x98, 0x63, 0x5d, 0x59, 0x71, - 0x0c, 0xa2, 0x2e, 0x01, 0x4b, 0xa8, 0xce, 0x91, 0x67, 0x90, 0x7a, 0x09, - 0x0a, 0x82, 0x64, 0xfd, 0xb5, 0xeb, 0x14, 0x01, 0x4b, 0x67, 0x55, 0x89, - 0x54, 0x58, 0x4a, 0x56, 0x4a, 0x46, 0x14, 0x01, 0x02, 0x9f, 0x7e, 0x65, - 0x88, 0x09, 0x02, 0x0f, 0x63, 0x61, 0x7b, 0x74, 0x01, 0x3d, 0xc6, 0xe9, - 0xc1, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x68, 0x05, 0x07, - 0x05, 0x95, 0x00, 0x23, 0x00, 0x53, 0x40, 0x2b, 0x10, 0x11, 0x0a, 0x17, - 0x17, 0x23, 0x1e, 0x21, 0x20, 0x20, 0x1e, 0x05, 0x11, 0x04, 0x24, 0x25, - 0x1a, 0x06, 0x05, 0x06, 0x05, 0x60, 0x59, 0x06, 0x06, 0x14, 0x21, 0x23, - 0x23, 0x1e, 0x5f, 0x59, 0x23, 0x12, 0x10, 0x10, 0x14, 0x14, 0x0d, 0x5f, - 0x59, 0x14, 0x04, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, - 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x2e, 0x01, 0x2b, 0x01, 0x35, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, - 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1d, 0x01, - 0x33, 0x11, 0x23, 0x11, 0x23, 0x03, 0xbc, 0x4a, 0x9b, 0xb2, 0x47, 0x47, - 0xb5, 0xad, 0x91, 0x87, 0x7e, 0xac, 0x33, 0xb2, 0x46, 0x01, 0x08, 0xc8, - 0xd4, 0xfc, 0x90, 0x88, 0xaa, 0x96, 0x99, 0xb4, 0x97, 0x01, 0x75, 0x6a, - 0x7a, 0x35, 0x94, 0x77, 0x7b, 0x6b, 0x7b, 0x75, 0x82, 0x3d, 0xad, 0xa8, - 0xc7, 0xa9, 0x7f, 0xa6, 0x20, 0x18, 0xa7, 0x92, 0xef, 0xfd, 0xc8, 0x01, - 0x98, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x55, 0xfe, 0x68, 0x03, 0xd6, - 0x04, 0x4e, 0x00, 0x1f, 0x00, 0x55, 0x40, 0x2c, 0x13, 0x14, 0x0d, 0x19, - 0x19, 0x05, 0x00, 0x03, 0x02, 0x02, 0x00, 0x09, 0x14, 0x04, 0x20, 0x21, - 0x1c, 0x0a, 0x09, 0x0a, 0x09, 0x50, 0x59, 0x0a, 0x0a, 0x16, 0x05, 0x13, - 0x13, 0x16, 0x16, 0x10, 0x50, 0x59, 0x16, 0x10, 0x03, 0x05, 0x05, 0x00, - 0x51, 0x59, 0x05, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x33, 0x11, 0x23, 0x11, - 0x23, 0x11, 0x34, 0x26, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, - 0x15, 0x04, 0x15, 0x03, 0x5f, 0x77, 0xa3, 0x83, 0xa3, 0xb9, 0xa1, 0x98, - 0x63, 0x5d, 0x59, 0x71, 0x0c, 0xa2, 0x2e, 0x01, 0x4b, 0xa8, 0xce, 0x91, - 0x67, 0x01, 0x13, 0x83, 0xfd, 0xe5, 0x01, 0x98, 0x01, 0x25, 0x6a, 0x64, - 0x89, 0x54, 0x58, 0x4a, 0x56, 0x4a, 0x46, 0x14, 0x01, 0x02, 0x9f, 0x7e, - 0x65, 0x88, 0x09, 0x02, 0x1d, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, - 0xff, 0xec, 0x07, 0x41, 0x05, 0x81, 0x00, 0x22, 0x00, 0x43, 0x40, 0x23, - 0x05, 0x15, 0x17, 0x03, 0x1d, 0x20, 0x20, 0x03, 0x15, 0x0c, 0x04, 0x23, - 0x24, 0x1e, 0x1e, 0x0a, 0x15, 0x15, 0x05, 0x5f, 0x59, 0x15, 0x03, 0x0a, - 0x0f, 0x5f, 0x59, 0x0a, 0x13, 0x00, 0x1a, 0x60, 0x59, 0x00, 0x13, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x11, 0x21, 0x03, - 0x0a, 0x01, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, - 0x1a, 0x01, 0x13, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x06, 0x05, 0x92, 0xc7, 0xec, 0xfe, 0x5e, 0x31, 0x38, - 0x60, 0x8e, 0x7e, 0x3a, 0x1c, 0x13, 0x25, 0x35, 0x43, 0x3a, 0x3a, 0x3a, - 0x2a, 0x02, 0xff, 0x78, 0x82, 0x82, 0x77, 0xb5, 0xec, 0x14, 0xe0, 0xc1, - 0x03, 0x54, 0xfe, 0x90, 0xfe, 0x5a, 0xfe, 0xb0, 0x8b, 0x0a, 0x98, 0x07, - 0x41, 0x97, 0x01, 0x29, 0x01, 0xb3, 0x01, 0x42, 0xfc, 0x36, 0x9e, 0x9c, - 0x9c, 0x9e, 0x01, 0x91, 0xfe, 0x45, 0xbf, 0xe2, 0x00, 0x01, 0x00, 0x0b, - 0xff, 0xec, 0x06, 0xc1, 0x04, 0x3a, 0x00, 0x20, 0x00, 0x43, 0x40, 0x23, - 0x05, 0x14, 0x16, 0x03, 0x1b, 0x1e, 0x1e, 0x03, 0x14, 0x0c, 0x04, 0x21, - 0x22, 0x1c, 0x1c, 0x0a, 0x14, 0x14, 0x05, 0x51, 0x59, 0x14, 0x0f, 0x0a, - 0x0f, 0x50, 0x59, 0x0a, 0x16, 0x00, 0x18, 0x50, 0x59, 0x00, 0x16, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x11, 0x21, 0x0a, - 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, - 0x1b, 0x01, 0x21, 0x11, 0x10, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x15, - 0x14, 0x06, 0x05, 0x16, 0xc0, 0xee, 0xfe, 0x89, 0x3b, 0x40, 0x4a, 0x6d, - 0x56, 0x32, 0x2c, 0x19, 0x2b, 0x37, 0x43, 0x37, 0x23, 0x2c, 0x02, 0xce, - 0xf8, 0x7e, 0x79, 0xb5, 0xec, 0x14, 0xe8, 0xbd, 0x02, 0x26, 0xfe, 0x4c, - 0xfe, 0xcf, 0x9c, 0x4a, 0x0d, 0x81, 0x09, 0x6e, 0x01, 0x0e, 0x01, 0x08, - 0x01, 0x45, 0xfd, 0x7a, 0xfe, 0xc3, 0x9e, 0x9f, 0xc6, 0xe9, 0xbe, 0xe7, - 0x00, 0x01, 0x00, 0xa8, 0xff, 0xec, 0x07, 0xc3, 0x05, 0x81, 0x00, 0x19, - 0x00, 0x47, 0x40, 0x24, 0x0a, 0x06, 0x06, 0x07, 0x0e, 0x0b, 0x03, 0x14, - 0x17, 0x17, 0x03, 0x07, 0x03, 0x1a, 0x1b, 0x15, 0x15, 0x0a, 0x0a, 0x05, - 0x5f, 0x59, 0x0a, 0x0a, 0x07, 0x0c, 0x08, 0x03, 0x07, 0x12, 0x00, 0x11, - 0x60, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x05, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, - 0x21, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x06, 0x06, 0x14, 0xc7, 0xec, 0xfd, 0x06, 0xbf, 0xbf, 0x02, - 0xfa, 0xbf, 0x73, 0x82, 0x82, 0x77, 0xb5, 0xec, 0x14, 0xe0, 0xc1, 0x01, - 0x00, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfc, 0x36, 0x9e, - 0x9c, 0x9c, 0x9e, 0x01, 0x91, 0xfe, 0x45, 0xbf, 0xe2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0xff, 0xec, 0x06, 0x81, 0x04, 0x3a, 0x00, 0x18, - 0x00, 0x43, 0x40, 0x23, 0x01, 0x16, 0x16, 0x17, 0x05, 0x02, 0x13, 0x0a, - 0x0d, 0x0d, 0x13, 0x17, 0x03, 0x19, 0x1a, 0x01, 0x15, 0x51, 0x59, 0x01, - 0x0b, 0x01, 0x0b, 0x17, 0x03, 0x18, 0x0f, 0x17, 0x15, 0x10, 0x07, 0x50, - 0x59, 0x10, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, 0x12, - 0x39, 0x39, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, - 0x11, 0x33, 0x11, 0x10, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x42, - 0x01, 0xe7, 0xb4, 0xf9, 0x7e, 0x78, 0xb5, 0xeb, 0xbf, 0xc5, 0xe9, 0xfe, - 0x19, 0xb4, 0x04, 0x3a, 0xfe, 0x36, 0x01, 0xca, 0xfd, 0x7a, 0xfe, 0xc3, - 0x9e, 0x9f, 0xc6, 0xe9, 0xc0, 0xe5, 0xe3, 0xc2, 0x5c, 0xfe, 0x13, 0x04, - 0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, - 0x05, 0x96, 0x10, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5e, - 0xff, 0xec, 0x03, 0xef, 0x04, 0x4e, 0x12, 0x06, 0x02, 0x24, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2e, 0xff, 0xec, 0x05, 0x74, 0x05, 0x81, 0x00, 0x15, - 0x00, 0x39, 0x40, 0x1d, 0x0a, 0x03, 0x10, 0x13, 0x13, 0x08, 0x03, 0x06, - 0x04, 0x16, 0x17, 0x11, 0x11, 0x00, 0x06, 0x09, 0x05, 0x06, 0x05, 0x5f, - 0x59, 0x06, 0x03, 0x00, 0x0d, 0x60, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, - 0x22, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x03, 0xc5, 0xc7, - 0xec, 0xfe, 0x1c, 0x04, 0x86, 0xfe, 0x1c, 0x74, 0x82, 0x82, 0x77, 0xb5, - 0xec, 0x14, 0xe0, 0xc1, 0x03, 0x58, 0x9c, 0x9c, 0xfc, 0xd2, 0x9e, 0x9c, - 0x9c, 0x9e, 0x01, 0x91, 0xfe, 0x45, 0xbf, 0xe2, 0x00, 0x01, 0x00, 0x23, - 0xff, 0xec, 0x04, 0xcd, 0x04, 0x3a, 0x00, 0x15, 0x00, 0x3c, 0x40, 0x1e, - 0x04, 0x13, 0x02, 0x0a, 0x0a, 0x0d, 0x0d, 0x13, 0x00, 0x03, 0x16, 0x17, - 0x0b, 0x0b, 0x10, 0x00, 0x10, 0x07, 0x50, 0x59, 0x10, 0x16, 0x03, 0x15, - 0x00, 0x15, 0x51, 0x59, 0x00, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, - 0x15, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x23, 0x03, 0x64, 0xfe, - 0xa8, 0x75, 0x7e, 0x7e, 0x78, 0xb5, 0xeb, 0xbf, 0xbe, 0xea, 0xfe, 0xa8, - 0x04, 0x3a, 0x83, 0xfd, 0xfd, 0x9f, 0x9e, 0x9e, 0x9f, 0xc6, 0xe9, 0xc0, - 0xe5, 0xe6, 0xbf, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, - 0xff, 0xec, 0x04, 0x7f, 0x05, 0x95, 0x00, 0x26, 0x00, 0x5a, 0x40, 0x2d, - 0x06, 0x1a, 0x08, 0x0f, 0x0e, 0x0e, 0x23, 0x24, 0x15, 0x08, 0x08, 0x1e, - 0x03, 0x24, 0x03, 0x28, 0x27, 0x06, 0x18, 0x1b, 0x18, 0x1b, 0x60, 0x59, - 0x18, 0x18, 0x00, 0x0b, 0x0b, 0x12, 0x5f, 0x59, 0x0f, 0x0f, 0x0b, 0x04, - 0x23, 0x23, 0x00, 0x00, 0x21, 0x5f, 0x59, 0x00, 0x13, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x05, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x24, - 0x35, 0x34, 0x24, 0x33, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x20, 0x13, 0x17, 0x06, 0x04, 0x02, 0x5b, 0xef, 0xfe, 0xe6, - 0xa7, 0x9b, 0xfe, 0xe8, 0x01, 0x07, 0xd3, 0xc4, 0x01, 0x01, 0x47, 0xb2, - 0x34, 0xa4, 0x7b, 0x88, 0x9a, 0xad, 0xb5, 0x47, 0x47, 0xca, 0xc0, 0xb5, - 0x9a, 0x01, 0x03, 0x75, 0xa5, 0x59, 0xfe, 0xfb, 0x14, 0xef, 0xc2, 0x81, - 0xab, 0x17, 0x43, 0xf8, 0xaa, 0xd0, 0xa4, 0xb1, 0x3d, 0x85, 0x72, 0x7b, - 0x6b, 0x7b, 0x77, 0x94, 0x76, 0x85, 0x7f, 0x8f, 0x01, 0x10, 0x4d, 0xbc, - 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x49, 0xff, 0xec, 0x03, 0x76, - 0x04, 0x4e, 0x00, 0x25, 0x00, 0x5e, 0x40, 0x2f, 0x07, 0x06, 0x1a, 0x06, - 0x0a, 0x10, 0x0f, 0x0f, 0x22, 0x23, 0x16, 0x0a, 0x0a, 0x1d, 0x03, 0x23, - 0x03, 0x27, 0x26, 0x06, 0x19, 0x1a, 0x19, 0x1a, 0x50, 0x59, 0x19, 0x19, - 0x00, 0x0d, 0x0d, 0x13, 0x50, 0x59, 0x10, 0x10, 0x0d, 0x10, 0x22, 0x22, - 0x00, 0x00, 0x20, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, - 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x20, 0x13, 0x07, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0x01, 0xdd, 0xbf, 0xd5, 0x96, 0x7c, - 0x6b, 0x8d, 0xd1, 0xa5, 0x01, 0x4b, 0x2e, 0xa2, 0x0c, 0x70, 0x5a, 0x5d, - 0x63, 0x96, 0xa3, 0xa7, 0xa7, 0x6f, 0x65, 0xc9, 0x35, 0x9f, 0x2d, 0xc6, - 0x14, 0xab, 0x96, 0x6c, 0x93, 0x0d, 0x02, 0x09, 0x85, 0x63, 0x81, 0xa1, - 0xfe, 0xfe, 0x14, 0x46, 0x4a, 0x56, 0x4a, 0x57, 0x55, 0x89, 0x66, 0x61, - 0x54, 0x66, 0xa4, 0x2c, 0x81, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, - 0xfe, 0x57, 0x04, 0x99, 0x05, 0x81, 0x00, 0x1d, 0x00, 0x3b, 0x40, 0x21, - 0x00, 0x10, 0x1c, 0x12, 0x12, 0x17, 0x10, 0x07, 0x04, 0x1e, 0x1f, 0x10, - 0x00, 0x5f, 0x59, 0x10, 0x03, 0x15, 0x1a, 0x5f, 0x59, 0x15, 0x05, 0x05, - 0x0a, 0x5f, 0x59, 0x05, 0x08, 0x5f, 0x59, 0x05, 0x13, 0x00, 0x3f, 0x2b, - 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x03, 0x0a, - 0x01, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x1a, - 0x01, 0x13, 0x21, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, - 0x32, 0x35, 0x11, 0x02, 0x3d, 0x31, 0x38, 0x60, 0x8e, 0x7e, 0x3a, 0x1c, - 0x13, 0x25, 0x35, 0x43, 0x3a, 0x3a, 0x3a, 0x2a, 0x02, 0xff, 0x99, 0x8f, - 0x3b, 0x40, 0x2c, 0x42, 0x7b, 0x04, 0xe1, 0xfe, 0x90, 0xfe, 0x5a, 0xfe, - 0xb0, 0x8b, 0x0a, 0x98, 0x07, 0x41, 0x97, 0x01, 0x29, 0x01, 0xb3, 0x01, - 0x42, 0xf9, 0xfe, 0x91, 0x97, 0x0e, 0xa0, 0x10, 0x94, 0x05, 0x58, 0x00, - 0x00, 0x01, 0x00, 0x0b, 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x3a, 0x00, 0x1c, - 0x00, 0x35, 0x40, 0x1d, 0x0c, 0x1b, 0x0a, 0x00, 0x00, 0x04, 0x1b, 0x13, - 0x04, 0x1d, 0x1e, 0x1b, 0x0c, 0x51, 0x59, 0x1b, 0x0f, 0x11, 0x16, 0x50, - 0x59, 0x11, 0x16, 0x02, 0x07, 0x50, 0x59, 0x02, 0x1b, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x10, 0x21, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x0a, 0x01, 0x0e, 0x01, - 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, 0x1b, 0x01, 0x21, - 0x04, 0x1d, 0xfe, 0xe7, 0x3d, 0x40, 0x2c, 0x44, 0x37, 0x3a, 0xfe, 0x89, - 0x3b, 0x40, 0x4a, 0x6d, 0x56, 0x32, 0x2c, 0x19, 0x2b, 0x37, 0x43, 0x37, - 0x23, 0x2c, 0x02, 0xce, 0x81, 0xfe, 0xd8, 0x0e, 0x9c, 0x10, 0x43, 0x51, - 0x04, 0x32, 0xfe, 0x4c, 0xfe, 0xcf, 0x9c, 0x4a, 0x0d, 0x81, 0x09, 0x6e, - 0x01, 0x0e, 0x01, 0x08, 0x01, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xfe, 0x7d, 0x05, 0xd7, 0x05, 0x96, 0x12, 0x06, 0x00, 0x34, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xf0, 0x04, 0x4e, 0x12, 0x06, - 0x00, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x07, 0x86, - 0x05, 0x81, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x05, 0xcc, 0x04, 0x3a, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x44, 0xfe, 0x7f, 0x00, 0xbe, 0xff, 0xcb, 0x00, 0x14, - 0x00, 0x21, 0x40, 0x13, 0x11, 0x05, 0x0e, 0x0e, 0x0a, 0xdf, 0x01, 0x01, - 0x00, 0x01, 0x40, 0x01, 0x50, 0x01, 0x60, 0x01, 0x04, 0x01, 0x10, 0x00, - 0x2f, 0xcc, 0x5d, 0x5d, 0x32, 0x39, 0x2f, 0x33, 0x33, 0x31, 0x30, 0x13, - 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, - 0x36, 0x37, 0x35, 0x33, 0x15, 0x1e, 0x01, 0x15, 0xbe, 0x66, 0x26, 0x30, - 0x33, 0x27, 0x64, 0x43, 0x46, 0x66, 0x48, 0x43, 0xfe, 0x7f, 0x2f, 0x36, - 0x2e, 0x2e, 0x36, 0x2f, 0x31, 0x58, 0x5a, 0x0b, 0x5e, 0x5e, 0x0b, 0x5b, - 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2b, 0x05, 0x4e, 0x01, 0xae, - 0x06, 0xbc, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x28, 0x40, 0x16, - 0x15, 0x09, 0x09, 0x0f, 0x0f, 0x03, 0x01, 0xaf, 0x03, 0xef, 0x03, 0xff, - 0x03, 0x03, 0x03, 0x40, 0x09, 0x0d, 0x48, 0x03, 0x1b, 0x21, 0xb8, 0x01, - 0x3e, 0x00, 0x3f, 0x33, 0xcc, 0x2b, 0x5d, 0x71, 0x32, 0x32, 0x11, 0x33, - 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x2b, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0xe5, - 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x72, 0x2e, 0x20, 0x22, - 0x2d, 0x2d, 0x22, 0x20, 0x2e, 0x06, 0x6f, 0x20, 0x2d, 0x2d, 0x20, 0x22, - 0x2e, 0x2e, 0x22, 0x20, 0x2d, 0x2d, 0x20, 0x22, 0x2e, 0x2e, 0xaf, 0x22, - 0x2e, 0x2e, 0x22, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0x01, 0xff, 0x6d, - 0x05, 0x4e, 0x00, 0x93, 0x06, 0xfc, 0x00, 0x0b, 0x00, 0x0b, 0xb1, 0x00, - 0x06, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0xcc, 0x31, 0x30, 0x13, 0x07, 0x17, - 0x07, 0x17, 0x07, 0x23, 0x37, 0x27, 0x37, 0x27, 0x37, 0x93, 0x9b, 0x9b, - 0x9b, 0x9b, 0xb0, 0x76, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x06, 0xfc, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x5e, 0x05, 0x4e, 0x01, 0x00, 0x06, 0xbc, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x22, 0x40, 0x13, 0x09, 0x0f, 0x03, 0x01, 0xaf, 0x03, - 0xef, 0x03, 0xff, 0x03, 0x03, 0x03, 0x40, 0x09, 0x0d, 0x48, 0x03, 0x0f, - 0x15, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0x33, 0xcc, 0x2b, 0x5d, 0x71, 0x32, - 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x60, 0x2e, 0x20, 0x22, 0x30, 0x2f, 0x23, 0x20, 0x2e, 0x02, - 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, 0x06, 0x6d, 0x22, 0x2d, - 0x2d, 0x22, 0x20, 0x2e, 0x2e, 0xaf, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, - 0x2e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60, 0x05, 0x4e, 0x01, 0xc7, - 0x06, 0xbc, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x28, 0x40, 0x16, - 0x19, 0x03, 0x18, 0x09, 0x0f, 0x03, 0x01, 0xaf, 0x03, 0xef, 0x03, 0xff, - 0x03, 0x03, 0x03, 0x40, 0x09, 0x0d, 0x48, 0x03, 0x0f, 0x15, 0xb8, 0x01, - 0x3e, 0x00, 0x3f, 0x33, 0xcc, 0x2b, 0x5d, 0x71, 0x32, 0xc4, 0x10, 0xc4, - 0x31, 0x30, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x15, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x07, 0x11, 0x33, 0x11, 0x01, 0x27, 0x2e, 0x22, 0x20, 0x30, - 0x30, 0x20, 0x22, 0x2e, 0x2e, 0x20, 0x21, 0x2f, 0x2e, 0x22, 0x20, 0x2e, - 0xc7, 0x6f, 0x06, 0x6d, 0x22, 0x2d, 0x2d, 0x22, 0x20, 0x2e, 0x2e, 0xaf, - 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, 0x2e, 0x2e, 0x01, 0x6e, 0xfe, 0x92, - 0x00, 0x01, 0xff, 0x4e, 0xfe, 0x7f, 0x00, 0x96, 0xff, 0xae, 0x00, 0x07, - 0x00, 0x10, 0xb7, 0x03, 0x00, 0x04, 0x10, 0x04, 0x02, 0x04, 0x00, 0x00, - 0x2f, 0xcc, 0x5d, 0x32, 0x31, 0x30, 0x07, 0x14, 0x16, 0x33, 0x15, 0x22, - 0x26, 0x35, 0x44, 0x74, 0x66, 0x9c, 0xac, 0x52, 0x5c, 0x69, 0x6a, 0xa0, - 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x68, 0x05, 0x58, 0x00, 0x98, - 0x06, 0xa8, 0x00, 0x03, 0x00, 0x0b, 0xb1, 0x03, 0x01, 0xb8, 0x01, 0x3e, - 0x00, 0x3f, 0xcd, 0x31, 0x30, 0x13, 0x07, 0x27, 0x37, 0x98, 0x98, 0x98, - 0x98, 0x06, 0x00, 0xa8, 0xa8, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xd5, - 0x05, 0x50, 0x01, 0x2b, 0x06, 0x83, 0x00, 0x21, 0x00, 0x20, 0x40, 0x0d, - 0x11, 0x1c, 0x00, 0x0b, 0x1c, 0x0b, 0x1c, 0x0b, 0x0f, 0x17, 0x01, 0x17, - 0x06, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0xcc, 0x5d, 0x39, 0x39, 0x2f, 0x2f, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x22, 0x06, 0x15, 0x14, 0x17, - 0x07, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x27, 0x2e, 0x01, 0x9c, 0x1c, 0x25, 0x39, 0x1a, 0x6d, 0x52, 0x41, - 0x2f, 0x51, 0x35, 0x28, 0x37, 0x20, 0x1c, 0x25, 0x39, 0x1a, 0x6d, 0x51, - 0x3e, 0x32, 0x53, 0x34, 0x2c, 0x31, 0x06, 0x39, 0x26, 0x25, 0x40, 0x16, - 0x48, 0x26, 0x78, 0x41, 0x52, 0x35, 0x4a, 0x39, 0x2f, 0x26, 0x25, 0x40, - 0x16, 0x48, 0x29, 0x75, 0x41, 0x52, 0x36, 0x49, 0x3e, 0x2a, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xb8, 0x05, 0x4e, 0x00, 0x00, 0x06, 0x7f, 0x00, 0x07, - 0x00, 0x13, 0xb7, 0x03, 0x0f, 0x04, 0x1f, 0x04, 0x02, 0x04, 0x00, 0xb8, - 0x01, 0x3e, 0x00, 0x3f, 0xcc, 0x5d, 0x32, 0x31, 0x30, 0x03, 0x34, 0x26, - 0x23, 0x35, 0x32, 0x16, 0x15, 0x6f, 0x71, 0x68, 0x9a, 0xae, 0x05, 0x4e, - 0x5c, 0x68, 0x6d, 0x9f, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0xfe, 0x7f, 0x01, 0x42, 0xff, 0xe7, 0x00, 0x05, 0x00, 0x08, 0xb1, 0x01, - 0x04, 0x00, 0x2f, 0xcc, 0x31, 0x30, 0x01, 0x23, 0x27, 0x37, 0x33, 0x07, - 0x01, 0x42, 0x90, 0xb2, 0xb2, 0x90, 0xb3, 0xfe, 0x7f, 0xb4, 0xb4, 0xb4, - 0x00, 0x02, 0xff, 0x29, 0xfe, 0x7f, 0x00, 0x96, 0xff, 0xf2, 0x00, 0x07, - 0x00, 0x13, 0x00, 0x15, 0x40, 0x09, 0x07, 0x07, 0x04, 0x40, 0x03, 0x01, - 0x03, 0x11, 0x0b, 0x00, 0x2f, 0x33, 0xcc, 0x5d, 0x32, 0x39, 0x2f, 0x31, - 0x30, 0x17, 0x14, 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0x05, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x96, 0xaa, 0x9e, - 0x65, 0x76, 0xff, 0x00, 0x2e, 0x20, 0x21, 0x2f, 0x2e, 0x22, 0x20, 0x2e, - 0x52, 0x8d, 0xa2, 0x6a, 0x69, 0x5c, 0x0c, 0x20, 0x30, 0x2f, 0x21, 0x22, - 0x2e, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x4e, 0x01, 0x48, - 0x06, 0x7f, 0x00, 0x07, 0x00, 0x13, 0xb7, 0x04, 0x0f, 0x03, 0x1f, 0x03, - 0x02, 0x03, 0x00, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0xcd, 0x5d, 0x32, 0x31, - 0x30, 0x11, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0xae, 0x9a, 0x66, - 0x73, 0x05, 0x4e, 0x91, 0xa0, 0x6d, 0x65, 0x5f, 0xff, 0xff, 0x00, 0x00, - 0x05, 0x4e, 0x01, 0x48, 0x06, 0x7f, 0x10, 0x06, 0x04, 0xd4, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xb8, 0x05, 0x4e, 0x01, 0x48, 0x06, 0x7f, 0x00, 0x07, - 0x00, 0x0f, 0x00, 0x1c, 0x40, 0x0c, 0x0c, 0x0b, 0x0b, 0x04, 0x0f, 0x03, - 0x1f, 0x03, 0x02, 0x03, 0x08, 0x00, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0x32, - 0xcd, 0x5d, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, 0x11, 0x34, 0x36, 0x33, - 0x15, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, - 0xae, 0x9a, 0x66, 0x73, 0xfe, 0x49, 0xac, 0x9c, 0x66, 0x73, 0x05, 0x4e, - 0x91, 0xa0, 0x6d, 0x65, 0x5f, 0x8f, 0xa2, 0x6d, 0x65, 0x5f, 0x00, 0x00, - 0x00, 0x04, 0xfd, 0xf6, 0x05, 0x3b, 0x02, 0x0a, 0x07, 0x29, 0x00, 0x0f, - 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x21, 0x40, 0x10, 0x19, 0x03, - 0x03, 0x2f, 0x2f, 0x29, 0x01, 0x29, 0x13, 0x35, 0x35, 0x09, 0x50, 0x23, - 0x01, 0x23, 0x00, 0x2f, 0x5d, 0x33, 0x33, 0x11, 0x33, 0xc4, 0x5d, 0x32, - 0x32, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x37, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0x14, 0x07, - 0x17, 0x07, 0x27, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x5a, 0x7e, 0x59, 0x5b, 0x7e, 0x7c, 0x5d, 0x3b, 0x2d, 0x58, 0x52, - 0x58, 0x1d, 0x79, 0x37, 0x27, 0x28, 0x3a, 0x3c, 0x26, 0x24, 0x3a, 0xfe, - 0xd3, 0x1d, 0x58, 0x52, 0x58, 0x2d, 0x3b, 0x5c, 0x7d, 0x7e, 0x5b, 0x59, - 0x7e, 0x79, 0x3a, 0x24, 0x26, 0x3c, 0x3a, 0x28, 0x26, 0x38, 0x06, 0x52, - 0x59, 0x7e, 0x7d, 0x5a, 0x59, 0x7e, 0x18, 0x58, 0x54, 0x58, 0x2f, 0x3c, - 0x28, 0x38, 0x39, 0x27, 0x27, 0x39, 0x38, 0x28, 0x3c, 0x2f, 0x58, 0x54, - 0x58, 0x18, 0x7d, 0x5a, 0x59, 0x7e, 0x7e, 0x59, 0x28, 0x38, 0x3a, 0x26, - 0x27, 0x39, 0x38, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, 0x3b, 0x01, 0xec, - 0x07, 0x29, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x15, 0x40, 0x0a, 0x19, 0x2f, - 0x03, 0x01, 0x03, 0x13, 0x50, 0x09, 0x01, 0x09, 0x00, 0x2f, 0x5d, 0x33, - 0xc4, 0x5d, 0x32, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x37, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x3d, 0x7e, 0x59, - 0x58, 0x80, 0x7e, 0x5a, 0x39, 0x31, 0x56, 0x54, 0x58, 0x1b, 0x77, 0x38, - 0x28, 0x29, 0x38, 0x3a, 0x27, 0x26, 0x3a, 0x06, 0x52, 0x59, 0x7e, 0x7c, - 0x5b, 0x5a, 0x7d, 0x18, 0x58, 0x54, 0x58, 0x2e, 0x3d, 0x28, 0x38, 0x38, - 0x28, 0x28, 0x38, 0x38, 0x00, 0x01, 0xff, 0x5c, 0x05, 0x4e, 0x00, 0xa8, - 0x06, 0x9a, 0x00, 0x11, 0x00, 0x18, 0x40, 0x09, 0x0d, 0x04, 0x04, 0x09, - 0x0f, 0x00, 0x01, 0x00, 0x08, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0xcc, 0x5d, - 0x32, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x13, 0x15, 0x14, 0x06, 0x23, 0x22, - 0x27, 0x15, 0x23, 0x11, 0x33, 0x15, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, - 0xa8, 0x57, 0x57, 0x22, 0x17, 0x65, 0x65, 0x0a, 0x21, 0x30, 0x26, 0x06, - 0x9a, 0x32, 0x58, 0x66, 0x0a, 0x66, 0x01, 0x4c, 0x8a, 0x0c, 0x2d, 0x37, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x44, 0xfe, 0x7f, 0x00, 0xbe, - 0xff, 0xcb, 0x00, 0x14, 0x00, 0x21, 0x40, 0x13, 0x0f, 0x03, 0x06, 0x06, - 0xdf, 0x05, 0x01, 0x00, 0x05, 0x40, 0x05, 0x50, 0x05, 0x60, 0x05, 0x04, - 0x05, 0x13, 0x0b, 0x00, 0x2f, 0x33, 0xcc, 0x5d, 0x5d, 0x39, 0x2f, 0x33, - 0x33, 0x31, 0x30, 0x17, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x2e, 0x01, - 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, - 0xbe, 0x45, 0x46, 0x66, 0x43, 0x46, 0x64, 0x27, 0x33, 0x30, 0x26, 0x66, - 0x66, 0x5a, 0x5a, 0x0b, 0x5c, 0x5c, 0x0a, 0x5a, 0x5b, 0x31, 0x31, 0x35, - 0x30, 0x30, 0x35, 0x31, 0x00, 0x01, 0xff, 0x48, 0xfe, 0xa4, 0x00, 0x8f, - 0xff, 0xdd, 0x00, 0x05, 0x00, 0x0e, 0xb5, 0x03, 0x00, 0x02, 0x01, 0x02, - 0x00, 0x00, 0x2f, 0xcc, 0x5d, 0x32, 0x31, 0x30, 0x17, 0x11, 0x21, 0x35, - 0x33, 0x35, 0x8f, 0xfe, 0xb9, 0xdb, 0x23, 0xfe, 0xc7, 0x6a, 0xcf, 0x00, - 0x00, 0x01, 0xff, 0x5e, 0xfe, 0x7f, 0x00, 0xa2, 0xff, 0xe7, 0x00, 0x05, - 0x00, 0x08, 0xb1, 0x01, 0x04, 0x00, 0x2f, 0xcc, 0x31, 0x30, 0x13, 0x23, - 0x27, 0x37, 0x33, 0x07, 0xa2, 0x90, 0xb4, 0xb4, 0x90, 0xb4, 0xfe, 0x7f, - 0xb4, 0xb4, 0xb4, 0x00, 0x00, 0x01, 0xff, 0x6a, 0xfe, 0x7f, 0x00, 0xb2, - 0xff, 0xae, 0x00, 0x07, 0x00, 0x10, 0xb7, 0x04, 0x00, 0x03, 0x10, 0x03, - 0x02, 0x03, 0x00, 0x00, 0x2f, 0xcd, 0x5d, 0x32, 0x31, 0x30, 0x17, 0x14, - 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0xb2, 0xab, 0x9d, 0x66, 0x74, 0x52, - 0x8f, 0xa0, 0x6a, 0x6a, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xb8, - 0xfe, 0x7f, 0x01, 0x48, 0xff, 0xae, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x19, - 0x40, 0x0c, 0x0c, 0x0b, 0x0b, 0x04, 0x00, 0x03, 0x10, 0x03, 0x02, 0x03, - 0x0f, 0x00, 0x00, 0x2f, 0x32, 0xcd, 0x5d, 0x32, 0x32, 0x11, 0x33, 0x31, - 0x30, 0x15, 0x14, 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, - 0x23, 0x35, 0x32, 0x36, 0x35, 0xab, 0x9d, 0x67, 0x72, 0x01, 0xb7, 0xaa, - 0x9e, 0x67, 0x72, 0x52, 0x8f, 0xa0, 0x6a, 0x6b, 0x5a, 0x8d, 0xa2, 0x6a, - 0x6b, 0x5a, 0x00, 0x00, 0x00, 0x01, 0xff, 0x62, 0xfe, 0x7f, 0x00, 0x9c, - 0xff, 0xf8, 0x00, 0x07, 0x00, 0x0c, 0xb4, 0x40, 0x01, 0x01, 0x01, 0x05, - 0x00, 0x2f, 0xcc, 0x5d, 0x31, 0x30, 0x13, 0x05, 0x35, 0x37, 0x27, 0x25, - 0x15, 0x07, 0x9c, 0xfe, 0xe3, 0x8d, 0xaa, 0x01, 0x1f, 0x8f, 0xfe, 0xb2, - 0x33, 0x50, 0x16, 0xe0, 0x33, 0x4c, 0x19, 0x00, 0xff, 0xff, 0xff, 0x5c, - 0x05, 0x4e, 0x00, 0xa4, 0x06, 0x7f, 0x10, 0x07, 0x04, 0xd1, 0x00, 0xa4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x14, 0x05, 0x3b, 0x00, 0x00, - 0x07, 0x29, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x15, 0x40, 0x0a, 0x13, 0x2f, - 0x0d, 0x01, 0x0d, 0x19, 0x50, 0x07, 0x01, 0x07, 0x00, 0x2f, 0x5d, 0x33, - 0xc4, 0x5d, 0x32, 0x31, 0x30, 0x03, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x1b, 0x58, - 0x54, 0x56, 0x32, 0x38, 0x59, 0x7f, 0x80, 0x58, 0x57, 0x80, 0x77, 0x3a, - 0x26, 0x27, 0x3a, 0x38, 0x29, 0x28, 0x38, 0x06, 0x52, 0x3d, 0x2e, 0x58, - 0x54, 0x58, 0x18, 0x7c, 0x5b, 0x5a, 0x7d, 0x7e, 0x59, 0x28, 0x38, 0x39, - 0x27, 0x28, 0x38, 0x38, 0xff, 0xff, 0xff, 0x44, 0xfe, 0x7f, 0x00, 0xbe, - 0xff, 0xcb, 0x10, 0x06, 0x04, 0xda, 0x00, 0x00, 0x00, 0x01, 0xff, 0x5e, - 0x05, 0x4e, 0x00, 0xa2, 0x06, 0xb6, 0x00, 0x05, 0x00, 0x0b, 0xb1, 0x04, - 0x01, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0xcc, 0x31, 0x30, 0x13, 0x23, 0x27, - 0x37, 0x33, 0x07, 0xa2, 0x90, 0xb4, 0xb4, 0x90, 0xb4, 0x05, 0x4e, 0xb4, - 0xb4, 0xb4, 0x00, 0x00, 0x00, 0x01, 0xff, 0x48, 0x05, 0x4e, 0x00, 0x8f, - 0x06, 0x87, 0x00, 0x05, 0x00, 0x11, 0xb5, 0x0f, 0x00, 0x01, 0x00, 0x03, - 0x02, 0xb8, 0x01, 0x3e, 0x00, 0x3f, 0x33, 0xcc, 0x5d, 0x31, 0x30, 0x13, - 0x11, 0x21, 0x35, 0x33, 0x35, 0x8f, 0xfe, 0xb9, 0xdb, 0x06, 0x87, 0xfe, - 0xc7, 0x6a, 0xcf, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0x7f, 0x01, 0x48, - 0xff, 0xae, 0x10, 0x07, 0x04, 0xce, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfd, 0xaa, 0x05, 0x50, 0x00, 0x00, 0x06, 0x83, 0x10, 0x07, - 0x04, 0xd0, 0xfe, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x29, - 0x05, 0x7b, 0x00, 0xd7, 0x07, 0x29, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x10, - 0xb6, 0x15, 0x2f, 0x03, 0x01, 0x03, 0x0f, 0x09, 0x00, 0x2f, 0x33, 0xcc, - 0x5d, 0x32, 0x31, 0x30, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0xd7, 0x7e, 0x59, 0x59, 0x7e, 0x7c, 0x5b, 0x5b, - 0x7c, 0x77, 0x38, 0x28, 0x28, 0x38, 0x3a, 0x26, 0x26, 0x3a, 0x06, 0x52, - 0x59, 0x7e, 0x7e, 0x59, 0x59, 0x7e, 0x7e, 0x59, 0x28, 0x38, 0x38, 0x28, - 0x28, 0x38, 0x38, 0x00, 0x00, 0x02, 0xff, 0xb0, 0xfe, 0x7f, 0x00, 0x50, - 0xff, 0xee, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x17, 0x40, 0x0c, 0x0f, 0x00, - 0x15, 0x01, 0x40, 0x15, 0xa0, 0x15, 0x02, 0x15, 0x09, 0x03, 0x00, 0x2f, - 0x33, 0xcc, 0x5d, 0x71, 0x32, 0x31, 0x30, 0x07, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x15, 0x34, 0x36, 0x33, 0x32, - 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x50, 0x2f, 0x21, 0x22, 0x2e, - 0x30, 0x20, 0x20, 0x30, 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, - 0x62, 0x21, 0x2f, 0x30, 0x20, 0x20, 0x2e, 0x2e, 0xaf, 0x22, 0x2e, 0x30, - 0x20, 0x20, 0x30, 0x2e, 0x00, 0x05, 0xfe, 0xd3, 0xfe, 0x7f, 0x01, 0x2d, - 0xff, 0xee, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, - 0x00, 0x27, 0x40, 0x14, 0x33, 0x1b, 0x1b, 0x39, 0x00, 0x21, 0x01, 0x40, - 0x21, 0xa0, 0x21, 0x02, 0x21, 0x2d, 0x15, 0x09, 0x09, 0x27, 0x0f, 0x03, - 0x00, 0x2f, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0xcc, 0x5d, 0x71, 0x32, - 0x32, 0x11, 0x33, 0x31, 0x30, 0x05, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x06, 0x23, 0x22, 0x26, 0xfe, 0xd3, 0x2e, 0x20, 0x22, 0x2e, 0x2e, - 0x22, 0x20, 0x2e, 0xe5, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, - 0x72, 0x2d, 0x20, 0x23, 0x2d, 0x2d, 0x23, 0x20, 0x2d, 0x01, 0x49, 0x2e, - 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x02, 0x30, 0x20, 0x20, 0x30, - 0x2f, 0x21, 0x22, 0x2e, 0x60, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, - 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0xaf, 0x22, 0x2e, 0x2e, - 0x22, 0x20, 0x30, 0x30, 0xef, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, - 0xaf, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0x2e, 0x00, 0x03, 0xfe, 0xf2, - 0xfe, 0x7f, 0x01, 0x10, 0xff, 0xee, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, - 0x00, 0x1d, 0x40, 0x0f, 0x00, 0x01, 0x01, 0x13, 0x00, 0x19, 0x01, 0x40, - 0x19, 0xa0, 0x19, 0x02, 0x19, 0x0d, 0x07, 0x00, 0x2f, 0x33, 0xcc, 0x5d, - 0x71, 0x32, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x05, 0x35, 0x21, 0x15, 0x37, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x15, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xfe, - 0xf2, 0x01, 0x47, 0x38, 0x2d, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x23, 0x2d, - 0x2d, 0x20, 0x23, 0x2d, 0x2d, 0x23, 0x20, 0x2d, 0xa2, 0x6d, 0x6d, 0x40, - 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0xaf, 0x20, 0x30, 0x30, 0x20, - 0x22, 0x2e, 0x2e, 0x00, 0x00, 0x03, 0xfe, 0xf2, 0xfe, 0x7f, 0x01, 0x10, - 0xff, 0xee, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x21, 0x40, 0x11, - 0x06, 0x02, 0x02, 0x03, 0x03, 0x17, 0x00, 0x1d, 0x01, 0x40, 0x1d, 0xa0, - 0x1d, 0x02, 0x1d, 0x11, 0x0b, 0x00, 0x2f, 0x33, 0xcc, 0x5d, 0x71, 0x32, - 0x39, 0x2f, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x23, 0x35, 0x21, - 0x15, 0x23, 0x15, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x15, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, - 0x23, 0x22, 0x26, 0xa0, 0x6e, 0x01, 0x47, 0x6a, 0xa2, 0x2d, 0x23, 0x20, - 0x2f, 0x2f, 0x20, 0x23, 0x2d, 0x2d, 0x20, 0x23, 0x2d, 0x2d, 0x23, 0x20, - 0x2d, 0xfe, 0xec, 0x72, 0x6d, 0x6d, 0x72, 0xb2, 0x22, 0x2e, 0x2e, 0x22, - 0x20, 0x2e, 0x2e, 0xaf, 0x20, 0x30, 0x30, 0x20, 0x22, 0x2e, 0x2e, 0x00, - 0x00, 0x01, 0xff, 0xb0, 0xfe, 0xa4, 0x00, 0x50, 0xff, 0x42, 0x00, 0x0b, - 0x00, 0x08, 0xb1, 0x09, 0x03, 0x00, 0x2f, 0x33, 0x31, 0x30, 0x03, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x50, 0x2f, - 0x21, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0xfe, 0xf2, 0x21, 0x2f, 0x30, - 0x20, 0x20, 0x2e, 0x2e, 0x00, 0x02, 0xff, 0x3d, 0xfe, 0xa4, 0x00, 0xc3, - 0xff, 0x44, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x0e, 0xb4, 0x15, 0x09, 0x09, - 0x0f, 0x03, 0x00, 0x2f, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xc3, 0x30, - 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, 0xe8, 0x2e, 0x20, 0x21, 0x2f, - 0x2e, 0x22, 0x20, 0x2e, 0xfe, 0xf4, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, - 0x2e, 0x22, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, 0x2e, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xff, 0x3d, 0xfe, 0x7f, 0x00, 0xc3, 0xff, 0xee, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x23, 0x00, 0x1d, 0x40, 0x0f, 0x1b, 0x00, 0x21, 0x01, - 0x40, 0x21, 0xa0, 0x21, 0x02, 0x21, 0x15, 0x09, 0x09, 0x0f, 0x03, 0x00, - 0x2f, 0x33, 0x33, 0x11, 0x33, 0xcc, 0x5d, 0x71, 0x32, 0x31, 0x30, 0x07, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xc3, - 0x2e, 0x22, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0xe8, 0x2e, 0x20, 0x22, - 0x2e, 0x30, 0x20, 0x20, 0x2e, 0x75, 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, - 0x22, 0x2e, 0x62, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, - 0x2e, 0x2e, 0x22, 0x22, 0x2e, 0x30, 0xaf, 0x20, 0x2e, 0x2e, 0x20, 0x20, - 0x30, 0x30, 0x00, 0x00, 0x00, 0x01, 0xff, 0x5c, 0xff, 0x19, 0x00, 0xa4, - 0xff, 0x83, 0x00, 0x03, 0x00, 0x0c, 0xb4, 0x03, 0x07, 0x01, 0x01, 0x01, - 0x00, 0x2f, 0x5d, 0x33, 0x31, 0x30, 0x07, 0x21, 0x15, 0x21, 0xa4, 0x01, - 0x48, 0xfe, 0xb8, 0x7d, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x5c, - 0xfe, 0xa4, 0x00, 0xa4, 0xff, 0x83, 0x00, 0x07, 0x00, 0x06, 0xb0, 0x02, - 0x00, 0x2f, 0x31, 0x30, 0x03, 0x35, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, - 0x35, 0x6f, 0x01, 0x48, 0x6b, 0xfe, 0xa4, 0x75, 0x6a, 0x6a, 0x75, 0x00, - 0x00, 0x01, 0xff, 0xb0, 0x05, 0xa6, 0x00, 0x50, 0x06, 0x46, 0x00, 0x0b, - 0x00, 0x0b, 0xb1, 0x03, 0x09, 0xb8, 0x01, 0x3f, 0x00, 0x3f, 0x33, 0x31, - 0x30, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x50, 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, 0x05, 0xf6, - 0x20, 0x30, 0x30, 0x20, 0x20, 0x30, 0x30, 0x00, 0xff, 0xff, 0xff, 0xb0, - 0x05, 0xa6, 0x00, 0x50, 0x06, 0x46, 0x10, 0x06, 0x04, 0xf1, 0x00, 0x00, - 0x00, 0x03, 0xff, 0x12, 0xfe, 0x7f, 0x00, 0xf0, 0xff, 0xf0, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x23, 0x00, 0x1b, 0x40, 0x0d, 0x15, 0x0f, 0x0f, 0x1b, - 0x1b, 0x40, 0x21, 0xa0, 0x21, 0x02, 0x21, 0x09, 0x03, 0x00, 0x2f, 0x33, - 0xcc, 0x5d, 0x32, 0x12, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x07, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x17, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x17, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xee, 0x2e, 0x20, - 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x9e, 0x30, 0x20, 0x20, 0x30, 0x2f, - 0x21, 0x22, 0x2e, 0xa0, 0x30, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, 0x2e, - 0x60, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x49, 0x20, 0x30, 0x30, - 0x20, 0x20, 0x30, 0x30, 0x48, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0x2e, - 0x00, 0x01, 0xff, 0xb0, 0x02, 0x71, 0x00, 0x50, 0x03, 0x0e, 0x00, 0x0b, - 0x00, 0x08, 0xb1, 0x03, 0x09, 0x00, 0x2f, 0x33, 0x31, 0x30, 0x03, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x50, 0x30, - 0x20, 0x20, 0x30, 0x30, 0x20, 0x20, 0x30, 0x02, 0xbe, 0x23, 0x2d, 0x2d, - 0x23, 0x20, 0x2d, 0x2d, 0x00, 0x01, 0xff, 0xc9, 0xfe, 0xa4, 0x00, 0x37, - 0xff, 0x83, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x00, 0x02, 0x00, 0x2f, 0x33, - 0x31, 0x30, 0x03, 0x35, 0x33, 0x15, 0x37, 0x6e, 0xfe, 0xa4, 0xdf, 0xdf, - 0x00, 0x01, 0x00, 0x85, 0x04, 0x79, 0x02, 0xc1, 0x05, 0x4c, 0x00, 0x03, - 0x00, 0x11, 0xb5, 0x01, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x2f, 0x33, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x85, - 0x02, 0x3c, 0xfd, 0xc4, 0x05, 0x4c, 0xd3, 0x00, 0x00, 0x01, 0xff, 0x5c, - 0x05, 0xc1, 0x00, 0xa4, 0x06, 0x2b, 0x00, 0x03, 0x00, 0x0c, 0xb4, 0x00, - 0x08, 0x03, 0x01, 0x03, 0x00, 0x2f, 0x5d, 0x33, 0x31, 0x30, 0x03, 0x21, - 0x15, 0x21, 0xa4, 0x01, 0x48, 0xfe, 0xb8, 0x06, 0x2b, 0x6a, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xf4, 0xfe, 0x60, 0x02, 0x8d, 0x07, 0xd7, 0x00, 0x03, - 0x00, 0x0f, 0xb4, 0x03, 0x05, 0x04, 0x02, 0x00, 0x00, 0x2f, 0x2f, 0x11, - 0x12, 0x01, 0x39, 0x31, 0x30, 0x01, 0x11, 0x33, 0x11, 0x01, 0xf4, 0x99, - 0xfe, 0x60, 0x09, 0x77, 0xf6, 0x89, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb0, - 0x05, 0xa6, 0x00, 0x50, 0x06, 0x46, 0x10, 0x06, 0x04, 0xf1, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xb0, 0x05, 0xa6, 0x00, 0x50, 0x06, 0x46, 0x10, 0x06, - 0x04, 0xf1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xba, 0x00, 0x00, 0x01, 0x7f, - 0x04, 0x39, 0x00, 0x03, 0x00, 0x07, 0x00, 0x31, 0x40, 0x0a, 0x00, 0x04, - 0x04, 0x03, 0x07, 0x07, 0x09, 0x08, 0x01, 0x00, 0xb8, 0x01, 0x43, 0xb4, - 0x59, 0x01, 0x04, 0x04, 0x05, 0xbb, 0x01, 0x43, 0x00, 0x59, 0x00, 0x04, - 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, - 0x15, 0x03, 0x35, 0x33, 0x15, 0xba, 0xc5, 0xc5, 0xc5, 0x03, 0x6a, 0xcf, - 0xcf, 0xfc, 0x96, 0xcf, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xb0, - 0x06, 0x17, 0x00, 0x50, 0x06, 0xb6, 0x00, 0x0b, 0x00, 0x08, 0xb1, 0x03, - 0x09, 0x00, 0x2f, 0x33, 0x31, 0x30, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x50, 0x30, 0x20, 0x20, 0x30, 0x30, - 0x20, 0x20, 0x30, 0x06, 0x66, 0x20, 0x30, 0x30, 0x20, 0x22, 0x2d, 0x2d, - 0x00, 0x01, 0xff, 0xb0, 0xfe, 0x6a, 0x00, 0x50, 0xff, 0x08, 0x00, 0x0b, - 0x00, 0x08, 0xb1, 0x09, 0x03, 0x00, 0x2f, 0x33, 0x31, 0x30, 0x03, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x50, 0x2f, - 0x21, 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0xfe, 0xb8, 0x21, 0x2f, 0x30, - 0x20, 0x20, 0x2e, 0x2e, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x02, 0xcb, - 0x04, 0xcb, 0x00, 0x0f, 0x00, 0x36, 0x40, 0x0b, 0x06, 0x0e, 0x0f, 0x0e, - 0x11, 0x0c, 0x0f, 0x0f, 0x10, 0x04, 0x07, 0x41, 0x0a, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x04, 0x01, 0x39, 0x00, 0x0f, 0x00, 0x0c, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x0f, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, - 0x13, 0x34, 0x3e, 0x01, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x0e, 0x01, 0x15, - 0x11, 0x21, 0x15, 0x21, 0x9a, 0x43, 0x94, 0x9f, 0x81, 0x87, 0x49, 0x4e, - 0x21, 0x01, 0x79, 0xfd, 0xcf, 0x02, 0xf0, 0xb8, 0xca, 0x59, 0xaa, 0x3a, - 0x83, 0xa8, 0xfd, 0xee, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, - 0xfe, 0x7f, 0x01, 0xe5, 0xff, 0x9e, 0x00, 0x09, 0x00, 0x06, 0xb0, 0x07, - 0x00, 0x2f, 0x31, 0x30, 0x05, 0x23, 0x17, 0x15, 0x23, 0x35, 0x37, 0x23, - 0x35, 0x21, 0x01, 0xe5, 0xb4, 0x13, 0x6d, 0x10, 0xb2, 0x01, 0xb0, 0xcd, - 0xa0, 0x14, 0x14, 0xa0, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, - 0x00, 0x00, 0x04, 0xec, 0x04, 0xcb, 0x00, 0x19, 0x00, 0x4b, 0x40, 0x1d, - 0x0e, 0x19, 0x0d, 0x00, 0x0b, 0x02, 0x0c, 0x01, 0x05, 0x06, 0x0d, 0x06, - 0x0c, 0x01, 0x13, 0x00, 0x14, 0x0c, 0x1b, 0x14, 0x1a, 0x0b, 0x02, 0x0e, - 0x19, 0x02, 0x19, 0x0d, 0x14, 0xbb, 0x01, 0x3a, 0x00, 0x05, 0x00, 0x00, - 0x01, 0x39, 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x32, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x13, 0x33, 0x01, 0x36, 0x13, 0x37, 0x33, 0x07, 0x0e, 0x02, 0x07, - 0x01, 0x23, 0x01, 0x0e, 0x02, 0x07, 0x03, 0x23, 0x13, 0x3e, 0x02, 0x37, - 0x7d, 0xe3, 0x01, 0xc3, 0x96, 0x1c, 0x17, 0xbe, 0x17, 0x0a, 0x3c, 0x63, - 0x67, 0x01, 0x69, 0xea, 0xfd, 0xf0, 0x2b, 0x35, 0x25, 0x19, 0x50, 0xc2, - 0x54, 0x24, 0x3c, 0x5b, 0x4d, 0x04, 0xcb, 0xfd, 0x93, 0x8c, 0x01, 0x02, - 0xdf, 0xdb, 0x6b, 0xac, 0x96, 0x66, 0xfe, 0x23, 0x02, 0xcd, 0x15, 0x3f, - 0x66, 0x80, 0xfe, 0x6d, 0x01, 0x8f, 0xab, 0x8e, 0x58, 0x1f, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x04, 0x81, 0x04, 0xcb, 0x00, 0x0f, - 0x00, 0x39, 0x40, 0x0b, 0x08, 0x0b, 0x00, 0x09, 0x06, 0x06, 0x11, 0x09, - 0x10, 0x01, 0x00, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x01, 0x01, 0x39, - 0xb3, 0x06, 0x0a, 0x09, 0x0a, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x09, - 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x33, 0x33, 0x31, 0x30, 0x13, - 0x35, 0x21, 0x20, 0x16, 0x19, 0x01, 0x33, 0x15, 0x21, 0x35, 0x21, 0x11, - 0x34, 0x26, 0x23, 0x81, 0x01, 0x79, 0x01, 0x14, 0xee, 0x85, 0xfb, 0xd1, - 0x02, 0xf2, 0x95, 0xb7, 0x04, 0x21, 0xaa, 0xec, 0xfe, 0xf0, 0xfd, 0xdb, - 0xaa, 0xaa, 0x02, 0x27, 0xb8, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, - 0x00, 0x00, 0x03, 0x2d, 0x04, 0xcb, 0x00, 0x1a, 0x00, 0x3c, 0x40, 0x12, - 0x08, 0x14, 0x07, 0x14, 0x07, 0x07, 0x06, 0x06, 0x1c, 0x19, 0x0d, 0x0e, - 0x08, 0x14, 0x14, 0x1a, 0x07, 0x0e, 0xbe, 0x01, 0x3a, 0x00, 0x1a, 0x00, - 0x19, 0x01, 0x40, 0x00, 0x59, 0x00, 0x1a, 0x01, 0x39, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x01, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x87, 0xc0, 0x31, 0x30, 0x01, 0x32, - 0x1e, 0x02, 0x17, 0x13, 0x23, 0x03, 0x0e, 0x02, 0x0f, 0x01, 0x23, 0x37, - 0x3e, 0x03, 0x37, 0x2e, 0x02, 0x2b, 0x01, 0x35, 0x01, 0x04, 0x61, 0x69, - 0x44, 0x39, 0x34, 0xae, 0xb6, 0x71, 0x54, 0x4d, 0x32, 0x16, 0x21, 0xbd, - 0x23, 0x18, 0x2e, 0x48, 0x6c, 0x8b, 0x32, 0x34, 0x3e, 0x39, 0x87, 0x04, - 0xcb, 0x1f, 0x45, 0x8c, 0xe1, 0xfd, 0x06, 0x01, 0xf8, 0x15, 0x3c, 0x76, - 0x7d, 0xb4, 0xb6, 0x84, 0x86, 0x5c, 0x3d, 0x26, 0xd4, 0x94, 0x3a, 0xaa, - 0x00, 0x01, 0x00, 0x29, 0x00, 0x00, 0x04, 0x37, 0x04, 0xcb, 0x00, 0x07, - 0x00, 0x2c, 0xb7, 0x01, 0x06, 0x07, 0x07, 0x09, 0x03, 0x08, 0x01, 0xb8, - 0x01, 0x3a, 0xb3, 0x07, 0x03, 0x04, 0x03, 0xbb, 0x01, 0x40, 0x00, 0x59, - 0x00, 0x04, 0x01, 0x39, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x21, 0x35, 0x21, 0x15, 0x23, 0x03, 0x9e, 0xb9, 0xfd, 0x44, 0x04, - 0x0e, 0x99, 0x04, 0x21, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0x98, - 0x00, 0x00, 0x04, 0x6f, 0x04, 0xcb, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x35, - 0x40, 0x0e, 0x05, 0x04, 0x04, 0x11, 0x0a, 0x00, 0x01, 0x10, 0x02, 0x02, - 0x01, 0x0b, 0x0b, 0x0a, 0xbe, 0x01, 0x40, 0x00, 0x59, 0x00, 0x0b, 0x01, - 0x39, 0x00, 0x05, 0x00, 0x01, 0x01, 0x3a, 0x00, 0x3f, 0x33, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x01, 0x33, 0x32, 0x32, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, - 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x20, 0x16, 0x11, 0x01, 0x64, 0xb8, - 0xb8, 0x03, 0x0b, 0xb9, 0x95, 0xb7, 0xfe, 0x2e, 0x01, 0xd5, 0x01, 0x14, - 0xee, 0x03, 0x1d, 0xfc, 0xe3, 0x02, 0xd1, 0xb8, 0x98, 0xaa, 0xec, 0xfe, - 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xae, 0x00, 0x00, 0x01, 0x66, - 0x04, 0xcb, 0x00, 0x03, 0x00, 0x15, 0xb3, 0x02, 0x04, 0x05, 0x03, 0xba, - 0x01, 0x3a, 0x00, 0x00, 0x01, 0x39, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, - 0x39, 0x31, 0x30, 0x13, 0x33, 0x11, 0x23, 0xae, 0xb8, 0xb8, 0x04, 0xcb, - 0xfb, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0x00, 0x00, 0x02, 0x79, - 0x04, 0xdd, 0x00, 0x0e, 0x00, 0x36, 0x40, 0x14, 0x08, 0x07, 0x07, 0x0f, - 0x0c, 0x01, 0x10, 0x0d, 0x0f, 0x02, 0x0c, 0x01, 0x0d, 0x0d, 0x0e, 0x00, - 0x01, 0x01, 0x08, 0x0e, 0xba, 0x01, 0x38, 0x00, 0x08, 0x01, 0x3a, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x32, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x15, 0x27, 0x0e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x37, - 0x25, 0x35, 0x02, 0x79, 0x6d, 0x3b, 0x2e, 0x14, 0xb8, 0x51, 0x61, 0xfe, - 0xaa, 0x04, 0x19, 0xbf, 0x25, 0x1f, 0x36, 0x4b, 0x39, 0xfd, 0x5a, 0x02, - 0x9e, 0x6a, 0x84, 0x20, 0x73, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0xae, - 0x00, 0x00, 0x04, 0xa0, 0x04, 0xcb, 0x00, 0x0d, 0x00, 0x2d, 0x40, 0x0a, - 0x0d, 0x0c, 0x0c, 0x0f, 0x05, 0x06, 0x06, 0x0e, 0x0d, 0x06, 0xbe, 0x01, - 0x3a, 0x00, 0x07, 0x00, 0x04, 0x01, 0x40, 0x00, 0x59, 0x00, 0x07, 0x01, - 0x39, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x21, - 0x11, 0x23, 0x11, 0x21, 0x20, 0x16, 0x19, 0x01, 0x23, 0x03, 0xe7, 0x93, - 0xb8, 0xfe, 0xca, 0xb8, 0x01, 0xf0, 0x01, 0x14, 0xee, 0xb9, 0x02, 0xd1, - 0xb6, 0x9a, 0xfb, 0xdf, 0x04, 0xcb, 0xec, 0xfe, 0xf0, 0xfd, 0x31, 0x00, - 0x00, 0x01, 0x00, 0xa4, 0xff, 0xec, 0x04, 0xcb, 0x04, 0xdf, 0x00, 0x1a, - 0x00, 0x3f, 0x40, 0x0d, 0x11, 0x0c, 0x06, 0x0c, 0x18, 0x18, 0x1c, 0x06, - 0x03, 0x03, 0x1b, 0x14, 0x0f, 0x41, 0x0c, 0x01, 0x40, 0x00, 0x59, 0x00, - 0x14, 0x01, 0x38, 0x00, 0x04, 0x01, 0x39, 0x00, 0x00, 0x00, 0x09, 0x01, - 0x40, 0x00, 0x59, 0x00, 0x00, 0x01, 0x3b, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x31, 0x30, 0x05, 0x22, 0x02, 0x19, 0x01, 0x33, 0x11, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x35, - 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x10, 0x00, 0x02, 0x93, 0xff, 0xf0, - 0xb8, 0x93, 0xa7, 0xc4, 0xb0, 0x58, 0x6a, 0x66, 0x5f, 0x4e, 0x89, 0x89, - 0x9d, 0x4b, 0xfe, 0xee, 0x14, 0x01, 0x01, 0x01, 0x0b, 0x02, 0xd3, 0xfd, - 0x33, 0xba, 0xac, 0xf2, 0x01, 0x18, 0xd0, 0xc1, 0x41, 0xb0, 0x3d, 0x76, - 0xfd, 0xca, 0xfe, 0x99, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x00, 0xae, - 0x02, 0x46, 0x01, 0x66, 0x04, 0xcb, 0x00, 0x03, 0x00, 0x16, 0xb6, 0x03, - 0x02, 0x02, 0x05, 0x04, 0x03, 0x00, 0xb8, 0x01, 0x39, 0x00, 0x3f, 0xcd, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x23, - 0xae, 0xb8, 0xb8, 0x04, 0xcb, 0xfd, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x27, - 0xfe, 0x7f, 0x03, 0xa2, 0x04, 0xcb, 0x00, 0x0b, 0x00, 0x23, 0xb7, 0x01, - 0x00, 0x00, 0x0d, 0x06, 0x0c, 0x07, 0x06, 0xbd, 0x01, 0x40, 0x00, 0x59, - 0x00, 0x07, 0x01, 0x39, 0x00, 0x01, 0x01, 0x3d, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, - 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x20, 0x16, 0x11, 0x03, 0xa2, 0xb9, - 0x93, 0xb8, 0xfe, 0x89, 0x01, 0x79, 0x01, 0x14, 0xee, 0xfe, 0x7f, 0x04, - 0x52, 0xb6, 0x9a, 0xaa, 0xec, 0xfe, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x03, 0xc3, 0x04, 0xcb, 0x00, 0x11, 0x00, 0x34, 0x40, 0x0a, - 0x0d, 0x03, 0x03, 0x12, 0x08, 0x00, 0x00, 0x13, 0x0e, 0x0d, 0x41, 0x0a, - 0x01, 0x40, 0x00, 0x59, 0x00, 0x0e, 0x01, 0x39, 0x00, 0x03, 0x00, 0x04, - 0x01, 0x40, 0x00, 0x59, 0x00, 0x03, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x10, 0x29, 0x01, 0x35, 0x21, 0x32, 0x36, 0x3d, 0x01, - 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x20, 0x11, 0x03, 0xc3, 0xfd, 0xcc, - 0xfe, 0xc1, 0x01, 0x43, 0xbf, 0xb6, 0xb7, 0xbe, 0xfe, 0xbd, 0x01, 0x3f, - 0x02, 0x34, 0x02, 0x54, 0xfd, 0xac, 0xaa, 0xd4, 0xd4, 0x27, 0xd5, 0xd3, - 0xaa, 0xfd, 0xac, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xd3, 0x03, 0xdb, - 0x06, 0x81, 0x00, 0x10, 0x00, 0x37, 0x40, 0x0c, 0x10, 0x0d, 0x0a, 0x07, - 0x07, 0x11, 0x04, 0x0d, 0x0d, 0x12, 0x00, 0x10, 0x41, 0x09, 0x01, 0x3c, - 0x00, 0x08, 0x01, 0x36, 0x00, 0x0a, 0x00, 0x07, 0x01, 0x40, 0x00, 0x59, - 0x00, 0x0a, 0x01, 0x39, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x31, - 0x30, 0x37, 0x36, 0x24, 0x12, 0x35, 0x34, 0x23, 0x21, 0x11, 0x33, 0x11, - 0x21, 0x20, 0x11, 0x10, 0x00, 0x05, 0xc1, 0xbf, 0x01, 0x12, 0x8f, 0xea, - 0xfe, 0x0f, 0xb8, 0x01, 0x4c, 0x01, 0x91, 0xfe, 0x52, 0xfe, 0x94, 0xa2, - 0x47, 0xd9, 0x01, 0x00, 0x84, 0xdb, 0x02, 0x60, 0xfe, 0x4a, 0xfe, 0x9b, - 0xfe, 0xdc, 0xfe, 0x13, 0x82, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xae, - 0x00, 0x00, 0x04, 0xc9, 0x04, 0xcb, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x34, - 0x40, 0x0a, 0x09, 0x00, 0x00, 0x0f, 0x08, 0x01, 0x01, 0x0e, 0x02, 0x07, - 0x41, 0x0a, 0x01, 0x40, 0x00, 0x59, 0x00, 0x02, 0x01, 0x39, 0x00, 0x01, - 0x00, 0x08, 0x01, 0x40, 0x00, 0x59, 0x00, 0x01, 0x01, 0x3a, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x11, 0x21, 0x20, 0x16, 0x11, 0x01, - 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x04, 0xc9, 0xfb, 0xe5, 0x02, 0x19, - 0x01, 0x14, 0xee, 0xfc, 0x9d, 0x02, 0xaa, 0x93, 0xb8, 0x04, 0xcb, 0xec, - 0xfe, 0xf0, 0x01, 0x52, 0xfc, 0x89, 0x02, 0x27, 0xb6, 0x9a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x04, 0xdb, 0x04, 0xdf, 0x00, 0x18, - 0x00, 0x59, 0x40, 0x16, 0x05, 0x13, 0x16, 0x03, 0x14, 0x04, 0x0f, 0x10, - 0x15, 0x10, 0x14, 0x14, 0x19, 0x07, 0x04, 0x04, 0x1a, 0x13, 0x16, 0x16, - 0x05, 0x14, 0x41, 0x0f, 0x01, 0x39, 0x00, 0x10, 0x01, 0x3a, 0x00, 0x00, - 0x00, 0x0b, 0x01, 0x40, 0x00, 0x59, 0x00, 0x00, 0x01, 0x38, 0x00, 0x05, - 0x00, 0x06, 0x01, 0x40, 0x00, 0x59, 0x00, 0x05, 0x01, 0x3a, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x32, 0x12, 0x19, 0x01, - 0x21, 0x35, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x0b, 0x01, 0x23, - 0x13, 0x36, 0x37, 0x03, 0x33, 0x17, 0x3e, 0x01, 0x03, 0x0a, 0xf2, 0xdf, - 0xfd, 0xa6, 0x01, 0xa0, 0x7e, 0x97, 0x87, 0xae, 0x4a, 0x7d, 0xc6, 0x89, - 0x2f, 0x2f, 0xfa, 0xd9, 0x7d, 0x4e, 0xb2, 0x04, 0xdf, 0xfe, 0xd9, 0xfe, - 0xbf, 0xfd, 0x89, 0xaa, 0x01, 0xb6, 0xf5, 0xde, 0xf5, 0xfe, 0xcc, 0xfd, - 0xf6, 0x02, 0x19, 0xbb, 0x76, 0x01, 0x81, 0xcb, 0x76, 0x69, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xae, 0xfe, 0x7f, 0x01, 0x66, 0x04, 0xcb, 0x00, 0x03, - 0x00, 0x19, 0xb5, 0x03, 0x02, 0x02, 0x05, 0x04, 0x00, 0xba, 0x01, 0x39, - 0x00, 0x03, 0x01, 0x3d, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x23, 0xae, 0xb8, 0xb8, 0x04, 0xcb, - 0xf9, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x02, 0x79, - 0x04, 0xcb, 0x00, 0x0f, 0x00, 0x36, 0x40, 0x0b, 0x09, 0x01, 0x00, 0x01, - 0x10, 0x03, 0x00, 0x00, 0x11, 0x0a, 0x09, 0x41, 0x0a, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x0a, 0x01, 0x39, 0x00, 0x01, 0x00, 0x02, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x01, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, - 0x29, 0x01, 0x35, 0x21, 0x11, 0x34, 0x2e, 0x01, 0x2b, 0x01, 0x35, 0x33, - 0x32, 0x1e, 0x01, 0x15, 0x02, 0x79, 0xfd, 0xcf, 0x01, 0x79, 0x21, 0x4e, - 0x4a, 0x87, 0x81, 0xa0, 0x93, 0x44, 0xaa, 0x02, 0x12, 0xa0, 0x8a, 0x3b, - 0xaa, 0x59, 0xcb, 0xb7, 0x00, 0x02, 0x00, 0x33, 0xff, 0xec, 0x04, 0xcf, - 0x04, 0xcb, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x41, 0x40, 0x0f, 0x1a, 0x0a, - 0x0a, 0x20, 0x11, 0x03, 0x03, 0x14, 0x14, 0x04, 0x10, 0x10, 0x1f, 0x0d, - 0x17, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x0d, 0x01, 0x3b, 0xb3, 0x11, - 0x04, 0x05, 0x04, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x05, 0x01, 0x39, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x34, 0x36, 0x37, 0x23, 0x35, 0x21, 0x20, 0x16, 0x11, 0x15, - 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x01, 0x06, 0x11, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x11, 0x35, 0x34, 0x26, 0x23, 0x85, 0x3b, 0x27, 0xb4, - 0x02, 0x98, 0x01, 0x14, 0xf0, 0xfe, 0xe1, 0xfe, 0xec, 0xfe, 0xee, 0xfe, - 0xfb, 0x01, 0x06, 0x43, 0xb1, 0xa7, 0xbf, 0xab, 0x8e, 0xb3, 0x02, 0x83, - 0x79, 0xf2, 0x33, 0xaa, 0xeb, 0xfe, 0xef, 0x58, 0xfe, 0xc0, 0xfe, 0xb5, - 0x01, 0x35, 0x01, 0x3f, 0x01, 0xc1, 0x77, 0xfe, 0xe1, 0x35, 0xdc, 0xe4, - 0xe2, 0x01, 0x01, 0x58, 0xba, 0x96, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, - 0xff, 0xdf, 0x04, 0x42, 0x04, 0xcb, 0x00, 0x0d, 0x00, 0x33, 0x40, 0x11, - 0x05, 0x02, 0x02, 0x0d, 0x08, 0x09, 0x09, 0x0f, 0x03, 0x0d, 0x0d, 0x0e, - 0x02, 0x05, 0x03, 0x00, 0x0d, 0xbb, 0x01, 0x3c, 0x00, 0x08, 0x00, 0x03, - 0x01, 0x39, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x39, 0x39, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, - 0x30, 0x37, 0x20, 0x37, 0x01, 0x33, 0x01, 0x36, 0x12, 0x11, 0x33, 0x10, - 0x02, 0x04, 0x05, 0x29, 0x01, 0x14, 0x9e, 0xfe, 0x8d, 0xcb, 0x01, 0x48, - 0x8c, 0x7a, 0xc1, 0xc5, 0xfe, 0x43, 0xfe, 0x69, 0xa2, 0x33, 0x03, 0xf6, - 0xfc, 0x58, 0x64, 0x01, 0xa3, 0x01, 0xa1, 0xfe, 0x31, 0xfd, 0xf6, 0xfe, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, 0xfe, 0x7f, 0x04, 0x58, - 0x04, 0xcb, 0x00, 0x0f, 0x00, 0x3d, 0x40, 0x0c, 0x0d, 0x04, 0x0b, 0x0e, - 0x0e, 0x10, 0x05, 0x04, 0x04, 0x11, 0x0b, 0x0e, 0xb8, 0x01, 0x40, 0xb4, - 0x59, 0x0b, 0x0b, 0x0f, 0x05, 0xbe, 0x01, 0x3d, 0x00, 0x0f, 0x00, 0x0a, - 0x01, 0x40, 0x00, 0x59, 0x00, 0x0f, 0x01, 0x39, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x20, 0x16, 0x19, 0x01, - 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x33, 0x15, 0x21, 0x11, 0x02, - 0x56, 0x01, 0x14, 0xee, 0xb8, 0x95, 0xb7, 0xfe, 0xeb, 0xf4, 0xfe, 0x52, - 0x04, 0xcb, 0xea, 0xfe, 0xee, 0xfb, 0xb0, 0x04, 0x52, 0xb8, 0x98, 0xfe, - 0xa6, 0xaa, 0x02, 0xae, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x04, 0x71, - 0x04, 0xcb, 0x00, 0x16, 0x00, 0x4c, 0x40, 0x0d, 0x11, 0x07, 0x0e, 0x05, - 0x08, 0x08, 0x17, 0x16, 0x0e, 0x0e, 0x18, 0x05, 0x08, 0xb8, 0x01, 0x40, - 0xb6, 0x59, 0x05, 0x05, 0x11, 0x09, 0x09, 0x04, 0x41, 0x0a, 0x01, 0x40, - 0x00, 0x59, 0x00, 0x09, 0x01, 0x39, 0x00, 0x11, 0x00, 0x12, 0x01, 0x40, - 0x00, 0x59, 0x00, 0x11, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x33, 0x31, 0x30, 0x01, 0x34, - 0x26, 0x23, 0x21, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x20, 0x00, 0x11, - 0x15, 0x10, 0x29, 0x01, 0x35, 0x21, 0x32, 0x36, 0x35, 0x03, 0xb6, 0xa6, - 0xb2, 0xfe, 0xec, 0xf3, 0xfe, 0x52, 0x01, 0xd1, 0x01, 0x0c, 0x01, 0x05, - 0xfd, 0xcc, 0xfe, 0x5d, 0x01, 0xa8, 0xbe, 0xb6, 0x02, 0xaa, 0xbd, 0xba, - 0xfe, 0xa6, 0xaa, 0x02, 0xae, 0xfe, 0xf5, 0xfe, 0xe6, 0x52, 0xfd, 0xac, - 0xaa, 0xd3, 0xd5, 0x00, 0x00, 0x01, 0x00, 0x0a, 0xfe, 0x7f, 0x03, 0xd5, - 0x04, 0xcb, 0x00, 0x14, 0x00, 0x36, 0x40, 0x14, 0x0a, 0x01, 0x00, 0x00, - 0x06, 0x0f, 0x10, 0x10, 0x16, 0x07, 0x06, 0x06, 0x15, 0x14, 0x02, 0x0a, - 0x0a, 0x01, 0x0f, 0x06, 0xba, 0x01, 0x39, 0x00, 0x01, 0x01, 0x3d, 0x00, - 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x03, 0x33, 0x12, 0x16, 0x17, 0x3e, - 0x02, 0x3f, 0x01, 0x33, 0x03, 0x0e, 0x01, 0x07, 0x02, 0x00, 0xb8, 0x2c, - 0x66, 0xac, 0xd9, 0xac, 0x63, 0x0a, 0x5c, 0x68, 0x35, 0x0b, 0x14, 0xc1, - 0x1b, 0x13, 0xc8, 0xdf, 0xfe, 0x7f, 0x03, 0xa2, 0x59, 0x91, 0xbb, 0x01, - 0x05, 0xfe, 0xf6, 0xe2, 0x77, 0x17, 0x50, 0x87, 0x7d, 0xf8, 0xfe, 0xe9, - 0xd8, 0xd9, 0x2c, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x04, - 0x04, 0xcb, 0x00, 0x11, 0x00, 0x47, 0x40, 0x15, 0x0a, 0x0b, 0x0b, 0x10, - 0x06, 0x05, 0x03, 0x11, 0x11, 0x13, 0x05, 0x04, 0x04, 0x02, 0x12, 0x10, - 0x06, 0x06, 0x01, 0x0a, 0x05, 0xb8, 0x01, 0x39, 0xb3, 0x11, 0x02, 0x01, - 0x02, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x01, 0x01, 0x3a, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x01, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x35, 0x21, 0x01, 0x33, 0x01, - 0x3e, 0x01, 0x3f, 0x01, 0x33, 0x07, 0x0e, 0x02, 0x07, 0x01, 0x04, 0x04, - 0xfc, 0x50, 0x02, 0xcb, 0xfc, 0xeb, 0xe6, 0x01, 0x7d, 0x4d, 0x46, 0x0c, - 0x17, 0xbe, 0x14, 0x0e, 0x37, 0x66, 0x5d, 0x01, 0x3f, 0xaa, 0x04, 0x21, - 0xfd, 0xfa, 0x21, 0x81, 0x85, 0xdf, 0xdb, 0x8c, 0x91, 0x60, 0x25, 0xfe, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7b, 0xfe, 0x7f, 0x04, 0x48, - 0x04, 0xcb, 0x00, 0x03, 0x00, 0x13, 0x00, 0x3f, 0x40, 0x10, 0x13, 0x0b, - 0x08, 0x01, 0x02, 0x02, 0x14, 0x0f, 0x08, 0x08, 0x15, 0x03, 0x03, 0x04, - 0x0c, 0x0b, 0x41, 0x09, 0x01, 0x3b, 0x00, 0x02, 0x01, 0x3d, 0x00, 0x04, - 0x00, 0x13, 0x01, 0x40, 0x00, 0x59, 0x00, 0x04, 0x01, 0x39, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x23, 0x11, 0x03, 0x21, 0x32, 0x16, 0x15, 0x10, 0x00, 0x05, 0x35, - 0x36, 0x12, 0x35, 0x34, 0x26, 0x23, 0x21, 0x01, 0x66, 0xb8, 0x33, 0x02, - 0x06, 0xf7, 0xd0, 0xfe, 0xb1, 0xfe, 0xe2, 0xd1, 0xe1, 0x75, 0x8f, 0xfd, - 0xf2, 0x03, 0x1d, 0xfb, 0x62, 0x04, 0x9e, 0x01, 0xae, 0xb1, 0xcc, 0xfe, - 0xe6, 0xfe, 0x29, 0x78, 0xd3, 0x5e, 0x01, 0x4f, 0xd0, 0x86, 0x66, 0x00, - 0x00, 0x01, 0x00, 0x27, 0x00, 0x00, 0x03, 0xa2, 0x04, 0xcb, 0x00, 0x0b, - 0x00, 0x26, 0xb6, 0x06, 0x0c, 0x01, 0x00, 0x00, 0x0d, 0x01, 0xbe, 0x01, - 0x3a, 0x00, 0x07, 0x00, 0x06, 0x01, 0x40, 0x00, 0x59, 0x00, 0x07, 0x01, - 0x39, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x31, 0x30, 0x21, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x35, - 0x21, 0x20, 0x16, 0x11, 0x03, 0xa2, 0xb9, 0x93, 0xb8, 0xfe, 0x89, 0x01, - 0x79, 0x01, 0x14, 0xee, 0x02, 0xd1, 0xb6, 0x9a, 0xaa, 0xec, 0xfe, 0xf0, - 0x00, 0x01, 0x00, 0x33, 0xff, 0xf6, 0x05, 0x7f, 0x04, 0xcb, 0x00, 0x1d, - 0x00, 0x50, 0x40, 0x15, 0x0f, 0x10, 0x00, 0x01, 0x07, 0x19, 0x08, 0x18, - 0x18, 0x17, 0x16, 0x08, 0x17, 0x08, 0x01, 0x10, 0x04, 0x1f, 0x1e, 0x19, - 0x07, 0xb8, 0x01, 0x42, 0xb6, 0x59, 0x19, 0x19, 0x16, 0x0f, 0x00, 0x17, - 0xbe, 0x01, 0x39, 0x00, 0x16, 0x00, 0x08, 0x01, 0x41, 0x00, 0x59, 0x00, - 0x16, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x33, 0x12, - 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, - 0x03, 0x0e, 0x02, 0x0f, 0x01, 0x13, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x13, - 0x33, 0x03, 0x02, 0x0e, 0x01, 0x04, 0x05, 0x03, 0x33, 0x13, 0x37, 0x3e, - 0x01, 0x37, 0x02, 0x9c, 0xbe, 0x1f, 0x0f, 0x33, 0x64, 0x74, 0x96, 0x31, - 0x18, 0xc9, 0xf2, 0x8c, 0x4d, 0x17, 0x3f, 0xc1, 0x40, 0x1f, 0x72, 0xd0, - 0xfe, 0x93, 0xfe, 0xac, 0xea, 0xbf, 0x7b, 0x49, 0x6c, 0x56, 0x0b, 0x04, - 0xcb, 0xfe, 0xb8, 0xa7, 0x95, 0x51, 0x1f, 0x23, 0xfe, 0xfe, 0x2f, 0x64, - 0xb7, 0xc2, 0x02, 0x0d, 0xfd, 0xfa, 0xfe, 0xfa, 0xfd, 0x8b, 0x3f, 0x02, - 0x04, 0xd5, 0xfd, 0x89, 0x0e, 0x18, 0x79, 0x92, 0x00, 0x01, 0x00, 0x3d, - 0x00, 0x00, 0x04, 0xe3, 0x04, 0xcb, 0x00, 0x19, 0x00, 0x41, 0x40, 0x0e, - 0x0e, 0x19, 0x19, 0x07, 0x01, 0x13, 0x13, 0x1a, 0x08, 0x07, 0x07, 0x1b, - 0x13, 0x14, 0xb8, 0x01, 0x40, 0xb2, 0x59, 0x08, 0x13, 0xb8, 0x01, 0x3a, - 0xb3, 0x0d, 0x01, 0x02, 0x01, 0xbb, 0x01, 0x40, 0x00, 0x59, 0x00, 0x02, - 0x01, 0x39, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x23, 0x35, 0x21, 0x20, 0x16, 0x19, 0x01, 0x23, - 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x14, 0x0e, 0x01, 0x2b, 0x01, 0x35, - 0x33, 0x32, 0x3e, 0x01, 0x35, 0x01, 0x06, 0xbe, 0x02, 0x97, 0x01, 0x14, - 0xf0, 0xb8, 0x95, 0xb9, 0xfe, 0xe1, 0x43, 0x94, 0x9f, 0x0b, 0x11, 0x46, - 0x50, 0x22, 0x04, 0x21, 0xaa, 0xeb, 0xfe, 0xef, 0xfd, 0x31, 0x02, 0xd1, - 0xb8, 0x98, 0xfd, 0xba, 0xb8, 0xca, 0x59, 0xaa, 0x33, 0x6c, 0x6d, 0x00, - 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x03, 0x64, 0x04, 0xcb, 0x10, 0x26, - 0x05, 0x05, 0x00, 0x00, 0x10, 0x07, 0x05, 0x05, 0x01, 0xfe, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x03, 0x64, 0x04, 0xcb, 0x10, 0x26, - 0x05, 0x09, 0x00, 0x00, 0x10, 0x07, 0x05, 0x05, 0x01, 0xfe, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xae, 0x02, 0x46, 0x03, 0x64, 0x04, 0xcb, 0x10, 0x26, - 0x05, 0x09, 0x00, 0x00, 0x10, 0x07, 0x05, 0x09, 0x01, 0xfe, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xd7, 0x04, 0x06, 0x02, 0x48, 0x06, 0x81, 0x00, 0x03, - 0x00, 0x1d, 0x40, 0x0a, 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x05, 0x04, - 0x01, 0x02, 0xb8, 0x01, 0x36, 0x00, 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x13, 0x33, 0x01, - 0x60, 0x89, 0x89, 0xe8, 0x04, 0x06, 0x02, 0x7b, 0x00, 0x02, 0x00, 0xd7, - 0x04, 0x06, 0x04, 0x06, 0x06, 0x81, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2d, - 0x40, 0x12, 0x04, 0x05, 0x06, 0x05, 0x07, 0x02, 0x03, 0x03, 0x00, 0x01, - 0x07, 0x01, 0x09, 0x08, 0x05, 0x01, 0x06, 0x02, 0xb8, 0x01, 0x36, 0x00, - 0x3f, 0x33, 0xcd, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x13, - 0x33, 0x13, 0x23, 0x13, 0x33, 0x01, 0x60, 0x89, 0x89, 0xe8, 0xd7, 0x89, - 0x89, 0xe7, 0x04, 0x06, 0x02, 0x7b, 0xfd, 0x85, 0x02, 0x7b, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x03, 0xe3, 0x04, 0x3a, 0x00, 0x07, - 0x00, 0x0a, 0x00, 0x3f, 0x40, 0x21, 0x07, 0x06, 0x09, 0x08, 0x09, 0x0a, - 0x03, 0x05, 0x00, 0x00, 0x05, 0x0c, 0x0b, 0x0a, 0x03, 0x50, 0x59, 0x09, - 0x08, 0x06, 0x2f, 0x0a, 0x01, 0x0a, 0x08, 0x0a, 0x08, 0x05, 0x06, 0x0f, - 0x01, 0x05, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x5d, 0x11, 0x12, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x23, 0x03, 0x21, 0x03, - 0x23, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x03, 0xe3, 0xaa, 0x76, 0xfe, 0x75, - 0x74, 0xaf, 0x01, 0x94, 0xa8, 0x46, 0x9c, 0x97, 0x01, 0x35, 0xfe, 0xcb, - 0x04, 0x3a, 0xfd, 0x83, 0x01, 0xcd, 0xfe, 0x33, 0x00, 0x02, 0x00, 0x19, - 0x00, 0x00, 0x05, 0xb0, 0x04, 0x3a, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x5e, - 0x40, 0x34, 0x0a, 0x0e, 0x0e, 0x11, 0x01, 0x10, 0x0c, 0x05, 0x08, 0x00, - 0x04, 0x05, 0x05, 0x00, 0x01, 0x03, 0x15, 0x14, 0x09, 0x13, 0x06, 0x13, - 0x50, 0x59, 0x10, 0x03, 0x50, 0x59, 0x0a, 0x0d, 0x50, 0x59, 0x0f, 0x0a, - 0x01, 0x0b, 0x03, 0x10, 0x0a, 0x10, 0x0a, 0x01, 0x06, 0x0f, 0x05, 0x15, - 0x01, 0x0e, 0x50, 0x59, 0x01, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x2b, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, - 0x11, 0x21, 0x03, 0x23, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, - 0x11, 0x21, 0x01, 0x21, 0x11, 0x23, 0x05, 0xb0, 0xfd, 0x4b, 0xfe, 0x80, - 0xa0, 0xc2, 0x02, 0x1c, 0x03, 0x62, 0xfe, 0x18, 0x01, 0xc1, 0xfe, 0x3f, - 0x02, 0x01, 0xfc, 0x0b, 0x01, 0x40, 0x5e, 0x01, 0x4c, 0xfe, 0xb4, 0x04, - 0x3a, 0x8b, 0xfe, 0xc1, 0x8a, 0xfe, 0xa5, 0x01, 0x4b, 0x01, 0xd9, 0x00, - 0x00, 0x03, 0x00, 0x42, 0xff, 0xec, 0x06, 0xc2, 0x04, 0x4c, 0x00, 0x27, - 0x00, 0x34, 0x00, 0x3b, 0x00, 0x96, 0x40, 0x52, 0x1c, 0x1d, 0x1d, 0x2d, - 0x11, 0x22, 0x0b, 0x3b, 0x28, 0x16, 0x16, 0x00, 0x3b, 0x06, 0x07, 0x07, - 0x35, 0x26, 0x26, 0x3b, 0x11, 0x03, 0x3d, 0x3c, 0x24, 0x38, 0x50, 0x59, - 0x24, 0x16, 0x27, 0x35, 0x50, 0x59, 0x28, 0x15, 0x51, 0x59, 0x0b, 0x0e, - 0x27, 0x22, 0x28, 0x20, 0x1f, 0x28, 0x01, 0x27, 0x28, 0x27, 0x28, 0x0e, - 0x20, 0x00, 0x1c, 0x01, 0x0a, 0x03, 0x1c, 0x1c, 0x20, 0x20, 0x19, 0x50, - 0x59, 0x20, 0x16, 0x0e, 0x30, 0x50, 0x59, 0x0e, 0x10, 0x06, 0x06, 0x09, - 0x09, 0x03, 0x50, 0x59, 0x09, 0x10, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x11, - 0x12, 0x39, 0x11, 0x12, 0x39, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x35, 0x02, 0x21, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x20, 0x13, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x06, - 0x23, 0x20, 0x11, 0x35, 0x05, 0x37, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, - 0x22, 0x0e, 0x01, 0x15, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x03, - 0x3c, 0x09, 0xfe, 0xe5, 0x75, 0x8d, 0x19, 0x9e, 0x61, 0x01, 0x58, 0x01, - 0x41, 0x66, 0x4f, 0xd2, 0x92, 0xa7, 0xa9, 0xed, 0xf3, 0xf0, 0x6f, 0x79, - 0x7e, 0x71, 0x0d, 0xbc, 0x1a, 0xdd, 0xc5, 0xfa, 0x63, 0x76, 0xe4, 0xfe, - 0x23, 0x03, 0xb0, 0xc3, 0x80, 0x88, 0x4c, 0x64, 0x5d, 0x66, 0x9a, 0x56, - 0xfd, 0x0a, 0x0f, 0x90, 0x87, 0x7f, 0x93, 0x06, 0x02, 0x43, 0x11, 0x01, - 0x71, 0x5e, 0x48, 0x2d, 0x01, 0x00, 0xfe, 0xff, 0x8c, 0x75, 0xac, 0x96, - 0xad, 0xaf, 0x04, 0x04, 0x3b, 0x87, 0x6f, 0x50, 0x5c, 0x11, 0x95, 0x8f, - 0x8b, 0x8b, 0x02, 0x3f, 0x18, 0x1f, 0x04, 0x02, 0x2f, 0x62, 0x52, 0x57, - 0x61, 0x59, 0x98, 0x57, 0xc4, 0xab, 0x9d, 0xab, 0x9d, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x04, 0x29, 0x04, 0x3a, 0x00, 0x14, - 0x00, 0x1d, 0x00, 0x26, 0x00, 0x5e, 0x40, 0x30, 0x23, 0x0b, 0x08, 0x06, - 0x06, 0x1a, 0x0a, 0x0e, 0x1f, 0x16, 0x16, 0x14, 0x01, 0x12, 0x0e, 0x12, - 0x28, 0x27, 0x15, 0x0b, 0x14, 0x00, 0x14, 0x50, 0x59, 0x1f, 0x08, 0x0f, - 0x00, 0x01, 0x0b, 0x03, 0x00, 0x00, 0x12, 0x02, 0x12, 0x16, 0x50, 0x59, - 0x12, 0x15, 0x02, 0x1e, 0x50, 0x59, 0x02, 0x0f, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, - 0x07, 0x33, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, - 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x19, 0x75, 0x01, 0xaf, 0xba, - 0xd6, 0x4b, 0xa7, 0x8b, 0x21, 0x2d, 0xc6, 0xca, 0xfe, 0x32, 0x75, 0x01, - 0x29, 0x01, 0x0e, 0x79, 0x66, 0x6e, 0x71, 0xfe, 0xf2, 0xef, 0x79, 0x66, - 0x66, 0x79, 0x02, 0x62, 0x01, 0xd8, 0x9e, 0x90, 0x64, 0x46, 0x8a, 0x1e, - 0x5d, 0x33, 0x92, 0x98, 0x01, 0xd8, 0xfe, 0xb0, 0x52, 0x52, 0x59, 0x53, - 0x01, 0xd9, 0xfe, 0xb1, 0x55, 0x52, 0x52, 0x56, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x03, 0xca, 0x04, 0x4e, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x3a, 0x00, 0x07, - 0x00, 0x10, 0x00, 0x28, 0x40, 0x14, 0x08, 0x00, 0x0d, 0x04, 0x00, 0x04, - 0x12, 0x11, 0x05, 0x0c, 0x50, 0x59, 0x05, 0x0f, 0x04, 0x0d, 0x50, 0x59, - 0x04, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x00, 0x29, - 0x01, 0x11, 0x21, 0x20, 0x03, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, - 0x36, 0x04, 0x1d, 0xfe, 0xe5, 0xfe, 0xf3, 0xfe, 0x92, 0x01, 0x6e, 0x02, - 0x28, 0xb9, 0xad, 0xc4, 0xb8, 0xbb, 0xb7, 0xb7, 0x02, 0x2d, 0xfe, 0xed, - 0xfe, 0xe6, 0x04, 0x3a, 0xfd, 0xf5, 0xca, 0xb5, 0xfc, 0xdd, 0xcb, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x18, 0x00, 0x50, 0x40, 0x29, 0x11, 0x15, 0x15, 0x0b, 0x01, 0x13, - 0x09, 0x0c, 0x05, 0x09, 0x05, 0x19, 0x1a, 0x14, 0x0b, 0x00, 0x0b, 0x50, - 0x59, 0x11, 0x0f, 0x00, 0x01, 0x0b, 0x03, 0x00, 0x00, 0x09, 0x02, 0x09, - 0x15, 0x50, 0x59, 0x09, 0x15, 0x02, 0x10, 0x50, 0x59, 0x02, 0x0f, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x12, 0x39, 0x32, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, - 0x11, 0x33, 0x11, 0x21, 0x20, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x23, - 0x25, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x32, - 0x36, 0x87, 0x01, 0x6e, 0x02, 0x28, 0xfe, 0xe5, 0xfe, 0xf3, 0xfe, 0x92, - 0x87, 0x03, 0x64, 0xad, 0xc4, 0xb8, 0xf1, 0xf1, 0xbb, 0xb7, 0xb7, 0x02, - 0x70, 0x01, 0xca, 0xfd, 0xf3, 0xfe, 0xed, 0xfe, 0xe6, 0x01, 0xe6, 0x49, - 0xca, 0xb5, 0xfe, 0xc2, 0x8a, 0xfe, 0xa5, 0xcb, 0x00, 0x01, 0x00, 0x87, - 0x00, 0x00, 0x03, 0x9f, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x47, 0x40, 0x25, - 0x04, 0x00, 0x06, 0x0a, 0x0a, 0x08, 0x01, 0x00, 0x00, 0x01, 0x0d, 0x0c, - 0x06, 0x09, 0x50, 0x59, 0x0f, 0x06, 0x01, 0x0b, 0x03, 0x06, 0x06, 0x01, - 0x02, 0x02, 0x05, 0x50, 0x59, 0x02, 0x0f, 0x01, 0x0a, 0x50, 0x59, 0x01, - 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x12, 0x39, 0x32, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x11, - 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x9f, 0xfc, - 0xe8, 0x02, 0xff, 0xfd, 0xb5, 0x02, 0x24, 0xfd, 0xdc, 0x02, 0x64, 0x04, - 0x3a, 0x8b, 0xfe, 0xc1, 0x8a, 0xfe, 0xa5, 0x00, 0x00, 0x01, 0x00, 0x31, - 0xff, 0xec, 0x03, 0x5e, 0x04, 0x4e, 0x00, 0x24, 0x00, 0x62, 0x40, 0x32, - 0x0c, 0x1e, 0x16, 0x0f, 0x1b, 0x1b, 0x09, 0x22, 0x15, 0x16, 0x16, 0x04, - 0x03, 0x22, 0x03, 0x26, 0x25, 0x00, 0x26, 0x01, 0x0a, 0x03, 0x1e, 0x0c, - 0x0b, 0x0c, 0x0b, 0x50, 0x59, 0x0c, 0x0c, 0x00, 0x18, 0x15, 0x15, 0x18, - 0x18, 0x12, 0x50, 0x59, 0x18, 0x10, 0x00, 0x06, 0x50, 0x59, 0x04, 0x04, - 0x00, 0x16, 0x00, 0x3f, 0x32, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x01, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x05, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x21, - 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, - 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, - 0x06, 0x01, 0xca, 0xa7, 0xc5, 0x2d, 0x9f, 0x35, 0xc9, 0x60, 0x71, 0xfe, - 0xb5, 0xa1, 0x98, 0x63, 0x5d, 0x59, 0x71, 0x0c, 0xa2, 0x2e, 0x01, 0x4b, - 0xa8, 0xce, 0x91, 0x67, 0x79, 0x99, 0xd7, 0x14, 0x7d, 0x81, 0x2c, 0xa4, - 0x5e, 0x5b, 0xc8, 0x89, 0x54, 0x58, 0x4a, 0x56, 0x4a, 0x46, 0x14, 0x01, - 0x02, 0x9f, 0x7e, 0x65, 0x88, 0x09, 0x02, 0x0d, 0x8f, 0x6d, 0x98, 0xac, - 0x00, 0x02, 0x00, 0x89, 0xfe, 0x6e, 0x01, 0x3d, 0x04, 0x3a, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x20, 0x40, 0x0e, 0x06, 0x02, 0x02, 0x05, 0x01, 0x01, - 0x08, 0x09, 0x07, 0x0f, 0x02, 0x03, 0x06, 0x15, 0x00, 0x3f, 0xd6, 0xcd, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x05, 0x15, 0x23, 0x35, 0x13, 0x11, 0x23, 0x11, 0x01, 0x3d, 0xb4, 0xb4, - 0xb4, 0xe6, 0xac, 0xac, 0x05, 0x20, 0xfb, 0xc6, 0x04, 0x3a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x30, 0xff, 0xec, 0x02, 0xda, 0x04, 0x3a, 0x00, 0x10, - 0x00, 0x2e, 0x40, 0x17, 0x09, 0x0b, 0x0e, 0x03, 0x02, 0x0e, 0x02, 0x12, - 0x11, 0x0c, 0x0b, 0x50, 0x59, 0x0c, 0x0f, 0x00, 0x06, 0x50, 0x59, 0x03, - 0x03, 0x00, 0x16, 0x00, 0x3f, 0x32, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x32, 0x31, 0x30, - 0x05, 0x20, 0x03, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, - 0x35, 0x21, 0x11, 0x14, 0x06, 0x01, 0x7b, 0xfe, 0xe9, 0x34, 0x9c, 0x0f, - 0x5f, 0x40, 0x4f, 0x5e, 0xef, 0x01, 0xa2, 0xb8, 0x14, 0x01, 0x1d, 0x27, - 0x64, 0x5a, 0x68, 0x72, 0x02, 0x63, 0x8b, 0xfd, 0x05, 0x9f, 0xb4, 0x00, - 0xff, 0xff, 0x00, 0x8a, 0x00, 0x00, 0x04, 0x03, 0x04, 0x3a, 0x10, 0x06, - 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x03, 0x10, - 0x04, 0x3a, 0x00, 0x0d, 0x00, 0x3c, 0x40, 0x1f, 0x08, 0x0c, 0x0c, 0x05, - 0x03, 0x01, 0x01, 0x0a, 0x00, 0x03, 0x0f, 0x0e, 0x08, 0x05, 0x0b, 0x02, - 0x04, 0x09, 0x03, 0x09, 0x03, 0x09, 0x01, 0x06, 0x0f, 0x01, 0x0c, 0x50, - 0x59, 0x01, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x11, 0x07, 0x35, 0x37, - 0x11, 0x33, 0x11, 0x37, 0x15, 0x07, 0x11, 0x21, 0x03, 0x10, 0xfd, 0x77, - 0x77, 0x77, 0xb4, 0xbb, 0xbb, 0x01, 0xd5, 0x01, 0x9f, 0x65, 0x9f, 0x65, - 0x01, 0xfc, 0xfe, 0x70, 0x9f, 0x9f, 0x9f, 0xfe, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x04, 0xf3, 0x04, 0x3a, 0x00, 0x14, - 0x00, 0x41, 0x40, 0x25, 0x08, 0x05, 0x05, 0x06, 0x0e, 0x11, 0x11, 0x10, - 0x10, 0x0b, 0x06, 0x03, 0x15, 0x16, 0x80, 0x16, 0xb0, 0x16, 0xc0, 0x16, - 0x03, 0x3f, 0x16, 0x01, 0x0b, 0x02, 0x14, 0x03, 0x06, 0x0e, 0x07, 0x0f, - 0x11, 0x06, 0x15, 0x01, 0x15, 0x00, 0x3f, 0x3f, 0x33, 0x3f, 0x33, 0x12, - 0x17, 0x39, 0x01, 0x5d, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x16, 0x15, - 0x11, 0x23, 0x11, 0x21, 0x13, 0x16, 0x17, 0x36, 0x37, 0x13, 0x21, 0x11, - 0x23, 0x11, 0x3f, 0x01, 0x03, 0x13, 0x99, 0xfe, 0xbc, 0x06, 0xae, 0x01, - 0x18, 0xdc, 0x34, 0x10, 0x16, 0x2e, 0xdc, 0x01, 0x0d, 0xad, 0x03, 0x05, - 0x03, 0xb7, 0x9c, 0x47, 0xfd, 0x2c, 0x04, 0x3a, 0xfd, 0x6b, 0x8f, 0x8f, - 0xa1, 0x7d, 0x02, 0x95, 0xfb, 0xc6, 0x02, 0xd4, 0x72, 0x73, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xea, 0x04, 0x3a, 0x00, 0x0d, - 0x00, 0x48, 0x40, 0x2c, 0x0b, 0x01, 0x01, 0x0c, 0x03, 0x06, 0x06, 0x05, - 0x0c, 0x05, 0x0e, 0x0f, 0xb0, 0x0f, 0xc0, 0x0f, 0xd0, 0x0f, 0x03, 0xb0, - 0x0f, 0xf0, 0x0f, 0x02, 0x70, 0x0f, 0x80, 0x0f, 0xa0, 0x0f, 0xb0, 0x0f, - 0xc0, 0x0f, 0x05, 0x02, 0x0a, 0x0c, 0x03, 0x0d, 0x0f, 0x06, 0x0c, 0x15, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x01, 0x5d, 0x71, 0x72, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x11, 0x03, 0x01, 0x33, 0x11, 0x23, 0x11, 0x34, 0x36, - 0x37, 0x01, 0x23, 0x11, 0x01, 0x3c, 0x0a, 0x01, 0xf3, 0xc5, 0xac, 0x07, - 0x03, 0xfe, 0x06, 0xc0, 0x04, 0x3a, 0xfd, 0xb0, 0xfe, 0xeb, 0x03, 0x65, - 0xfb, 0xc6, 0x02, 0x94, 0x24, 0x92, 0x1f, 0xfc, 0x97, 0x04, 0x3a, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x04, 0x4e, 0x12, 0x06, - 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0xff, 0xec, 0x03, 0xb0, - 0x04, 0x4e, 0x12, 0x06, 0x02, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, - 0x00, 0x31, 0x04, 0xa0, 0x03, 0xf8, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x26, - 0x40, 0x12, 0x14, 0x03, 0x0e, 0x08, 0x03, 0x08, 0x18, 0x17, 0x06, 0x11, - 0x53, 0x59, 0x06, 0x00, 0x0b, 0x53, 0x59, 0x00, 0x00, 0x2f, 0x2b, 0x00, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x20, 0x04, 0x15, 0x14, 0x04, 0x21, 0x20, 0x11, 0x34, - 0x24, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x02, 0x6e, 0x01, 0x1c, 0x01, 0x16, 0xfe, 0xdf, 0xfe, 0xef, 0xfd, - 0xd0, 0x01, 0x11, 0x01, 0x1f, 0xe0, 0xcb, 0xcf, 0xdc, 0xd7, 0xd6, 0xd0, - 0x03, 0xf8, 0xfa, 0xee, 0xed, 0xf2, 0x01, 0xe5, 0xf8, 0xea, 0xbd, 0x85, - 0x9d, 0x9e, 0x8d, 0x8b, 0x95, 0xa2, 0x8b, 0x00, 0x00, 0x01, 0x00, 0x41, - 0x00, 0x6b, 0x04, 0xa3, 0x03, 0xde, 0x00, 0x19, 0x00, 0x2a, 0x40, 0x15, - 0x17, 0x10, 0x03, 0x0a, 0x0a, 0x06, 0x14, 0x10, 0x04, 0x1b, 0x1a, 0x0d, - 0x00, 0x53, 0x59, 0x0d, 0x14, 0x06, 0x06, 0x13, 0x07, 0x00, 0x2f, 0x33, - 0x33, 0x11, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x07, - 0x2e, 0x01, 0x35, 0x34, 0x24, 0x21, 0x20, 0x04, 0x15, 0x14, 0x06, 0x07, - 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x02, 0x77, 0xd8, 0xd0, 0x68, 0x6c, - 0x0c, 0x9c, 0xba, 0x01, 0x1f, 0x01, 0x13, 0x01, 0x11, 0x01, 0x1f, 0xac, - 0x97, 0x0e, 0x5a, 0x6a, 0xbe, 0x03, 0x22, 0x88, 0x89, 0x60, 0x81, 0x0f, - 0xb6, 0x15, 0xe0, 0xac, 0xe3, 0xef, 0xf0, 0xe0, 0xa6, 0xdb, 0x1c, 0xb9, - 0x0e, 0x72, 0x69, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2f, - 0xff, 0xd6, 0x04, 0xb1, 0x04, 0x5e, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x22, - 0x00, 0x44, 0x40, 0x27, 0x20, 0x0f, 0x0c, 0x18, 0x07, 0x03, 0x03, 0x05, - 0x08, 0x16, 0x15, 0x1e, 0x11, 0x0e, 0x0c, 0x09, 0x24, 0x23, 0x11, 0x0e, - 0x1e, 0x16, 0x05, 0x08, 0x06, 0x0a, 0x00, 0x0a, 0x1b, 0x53, 0x59, 0x07, - 0x0a, 0x00, 0x13, 0x53, 0x59, 0x10, 0x00, 0x00, 0x2f, 0x32, 0x2b, 0x00, - 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x25, 0x20, - 0x24, 0x35, 0x34, 0x37, 0x27, 0x35, 0x17, 0x36, 0x33, 0x20, 0x11, 0x14, - 0x07, 0x17, 0x15, 0x27, 0x06, 0x27, 0x32, 0x37, 0x01, 0x06, 0x15, 0x14, - 0x16, 0x13, 0x22, 0x07, 0x01, 0x36, 0x35, 0x34, 0x26, 0x02, 0x73, 0xfe, - 0xe4, 0xfe, 0xea, 0x62, 0x74, 0xd6, 0x8a, 0xe4, 0x02, 0x30, 0x5b, 0x69, - 0xc9, 0x85, 0xf0, 0x81, 0x5c, 0xfd, 0xce, 0x58, 0xd0, 0xdd, 0x82, 0x55, - 0x02, 0x31, 0x51, 0xcf, 0x32, 0xfa, 0xee, 0xc3, 0x76, 0x64, 0xa7, 0xb8, - 0x53, 0xfe, 0x1b, 0xc9, 0x73, 0x5b, 0xa7, 0xad, 0x51, 0xbd, 0x17, 0x01, - 0xe3, 0x44, 0x89, 0xa2, 0x8b, 0x02, 0x4d, 0x18, 0xfe, 0x1e, 0x43, 0x8c, - 0x9e, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x57, 0xff, 0xec, 0x07, 0x33, - 0x04, 0x4e, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x6d, 0x40, 0x3a, - 0x06, 0x07, 0x07, 0x26, 0x19, 0x15, 0x0b, 0x1b, 0x1b, 0x00, 0x2c, 0x21, - 0x10, 0x10, 0x2c, 0x19, 0x03, 0x2d, 0x2e, 0x1a, 0x26, 0x50, 0x59, 0x15, - 0x17, 0x0b, 0x09, 0x1a, 0x1a, 0x17, 0x09, 0x17, 0x29, 0x50, 0x59, 0x17, - 0x16, 0x13, 0x1e, 0x50, 0x59, 0x13, 0x16, 0x0d, 0x23, 0x50, 0x59, 0x0d, - 0x10, 0x06, 0x06, 0x09, 0x09, 0x03, 0x50, 0x59, 0x09, 0x10, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x12, 0x39, - 0x12, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x20, 0x17, 0x36, - 0x21, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x20, 0x27, 0x06, 0x21, 0x20, - 0x11, 0x35, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x10, 0x21, 0x22, - 0x06, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x03, 0x5b, 0x9a, 0x94, - 0x75, 0x8d, 0x19, 0x9e, 0x61, 0x01, 0x58, 0x01, 0x12, 0x7a, 0x7c, 0x01, - 0x15, 0xee, 0xfb, 0xfe, 0xf1, 0xfe, 0xe7, 0x75, 0x7e, 0xfe, 0xfc, 0xfe, - 0x23, 0x03, 0xc1, 0x8a, 0x9f, 0xa2, 0x93, 0xfe, 0xd6, 0xa4, 0x90, 0xfc, - 0xf9, 0x0f, 0x90, 0x87, 0x83, 0x99, 0x06, 0x02, 0x43, 0xba, 0xca, 0x5e, - 0x48, 0x2d, 0x01, 0x00, 0xb7, 0xb7, 0xfe, 0xdf, 0xfe, 0xef, 0xfe, 0xe9, - 0xfe, 0xe7, 0xb1, 0xb1, 0x02, 0x3f, 0x18, 0x27, 0xdb, 0xd0, 0xd5, 0xd6, - 0x01, 0xad, 0xd0, 0xfe, 0xc0, 0xab, 0x9d, 0xaf, 0x99, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x43, 0xff, 0xec, 0x03, 0x64, 0x04, 0x3a, 0x00, 0x1a, - 0x00, 0x25, 0x00, 0x45, 0x40, 0x21, 0x10, 0x03, 0x00, 0x15, 0x14, 0x14, - 0x20, 0x0d, 0x1a, 0x00, 0x00, 0x1b, 0x07, 0x0d, 0x07, 0x26, 0x27, 0x04, - 0x10, 0x1d, 0x40, 0x18, 0x18, 0x0a, 0x1a, 0x14, 0x0f, 0x0a, 0x23, 0x51, - 0x59, 0x0a, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x1a, 0xcd, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x01, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x2e, 0x01, 0x35, 0x33, 0x14, - 0x16, 0x33, 0x32, 0x11, 0x13, 0x10, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x03, 0x4d, 0x8d, 0x79, 0x84, 0x99, 0xd0, 0xc0, 0xc1, - 0xd0, 0xa1, 0x78, 0x79, 0x8b, 0xb8, 0x66, 0x5c, 0xc0, 0x21, 0xe2, 0x6c, - 0x72, 0x74, 0x6e, 0x6d, 0x71, 0x04, 0x3a, 0x83, 0xb8, 0x18, 0x04, 0x16, - 0xc1, 0x8d, 0xc3, 0xd0, 0xd2, 0xbf, 0x8d, 0xc3, 0x14, 0x04, 0x1d, 0xb7, - 0x81, 0x7f, 0x88, 0x01, 0x07, 0xfd, 0x43, 0x01, 0x0c, 0x89, 0x83, 0x82, - 0x8c, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x02, 0x1e, 0x04, 0x1d, - 0x04, 0x4e, 0x00, 0x0c, 0x00, 0x26, 0x40, 0x11, 0x06, 0x07, 0x00, 0x0c, - 0x07, 0x0c, 0x0d, 0x0e, 0x00, 0x07, 0x09, 0x09, 0x03, 0x50, 0x59, 0x09, - 0x10, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x32, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x23, 0x10, 0x21, 0x32, 0x12, 0x11, 0x03, 0x60, 0x85, - 0x9d, 0x9e, 0x8d, 0xbd, 0x01, 0xe5, 0xf8, 0xea, 0x02, 0x1e, 0xe0, 0xcb, - 0xcf, 0xdc, 0x02, 0x30, 0xfe, 0xef, 0xfe, 0xe1, 0x00, 0x01, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x02, 0x1e, 0x00, 0x0d, 0x00, 0x26, 0x40, 0x11, - 0x00, 0x0d, 0x06, 0x07, 0x0d, 0x07, 0x0e, 0x0f, 0x06, 0x0d, 0x0a, 0x0a, - 0x03, 0x50, 0x59, 0x0a, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc4, - 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x10, 0x02, 0x23, 0x22, - 0x02, 0x11, 0x01, 0x13, 0x8b, 0x95, 0xa2, 0x8b, 0xbd, 0xfa, 0xee, 0xed, - 0xf2, 0x02, 0x1e, 0xd6, 0xd7, 0xd0, 0xdd, 0xfe, 0xe4, 0xfe, 0xea, 0x01, - 0x21, 0x01, 0x11, 0x00, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xec, - 0x04, 0x3a, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x34, 0x40, 0x1a, 0x0c, 0x00, - 0x00, 0x01, 0x10, 0x06, 0x01, 0x06, 0x14, 0x15, 0x0c, 0x0a, 0x50, 0x59, - 0x0c, 0x0c, 0x01, 0x02, 0x02, 0x0b, 0x50, 0x59, 0x02, 0x0f, 0x01, 0x15, - 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x19, - 0x01, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x42, 0xb4, 0x01, - 0xce, 0xb2, 0xde, 0xd8, 0xb8, 0xfe, 0xe6, 0x01, 0x0e, 0x69, 0x76, 0x75, - 0x6a, 0x04, 0x3a, 0xb3, 0x94, 0x9c, 0xb4, 0x02, 0x0e, 0xfe, 0x7a, 0x65, - 0x60, 0x5e, 0x63, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x03, 0xc7, - 0x04, 0x3a, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x49, 0x40, 0x24, 0x03, 0x00, - 0x05, 0x15, 0x15, 0x0b, 0x0b, 0x0a, 0x01, 0x02, 0x02, 0x11, 0x05, 0x0a, - 0x05, 0x17, 0x16, 0x03, 0x00, 0x14, 0x00, 0x51, 0x59, 0x14, 0x14, 0x02, - 0x08, 0x08, 0x0e, 0x51, 0x59, 0x08, 0x0f, 0x0b, 0x02, 0x15, 0x00, 0x3f, - 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x09, 0x01, 0x23, - 0x01, 0x26, 0x11, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x19, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x02, 0x17, 0xfe, 0xc5, 0xcb, - 0x01, 0x58, 0xf9, 0xd8, 0xcf, 0x01, 0xb0, 0xb4, 0xea, 0x82, 0x78, 0x6b, - 0x7c, 0xfd, 0x01, 0xca, 0xfe, 0x36, 0x01, 0xd7, 0x33, 0x01, 0x05, 0x95, - 0x96, 0xfb, 0xc6, 0x01, 0xca, 0x01, 0xf1, 0x5c, 0x5d, 0x5e, 0x5d, 0x00, - 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x03, 0xc7, 0x04, 0x3a, 0x00, 0x0c, - 0x00, 0x15, 0x00, 0x44, 0x40, 0x22, 0x09, 0x0c, 0x0a, 0x00, 0x00, 0x15, - 0x15, 0x03, 0x0b, 0x0a, 0x0a, 0x11, 0x07, 0x03, 0x07, 0x17, 0x16, 0x0c, - 0x0e, 0x51, 0x59, 0x09, 0x0c, 0x0c, 0x04, 0x01, 0x0a, 0x0f, 0x04, 0x14, - 0x51, 0x59, 0x04, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, - 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x01, 0x11, 0x33, 0x11, 0x21, 0x22, 0x26, 0x35, 0x10, 0x37, 0x01, 0x33, - 0x01, 0x17, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x03, 0x13, - 0xb4, 0xfe, 0x50, 0xcf, 0xd8, 0xf9, 0xfe, 0xa8, 0xcb, 0x01, 0x3b, 0xfc, - 0xfd, 0x7c, 0x6b, 0x78, 0x82, 0xea, 0x02, 0x70, 0x01, 0xca, 0xfb, 0xc6, - 0x96, 0x95, 0x01, 0x05, 0x33, 0x01, 0xd7, 0xfe, 0x36, 0x7d, 0x5d, 0x5e, - 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x03, 0x87, - 0x04, 0x3a, 0x00, 0x07, 0x00, 0x3b, 0x40, 0x22, 0x04, 0x05, 0x01, 0x05, - 0x00, 0x03, 0x08, 0x09, 0x80, 0x09, 0x01, 0x3f, 0x09, 0x01, 0x10, 0x09, - 0x20, 0x09, 0x02, 0x0f, 0x09, 0x01, 0x0b, 0x03, 0x05, 0x15, 0x03, 0x07, - 0x00, 0x07, 0x51, 0x59, 0x00, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, - 0x21, 0x23, 0x03, 0x64, 0xfe, 0xa8, 0xb4, 0xfe, 0xa8, 0x04, 0x3a, 0x83, - 0xfc, 0x49, 0x03, 0xb7, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x04, 0x3a, 0x12, 0x06, 0x03, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, - 0x00, 0x58, 0x04, 0x92, 0x03, 0xbe, 0x00, 0x1a, 0x00, 0x2a, 0x40, 0x12, - 0x09, 0x00, 0x12, 0x13, 0x13, 0x05, 0x05, 0x0e, 0x16, 0x00, 0x16, 0x1b, - 0x1c, 0x00, 0x1a, 0x12, 0x09, 0x0a, 0x00, 0x2f, 0xcd, 0x32, 0x2f, 0xcd, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, - 0x23, 0x21, 0x35, 0x21, 0x32, 0x37, 0x15, 0x0e, 0x02, 0x07, 0x15, 0x1e, - 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x44, 0x02, 0xae, 0x6b, 0x76, 0x34, - 0xb2, 0x9e, 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, - 0x70, 0x5d, 0xb1, 0xcc, 0xfd, 0x2f, 0x01, 0x0d, 0x2a, 0x5c, 0x59, 0x82, - 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, - 0xb2, 0xa5, 0x00, 0x00, 0x00, 0x03, 0x00, 0x45, 0x00, 0x58, 0x05, 0xaa, - 0x03, 0xbe, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x48, 0x40, 0x22, - 0x12, 0x13, 0x13, 0x05, 0x05, 0x0e, 0x16, 0x09, 0x1a, 0x21, 0x1d, 0x1d, - 0x22, 0x1e, 0x1e, 0x1a, 0x16, 0x03, 0x24, 0x23, 0x22, 0x1f, 0x1b, 0x1e, - 0x1f, 0x1e, 0x1f, 0x1e, 0x0a, 0x00, 0x1a, 0x12, 0x09, 0x0a, 0x00, 0x2f, - 0xcd, 0x32, 0x2f, 0xcd, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xcd, 0x10, - 0xcd, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, - 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x37, - 0x15, 0x0e, 0x02, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, - 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x01, 0x5c, 0x02, 0xae, - 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, - 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0xfd, 0x2f, 0xfe, 0xe9, 0xb8, - 0xb8, 0xb8, 0xb8, 0x01, 0x0d, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0xb4, 0x06, - 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x01, - 0x3e, 0xa3, 0x02, 0x2d, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, - 0xff, 0x59, 0x04, 0x8d, 0x04, 0xf4, 0x00, 0x29, 0x00, 0x3c, 0x40, 0x1b, - 0x11, 0x18, 0x09, 0x0c, 0x09, 0x00, 0x21, 0x04, 0x15, 0x15, 0x0c, 0x25, - 0x1c, 0x21, 0x1c, 0x2a, 0x2b, 0x29, 0x18, 0x00, 0x00, 0x09, 0x21, 0x20, - 0x11, 0x08, 0x09, 0x00, 0x2f, 0xcd, 0x32, 0x2f, 0xcd, 0x12, 0x39, 0x2f, - 0x33, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x21, - 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x37, 0x15, - 0x0e, 0x02, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, - 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x21, 0x3f, 0x02, 0xae, 0x9d, 0x78, 0xb0, 0xa0, 0xfd, 0x8d, - 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, - 0x6d, 0x60, 0xb2, 0xcb, 0xfd, 0x2f, 0x02, 0xae, 0x9d, 0x78, 0xaf, 0xa1, - 0xfd, 0x8d, 0x02, 0x7c, 0x56, 0x70, 0x73, 0x86, 0xb3, 0x06, 0xaa, 0x01, - 0x02, 0x03, 0x02, 0x03, 0x3a, 0x96, 0x6c, 0x7b, 0x8f, 0x1c, 0x03, 0x38, - 0x9f, 0x71, 0xa4, 0x95, 0xb2, 0x56, 0x70, 0x76, 0x83, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x03, 0xf9, 0x04, 0x3a, 0x12, 0x06, - 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x05, 0xcc, - 0x04, 0x3a, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, - 0x00, 0x00, 0x03, 0x9a, 0x04, 0x3a, 0x12, 0x06, 0x00, 0x5d, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x31, 0xff, 0xec, 0x03, 0x5e, 0x04, 0x3a, 0x00, 0x19, - 0x00, 0x52, 0x40, 0x29, 0x0e, 0x14, 0x11, 0x0f, 0x13, 0x13, 0x09, 0x17, - 0x11, 0x04, 0x03, 0x17, 0x03, 0x1b, 0x1a, 0x0e, 0x14, 0x14, 0x0c, 0x51, - 0x59, 0x14, 0x14, 0x11, 0x00, 0x13, 0x10, 0x11, 0x10, 0x50, 0x59, 0x11, - 0x0f, 0x00, 0x06, 0x50, 0x59, 0x04, 0x04, 0x00, 0x16, 0x00, 0x3f, 0x32, - 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, - 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x05, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x1e, 0x01, 0x15, - 0x14, 0x06, 0x01, 0xca, 0xa7, 0xc5, 0x2d, 0x9f, 0x35, 0xc9, 0x60, 0x79, - 0x89, 0x9a, 0x30, 0x01, 0x36, 0xfd, 0xe7, 0x02, 0xe9, 0xfe, 0xa7, 0xa8, - 0xb5, 0xd7, 0x14, 0x7d, 0x81, 0x2c, 0xa4, 0x64, 0x5a, 0x6b, 0x62, 0x89, - 0x01, 0x29, 0x8b, 0x87, 0xfe, 0xc2, 0x03, 0xab, 0x97, 0x98, 0xac, 0x00, - 0x00, 0x01, 0x00, 0x41, 0xff, 0xeb, 0x03, 0x2b, 0x04, 0x4c, 0x00, 0x27, - 0x00, 0x64, 0x40, 0x35, 0x1d, 0x1e, 0x1e, 0x04, 0x10, 0x00, 0x13, 0x09, - 0x0a, 0x0a, 0x18, 0x24, 0x24, 0x13, 0x10, 0x03, 0x28, 0x29, 0x27, 0x01, - 0x51, 0x59, 0x14, 0x13, 0x51, 0x59, 0x04, 0x0d, 0x27, 0x18, 0x14, 0x21, - 0x27, 0x14, 0x27, 0x14, 0x0d, 0x1d, 0x21, 0x21, 0x1b, 0x50, 0x59, 0x21, - 0x10, 0x09, 0x0d, 0x0d, 0x07, 0x50, 0x59, 0x0d, 0x16, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x12, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x2b, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x37, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, - 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x02, 0x10, - 0x3b, 0x78, 0x67, 0x62, 0x54, 0xa0, 0x35, 0xaa, 0x1f, 0xcb, 0x97, 0xa7, - 0xc2, 0x9a, 0x81, 0x3b, 0x78, 0x67, 0x62, 0x54, 0xa0, 0x35, 0xaa, 0x1f, - 0xcb, 0x97, 0xa7, 0xc2, 0x9a, 0x81, 0x01, 0xac, 0x50, 0x51, 0x40, 0x56, - 0xab, 0x14, 0x8e, 0x93, 0x96, 0x87, 0x74, 0x8d, 0x06, 0x7c, 0x50, 0x51, - 0x40, 0x56, 0xab, 0x14, 0x8e, 0x93, 0x97, 0x86, 0x74, 0x8d, 0x06, 0x00, - 0x00, 0x01, 0x00, 0x29, 0xff, 0xec, 0x04, 0xb5, 0x04, 0x4d, 0x00, 0x2b, - 0x00, 0x44, 0x40, 0x24, 0x19, 0x28, 0x0b, 0x03, 0x0f, 0x15, 0x15, 0x21, - 0x0f, 0x03, 0x21, 0x03, 0x2d, 0x2c, 0x28, 0x19, 0x0b, 0x03, 0x12, 0x20, - 0x24, 0x24, 0x1d, 0x50, 0x59, 0x24, 0x16, 0x12, 0x10, 0x00, 0x07, 0x50, - 0x59, 0x04, 0x00, 0x16, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x05, 0x22, - 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x27, 0x2e, - 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, - 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x2f, 0x01, 0x07, 0x0e, 0x01, 0x01, 0x2d, 0x57, 0x75, 0x38, 0x58, - 0x21, 0x5a, 0x2d, 0x22, 0x47, 0x19, 0x5d, 0x91, 0x4a, 0x3a, 0xc3, 0xb9, - 0xb8, 0xc4, 0x3a, 0x4a, 0x91, 0x5d, 0x19, 0x47, 0x22, 0x2d, 0x5a, 0x21, - 0x58, 0x39, 0x73, 0x58, 0x57, 0x7a, 0x3a, 0x37, 0x37, 0x39, 0x79, 0x14, - 0x37, 0x3f, 0x73, 0x27, 0x34, 0x22, 0x23, 0x83, 0xb2, 0x5b, 0x88, 0x43, - 0x92, 0xa1, 0x9f, 0x93, 0x43, 0x8a, 0x5a, 0xb2, 0x83, 0x23, 0x22, 0x34, - 0x27, 0x73, 0x3f, 0x37, 0x47, 0x5b, 0x55, 0x55, 0x5a, 0x48, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8e, 0x00, 0x00, 0x02, 0xaf, 0x04, 0x3a, 0x00, 0x05, - 0x00, 0x1d, 0x40, 0x0e, 0x03, 0x04, 0x04, 0x00, 0x06, 0x07, 0x05, 0x02, - 0x51, 0x59, 0x05, 0x0f, 0x04, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x21, 0x11, 0x23, - 0x11, 0x02, 0xaf, 0xfe, 0x93, 0xb4, 0x04, 0x3a, 0x83, 0xfc, 0x49, 0x04, - 0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x03, 0xf9, - 0x04, 0x3a, 0x12, 0x06, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0x00, 0x00, 0x03, 0xc7, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x43, 0x40, 0x2b, - 0x02, 0x01, 0x05, 0x06, 0x01, 0x06, 0x09, 0x08, 0xa0, 0x09, 0xb0, 0x09, - 0xc0, 0x09, 0x03, 0xa0, 0x09, 0xe0, 0x09, 0x02, 0x60, 0x09, 0x90, 0x09, - 0xa0, 0x09, 0xb0, 0x09, 0x04, 0x0f, 0x09, 0x01, 0x0a, 0x03, 0x07, 0x04, - 0x51, 0x59, 0x07, 0x0f, 0x02, 0x06, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x2b, - 0x01, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, - 0x11, 0x03, 0xc7, 0xb4, 0xfe, 0x2f, 0xb4, 0x04, 0x3a, 0xfb, 0xc6, 0x03, - 0xb7, 0xfc, 0x49, 0x04, 0x3a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0x00, 0x00, 0x03, 0xec, 0x04, 0x3a, 0x12, 0x06, 0x05, 0x38, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7e, 0x00, 0x00, 0x05, 0x36, 0x04, 0x3a, 0x00, 0x19, - 0x00, 0x40, 0x40, 0x21, 0x08, 0x05, 0x0e, 0x19, 0x19, 0x0b, 0x00, 0x11, - 0x14, 0x14, 0x00, 0x05, 0x03, 0x1a, 0x1b, 0x18, 0x01, 0x0b, 0x01, 0x50, - 0x59, 0x0e, 0x2f, 0x0b, 0x01, 0x0b, 0x0b, 0x12, 0x0c, 0x06, 0x0f, 0x00, - 0x15, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x39, 0x2f, 0x5d, 0x33, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x22, 0x2e, 0x01, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x11, 0x33, 0x11, 0x32, 0x36, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x0e, 0x01, 0x23, 0x11, 0x02, 0x81, 0x97, 0xed, - 0x7f, 0xad, 0xb2, 0xa4, 0xb1, 0xa5, 0xb2, 0xad, 0x7c, 0xec, 0x9c, 0x01, - 0x36, 0x6c, 0xbe, 0x77, 0x01, 0x63, 0xfe, 0xcc, 0x9b, 0xb0, 0x02, 0x7f, - 0xfd, 0x81, 0xab, 0xa0, 0x01, 0x34, 0xfe, 0x9d, 0x79, 0xbe, 0x6a, 0xfe, - 0xca, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0xff, 0xec, 0x04, 0x1d, - 0x04, 0x3a, 0x00, 0x13, 0x00, 0x52, 0x40, 0x37, 0x02, 0x11, 0x00, 0x13, - 0x13, 0x11, 0x09, 0x03, 0x14, 0x15, 0x70, 0x15, 0x80, 0x15, 0x90, 0x15, - 0x03, 0x70, 0x15, 0xb0, 0x15, 0x02, 0x00, 0x15, 0x20, 0x15, 0x30, 0x15, - 0x60, 0x15, 0x70, 0x15, 0x80, 0x15, 0x06, 0x0d, 0x03, 0x11, 0x02, 0x51, - 0x59, 0x11, 0x0f, 0x07, 0x0c, 0x50, 0x59, 0x07, 0x0a, 0x50, 0x59, 0x07, - 0x16, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x01, 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x21, 0x0a, 0x01, 0x0e, 0x01, 0x23, - 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x12, 0x1b, 0x01, 0x21, 0x11, - 0x03, 0x68, 0xfe, 0x89, 0x3b, 0x40, 0x4a, 0x6d, 0x56, 0x32, 0x2c, 0x19, - 0x2b, 0x37, 0x43, 0x37, 0x23, 0x2c, 0x02, 0xce, 0x03, 0xb7, 0xfe, 0x4c, - 0xfe, 0xcf, 0x9c, 0x4a, 0x0d, 0x81, 0x09, 0x6e, 0x01, 0x0e, 0x01, 0x08, - 0x01, 0x45, 0xfb, 0xc6, 0x00, 0x02, 0xff, 0xfc, 0x01, 0xea, 0x03, 0xa2, - 0x05, 0xcc, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x35, 0x40, 0x1b, 0x0b, 0x0c, - 0x04, 0x00, 0x07, 0x07, 0x10, 0x03, 0x04, 0x04, 0x0f, 0x0b, 0x02, 0xe5, - 0x59, 0x3f, 0x0b, 0x01, 0x0b, 0x0b, 0x04, 0x08, 0x05, 0xe6, 0x00, 0x04, - 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x5d, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x01, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x09, 0x01, 0x0e, 0x01, - 0x03, 0x21, 0x03, 0x26, 0x03, 0x12, 0x6d, 0xfe, 0x58, 0x6f, 0x92, 0x01, - 0x88, 0x9c, 0x01, 0x82, 0xfe, 0x2f, 0x0b, 0x1f, 0x80, 0x01, 0x56, 0x7b, - 0x21, 0x01, 0xea, 0x01, 0x21, 0xfe, 0xdf, 0x03, 0xe2, 0xfc, 0x1e, 0x03, - 0x65, 0x22, 0x5c, 0xfe, 0xa9, 0x01, 0x41, 0x52, 0x00, 0x02, 0x00, 0x0b, - 0x01, 0xea, 0x05, 0x36, 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x6b, - 0x40, 0x3b, 0x0b, 0x07, 0x0e, 0x14, 0x02, 0x15, 0x04, 0x15, 0x00, 0x09, - 0x0d, 0x0d, 0x00, 0x03, 0x04, 0x04, 0x00, 0x0e, 0x03, 0x17, 0x16, 0x14, - 0x02, 0xe5, 0x59, 0x09, 0x0c, 0xe5, 0x59, 0x0f, 0x14, 0x01, 0x0f, 0x09, - 0x01, 0x0c, 0x03, 0x14, 0x09, 0x14, 0x09, 0x00, 0x05, 0x10, 0x08, 0x05, - 0x08, 0xe5, 0x59, 0x05, 0xe6, 0x04, 0xe8, 0x00, 0x0d, 0xe5, 0x59, 0x00, - 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x21, 0x03, 0x23, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, - 0x11, 0x21, 0x15, 0x01, 0x23, 0x0f, 0x01, 0x03, 0x21, 0x02, 0x8b, 0xfe, - 0x98, 0x86, 0x92, 0x01, 0xd3, 0x03, 0x3d, 0xfd, 0xfd, 0x01, 0xda, 0xfe, - 0x26, 0x02, 0x1e, 0xfd, 0x55, 0x5a, 0x2f, 0x18, 0x95, 0x01, 0x36, 0x01, - 0xea, 0x01, 0x21, 0xfe, 0xdf, 0x03, 0xe2, 0x74, 0xfe, 0xca, 0x72, 0xfe, - 0xae, 0x74, 0x03, 0x75, 0x67, 0x37, 0xfe, 0xb9, 0x00, 0x03, 0x00, 0x35, - 0x01, 0xea, 0x03, 0x1e, 0x05, 0xcc, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x1d, - 0x00, 0x50, 0x40, 0x29, 0x13, 0x1a, 0x1a, 0x04, 0x0e, 0x08, 0x08, 0x16, - 0x00, 0x04, 0x00, 0x1e, 0x1f, 0x0b, 0x13, 0x19, 0x13, 0x19, 0xe5, 0x59, - 0x0f, 0x13, 0x01, 0x0c, 0x03, 0x13, 0x13, 0x04, 0x05, 0x05, 0x12, 0xe5, - 0x59, 0x05, 0xe6, 0x04, 0x1a, 0xe5, 0x59, 0x04, 0xe8, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x06, 0x23, 0x21, 0x11, 0x21, 0x20, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, - 0x03, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x13, 0x34, 0x2b, 0x01, - 0x11, 0x33, 0x32, 0x36, 0x03, 0x1e, 0xbb, 0xa9, 0xfe, 0x7b, 0x01, 0x5b, - 0x01, 0x56, 0x55, 0x55, 0x6f, 0x73, 0xc5, 0x68, 0x61, 0xce, 0xce, 0xc9, - 0x37, 0xe8, 0xe6, 0xf1, 0x72, 0x6b, 0x03, 0x04, 0x84, 0x96, 0x03, 0xe2, - 0xf3, 0x4f, 0x7b, 0x18, 0x11, 0x83, 0x01, 0x66, 0x4f, 0x42, 0xfe, 0xce, - 0xfe, 0xe6, 0xac, 0xfe, 0xa2, 0x58, 0x00, 0x00, 0x00, 0x03, 0xff, 0xdc, - 0x01, 0xea, 0x03, 0x61, 0x05, 0xcc, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x22, - 0x00, 0x58, 0x40, 0x2c, 0x0a, 0x07, 0x05, 0x20, 0x20, 0x17, 0x17, 0x12, - 0x01, 0x10, 0x1b, 0x05, 0x05, 0x13, 0x0c, 0x10, 0x0c, 0x23, 0x24, 0x16, - 0x0a, 0x12, 0x00, 0x12, 0xe5, 0x59, 0x20, 0x07, 0x00, 0x00, 0x10, 0x02, - 0x10, 0x17, 0xe5, 0x59, 0x10, 0xe8, 0x02, 0x1f, 0xe5, 0x59, 0x02, 0xe6, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x03, 0x33, 0x11, 0x21, 0x20, 0x15, - 0x14, 0x07, 0x33, 0x15, 0x23, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, - 0x23, 0x05, 0x34, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x03, 0x34, 0x26, - 0x2b, 0x01, 0x11, 0x33, 0x32, 0x24, 0x5e, 0x01, 0x5b, 0x01, 0x56, 0x46, - 0xbc, 0x8a, 0x4c, 0xbb, 0xa9, 0xfe, 0x7b, 0x5e, 0x02, 0xb8, 0xe7, 0xe6, - 0xf1, 0x72, 0x6a, 0x36, 0x68, 0x61, 0xce, 0xce, 0xc9, 0x04, 0x2d, 0x01, - 0x9f, 0xf3, 0x6a, 0x42, 0x78, 0x44, 0x6d, 0x84, 0x96, 0x01, 0xcb, 0xa7, - 0xac, 0xfe, 0xa2, 0x58, 0x02, 0x15, 0x4f, 0x42, 0xfe, 0xce, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x32, 0x01, 0xea, 0x03, 0x6e, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x12, 0x00, 0x28, 0x40, 0x14, 0x0f, 0x05, 0x0a, 0x00, 0x05, 0x00, - 0x13, 0x14, 0x06, 0x0e, 0xe5, 0x59, 0x06, 0xe6, 0x05, 0x0f, 0xe5, 0x59, - 0x05, 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x01, - 0x23, 0x21, 0x11, 0x21, 0x32, 0x04, 0x07, 0x34, 0x26, 0x2b, 0x01, 0x11, - 0x33, 0x32, 0x36, 0x03, 0x6e, 0x74, 0xd8, 0x8a, 0xfe, 0x9a, 0x01, 0x3c, - 0xf7, 0x01, 0x09, 0x8e, 0xbf, 0xb6, 0xac, 0xc9, 0xa0, 0xb8, 0x03, 0xe5, - 0x9a, 0xe7, 0x7a, 0x03, 0xe2, 0xfd, 0xea, 0xb6, 0xbf, 0xfd, 0x02, 0xd3, - 0x00, 0x01, 0x00, 0x31, 0x01, 0xea, 0x03, 0x27, 0x05, 0xcc, 0x00, 0x0b, - 0x00, 0x45, 0x40, 0x24, 0x05, 0x09, 0x09, 0x00, 0x07, 0x03, 0x0a, 0x00, - 0x0a, 0x0c, 0x0d, 0x05, 0x08, 0xe5, 0x59, 0x0f, 0x05, 0x01, 0x0c, 0x03, - 0x05, 0x05, 0x00, 0x01, 0x01, 0x04, 0xe5, 0x59, 0x01, 0xe6, 0x00, 0x09, - 0xe5, 0x59, 0x00, 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x31, - 0x02, 0xda, 0xfd, 0xb3, 0x02, 0x25, 0xfd, 0xdb, 0x02, 0x69, 0x01, 0xea, - 0x03, 0xe2, 0x74, 0xfe, 0xca, 0x72, 0xfe, 0xae, 0x74, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x20, 0x01, 0xea, 0x03, 0x16, 0x05, 0xcc, 0x00, 0x0b, - 0x00, 0x45, 0x40, 0x24, 0x06, 0x02, 0x02, 0x0b, 0x08, 0x04, 0x00, 0x0b, - 0x00, 0x0d, 0x0c, 0x05, 0x04, 0xe5, 0x59, 0x0f, 0x05, 0x01, 0x0c, 0x03, - 0x05, 0x05, 0x00, 0x09, 0x09, 0x08, 0xe5, 0x59, 0x09, 0xe6, 0x00, 0x01, - 0xe5, 0x59, 0x00, 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, - 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x20, - 0x02, 0x69, 0xfd, 0xdb, 0x02, 0x25, 0xfd, 0xb3, 0x02, 0xda, 0x01, 0xea, - 0x74, 0x01, 0x52, 0x72, 0x01, 0x36, 0x74, 0xfc, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x30, 0x01, 0xdc, 0x03, 0xc4, 0x05, 0xdb, 0x00, 0x1d, - 0x00, 0x43, 0x40, 0x23, 0x0d, 0x00, 0x07, 0x06, 0x06, 0x13, 0x18, 0x18, - 0x15, 0x00, 0x03, 0x1e, 0x1f, 0x16, 0x15, 0xe5, 0x59, 0x16, 0x07, 0x16, - 0x07, 0x1b, 0x03, 0x1b, 0x10, 0xe5, 0x59, 0x1b, 0xe9, 0x03, 0x0a, 0xe5, - 0x59, 0x03, 0xe7, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x12, - 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, - 0x23, 0x22, 0x00, 0x30, 0xfb, 0xe5, 0xa3, 0xc9, 0x34, 0x84, 0x29, 0x8d, - 0x6a, 0xa1, 0xac, 0xb6, 0xa1, 0x58, 0x9f, 0x35, 0xfe, 0xe2, 0x01, 0xa0, - 0x48, 0xe1, 0x85, 0xe5, 0xfe, 0xff, 0x03, 0xe0, 0xf2, 0x01, 0x09, 0x73, - 0x7b, 0x29, 0x54, 0x4f, 0xcc, 0xbb, 0xb9, 0xd8, 0x37, 0x33, 0xaf, 0x77, - 0xfe, 0xa7, 0x4e, 0x5c, 0x01, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, - 0x01, 0xea, 0x03, 0x41, 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x33, 0x40, 0x19, - 0x08, 0x00, 0x00, 0x0b, 0x07, 0x03, 0x03, 0x04, 0x0b, 0x04, 0x0d, 0x0c, - 0x07, 0x02, 0xe5, 0x59, 0x07, 0x07, 0x04, 0x09, 0x05, 0xe6, 0x00, 0x04, - 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, - 0x11, 0x02, 0xb2, 0xfe, 0x09, 0x8d, 0x8d, 0x01, 0xf7, 0x8f, 0x01, 0xea, - 0x01, 0xca, 0xfe, 0x36, 0x03, 0xe2, 0xfe, 0x5e, 0x01, 0xa2, 0xfc, 0x1e, - 0x00, 0x01, 0x00, 0x63, 0x01, 0xea, 0x00, 0xf1, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x16, 0x40, 0x09, 0x01, 0x00, 0x00, 0x04, 0x05, 0x02, 0xe6, 0x01, - 0xe8, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x23, 0x11, 0x33, 0xf1, 0x8e, 0x8e, 0x01, 0xea, 0x03, 0xe2, 0x00, - 0x00, 0x01, 0x00, 0x11, 0x01, 0xdc, 0x02, 0x56, 0x05, 0xcc, 0x00, 0x10, - 0x00, 0x34, 0x40, 0x1a, 0x09, 0x0e, 0x03, 0x02, 0x02, 0x0c, 0x0e, 0x03, - 0x12, 0x11, 0x03, 0x03, 0x00, 0x0c, 0x0c, 0x0b, 0xe5, 0x59, 0x0c, 0xe6, - 0x00, 0x06, 0xe5, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x03, 0x37, 0x1e, 0x01, - 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x21, 0x11, 0x14, 0x06, 0x01, - 0x37, 0xf6, 0x30, 0x8a, 0x0d, 0x52, 0x3e, 0x43, 0x4e, 0xb7, 0x01, 0x44, - 0x98, 0x01, 0xdc, 0x01, 0x09, 0x18, 0x54, 0x5a, 0x62, 0x60, 0x02, 0x47, - 0x74, 0xfd, 0x48, 0x90, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, - 0x01, 0xea, 0x03, 0x5b, 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x3e, 0x40, 0x1e, - 0x01, 0x0a, 0x07, 0x09, 0x07, 0x03, 0x03, 0x04, 0x08, 0x09, 0x09, 0x00, - 0x0b, 0x04, 0x0b, 0x0c, 0x0d, 0x02, 0x07, 0x0a, 0x07, 0x01, 0x03, 0x04, - 0x08, 0x05, 0xe6, 0x00, 0x04, 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x09, 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, - 0x02, 0xae, 0xfe, 0x86, 0x76, 0x8d, 0x8d, 0x01, 0xc3, 0xa4, 0xfe, 0x67, - 0x01, 0xcf, 0x01, 0xea, 0x01, 0xda, 0x5d, 0xfe, 0x83, 0x03, 0xe2, 0xfe, - 0x1a, 0x01, 0xe6, 0xfe, 0x50, 0xfd, 0xce, 0x00, 0x00, 0x01, 0x00, 0x2d, - 0x01, 0xea, 0x02, 0x9c, 0x05, 0xcc, 0x00, 0x05, 0x00, 0x1f, 0x40, 0x0e, - 0x03, 0x00, 0x00, 0x04, 0x06, 0x07, 0x01, 0xe6, 0x00, 0x03, 0xe5, 0x59, - 0x00, 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x21, 0x15, 0x2d, - 0x8d, 0x01, 0xe2, 0x01, 0xea, 0x03, 0xe2, 0xfc, 0x92, 0x74, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x34, 0x01, 0xea, 0x03, 0xdf, 0x05, 0xcc, 0x00, 0x17, - 0x00, 0x35, 0x40, 0x1b, 0x0f, 0x0c, 0x0c, 0x0d, 0x15, 0x00, 0x00, 0x17, - 0x17, 0x12, 0x0d, 0x03, 0x18, 0x19, 0x15, 0xe6, 0x03, 0x0a, 0x12, 0x03, - 0x0d, 0x0e, 0xe6, 0x07, 0x00, 0x0d, 0xe8, 0x00, 0x3f, 0x33, 0x33, 0x3f, - 0x12, 0x17, 0x39, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x34, 0x37, 0x0e, - 0x01, 0x03, 0x23, 0x03, 0x26, 0x27, 0x17, 0x11, 0x23, 0x11, 0x33, 0x01, - 0x16, 0x17, 0x3f, 0x01, 0x13, 0x33, 0x11, 0x03, 0x5f, 0x03, 0x04, 0x21, - 0xff, 0x64, 0xfb, 0x1e, 0x11, 0x03, 0x7f, 0xb5, 0x00, 0xff, 0x09, 0x1c, - 0x09, 0x1e, 0xfb, 0xb0, 0x01, 0xea, 0x02, 0x97, 0x7a, 0x24, 0x15, 0x67, - 0xfd, 0x47, 0x02, 0xa4, 0x4d, 0x44, 0x9e, 0xfd, 0x69, 0x03, 0xe2, 0xfd, - 0x52, 0x18, 0x6a, 0x21, 0x61, 0x02, 0xae, 0xfc, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2e, 0x01, 0xea, 0x03, 0x41, 0x05, 0xcc, 0x00, 0x0c, - 0x00, 0x2e, 0x40, 0x15, 0x06, 0x03, 0x03, 0x04, 0x00, 0x09, 0x09, 0x0c, - 0x04, 0x0c, 0x0d, 0x0e, 0x07, 0x01, 0x04, 0x0a, 0x05, 0xe6, 0x00, 0x04, - 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x09, 0x01, 0x17, 0x11, 0x23, 0x11, 0x33, 0x01, 0x26, 0x35, 0x11, 0x33, - 0x11, 0x02, 0x9b, 0xfe, 0x0d, 0x05, 0x7f, 0xa0, 0x01, 0xf8, 0x06, 0x81, - 0x01, 0xea, 0x03, 0x36, 0xa2, 0xfd, 0x6c, 0x03, 0xe2, 0xfc, 0xc5, 0x54, - 0x5c, 0x02, 0x8b, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, - 0x01, 0xea, 0x03, 0x41, 0x05, 0xcc, 0x00, 0x0d, 0x00, 0x2c, 0x40, 0x14, - 0x0d, 0x03, 0x03, 0x00, 0x06, 0x09, 0x09, 0x08, 0x00, 0x08, 0x0e, 0x0f, - 0x05, 0x0c, 0x06, 0x01, 0xe6, 0x09, 0x00, 0xe8, 0x00, 0x3f, 0x32, 0x3f, - 0x33, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x14, 0x07, - 0x01, 0x33, 0x11, 0x23, 0x11, 0x34, 0x37, 0x01, 0x2e, 0x80, 0x06, 0x01, - 0xf8, 0xa1, 0x80, 0x05, 0xfe, 0x0e, 0x01, 0xea, 0x03, 0xe2, 0xfd, 0x75, - 0x0e, 0xa2, 0x03, 0x3b, 0xfc, 0x1e, 0x02, 0x94, 0x5a, 0x48, 0xfc, 0xca, - 0x00, 0x02, 0x00, 0x2b, 0x01, 0xdc, 0x03, 0xe9, 0x05, 0xdb, 0x00, 0x0b, - 0x00, 0x17, 0x00, 0x28, 0x40, 0x14, 0x12, 0x06, 0x0c, 0x00, 0x06, 0x00, - 0x18, 0x19, 0x09, 0x0f, 0xe5, 0x59, 0x09, 0xe7, 0x03, 0x15, 0xe5, 0x59, - 0x03, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x02, 0x23, - 0x22, 0x02, 0x35, 0x34, 0x12, 0x33, 0x32, 0x00, 0x07, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0xe9, 0xff, 0xe1, - 0xdf, 0xff, 0xfe, 0xe2, 0xdf, 0x00, 0xff, 0x90, 0xb3, 0x9b, 0x9f, 0xb2, - 0xb2, 0x9d, 0xa1, 0xaf, 0x03, 0xe0, 0xee, 0xfe, 0xea, 0x01, 0x12, 0xf2, - 0xef, 0x01, 0x0c, 0xfe, 0xf3, 0xee, 0xba, 0xcd, 0xcc, 0xbb, 0xb9, 0xd8, - 0xd0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x34, 0x01, 0xdd, 0x02, 0xdb, - 0x05, 0xb4, 0x00, 0x19, 0x00, 0x25, 0x00, 0x4a, 0x40, 0x24, 0x13, 0x07, - 0x04, 0x17, 0x16, 0x16, 0x1d, 0x10, 0x03, 0x04, 0x04, 0x23, 0x0a, 0x10, - 0x0a, 0x26, 0x27, 0x13, 0x07, 0x00, 0x1a, 0x00, 0x1a, 0xe4, 0x59, 0x00, - 0x00, 0x0d, 0x03, 0x16, 0x0d, 0x20, 0xe4, 0x59, 0x0d, 0xe9, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x2f, 0x33, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x32, - 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x33, 0x14, 0x16, - 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x01, 0x88, 0x53, 0x62, 0x81, 0x53, 0x47, 0x56, 0x61, 0xa6, 0xaf, 0xad, - 0xa5, 0x60, 0x57, 0x48, 0x52, 0x80, 0x5e, 0x59, 0x63, 0x73, 0x65, 0x71, - 0x71, 0x63, 0x72, 0x04, 0xc4, 0x80, 0x70, 0x6c, 0xa2, 0x1b, 0x1b, 0xa9, - 0x79, 0xbd, 0xb4, 0xb5, 0xbc, 0x7b, 0xa8, 0x1d, 0x17, 0x9d, 0x72, 0x76, - 0x7a, 0x63, 0x94, 0x78, 0x93, 0x85, 0x88, 0x90, 0x78, 0x94, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x2d, 0x01, 0xea, 0x03, 0x1b, 0x05, 0xcc, 0x00, 0x0a, - 0x00, 0x11, 0x00, 0x34, 0x40, 0x1a, 0x0f, 0x05, 0x05, 0x06, 0x0b, 0x00, - 0x06, 0x00, 0x12, 0x13, 0x0f, 0x04, 0xe5, 0x59, 0x0f, 0x0f, 0x06, 0x07, - 0x07, 0x0e, 0xe5, 0x59, 0x07, 0xe6, 0x06, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, - 0x21, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x07, 0x34, 0x2b, 0x01, 0x11, - 0x21, 0x32, 0x03, 0x1b, 0xb4, 0x9a, 0xfe, 0xed, 0x8d, 0x01, 0x98, 0xa6, - 0xb0, 0x8d, 0xd9, 0xfb, 0x01, 0x01, 0xd3, 0x04, 0x9f, 0x8d, 0xa7, 0xfe, - 0x7f, 0x03, 0xe2, 0xa1, 0x8d, 0xbc, 0xfe, 0x81, 0x00, 0x02, 0x00, 0x2d, - 0x01, 0xea, 0x03, 0x72, 0x05, 0xcc, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x51, - 0x40, 0x29, 0x01, 0x0c, 0x12, 0x0d, 0x12, 0x03, 0x03, 0x04, 0x00, 0x0d, - 0x0d, 0x0e, 0x09, 0x04, 0x09, 0x16, 0x17, 0x0c, 0x02, 0x12, 0x02, 0xe5, - 0x59, 0x0f, 0x12, 0x01, 0x0c, 0x03, 0x12, 0x12, 0x04, 0x05, 0x05, 0x11, - 0xe5, 0x59, 0x05, 0xe6, 0x00, 0x04, 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x03, 0x21, - 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x03, - 0x34, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x02, 0xd1, 0xf7, 0xfe, 0xe0, - 0x8d, 0x01, 0xc7, 0xa6, 0xb0, 0x7b, 0x6c, 0x01, 0x0f, 0xb6, 0xd5, 0xfe, - 0xd3, 0x01, 0x33, 0x5f, 0x70, 0x01, 0xea, 0x01, 0x9a, 0xfe, 0x66, 0x03, - 0xe2, 0x98, 0x86, 0x6d, 0x97, 0x15, 0xfe, 0x55, 0x02, 0xc3, 0xad, 0xfe, - 0x9a, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x01, 0xea, 0x03, 0x46, - 0x05, 0xcc, 0x00, 0x07, 0x00, 0x24, 0x40, 0x12, 0x01, 0x02, 0x06, 0x02, - 0x04, 0x03, 0x08, 0x09, 0x00, 0x04, 0x05, 0x04, 0xe5, 0x59, 0x05, 0xe6, - 0x02, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, - 0x21, 0x15, 0x01, 0xfe, 0x8c, 0xfe, 0xb8, 0x03, 0x1c, 0x05, 0x58, 0xfc, - 0x92, 0x03, 0x6e, 0x74, 0x74, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, - 0x01, 0xdc, 0x03, 0x46, 0x05, 0xcc, 0x00, 0x11, 0x00, 0x25, 0x40, 0x11, - 0x06, 0x03, 0x0c, 0x0f, 0x03, 0x0f, 0x12, 0x13, 0x0d, 0x04, 0xe6, 0x00, - 0x09, 0xe5, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x11, 0x33, 0x11, 0x14, 0x06, 0x01, 0xb1, 0xb6, 0xd4, 0x8d, 0x81, 0x7c, - 0x80, 0x88, 0x8d, 0xd8, 0x01, 0xdc, 0xc9, 0xaf, 0x02, 0x78, 0xfd, 0x93, - 0x85, 0x8b, 0x91, 0x88, 0x02, 0x64, 0xfd, 0x95, 0xb4, 0xd1, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x01, 0x01, 0xea, 0x04, 0xf8, 0x05, 0xcc, 0x00, 0x14, - 0x00, 0x26, 0x40, 0x14, 0x14, 0x12, 0x0b, 0x09, 0x04, 0x15, 0x16, 0x0e, - 0xe6, 0x0b, 0x12, 0x04, 0x03, 0x08, 0x13, 0x09, 0xe6, 0x01, 0x08, 0xe8, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x17, 0x39, 0x3f, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x31, 0x30, 0x01, 0x23, 0x03, 0x26, 0x27, 0x06, 0x07, 0x03, - 0x23, 0x01, 0x33, 0x13, 0x3f, 0x01, 0x13, 0x33, 0x13, 0x16, 0x17, 0x13, - 0x33, 0x03, 0xf1, 0xa4, 0xa7, 0x16, 0x13, 0x0e, 0x1c, 0xa7, 0xa4, 0xfe, - 0xf9, 0x94, 0xca, 0x18, 0x1d, 0xa6, 0x86, 0xa7, 0x25, 0x11, 0xc8, 0x93, - 0x01, 0xea, 0x02, 0x76, 0x50, 0x82, 0x62, 0x70, 0xfd, 0x8a, 0x03, 0xe2, - 0xfc, 0xb1, 0x71, 0x75, 0x02, 0x69, 0xfd, 0x97, 0x8e, 0x56, 0x03, 0x4d, - 0x00, 0x02, 0x00, 0x3b, 0x01, 0xdc, 0x03, 0x07, 0x04, 0xf3, 0x00, 0x23, - 0x00, 0x2f, 0x00, 0x6b, 0x40, 0x3a, 0x2d, 0x03, 0x0e, 0x0f, 0x20, 0x08, - 0x28, 0x28, 0x1b, 0x15, 0x15, 0x0f, 0x03, 0x03, 0x30, 0x31, 0x20, 0x06, - 0x1d, 0x06, 0x2a, 0xe4, 0x59, 0x06, 0x06, 0x00, 0x11, 0x0f, 0x0e, 0x1f, - 0x0e, 0x2f, 0x0e, 0x03, 0x0f, 0x03, 0x0e, 0x0e, 0x11, 0x11, 0x0b, 0xe4, - 0x59, 0x11, 0xec, 0x1d, 0x18, 0xe4, 0x59, 0x1d, 0x1d, 0x00, 0x00, 0x24, - 0xe4, 0x59, 0x00, 0xe8, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x21, 0x32, 0x16, 0x15, - 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x27, - 0x23, 0x0e, 0x01, 0x27, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x07, 0x0e, 0x01, - 0x15, 0x14, 0x16, 0x01, 0x1a, 0x70, 0x6f, 0x9a, 0xa4, 0xa5, 0x4d, 0x51, - 0x51, 0x4c, 0x07, 0x80, 0x20, 0x01, 0x07, 0x8a, 0x8d, 0x1c, 0x28, 0x13, - 0x16, 0x33, 0x2c, 0x46, 0x3b, 0x05, 0x04, 0x2f, 0x79, 0x40, 0x42, 0x69, - 0x3d, 0x86, 0x7d, 0x62, 0x41, 0x01, 0xdc, 0x79, 0x6a, 0x78, 0x7e, 0x03, - 0x03, 0x2a, 0x5f, 0x4e, 0x3a, 0x3f, 0x0c, 0xce, 0x84, 0x7d, 0xfe, 0xb8, - 0x39, 0x39, 0x05, 0x4f, 0x0b, 0x4c, 0x4d, 0x56, 0x4a, 0x5f, 0x40, 0x6d, - 0x3c, 0x3e, 0x02, 0x03, 0x4f, 0x51, 0x3f, 0x43, 0x00, 0x02, 0xff, 0xec, - 0x01, 0xdc, 0x02, 0xb8, 0x04, 0xf3, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x67, - 0x40, 0x25, 0x29, 0x20, 0x08, 0x08, 0x1a, 0x14, 0x0e, 0x0f, 0x2d, 0x03, - 0x03, 0x0f, 0x14, 0x03, 0x30, 0x31, 0x29, 0x07, 0xe4, 0x59, 0x20, 0x29, - 0x40, 0x09, 0x0c, 0x48, 0x29, 0x29, 0x1d, 0x11, 0x1d, 0x18, 0xe4, 0x59, - 0x1d, 0xec, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x0e, 0x11, 0x48, 0x0e, - 0x0e, 0x11, 0x11, 0x0b, 0xe4, 0x59, 0x11, 0xe9, 0x00, 0x24, 0xe4, 0x59, - 0x00, 0xec, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x2b, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, - 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x0f, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, - 0x21, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, - 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x17, 0x22, 0x0e, 0x01, 0x1d, - 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x01, 0xd9, 0x70, 0x6f, 0x9a, - 0xa4, 0xa5, 0x4d, 0x51, 0x4e, 0x4c, 0x0a, 0x80, 0x20, 0xfe, 0xf9, 0x8a, - 0x8d, 0x1c, 0x28, 0x13, 0x16, 0x33, 0x2c, 0x46, 0x3b, 0x05, 0x04, 0x2a, - 0x7d, 0x41, 0x44, 0x69, 0x3b, 0x86, 0x7d, 0x62, 0x41, 0x04, 0xf3, 0x79, - 0x6a, 0x78, 0x7e, 0x03, 0x03, 0x2a, 0x5f, 0x4e, 0x35, 0x44, 0x0c, 0xce, - 0x84, 0x7d, 0x01, 0x48, 0x39, 0x39, 0x05, 0x4f, 0x0b, 0x4c, 0x4d, 0x53, - 0x4d, 0x5f, 0x41, 0x6e, 0x3a, 0x3e, 0x02, 0x03, 0x4f, 0x51, 0x3f, 0x43, - 0x00, 0x02, 0x00, 0x3b, 0x01, 0xdc, 0x02, 0xad, 0x04, 0xf2, 0x00, 0x16, - 0x00, 0x22, 0x00, 0x3d, 0x40, 0x1e, 0x1d, 0x0c, 0x16, 0x16, 0x11, 0x17, - 0x06, 0x11, 0x06, 0x24, 0x23, 0x0e, 0xeb, 0x0b, 0x00, 0x08, 0x03, 0x08, - 0x20, 0xe4, 0x59, 0x08, 0xec, 0x03, 0x1a, 0xe4, 0x59, 0x14, 0x03, 0xe9, - 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, - 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x34, 0x37, 0x33, 0x07, 0x11, 0x14, - 0x17, 0x23, 0x26, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x02, 0x2f, 0x23, 0x6f, 0x54, 0x8c, 0x82, 0x01, - 0x0e, 0x54, 0x70, 0x23, 0x01, 0x07, 0x75, 0x04, 0x04, 0x75, 0x06, 0xfe, - 0x89, 0x51, 0x5d, 0x68, 0x5e, 0x5e, 0x67, 0x5c, 0x53, 0x02, 0x65, 0x4a, - 0x3f, 0xc2, 0xc6, 0x01, 0x8e, 0x41, 0x45, 0x33, 0x46, 0x88, 0xfe, 0x2a, - 0x65, 0x38, 0x2a, 0x51, 0x01, 0x03, 0xa1, 0x89, 0x96, 0x9d, 0x97, 0x8c, - 0x8c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2d, 0x01, 0xdc, 0x04, 0x99, - 0x04, 0xf3, 0x00, 0x28, 0x00, 0x34, 0x00, 0x3b, 0x00, 0x97, 0x40, 0x2e, - 0x35, 0x08, 0x28, 0x0d, 0x23, 0x3b, 0x34, 0x18, 0x18, 0x01, 0x3b, 0x2d, - 0x1f, 0x13, 0x13, 0x3b, 0x28, 0x03, 0x3c, 0x3d, 0x28, 0x35, 0xe4, 0x59, - 0x28, 0x28, 0x25, 0x0b, 0x29, 0x17, 0xe4, 0x59, 0x0d, 0x10, 0x23, 0x21, - 0x29, 0x40, 0x09, 0x0c, 0x48, 0x29, 0x29, 0x10, 0x21, 0x1e, 0xb8, 0xff, - 0xc0, 0x40, 0x22, 0x0e, 0x11, 0x48, 0x1e, 0x1e, 0x21, 0x21, 0x1b, 0xe4, - 0x59, 0x21, 0x21, 0x25, 0x25, 0x38, 0xe4, 0x59, 0x25, 0xe9, 0x10, 0x30, - 0xe4, 0x59, 0x10, 0xec, 0x07, 0x07, 0x0b, 0x0b, 0x04, 0xe4, 0x59, 0x0b, - 0xec, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x12, 0x39, 0x12, 0x39, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x35, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, - 0x17, 0x06, 0x21, 0x22, 0x27, 0x06, 0x23, 0x20, 0x11, 0x35, 0x05, 0x37, - 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x05, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x37, 0x02, 0x34, 0x02, 0x67, 0x5e, 0x50, 0x60, - 0x11, 0x6b, 0x25, 0x98, 0x6f, 0xd9, 0x47, 0x37, 0x8e, 0x63, 0x72, 0x72, - 0x9c, 0xab, 0xa3, 0x4c, 0x52, 0x52, 0x4f, 0x0a, 0x81, 0x20, 0xfe, 0xf2, - 0xab, 0x43, 0x51, 0x9a, 0xfe, 0xbb, 0x02, 0x82, 0x85, 0x80, 0x67, 0x44, - 0x3f, 0x46, 0x6a, 0x39, 0xfd, 0xfc, 0x0b, 0x61, 0x5d, 0x56, 0x63, 0x05, - 0x03, 0x82, 0x0c, 0x82, 0x84, 0x42, 0x33, 0x20, 0x5f, 0x55, 0xb5, 0x63, - 0x52, 0x79, 0x6a, 0x78, 0x7e, 0x03, 0x03, 0x2a, 0x5f, 0x4e, 0x36, 0x43, - 0x0c, 0xce, 0x62, 0x62, 0x01, 0x95, 0x11, 0x15, 0x02, 0x03, 0x52, 0x4e, - 0x3d, 0x45, 0x41, 0x6c, 0x3c, 0x8a, 0x79, 0x6e, 0x79, 0x6e, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x5a, 0x01, 0xdc, 0x02, 0xcc, 0x06, 0x00, 0x00, 0x18, - 0x00, 0x24, 0x00, 0x3c, 0x40, 0x1e, 0x11, 0x05, 0x1f, 0x1f, 0x0e, 0x19, - 0x00, 0x0e, 0x00, 0x25, 0x26, 0x12, 0x05, 0x16, 0x02, 0x16, 0x1c, 0xe4, - 0x59, 0x16, 0xec, 0x0f, 0xea, 0x02, 0x22, 0xe4, 0x59, 0x0c, 0x02, 0xe9, - 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, 0x14, - 0x0e, 0x02, 0x15, 0x23, 0x36, 0x35, 0x11, 0x33, 0x11, 0x07, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x02, 0xcc, 0xfe, 0xf2, 0x54, 0x6f, 0x23, 0x01, - 0x02, 0x02, 0x03, 0x76, 0x04, 0x7a, 0x03, 0x03, 0x23, 0x6f, 0x54, 0x8c, - 0x82, 0x80, 0x51, 0x5d, 0x68, 0x5e, 0x5e, 0x67, 0x5c, 0x53, 0x03, 0x6b, - 0xfe, 0x71, 0x3f, 0x45, 0x12, 0x27, 0x22, 0x18, 0x03, 0x38, 0x65, 0x03, - 0x79, 0xfe, 0xd6, 0x6c, 0x4a, 0x3f, 0xc2, 0xca, 0x9d, 0x8d, 0x93, 0x9f, - 0x97, 0x8e, 0x8c, 0x00, 0x00, 0x02, 0x00, 0x3b, 0x01, 0xdc, 0x02, 0xad, - 0x06, 0x00, 0x00, 0x16, 0x00, 0x22, 0x00, 0x3f, 0x40, 0x1f, 0x17, 0x06, - 0x1d, 0x0e, 0x16, 0x16, 0x13, 0x11, 0x06, 0x11, 0x23, 0x24, 0x0f, 0xea, - 0x0d, 0x00, 0x08, 0x03, 0x08, 0x20, 0xe4, 0x59, 0x08, 0xec, 0x03, 0x1a, - 0xe4, 0x59, 0x14, 0x03, 0xe9, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, - 0x35, 0x27, 0x11, 0x33, 0x11, 0x14, 0x17, 0x23, 0x26, 0x35, 0x01, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0x2f, - 0x23, 0x6f, 0x54, 0x8c, 0x82, 0x01, 0x0e, 0x54, 0x6f, 0x23, 0x01, 0x01, - 0x7a, 0x04, 0x75, 0x06, 0xfe, 0x89, 0x51, 0x5d, 0x68, 0x5e, 0x5e, 0x67, - 0x5c, 0x53, 0x02, 0x65, 0x4a, 0x3f, 0xc2, 0xc6, 0x01, 0x8f, 0x40, 0x45, - 0x17, 0x3f, 0x01, 0x3c, 0xfc, 0x87, 0x65, 0x38, 0x2a, 0x51, 0x01, 0x03, - 0xa1, 0x89, 0x96, 0x9d, 0x97, 0x8d, 0x8c, 0x00, 0x00, 0x02, 0x00, 0x3b, - 0x01, 0xdc, 0x02, 0xc9, 0x04, 0xf3, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x51, - 0x40, 0x2a, 0x06, 0x07, 0x07, 0x14, 0x13, 0x1a, 0x00, 0x00, 0x0d, 0x13, - 0x0d, 0x1c, 0x1b, 0x06, 0x06, 0x00, 0x03, 0x1a, 0x00, 0xe4, 0x59, 0x1a, - 0x40, 0x09, 0x0c, 0x48, 0x1a, 0x1a, 0x0a, 0x10, 0x10, 0x17, 0xe4, 0x59, - 0x10, 0xec, 0x0a, 0x03, 0xe4, 0x59, 0x0a, 0xe9, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x14, 0x16, - 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, - 0xbc, 0x69, 0x64, 0x50, 0x60, 0x11, 0x6b, 0x1f, 0x9c, 0x71, 0xa4, 0xaa, - 0xaa, 0xa0, 0x01, 0x44, 0x7e, 0x0b, 0x61, 0x5d, 0x59, 0x67, 0x05, 0x03, - 0x4d, 0x84, 0x8e, 0x42, 0x33, 0x20, 0x5b, 0x59, 0xc8, 0xc8, 0xbd, 0xca, - 0xfe, 0x6b, 0x11, 0x61, 0x79, 0x6e, 0x79, 0x6e, 0x00, 0x02, 0x00, 0x3b, - 0x01, 0xdc, 0x02, 0xc9, 0x04, 0xf3, 0x00, 0x12, 0x00, 0x19, 0x00, 0x41, - 0x40, 0x21, 0x13, 0x07, 0x12, 0x00, 0x19, 0x19, 0x0c, 0x12, 0x0c, 0x1a, - 0x1b, 0x12, 0x13, 0xe4, 0x59, 0x12, 0x06, 0x12, 0x06, 0x0f, 0x09, 0x0f, - 0x16, 0xe4, 0x59, 0x0f, 0xe9, 0x09, 0x03, 0xe4, 0x59, 0x09, 0xec, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, - 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x20, 0x11, 0x35, - 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x02, 0x48, 0x69, 0x64, 0x50, - 0x60, 0x11, 0x6b, 0x40, 0xec, 0xa4, 0xaa, 0xaa, 0xa0, 0xfe, 0xbc, 0x7e, - 0x0b, 0x61, 0x5d, 0x59, 0x67, 0x05, 0x03, 0x82, 0x84, 0x8e, 0x42, 0x33, - 0x20, 0xb4, 0xc8, 0xc8, 0xbd, 0xca, 0x01, 0x95, 0x11, 0x61, 0x79, 0x6e, - 0x79, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x01, 0xdc, 0x02, 0x61, - 0x04, 0xf3, 0x00, 0x22, 0x00, 0x69, 0x40, 0x37, 0x06, 0x18, 0x0f, 0x15, - 0x0a, 0x0a, 0x1a, 0x03, 0x10, 0x0f, 0x0f, 0x20, 0x03, 0x20, 0x23, 0x24, - 0x1f, 0x1f, 0x00, 0x06, 0x17, 0x18, 0x17, 0x18, 0xe4, 0x59, 0x10, 0x10, - 0x0d, 0x0f, 0x17, 0x01, 0x1e, 0x03, 0x17, 0x40, 0x09, 0x0c, 0x48, 0x17, - 0x17, 0x00, 0x0d, 0x0d, 0x12, 0xe4, 0x59, 0x0d, 0xec, 0x00, 0x1d, 0xe4, - 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x5f, 0x5e, 0x5d, 0x12, 0x39, 0x2f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x12, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x39, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x2e, - 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x33, 0x15, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, - 0x0e, 0x01, 0x01, 0x4b, 0x81, 0x92, 0x66, 0x55, 0x48, 0x60, 0x8d, 0x70, - 0xe3, 0x1e, 0x6e, 0x11, 0x81, 0x3f, 0x43, 0xd4, 0xe0, 0x4d, 0x40, 0x89, - 0x24, 0x6c, 0x1e, 0x85, 0x01, 0xdc, 0x7a, 0x6a, 0x4b, 0x67, 0x09, 0x02, - 0x07, 0x60, 0x46, 0x5a, 0x6f, 0xb6, 0x0e, 0x65, 0x3c, 0x34, 0x7a, 0x60, - 0x8d, 0x40, 0x43, 0x74, 0x1f, 0x5b, 0x58, 0x00, 0x00, 0x01, 0x00, 0x30, - 0x01, 0xdc, 0x02, 0x59, 0x04, 0xf3, 0x00, 0x23, 0x00, 0x69, 0x40, 0x37, - 0x0b, 0x1d, 0x1a, 0x14, 0x15, 0x15, 0x04, 0x03, 0x0e, 0x1a, 0x1a, 0x09, - 0x21, 0x03, 0x21, 0x24, 0x25, 0x1d, 0x0c, 0x04, 0x04, 0x0b, 0x00, 0x0c, - 0x0b, 0xe4, 0x59, 0x0f, 0x0c, 0x01, 0x1e, 0x03, 0x0c, 0x40, 0x09, 0x0c, - 0x48, 0x14, 0x0c, 0x14, 0x0c, 0x17, 0x00, 0x17, 0x11, 0xe4, 0x59, 0x17, - 0xec, 0x00, 0x06, 0xe4, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, 0x5f, - 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x37, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x35, 0x32, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, - 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x01, 0x46, 0x73, 0x85, 0x1e, - 0x6c, 0x24, 0x89, 0x40, 0x4d, 0xe0, 0xd4, 0x43, 0x3f, 0x40, 0x4b, 0x07, - 0x6e, 0x1e, 0xe3, 0x71, 0x8c, 0x62, 0x46, 0x55, 0x66, 0x93, 0x01, 0xdc, - 0x58, 0x5b, 0x1f, 0x74, 0x43, 0x40, 0x8d, 0x60, 0x7a, 0x34, 0x3c, 0x35, - 0x30, 0x0e, 0xb6, 0x6f, 0x5a, 0x47, 0x5f, 0x07, 0x02, 0x09, 0x68, 0x4a, - 0x6a, 0x7a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3b, 0x00, 0xbe, 0x02, 0xad, - 0x04, 0xf1, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x64, 0x40, 0x34, 0x20, 0x16, - 0x08, 0x08, 0x1c, 0x1a, 0x1d, 0x04, 0x03, 0x03, 0x26, 0x0f, 0x1d, 0x0f, - 0x2d, 0x2c, 0x19, 0xeb, 0x15, 0x09, 0x12, 0x04, 0x04, 0x0c, 0x00, 0x0c, - 0x29, 0xe4, 0x59, 0x0f, 0x0c, 0x1f, 0x0c, 0x02, 0x09, 0x03, 0x0c, 0x0c, - 0x00, 0x12, 0x12, 0x23, 0xe4, 0x59, 0x12, 0xec, 0x00, 0x06, 0xe4, 0x59, - 0x00, 0xed, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x11, 0x39, 0x39, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x25, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x3d, 0x01, 0x23, 0x06, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x34, - 0x36, 0x37, 0x33, 0x0f, 0x01, 0x11, 0x14, 0x06, 0x13, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x74, 0x7e, 0x8a, - 0x13, 0x7b, 0x1a, 0x8a, 0xb8, 0x02, 0x47, 0xa6, 0x8c, 0x7a, 0x8a, 0x8a, - 0x4e, 0x73, 0x20, 0x02, 0x07, 0x02, 0x72, 0x01, 0x03, 0x97, 0x1e, 0x6b, - 0x58, 0x5e, 0x56, 0x52, 0x60, 0x59, 0x6c, 0xbe, 0x68, 0x55, 0x12, 0x6e, - 0xde, 0x7b, 0x94, 0xc3, 0xbf, 0xcc, 0xbf, 0x4a, 0x45, 0x24, 0x5c, 0x03, - 0x15, 0x89, 0xfd, 0xb9, 0xa1, 0xa1, 0x02, 0xa9, 0x8c, 0x9f, 0x8c, 0x9f, - 0x9f, 0x86, 0x9d, 0x00, 0x00, 0x02, 0x00, 0x5e, 0x00, 0xcf, 0x00, 0xd7, - 0x04, 0xe5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x25, 0x40, 0x11, 0x06, 0x02, - 0x02, 0x05, 0x01, 0x01, 0x09, 0x08, 0x07, 0xeb, 0x02, 0x03, 0xe5, 0x59, - 0x02, 0x06, 0xe8, 0x00, 0x3f, 0xc6, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, - 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x15, 0x23, - 0x35, 0x13, 0x11, 0x23, 0x11, 0xd7, 0x79, 0x79, 0x79, 0x01, 0x48, 0x79, - 0x79, 0x03, 0x9d, 0xfd, 0x05, 0x02, 0xfb, 0x00, 0x00, 0x01, 0x00, 0x5e, - 0x01, 0xea, 0x02, 0xbb, 0x06, 0x00, 0x00, 0x0b, 0x00, 0x3f, 0x40, 0x1f, - 0x01, 0x0a, 0x07, 0x08, 0x09, 0x09, 0x00, 0x0b, 0x0b, 0x0d, 0x07, 0x03, - 0x03, 0x04, 0x04, 0x0c, 0x0d, 0x02, 0x07, 0x0a, 0x07, 0x01, 0x03, 0x04, - 0x08, 0xeb, 0x05, 0xea, 0x00, 0x04, 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x3f, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, - 0x30, 0x01, 0x03, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, - 0x01, 0x02, 0x2b, 0xf9, 0x5a, 0x7a, 0x7a, 0x01, 0x43, 0x90, 0xfe, 0xd5, - 0x01, 0x3b, 0x01, 0xea, 0x01, 0x5c, 0x4d, 0xfe, 0xf1, 0x04, 0x16, 0xfd, - 0x73, 0x01, 0x72, 0xfe, 0xb8, 0xfe, 0x4d, 0x00, 0x00, 0x01, 0x00, 0x5d, - 0x01, 0xea, 0x04, 0x2d, 0x04, 0xf3, 0x00, 0x25, 0x00, 0x44, 0x40, 0x24, - 0x0d, 0x08, 0x08, 0x09, 0x25, 0x00, 0x1d, 0x1c, 0x1c, 0x00, 0x09, 0x03, - 0x26, 0x27, 0x18, 0x21, 0xe4, 0x59, 0x18, 0xec, 0x15, 0x0e, 0x12, 0x00, - 0x12, 0x04, 0xe4, 0x59, 0x12, 0xec, 0x0b, 0xeb, 0x00, 0x1d, 0x09, 0xe8, - 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x27, 0x33, 0x17, 0x15, 0x33, 0x3e, 0x01, - 0x33, 0x32, 0x16, 0x17, 0x33, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, - 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x02, 0x0a, 0x38, 0x4e, - 0x4e, 0x5c, 0x7a, 0x03, 0x73, 0x05, 0x02, 0x26, 0x65, 0x4c, 0x54, 0x61, - 0x14, 0x02, 0x43, 0x9c, 0x70, 0x65, 0x79, 0x38, 0x4f, 0x4e, 0x5b, 0x01, - 0xea, 0x01, 0xe4, 0x6b, 0x58, 0x7a, 0x73, 0xfe, 0x46, 0x02, 0x58, 0xa3, - 0x60, 0x23, 0x4e, 0x43, 0x46, 0x4b, 0x91, 0x7f, 0x8e, 0xfe, 0x04, 0x01, - 0xe4, 0x6b, 0x58, 0x77, 0x76, 0xfe, 0x46, 0x00, 0x00, 0x01, 0x00, 0x5d, - 0x00, 0xbe, 0x02, 0xac, 0x04, 0xf3, 0x00, 0x1e, 0x00, 0x38, 0x40, 0x1e, - 0x16, 0x11, 0x11, 0x12, 0x09, 0x00, 0x00, 0x04, 0x12, 0x03, 0x1f, 0x20, - 0x1b, 0x0d, 0xe4, 0x59, 0x1b, 0xec, 0x17, 0x12, 0x14, 0xeb, 0x12, 0xe8, - 0x02, 0x07, 0xe5, 0x59, 0x02, 0xed, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x23, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, - 0x23, 0x11, 0x27, 0x33, 0x17, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x15, 0x02, 0xac, 0xbf, 0x29, 0x2a, 0x1b, 0x2d, 0x50, 0x42, 0x57, 0x57, - 0x67, 0x7b, 0x03, 0x73, 0x05, 0x02, 0x2c, 0x6d, 0x53, 0x7b, 0x6e, 0x01, - 0x8f, 0xd1, 0x0a, 0x74, 0x0b, 0x68, 0x02, 0x35, 0x6c, 0x57, 0x7a, 0x73, - 0xfe, 0x46, 0x02, 0x58, 0xa3, 0x60, 0x23, 0x50, 0x41, 0x7f, 0x8e, 0x00, - 0x00, 0x02, 0x00, 0x3b, 0x01, 0xdc, 0x02, 0xcc, 0x04, 0xf3, 0x00, 0x09, - 0x00, 0x15, 0x00, 0x28, 0x40, 0x14, 0x10, 0x05, 0x0a, 0x00, 0x05, 0x00, - 0x16, 0x17, 0x07, 0x0d, 0xe4, 0x59, 0x07, 0xec, 0x02, 0x13, 0xe4, 0x59, - 0x02, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, - 0x26, 0x35, 0x10, 0x21, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0xcc, 0xfe, 0xb4, 0x9a, 0xab, - 0x01, 0x4a, 0xac, 0x9b, 0x80, 0x5b, 0x6a, 0x6c, 0x60, 0x5e, 0x66, 0x6e, - 0x5f, 0x03, 0x68, 0xfe, 0x74, 0xc3, 0xc9, 0x01, 0x8b, 0xc5, 0xc6, 0x9e, - 0x8f, 0x92, 0x9b, 0x96, 0x98, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, - 0x01, 0xdc, 0x02, 0xa1, 0x04, 0xf3, 0x00, 0x17, 0x00, 0x36, 0x40, 0x1b, - 0x05, 0x06, 0x06, 0x12, 0x00, 0x0c, 0x12, 0x0c, 0x18, 0x19, 0x0f, 0x16, - 0xe4, 0x59, 0x13, 0x13, 0x0f, 0xe9, 0x05, 0x05, 0x09, 0x09, 0x03, 0xe4, - 0x59, 0x09, 0xec, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, - 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, - 0x1e, 0x01, 0x33, 0x32, 0x02, 0x21, 0x57, 0x62, 0x88, 0x16, 0x7e, 0x15, - 0x96, 0x6f, 0x99, 0xa2, 0xa3, 0x9a, 0x75, 0x99, 0x0e, 0x7b, 0x0b, 0x58, - 0x42, 0xb9, 0x03, 0x6b, 0x9d, 0x88, 0x8b, 0x0a, 0x6e, 0x76, 0xcc, 0xbf, - 0xc1, 0xcb, 0x83, 0x6e, 0x08, 0x4c, 0x49, 0x00, 0x00, 0x01, 0x00, 0x3b, - 0x03, 0x68, 0x02, 0xcc, 0x04, 0xf3, 0x00, 0x0c, 0x00, 0x26, 0x40, 0x11, - 0x06, 0x07, 0x00, 0x0c, 0x07, 0x0c, 0x0d, 0x0e, 0x00, 0x07, 0x09, 0x09, - 0x03, 0xe4, 0x59, 0x09, 0xec, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc4, - 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x10, 0x21, 0x32, 0x16, - 0x15, 0x02, 0x4c, 0x5b, 0x6a, 0x6c, 0x60, 0x80, 0x01, 0x4a, 0xac, 0x9b, - 0x03, 0x68, 0x9e, 0x8f, 0x92, 0x9b, 0x01, 0x8b, 0xc5, 0xc6, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3b, 0x01, 0xdc, 0x02, 0xcc, 0x03, 0x68, 0x00, 0x0c, - 0x00, 0x27, 0x40, 0x11, 0x06, 0x05, 0x0c, 0x00, 0x05, 0x00, 0x0d, 0x0e, - 0x0c, 0x05, 0x02, 0x40, 0x02, 0x09, 0xe4, 0x59, 0x02, 0x00, 0x2f, 0x2b, - 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, 0x26, 0x35, 0x33, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0xcc, 0xfe, 0xb4, 0x9a, 0xab, - 0x80, 0x5e, 0x66, 0x6e, 0x5f, 0x03, 0x68, 0xfe, 0x74, 0xc3, 0xc9, 0x96, - 0x98, 0x93, 0x9b, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xbe, 0x02, 0xcc, - 0x04, 0xf2, 0x00, 0x18, 0x00, 0x24, 0x00, 0x3d, 0x40, 0x1f, 0x1f, 0x12, - 0x08, 0x08, 0x09, 0x19, 0x00, 0x09, 0x00, 0x25, 0x26, 0x12, 0x04, 0x16, - 0x02, 0x16, 0x1c, 0xe4, 0x59, 0x16, 0xec, 0x0c, 0xeb, 0x09, 0xed, 0x02, - 0x22, 0xe4, 0x59, 0x02, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, - 0x22, 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x2f, 0x01, 0x33, 0x14, - 0x1e, 0x02, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0xcc, 0xfe, - 0xf2, 0xa9, 0x3c, 0x04, 0x03, 0x7a, 0x03, 0x01, 0x76, 0x03, 0x02, 0x02, - 0x03, 0x22, 0x6c, 0x56, 0x89, 0x85, 0x80, 0x54, 0x5a, 0x6b, 0x5b, 0x5e, - 0x67, 0x5c, 0x53, 0x03, 0x6b, 0xfe, 0x71, 0x84, 0x06, 0x47, 0xfe, 0xab, - 0x03, 0x8b, 0x87, 0x15, 0x02, 0x19, 0x24, 0x2a, 0x12, 0x49, 0x3f, 0xbf, - 0xcb, 0xa2, 0x86, 0x97, 0x9b, 0x97, 0x8d, 0x8f, 0x00, 0x01, 0x00, 0x20, - 0x01, 0xdf, 0x01, 0x84, 0x05, 0x8f, 0x00, 0x14, 0x00, 0x39, 0x40, 0x1d, - 0x0b, 0x0f, 0x0f, 0x08, 0x06, 0x04, 0x00, 0x0d, 0x04, 0x03, 0x15, 0x16, - 0x0e, 0x06, 0x07, 0x06, 0xe4, 0x59, 0x0b, 0x09, 0x40, 0x07, 0xeb, 0x02, - 0x12, 0xe4, 0x59, 0x02, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, - 0xce, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, 0x23, 0x22, 0x35, - 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x01, 0x84, 0x3c, 0x40, 0x93, 0x55, 0x5a, 0x24, - 0x52, 0x88, 0x88, 0x22, 0x2b, 0x1a, 0x2d, 0x01, 0xf0, 0x11, 0xac, 0x01, - 0xfd, 0x5d, 0xaa, 0xaa, 0x5d, 0xfe, 0x1f, 0x37, 0x2c, 0x09, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x5b, 0x01, 0xdc, 0x02, 0xaa, 0x04, 0xe5, 0x00, 0x15, - 0x00, 0x31, 0x40, 0x17, 0x07, 0x0d, 0x0d, 0x0a, 0x01, 0x14, 0x0a, 0x14, - 0x17, 0x16, 0x0d, 0x11, 0x08, 0x15, 0xeb, 0x0c, 0x11, 0x11, 0x04, 0xe4, - 0x59, 0x11, 0xe9, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, - 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x13, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, - 0x33, 0x11, 0x17, 0x23, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, - 0x11, 0xd5, 0x42, 0x57, 0x57, 0x67, 0x7a, 0x04, 0x74, 0x04, 0x02, 0x2a, - 0x6e, 0x54, 0x7b, 0x6e, 0x04, 0xe5, 0xfe, 0x1c, 0x6e, 0x55, 0x7a, 0x73, - 0x01, 0xba, 0xfd, 0xa8, 0xa3, 0x82, 0x4c, 0x44, 0x7f, 0x8e, 0x01, 0xfc, - 0x00, 0x01, 0x00, 0x2b, 0x02, 0x17, 0x03, 0x20, 0x04, 0x66, 0x00, 0x15, - 0x00, 0x36, 0x40, 0x1a, 0x08, 0x00, 0x0d, 0x0e, 0x0e, 0x04, 0x04, 0x0c, - 0x11, 0x00, 0x11, 0x16, 0x17, 0x15, 0x00, 0xe5, 0x59, 0x15, 0x0d, 0x08, - 0x09, 0x08, 0xe5, 0x59, 0x0a, 0x09, 0x00, 0x2f, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x21, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x37, 0x15, 0x07, 0x15, 0x1e, - 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x2b, 0x01, 0xd0, 0x6e, 0x55, 0x7a, - 0x73, 0xfe, 0x5a, 0x02, 0x44, 0xa3, 0x82, 0x4d, 0x43, 0x7f, 0x8e, 0xfe, - 0x18, 0x02, 0x91, 0x42, 0x57, 0x57, 0x67, 0x7a, 0x04, 0x74, 0x04, 0x02, - 0x2a, 0x6e, 0x54, 0x7b, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5d, - 0x01, 0xdd, 0x04, 0x2d, 0x04, 0xe6, 0x00, 0x26, 0x00, 0x4a, 0x40, 0x25, - 0x0d, 0x07, 0x07, 0x0a, 0x15, 0x01, 0x25, 0x1f, 0x1c, 0x1c, 0x25, 0x0a, - 0x03, 0x28, 0x27, 0x0e, 0x15, 0x19, 0x26, 0x08, 0x1d, 0xeb, 0x0c, 0x12, - 0x12, 0x04, 0xe4, 0x59, 0x12, 0x12, 0x19, 0x19, 0x22, 0xe4, 0x59, 0x19, - 0xe9, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x17, - 0x23, 0x2f, 0x01, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x35, 0x11, 0x02, 0x80, 0x38, 0x4e, 0x4e, 0x5c, 0x7a, 0x03, 0x73, - 0x04, 0x01, 0x02, 0x2b, 0x62, 0x4a, 0x54, 0x61, 0x14, 0x02, 0x20, 0x68, - 0x57, 0x71, 0x64, 0x79, 0x38, 0x4f, 0x4e, 0x5b, 0x04, 0xe6, 0xfe, 0x1c, - 0x6b, 0x58, 0x7a, 0x73, 0x01, 0xba, 0xfd, 0xa8, 0xa3, 0x60, 0x23, 0x53, - 0x3e, 0x46, 0x4b, 0x43, 0x4e, 0x7f, 0x8e, 0x01, 0xfc, 0xfe, 0x1c, 0x6b, - 0x58, 0x77, 0x76, 0x01, 0xba, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, - 0x01, 0xea, 0x02, 0xa2, 0x04, 0xe5, 0x00, 0x09, 0x00, 0x1e, 0x40, 0x0d, - 0x05, 0x0a, 0x09, 0x0b, 0x02, 0x0a, 0x05, 0x01, 0x08, 0x02, 0xeb, 0x01, - 0xe8, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x12, 0x39, 0x31, 0x30, 0x01, 0x23, 0x01, 0x33, 0x13, 0x17, 0x3e, 0x01, - 0x13, 0x33, 0x01, 0x8f, 0x91, 0xfe, 0xf5, 0x82, 0xa2, 0x30, 0x0e, 0x14, - 0xb7, 0x82, 0x01, 0xea, 0x02, 0xfb, 0xfe, 0x0f, 0xa7, 0x34, 0x43, 0x02, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x01, 0xdd, 0x03, 0x19, - 0x04, 0xf3, 0x00, 0x27, 0x00, 0x43, 0x40, 0x23, 0x16, 0x09, 0x12, 0x09, - 0x0c, 0x03, 0x03, 0x1d, 0x1d, 0x03, 0x29, 0x28, 0x20, 0x19, 0xe4, 0x59, - 0x20, 0xe9, 0x1c, 0x24, 0x00, 0x09, 0x16, 0x0f, 0x04, 0x04, 0x00, 0x0f, - 0xec, 0x00, 0x06, 0xe4, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x33, 0x3f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x27, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, - 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x2e, - 0x01, 0x27, 0x0e, 0x02, 0xb5, 0x33, 0x53, 0x2b, 0x3c, 0x34, 0x3e, 0x37, - 0x20, 0x45, 0x68, 0x59, 0x80, 0x82, 0x81, 0x80, 0x25, 0x34, 0x62, 0x40, - 0x22, 0x34, 0x1f, 0x3d, 0x17, 0x3b, 0x2b, 0x52, 0x33, 0x27, 0x3b, 0x34, - 0x44, 0x49, 0x32, 0x37, 0x01, 0xdd, 0x23, 0x32, 0x52, 0x41, 0x29, 0x57, - 0x80, 0x6e, 0x64, 0x67, 0x77, 0x77, 0x66, 0x2d, 0x61, 0x45, 0x7b, 0x57, - 0x2e, 0x24, 0x1d, 0x52, 0x32, 0x23, 0x15, 0x2c, 0x5d, 0x60, 0x2b, 0x13, - 0x00, 0x02, 0x00, 0x60, 0x00, 0xbe, 0x02, 0xea, 0x06, 0x00, 0x00, 0x14, - 0x00, 0x28, 0x00, 0x58, 0x40, 0x2e, 0x1e, 0x12, 0x15, 0x10, 0x15, 0x08, - 0x08, 0x09, 0x22, 0x10, 0x10, 0x1b, 0x00, 0x09, 0x00, 0x29, 0x2a, 0x1f, - 0x1e, 0xe4, 0x59, 0x12, 0x06, 0x0f, 0x1f, 0x01, 0x0c, 0x03, 0x1f, 0x1f, - 0x03, 0x0d, 0x0d, 0x25, 0xe4, 0x59, 0x0d, 0xea, 0x09, 0xed, 0x03, 0x18, - 0xe4, 0x59, 0x03, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x39, 0x33, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, - 0x22, 0x27, 0x23, 0x17, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x07, 0x1e, 0x01, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x23, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x02, 0xea, 0xa5, 0x92, 0x7b, 0x5d, 0x04, 0x04, 0x7b, 0x9b, 0x9a, - 0x88, 0x8c, 0x97, 0x65, 0x73, 0xfd, 0xf1, 0x26, 0x71, 0x3c, 0x63, 0x64, - 0x76, 0x6f, 0x57, 0x4d, 0x52, 0x4b, 0x62, 0x5a, 0x03, 0x08, 0x8e, 0x9e, - 0x42, 0x8e, 0xd2, 0x04, 0x00, 0xa8, 0x9a, 0x81, 0x75, 0xb1, 0x3f, 0x15, - 0x8e, 0xfc, 0x1b, 0x26, 0x6e, 0x5d, 0x66, 0x6f, 0x64, 0x13, 0x62, 0x56, - 0x44, 0x50, 0x6b, 0x78, 0x00, 0x01, 0x00, 0x02, 0x00, 0xbe, 0x02, 0x9b, - 0x04, 0xe5, 0x00, 0x08, 0x00, 0x2a, 0x40, 0x13, 0x08, 0x00, 0x00, 0x02, - 0x05, 0x06, 0x06, 0x0a, 0x03, 0x02, 0x02, 0x09, 0x01, 0x04, 0x05, 0x02, - 0xeb, 0x00, 0xed, 0x00, 0x3f, 0x3f, 0x33, 0x39, 0x39, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x25, 0x11, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x01, 0x11, 0x01, 0x0e, 0xfe, - 0xf4, 0x82, 0xca, 0xcb, 0x82, 0xfe, 0xed, 0xbe, 0x01, 0x2d, 0x02, 0xfa, - 0xfd, 0x8a, 0x02, 0x76, 0xfd, 0x05, 0xfe, 0xd4, 0x00, 0x02, 0x00, 0x3b, - 0x01, 0xdc, 0x02, 0xcc, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x46, - 0x40, 0x24, 0x03, 0x1b, 0x0d, 0x03, 0x1c, 0x12, 0x1c, 0x06, 0x18, 0x00, - 0x12, 0x12, 0x1f, 0x18, 0x03, 0x20, 0x21, 0x03, 0x1b, 0x1b, 0x15, 0x1d, - 0x1c, 0x0b, 0x1d, 0x0b, 0xe4, 0x59, 0x1d, 0xea, 0x15, 0x09, 0xe4, 0x59, - 0x15, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x39, 0x18, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x34, - 0x26, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x03, 0x22, 0x27, - 0x17, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x37, 0x27, 0x35, 0x21, 0x15, 0x02, 0x4c, 0x47, 0x4f, 0x74, 0x87, 0x6c, - 0x5e, 0xc7, 0xaf, 0x33, 0x36, 0xd7, 0x5c, 0x41, 0x24, 0xb1, 0x96, 0x9b, - 0xaf, 0x9c, 0x9f, 0xd8, 0x01, 0xf2, 0x03, 0x36, 0x4e, 0xa2, 0x53, 0x2a, - 0xa8, 0x71, 0x78, 0x84, 0x03, 0x69, 0x06, 0xe5, 0x64, 0x6a, 0x78, 0x45, - 0xa2, 0xbb, 0xb8, 0xa3, 0x87, 0xc6, 0x39, 0xef, 0x54, 0x5d, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x3a, 0x00, 0xbe, 0x03, 0x4d, 0x04, 0xf6, 0x00, 0x17, - 0x00, 0x20, 0x00, 0x4a, 0x40, 0x27, 0x18, 0x00, 0x0d, 0x09, 0x12, 0x12, - 0x05, 0x1e, 0x04, 0x04, 0x05, 0x0f, 0x09, 0x09, 0x05, 0x00, 0x03, 0x22, - 0x21, 0x15, 0x1b, 0xe4, 0x59, 0x15, 0xec, 0x0d, 0x0c, 0xec, 0x1e, 0x12, - 0x06, 0x12, 0xe4, 0x59, 0x03, 0x06, 0xe9, 0x05, 0xed, 0x00, 0x3f, 0x3f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x07, 0x11, 0x23, - 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x11, 0x14, 0x16, - 0x17, 0x11, 0x10, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x15, - 0x11, 0x3e, 0x01, 0x03, 0x4d, 0xad, 0xa7, 0x74, 0xa1, 0xaa, 0x97, 0x87, - 0x0e, 0xac, 0x65, 0x66, 0xd4, 0x70, 0x84, 0x81, 0x3b, 0x36, 0x62, 0x6e, - 0x65, 0x03, 0x78, 0xc1, 0xd1, 0x09, 0xfe, 0xe1, 0x01, 0x1f, 0x06, 0xc9, - 0xbe, 0xa0, 0xd6, 0x16, 0x60, 0x28, 0xfe, 0xf9, 0x96, 0x8d, 0x06, 0x01, - 0x99, 0x01, 0x1d, 0xcb, 0xaf, 0x89, 0x94, 0xbe, 0xfe, 0x65, 0x05, 0x99, - 0x00, 0x01, 0x00, 0x04, 0x00, 0xbf, 0x02, 0xc1, 0x04, 0xf4, 0x00, 0x15, - 0x00, 0x36, 0x40, 0x1d, 0x13, 0x10, 0x00, 0x03, 0x04, 0x12, 0x14, 0x14, - 0x17, 0x0a, 0x02, 0x16, 0x10, 0x03, 0x13, 0x00, 0x04, 0x02, 0x11, 0xeb, - 0x0c, 0x07, 0xe4, 0x59, 0x0c, 0xec, 0x15, 0x02, 0xee, 0x00, 0x3f, 0x33, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x17, 0x39, 0x11, 0x01, 0x33, 0x32, - 0x11, 0x33, 0x11, 0x33, 0x17, 0x39, 0x31, 0x30, 0x01, 0x03, 0x23, 0x01, - 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x1f, - 0x01, 0x13, 0x33, 0x03, 0x01, 0x23, 0x01, 0x67, 0xe3, 0x80, 0x01, 0x2c, - 0x74, 0x2f, 0x2e, 0x1c, 0x12, 0x11, 0x17, 0x22, 0x2f, 0x39, 0x48, 0x39, - 0x60, 0xb4, 0x7f, 0xfa, 0x01, 0x14, 0x81, 0x02, 0x92, 0xfe, 0x2d, 0x02, - 0x46, 0xf2, 0x64, 0x36, 0x07, 0x5c, 0x0e, 0x42, 0x79, 0xd0, 0x01, 0x7c, - 0xfe, 0x14, 0xfd, 0xc6, 0xff, 0xff, 0x00, 0x65, 0xff, 0x78, 0x00, 0xde, - 0x03, 0x8e, 0x10, 0x07, 0x03, 0x27, 0x00, 0xa1, 0xfd, 0x8e, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x67, 0xff, 0x78, 0x01, 0xc3, 0x02, 0x81, 0x10, 0x07, - 0x02, 0x75, 0x00, 0x00, 0xfd, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x60, - 0xff, 0x6a, 0x02, 0xaf, 0x02, 0x73, 0x10, 0x07, 0x05, 0x78, 0x00, 0x05, - 0xfd, 0x8e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x78, 0x02, 0xa2, - 0x02, 0x73, 0x10, 0x07, 0x05, 0x7b, 0x00, 0x00, 0xfd, 0x8e, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x62, 0xfe, 0x61, 0x02, 0xeb, 0x03, 0x8e, 0x00, 0x14, - 0x00, 0x28, 0x00, 0x57, 0x40, 0x2d, 0x1e, 0x12, 0x15, 0x10, 0x15, 0x06, - 0x08, 0x08, 0x09, 0x22, 0x10, 0x10, 0x1b, 0x00, 0x09, 0x00, 0x29, 0x2a, - 0x1f, 0x1e, 0xe4, 0x59, 0x12, 0x0f, 0x1f, 0x1f, 0x1f, 0x02, 0x0b, 0x03, - 0x1f, 0x1f, 0x03, 0x0d, 0x0d, 0x25, 0xe4, 0x59, 0x0d, 0x08, 0x03, 0x18, - 0xe4, 0x59, 0x03, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x2f, 0x2f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, - 0x27, 0x23, 0x17, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x07, 0x1e, 0x01, 0x05, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, - 0x02, 0xeb, 0xa5, 0x92, 0x7b, 0x5d, 0x04, 0x04, 0x7a, 0x9a, 0x9b, 0x87, - 0x8d, 0x98, 0x66, 0x72, 0xfd, 0xf1, 0x24, 0x76, 0x39, 0x62, 0x65, 0x75, - 0x6f, 0x57, 0x4c, 0x54, 0x49, 0x62, 0x5a, 0x96, 0x8e, 0x9e, 0x42, 0x8e, - 0xbd, 0x03, 0xeb, 0xa8, 0x9a, 0x81, 0x75, 0xaf, 0x40, 0x15, 0x90, 0xfb, - 0x1a, 0x27, 0x6f, 0x5d, 0x65, 0x6f, 0x64, 0x13, 0x62, 0x56, 0x47, 0x4d, - 0x6b, 0x78, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0xfe, 0x60, 0x02, 0xa1, - 0x02, 0x72, 0x00, 0x0e, 0x00, 0x24, 0x40, 0x0f, 0x0b, 0x0c, 0x0c, 0x0e, - 0x00, 0x08, 0x08, 0x10, 0x00, 0x0f, 0x04, 0x01, 0x0c, 0x07, 0x01, 0x00, - 0x2f, 0x33, 0x2f, 0x12, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x03, 0x33, 0x13, 0x16, 0x17, 0x3e, - 0x01, 0x13, 0x33, 0x01, 0x06, 0x07, 0x23, 0x36, 0x37, 0x0d, 0x82, 0xa7, - 0x22, 0x0d, 0x03, 0x2e, 0xa4, 0x81, 0xfe, 0xf7, 0x31, 0x16, 0x82, 0x0d, - 0x2f, 0x02, 0x72, 0xfe, 0x24, 0x66, 0x41, 0x0f, 0x99, 0x01, 0xdb, 0xfd, - 0x2a, 0x8b, 0xb1, 0x64, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3c, - 0xfe, 0x60, 0x02, 0xe0, 0x02, 0x81, 0x00, 0x17, 0x00, 0x23, 0x00, 0x49, - 0x40, 0x27, 0x11, 0x10, 0x10, 0x18, 0x05, 0x0a, 0x1e, 0x1e, 0x00, 0x05, - 0x00, 0x25, 0x24, 0x14, 0x0d, 0xe4, 0x59, 0x07, 0x21, 0xe4, 0x59, 0x0a, - 0x07, 0x07, 0x40, 0x09, 0x0c, 0x48, 0x14, 0x07, 0x14, 0x07, 0x02, 0x11, - 0x02, 0x1b, 0xe4, 0x59, 0x02, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x2f, 0x12, - 0x39, 0x39, 0x2f, 0x2f, 0x2b, 0x11, 0x39, 0x2b, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x37, 0x10, 0x21, 0x32, 0x16, 0x15, 0x10, 0x21, 0x22, 0x26, 0x27, - 0x1e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x2e, - 0x01, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x3c, 0x01, 0x4a, 0xac, 0x9b, 0xfe, 0xb4, 0x50, 0x68, 0x25, 0x12, - 0x87, 0xa5, 0x94, 0x62, 0x08, 0x6f, 0x05, 0x37, 0x7f, 0x9a, 0x9e, 0x42, - 0x02, 0x11, 0x5b, 0x6a, 0x6c, 0x60, 0x5f, 0x65, 0x6e, 0x5f, 0xf6, 0x01, - 0x8b, 0xc6, 0xc5, 0xfe, 0x73, 0x35, 0x31, 0x84, 0x5e, 0x38, 0x55, 0x15, - 0x0f, 0x65, 0xee, 0x01, 0x1f, 0x9e, 0x8f, 0x92, 0x9b, 0x97, 0x98, 0x93, - 0x00, 0x02, 0x00, 0x3a, 0xfe, 0x61, 0x03, 0x4d, 0x02, 0x80, 0x00, 0x19, - 0x00, 0x22, 0x00, 0x4c, 0x40, 0x26, 0x1a, 0x00, 0x20, 0x04, 0x04, 0x13, - 0x0d, 0x05, 0x10, 0x09, 0x09, 0x05, 0x00, 0x03, 0x24, 0x23, 0x0d, 0x0c, - 0x0c, 0x17, 0x17, 0x1d, 0xe4, 0x59, 0x17, 0x03, 0x20, 0xe4, 0x59, 0x03, - 0x03, 0x06, 0x06, 0x13, 0xe4, 0x59, 0x06, 0x04, 0x00, 0x2f, 0x2f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x07, - 0x11, 0x23, 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x17, 0x0e, 0x01, - 0x15, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, - 0x26, 0x23, 0x22, 0x15, 0x11, 0x3e, 0x01, 0x03, 0x4d, 0xad, 0xa7, 0x74, - 0xa0, 0xab, 0x98, 0x86, 0x0e, 0x53, 0x58, 0x64, 0x66, 0x69, 0x6b, 0x70, - 0x84, 0x81, 0x3a, 0x37, 0x62, 0x6e, 0x65, 0x01, 0x03, 0xc1, 0xd1, 0x09, - 0xfe, 0xf9, 0x01, 0x07, 0x06, 0xc7, 0xc0, 0xa1, 0xd4, 0x16, 0x60, 0x12, - 0x96, 0x86, 0x96, 0x8e, 0x06, 0x01, 0x99, 0x89, 0x95, 0xcb, 0xb0, 0x89, - 0x94, 0xbe, 0xfe, 0x65, 0x05, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, - 0xfe, 0x4d, 0x02, 0xc1, 0x02, 0x82, 0x10, 0x07, 0x05, 0x81, 0x00, 0x00, - 0xfd, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x85, 0xff, 0xec, 0x06, 0xf1, - 0x04, 0x4e, 0x00, 0x23, 0x00, 0x2a, 0x00, 0x6c, 0x40, 0x38, 0x14, 0x11, - 0x0b, 0x1b, 0x2a, 0x1e, 0x00, 0x00, 0x1b, 0x06, 0x07, 0x07, 0x24, 0x23, - 0x23, 0x1b, 0x11, 0x03, 0x2b, 0x2c, 0x06, 0x06, 0x00, 0x03, 0x2a, 0x00, - 0x50, 0x59, 0x2a, 0x2a, 0x20, 0x09, 0x20, 0x27, 0x50, 0x59, 0x20, 0x10, - 0x0b, 0x1e, 0x0e, 0x1c, 0x12, 0x0f, 0x0e, 0x18, 0x50, 0x59, 0x0e, 0x16, - 0x09, 0x03, 0x50, 0x59, 0x09, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, - 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x27, 0x0e, 0x01, 0x23, 0x22, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, - 0x11, 0x33, 0x15, 0x36, 0x33, 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x07, 0x03, 0xed, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, 0x61, - 0xfe, 0xa8, 0xf0, 0x7e, 0x33, 0xbf, 0x8f, 0xdc, 0xcb, 0xb5, 0x2d, 0x65, - 0x60, 0x90, 0x73, 0xb5, 0x7c, 0xb4, 0x01, 0xdd, 0xba, 0x0f, 0x90, 0x87, - 0x83, 0x99, 0x06, 0x01, 0xf7, 0xba, 0xca, 0x5e, 0x48, 0x2d, 0xff, 0x00, - 0x99, 0x50, 0x49, 0xb3, 0xca, 0x02, 0xd1, 0xfd, 0x52, 0x6d, 0x74, 0x34, - 0x7d, 0x98, 0x02, 0xae, 0x56, 0x6a, 0xfd, 0xc1, 0x18, 0x8a, 0xab, 0x9d, - 0xaf, 0x99, 0x00, 0x00, 0x00, 0x02, 0xff, 0x92, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xcc, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x6c, 0x40, 0x37, 0x25, 0x05, - 0x34, 0x34, 0x0c, 0x19, 0x18, 0x18, 0x0c, 0x12, 0x13, 0x13, 0x0c, 0x1f, - 0x20, 0x2e, 0x00, 0x00, 0x20, 0x0c, 0x03, 0x3a, 0x3b, 0x0f, 0x16, 0x23, - 0x1c, 0x16, 0x1c, 0x12, 0x20, 0x12, 0x20, 0x12, 0x19, 0x27, 0x05, 0x2b, - 0x02, 0x2b, 0x31, 0x50, 0x59, 0x2b, 0x10, 0x19, 0x00, 0x0a, 0x15, 0x02, - 0x37, 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x39, 0x39, 0x18, 0x2f, - 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x22, - 0x26, 0x27, 0x23, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, 0x35, 0x33, 0x15, 0x16, - 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, 0x27, 0x15, 0x14, 0x07, - 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfe, 0x72, 0x7b, 0xa3, - 0x33, 0x02, 0x08, 0x02, 0xae, 0x06, 0x1a, 0x1a, 0x27, 0x1b, 0x82, 0x02, - 0x6b, 0x54, 0x37, 0xb4, 0x1c, 0x14, 0x1f, 0x1a, 0x06, 0x82, 0x5a, 0x60, - 0x37, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xbd, 0x78, 0x87, 0x98, - 0x8b, 0x88, 0x99, 0x88, 0x79, 0x02, 0x22, 0xfd, 0xca, 0x59, 0x63, 0x1f, - 0x7f, 0x0a, 0x36, 0xa9, 0x03, 0xfc, 0x08, 0x30, 0x2f, 0x68, 0x7c, 0x05, - 0x69, 0xad, 0x07, 0x2f, 0x30, 0x72, 0x72, 0x06, 0x74, 0x41, 0x58, 0x68, - 0x5a, 0xfe, 0xec, 0xfe, 0xe2, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, 0xcb, 0xc9, - 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0xda, 0x05, 0xcc, 0x00, 0x2c, - 0x00, 0x38, 0x00, 0x66, 0x40, 0x34, 0x18, 0x0d, 0x00, 0x33, 0x33, 0x26, - 0x20, 0x21, 0x21, 0x1a, 0x26, 0x13, 0x14, 0x2d, 0x06, 0x06, 0x14, 0x26, - 0x03, 0x3a, 0x39, 0x28, 0x15, 0x10, 0x17, 0x24, 0x1d, 0x17, 0x1d, 0x14, - 0x21, 0x14, 0x21, 0x14, 0x1a, 0x00, 0x0b, 0x00, 0x08, 0x03, 0x08, 0x36, - 0x50, 0x59, 0x08, 0x10, 0x03, 0x30, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, - 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x3f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, 0x25, 0x0e, - 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, - 0x35, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, 0x35, - 0x33, 0x15, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, 0x27, - 0x11, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, 0x32, 0xa5, 0x7a, - 0xcd, 0xc1, 0x01, 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0x1a, 0x1a, 0x27, - 0x1b, 0x82, 0x02, 0x6b, 0x54, 0x37, 0xb4, 0x1c, 0x14, 0x1f, 0x1a, 0x06, - 0x82, 0x5a, 0x60, 0x37, 0x06, 0xac, 0x03, 0x07, 0xfd, 0xda, 0x78, 0x87, - 0x99, 0x8a, 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, - 0x18, 0x02, 0x36, 0x5a, 0x62, 0x79, 0xd0, 0x08, 0x30, 0x2f, 0x68, 0x7c, - 0x05, 0x69, 0xad, 0x07, 0x2f, 0x30, 0x72, 0x72, 0x06, 0xfc, 0x46, 0xa9, - 0x36, 0x10, 0x74, 0x2a, 0x01, 0x70, 0xe3, 0xc4, 0xd4, 0xdf, 0xd7, 0xc8, - 0xc9, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xbd, 0x00, 0x00, 0x02, 0x5a, - 0x05, 0xca, 0x00, 0x2b, 0x00, 0x6d, 0x40, 0x37, 0x06, 0x07, 0x07, 0x2a, - 0x23, 0x23, 0x2d, 0x13, 0x14, 0x14, 0x0d, 0x29, 0x01, 0x0c, 0x0c, 0x1d, - 0x1b, 0x19, 0x0d, 0x0d, 0x2c, 0x2d, 0x10, 0x17, 0x0a, 0x03, 0x17, 0x03, - 0x13, 0x07, 0x13, 0x07, 0x13, 0x29, 0x0c, 0x29, 0x00, 0x51, 0x59, 0x29, - 0x0f, 0x20, 0x25, 0x50, 0x59, 0x20, 0x00, 0x1c, 0x19, 0x51, 0x59, 0x1c, - 0x0f, 0x0c, 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, 0x27, 0x11, 0x23, 0x11, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, 0x11, 0x23, 0x35, 0x33, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, - 0x01, 0x33, 0x15, 0x01, 0x69, 0x1c, 0x14, 0x1f, 0x1a, 0x06, 0x82, 0x5a, - 0x60, 0x37, 0xb4, 0x1a, 0x1a, 0x27, 0x1b, 0x82, 0x02, 0x6b, 0x54, 0x37, - 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, 0x45, 0x3e, 0xd3, 0x03, - 0xb7, 0xfe, 0x6d, 0x07, 0x2f, 0x30, 0x72, 0x72, 0x06, 0xfe, 0x62, 0x01, - 0xe0, 0x08, 0x30, 0x2f, 0x68, 0x7c, 0x05, 0x01, 0x4f, 0x83, 0x7a, 0x94, - 0x82, 0x0c, 0x89, 0x08, 0x46, 0x5c, 0x61, 0x83, 0x00, 0x03, 0xff, 0xc7, - 0x00, 0x00, 0x06, 0xe4, 0x04, 0x4e, 0x00, 0x2f, 0x00, 0x39, 0x00, 0x42, - 0x00, 0x93, 0x40, 0x4d, 0x33, 0x2b, 0x2b, 0x26, 0x22, 0x2a, 0x1b, 0x00, - 0x39, 0x2f, 0x2f, 0x3d, 0x00, 0x3a, 0x14, 0x04, 0x04, 0x0c, 0x09, 0x05, - 0x05, 0x00, 0x2a, 0x03, 0x44, 0x43, 0x1b, 0x14, 0x1f, 0x2b, 0x15, 0x1f, - 0x36, 0x50, 0x59, 0x1f, 0x10, 0x2e, 0x30, 0x30, 0x01, 0x3c, 0x3c, 0x3a, - 0x06, 0x0c, 0x0c, 0x03, 0x3a, 0x29, 0x2c, 0x2c, 0x23, 0x32, 0x25, 0x3a, - 0x32, 0x08, 0x08, 0x32, 0x3a, 0x25, 0x04, 0x18, 0x00, 0x18, 0x40, 0x50, - 0x59, 0x18, 0x10, 0x0f, 0x0f, 0x04, 0x15, 0x00, 0x15, 0x00, 0x3f, 0x3f, - 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, - 0x2f, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x24, 0x27, 0x11, 0x23, 0x11, - 0x06, 0x15, 0x23, 0x34, 0x36, 0x37, 0x35, 0x34, 0x27, 0x33, 0x1e, 0x02, - 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x33, - 0x32, 0x16, 0x1d, 0x01, 0x36, 0x35, 0x33, 0x14, 0x06, 0x07, 0x11, 0x23, - 0x11, 0x26, 0x25, 0x19, 0x01, 0x04, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x25, 0x16, 0x05, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, - 0x00, 0xfe, 0xd0, 0x8f, 0xb3, 0x45, 0x82, 0x6d, 0x5a, 0x06, 0xaa, 0x01, - 0x02, 0x03, 0x02, 0x03, 0x3a, 0x96, 0x6c, 0x7b, 0x8f, 0x1c, 0x03, 0x38, - 0x9f, 0x71, 0xa4, 0x95, 0x3f, 0x82, 0x62, 0x5f, 0xb2, 0xa9, 0xfe, 0xea, - 0x01, 0x2d, 0x92, 0x56, 0x70, 0x76, 0x83, 0xfd, 0x8f, 0xa7, 0x01, 0x18, - 0x56, 0x70, 0x74, 0x83, 0x01, 0xac, 0x3a, 0x0d, 0xfe, 0x0d, 0x01, 0xf0, - 0x18, 0x52, 0x58, 0x85, 0x14, 0xdc, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, - 0x73, 0x5a, 0x62, 0x6b, 0x6d, 0x60, 0xb2, 0xcb, 0xf6, 0x24, 0x7c, 0x77, - 0x9f, 0x17, 0xfe, 0xb2, 0x01, 0x48, 0x0d, 0x34, 0xfe, 0x77, 0x02, 0x11, - 0x39, 0x0c, 0xe2, 0x9d, 0x78, 0xaf, 0xa1, 0x06, 0x0d, 0x37, 0x79, 0x9d, - 0x78, 0xb0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb3, 0x00, 0x00, 0x04, 0xbe, - 0x04, 0x4e, 0x00, 0x27, 0x00, 0x33, 0x00, 0x68, 0x40, 0x35, 0x2d, 0x00, - 0x00, 0x23, 0x1f, 0x27, 0x28, 0x14, 0x07, 0x07, 0x10, 0x0d, 0x08, 0x27, - 0x08, 0x35, 0x34, 0x18, 0x1c, 0x00, 0x26, 0x01, 0x01, 0x20, 0x2c, 0x06, - 0x09, 0x09, 0x28, 0x10, 0x0d, 0x2c, 0x10, 0x23, 0x23, 0x10, 0x2c, 0x0d, - 0x04, 0x07, 0x1c, 0x1c, 0x31, 0x50, 0x59, 0x1c, 0x10, 0x14, 0x0f, 0x07, - 0x15, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, - 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x37, 0x35, 0x34, 0x27, 0x33, 0x1e, - 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x36, 0x35, - 0x33, 0x14, 0x06, 0x07, 0x11, 0x01, 0x16, 0x17, 0x16, 0x17, 0x35, 0x34, - 0x2e, 0x01, 0x23, 0x22, 0x06, 0x03, 0x39, 0x41, 0x82, 0x7f, 0x7b, 0x3a, - 0xb4, 0x2c, 0x2d, 0x82, 0x7a, 0x61, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, - 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x4e, 0x82, 0x6f, 0x61, 0xfd, 0x54, - 0x5f, 0xaa, 0xaf, 0x3f, 0x2a, 0x5c, 0x59, 0x82, 0x96, 0x01, 0x4d, 0x0a, - 0x28, 0x2e, 0x2d, 0x0e, 0xfe, 0x18, 0x01, 0xf2, 0x0b, 0x3b, 0x26, 0x5d, - 0x87, 0x10, 0xd9, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, - 0xcc, 0xf7, 0x24, 0x7d, 0x77, 0x9d, 0x18, 0xfe, 0xb1, 0x02, 0x70, 0x14, - 0x3d, 0x3f, 0x0d, 0xdb, 0x6b, 0x76, 0x34, 0xb3, 0x00, 0x02, 0xff, 0x96, - 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x4d, 0x00, 0x2e, 0x00, 0x3b, 0x00, 0x5d, - 0x40, 0x30, 0x2f, 0x00, 0x36, 0x24, 0x07, 0x14, 0x14, 0x20, 0x1c, 0x15, - 0x15, 0x0e, 0x00, 0x03, 0x3d, 0x3c, 0x28, 0x04, 0x2c, 0x02, 0x2c, 0x32, - 0x50, 0x59, 0x2c, 0x10, 0x23, 0x0f, 0x18, 0x1f, 0x0a, 0x11, 0x1f, 0x11, - 0x1c, 0x0e, 0x1c, 0x0e, 0x1c, 0x02, 0x14, 0x1b, 0x02, 0x39, 0x50, 0x59, - 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x3f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, - 0x22, 0x27, 0x23, 0x16, 0x1d, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, - 0x14, 0x06, 0x23, 0x22, 0x27, 0x15, 0x23, 0x35, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, - 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, - 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0xfe, 0x72, - 0xfa, 0x56, 0x05, 0x04, 0x20, 0x14, 0x1f, 0x1a, 0x06, 0x82, 0x5a, 0x60, - 0x18, 0x23, 0xb4, 0x17, 0x19, 0x27, 0x1b, 0x82, 0x02, 0x6b, 0x54, 0x33, - 0x06, 0xae, 0x01, 0x04, 0x05, 0x04, 0x30, 0x9e, 0x81, 0xc8, 0xc6, 0xbd, - 0x7a, 0x85, 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x86, 0x7b, 0x02, 0x22, 0xfd, - 0xca, 0xbc, 0x08, 0xa2, 0xac, 0x08, 0x2f, 0x30, 0x72, 0x72, 0x08, 0x76, - 0xb7, 0x07, 0x30, 0x2f, 0x68, 0x7c, 0x04, 0x03, 0xc7, 0xa7, 0x36, 0x04, - 0x31, 0x66, 0x13, 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xdd, 0xe2, 0xc2, 0x5a, - 0xbf, 0x99, 0xd5, 0xca, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9e, - 0x00, 0x00, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x2a, 0x00, 0x4c, 0x40, 0x26, - 0x1e, 0x11, 0x2a, 0x2a, 0x0b, 0x07, 0x00, 0x00, 0x24, 0x18, 0x03, 0x2c, - 0x2b, 0x11, 0x0e, 0x2a, 0x03, 0x0a, 0x27, 0x20, 0x0a, 0x20, 0x06, 0x24, - 0x06, 0x24, 0x06, 0x15, 0x2a, 0x15, 0x15, 0x1a, 0x53, 0x59, 0x15, 0x10, - 0x0e, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x33, 0x11, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, - 0x33, 0x17, 0x11, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, 0x01, 0x33, - 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, 0x22, 0x27, 0x11, 0x8e, 0x18, 0x14, - 0x27, 0x1b, 0x82, 0x02, 0x6b, 0x54, 0x2f, 0x06, 0xaa, 0x08, 0x04, 0x2b, - 0x70, 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x19, 0x1f, 0x1f, 0x1a, - 0x06, 0x82, 0x5a, 0x60, 0x1c, 0x23, 0x01, 0x83, 0x06, 0x30, 0x2f, 0x68, - 0x7c, 0x04, 0x01, 0x34, 0x72, 0x8a, 0xb8, 0x25, 0x8b, 0x66, 0x0a, 0xa5, - 0x0a, 0xc1, 0xb4, 0x6d, 0x09, 0x2f, 0x30, 0x72, 0x72, 0x08, 0xfe, 0xbf, - 0x00, 0x01, 0xff, 0x9e, 0x00, 0x00, 0x02, 0x88, 0x04, 0x4e, 0x00, 0x25, - 0x00, 0x41, 0x40, 0x20, 0x0c, 0x19, 0x19, 0x21, 0x00, 0x1a, 0x1a, 0x13, - 0x07, 0x03, 0x27, 0x26, 0x1d, 0x24, 0x16, 0x0f, 0x24, 0x0f, 0x21, 0x13, - 0x21, 0x13, 0x21, 0x04, 0x19, 0x15, 0x04, 0x09, 0x53, 0x59, 0x04, 0x10, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x01, 0x33, - 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, 0x8e, 0x5c, 0xbe, - 0x80, 0x3b, 0x25, 0x24, 0x3c, 0x7c, 0x6e, 0x19, 0x1f, 0x1f, 0x1a, 0x06, - 0x82, 0x5a, 0x60, 0x1c, 0x23, 0xb0, 0x18, 0x14, 0x27, 0x1b, 0x82, 0x02, - 0x6b, 0x54, 0x2f, 0x02, 0xae, 0x80, 0xba, 0x66, 0x0a, 0xa5, 0x0a, 0x8b, - 0xa8, 0xaf, 0x09, 0x2f, 0x30, 0x72, 0x72, 0x08, 0xfe, 0xbf, 0x01, 0x83, - 0x06, 0x30, 0x2f, 0x68, 0x7c, 0x04, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf9, - 0xff, 0xec, 0x03, 0xf6, 0x04, 0x4b, 0x00, 0x37, 0x00, 0x51, 0x40, 0x29, - 0x28, 0x19, 0x17, 0x06, 0x1b, 0x36, 0x34, 0x21, 0x0d, 0x00, 0x1b, 0x00, - 0x38, 0x39, 0x19, 0x16, 0x14, 0x14, 0x36, 0x34, 0x30, 0x0d, 0x30, 0x28, - 0x03, 0x1e, 0x03, 0x1e, 0x25, 0x50, 0x59, 0x22, 0x1e, 0x10, 0x03, 0x0a, - 0x50, 0x59, 0x07, 0x03, 0x16, 0x00, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, - 0x01, 0x2e, 0x01, 0x23, 0x22, 0x15, 0x23, 0x36, 0x37, 0x26, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, - 0x14, 0x1e, 0x02, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, - 0x07, 0x16, 0x03, 0xb6, 0xe7, 0xd0, 0xca, 0xdb, 0x21, 0x9f, 0x17, 0x90, - 0x80, 0x89, 0x7f, 0x54, 0x67, 0x80, 0x55, 0x86, 0x2b, 0x4b, 0x82, 0x04, - 0x86, 0x1f, 0xd3, 0xca, 0xb3, 0xd3, 0x1c, 0xa2, 0x0f, 0x83, 0x6e, 0x7a, - 0x74, 0x2b, 0x4d, 0x6c, 0x41, 0x4b, 0x8a, 0x2f, 0x1b, 0x17, 0x06, 0x82, - 0x61, 0x21, 0x01, 0x2b, 0x99, 0xa6, 0x85, 0x8d, 0x1f, 0x57, 0x51, 0x54, - 0x54, 0x3e, 0x4c, 0x1d, 0x25, 0x1a, 0x28, 0x69, 0xb2, 0x29, 0x35, 0x4a, - 0x94, 0x9b, 0x7e, 0x8b, 0x14, 0x48, 0x4d, 0x4a, 0x4b, 0x29, 0x37, 0x28, - 0x1f, 0x12, 0x15, 0x28, 0x1e, 0x33, 0xa7, 0x2c, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xb2, 0xff, 0xf0, 0x02, 0x4b, 0x05, 0x2c, 0x00, 0x2c, - 0x00, 0x60, 0x40, 0x30, 0x20, 0x16, 0x2c, 0x19, 0x15, 0x27, 0x27, 0x12, - 0x0f, 0x0a, 0x04, 0x2c, 0x04, 0x2e, 0x2d, 0x06, 0x0d, 0x23, 0x1c, 0x0d, - 0x1c, 0x0a, 0x1f, 0x0a, 0x1f, 0x0a, 0x15, 0x02, 0x15, 0x18, 0x51, 0x59, - 0x14, 0x40, 0x15, 0x0f, 0x12, 0x0f, 0x51, 0x59, 0x12, 0x0f, 0x02, 0x2a, - 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x1a, 0xcd, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, - 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x25, 0x06, 0x23, 0x22, 0x35, 0x11, 0x27, 0x22, 0x06, 0x15, - 0x23, 0x3e, 0x01, 0x33, 0x17, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, - 0x33, 0x15, 0x23, 0x11, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x02, - 0x2a, 0x59, 0x5d, 0xd8, 0x26, 0x27, 0x1b, 0x82, 0x02, 0x6b, 0x54, 0x29, - 0x7d, 0x84, 0x35, 0x78, 0xc8, 0xc8, 0x05, 0x33, 0x02, 0x1f, 0x1a, 0x06, - 0x82, 0x5a, 0x60, 0x05, 0x3a, 0x02, 0x33, 0x3f, 0x24, 0x44, 0x08, 0x18, - 0xf5, 0x01, 0x16, 0x05, 0x30, 0x2f, 0x68, 0x7c, 0x03, 0x01, 0x35, 0x83, - 0xf2, 0xf2, 0x83, 0xfe, 0x88, 0x02, 0x08, 0x2f, 0x30, 0x72, 0x72, 0x07, - 0x02, 0xad, 0x4e, 0x3f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, - 0x00, 0x00, 0x03, 0xb6, 0x04, 0x3a, 0x00, 0x21, 0x00, 0x5b, 0x40, 0x30, - 0x08, 0x13, 0x02, 0x19, 0x04, 0x1f, 0x0e, 0x0e, 0x03, 0x07, 0x1f, 0x14, - 0x18, 0x04, 0x18, 0x15, 0x07, 0x04, 0x22, 0x23, 0x18, 0x15, 0x16, 0x15, - 0x50, 0x59, 0x0a, 0x11, 0x00, 0x1b, 0x11, 0x1b, 0x0e, 0x1f, 0x0e, 0x1f, - 0x0e, 0x05, 0x16, 0x0f, 0x07, 0x04, 0x05, 0x04, 0x50, 0x59, 0x05, 0x15, - 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x22, 0x27, 0x01, 0x21, 0x15, 0x21, - 0x35, 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x32, - 0x17, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, - 0x33, 0x14, 0x06, 0x02, 0xe2, 0x33, 0xa4, 0xfe, 0xf0, 0x02, 0xbb, 0xfc, - 0x7b, 0x01, 0x33, 0x38, 0x1c, 0x27, 0x1e, 0x82, 0x02, 0x6f, 0x55, 0x35, - 0x7e, 0x01, 0x04, 0xfd, 0x93, 0x03, 0x38, 0xfe, 0xd6, 0x4a, 0x2a, 0x1f, - 0x1a, 0x06, 0x82, 0x5a, 0x01, 0xaf, 0x27, 0xfe, 0xb5, 0x8b, 0x89, 0x01, - 0x77, 0x0d, 0x30, 0x2f, 0x68, 0x7c, 0x20, 0x01, 0x3d, 0x8b, 0x89, 0xfe, - 0x95, 0x13, 0x30, 0x30, 0x72, 0x72, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, - 0xfe, 0x57, 0x04, 0x20, 0x04, 0x4b, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x4b, - 0x40, 0x26, 0x26, 0x03, 0x10, 0x1f, 0x0a, 0x17, 0x17, 0x1a, 0x1c, 0x10, - 0x1c, 0x2e, 0x2d, 0x0d, 0x29, 0x50, 0x59, 0x16, 0x0a, 0x0d, 0x0d, 0x13, - 0x00, 0x13, 0x23, 0x50, 0x59, 0x1a, 0x1a, 0x13, 0x1b, 0x00, 0x07, 0x50, - 0x59, 0x04, 0x00, 0x10, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x39, 0x39, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x31, 0x30, 0x01, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x20, - 0x11, 0x15, 0x33, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, - 0x26, 0x27, 0x23, 0x14, 0x07, 0x23, 0x36, 0x35, 0x11, 0x10, 0x13, 0x14, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, - 0x02, 0x52, 0xb1, 0xd2, 0x1e, 0xb5, 0x12, 0x7b, 0x64, 0xfe, 0xf3, 0x03, - 0x69, 0xf2, 0xc7, 0xbb, 0xc9, 0xcd, 0x73, 0xa9, 0x2e, 0x04, 0x0a, 0xab, - 0x06, 0xb3, 0x48, 0x83, 0x53, 0x8a, 0x7e, 0x76, 0x8f, 0x55, 0x84, 0x48, - 0x04, 0x4b, 0x8b, 0x80, 0x1a, 0x4b, 0x51, 0xfe, 0xc5, 0xae, 0xd1, 0xfe, - 0xf8, 0xfe, 0xe5, 0xfe, 0xe1, 0xfe, 0xef, 0x69, 0x61, 0x66, 0x53, 0x36, - 0xaa, 0x03, 0x3b, 0x01, 0xc8, 0xfc, 0x3a, 0x84, 0xbf, 0x65, 0xc8, 0xe0, - 0xde, 0xc2, 0x64, 0xbb, 0x00, 0x01, 0x00, 0x62, 0x01, 0xdb, 0x02, 0xa9, - 0x04, 0xa8, 0x00, 0x0b, 0x00, 0x3f, 0x40, 0x21, 0x07, 0x03, 0x03, 0x04, - 0x08, 0x00, 0x00, 0x0b, 0x04, 0x0b, 0x0c, 0x0d, 0x07, 0x02, 0xe4, 0x59, - 0x07, 0x40, 0x09, 0x0c, 0x48, 0x07, 0x07, 0x06, 0x0b, 0x03, 0x03, 0x0b, - 0xe8, 0x09, 0x09, 0x06, 0xeb, 0x00, 0x3f, 0x33, 0x2f, 0x3f, 0x33, 0x2f, - 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, - 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x02, 0x31, 0xfe, - 0xa8, 0x77, 0x77, 0x01, 0x58, 0x78, 0x01, 0xdb, 0x01, 0x43, 0xfe, 0xbd, - 0x02, 0xcd, 0xfe, 0xd8, 0x01, 0x28, 0xfd, 0x33, 0x00, 0x02, 0x00, 0x4d, - 0xfe, 0x57, 0x04, 0x2f, 0x04, 0x3a, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x51, - 0x40, 0x2a, 0x0f, 0x2a, 0x2a, 0x19, 0x0b, 0x12, 0x12, 0x04, 0x07, 0x24, - 0x0c, 0x00, 0x00, 0x07, 0x19, 0x03, 0x2e, 0x2d, 0x04, 0x21, 0x50, 0x59, - 0x12, 0x0d, 0x04, 0x04, 0x1d, 0x0d, 0x1d, 0x27, 0x50, 0x59, 0x1d, 0x1b, - 0x0f, 0x0c, 0x0d, 0x0c, 0x50, 0x59, 0x0d, 0x0f, 0x00, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x12, - 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x34, 0x3e, - 0x01, 0x33, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x21, 0x35, 0x21, - 0x15, 0x05, 0x06, 0x15, 0x14, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x01, 0x23, - 0x22, 0x2e, 0x01, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x4d, 0x7e, 0xde, 0x83, 0x20, 0x29, 0x2b, 0x39, 0xb1, - 0xfd, 0xab, 0x03, 0x25, 0xfe, 0xf5, 0x2d, 0x3d, 0x5d, 0x6b, 0x5d, 0x3d, - 0x80, 0xe7, 0x8e, 0x8f, 0xe3, 0x7b, 0x01, 0xed, 0x9a, 0xa3, 0xa5, 0x98, - 0x9b, 0xaa, 0xa9, 0x38, 0x88, 0xda, 0x79, 0x20, 0x3c, 0x26, 0x29, 0x3c, - 0x2c, 0x89, 0x8b, 0x87, 0xdd, 0x24, 0x1d, 0x1c, 0x36, 0x43, 0x55, 0x74, - 0x9a, 0x65, 0x8e, 0xdb, 0x78, 0x77, 0xdb, 0x01, 0xe5, 0xb1, 0xa5, 0xa7, - 0xb4, 0xb6, 0xa5, 0xa4, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, - 0xff, 0xc7, 0x05, 0xba, 0x05, 0xeb, 0x00, 0x33, 0x00, 0x86, 0x40, 0x48, - 0x1c, 0x1b, 0x14, 0x15, 0x13, 0x10, 0x10, 0x25, 0x25, 0x26, 0x0b, 0x0e, - 0x0e, 0x2c, 0x26, 0x09, 0x0d, 0x0d, 0x33, 0x06, 0x04, 0x02, 0x02, 0x26, - 0x13, 0x1b, 0x04, 0x35, 0x34, 0x0d, 0x00, 0x09, 0x32, 0x2f, 0x2f, 0x2a, - 0x50, 0x59, 0x2f, 0x16, 0x25, 0x15, 0x27, 0x0e, 0x12, 0x03, 0x17, 0x1c, - 0x15, 0x17, 0x21, 0x50, 0x59, 0x17, 0x10, 0x13, 0x10, 0x00, 0x09, 0x0c, - 0x51, 0x59, 0x08, 0x40, 0x09, 0x0f, 0x06, 0x03, 0x51, 0x59, 0x06, 0x0f, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, 0xcd, 0x2b, 0x00, 0x18, 0x3f, - 0xc6, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x2b, - 0x00, 0x18, 0x10, 0xc6, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x32, 0x11, 0x33, 0x31, 0x30, - 0x37, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x15, - 0x23, 0x11, 0x01, 0x11, 0x33, 0x11, 0x07, 0x01, 0x33, 0x01, 0x36, 0x33, - 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x23, 0x11, 0x03, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, - 0x22, 0x27, 0x07, 0x23, 0xb3, 0x0c, 0x7d, 0x84, 0x35, 0x78, 0xc4, 0xc4, - 0x00, 0xff, 0xb4, 0x02, 0x01, 0x5d, 0xa1, 0xfe, 0xdb, 0x39, 0x45, 0xb0, - 0xa7, 0xb5, 0x2a, 0x60, 0x55, 0x7f, 0x99, 0xb4, 0xeb, 0x1b, 0x43, 0x24, - 0x44, 0x59, 0x5d, 0x49, 0x30, 0x2e, 0xa1, 0x7d, 0x2d, 0x3b, 0x02, 0xd2, - 0x83, 0xf2, 0xf2, 0x83, 0xfd, 0xbb, 0x01, 0x75, 0x02, 0xe5, 0xfe, 0x7e, - 0x5e, 0x01, 0xff, 0xfe, 0x54, 0x0f, 0xaf, 0xce, 0xfd, 0x2f, 0x02, 0xae, - 0x72, 0x6f, 0x34, 0xb0, 0x95, 0xfd, 0x82, 0x01, 0xfc, 0xfe, 0xa9, 0x26, - 0x0e, 0x85, 0x18, 0x1b, 0x44, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1a, - 0x00, 0x00, 0x01, 0xad, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x32, 0x40, 0x18, - 0x0b, 0x01, 0x09, 0x09, 0x06, 0x04, 0x08, 0x08, 0x0d, 0x0c, 0x07, 0x0b, - 0x00, 0x0b, 0x50, 0x59, 0x04, 0x00, 0x00, 0x02, 0x09, 0x15, 0x02, 0x0f, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, - 0x1a, 0x6d, 0xb4, 0x72, 0x72, 0xb4, 0x6d, 0x02, 0x69, 0x01, 0xd1, 0xfe, - 0x2f, 0x85, 0xfe, 0x1c, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1a, - 0x00, 0x00, 0x01, 0xad, 0x04, 0x3a, 0x12, 0x06, 0x05, 0x9b, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x1e, 0xfe, 0x57, 0x04, 0x69, 0x04, 0x4d, 0x00, 0x1e, - 0x00, 0x25, 0x00, 0x2c, 0x00, 0x6c, 0x40, 0x37, 0x2a, 0x22, 0x22, 0x11, - 0x10, 0x13, 0x29, 0x23, 0x05, 0x1b, 0x1b, 0x1e, 0x01, 0x1c, 0x13, 0x1c, - 0x2e, 0x2d, 0x1b, 0x1b, 0x23, 0x13, 0x1e, 0x00, 0x40, 0x29, 0x29, 0x10, - 0x17, 0x15, 0x09, 0x0d, 0x0f, 0x00, 0x01, 0x0b, 0x03, 0x00, 0x00, 0x15, - 0x0d, 0x15, 0x1f, 0x50, 0x59, 0x15, 0x16, 0x0d, 0x26, 0x50, 0x59, 0x0d, - 0x10, 0x05, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x12, 0x39, 0x12, 0x39, - 0x33, 0x33, 0x2f, 0x1a, 0x10, 0xcd, 0x32, 0x32, 0x3f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, 0x35, 0x34, 0x27, 0x33, - 0x1e, 0x02, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x33, 0x15, - 0x23, 0x02, 0x21, 0x22, 0x27, 0x23, 0x16, 0x15, 0x11, 0x23, 0x11, 0x23, - 0x01, 0x32, 0x36, 0x37, 0x21, 0x1e, 0x01, 0x13, 0x22, 0x06, 0x07, 0x21, - 0x2e, 0x01, 0x1e, 0x6c, 0x06, 0xae, 0x01, 0x04, 0x05, 0x04, 0x30, 0x9e, - 0x81, 0xbb, 0xc5, 0x0c, 0x4e, 0x4d, 0x17, 0xfe, 0x8a, 0xfa, 0x56, 0x05, - 0x04, 0xb4, 0x6c, 0x02, 0x41, 0x7d, 0x7c, 0x07, 0xfd, 0xdf, 0x08, 0x8b, - 0x90, 0x8e, 0x87, 0x0b, 0x02, 0x1d, 0x09, 0x7b, 0x02, 0x69, 0xf4, 0xa7, - 0x36, 0x04, 0x31, 0x66, 0x13, 0x64, 0x5d, 0xeb, 0xf9, 0x85, 0xfe, 0x08, - 0xbc, 0x08, 0xa2, 0xfe, 0x59, 0x03, 0x8d, 0xfe, 0x8d, 0xad, 0xc6, 0xc1, - 0xb2, 0x03, 0x51, 0xae, 0xab, 0xb7, 0xa2, 0x00, 0x00, 0x02, 0x00, 0x1e, - 0xff, 0xec, 0x04, 0x42, 0x04, 0x3a, 0x00, 0x14, 0x00, 0x1d, 0x00, 0x55, - 0x40, 0x2b, 0x05, 0x18, 0x18, 0x0a, 0x08, 0x0c, 0x04, 0x1b, 0x1b, 0x14, - 0x01, 0x12, 0x0c, 0x12, 0x1f, 0x1e, 0x1a, 0x0b, 0x14, 0x00, 0x14, 0x50, - 0x59, 0x08, 0x04, 0x0f, 0x00, 0x01, 0x0b, 0x03, 0x00, 0x00, 0x0f, 0x02, - 0x0f, 0x15, 0x50, 0x59, 0x0f, 0x16, 0x06, 0x02, 0x0f, 0x00, 0x3f, 0x33, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, - 0x23, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x01, 0x32, - 0x36, 0x3d, 0x01, 0x21, 0x15, 0x14, 0x16, 0x1e, 0x67, 0xb5, 0x01, 0xee, - 0xb5, 0x65, 0x65, 0xe2, 0xcc, 0xc9, 0xe1, 0x67, 0x02, 0x12, 0x81, 0x77, - 0xfe, 0x12, 0x77, 0x02, 0x69, 0x01, 0xd1, 0xfe, 0x2f, 0x01, 0xd1, 0xfe, - 0x2f, 0x85, 0x7b, 0xb7, 0xc6, 0xc5, 0xb8, 0x7b, 0xfe, 0x93, 0x8a, 0x8b, - 0x58, 0x58, 0x8d, 0x88, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xec, 0x04, 0x82, - 0x04, 0x3a, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x6b, 0x40, 0x38, 0x0c, 0x27, - 0x27, 0x17, 0x16, 0x12, 0x0b, 0x2a, 0x2a, 0x13, 0x0f, 0x08, 0x04, 0x04, - 0x1b, 0x23, 0x05, 0x01, 0x21, 0x1b, 0x21, 0x2e, 0x2d, 0x29, 0x19, 0x23, - 0x00, 0x23, 0x50, 0x59, 0x16, 0x0b, 0x0f, 0x00, 0x01, 0x0b, 0x03, 0x00, - 0x00, 0x1e, 0x06, 0x1e, 0x24, 0x50, 0x59, 0x1e, 0x16, 0x13, 0x05, 0x06, - 0x05, 0x50, 0x59, 0x10, 0x06, 0x0f, 0x00, 0x3f, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x12, 0x17, 0x39, 0x33, 0x11, 0x33, 0x32, - 0x32, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, 0x3e, 0x01, 0x37, - 0x21, 0x35, 0x21, 0x15, 0x0e, 0x01, 0x07, 0x21, 0x2e, 0x01, 0x27, 0x35, - 0x21, 0x15, 0x21, 0x1e, 0x01, 0x17, 0x33, 0x15, 0x23, 0x17, 0x15, 0x14, - 0x00, 0x23, 0x22, 0x00, 0x3d, 0x01, 0x23, 0x01, 0x32, 0x36, 0x3d, 0x01, - 0x21, 0x15, 0x14, 0x16, 0x0a, 0x5d, 0x16, 0x5b, 0x69, 0xfe, 0xf8, 0x01, - 0xc6, 0x4e, 0x77, 0x1b, 0x02, 0x4d, 0x1b, 0x77, 0x4e, 0x01, 0xc7, 0xfe, - 0xf7, 0x67, 0x5c, 0x16, 0x5f, 0x4c, 0x01, 0xfe, 0xf2, 0xe4, 0xe1, 0xfe, - 0xf0, 0x4a, 0x02, 0x3b, 0x8f, 0xa8, 0xfd, 0x93, 0xa7, 0x02, 0x69, 0x51, - 0x8f, 0x66, 0x8b, 0x8b, 0x26, 0xa6, 0x7a, 0x79, 0xa7, 0x26, 0x8b, 0x8b, - 0x65, 0x8f, 0x52, 0x85, 0x12, 0x12, 0xd1, 0xfe, 0xfd, 0x01, 0x00, 0xd4, - 0x24, 0xfe, 0x97, 0xbe, 0x9f, 0x0c, 0x0c, 0x9f, 0xbe, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x1d, 0x05, 0xcc, 0x00, 0x24, - 0x00, 0x30, 0x00, 0x53, 0x40, 0x2c, 0x25, 0x1c, 0x12, 0x2b, 0x2b, 0x19, - 0x08, 0x03, 0x0c, 0x0c, 0x00, 0x19, 0x00, 0x19, 0x32, 0x31, 0x02, 0x12, - 0x1e, 0x03, 0x22, 0x0f, 0x22, 0x28, 0x50, 0x59, 0x22, 0x10, 0x1b, 0x00, - 0x17, 0x15, 0x0f, 0x2e, 0x50, 0x59, 0x0f, 0x16, 0x05, 0x0a, 0x50, 0x59, - 0x05, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x32, 0x31, 0x30, 0x01, 0x10, 0x07, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x3d, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x23, 0x14, - 0x06, 0x07, 0x23, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0x5e, 0xfe, 0xe7, 0x3b, 0x49, 0x32, - 0x45, 0x7d, 0x3f, 0x48, 0x7b, 0xa3, 0x33, 0x02, 0x08, 0x02, 0xae, 0x06, - 0xb4, 0x04, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0xbd, 0x78, 0x87, 0x98, - 0x8b, 0x88, 0x99, 0x88, 0x79, 0x02, 0x22, 0xfe, 0xee, 0x8f, 0xfe, 0xfe, - 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x94, 0x77, 0x14, 0x59, 0x63, 0x1f, 0x7f, - 0x0a, 0x36, 0xa9, 0x04, 0xed, 0xfe, 0x59, 0x41, 0x58, 0x68, 0x5a, 0xfe, - 0xec, 0xfe, 0xe2, 0xe3, 0xc4, 0xd0, 0xe2, 0xd5, 0xcb, 0xc9, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x42, 0x05, 0xcc, 0x00, 0x20, - 0x00, 0x2c, 0x00, 0x57, 0x40, 0x2f, 0x0e, 0x00, 0x27, 0x27, 0x10, 0x10, - 0x1c, 0x1c, 0x12, 0x21, 0x06, 0x06, 0x17, 0x12, 0x03, 0x2e, 0x2d, 0x1d, - 0x10, 0x50, 0x59, 0x1d, 0x15, 0x14, 0x19, 0x50, 0x59, 0x14, 0x1b, 0x0e, - 0x00, 0x0b, 0x00, 0x08, 0x03, 0x08, 0x2a, 0x50, 0x59, 0x08, 0x10, 0x03, - 0x24, 0x50, 0x59, 0x03, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x25, 0x0e, 0x01, 0x23, 0x22, - 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, 0x17, 0x33, 0x27, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3d, 0x01, - 0x23, 0x2e, 0x01, 0x35, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, - 0x8e, 0x7b, 0xa4, 0x32, 0x02, 0x02, 0xb4, 0x59, 0xfe, 0xe7, 0x3b, 0x49, - 0x32, 0x45, 0x7d, 0x56, 0x03, 0x07, 0xfd, 0xda, 0x78, 0x87, 0x99, 0x8a, - 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, - 0x36, 0x5a, 0x62, 0x79, 0x01, 0xc1, 0xfa, 0xcf, 0xfe, 0xe4, 0xfe, 0xd8, - 0x10, 0xa0, 0x12, 0x94, 0x77, 0x10, 0x74, 0x2a, 0x01, 0x70, 0xe3, 0xc4, - 0xd4, 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, - 0xfe, 0x57, 0x02, 0x3c, 0x05, 0xca, 0x00, 0x21, 0x00, 0x50, 0x40, 0x2c, - 0x20, 0x19, 0x19, 0x0c, 0x03, 0x10, 0x01, 0x0e, 0x08, 0x0e, 0x03, 0x03, - 0x23, 0x22, 0x1f, 0x00, 0x51, 0x59, 0x1f, 0x0f, 0x16, 0x1b, 0x50, 0x59, - 0x16, 0x00, 0x12, 0x0f, 0x51, 0x59, 0x12, 0x0f, 0x0e, 0x02, 0x50, 0x59, - 0x0e, 0x15, 0x05, 0x0a, 0x50, 0x59, 0x05, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x32, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x33, 0x11, 0x10, 0x21, - 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3d, 0x01, 0x23, 0x11, 0x23, 0x35, - 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, - 0x1d, 0x01, 0x33, 0x15, 0x01, 0x69, 0x54, 0xfe, 0xe7, 0x36, 0x45, 0x2f, - 0x3f, 0x7d, 0x5f, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, 0x45, - 0x3e, 0xd3, 0x03, 0xb7, 0xfc, 0xe4, 0xfe, 0xe4, 0xfe, 0xd8, 0x0f, 0xa0, - 0x11, 0x94, 0x77, 0x03, 0xb7, 0x83, 0x7a, 0x94, 0x82, 0x0c, 0x89, 0x08, - 0x46, 0x5c, 0x61, 0x83, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x05, 0x95, - 0x04, 0x4b, 0x00, 0x2e, 0x00, 0x3c, 0x00, 0x77, 0x40, 0x40, 0x05, 0x29, - 0x28, 0x00, 0x07, 0x07, 0x2f, 0x20, 0x12, 0x36, 0x0c, 0x1a, 0x1a, 0x12, - 0x29, 0x03, 0x3e, 0x3d, 0x25, 0x0f, 0x28, 0x06, 0x50, 0x59, 0x20, 0x1d, - 0x13, 0x17, 0x28, 0x28, 0x1d, 0x17, 0x1d, 0x33, 0x50, 0x59, 0x1d, 0x10, - 0x17, 0x39, 0x50, 0x59, 0x17, 0x15, 0x2c, 0x02, 0x50, 0x59, 0x2c, 0x2c, - 0x09, 0x09, 0x10, 0x50, 0x59, 0x35, 0x0d, 0x01, 0x26, 0x0d, 0x01, 0x0d, - 0x09, 0x1b, 0x00, 0x3f, 0x33, 0x5d, 0x5d, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x2b, 0x00, 0x18, 0x3f, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x16, 0x33, 0x32, 0x3d, - 0x01, 0x21, 0x15, 0x10, 0x21, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, - 0x20, 0x11, 0x35, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, - 0x33, 0x32, 0x16, 0x17, 0x33, 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x11, - 0x21, 0x11, 0x10, 0x21, 0x22, 0x27, 0x03, 0x34, 0x2e, 0x01, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x04, 0x2b, 0x2d, 0x28, - 0x76, 0xfe, 0xf3, 0xfe, 0x3b, 0xb1, 0xd2, 0x1e, 0xb5, 0x12, 0x7b, 0x64, - 0x01, 0x0d, 0x02, 0x33, 0xb2, 0x77, 0xc7, 0xbb, 0xc9, 0xcd, 0x73, 0xa9, - 0x2e, 0x02, 0x08, 0x04, 0xab, 0x06, 0x01, 0xac, 0xfe, 0xed, 0x29, 0x2e, - 0xf5, 0x48, 0x83, 0x53, 0x8a, 0x7e, 0x76, 0x8f, 0x55, 0x84, 0x48, 0x93, - 0x0a, 0x97, 0x8b, 0x66, 0xfe, 0x38, 0x8b, 0x80, 0x1a, 0x4b, 0x51, 0x01, - 0x3b, 0xae, 0x68, 0x69, 0x01, 0x08, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x11, - 0x69, 0x61, 0x1e, 0x94, 0x07, 0x36, 0xaa, 0xfd, 0xb9, 0xfe, 0xdd, 0xfe, - 0xd8, 0x08, 0x03, 0x4d, 0x84, 0xbf, 0x65, 0xc8, 0xe0, 0xde, 0xc2, 0x64, - 0xbb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0xfe, 0x57, 0x04, 0x00, - 0x05, 0xcc, 0x00, 0x17, 0x00, 0x53, 0x40, 0x2c, 0x05, 0x0e, 0x16, 0x03, - 0x0d, 0x0b, 0x0b, 0x07, 0x07, 0x08, 0x0c, 0x0d, 0x0d, 0x03, 0x10, 0x08, - 0x10, 0x18, 0x19, 0x13, 0x00, 0x50, 0x59, 0x13, 0x1b, 0x05, 0x06, 0x06, - 0x0e, 0x0b, 0x0b, 0x07, 0x0c, 0x0f, 0x0a, 0x00, 0x07, 0x15, 0x03, 0x10, - 0x50, 0x59, 0x03, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, - 0x12, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x32, 0x3d, 0x01, 0x23, 0x01, 0x07, - 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x10, - 0x21, 0x22, 0x27, 0x35, 0x16, 0x02, 0xda, 0x7d, 0x27, 0xfe, 0x92, 0x84, - 0xb4, 0xb4, 0x01, 0xdb, 0xd3, 0xfe, 0x49, 0x01, 0x5a, 0x71, 0xfe, 0xe7, - 0x3b, 0x49, 0x32, 0xfe, 0xf5, 0x94, 0x77, 0x01, 0xee, 0x6d, 0xfe, 0x7f, - 0x05, 0xcc, 0xfc, 0x61, 0x02, 0x0d, 0xfe, 0x2f, 0xfe, 0x32, 0xfe, 0xe4, - 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, - 0xfe, 0x57, 0x01, 0x95, 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x2d, 0x40, 0x18, - 0x09, 0x06, 0x04, 0x0b, 0x0b, 0x06, 0x0f, 0x03, 0x10, 0x11, 0x0d, 0x02, - 0x50, 0x59, 0x0d, 0x1b, 0x07, 0x00, 0x06, 0x09, 0x50, 0x59, 0x06, 0x15, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x17, 0x16, 0x33, 0x32, 0x3d, - 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x0f, - 0x2b, 0x35, 0x7f, 0x64, 0xb4, 0x57, 0xfe, 0xe7, 0x2d, 0x40, 0xff, 0x0c, - 0x94, 0x77, 0x05, 0xcc, 0xfa, 0xcf, 0xfe, 0xe4, 0xfe, 0xd8, 0x0b, 0x00, - 0x00, 0x01, 0x00, 0x88, 0xfe, 0x57, 0x06, 0x85, 0x04, 0x4e, 0x00, 0x35, - 0x00, 0x63, 0x40, 0x36, 0x2d, 0x20, 0x20, 0x2b, 0x22, 0x18, 0x35, 0x35, - 0x00, 0x11, 0x08, 0x08, 0x0c, 0x09, 0x09, 0x00, 0x26, 0x22, 0x04, 0x37, - 0x36, 0x2d, 0x20, 0x50, 0x59, 0x2d, 0x15, 0x24, 0x29, 0x50, 0x59, 0x24, - 0x1b, 0x1c, 0x31, 0x50, 0x59, 0x1c, 0x10, 0x11, 0x18, 0x15, 0x09, 0x15, - 0x04, 0x50, 0x59, 0x15, 0x10, 0x0c, 0x0f, 0x00, 0x09, 0x15, 0x00, 0x3f, - 0x33, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x17, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x11, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3d, - 0x01, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x03, 0x00, - 0x56, 0x70, 0x73, 0x86, 0xb3, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, - 0x3a, 0x96, 0x6c, 0x7b, 0x8f, 0x1c, 0x03, 0x38, 0x9f, 0x71, 0xa4, 0x95, - 0x62, 0xfe, 0xe7, 0x3b, 0x49, 0x32, 0x45, 0x7d, 0x6b, 0x56, 0x70, 0x76, - 0x83, 0x02, 0xae, 0x9d, 0x78, 0xb0, 0xa0, 0xfd, 0x8d, 0x03, 0x53, 0xbd, - 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, 0x6d, 0x60, 0xb2, - 0xcb, 0xfd, 0xca, 0xfe, 0xe4, 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x94, 0x77, - 0x02, 0xae, 0x9d, 0x78, 0xaf, 0xa1, 0xfd, 0x8d, 0x00, 0x01, 0x00, 0x88, - 0xfe, 0x57, 0x04, 0x48, 0x04, 0x4e, 0x00, 0x26, 0x00, 0x4e, 0x40, 0x29, - 0x24, 0x04, 0x04, 0x1e, 0x1e, 0x02, 0x20, 0x16, 0x0d, 0x0d, 0x11, 0x0e, - 0x20, 0x0e, 0x28, 0x27, 0x22, 0x00, 0x50, 0x59, 0x22, 0x1b, 0x16, 0x1a, - 0x0e, 0x1a, 0x09, 0x50, 0x59, 0x1a, 0x10, 0x11, 0x0f, 0x0e, 0x15, 0x04, - 0x1e, 0x50, 0x59, 0x04, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x3d, 0x01, 0x23, 0x11, 0x34, 0x2e, - 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, - 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x33, 0x11, - 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x03, 0x22, 0x7d, 0x66, 0x2a, 0x5c, - 0x59, 0x82, 0x96, 0xb4, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3e, - 0xa3, 0x79, 0xb2, 0xa5, 0x5a, 0xfe, 0xe7, 0x3b, 0x49, 0x32, 0xfe, 0xf5, - 0x94, 0x77, 0x02, 0xae, 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0xfd, 0x8d, 0x03, - 0x53, 0xbd, 0x2a, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, 0xb1, 0xcc, 0xfd, - 0xca, 0xfe, 0xe4, 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x00, 0x02, 0x00, 0x84, - 0xfe, 0x57, 0x04, 0x1d, 0x04, 0x4d, 0x00, 0x25, 0x00, 0x32, 0x00, 0x57, - 0x40, 0x2e, 0x26, 0x2d, 0x1f, 0x15, 0x16, 0x16, 0x17, 0x03, 0x0d, 0x07, - 0x0d, 0x00, 0x1a, 0x17, 0x00, 0x17, 0x34, 0x33, 0x02, 0x12, 0x1f, 0x03, - 0x23, 0x10, 0x23, 0x29, 0x50, 0x59, 0x23, 0x10, 0x1a, 0x0f, 0x17, 0x1b, - 0x10, 0x30, 0x50, 0x59, 0x10, 0x16, 0x05, 0x0a, 0x50, 0x59, 0x05, 0x1b, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, - 0x32, 0x31, 0x30, 0x01, 0x10, 0x07, 0x15, 0x10, 0x21, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x06, 0x23, 0x22, 0x27, 0x23, 0x16, - 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x1e, 0x02, 0x15, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x12, 0x03, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x1d, 0x7c, 0xfe, 0xeb, 0x3b, 0x49, - 0x32, 0x45, 0x3d, 0x40, 0x36, 0x37, 0xfa, 0x56, 0x05, 0x04, 0xb4, 0x06, - 0xae, 0x01, 0x04, 0x05, 0x04, 0x30, 0x9e, 0x81, 0xc8, 0xc6, 0xbd, 0x7a, - 0x85, 0x6b, 0x79, 0x3f, 0x88, 0x99, 0x86, 0x7b, 0x02, 0x22, 0xfe, 0xc3, - 0x8b, 0xdb, 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x43, 0x51, 0x70, 0x0d, 0xbc, - 0x08, 0xa2, 0xfe, 0x59, 0x05, 0x06, 0xa7, 0x36, 0x04, 0x31, 0x66, 0x13, - 0x64, 0x5d, 0xfe, 0xf4, 0xfe, 0xdd, 0xe2, 0xc2, 0x5a, 0xbf, 0x99, 0xd5, - 0xca, 0xc5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x57, 0x02, 0x88, - 0x04, 0x4e, 0x00, 0x1f, 0x00, 0x49, 0x40, 0x26, 0x0a, 0x17, 0x17, 0x04, - 0x19, 0x02, 0x02, 0x10, 0x1d, 0x05, 0x04, 0x10, 0x04, 0x21, 0x20, 0x1b, - 0x00, 0x50, 0x59, 0x1b, 0x1b, 0x0a, 0x0e, 0x04, 0x0e, 0x13, 0x53, 0x59, - 0x0e, 0x10, 0x07, 0x0f, 0x04, 0x17, 0x50, 0x59, 0x04, 0x15, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x32, 0x3d, 0x01, 0x23, - 0x11, 0x34, 0x27, 0x33, 0x16, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, - 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x33, 0x11, 0x10, 0x21, 0x22, - 0x27, 0x35, 0x16, 0x6f, 0x7d, 0x5e, 0x06, 0xaa, 0x08, 0x04, 0x2b, 0x70, - 0x66, 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x53, 0xfe, 0xe7, 0x33, 0x49, - 0x31, 0xfe, 0xf5, 0x94, 0x77, 0x03, 0x3e, 0x72, 0x8a, 0xb8, 0x25, 0x8b, - 0x66, 0x0a, 0xa5, 0x0a, 0xc1, 0xb4, 0xfe, 0x67, 0xfe, 0xe4, 0xfe, 0xd8, - 0x10, 0xa0, 0x12, 0x00, 0x00, 0x01, 0x00, 0x39, 0xfe, 0x57, 0x03, 0xb6, - 0x04, 0x4b, 0x00, 0x34, 0x00, 0x51, 0x40, 0x29, 0x25, 0x24, 0x24, 0x16, - 0x09, 0x09, 0x10, 0x0f, 0x0f, 0x04, 0x00, 0x2b, 0x1e, 0x00, 0x1e, 0x36, - 0x35, 0x16, 0x2b, 0x0c, 0x21, 0x21, 0x28, 0x50, 0x59, 0x25, 0x21, 0x10, - 0x0c, 0x13, 0x50, 0x59, 0x10, 0x0c, 0x16, 0x02, 0x07, 0x50, 0x59, 0x02, - 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x33, 0x11, 0x33, 0x32, 0x11, 0x33, 0x32, 0x11, - 0x33, 0x31, 0x30, 0x05, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, - 0x3d, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, - 0x01, 0x17, 0x1e, 0x03, 0x15, 0x03, 0xb6, 0xfe, 0xe7, 0x3b, 0x49, 0x32, - 0x45, 0x7d, 0x6c, 0xa2, 0xca, 0xdb, 0x21, 0x9f, 0x17, 0x90, 0x80, 0x89, - 0x7f, 0x58, 0x62, 0x81, 0x9b, 0x83, 0x4a, 0xd3, 0xca, 0xb3, 0xd3, 0x1c, - 0xa2, 0x0f, 0x83, 0x6e, 0x7a, 0x74, 0x30, 0x5e, 0x97, 0x8f, 0x7e, 0x49, - 0x28, 0x81, 0xfe, 0xd8, 0x10, 0xa0, 0x12, 0x94, 0x96, 0x33, 0x85, 0x8d, - 0x1f, 0x57, 0x51, 0x54, 0x54, 0x40, 0x50, 0x1a, 0x22, 0x28, 0x4d, 0x6e, - 0x50, 0x94, 0x9b, 0x7e, 0x8b, 0x14, 0x48, 0x4d, 0x4a, 0x4b, 0x2e, 0x3c, - 0x2a, 0x25, 0x24, 0x3d, 0x4a, 0x61, 0x3e, 0x00, 0x00, 0x01, 0xff, 0xa7, - 0xfe, 0x57, 0x02, 0xfa, 0x05, 0xcc, 0x00, 0x25, 0x00, 0x4e, 0x40, 0x2b, - 0x1d, 0x14, 0x18, 0x12, 0x20, 0x20, 0x06, 0x06, 0x0c, 0x14, 0x03, 0x27, - 0x00, 0x26, 0x1b, 0x16, 0x50, 0x59, 0x12, 0x1f, 0x50, 0x59, 0x1b, 0x12, - 0x0c, 0x0c, 0x12, 0x1b, 0x03, 0x23, 0x09, 0x23, 0x02, 0x50, 0x59, 0x23, - 0x1b, 0x09, 0x0e, 0x50, 0x59, 0x09, 0x00, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x2b, - 0x2b, 0x11, 0x01, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x03, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x11, - 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, - 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3d, 0x01, 0x21, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x59, 0x35, 0x21, 0x36, 0x3b, 0x1a, - 0x01, 0x3c, 0x57, 0x2c, 0x31, 0x42, 0x4d, 0x4b, 0x01, 0xbe, 0xfe, 0xed, - 0x29, 0x2e, 0x2d, 0x28, 0x76, 0xfe, 0xe1, 0x94, 0x9a, 0x34, 0x33, 0xff, - 0x00, 0x0e, 0x2b, 0x51, 0x6d, 0x04, 0x8f, 0x01, 0x62, 0x12, 0xa3, 0x1b, - 0x69, 0x80, 0xfc, 0xca, 0xfe, 0xdd, 0xfe, 0xd8, 0x08, 0x9d, 0x0a, 0x97, - 0x8b, 0xcb, 0xb4, 0xaf, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, - 0xfe, 0x56, 0x03, 0xf9, 0x04, 0x3a, 0x00, 0x16, 0x00, 0x42, 0x40, 0x23, - 0x0b, 0x02, 0x02, 0x16, 0x0d, 0x00, 0x12, 0x0e, 0x12, 0x06, 0x16, 0x04, - 0x18, 0x17, 0x12, 0x0d, 0x15, 0x0e, 0x0f, 0x04, 0x09, 0x50, 0x59, 0x04, - 0x07, 0x53, 0x59, 0x04, 0x0d, 0x0d, 0x00, 0x50, 0x59, 0x0d, 0x15, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x33, - 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x25, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x3d, 0x01, 0x21, 0x01, 0x33, 0x13, 0x16, 0x17, 0x3f, - 0x01, 0x13, 0x33, 0x02, 0x99, 0xee, 0xfe, 0xed, 0x29, 0x2e, 0x2d, 0x28, - 0x76, 0xfe, 0xa8, 0xfe, 0x77, 0xc0, 0xee, 0x0d, 0x38, 0x23, 0x27, 0xf6, - 0xbf, 0x8b, 0xfe, 0xf3, 0xfe, 0xd8, 0x08, 0x9d, 0x0a, 0x97, 0x78, 0x04, - 0x3a, 0xfd, 0x40, 0x28, 0xc5, 0x75, 0x76, 0x02, 0xc2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x17, 0xfe, 0x56, 0x03, 0xfa, 0x04, 0x3a, 0x00, 0x17, - 0x00, 0x4b, 0x40, 0x2a, 0x01, 0x02, 0x02, 0x05, 0x04, 0x17, 0x15, 0x0b, - 0x0b, 0x07, 0x08, 0x08, 0x00, 0x06, 0x04, 0x04, 0x18, 0x19, 0x17, 0x0b, - 0x50, 0x59, 0x17, 0x15, 0x0e, 0x13, 0x50, 0x59, 0x0e, 0x1b, 0x07, 0x0f, - 0x00, 0x03, 0x09, 0x06, 0x04, 0x01, 0x05, 0x0f, 0x01, 0x15, 0x00, 0x3f, - 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, - 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, - 0x33, 0x32, 0x3d, 0x01, 0x23, 0x01, 0xfe, 0xfe, 0xdb, 0xc2, 0x01, 0x81, - 0xfe, 0x91, 0xc7, 0x01, 0x0e, 0x01, 0x0c, 0xc9, 0xfe, 0x91, 0x01, 0x25, - 0x71, 0xfe, 0xed, 0x29, 0x2e, 0x2d, 0x28, 0x76, 0x3a, 0x01, 0xbc, 0xfe, - 0x44, 0x02, 0x2c, 0x02, 0x0e, 0xfe, 0x5b, 0x01, 0xa5, 0xfd, 0xf4, 0xfe, - 0x5d, 0xfe, 0xf3, 0xfe, 0xd8, 0x08, 0x9d, 0x0a, 0x97, 0x78, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x03, 0xb6, 0x04, 0x3a, 0x00, 0x13, - 0x00, 0x45, 0x40, 0x24, 0x06, 0x02, 0x13, 0x01, 0x05, 0x05, 0x11, 0x08, - 0x08, 0x0d, 0x13, 0x03, 0x14, 0x15, 0x0a, 0x0f, 0x50, 0x59, 0x0a, 0x13, - 0x00, 0x06, 0x13, 0x06, 0x50, 0x59, 0x13, 0x15, 0x05, 0x02, 0x03, 0x02, - 0x50, 0x59, 0x03, 0x0f, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x10, 0xc4, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x37, - 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x11, 0x10, 0x21, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x3d, 0x01, 0x21, 0x31, 0x02, 0x95, 0xfd, 0x93, - 0x03, 0x38, 0xfd, 0x6a, 0x02, 0xbb, 0xfe, 0xed, 0x29, 0x2e, 0x2d, 0x28, - 0x76, 0xfd, 0x1a, 0x89, 0x03, 0x26, 0x8b, 0x89, 0xfc, 0xda, 0xfe, 0xf3, - 0xfe, 0xd8, 0x08, 0x9d, 0x0a, 0x97, 0x78, 0x00, 0x00, 0x02, 0x00, 0x57, - 0xfe, 0x56, 0x05, 0x36, 0x04, 0x4e, 0x00, 0x29, 0x00, 0x36, 0x00, 0x77, - 0x40, 0x41, 0x26, 0x07, 0x2e, 0x2e, 0x15, 0x15, 0x23, 0x23, 0x1e, 0x1a, - 0x0e, 0x0f, 0x0f, 0x34, 0x03, 0x1a, 0x03, 0x38, 0x37, 0x24, 0x17, 0x51, - 0x59, 0x24, 0x15, 0x21, 0x1c, 0x50, 0x59, 0x21, 0x1b, 0x06, 0x30, 0x51, - 0x59, 0x26, 0x06, 0x06, 0x00, 0x11, 0x3f, 0x0e, 0x01, 0x0f, 0x0e, 0x6f, - 0x0e, 0x02, 0x0b, 0x03, 0x0e, 0x0e, 0x11, 0x11, 0x0b, 0x50, 0x59, 0x11, - 0x10, 0x00, 0x2a, 0x50, 0x59, 0x00, 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x11, - 0x12, 0x39, 0x2f, 0x39, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x05, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x16, 0x15, 0x11, 0x14, 0x33, 0x32, - 0x37, 0x15, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x11, 0x35, - 0x26, 0x27, 0x23, 0x0e, 0x01, 0x27, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x07, - 0x0e, 0x02, 0x15, 0x14, 0x16, 0x01, 0x9e, 0xa3, 0xa4, 0xdd, 0xf6, 0xf3, - 0x70, 0x78, 0x79, 0x6e, 0x0b, 0xbc, 0x2e, 0x01, 0x84, 0xcc, 0xce, 0x5d, - 0x1a, 0x21, 0x76, 0x28, 0x2d, 0x2e, 0x29, 0xfe, 0xed, 0xa0, 0x09, 0x06, - 0x45, 0xb7, 0x5a, 0x63, 0x9a, 0x59, 0xc5, 0x7f, 0x83, 0x46, 0x5f, 0x14, - 0xac, 0x96, 0xa8, 0xb4, 0x06, 0x04, 0x3b, 0x84, 0x72, 0x52, 0x5a, 0x11, - 0x01, 0x24, 0xbb, 0xb1, 0xfe, 0x2e, 0xa1, 0x07, 0xee, 0x97, 0x0a, 0x9d, - 0x08, 0x01, 0x28, 0x79, 0x0b, 0xcd, 0x7c, 0x67, 0x87, 0x5a, 0x9d, 0x53, - 0x59, 0x04, 0x02, 0x30, 0x64, 0x51, 0x58, 0x60, 0x00, 0x02, 0x00, 0x56, - 0xfe, 0x56, 0x04, 0xf8, 0x04, 0x4e, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x5f, - 0x40, 0x32, 0x19, 0x0c, 0x23, 0x23, 0x21, 0x21, 0x09, 0x09, 0x04, 0x00, - 0x29, 0x14, 0x00, 0x14, 0x30, 0x2f, 0x1d, 0x10, 0x19, 0x0d, 0x16, 0x11, - 0x16, 0x26, 0x50, 0x59, 0x16, 0x10, 0x07, 0x04, 0x50, 0x59, 0x07, 0x02, - 0x53, 0x59, 0x07, 0x11, 0x11, 0x2c, 0x50, 0x59, 0x11, 0x16, 0x0b, 0x21, - 0x50, 0x59, 0x0b, 0x15, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, - 0x18, 0x10, 0xc4, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x05, - 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x11, 0x35, 0x23, 0x27, - 0x35, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, 0x32, 0x16, - 0x17, 0x33, 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x11, 0x33, 0x03, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x04, 0x2d, - 0x76, 0x28, 0x2d, 0x2e, 0x29, 0xfe, 0xed, 0x51, 0x02, 0x04, 0x36, 0x9e, - 0x7f, 0xce, 0xc0, 0x01, 0x8e, 0x7b, 0xa0, 0x36, 0x02, 0x08, 0x04, 0xad, - 0x07, 0x44, 0xf8, 0x8a, 0x97, 0x89, 0x78, 0x79, 0x86, 0x99, 0x8a, 0x78, - 0x97, 0x0a, 0x9d, 0x08, 0x01, 0x28, 0x82, 0x77, 0x3b, 0x6b, 0x5b, 0x01, - 0x16, 0x01, 0x16, 0x02, 0x36, 0x57, 0x65, 0x1e, 0x93, 0x05, 0x3b, 0xec, - 0xfd, 0x6a, 0x01, 0x9f, 0xd3, 0xcc, 0xcc, 0xdf, 0xe3, 0xc4, 0xda, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xfe, 0x57, 0x04, 0xd7, 0x05, 0xda, 0x00, 0x22, - 0x00, 0x2e, 0x00, 0x52, 0x40, 0x2b, 0x29, 0x0e, 0x22, 0x22, 0x19, 0x14, - 0x1d, 0x1d, 0x19, 0x23, 0x07, 0x19, 0x07, 0x30, 0x2f, 0x20, 0x1b, 0x50, - 0x59, 0x20, 0x1b, 0x11, 0x16, 0x50, 0x59, 0x11, 0x00, 0x0c, 0x00, 0x09, - 0x04, 0x09, 0x2c, 0x50, 0x59, 0x09, 0x10, 0x04, 0x26, 0x50, 0x59, 0x04, - 0x16, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x25, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x21, - 0x32, 0x16, 0x17, 0x33, 0x27, 0x35, 0x10, 0x21, 0x32, 0x17, 0x15, 0x26, - 0x23, 0x22, 0x15, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, - 0x11, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x03, 0x39, 0x04, 0x32, 0xa5, 0x7a, 0xcd, 0xc1, 0x01, 0x8e, 0x7b, - 0xa4, 0x32, 0x02, 0x02, 0x01, 0x1b, 0x41, 0x46, 0x3a, 0x3b, 0x79, 0x7a, - 0x40, 0x2a, 0x3f, 0x3d, 0xfe, 0xe8, 0xfd, 0xda, 0x78, 0x87, 0x99, 0x8a, - 0x8a, 0x97, 0x88, 0x79, 0xae, 0x68, 0x5a, 0x01, 0x14, 0x01, 0x18, 0x02, - 0x36, 0x5a, 0x62, 0x79, 0xa7, 0x01, 0x28, 0x0f, 0xa8, 0x15, 0x94, 0xfa, - 0xe1, 0x94, 0x0f, 0x9a, 0x0f, 0x01, 0x28, 0x02, 0x9f, 0xe3, 0xc4, 0xd4, - 0xdf, 0xd7, 0xc8, 0xc9, 0x00, 0x02, 0x00, 0x57, 0xfe, 0x57, 0x04, 0xdf, - 0x04, 0x4e, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x5b, 0x40, 0x2e, 0x06, 0x11, - 0x11, 0x0c, 0x08, 0x08, 0x1e, 0x1c, 0x00, 0x24, 0x24, 0x17, 0x1c, 0x17, - 0x26, 0x25, 0x06, 0x06, 0x00, 0x03, 0x24, 0x00, 0x50, 0x59, 0x24, 0x24, - 0x14, 0x1a, 0x1a, 0x21, 0x50, 0x59, 0x1a, 0x10, 0x14, 0x03, 0x50, 0x59, - 0x14, 0x16, 0x0f, 0x0a, 0x50, 0x59, 0x0f, 0x1b, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x11, - 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x11, 0x35, 0x06, 0x23, - 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x20, 0x11, 0x15, 0x27, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x07, 0x01, 0x14, 0x9a, 0x94, 0x75, 0x8d, 0x19, 0x9e, - 0x7a, 0x40, 0x2a, 0x3f, 0x3d, 0xfe, 0xe8, 0x68, 0xa1, 0xf0, 0xfb, 0xfb, - 0xe9, 0x01, 0xdd, 0xba, 0x0f, 0x90, 0x87, 0x83, 0x99, 0x06, 0x01, 0xf7, - 0xba, 0xca, 0x5e, 0x48, 0x2d, 0xfe, 0x99, 0x94, 0x0f, 0x9a, 0x0f, 0x01, - 0x28, 0xb1, 0x44, 0x01, 0x1e, 0x01, 0x1a, 0x01, 0x0c, 0x01, 0x1e, 0xfd, - 0xc1, 0x18, 0x8a, 0xab, 0x9d, 0xaf, 0x99, 0x00, 0x00, 0x01, 0x00, 0x49, - 0xfe, 0x57, 0x04, 0x5a, 0x04, 0x4e, 0x00, 0x2f, 0x00, 0x73, 0x40, 0x3b, - 0x22, 0x2d, 0x2d, 0x24, 0x07, 0x06, 0x06, 0x1a, 0x0a, 0x10, 0x0f, 0x0f, - 0x28, 0x24, 0x16, 0x0a, 0x0a, 0x1d, 0x03, 0x24, 0x03, 0x31, 0x30, 0x2b, - 0x26, 0x50, 0x59, 0x2b, 0x1b, 0x06, 0x19, 0x1a, 0x19, 0x1a, 0x50, 0x59, - 0x19, 0x19, 0x00, 0x0d, 0x0d, 0x13, 0x50, 0x59, 0x10, 0x10, 0x0d, 0x10, - 0x2e, 0x00, 0x22, 0x22, 0x00, 0x00, 0x20, 0x50, 0x59, 0x00, 0x16, 0x00, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x12, 0x39, 0x3f, 0x33, 0x2f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, - 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x20, 0x13, 0x07, 0x2e, 0x01, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x17, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, - 0x23, 0x20, 0x11, 0x35, 0x06, 0x01, 0xdd, 0xbf, 0xd5, 0x96, 0x7c, 0x6b, - 0x8d, 0xd1, 0xa5, 0x01, 0x4b, 0x2e, 0xa2, 0x0c, 0x70, 0x5a, 0x5d, 0x63, - 0x96, 0xa3, 0xa7, 0xa7, 0x6f, 0x65, 0xc9, 0x35, 0x9f, 0x7a, 0x40, 0x2a, - 0x3f, 0x3d, 0xfe, 0xe8, 0x63, 0x14, 0xab, 0x96, 0x6c, 0x93, 0x0d, 0x02, - 0x09, 0x85, 0x63, 0x81, 0xa1, 0xfe, 0xfe, 0x14, 0x46, 0x4a, 0x56, 0x4a, - 0x57, 0x55, 0x89, 0x66, 0x61, 0x54, 0x66, 0xa4, 0x2c, 0xfe, 0x9b, 0x94, - 0x0f, 0x9a, 0x0f, 0x01, 0x28, 0xa9, 0x3c, 0x00, 0x00, 0x01, 0x00, 0x35, - 0xfe, 0x57, 0x03, 0x62, 0x04, 0x4e, 0x00, 0x2f, 0x00, 0x6a, 0x40, 0x37, - 0x13, 0x26, 0x1e, 0x17, 0x23, 0x23, 0x10, 0x2a, 0x1d, 0x1e, 0x1e, 0x00, - 0x09, 0x09, 0x05, 0x2a, 0x03, 0x31, 0x30, 0x26, 0x14, 0x13, 0x14, 0x13, - 0x50, 0x59, 0x14, 0x14, 0x20, 0x2f, 0x2d, 0x0b, 0x0b, 0x2d, 0x2d, 0x0d, - 0x50, 0x59, 0x2d, 0x16, 0x1d, 0x1d, 0x20, 0x20, 0x1a, 0x50, 0x59, 0x20, - 0x10, 0x07, 0x02, 0x50, 0x59, 0x07, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x12, 0x39, 0x11, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x17, 0x14, 0x33, 0x32, - 0x37, 0x15, 0x06, 0x23, 0x20, 0x19, 0x01, 0x37, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, - 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0xe5, 0x7a, 0x40, 0x2a, - 0x3f, 0x3d, 0xfe, 0xe8, 0x9f, 0x35, 0xc9, 0x65, 0x6f, 0xa7, 0xa7, 0xa1, - 0x98, 0x63, 0x5d, 0x59, 0x71, 0x0c, 0xa2, 0x2e, 0x01, 0x4b, 0xa4, 0xd2, - 0x8e, 0x6a, 0x7b, 0x97, 0xd4, 0xc0, 0x86, 0x63, 0x7b, 0x94, 0x0f, 0x9a, - 0x0f, 0x01, 0x28, 0x01, 0x6b, 0x2c, 0xa4, 0x65, 0x55, 0x61, 0x66, 0x89, - 0x54, 0x58, 0x4a, 0x56, 0x4a, 0x46, 0x14, 0x01, 0x02, 0xa0, 0x82, 0x63, - 0x85, 0x09, 0x02, 0x0d, 0x92, 0x6d, 0x96, 0xab, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x58, 0xfe, 0x57, 0x05, 0xa9, 0x04, 0x4e, 0x00, 0x1e, - 0x00, 0x25, 0x00, 0x60, 0x40, 0x31, 0x00, 0x25, 0x25, 0x18, 0x18, 0x0c, - 0x17, 0x17, 0x12, 0x0e, 0x1f, 0x07, 0x1d, 0x0e, 0x1d, 0x27, 0x26, 0x18, - 0x1f, 0x1e, 0x1f, 0x50, 0x59, 0x0c, 0x1e, 0x1e, 0x1b, 0x09, 0x1b, 0x22, - 0x50, 0x59, 0x1b, 0x16, 0x15, 0x10, 0x50, 0x59, 0x15, 0x1b, 0x06, 0x06, - 0x09, 0x09, 0x03, 0x50, 0x59, 0x09, 0x10, 0x00, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, - 0x12, 0x21, 0x32, 0x12, 0x13, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, - 0x06, 0x23, 0x20, 0x19, 0x01, 0x0e, 0x01, 0x23, 0x20, 0x11, 0x35, 0x17, - 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x03, 0x5c, 0x9a, 0x94, 0x75, 0x8d, - 0x19, 0x9e, 0x61, 0x01, 0x58, 0xe8, 0xf8, 0x0a, 0xad, 0x7a, 0x40, 0x2a, - 0x3f, 0x3d, 0xfe, 0xe8, 0x16, 0xf6, 0xd4, 0xfe, 0x23, 0xba, 0x0f, 0x90, - 0x87, 0x83, 0x99, 0x06, 0x02, 0x43, 0xba, 0xca, 0x5e, 0x48, 0x2d, 0x01, - 0x00, 0xfe, 0xf9, 0xfe, 0xfa, 0xfd, 0x44, 0x94, 0x0f, 0x9a, 0x0f, 0x01, - 0x28, 0x02, 0x3b, 0xe2, 0xec, 0x02, 0x3f, 0x18, 0x8a, 0xab, 0x9d, 0xaf, - 0x99, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x89, 0xfe, 0x57, 0x02, 0x7c, - 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x3f, 0x40, 0x21, 0x0d, 0x09, - 0x09, 0x02, 0x02, 0x13, 0x07, 0x07, 0x10, 0x04, 0x04, 0x15, 0x14, 0x11, - 0x10, 0x53, 0x59, 0x11, 0x00, 0x05, 0x0f, 0x04, 0x07, 0x53, 0x59, 0x04, - 0x15, 0x00, 0x0b, 0x50, 0x59, 0x00, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x20, 0x11, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, - 0x37, 0x15, 0x06, 0x01, 0x35, 0x33, 0x15, 0x02, 0x00, 0xfe, 0xe8, 0x5f, - 0xb4, 0x5b, 0x7a, 0x40, 0x2a, 0x3f, 0xfe, 0x4c, 0xb4, 0xfe, 0x57, 0x01, - 0x28, 0x81, 0x04, 0x3a, 0xfc, 0x61, 0xfe, 0xea, 0x94, 0x0f, 0x9a, 0x0f, - 0x06, 0xc9, 0xac, 0xac, 0x00, 0x01, 0x00, 0x3d, 0xfe, 0x57, 0x03, 0xb0, - 0x04, 0x4e, 0x00, 0x23, 0x00, 0x46, 0x40, 0x25, 0x06, 0x13, 0x19, 0x0d, - 0x22, 0x22, 0x1e, 0x13, 0x03, 0x25, 0x24, 0x20, 0x1b, 0x50, 0x59, 0x20, - 0x1b, 0x18, 0x16, 0x00, 0x00, 0x16, 0x16, 0x03, 0x50, 0x59, 0x16, 0x16, - 0x0c, 0x0c, 0x10, 0x10, 0x09, 0x50, 0x59, 0x10, 0x10, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, - 0x10, 0x02, 0x23, 0x22, 0x27, 0x15, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, - 0x23, 0x20, 0x19, 0x01, 0xf3, 0x0f, 0x81, 0x60, 0x8a, 0x87, 0x81, 0x8e, - 0x69, 0x72, 0x0e, 0xb9, 0x1d, 0xd9, 0xa7, 0xe0, 0xf0, 0xef, 0xe3, 0x8b, - 0x66, 0x7a, 0x40, 0x2a, 0x3f, 0x3d, 0xfe, 0xe8, 0x01, 0x4e, 0x6c, 0x68, - 0xd1, 0xd7, 0xe2, 0xbd, 0x6a, 0x5a, 0x0e, 0x97, 0xac, 0xfe, 0xe1, 0xfe, - 0xef, 0xfe, 0xed, 0xfe, 0xe1, 0x47, 0xae, 0x94, 0x0f, 0x9a, 0x0f, 0x01, - 0x28, 0x01, 0xc3, 0x00, 0x00, 0x01, 0xff, 0x91, 0xfe, 0x57, 0x02, 0x47, - 0x05, 0xcc, 0x00, 0x21, 0x00, 0x3f, 0x40, 0x20, 0x1c, 0x00, 0x00, 0x15, - 0x08, 0x15, 0x23, 0x22, 0x03, 0x0e, 0x0e, 0x22, 0x11, 0x03, 0x50, 0x59, - 0x11, 0x11, 0x19, 0x0b, 0x19, 0x1e, 0x50, 0x59, 0x19, 0x00, 0x0b, 0x06, - 0x50, 0x59, 0x0b, 0x1b, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x14, 0x06, - 0x07, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x3d, - 0x01, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x3c, 0x7c, 0x7f, 0x02, - 0x2f, 0x3b, 0x40, 0x2a, 0x3f, 0x3d, 0x8b, 0x7f, 0x3c, 0x39, 0x32, 0x37, - 0x17, 0x97, 0x93, 0x6b, 0x2c, 0x31, 0x42, 0x4d, 0x4b, 0xce, 0xad, 0xa9, - 0x0b, 0x42, 0x3a, 0x0f, 0x9a, 0x0f, 0x8a, 0x93, 0xaa, 0x18, 0x27, 0x4e, - 0x67, 0x03, 0x88, 0xad, 0xb5, 0x12, 0xa7, 0x1b, 0x69, 0x80, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x85, 0xfe, 0x57, 0x05, 0x1d, 0x04, 0x3a, 0x00, 0x24, - 0x00, 0x4b, 0x40, 0x27, 0x1c, 0x08, 0x08, 0x0b, 0x0b, 0x16, 0x11, 0x0d, - 0x01, 0x23, 0x0d, 0x23, 0x26, 0x25, 0x1c, 0x00, 0x20, 0x20, 0x05, 0x50, - 0x59, 0x20, 0x16, 0x18, 0x0c, 0x50, 0x59, 0x18, 0x15, 0x14, 0x0f, 0x50, - 0x59, 0x14, 0x1b, 0x0a, 0x0f, 0x00, 0x0f, 0x00, 0x3f, 0x3f, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, - 0x36, 0x35, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, - 0x06, 0x23, 0x20, 0x11, 0x35, 0x23, 0x2e, 0x02, 0x27, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x3a, 0x2a, 0x5c, 0x59, 0x82, 0x96, - 0xb4, 0x59, 0x7a, 0x41, 0x24, 0x3f, 0x38, 0xfe, 0xe8, 0x4d, 0x01, 0x02, - 0x03, 0x02, 0x03, 0x3e, 0xa3, 0x79, 0xb2, 0xa5, 0x04, 0x3a, 0xfd, 0x52, - 0x6b, 0x76, 0x34, 0xb2, 0x9e, 0x02, 0x73, 0xfc, 0x61, 0xfe, 0xea, 0x94, - 0x0f, 0x9a, 0x0f, 0x01, 0x28, 0x81, 0x05, 0x2c, 0x39, 0x4f, 0x70, 0x5d, - 0xb1, 0xcc, 0x02, 0xd1, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x57, 0x04, 0x0b, - 0x04, 0x3a, 0x00, 0x25, 0x00, 0x73, 0x40, 0x3e, 0x0a, 0x20, 0x11, 0x03, - 0x0d, 0x0c, 0x10, 0x10, 0x06, 0x13, 0x0d, 0x1a, 0x24, 0x13, 0x24, 0x27, - 0x26, 0x19, 0x17, 0x00, 0x00, 0x17, 0x03, 0x17, 0x50, 0x59, 0x0b, 0x11, - 0x11, 0x0a, 0x51, 0x59, 0x03, 0x40, 0x09, 0x0c, 0x48, 0x0f, 0x11, 0x01, - 0x0b, 0x03, 0x03, 0x11, 0x03, 0x11, 0x22, 0x0e, 0x22, 0x1d, 0x50, 0x59, - 0x22, 0x1b, 0x10, 0x0d, 0x0e, 0x0d, 0x50, 0x59, 0x0e, 0x0f, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, - 0x18, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, - 0x30, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, - 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x04, 0x11, 0x14, 0x0e, 0x01, - 0x23, 0x22, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, - 0x20, 0x19, 0x01, 0xf6, 0x13, 0x97, 0x8b, 0x85, 0xa6, 0xa3, 0xb8, 0x52, - 0x01, 0x76, 0xfd, 0x55, 0x03, 0x73, 0xfe, 0x80, 0x01, 0xa4, 0x79, 0xd7, - 0x8a, 0xcf, 0x76, 0x44, 0x3e, 0x40, 0x2a, 0x3f, 0x3d, 0xfe, 0xe8, 0xcc, - 0x83, 0x75, 0x8e, 0x67, 0x8e, 0x81, 0x80, 0x01, 0x55, 0x8d, 0x96, 0xfe, - 0xb4, 0x1d, 0xfe, 0x8e, 0x67, 0xb2, 0x65, 0x6c, 0x32, 0x49, 0x4b, 0x0f, - 0x9a, 0x0f, 0x01, 0x28, 0x01, 0x41, 0x00, 0x00, 0x00, 0x02, 0x00, 0x57, - 0x01, 0xdb, 0x02, 0xca, 0x04, 0xf3, 0x00, 0x15, 0x00, 0x21, 0x00, 0x41, - 0x40, 0x21, 0x16, 0x06, 0x1c, 0x15, 0x0e, 0x0e, 0x12, 0x0d, 0x0f, 0x06, - 0x0f, 0x23, 0x22, 0x00, 0x0b, 0x03, 0x08, 0x1f, 0x08, 0xe4, 0x59, 0x1f, - 0xdf, 0x12, 0xeb, 0x0f, 0xe8, 0x03, 0x19, 0xe4, 0x59, 0x03, 0xec, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x10, 0x21, 0x22, 0x26, 0x27, 0x23, 0x17, 0x15, 0x23, 0x11, 0x34, 0x27, - 0x33, 0x16, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x36, 0xd6, 0x22, 0x6f, 0x54, 0x8c, 0x83, 0xfe, 0xf1, 0x54, - 0x6f, 0x22, 0x02, 0x02, 0x7b, 0x04, 0x75, 0x07, 0x01, 0x76, 0x50, 0x5d, - 0x68, 0x5e, 0x5e, 0x66, 0x5a, 0x55, 0x04, 0x6a, 0x4a, 0x3f, 0xc2, 0xc6, - 0xfe, 0x70, 0x40, 0x45, 0x55, 0x21, 0x02, 0x5d, 0x84, 0x1a, 0x31, 0x4a, - 0xfe, 0xfc, 0x9d, 0x8e, 0x97, 0x9c, 0x97, 0x8e, 0x8b, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x40, 0x01, 0xdc, 0x02, 0x99, 0x04, 0xf4, 0x00, 0x17, - 0x00, 0x2e, 0x40, 0x17, 0x00, 0x0c, 0x12, 0x06, 0x0c, 0x06, 0x18, 0x19, - 0x0f, 0x15, 0xe4, 0x59, 0x13, 0x0f, 0xec, 0x05, 0x09, 0x09, 0x02, 0xe4, - 0x59, 0x09, 0xe9, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x10, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, - 0xc0, 0xba, 0x42, 0x56, 0x0b, 0x7c, 0x0e, 0x97, 0x77, 0x98, 0xa5, 0xa1, - 0x9b, 0x72, 0x93, 0x14, 0x7e, 0x16, 0x89, 0x62, 0x56, 0x03, 0x6c, 0xfe, - 0xd5, 0x49, 0x4c, 0x08, 0x6d, 0x85, 0xc9, 0xc4, 0xbe, 0xcd, 0x78, 0x6c, - 0x0a, 0x8a, 0x88, 0x00, 0x00, 0x02, 0x00, 0x33, 0x01, 0xaa, 0x02, 0x8f, - 0x04, 0xf4, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x53, 0x40, 0x2e, 0x22, 0x0e, - 0x1a, 0x26, 0x06, 0x14, 0x08, 0x02, 0x05, 0x05, 0x08, 0x06, 0x1a, 0x04, - 0x29, 0x28, 0x18, 0x24, 0xe4, 0x59, 0x16, 0x26, 0x06, 0x02, 0x04, 0x18, - 0x18, 0x00, 0x0b, 0x0b, 0x11, 0xe4, 0x59, 0x0f, 0x0b, 0xec, 0x00, 0x1e, - 0xe4, 0x59, 0x04, 0x60, 0x00, 0x01, 0x00, 0xe9, 0x00, 0x3f, 0x5d, 0xc6, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x17, 0x39, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x22, 0x27, 0x06, 0x07, - 0x27, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0e, - 0x01, 0x27, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x23, 0x22, 0x07, 0x16, 0x01, - 0x7c, 0x6c, 0x4d, 0x23, 0x19, 0x54, 0x4a, 0x43, 0xa1, 0x9a, 0x72, 0x93, - 0x14, 0x7e, 0x13, 0x8b, 0x61, 0x57, 0x17, 0x81, 0x87, 0xb6, 0x3f, 0x79, - 0x5b, 0x38, 0x4d, 0x29, 0x54, 0x70, 0x63, 0x2f, 0x01, 0xdd, 0x38, 0x37, - 0x34, 0x41, 0x75, 0x66, 0xa3, 0xbd, 0xce, 0x78, 0x6c, 0x0a, 0x8a, 0x83, - 0xa1, 0x5f, 0x45, 0x8b, 0xa2, 0x3d, 0x5e, 0x39, 0x5e, 0x1e, 0x30, 0x1d, - 0x4b, 0x83, 0x33, 0x00, 0x00, 0x02, 0x00, 0x32, 0x01, 0xdd, 0x02, 0xcb, - 0x06, 0x16, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x5a, 0x40, 0x2f, 0x08, 0x1c, - 0x1c, 0x19, 0x15, 0x12, 0x0a, 0x0d, 0x04, 0x0c, 0x13, 0x13, 0x19, 0x0c, - 0x22, 0x03, 0x19, 0x03, 0x29, 0x28, 0x0a, 0x15, 0x0d, 0x12, 0x04, 0x0b, - 0x13, 0x13, 0x10, 0x0b, 0x06, 0x06, 0x1f, 0xe4, 0x59, 0x08, 0x06, 0x06, - 0x00, 0x10, 0xea, 0x00, 0x25, 0xe4, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x33, 0x18, 0x2f, 0x12, 0x17, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, - 0x27, 0x07, 0x35, 0x37, 0x26, 0x27, 0x33, 0x16, 0x17, 0x37, 0x15, 0x07, - 0x16, 0x12, 0x1d, 0x01, 0x14, 0x06, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x79, 0x9d, 0xaa, 0xa8, 0xa3, - 0x5e, 0x40, 0x4a, 0x56, 0xcc, 0x94, 0x3f, 0x66, 0x8f, 0x34, 0x3f, 0xd0, - 0x90, 0x70, 0x7b, 0xa9, 0x28, 0x5d, 0x6d, 0x6e, 0x5f, 0x62, 0x62, 0x6f, - 0x64, 0x01, 0xdd, 0xb5, 0xac, 0xab, 0xb5, 0x2a, 0x98, 0x50, 0x5d, 0x50, - 0x42, 0x35, 0x3b, 0x18, 0x30, 0x5d, 0x4f, 0x41, 0x69, 0xfe, 0xe6, 0xac, - 0x04, 0xb7, 0xbf, 0x01, 0x61, 0x85, 0x7d, 0x81, 0x81, 0x86, 0x7d, 0x7d, - 0x00, 0x01, 0x00, 0x27, 0x01, 0xdb, 0x02, 0x51, 0x04, 0xf2, 0x00, 0x25, - 0x00, 0x78, 0x40, 0x44, 0x10, 0x23, 0x1b, 0x15, 0x21, 0x21, 0x0c, 0x00, - 0x1a, 0x1b, 0x1b, 0x07, 0x06, 0x00, 0x06, 0x27, 0x26, 0x23, 0x11, 0x10, - 0x11, 0x10, 0xe4, 0x59, 0x11, 0x40, 0x0e, 0x11, 0x48, 0x11, 0x40, 0x09, - 0x0c, 0x48, 0x11, 0x11, 0x03, 0x1e, 0x0f, 0x1a, 0x01, 0x16, 0x03, 0x1a, - 0x40, 0x0e, 0x11, 0x48, 0x1a, 0x1a, 0x1e, 0x1e, 0x18, 0xe4, 0x59, 0x1e, - 0xec, 0x03, 0x09, 0xe4, 0x59, 0x40, 0x07, 0x01, 0x07, 0x07, 0x03, 0xe9, - 0x00, 0x3f, 0x33, 0x2f, 0x5d, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x2b, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, 0x2f, 0x2b, - 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, - 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, - 0x14, 0x07, 0x1e, 0x01, 0x02, 0x51, 0x91, 0x82, 0x7c, 0x90, 0x0b, 0x79, - 0x0c, 0x92, 0x4b, 0x4d, 0x4d, 0x4e, 0x41, 0x3d, 0x3f, 0x4d, 0x43, 0x45, - 0x75, 0x15, 0x7a, 0x0d, 0x8a, 0x6f, 0x78, 0x88, 0x96, 0x52, 0x58, 0x02, - 0xb4, 0x64, 0x75, 0x77, 0x7a, 0x0a, 0x9e, 0x45, 0x3f, 0x3d, 0x44, 0x64, - 0x41, 0x37, 0x36, 0x45, 0x90, 0x0b, 0x6a, 0x79, 0x72, 0x61, 0x7d, 0x30, - 0x0e, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x01, 0xea, 0x01, 0x9f, - 0x05, 0xfe, 0x00, 0x14, 0x00, 0x45, 0x40, 0x23, 0x11, 0x01, 0x01, 0x07, - 0x04, 0x02, 0x13, 0x0d, 0x02, 0x0d, 0x15, 0x16, 0x06, 0x03, 0xe4, 0x59, - 0x06, 0x06, 0x12, 0x12, 0x00, 0xe4, 0x59, 0x12, 0x12, 0x01, 0x0a, 0x0a, - 0x0e, 0xe4, 0x59, 0x0a, 0xea, 0x01, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x17, 0x15, 0x27, 0x22, 0x06, 0x1d, 0x01, 0x33, 0x15, - 0x01, 0x10, 0x7b, 0x67, 0x67, 0x58, 0x5c, 0x39, 0x1d, 0x36, 0x2f, 0x2a, - 0x8f, 0x04, 0x89, 0xfd, 0x61, 0x02, 0x9f, 0x5c, 0x55, 0x68, 0x5c, 0x08, - 0x61, 0x06, 0x31, 0x41, 0x44, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2c, - 0x00, 0xd1, 0x01, 0x9d, 0x04, 0xe5, 0x00, 0x14, 0x00, 0x44, 0x40, 0x22, - 0x13, 0x0c, 0x00, 0x11, 0x11, 0x05, 0x03, 0x07, 0x0c, 0x07, 0x15, 0x16, - 0x00, 0x12, 0xe4, 0x59, 0x00, 0x00, 0x03, 0x03, 0x06, 0xe4, 0x59, 0x03, - 0x03, 0x02, 0x0a, 0x0a, 0x0e, 0xe4, 0x59, 0x0a, 0x02, 0xeb, 0x00, 0x3f, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x33, 0x15, - 0x23, 0x11, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x3d, - 0x01, 0x23, 0x35, 0xbb, 0x7b, 0x67, 0x67, 0x58, 0x5c, 0x39, 0x1d, 0x36, - 0x2f, 0x2a, 0x8f, 0x02, 0xff, 0x01, 0xe6, 0xfe, 0x1a, 0x5c, 0xfe, 0xf2, - 0x68, 0x5c, 0x08, 0x61, 0x06, 0x31, 0x41, 0xfd, 0x5c, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x3b, 0x00, 0xbe, 0x02, 0xad, 0x04, 0xf1, 0x12, 0x06, - 0x05, 0x6d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x01, 0xea, 0x02, 0xac, - 0x06, 0x00, 0x00, 0x16, 0x00, 0x39, 0x40, 0x1f, 0x09, 0x06, 0x16, 0x0f, - 0x13, 0x13, 0x12, 0x06, 0x12, 0x17, 0x18, 0x0c, 0x03, 0xe4, 0x59, 0x00, - 0x4f, 0x0c, 0x5f, 0x0c, 0x6f, 0x0c, 0x03, 0x0c, 0x0c, 0x07, 0x13, 0xe8, - 0x10, 0x07, 0xea, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0x39, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, - 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x34, 0x37, 0x02, 0x35, 0x29, 0x6f, 0x54, 0x77, 0x72, 0x7b, 0x47, 0x51, - 0x58, 0x66, 0x7b, 0x7b, 0x06, 0x03, 0x88, 0x4d, 0x44, 0x7d, 0x90, 0x01, - 0xfc, 0xfe, 0x1c, 0x74, 0x4f, 0x7d, 0x68, 0x01, 0xc2, 0xfb, 0xea, 0x01, - 0x10, 0x70, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x11, 0x01, 0xea, 0x01, 0x2e, - 0x06, 0x00, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x40, 0x40, 0x21, 0x0f, 0x09, - 0x07, 0x0b, 0x0b, 0x0c, 0x04, 0x02, 0x00, 0x00, 0x10, 0x11, 0x0c, 0x0d, - 0xea, 0x0a, 0x02, 0x03, 0x02, 0xe4, 0x59, 0x07, 0x03, 0x40, 0x09, 0x0c, - 0x48, 0x03, 0x03, 0x05, 0xeb, 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x39, 0x2f, - 0x2b, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, - 0x03, 0x35, 0x33, 0x15, 0x64, 0x53, 0x53, 0x79, 0x51, 0x51, 0x79, 0x79, - 0x01, 0xea, 0x01, 0x6a, 0x58, 0x01, 0x39, 0xfe, 0xc7, 0x58, 0xfe, 0x96, - 0x03, 0x9d, 0x79, 0x79, 0x00, 0x01, 0x00, 0x64, 0x01, 0xea, 0x00, 0xdd, - 0x04, 0xe5, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, 0x03, 0x00, 0x00, 0x04, - 0x05, 0x01, 0xeb, 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x64, 0x79, 0x01, 0xea, - 0x02, 0xfb, 0xfd, 0x05, 0x00, 0x01, 0x00, 0x64, 0x01, 0xea, 0x00, 0xdd, - 0x04, 0xe5, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, 0x03, 0x00, 0x00, 0x05, - 0x04, 0x01, 0xeb, 0x00, 0xe8, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0x64, 0x79, 0x01, 0xea, - 0x02, 0xfb, 0xfd, 0x05, 0x00, 0x01, 0x00, 0x11, 0x01, 0xea, 0x01, 0x2e, - 0x04, 0xe5, 0x00, 0x0b, 0x00, 0x36, 0x40, 0x1c, 0x09, 0x07, 0x0b, 0x0b, - 0x04, 0x02, 0x00, 0x00, 0x0c, 0x0d, 0x0a, 0x02, 0x03, 0x02, 0xe4, 0x59, - 0x07, 0x03, 0x40, 0x09, 0x0c, 0x48, 0x03, 0x03, 0x05, 0xeb, 0x00, 0xe8, - 0x00, 0x3f, 0x3f, 0x39, 0x2f, 0x2b, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, - 0x64, 0x53, 0x53, 0x79, 0x51, 0x51, 0x01, 0xea, 0x01, 0x6a, 0x58, 0x01, - 0x39, 0xfe, 0xc7, 0x58, 0xfe, 0x96, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, - 0x00, 0xbf, 0x02, 0x25, 0x06, 0x00, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x1f, - 0x00, 0x54, 0x40, 0x2c, 0x1c, 0x07, 0x15, 0x15, 0x1f, 0x0c, 0x0a, 0x0e, - 0x0e, 0x20, 0x21, 0x19, 0x03, 0x03, 0x20, 0x1d, 0x1c, 0xe5, 0x59, 0x1d, - 0xea, 0x0d, 0x16, 0x06, 0x16, 0xe4, 0x59, 0x0a, 0x0f, 0x06, 0x01, 0x0d, - 0x03, 0x06, 0x06, 0x00, 0x08, 0xeb, 0x00, 0x11, 0xe4, 0x59, 0x00, 0xee, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x37, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x33, - 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, 0x27, 0x32, 0x36, 0x3d, 0x01, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x13, 0x35, 0x33, 0x15, 0xe8, 0x6d, - 0x7c, 0x63, 0x6b, 0x81, 0x7a, 0x5d, 0x5d, 0x79, 0x7a, 0x3b, 0x3e, 0x7d, - 0x34, 0x2c, 0x37, 0xa6, 0x7a, 0xbf, 0x61, 0x59, 0x59, 0x5a, 0x02, 0xb9, - 0xfd, 0x47, 0x62, 0x1a, 0x6a, 0x87, 0x64, 0x4d, 0x4a, 0x10, 0x29, 0x29, - 0x27, 0x2e, 0x04, 0x64, 0x79, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0x00, 0xbf, 0x01, 0x64, 0x06, 0x00, 0x00, 0x0c, 0x00, 0x24, 0x40, 0x12, - 0x00, 0x0a, 0x0a, 0x0d, 0x05, 0x0e, 0x0b, 0xea, 0x08, 0x05, 0xe5, 0x59, - 0x08, 0x03, 0xe5, 0x59, 0x08, 0xee, 0x00, 0x3f, 0x2b, 0x2b, 0x00, 0x18, - 0x3f, 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x14, - 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x35, 0x11, 0x33, 0xd2, - 0x27, 0x25, 0x24, 0x22, 0x2c, 0x22, 0xbf, 0x7b, 0x01, 0x99, 0x39, 0x2f, - 0x0a, 0x72, 0x0a, 0xd0, 0x04, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, - 0x00, 0xbf, 0x01, 0x0d, 0x06, 0x00, 0x00, 0x0f, 0x00, 0x34, 0x40, 0x19, - 0x0b, 0x04, 0x04, 0x09, 0x09, 0x0f, 0x06, 0x06, 0x11, 0x10, 0x07, 0xea, - 0x0d, 0x02, 0xe5, 0x59, 0x0d, 0x06, 0x40, 0x06, 0x09, 0xe4, 0x59, 0x06, - 0xe8, 0x00, 0x3f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x2b, 0x00, 0x18, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x13, 0x16, 0x33, 0x32, 0x3d, 0x01, 0x23, 0x11, 0x33, 0x11, - 0x33, 0x15, 0x14, 0x23, 0x22, 0x27, 0x03, 0x20, 0x22, 0x56, 0x44, 0x7a, - 0x3c, 0xbf, 0x28, 0x23, 0x01, 0x36, 0x08, 0x68, 0x54, 0x04, 0x16, 0xfc, - 0x57, 0xc8, 0xd0, 0x07, 0x00, 0x01, 0x00, 0x58, 0x01, 0xea, 0x02, 0x05, - 0x04, 0xe5, 0x00, 0x05, 0x00, 0x1f, 0x40, 0x0e, 0x04, 0x01, 0x01, 0x00, - 0x06, 0x07, 0x02, 0xeb, 0x01, 0x04, 0xe4, 0x59, 0x01, 0xe8, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x02, 0x05, 0xfe, 0x53, 0x78, - 0x01, 0x35, 0x01, 0xea, 0x02, 0xfb, 0xfd, 0x6e, 0x00, 0x01, 0x00, 0x5b, - 0x00, 0xbe, 0x04, 0x2a, 0x04, 0xf3, 0x00, 0x2d, 0x00, 0x51, 0x40, 0x2c, - 0x16, 0x10, 0x10, 0x12, 0x11, 0x1d, 0x07, 0x07, 0x08, 0x2d, 0x24, 0x24, - 0x28, 0x08, 0x11, 0x04, 0x2e, 0x2f, 0x26, 0x2b, 0xe5, 0x59, 0x26, 0xed, - 0x20, 0x03, 0xe4, 0x59, 0x20, 0xec, 0x1a, 0x0c, 0xe4, 0x59, 0x1a, 0xec, - 0x1d, 0x16, 0x11, 0x13, 0xeb, 0x08, 0x11, 0xe8, 0x00, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x39, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, - 0x23, 0x11, 0x27, 0x33, 0x17, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x17, 0x33, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x35, 0x03, 0xb1, 0x38, 0x4e, 0x4e, 0x5c, 0x79, - 0x38, 0x4e, 0x4e, 0x5c, 0x79, 0x04, 0x73, 0x06, 0x02, 0x26, 0x65, 0x4c, - 0x53, 0x61, 0x13, 0x03, 0x43, 0x9c, 0x70, 0x64, 0xbf, 0x2a, 0x32, 0x25, - 0x2c, 0x51, 0x03, 0xcd, 0x6c, 0x58, 0x77, 0x76, 0xfe, 0x46, 0x01, 0xe3, - 0x6c, 0x58, 0x7b, 0x72, 0xfe, 0x46, 0x02, 0x58, 0xa3, 0x60, 0x23, 0x4e, - 0x43, 0x46, 0x4b, 0x91, 0x7f, 0x8e, 0xfd, 0xa9, 0xd1, 0x0c, 0x73, 0x0d, - 0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x00, 0xbe, 0x04, 0x26, - 0x04, 0xe5, 0x00, 0x23, 0x00, 0x4d, 0x40, 0x27, 0x07, 0x0b, 0x0b, 0x0a, - 0x12, 0x01, 0x22, 0x1c, 0x19, 0x19, 0x22, 0x0a, 0x03, 0x25, 0x24, 0x12, - 0x13, 0x0c, 0x13, 0x16, 0x23, 0x08, 0x1a, 0xeb, 0x0f, 0x04, 0xe4, 0x59, - 0x0f, 0x0f, 0x16, 0x16, 0x1f, 0xe4, 0x59, 0x16, 0xe9, 0x0b, 0xed, 0x00, - 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, - 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x23, 0x0e, 0x01, 0x23, 0x22, 0x26, - 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x02, - 0x7d, 0x39, 0x4d, 0x4e, 0x5c, 0x79, 0x78, 0x26, 0x65, 0x4b, 0x53, 0x61, - 0x13, 0x02, 0x20, 0x69, 0x57, 0x70, 0x64, 0x79, 0x39, 0x4d, 0x4e, 0x5c, - 0x04, 0xe5, 0xfe, 0x1c, 0x6d, 0x56, 0x7a, 0x73, 0x01, 0xba, 0xfb, 0xd9, - 0x01, 0xa7, 0x4c, 0x3d, 0x45, 0x4b, 0x42, 0x4e, 0x7e, 0x8e, 0x01, 0xfd, - 0xfe, 0x1c, 0x6d, 0x56, 0x77, 0x76, 0x01, 0xba, 0x00, 0x01, 0xff, 0xc1, - 0x00, 0xbe, 0x02, 0xae, 0x04, 0xf3, 0x00, 0x1f, 0x00, 0x3a, 0x40, 0x1e, - 0x05, 0x16, 0x16, 0x1b, 0x00, 0x1f, 0x0e, 0x0d, 0x1f, 0x0d, 0x20, 0x21, - 0x18, 0x1d, 0xe5, 0x59, 0x18, 0xed, 0x05, 0x02, 0x0e, 0xe8, 0x09, 0x12, - 0xe4, 0x59, 0x09, 0xec, 0x02, 0xeb, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x27, 0x33, - 0x17, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x23, 0x22, 0x27, 0x35, - 0x16, 0x33, 0x32, 0x35, 0x62, 0x04, 0x74, 0x05, 0x02, 0x2c, 0x6d, 0x53, - 0x7a, 0x6f, 0x7b, 0x42, 0x56, 0x57, 0x67, 0xbf, 0x28, 0x35, 0x22, 0x2f, - 0x50, 0x04, 0x42, 0x8f, 0x14, 0x60, 0x23, 0x50, 0x41, 0x7f, 0x8e, 0xfe, - 0x04, 0x01, 0xe3, 0x70, 0x54, 0x7b, 0x72, 0xfd, 0xeb, 0xd1, 0x0c, 0x72, - 0x0c, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0xbe, 0x03, 0x46, - 0x04, 0xf3, 0x00, 0x1e, 0x00, 0x3a, 0x40, 0x1e, 0x09, 0x04, 0x00, 0x17, - 0x11, 0x11, 0x13, 0x12, 0x00, 0x12, 0x20, 0x1f, 0x1b, 0x0d, 0xe4, 0x59, - 0x1b, 0xec, 0x17, 0x12, 0x14, 0xeb, 0x12, 0xe8, 0x07, 0x02, 0xe5, 0x59, - 0x07, 0xed, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x12, 0x39, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, - 0x22, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, - 0x27, 0x33, 0x17, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x02, - 0xae, 0x50, 0x2b, 0x1d, 0x2a, 0x2a, 0xbf, 0x42, 0x55, 0x58, 0x67, 0x7a, - 0x04, 0x73, 0x06, 0x02, 0x2c, 0x6d, 0x52, 0x7b, 0x6e, 0x01, 0x99, 0x69, - 0x0c, 0x74, 0x0a, 0xd1, 0x02, 0x3e, 0x70, 0x54, 0x7b, 0x72, 0xfe, 0x46, - 0x02, 0x58, 0xa3, 0x60, 0x23, 0x50, 0x41, 0x7f, 0x8e, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x5f, 0x01, 0xea, 0x02, 0xaa, 0x04, 0xe4, 0x00, 0x0f, - 0x00, 0x2e, 0x40, 0x15, 0x0b, 0x0d, 0x0d, 0x0e, 0x04, 0x03, 0x03, 0x07, - 0x0e, 0x07, 0x10, 0x11, 0x03, 0x0b, 0x0e, 0x05, 0x0f, 0xeb, 0x08, 0x0e, - 0xe8, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x01, 0x16, 0x17, 0x27, 0x11, 0x33, 0x11, 0x23, 0x01, 0x26, 0x27, - 0x17, 0x11, 0x23, 0x11, 0xd5, 0x01, 0x3d, 0x11, 0x16, 0x03, 0x74, 0x72, - 0xfe, 0xc7, 0x12, 0x20, 0x05, 0x73, 0x04, 0xe4, 0xfe, 0x1d, 0x1b, 0x2e, - 0x58, 0x01, 0xd4, 0xfd, 0x06, 0x01, 0xec, 0x1b, 0x40, 0x73, 0xfe, 0x2c, - 0x02, 0xfa, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3a, 0x01, 0xdc, 0x02, 0xcb, - 0x04, 0xf4, 0x00, 0x09, 0x00, 0x10, 0x00, 0x17, 0x00, 0x4b, 0x40, 0x2a, - 0x14, 0x0e, 0x0e, 0x05, 0x15, 0x0d, 0x0d, 0x00, 0x05, 0x00, 0x18, 0x19, - 0x14, 0x0e, 0xe4, 0x59, 0x14, 0x40, 0x0e, 0x11, 0x48, 0x14, 0x40, 0x09, - 0x0c, 0x48, 0x14, 0x14, 0x02, 0x07, 0x07, 0x11, 0xe4, 0x59, 0x07, 0xec, - 0x02, 0x0a, 0xe4, 0x59, 0x02, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x2b, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x10, 0x21, 0x22, 0x26, 0x35, 0x10, 0x21, 0x32, 0x16, 0x01, - 0x32, 0x36, 0x37, 0x21, 0x1e, 0x01, 0x13, 0x22, 0x06, 0x07, 0x21, 0x2e, - 0x01, 0x02, 0xcb, 0xfe, 0xb4, 0x9a, 0xab, 0x01, 0x4a, 0xac, 0x9b, 0xfe, - 0xb3, 0x66, 0x5e, 0x07, 0xfe, 0x73, 0x07, 0x5f, 0x64, 0x63, 0x60, 0x07, - 0x01, 0x8d, 0x07, 0x5b, 0x03, 0x69, 0xfe, 0x73, 0xc3, 0xca, 0x01, 0x8b, - 0xc6, 0xfe, 0x0c, 0x7b, 0x81, 0x7d, 0x7f, 0x02, 0x5c, 0x7b, 0x7d, 0x81, - 0x77, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x37, 0x00, 0xbf, 0x02, 0xc8, - 0x06, 0x00, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x1c, 0x00, 0x53, 0x40, 0x2b, - 0x17, 0x04, 0x14, 0x09, 0x0f, 0x0f, 0x19, 0x06, 0x00, 0x10, 0x0c, 0x0c, - 0x00, 0x04, 0x03, 0x1d, 0x1e, 0x07, 0xea, 0x09, 0x13, 0xe4, 0x59, 0x09, - 0x09, 0x06, 0x06, 0x1a, 0xe4, 0x59, 0x06, 0xec, 0x14, 0x19, 0x01, 0x19, - 0xe4, 0x59, 0x0e, 0x01, 0xe9, 0x00, 0xee, 0x00, 0x3f, 0x3f, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, - 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x11, 0x2e, - 0x01, 0x35, 0x10, 0x25, 0x11, 0x33, 0x11, 0x1e, 0x01, 0x15, 0x10, 0x05, - 0x11, 0x13, 0x34, 0x26, 0x27, 0x11, 0x3e, 0x01, 0x25, 0x10, 0x17, 0x11, - 0x0e, 0x01, 0x01, 0x44, 0x81, 0x8c, 0x01, 0x0d, 0x70, 0x90, 0x84, 0xfe, - 0xec, 0x94, 0x48, 0x4c, 0x4b, 0x49, 0xfe, 0x6f, 0x8d, 0x49, 0x44, 0xbf, - 0x01, 0x21, 0x10, 0xc1, 0xb7, 0x01, 0x64, 0x24, 0x01, 0x10, 0xfe, 0xf0, - 0x0e, 0xc3, 0xb7, 0xfe, 0x96, 0x1e, 0xfe, 0xdf, 0x02, 0xa9, 0x8c, 0x90, - 0x0d, 0xfd, 0xae, 0x0f, 0x90, 0x8a, 0xfe, 0xfc, 0x24, 0x02, 0x4e, 0x14, - 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, 0x00, 0xc0, 0x02, 0x8e, - 0x04, 0xf2, 0x00, 0x31, 0x00, 0x53, 0x40, 0x2a, 0x13, 0x05, 0x2c, 0x19, - 0x19, 0x0d, 0x0d, 0x21, 0x27, 0x30, 0x21, 0x30, 0x33, 0x32, 0x2e, 0x29, - 0xe5, 0x59, 0x2e, 0x24, 0x05, 0x19, 0x10, 0x26, 0x24, 0x00, 0x00, 0x24, - 0x24, 0x03, 0xe4, 0x59, 0x24, 0xe9, 0x10, 0x16, 0xe4, 0x59, 0x14, 0x14, - 0x10, 0xec, 0x00, 0x3f, 0x33, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x00, 0x33, 0x18, 0x2f, 0x12, 0x39, 0x11, 0x39, 0x39, 0x10, 0xc4, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x32, 0x32, 0x31, 0x30, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x35, 0x34, - 0x2e, 0x01, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, - 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x02, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x15, 0x14, 0x33, 0x32, 0x37, 0x15, - 0x06, 0x23, 0x22, 0x35, 0x11, 0x9b, 0x10, 0x62, 0x57, 0xb3, 0x21, 0x3d, - 0x78, 0x67, 0x5c, 0x32, 0x90, 0x89, 0x7a, 0x8f, 0x13, 0x6e, 0x15, 0x99, - 0x53, 0x4f, 0x36, 0x41, 0x50, 0x79, 0x57, 0x34, 0x9b, 0x8f, 0x73, 0x4f, - 0x53, 0x20, 0x24, 0x2b, 0x22, 0xbd, 0x02, 0xb4, 0x3d, 0x39, 0x76, 0x24, - 0x2d, 0x1f, 0x20, 0x1c, 0x36, 0x4f, 0x38, 0x68, 0x6d, 0x58, 0x63, 0x0e, - 0x69, 0x33, 0x36, 0x28, 0x32, 0x12, 0x16, 0x21, 0x36, 0x54, 0x3e, 0x6c, - 0x75, 0x2a, 0x70, 0x65, 0x08, 0x72, 0x08, 0xd0, 0x01, 0x0e, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xaf, 0x00, 0xbf, 0x01, 0x91, 0x06, 0x00, 0x00, 0x17, - 0x00, 0x32, 0x40, 0x1c, 0x10, 0x16, 0x16, 0x03, 0x09, 0x09, 0x18, 0x19, - 0x0d, 0x12, 0xe5, 0x59, 0x0d, 0x10, 0xe5, 0x59, 0x0d, 0xea, 0x00, 0x05, - 0xe4, 0x59, 0x00, 0x03, 0xe5, 0x59, 0x00, 0xee, 0x00, 0x3f, 0x2b, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x37, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, - 0x01, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x11, 0x14, 0x0a, 0x31, 0x2a, 0x30, 0x20, 0x24, 0x29, 0x13, - 0x65, 0x66, 0x49, 0x1e, 0x23, 0x2b, 0x36, 0x32, 0xbf, 0x0d, 0x71, 0x11, - 0x1e, 0x3a, 0x4c, 0x03, 0x37, 0x79, 0x80, 0x0c, 0x76, 0x13, 0x4b, 0x59, - 0xfc, 0xcc, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x22, 0x00, 0xbf, 0x01, 0x85, - 0x05, 0x90, 0x00, 0x1e, 0x00, 0x49, 0x40, 0x25, 0x17, 0x0a, 0x00, 0x15, - 0x19, 0x19, 0x12, 0x10, 0x04, 0x0e, 0x00, 0x0e, 0x20, 0x1f, 0x13, 0xde, - 0x18, 0x10, 0x11, 0x10, 0xe4, 0x59, 0x15, 0x11, 0xeb, 0x0b, 0x1c, 0xe4, - 0x59, 0x0b, 0xe9, 0x02, 0x07, 0xe5, 0x59, 0x02, 0xee, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x23, 0x22, 0x27, - 0x35, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x35, 0x11, 0x23, - 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, - 0x32, 0x37, 0x01, 0x85, 0xac, 0x2c, 0x30, 0x25, 0x24, 0x23, 0x2a, 0x09, - 0x93, 0x55, 0x59, 0x24, 0x52, 0x88, 0x88, 0x22, 0x2c, 0x1e, 0x28, 0x01, - 0x86, 0xc7, 0x0c, 0x71, 0x0d, 0x28, 0x39, 0x4f, 0xad, 0x01, 0xfd, 0x5c, - 0xab, 0xab, 0x5c, 0xfe, 0x1f, 0x38, 0x2c, 0x0a, 0x00, 0x02, 0x00, 0x13, - 0x01, 0xdd, 0x02, 0xf0, 0x04, 0xe5, 0x00, 0x18, 0x00, 0x21, 0x00, 0x5c, - 0x40, 0x30, 0x0c, 0x02, 0x1c, 0x1c, 0x07, 0x05, 0x09, 0x01, 0x1f, 0x1f, - 0x17, 0x16, 0x13, 0x09, 0x13, 0x23, 0x22, 0x0c, 0x0d, 0x1e, 0x08, 0x15, - 0x16, 0x15, 0xe4, 0x59, 0x05, 0x01, 0x0d, 0x16, 0x40, 0x09, 0x0c, 0x48, - 0x16, 0x16, 0x0b, 0x03, 0x18, 0xeb, 0x10, 0x19, 0xe4, 0x59, 0x10, 0xe9, - 0x0b, 0xe8, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x2b, 0x39, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x11, 0x21, 0x11, - 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x17, 0x23, 0x27, 0x23, 0x0e, 0x01, - 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x11, 0x01, 0x32, 0x36, - 0x3d, 0x01, 0x21, 0x15, 0x14, 0x16, 0xd6, 0x01, 0x57, 0x7a, 0x49, 0x49, - 0x04, 0x74, 0x05, 0x02, 0x2c, 0x6e, 0x51, 0x7b, 0x6f, 0x48, 0x48, 0x01, - 0x13, 0x58, 0x67, 0xfe, 0xa9, 0x42, 0x04, 0xe5, 0xfe, 0xb9, 0x01, 0x47, - 0xfe, 0xb9, 0x5e, 0xb3, 0xa2, 0x82, 0x51, 0x3f, 0x7e, 0x8e, 0x57, 0x5e, - 0x01, 0x47, 0xfd, 0x5a, 0x7f, 0x73, 0x0f, 0x3e, 0x6e, 0x55, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x38, 0x01, 0xdd, 0x02, 0xdc, 0x04, 0xe5, 0x00, 0x31, - 0x00, 0x49, 0x40, 0x24, 0x08, 0x11, 0x11, 0x16, 0x16, 0x0c, 0x03, 0x2a, - 0x21, 0x21, 0x1c, 0x1c, 0x26, 0x2f, 0x03, 0x2f, 0x32, 0x33, 0x27, 0x0c, - 0x0d, 0x0c, 0xe4, 0x59, 0x08, 0x2a, 0x00, 0x24, 0x0d, 0xeb, 0x00, 0x19, - 0xe4, 0x59, 0x00, 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x12, - 0x39, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x35, 0x34, - 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x15, - 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x35, 0x34, 0x36, - 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x15, 0x14, - 0x06, 0x01, 0x8a, 0x98, 0xba, 0x24, 0x2a, 0x24, 0x1d, 0x1d, 0x38, 0x54, - 0x3c, 0x4b, 0x1d, 0x22, 0x1d, 0x72, 0x61, 0x60, 0x73, 0x1d, 0x22, 0x1d, - 0x4b, 0x3c, 0x54, 0x38, 0x1d, 0x1d, 0x24, 0x2a, 0x24, 0xb9, 0x01, 0xdd, - 0xb3, 0x96, 0x3e, 0x57, 0x43, 0x35, 0x1d, 0x16, 0x1d, 0x62, 0x46, 0x3f, - 0x2f, 0x46, 0x41, 0x45, 0x2e, 0x71, 0x85, 0x84, 0x72, 0x2e, 0x45, 0x41, - 0x46, 0x2f, 0x3f, 0x46, 0x62, 0x1d, 0x16, 0x1d, 0x35, 0x43, 0x57, 0x3e, - 0x95, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x01, 0xdd, 0x02, 0xa7, - 0x04, 0xe5, 0x00, 0x0f, 0x00, 0x25, 0x40, 0x11, 0x06, 0x03, 0x0a, 0x0d, - 0x03, 0x0d, 0x10, 0x11, 0x0b, 0x04, 0xeb, 0x00, 0x08, 0xe4, 0x59, 0x00, - 0xe9, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x35, 0x11, - 0x33, 0x11, 0x14, 0x33, 0x32, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x01, - 0x81, 0x92, 0x94, 0x7b, 0xab, 0xab, 0x7b, 0x94, 0x01, 0xdd, 0x8e, 0x9f, - 0x01, 0xdb, 0xfe, 0x1d, 0xc3, 0xc3, 0x01, 0xe3, 0xfe, 0x25, 0x9f, 0x8e, - 0x00, 0x01, 0x00, 0x57, 0x01, 0xdd, 0x02, 0xa3, 0x04, 0xe5, 0x00, 0x14, - 0x00, 0x29, 0x40, 0x13, 0x09, 0x06, 0x11, 0x0e, 0x0e, 0x00, 0x06, 0x00, - 0x15, 0x16, 0x11, 0x07, 0xeb, 0x03, 0x0c, 0xe4, 0x59, 0x03, 0xe9, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x11, 0x34, 0x26, - 0x27, 0x33, 0x1e, 0x01, 0x02, 0xa3, 0xa1, 0x93, 0x93, 0x85, 0x7b, 0x4c, - 0x57, 0xb0, 0x29, 0x25, 0x80, 0x21, 0x2b, 0x03, 0x7d, 0xc7, 0xd9, 0x93, - 0xa2, 0x01, 0xd3, 0xfe, 0x29, 0x67, 0x68, 0x01, 0x3b, 0x5d, 0xc2, 0x4c, - 0x48, 0xc8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x01, 0xea, 0x02, 0xa2, - 0x04, 0xe5, 0x00, 0x09, 0x00, 0x1e, 0x40, 0x0d, 0x05, 0x09, 0x02, 0x02, - 0x0b, 0x09, 0x0a, 0x05, 0x03, 0x09, 0xe8, 0x00, 0xeb, 0x00, 0x3f, 0x3f, - 0x33, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, 0x30, - 0x01, 0x33, 0x01, 0x23, 0x03, 0x27, 0x0e, 0x01, 0x03, 0x23, 0x01, 0x06, - 0x91, 0x01, 0x0b, 0x82, 0xa2, 0x30, 0x0e, 0x14, 0xb7, 0x82, 0x04, 0xe5, - 0xfd, 0x05, 0x01, 0xf1, 0xa7, 0x34, 0x43, 0xfd, 0xdf, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3c, 0x01, 0xea, 0x02, 0xa1, 0x04, 0xe5, 0x00, 0x09, - 0x00, 0x35, 0x40, 0x1a, 0x07, 0x03, 0x00, 0x09, 0x02, 0x06, 0x00, 0x06, - 0x0a, 0x0b, 0x06, 0x03, 0x04, 0x03, 0xe4, 0x59, 0x04, 0xeb, 0x01, 0x07, - 0x00, 0x07, 0xe4, 0x59, 0x00, 0xe8, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x35, 0x01, 0x21, 0x35, - 0x21, 0x15, 0x01, 0x21, 0x15, 0x3c, 0x01, 0xc2, 0xfe, 0x59, 0x02, 0x31, - 0xfe, 0x3e, 0x01, 0xdb, 0x01, 0xea, 0x60, 0x02, 0x39, 0x62, 0x60, 0xfd, - 0xc7, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xbe, 0x03, 0x13, - 0x04, 0xe5, 0x00, 0x14, 0x00, 0x4a, 0x40, 0x27, 0x13, 0x0f, 0x0c, 0x0a, - 0x05, 0x00, 0x00, 0x0e, 0x12, 0x0c, 0x12, 0x15, 0x16, 0x12, 0x0f, 0x10, - 0x0f, 0xe4, 0x59, 0x10, 0xeb, 0x0d, 0x13, 0x0c, 0x13, 0xe4, 0x59, 0x0c, - 0xe8, 0x08, 0x05, 0xe5, 0x59, 0x08, 0x03, 0xe5, 0x59, 0x08, 0xed, 0x00, - 0x3f, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x16, 0x33, - 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, - 0x35, 0x21, 0x15, 0x01, 0x21, 0x02, 0x93, 0x1d, 0x26, 0x21, 0x1c, 0x31, - 0x24, 0xa3, 0xfe, 0x13, 0x01, 0xc2, 0xfe, 0x59, 0x02, 0x31, 0xfe, 0x3e, - 0x01, 0xdb, 0x01, 0x99, 0x39, 0x30, 0x08, 0x71, 0x09, 0xd1, 0x5b, 0x60, - 0x02, 0x39, 0x62, 0x61, 0xfd, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x25, - 0x01, 0x6d, 0x02, 0xd7, 0x04, 0xe5, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x54, - 0x40, 0x2b, 0x16, 0x12, 0x11, 0x15, 0x15, 0x06, 0x19, 0x0e, 0x0d, 0x0e, - 0x0f, 0x1d, 0x06, 0x0f, 0x06, 0x20, 0x21, 0x15, 0x12, 0x13, 0x12, 0xe4, - 0x59, 0x03, 0x17, 0xe4, 0x59, 0x03, 0x03, 0x0f, 0x13, 0xeb, 0x19, 0x10, - 0x16, 0x0f, 0x16, 0xe4, 0x59, 0x0c, 0x0a, 0x0f, 0xe8, 0x00, 0x3f, 0x33, - 0xc4, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x2b, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x32, 0x32, 0x31, 0x30, - 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x06, - 0x07, 0x27, 0x37, 0x23, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x25, - 0x22, 0x07, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x24, 0x46, 0x7f, - 0x42, 0x52, 0x5a, 0x5e, 0x68, 0xac, 0x1e, 0x1a, 0x5e, 0x25, 0xcf, 0x01, - 0xc1, 0xfe, 0x5a, 0x02, 0x30, 0xfe, 0x3e, 0x01, 0x7b, 0x42, 0x51, 0x75, - 0x34, 0x30, 0x26, 0x02, 0x4c, 0x79, 0x6f, 0x58, 0x48, 0x54, 0x56, 0x3a, - 0x43, 0x2b, 0x52, 0x61, 0x02, 0x38, 0x62, 0x60, 0xfd, 0xc7, 0x81, 0x81, - 0x20, 0x26, 0x1c, 0x1f, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xbe, 0x02, 0xbf, - 0x04, 0xe5, 0x00, 0x19, 0x00, 0x4d, 0x40, 0x27, 0x16, 0x03, 0x19, 0x18, - 0x02, 0x02, 0x12, 0x06, 0x19, 0x0d, 0x0c, 0x06, 0x0c, 0x1b, 0x1a, 0x03, - 0x16, 0xe4, 0x59, 0x03, 0x03, 0x09, 0x00, 0x09, 0x0f, 0xe4, 0x59, 0x0d, - 0x0d, 0x09, 0xed, 0x02, 0x19, 0x00, 0x19, 0xe4, 0x59, 0x00, 0xeb, 0x00, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, - 0x21, 0x15, 0x05, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, - 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x01, - 0x21, 0x4e, 0x02, 0x59, 0xfe, 0xfb, 0x87, 0x96, 0xba, 0x9c, 0x88, 0xa4, - 0x0f, 0x79, 0x1e, 0xa8, 0x65, 0x72, 0x7b, 0x70, 0x38, 0x01, 0x0b, 0xfe, - 0x22, 0x04, 0xe5, 0x7e, 0xfe, 0x13, 0xae, 0x8d, 0x9b, 0xc2, 0x89, 0x81, - 0x09, 0xb2, 0x8b, 0x75, 0x6e, 0x7f, 0x65, 0x01, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x3c, 0x01, 0xe2, 0x02, 0xb3, 0x06, 0x05, 0x00, 0x0a, - 0x00, 0x11, 0x00, 0x18, 0x00, 0x47, 0x40, 0x25, 0x15, 0x0f, 0x0f, 0x06, - 0x16, 0x0e, 0x0e, 0x00, 0x06, 0x00, 0x19, 0x1a, 0x15, 0x0f, 0xe4, 0x59, - 0x0f, 0x15, 0x01, 0x0c, 0x03, 0x15, 0x15, 0x08, 0x03, 0x08, 0x12, 0xe4, - 0x59, 0x08, 0xea, 0x03, 0x0b, 0xe4, 0x59, 0x03, 0xe9, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, - 0x10, 0x21, 0x32, 0x12, 0x01, 0x32, 0x36, 0x37, 0x21, 0x1e, 0x01, 0x13, - 0x22, 0x06, 0x07, 0x21, 0x2e, 0x01, 0x02, 0xb3, 0xa4, 0x9b, 0x93, 0xa5, - 0x01, 0x3d, 0xa4, 0x96, 0xfe, 0xc0, 0x61, 0x59, 0x04, 0xfe, 0x8d, 0x03, - 0x58, 0x62, 0x61, 0x58, 0x04, 0x01, 0x73, 0x04, 0x55, 0x03, 0xf5, 0xfe, - 0xf3, 0xfe, 0xfa, 0x01, 0x04, 0x01, 0x0f, 0x02, 0x10, 0xfe, 0xf9, 0xfd, - 0x41, 0xc1, 0xca, 0xc1, 0xca, 0x03, 0x6b, 0xba, 0xc9, 0xc9, 0xba, 0x00, - 0x00, 0x03, 0xfe, 0xb0, 0x04, 0xc2, 0x01, 0x50, 0x06, 0x29, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x0d, 0x00, 0x1b, 0x40, 0x0b, 0x0b, 0x09, 0x00, 0x08, - 0x08, 0x03, 0x00, 0x80, 0x0d, 0x0d, 0x00, 0x00, 0x2f, 0x32, 0x2f, 0x1a, - 0x10, 0xcd, 0x32, 0x2f, 0x11, 0x39, 0x39, 0x31, 0x30, 0x13, 0x03, 0x35, - 0x33, 0x13, 0x15, 0x37, 0x35, 0x33, 0x15, 0x05, 0x35, 0x33, 0x15, 0x2c, - 0xd2, 0xbe, 0x5f, 0x36, 0xa3, 0xfd, 0x60, 0xa5, 0x04, 0xc2, 0x01, 0x42, - 0x25, 0xfe, 0xba, 0x21, 0xaf, 0xb8, 0xb8, 0xae, 0xb8, 0xb8, 0x00, 0x00, - 0x00, 0x03, 0xfe, 0x84, 0x04, 0xc2, 0x01, 0x7d, 0x06, 0x29, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x0d, 0x00, 0x17, 0x40, 0x09, 0x0c, 0x09, 0x0c, 0x09, - 0x08, 0x03, 0x80, 0x0a, 0x05, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, - 0x39, 0x2f, 0x2f, 0x31, 0x30, 0x03, 0x35, 0x13, 0x33, 0x15, 0x03, 0x25, - 0x35, 0x33, 0x15, 0x05, 0x35, 0x33, 0x15, 0x8c, 0x5f, 0xbe, 0xd2, 0x01, - 0x1b, 0xa3, 0xfd, 0x07, 0xa5, 0x04, 0xc2, 0x21, 0x01, 0x46, 0x25, 0xfe, - 0xbe, 0xaf, 0xb8, 0xb8, 0xae, 0xb8, 0xb8, 0x00, 0x00, 0x01, 0xff, 0x85, - 0xfe, 0x4e, 0x00, 0x66, 0xff, 0xaa, 0x00, 0x2c, 0x00, 0x0e, 0xb5, 0x11, - 0x1f, 0x29, 0x03, 0x18, 0x00, 0x00, 0x2f, 0xcc, 0x17, 0x39, 0x31, 0x30, - 0x13, 0x22, 0x35, 0x34, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x35, 0x34, - 0x3e, 0x02, 0x35, 0x34, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, - 0x14, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x15, - 0x14, 0x16, 0x17, 0x5a, 0xb3, 0x21, 0x29, 0x21, 0x21, 0x29, 0x21, 0x24, - 0x2a, 0x24, 0x31, 0x2b, 0x2f, 0x09, 0x3c, 0x3c, 0x69, 0x20, 0x25, 0x20, - 0x1d, 0x24, 0x1d, 0x1d, 0x24, 0x1d, 0x27, 0x32, 0xfe, 0x4e, 0x40, 0x10, - 0x14, 0x0e, 0x0a, 0x06, 0x09, 0x08, 0x0a, 0x10, 0x12, 0x0f, 0x15, 0x12, - 0x10, 0x09, 0x11, 0x14, 0x30, 0x21, 0x3e, 0x18, 0x1d, 0x13, 0x0d, 0x08, - 0x06, 0x08, 0x0c, 0x14, 0x11, 0x10, 0x13, 0x0c, 0x09, 0x07, 0x07, 0x10, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xa9, 0x04, 0xe3, 0x01, 0x5d, - 0x05, 0xd5, 0x00, 0x13, 0x00, 0x12, 0xb6, 0x01, 0x12, 0x12, 0x0a, 0x80, - 0x0d, 0x06, 0x00, 0x2f, 0x33, 0x1a, 0xcc, 0x32, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x22, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, - 0x33, 0x32, 0x3e, 0x02, 0x3b, 0x01, 0x01, 0x5d, 0x22, 0x38, 0x60, 0x60, - 0x67, 0x40, 0x6d, 0x86, 0x7f, 0x42, 0x39, 0x34, 0x5a, 0x5d, 0x69, 0x43, - 0x23, 0x05, 0x5a, 0x25, 0x2d, 0x25, 0x85, 0x6d, 0x39, 0x47, 0x28, 0x30, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xc6, 0x04, 0xd4, 0x01, 0x2c, - 0x05, 0xd4, 0x00, 0x05, 0x00, 0x13, 0xb7, 0x05, 0x02, 0x80, 0x02, 0x03, - 0x8e, 0x59, 0x02, 0x00, 0x2f, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcc, 0x31, - 0x30, 0x01, 0x05, 0x21, 0x35, 0x21, 0x37, 0x01, 0x2c, 0xfe, 0xf1, 0xfe, - 0xa9, 0x01, 0x3a, 0xec, 0x05, 0x68, 0x94, 0x80, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xd4, 0x04, 0xd4, 0x01, 0x3a, 0x05, 0xd4, 0x00, 0x05, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x04, 0x8e, 0x59, 0x0f, 0x03, 0x1f, 0x03, - 0x2f, 0x03, 0x03, 0x03, 0x01, 0x00, 0x2f, 0xcd, 0x5d, 0x2b, 0x31, 0x30, - 0x01, 0x21, 0x25, 0x37, 0x17, 0x21, 0x01, 0x3a, 0xfe, 0xa9, 0xfe, 0xf1, - 0x40, 0xec, 0x01, 0x3a, 0x04, 0xd4, 0x94, 0x6c, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0xc6, 0x04, 0xd4, 0x01, 0x2c, 0x05, 0xd4, 0x00, 0x05, - 0x00, 0x16, 0x40, 0x0d, 0x04, 0x02, 0x8e, 0x59, 0x0f, 0x04, 0x1f, 0x04, - 0x2f, 0x04, 0x03, 0x04, 0x00, 0x00, 0x2f, 0xcd, 0x5d, 0x2b, 0x31, 0x30, - 0x13, 0x27, 0x21, 0x35, 0x21, 0x05, 0xec, 0xec, 0xfe, 0xc6, 0x01, 0x57, - 0x01, 0x0f, 0x04, 0xd4, 0x80, 0x80, 0x94, 0x00, 0x00, 0x01, 0xfe, 0xd4, - 0x04, 0xd4, 0x01, 0x3a, 0x05, 0xd4, 0x00, 0x05, 0x00, 0x16, 0x40, 0x0d, - 0x05, 0x01, 0x8e, 0x59, 0x0f, 0x05, 0x1f, 0x05, 0x2f, 0x05, 0x03, 0x05, - 0x02, 0x00, 0x2f, 0xc4, 0x5d, 0x2b, 0x31, 0x30, 0x01, 0x21, 0x07, 0x27, - 0x25, 0x21, 0x01, 0x3a, 0xfe, 0xc6, 0xec, 0x40, 0x01, 0x0f, 0x01, 0x57, - 0x05, 0x54, 0x80, 0x6c, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x62, - 0x04, 0xd4, 0x01, 0xa1, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x17, 0x40, 0x09, - 0x02, 0x07, 0x07, 0x05, 0x80, 0x06, 0x03, 0x03, 0x01, 0x00, 0x2f, 0x33, - 0x11, 0x33, 0x1a, 0xcc, 0x32, 0x11, 0x33, 0x31, 0x30, 0x01, 0x07, 0x27, - 0x07, 0x25, 0x37, 0x17, 0x37, 0x01, 0xa1, 0x3d, 0xe0, 0xf6, 0xfe, 0xd4, - 0x3d, 0xec, 0xeb, 0x05, 0x41, 0x6d, 0x7a, 0x7a, 0x94, 0x6d, 0x80, 0x80, - 0x00, 0x01, 0xfe, 0x62, 0x04, 0xd4, 0x01, 0xa1, 0x05, 0xd5, 0x00, 0x07, - 0x00, 0x1b, 0x40, 0x0b, 0x07, 0x06, 0x06, 0x01, 0x04, 0x80, 0x03, 0x02, - 0x02, 0x05, 0x00, 0x00, 0x2f, 0x32, 0x32, 0x11, 0x33, 0x1a, 0xcd, 0x32, - 0x32, 0x11, 0x33, 0x31, 0x30, 0x13, 0x27, 0x07, 0x27, 0x25, 0x17, 0x37, - 0x17, 0x76, 0xeb, 0xec, 0x3d, 0x01, 0x2c, 0xf6, 0xe0, 0x3d, 0x04, 0xd4, - 0x80, 0x80, 0x6d, 0x94, 0x7a, 0x7a, 0x6d, 0x00, 0x00, 0x01, 0xff, 0x6f, - 0xfe, 0x57, 0x00, 0x6c, 0xff, 0xca, 0x00, 0x11, 0x00, 0x10, 0xb5, 0x05, - 0x00, 0x80, 0x0d, 0x03, 0x09, 0x00, 0x2f, 0x33, 0x33, 0x1a, 0xcc, 0x39, - 0x31, 0x30, 0x03, 0x11, 0x34, 0x27, 0x33, 0x17, 0x33, 0x3e, 0x01, 0x33, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x8e, 0x03, 0x54, 0x04, - 0x02, 0x17, 0x37, 0x31, 0x24, 0x12, 0x1d, 0x3d, 0x35, 0xfe, 0x57, 0x01, - 0x18, 0x3e, 0x16, 0x4a, 0x30, 0x21, 0x03, 0x5a, 0x04, 0x47, 0x37, 0x9c, - 0x00, 0x01, 0xff, 0x74, 0x04, 0x7d, 0x00, 0x8d, 0x06, 0x21, 0x00, 0x06, - 0x00, 0x0c, 0xb3, 0x02, 0x00, 0x80, 0x04, 0x00, 0x2f, 0x1a, 0xce, 0x39, - 0x31, 0x30, 0x13, 0x15, 0x07, 0x17, 0x15, 0x25, 0x35, 0x8d, 0xaa, 0xaa, - 0xfe, 0xe7, 0x06, 0x21, 0x72, 0x60, 0x60, 0x72, 0xa9, 0x52, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xe8, 0xfe, 0x56, 0x01, 0xad, 0xff, 0xfa, 0x00, 0x06, - 0x00, 0x0d, 0x00, 0x17, 0x40, 0x09, 0x0b, 0x08, 0x0c, 0x09, 0x09, 0x04, - 0x02, 0x80, 0x06, 0x00, 0x2f, 0x1a, 0xce, 0x39, 0x33, 0x2f, 0x33, 0xcd, - 0x39, 0x31, 0x30, 0x17, 0x15, 0x05, 0x35, 0x37, 0x27, 0x35, 0x01, 0x23, - 0x03, 0x33, 0x17, 0x37, 0x33, 0x01, 0xfe, 0xe7, 0xaa, 0xaa, 0x02, 0x1c, - 0x52, 0xa9, 0x72, 0x60, 0x60, 0x72, 0xaf, 0x52, 0xa9, 0x72, 0x60, 0x60, - 0x72, 0xfe, 0xa5, 0x01, 0x19, 0xaa, 0xaa, 0x00, 0xff, 0xff, 0x00, 0x04, - 0xfe, 0x57, 0x05, 0x52, 0x05, 0x81, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xe7, 0x02, 0xac, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, - 0x03, 0x02, 0x17, 0x01, 0x17, 0x11, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xfe, 0x57, 0x04, 0x73, - 0x04, 0x4e, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0xe7, - 0x02, 0x39, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x37, 0xb8, 0xff, - 0xd4, 0xb4, 0x37, 0x31, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x25, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x9e, 0x01, 0x25, - 0x00, 0x18, 0xb6, 0x03, 0x22, 0x22, 0x05, 0x26, 0x03, 0x20, 0xb8, 0xff, - 0xcb, 0xb4, 0x20, 0x22, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0xff, 0xec, 0x04, 0x1d, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x45, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x92, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x02, 0x27, 0x27, 0x11, 0x26, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x04, 0xea, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0x14, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x20, 0xb8, 0xff, 0xb4, - 0xb4, 0x20, 0x22, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x84, 0xfe, 0xc9, 0x04, 0x1d, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x45, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x02, 0xf2, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x02, 0x25, 0x0a, 0x25, 0x27, 0x0a, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xbc, 0x04, 0xea, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x80, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x21, 0xb8, 0xff, 0xb7, - 0xb4, 0x21, 0x22, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x84, 0xfe, 0xbc, 0x04, 0x1d, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x45, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x02, 0x37, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x26, 0xb8, 0xff, 0xe6, 0xb4, 0x26, 0x27, 0x0a, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x68, - 0xfe, 0x4e, 0x05, 0x79, 0x06, 0xf0, 0x10, 0x27, 0x08, 0xfe, 0x02, 0x17, - 0x00, 0x00, 0x10, 0x26, 0x00, 0x26, 0x00, 0x00, 0x11, 0x07, 0x00, 0x7a, - 0x01, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0xb7, 0x00, 0x05, 0x05, 0x05, 0x26, - 0x20, 0x34, 0x01, 0x5d, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xfe, 0x62, 0x03, 0xca, 0x05, 0xe4, 0x10, 0x27, 0x00, 0x7a, 0x01, 0x12, - 0x00, 0x14, 0x10, 0x26, 0x00, 0x46, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x67, 0x00, 0x00, 0x00, 0x0e, 0xb7, 0x02, 0x32, 0x32, 0x11, 0x26, - 0x1f, 0x34, 0x01, 0x5d, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x65, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0xcc, 0x01, 0x25, 0x00, 0x18, 0xb6, 0x02, - 0x17, 0x17, 0x05, 0x26, 0x02, 0x15, 0xb8, 0xff, 0xbc, 0xb4, 0x15, 0x17, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x03, 0xef, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x04, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x02, 0x23, 0x23, 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x05, 0x65, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x27, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x48, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x15, 0xb8, 0xff, 0xab, 0xb4, 0x15, 0x17, 0x06, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0xc9, 0x03, 0xef, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, - 0x24, 0xb8, 0xff, 0xe5, 0xb4, 0x24, 0x26, 0x06, 0x12, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xbc, 0x05, 0x65, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x8a, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x16, 0xb8, 0xff, 0x83, - 0xb4, 0x16, 0x17, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0xbc, 0x03, 0xef, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x02, 0x29, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x02, 0x25, 0x06, 0x25, 0x26, 0x06, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x39, 0x05, 0x65, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, 0x11, 0x07, 0x02, 0xe8, - 0x02, 0x96, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x18, 0xb8, 0xff, 0x8d, - 0xb4, 0x18, 0x1d, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x39, 0x03, 0xef, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x02, 0xe8, 0x02, 0x1d, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x27, 0xb8, 0xff, 0xf8, 0xb4, 0x27, 0x2c, 0x06, - 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0x57, 0x05, 0x65, 0x05, 0x81, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xef, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, - 0x1b, 0xb8, 0xff, 0xb1, 0xb4, 0x1b, 0x15, 0x06, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, - 0x02, 0x12, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x2a, 0xb8, 0xff, 0xeb, - 0xb4, 0x2a, 0x24, 0x06, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc6, 0x02, 0xbc, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x13, 0x13, 0x05, 0x26, 0x02, 0x01, - 0x14, 0xb8, 0xff, 0xea, 0xb4, 0x14, 0x15, 0x01, 0x0b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x18, 0x06, 0xf7, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x8b, 0x00, 0xfa, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, - 0x00, 0xc4, 0x01, 0x13, 0x00, 0x21, 0x40, 0x17, 0x03, 0x1f, 0x1e, 0x01, - 0x30, 0x1e, 0xa0, 0x1e, 0xb0, 0x1e, 0xd0, 0x1e, 0xe0, 0x1e, 0xf0, 0x1e, - 0x06, 0x1e, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, 0x2f, - 0x5d, 0x71, 0x35, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc7, - 0x02, 0xbc, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x15, 0x05, 0x26, - 0x02, 0x01, 0x15, 0xb8, 0xff, 0xea, 0xb4, 0x15, 0x14, 0x01, 0x0b, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x18, 0x06, 0xf7, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, - 0x10, 0x27, 0x00, 0x76, 0x01, 0x6e, 0x01, 0x13, 0x11, 0x07, 0x02, 0x8b, - 0x00, 0xfa, 0x00, 0x00, 0x00, 0x21, 0x40, 0x17, 0x02, 0x1f, 0x1f, 0x01, - 0x30, 0x1f, 0xa0, 0x1f, 0xb0, 0x1f, 0xd0, 0x1f, 0xe0, 0x1f, 0xf0, 0x1f, - 0x06, 0x1f, 0x03, 0x20, 0x20, 0x11, 0x26, 0x00, 0x2b, 0x11, 0x35, 0x2f, - 0x5d, 0x71, 0x35, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x04, 0xfe, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, - 0x02, 0xc9, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x13, 0xb8, 0xff, 0xf1, - 0xb4, 0x13, 0x0d, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xfe, 0x57, 0x04, 0x18, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, 0x02, 0x49, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x02, 0x21, 0x0c, 0x21, 0x1b, 0x0c, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x04, 0xfe, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf2, - 0x02, 0xbc, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x15, 0xb8, 0xff, 0xea, - 0xb4, 0x15, 0x21, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xfe, 0x57, 0x04, 0x18, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf2, 0x02, 0x36, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x23, 0xb8, 0xff, 0xff, 0xb4, 0x23, 0x2f, 0x0c, - 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0x4e, 0x04, 0xfe, 0x07, 0x50, 0x10, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9a, 0x01, 0x81, 0x01, 0x6a, 0x11, 0x07, 0x00, 0x7a, - 0x01, 0xba, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0c, 0x0c, 0x05, - 0x26, 0x01, 0x0f, 0x00, 0x0f, 0x15, 0x01, 0x02, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, 0xfe, 0x4e, 0x04, 0x18, - 0x05, 0xe6, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9a, - 0x01, 0x10, 0x00, 0x00, 0x11, 0x07, 0x00, 0x7a, 0x01, 0x2a, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x1a, 0x1a, 0x11, 0x26, 0x02, 0x1d, 0x00, - 0x1d, 0x23, 0x0c, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x91, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x29, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0xcc, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0d, 0x0d, 0x05, 0x26, 0x01, 0x0b, 0x25, - 0x0b, 0x0d, 0x07, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x02, 0x3c, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x49, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x00, 0x82, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x19, 0x19, 0x02, 0x26, 0x01, 0x17, 0x4b, - 0x17, 0x19, 0x05, 0x15, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x67, 0xff, 0xec, 0x05, 0xa0, 0x06, 0x9c, 0x12, 0x26, - 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x01, 0xdb, 0x01, 0x49, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x20, 0x20, 0x05, 0x26, 0x01, 0x21, 0x1d, - 0x21, 0x22, 0x00, 0x18, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x03, 0xef, 0x05, 0x53, 0x12, 0x26, - 0x00, 0x4a, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xe6, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x30, 0x30, 0x11, 0x26, 0x02, 0x31, 0x09, - 0x31, 0x32, 0x11, 0x1c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0xf3, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0f, 0x0f, 0x05, 0x26, 0x01, 0x0d, 0x05, - 0x0d, 0x0f, 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0x7e, 0x01, 0x25, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1c, 0x1c, 0x02, 0x26, 0x01, 0x1a, 0x36, - 0x1a, 0x1c, 0x13, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x05, 0x20, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x6b, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0d, 0xb8, 0xff, 0xf0, 0xb4, 0x0d, 0x0f, 0x05, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, - 0xfe, 0xc9, 0x03, 0xee, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x1a, 0xb8, 0xff, 0xf4, 0xb4, 0x1a, 0x1c, 0x13, 0x07, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, - 0x06, 0xb2, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x01, 0x8d, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x13, 0x13, - 0x05, 0x26, 0x02, 0x01, 0x11, 0xb8, 0xff, 0xed, 0xb4, 0x11, 0x0f, 0x05, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x8e, 0x00, 0x00, 0x03, 0xee, 0x06, 0xe5, 0x12, 0x26, - 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x01, 0x22, 0x01, 0x6a, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x20, 0x20, 0x02, 0x26, 0x02, 0x01, - 0x1e, 0x27, 0x1e, 0x1c, 0x13, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x91, 0xfe, 0x4e, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, - 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0xfe, 0x4e, 0x03, 0xee, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, - 0xf5, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x72, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf0, - 0x02, 0xd7, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0f, 0xb8, 0xff, 0xf3, - 0xb4, 0x0f, 0x17, 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8e, 0xfe, 0x72, 0x03, 0xee, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf0, 0x02, 0x3e, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x1c, 0x00, 0x1c, 0x24, 0x13, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb5, 0xfe, 0x57, 0x02, 0x82, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf2, - 0x01, 0x1b, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0d, 0xb8, 0xff, 0xff, - 0xb4, 0x0d, 0x19, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x7c, 0xfe, 0x57, 0x02, 0x49, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x4c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf2, 0x00, 0xe2, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x02, 0x11, 0x00, 0x11, 0x1d, 0x05, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x02, 0x4d, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x09, 0x34, - 0x01, 0x22, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, 0x03, 0x02, 0x01, 0x11, - 0x11, 0x05, 0x26, 0x03, 0x02, 0x01, 0x0f, 0x06, 0x0f, 0x0d, 0x01, 0x03, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x02, 0x7b, 0x06, 0xe8, 0x12, 0x26, - 0x00, 0xf3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, 0xda, 0x00, 0x11, 0x07, - 0x00, 0x76, 0x00, 0x8b, 0x01, 0x04, 0x00, 0x23, 0x40, 0x18, 0x03, 0x1f, - 0x0e, 0x2f, 0x0e, 0x6f, 0x0e, 0x8f, 0x0e, 0x04, 0x9f, 0x0e, 0xaf, 0x0e, - 0xcf, 0x0e, 0x03, 0x0e, 0x02, 0x01, 0x08, 0x08, 0x11, 0x26, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x2f, 0x5d, 0x71, 0x35, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x05, 0x3f, 0x06, 0xf0, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x01, 0xd9, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x11, 0x11, 0x05, 0x26, 0x01, 0x0d, 0x01, 0x0d, 0x10, 0x05, 0x0b, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x8a, - 0x00, 0x00, 0x04, 0x03, 0x07, 0x18, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x00, 0x9b, 0x00, 0x28, 0x00, 0x18, 0xb6, 0x01, - 0x11, 0x11, 0x02, 0x26, 0x01, 0x0d, 0xb8, 0xff, 0x71, 0xb4, 0x0d, 0x10, - 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x05, 0x3f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2e, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x41, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0d, 0xb8, 0xff, 0xb7, 0xb4, 0x0d, 0x0f, 0x05, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8a, - 0xfe, 0xc9, 0x04, 0x03, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0d, 0xb8, 0xff, 0xc7, 0xb4, 0x0d, 0x0f, 0x05, 0x0b, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xbc, 0x05, 0x3f, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0xb6, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0e, 0xb8, 0xff, 0xc2, - 0xb4, 0x0e, 0x0f, 0x05, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x8a, 0xfe, 0xbc, 0x04, 0x03, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x4e, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x02, 0x26, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0e, 0xb8, 0xff, 0xdf, 0xb4, 0x0e, 0x0f, 0x05, - 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xc9, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x07, 0x09, 0x07, 0x09, 0x01, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x89, 0xfe, 0xc9, 0x01, 0x3e, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x4f, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x01, 0x7a, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x05, 0xb8, 0xff, 0xff, 0xb4, 0x05, 0x07, 0x01, - 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xc9, 0x04, 0x2f, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, - 0x10, 0x27, 0x09, 0x12, 0x03, 0x00, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x01, 0x27, 0x01, 0x49, 0x00, 0x0a, 0xb4, 0x02, 0x0a, 0x0a, 0x05, 0x26, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0xff, 0xd0, 0xfe, 0xc9, 0x01, 0xf5, - 0x06, 0xa1, 0x12, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x10, 0x27, 0x09, 0x12, - 0x01, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, 0xff, 0x9d, 0x01, 0x4e, - 0x00, 0x0a, 0xb4, 0x02, 0x08, 0x08, 0x02, 0x26, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xbc, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x02, 0x69, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x08, 0xb8, 0xff, 0xfd, 0xb4, 0x08, 0x09, 0x01, - 0x05, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd3, - 0xfe, 0xbc, 0x01, 0xf8, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4f, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xf3, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x06, 0x01, 0x06, 0x07, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x04, 0x2f, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2f, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, 0x02, 0x64, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0d, 0xb8, 0xff, 0xf4, 0xb4, 0x0d, 0x07, 0x01, - 0x05, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x9a, - 0xfe, 0x57, 0x02, 0x26, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4f, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xef, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0b, 0xb8, 0xff, 0xfc, 0xb4, 0x0b, 0x05, 0x01, 0x03, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x02, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x30, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x02, 0x88, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x20, 0x20, 0x05, - 0x26, 0x01, 0x1c, 0x4f, 0x1c, 0x1f, 0x0f, 0x1a, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x06, 0x23, - 0x05, 0xe4, 0x12, 0x26, 0x00, 0x50, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x02, 0xb7, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2f, 0x2f, 0x11, - 0x26, 0x01, 0x2b, 0x7d, 0x2b, 0x2e, 0x0c, 0x20, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x06, 0x02, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x30, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x02, 0x63, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1e, 0x1e, 0x05, - 0x26, 0x01, 0x1c, 0x04, 0x1c, 0x1e, 0x0f, 0x1a, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x06, 0x23, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x50, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x02, 0x63, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2d, 0x2d, 0x11, - 0x26, 0x01, 0x2b, 0x03, 0x2b, 0x2d, 0x0c, 0x20, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x06, 0x02, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x30, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0xf1, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x1c, 0x05, 0x1c, 0x1e, - 0x0f, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, - 0xfe, 0xc9, 0x06, 0x23, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x50, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0xee, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x2b, 0x01, 0x2b, 0x2d, 0x0c, 0x20, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x20, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0xed, 0x01, 0x25, - 0x00, 0x18, 0xb6, 0x01, 0x11, 0x11, 0x05, 0x26, 0x01, 0x0f, 0xb8, 0xff, - 0xff, 0xb4, 0x0f, 0x11, 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0x00, 0x00, 0x03, 0xee, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x54, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1e, 0x1e, 0x11, - 0x26, 0x01, 0x1c, 0x0f, 0x1c, 0x1e, 0x0d, 0x1a, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x05, 0x20, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0x71, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0f, 0xb8, 0xff, 0xf6, - 0xb4, 0x0f, 0x11, 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x88, 0xfe, 0xc9, 0x03, 0xee, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x51, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x02, 0xce, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x1c, 0xb8, 0xff, 0xfc, 0xb4, 0x1c, 0x1e, 0x0d, - 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xbc, 0x05, 0x20, 0x05, 0x81, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xf3, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x10, 0xb8, 0xff, 0xfe, 0xb4, 0x10, 0x11, 0x06, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xbc, 0x03, 0xee, - 0x04, 0x4e, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x3a, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x1d, 0xb8, 0xff, 0xff, - 0xb4, 0x1d, 0x1e, 0x0d, 0x1a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x05, 0x20, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, 0x02, 0xd8, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x15, 0xb8, 0xff, 0xef, 0xb4, 0x15, 0x0f, 0x06, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, - 0xfe, 0x57, 0x03, 0xee, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xef, 0x02, 0x3a, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x22, 0xb8, 0xff, 0xfa, 0xb4, 0x22, 0x1c, 0x0d, 0x1a, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc8, - 0x03, 0x23, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, 0x03, 0x02, 0x23, 0x05, - 0x26, 0x03, 0x02, 0x23, 0x07, 0x23, 0x2f, 0x08, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0xfa, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9e, 0x00, 0xeb, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, - 0x01, 0x8b, 0x00, 0x0a, 0x00, 0x2a, 0x40, 0x1c, 0x03, 0x7f, 0x34, 0x9f, - 0x34, 0xef, 0x34, 0x03, 0x50, 0x34, 0xc0, 0x34, 0x02, 0x34, 0x02, 0x17, - 0x17, 0x11, 0x26, 0x03, 0x02, 0x20, 0x00, 0x20, 0x2c, 0x06, 0x00, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc9, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x1c, 0x40, 0x10, 0x04, 0x03, 0x02, 0x2b, 0x05, 0x26, 0x04, 0x03, - 0x02, 0x2b, 0x04, 0x2b, 0x37, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x35, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0xbc, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9e, 0x00, 0xeb, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, - 0x00, 0xff, 0x00, 0x0a, 0x00, 0x5d, 0x40, 0x49, 0x04, 0x03, 0x1f, 0x34, - 0x2f, 0x34, 0x3f, 0x34, 0x5f, 0x34, 0x04, 0x1f, 0x34, 0x2f, 0x34, 0x3f, - 0x34, 0x4f, 0x34, 0x5f, 0x34, 0x6f, 0x34, 0xaf, 0x34, 0xdf, 0x34, 0x08, - 0x0f, 0x34, 0x1f, 0x34, 0x2f, 0x34, 0x3f, 0x34, 0x5f, 0x34, 0x6f, 0x34, - 0x7f, 0x34, 0x9f, 0x34, 0xef, 0x34, 0x09, 0xc0, 0x34, 0x01, 0x34, 0x02, - 0x17, 0x17, 0x11, 0x26, 0x04, 0x03, 0x33, 0x00, 0x33, 0x32, 0x20, 0x2c, - 0x25, 0x02, 0x20, 0x00, 0x20, 0x2c, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, - 0x72, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0xc6, - 0x02, 0xfb, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x22, 0x22, - 0x05, 0x26, 0x03, 0x02, 0x23, 0xb8, 0xff, 0xe0, 0xb4, 0x23, 0x24, 0x08, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0xf7, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x00, 0xeb, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0xb5, 0x01, 0x13, 0x00, 0x2e, 0x40, 0x20, - 0x03, 0x1f, 0x1e, 0x01, 0x30, 0x1e, 0xa0, 0x1e, 0xb0, 0x1e, 0xd0, 0x1e, - 0xe0, 0x1e, 0xf0, 0x1e, 0x06, 0x1e, 0x02, 0x17, 0x17, 0x11, 0x26, 0x03, - 0x02, 0x18, 0x00, 0x18, 0x17, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x71, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xc7, 0x02, 0xfe, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x03, - 0x02, 0x24, 0x05, 0x26, 0x03, 0x02, 0x24, 0xb8, 0xff, 0xe3, 0xb4, 0x24, - 0x23, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0xf7, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x00, 0xeb, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x76, 0x01, 0x5f, 0x01, 0x13, 0x00, 0x2e, 0x40, 0x20, - 0x03, 0x1f, 0x1e, 0x01, 0x30, 0x1e, 0xa0, 0x1e, 0xb0, 0x1e, 0xd0, 0x1e, - 0xe0, 0x1e, 0xf0, 0x1e, 0x06, 0x1e, 0x02, 0x17, 0x17, 0x11, 0x26, 0x03, - 0x02, 0x18, 0x00, 0x18, 0x17, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x71, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xea, 0x06, 0xf0, 0x12, 0x26, 0x00, 0x33, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x01, 0xac, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x17, 0x17, 0x05, 0x26, 0x02, 0x13, 0xb8, 0xff, 0xff, 0xb4, 0x13, 0x16, - 0x07, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x1d, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x53, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x6d, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x2a, 0x2a, 0x11, 0x26, 0x02, 0x26, 0x38, - 0x26, 0x29, 0x0c, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xea, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x33, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, 0x01, 0xc7, 0x01, 0x25, - 0x00, 0x18, 0xb6, 0x02, 0x15, 0x15, 0x05, 0x26, 0x02, 0x13, 0xb8, 0xff, - 0xf4, 0xb4, 0x13, 0x15, 0x07, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x1d, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x53, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x73, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x28, 0x28, 0x11, - 0x26, 0x02, 0x26, 0x18, 0x26, 0x28, 0x0c, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x05, 0x68, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0xc2, 0x01, 0x25, 0x00, 0x18, 0xb6, 0x02, 0x1a, 0x1a, 0x05, 0x26, - 0x02, 0x18, 0xb8, 0xff, 0xb0, 0xb4, 0x18, 0x1a, 0x05, 0x0d, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, - 0x00, 0x00, 0x02, 0x88, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x17, 0x17, 0x11, 0x26, 0x01, 0x15, 0x0e, 0x15, 0x17, 0x03, 0x0d, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xc9, 0x05, 0x68, 0x05, 0x81, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x66, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, - 0x18, 0xb8, 0xff, 0xc7, 0xb4, 0x18, 0x1a, 0x05, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x88, 0xfe, 0xc9, 0x02, 0x88, - 0x04, 0x4e, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0x1d, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x15, 0xb8, 0xff, 0xfe, - 0xb4, 0x15, 0x17, 0x03, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xc9, 0x05, 0x68, 0x06, 0x9c, 0x12, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x01, 0x88, 0x01, 0x49, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x66, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x02, 0x18, 0x05, 0x26, 0x02, 0x18, 0x00, 0x18, 0x17, 0x05, 0x09, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x74, - 0xfe, 0xc9, 0x02, 0x99, 0x05, 0x53, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, - 0x10, 0x27, 0x09, 0x12, 0x02, 0x1d, 0x00, 0x00, 0x11, 0x06, 0x02, 0x8b, - 0x41, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x18, 0x18, 0x11, 0x26, 0x01, - 0x19, 0x00, 0x19, 0x18, 0x00, 0x0c, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, 0xfe, 0xbc, 0x05, 0x68, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x03, 0x06, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x19, 0xb8, 0xff, 0xfe, - 0xb4, 0x19, 0x1a, 0x05, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x54, 0xfe, 0xbc, 0x02, 0x88, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x55, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x01, 0x67, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x16, 0xb8, 0xff, 0xdf, 0xb4, 0x16, 0x17, 0x03, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, - 0xff, 0xec, 0x04, 0xf8, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0xcc, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x31, 0x31, 0x05, 0x26, 0x01, 0x2f, 0x17, 0x2f, 0x31, 0x05, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x39, - 0xff, 0xec, 0x03, 0xb6, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0x05, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x2e, 0x2e, 0x11, 0x26, 0x01, 0x2c, 0x03, 0x2c, 0x2e, 0x06, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x5d, - 0xfe, 0xc9, 0x04, 0xf8, 0x05, 0x96, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x44, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x2f, 0x02, 0x2f, 0x31, 0x05, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x39, 0xfe, 0xc9, 0x03, 0xb6, 0x04, 0x4b, 0x12, 0x26, - 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x02, 0x8f, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x2c, 0x00, 0x2c, 0x2e, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, - 0x07, 0x15, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x09, 0xca, - 0x02, 0xbc, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x37, 0x37, - 0x05, 0x26, 0x02, 0x01, 0x30, 0x6a, 0x30, 0x36, 0x05, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x39, - 0xff, 0xec, 0x03, 0xb6, 0x05, 0xd8, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xca, 0x01, 0xd6, 0xfe, 0xc3, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x34, 0x34, 0x11, 0x26, 0x02, 0x01, 0x2d, 0x37, 0x2d, 0x33, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x5d, 0xff, 0xec, 0x04, 0xf8, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x09, 0xcb, 0x02, 0xa3, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x33, 0x33, 0x05, 0x26, 0x02, 0x01, - 0x35, 0xb8, 0xff, 0xf9, 0xb4, 0x35, 0x3b, 0x05, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x39, - 0xff, 0xec, 0x03, 0xb6, 0x05, 0xee, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xcb, 0x01, 0xfb, 0xfe, 0xc3, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x30, 0x30, 0x11, 0x26, 0x02, 0x01, 0x32, 0x03, 0x32, 0x38, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x5d, 0xfe, 0xc9, 0x04, 0xf8, 0x06, 0xf1, 0x12, 0x26, - 0x00, 0x36, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9b, 0x01, 0xb4, 0x01, 0x25, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x43, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x2e, 0x2e, 0x05, 0x26, 0x01, 0x2f, 0x17, 0x2f, 0x31, 0x05, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x39, - 0xfe, 0xc9, 0x03, 0xb6, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9b, 0x01, 0x01, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0x8f, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x2e, 0x2e, 0x11, - 0x26, 0x01, 0x2c, 0x03, 0x2c, 0x2e, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x04, 0xb4, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x7b, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0b, 0x0b, 0x05, - 0x26, 0x01, 0x09, 0x00, 0x09, 0x0b, 0x05, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf0, 0x02, 0x2a, - 0x06, 0xd9, 0x12, 0x26, 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x00, 0x25, 0x01, 0x0d, 0x00, 0x18, 0xb6, 0x01, 0x18, 0x18, 0x05, 0x26, - 0x01, 0x16, 0xb8, 0xff, 0xf7, 0xb4, 0x16, 0x18, 0x07, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, - 0xfe, 0xc9, 0x04, 0xb4, 0x05, 0x81, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x08, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x09, 0x00, 0x09, 0x0b, 0x05, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x1f, 0xfe, 0xc9, 0x02, 0x2a, 0x05, 0x2c, 0x12, 0x26, - 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x01, 0xf4, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x16, 0x38, 0x16, 0x18, 0x07, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xfe, 0xbc, 0x04, 0xb4, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x70, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0a, 0xb8, 0xff, 0xff, - 0xb4, 0x0a, 0x0b, 0x05, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x1f, 0xfe, 0xbc, 0x02, 0x60, 0x05, 0x2c, 0x12, 0x26, - 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, 0x01, 0x4e, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x17, 0x29, 0x17, 0x18, 0x07, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xfe, 0x57, 0x04, 0xb4, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, - 0x02, 0x71, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x0f, 0xb8, 0xff, 0xfb, - 0xb4, 0x0f, 0x09, 0x05, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x08, 0xfe, 0x57, 0x02, 0x94, 0x05, 0x2c, 0x12, 0x26, - 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, 0x01, 0x53, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x1c, 0x29, 0x1c, 0x16, 0x07, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x57, 0x05, 0x29, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0xe6, - 0x02, 0xe2, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x02, 0x01, 0x19, 0xb8, 0xff, - 0xfe, 0xb4, 0x19, 0x17, 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xfe, 0x57, 0x03, 0xeb, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0xe6, 0x02, 0x3a, 0x00, 0x00, - 0x00, 0x0f, 0x40, 0x09, 0x02, 0x01, 0x20, 0x01, 0x20, 0x1e, 0x1a, 0x0d, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, - 0xfe, 0x57, 0x05, 0x29, 0x05, 0x81, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xf2, 0x02, 0xe3, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x1d, 0x00, 0x1d, 0x29, 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xfe, 0x57, 0x03, 0xeb, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf2, 0x02, 0x39, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x24, 0x01, 0x24, 0x30, 0x1a, 0x0d, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x57, 0x05, 0x29, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, - 0x02, 0xe5, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x1b, 0xb8, 0xff, 0xfd, - 0xb4, 0x1b, 0x15, 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xfe, 0x57, 0x03, 0xeb, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x11, 0x07, 0x02, 0xef, 0x02, 0x26, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x22, 0xb8, 0xff, 0xe9, 0xb4, 0x22, 0x1c, 0x1a, - 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, - 0xff, 0xec, 0x05, 0x29, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xc8, 0x02, 0xe3, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, - 0x02, 0x01, 0x1c, 0x05, 0x26, 0x02, 0x01, 0x1c, 0x00, 0x1c, 0x28, 0x05, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, 0x06, 0xfa, 0x12, 0x26, - 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9e, 0x00, 0xdc, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x01, 0x63, 0x00, 0x0a, 0x00, 0x2a, 0x40, 0x1c, - 0x02, 0x7f, 0x35, 0x9f, 0x35, 0xef, 0x35, 0x03, 0x50, 0x35, 0xc0, 0x35, - 0x02, 0x35, 0x01, 0x1b, 0x1b, 0x11, 0x26, 0x02, 0x01, 0x24, 0x00, 0x24, - 0x30, 0x1a, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x2f, 0x5d, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0xcc, - 0x02, 0xe1, 0x00, 0x00, 0x00, 0x21, 0x40, 0x0b, 0x03, 0x02, 0x01, 0x1d, - 0x1d, 0x05, 0x26, 0x03, 0x02, 0x01, 0x1b, 0xb8, 0xff, 0xfe, 0xb4, 0x1b, - 0x15, 0x05, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xeb, - 0x06, 0x75, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, - 0x00, 0xf4, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0xec, 0x00, 0xfa, - 0x00, 0x45, 0x40, 0x32, 0x03, 0x02, 0x1f, 0x24, 0x2f, 0x24, 0x3f, 0x24, - 0x4f, 0x24, 0x6f, 0x24, 0x05, 0x0f, 0x24, 0x3f, 0x24, 0x02, 0xc0, 0x24, - 0xd0, 0x24, 0xe0, 0x24, 0xf0, 0x24, 0x04, 0x24, 0x01, 0x1b, 0x1b, 0x11, - 0x26, 0x03, 0x02, 0x23, 0x00, 0x23, 0x22, 0x1d, 0x1e, 0x25, 0x01, 0x1c, - 0x00, 0x1c, 0x1b, 0x1a, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x2b, 0x11, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x05, 0x4d, 0x07, 0x06, 0x12, 0x26, - 0x00, 0x39, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, 0x01, 0x61, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x12, 0x05, 0x26, 0x01, 0x12, 0x05, 0x12, - 0x1e, 0x02, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xbd, 0x12, 0x26, - 0x00, 0x59, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xae, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x01, 0x14, 0x11, 0x26, 0x01, 0x14, 0xb8, 0xff, 0xfe, - 0xb4, 0x14, 0x20, 0x02, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x09, 0xfe, 0xc9, 0x05, 0x4d, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x39, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x40, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0a, 0xb8, 0xff, 0xfe, 0xb4, 0x0a, 0x0c, 0x02, - 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, - 0xfe, 0xc9, 0x03, 0xf9, 0x04, 0x3a, 0x12, 0x26, 0x00, 0x59, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0c, 0xb8, 0xff, 0xf6, 0xb4, 0x0c, 0x0e, 0x02, 0x0a, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x07, 0x86, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, - 0x02, 0x41, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x1a, 0x1a, 0x05, 0x26, - 0x01, 0x1b, 0xb8, 0xff, 0xb8, 0xb4, 0x1b, 0x1e, 0x09, 0x19, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x05, 0xcc, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x01, 0x48, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x15, 0x15, 0x11, 0x26, 0x01, 0x16, 0xb8, 0xff, 0xa2, 0xb4, 0x16, 0x19, - 0x08, 0x14, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x07, 0x86, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x3a, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x02, 0xf7, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1a, 0x05, 0x26, 0x01, 0x1a, 0x4b, 0x1a, - 0x1d, 0x09, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x05, 0xcc, 0x05, 0xe4, 0x12, 0x26, - 0x00, 0x5a, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x02, 0x26, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x15, 0x11, 0x26, 0x01, 0x15, 0x5d, 0x15, - 0x18, 0x08, 0x14, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x07, 0x86, 0x06, 0xb2, 0x12, 0x26, - 0x00, 0x3a, 0x00, 0x00, 0x11, 0x07, 0x09, 0x01, 0x02, 0x86, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x1a, 0x1a, 0x05, 0x26, 0x02, 0x01, - 0x1e, 0x02, 0x1e, 0x1c, 0x09, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x05, 0xcc, - 0x05, 0x7b, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, - 0x01, 0xa1, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x15, 0x15, - 0x11, 0x26, 0x02, 0x01, 0x19, 0x00, 0x19, 0x17, 0x08, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x09, - 0x00, 0x00, 0x07, 0x86, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x02, 0xd2, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1d, 0x1d, 0x05, 0x26, 0x01, 0x1b, 0x00, 0x1b, 0x1d, 0x09, 0x19, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x05, 0xcc, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0xee, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x18, 0x18, 0x11, 0x26, 0x01, 0x16, 0x00, 0x16, 0x18, 0x08, 0x14, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x09, - 0xfe, 0xc9, 0x07, 0x86, 0x05, 0x81, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x04, 0x5f, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x1b, 0x00, 0x1b, 0x1d, 0x09, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xc9, 0x05, 0xcc, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x5a, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x7c, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x16, 0x00, 0x16, 0x18, 0x08, 0x14, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x2b, - 0x06, 0xf1, 0x12, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0xbf, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0f, 0x0f, 0x05, - 0x26, 0x01, 0x0d, 0x08, 0x0d, 0x0f, 0x03, 0x0b, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x03, 0xea, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9b, - 0x01, 0x09, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0f, 0x0f, 0x11, 0x26, - 0x01, 0x0d, 0xb8, 0xff, 0xff, 0xb4, 0x0d, 0x0f, 0x03, 0x0b, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, - 0x00, 0x00, 0x05, 0x2b, 0x06, 0xb2, 0x12, 0x26, 0x00, 0x3b, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x01, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x13, 0x13, 0x05, 0x26, 0x02, 0x01, 0x11, 0x06, 0x11, 0x0f, - 0x03, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x03, 0xea, 0x05, 0x7b, 0x12, 0x26, - 0x00, 0x5b, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0xba, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x13, 0x13, 0x11, 0x26, 0x02, 0x01, - 0x11, 0xb8, 0xff, 0xfd, 0xb4, 0x11, 0x0f, 0x03, 0x0b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2d, - 0x00, 0x00, 0x05, 0x29, 0x06, 0xf1, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0xb8, 0x01, 0x25, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x0c, 0x0c, 0x05, 0x26, 0x01, 0x0a, 0x03, 0x0a, 0x0c, 0x04, 0x08, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x05, - 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x01, 0x19, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1a, 0x1a, 0x11, 0x26, 0x01, 0x18, 0x0e, 0x18, 0x1a, 0x09, 0x12, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x41, - 0x00, 0x00, 0x04, 0xa3, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xff, 0x01, 0x41, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x10, 0x10, 0x05, 0x26, 0x01, 0x11, 0x1a, 0x11, 0x0b, 0x02, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x53, - 0x00, 0x00, 0x03, 0x9a, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x88, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x10, 0x10, 0x11, 0x26, 0x01, 0x11, 0xb8, 0xff, 0xfa, 0xb4, 0x11, 0x0b, - 0x01, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x41, 0xfe, 0xc9, 0x04, 0xa3, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x3d, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x08, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x0b, 0xb8, 0xff, 0xff, 0xb4, 0x0b, 0x0d, 0x02, - 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0xc9, 0x03, 0x9a, 0x04, 0x3a, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0x88, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0b, 0xb8, 0xff, 0xfb, 0xb4, 0x0b, 0x0d, 0x01, 0x09, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x41, 0xfe, 0xbc, 0x04, 0xa3, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x72, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x0c, 0x00, 0x0c, 0x0d, - 0x02, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0xbc, 0x03, 0x9a, 0x04, 0x3a, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xf3, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0c, 0xb8, 0xff, 0xfd, 0xb4, 0x0c, 0x0d, 0x01, 0x09, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0xfe, 0xbc, 0x03, 0xee, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x11, 0x07, 0x02, 0xf3, - 0x02, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x1b, 0xb8, 0xff, 0xfe, - 0xb4, 0x1b, 0x1c, 0x13, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x0b, 0xff, 0xf0, 0x02, 0x38, 0x06, 0x88, 0x12, 0x26, - 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0xff, 0xde, 0x01, 0x0d, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x1c, 0x1c, 0x05, 0x26, 0x02, 0x01, - 0x1a, 0xb8, 0xff, 0xfd, 0xb4, 0x1a, 0x18, 0x07, 0x14, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xfd, - 0x00, 0x00, 0x05, 0xcc, 0x06, 0x73, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9c, 0x01, 0xbc, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x18, 0x18, 0x11, 0x26, 0x02, 0x01, 0x1b, 0xb8, 0xff, 0xfd, - 0xb4, 0x1b, 0x15, 0x08, 0x14, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, - 0x06, 0x73, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9c, - 0x00, 0xe7, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x1a, 0x1a, - 0x11, 0x26, 0x02, 0x01, 0x1d, 0x0b, 0x1d, 0x17, 0x09, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x05, 0xf3, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x3e, 0x11, 0x26, 0x02, 0x3e, 0xb8, 0xff, 0xef, 0xb4, 0x3e, 0x3b, 0x03, - 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x8a, - 0x00, 0x00, 0x02, 0x11, 0x06, 0xf1, 0x12, 0x26, 0x01, 0x41, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9b, 0x00, 0x50, 0x01, 0x25, 0x00, 0x18, 0xb6, 0x01, - 0x11, 0x11, 0x02, 0x26, 0x01, 0x0f, 0xb8, 0xff, 0xf9, 0xb4, 0x0f, 0x11, - 0x02, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa8, 0xff, 0xec, 0x05, 0x43, 0x05, 0x96, 0x00, 0x25, - 0x00, 0x51, 0x40, 0x2a, 0x06, 0x10, 0x23, 0x03, 0x22, 0x1b, 0x1b, 0x1c, - 0x12, 0x22, 0x22, 0x0c, 0x00, 0x1c, 0x00, 0x26, 0x27, 0x11, 0x23, 0x23, - 0x0f, 0x60, 0x59, 0x12, 0x23, 0x23, 0x20, 0x04, 0x20, 0x15, 0x5f, 0x59, - 0x20, 0x04, 0x1c, 0x12, 0x04, 0x09, 0x5f, 0x59, 0x04, 0x13, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, - 0x14, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, - 0x34, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x02, - 0x15, 0x11, 0x23, 0x11, 0x10, 0x00, 0x21, 0x20, 0x13, 0x01, 0x1e, 0x01, - 0x05, 0x43, 0x77, 0xdd, 0x8e, 0x9e, 0x82, 0x1b, 0x6b, 0x8e, 0x9a, 0x94, - 0xa8, 0xd2, 0x45, 0x01, 0x35, 0x32, 0xac, 0x56, 0x63, 0x86, 0x50, 0x25, - 0xbf, 0x01, 0x03, 0x01, 0x1c, 0x01, 0x64, 0xbe, 0xfe, 0xb5, 0xc8, 0xdd, - 0x01, 0x90, 0x80, 0xbe, 0x66, 0x20, 0x9e, 0x27, 0x8e, 0x7f, 0x8c, 0x7b, - 0x8c, 0x01, 0x5f, 0x37, 0x41, 0x2e, 0x5e, 0x9e, 0x96, 0xfc, 0xc6, 0x03, - 0x28, 0x01, 0x49, 0x01, 0x25, 0xfe, 0xf3, 0xfe, 0x9d, 0x0e, 0xd4, 0x00, - 0xff, 0xff, 0x00, 0x04, 0xfe, 0xc9, 0x05, 0x52, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x34, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x12, 0xb8, 0xff, 0xf2, 0xb4, 0x12, 0x14, 0x04, - 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xfe, 0xc9, 0x04, 0x73, 0x04, 0x4e, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xc8, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, - 0x32, 0xb8, 0xff, 0xcc, 0xb4, 0x32, 0x34, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x03, 0xd4, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x02, 0x20, 0x20, 0x05, - 0x26, 0x02, 0x17, 0x18, 0x17, 0x1b, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, - 0x05, 0xf6, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x03, 0x34, 0xfe, 0xcb, 0x00, 0x18, 0xb6, 0x02, 0x40, 0x40, 0x11, 0x26, - 0x02, 0x37, 0xb8, 0xff, 0xbf, 0xb4, 0x37, 0x3b, 0x03, 0x1b, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xfc, 0x02, 0xad, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x1d, 0x1d, 0x05, 0x26, 0x03, 0x02, 0x1e, 0x66, 0x1e, 0x13, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0x26, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x04, 0x02, 0x45, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x3d, 0x3d, 0x11, 0x26, 0x03, 0x02, - 0x3e, 0x44, 0x3e, 0x33, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0xfd, - 0x02, 0xad, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x1d, 0x1d, - 0x05, 0x26, 0x03, 0x02, 0x15, 0xb8, 0xff, 0x9a, 0xb4, 0x15, 0x18, 0x04, - 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x31, 0xff, 0xec, 0x04, 0x73, 0x06, 0x26, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x05, 0x02, 0x45, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x3f, 0x3f, 0x11, 0x26, 0x03, 0x02, - 0x35, 0xb8, 0xff, 0x79, 0xb4, 0x35, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xfe, 0x02, 0xad, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x28, 0x28, 0x05, 0x26, 0x03, 0x02, 0x29, 0x3d, 0x29, 0x1a, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0x75, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x06, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x49, 0x49, 0x11, 0x26, 0x03, 0x02, - 0x4a, 0x17, 0x4a, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x09, 0xff, - 0x02, 0xac, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x31, 0x31, - 0x05, 0x26, 0x03, 0x02, 0x19, 0x01, 0x19, 0x25, 0x04, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, - 0xff, 0xec, 0x04, 0x73, 0x06, 0xef, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x11, 0x07, 0x0a, 0x07, 0x02, 0x31, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x39, 0x39, 0x11, 0x26, 0x03, 0x02, 0x43, 0xb8, 0xff, 0xca, - 0xb4, 0x43, 0x34, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0xc9, 0x05, 0x52, - 0x06, 0xfe, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x27, 0x08, 0xff, - 0x01, 0x60, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x43, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x13, 0x13, 0x05, 0x26, 0x02, 0x17, 0x00, - 0x17, 0x12, 0x05, 0x06, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xfe, 0xc9, 0x04, 0x73, 0x05, 0xd3, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x10, 0x27, 0x02, 0x88, 0x00, 0xde, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x36, 0x36, 0x11, 0x26, 0x02, 0x37, 0x00, 0x37, 0x32, 0x03, 0x14, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x0a, 0x00, 0x02, 0xae, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x17, 0x17, 0x05, 0x26, 0x03, 0x02, 0x1a, 0x03, 0x1a, 0x22, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x08, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x03, 0x02, - 0x34, 0xb8, 0xff, 0xcc, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x0a, 0x01, 0x02, 0xae, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x17, 0x17, 0x05, 0x26, 0x03, 0x02, 0x1a, 0x03, 0x1a, 0x22, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0xf0, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x09, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x03, 0x02, - 0x34, 0xb8, 0xff, 0xcc, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x0a, 0x02, 0x02, 0xae, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x11, 0x11, 0x05, 0x26, 0x03, 0x02, 0x14, 0x03, 0x14, 0x1c, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x0a, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x03, 0x02, - 0x34, 0xb8, 0xff, 0xcc, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x0a, 0x03, 0x02, 0xac, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x11, 0x11, 0x05, 0x26, 0x03, 0x02, 0x25, 0x01, 0x25, 0x32, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x73, 0x06, 0xef, 0x12, 0x26, - 0x00, 0x44, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x0b, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x31, 0x31, 0x11, 0x26, 0x03, 0x02, - 0x34, 0xb8, 0xff, 0xcc, 0xb4, 0x34, 0x3a, 0x03, 0x1b, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0xfe, 0xc9, 0x05, 0x52, 0x06, 0xf3, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x10, 0x27, 0x09, 0x04, 0x01, 0x76, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0x34, 0x00, 0x00, 0x00, 0x24, 0x40, 0x0f, 0x02, 0x11, 0x11, 0x05, - 0x26, 0x02, 0x14, 0x00, 0x14, 0x1c, 0x05, 0x06, 0x25, 0x03, 0x20, 0xb8, - 0xff, 0xf2, 0xb4, 0x20, 0x21, 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xfe, 0xc9, 0x04, 0x73, 0x05, 0xe6, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9a, 0x01, 0x04, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0xc8, 0x00, 0x00, 0x00, 0x24, 0x40, 0x0f, 0x02, 0x31, 0x31, 0x11, - 0x26, 0x02, 0x34, 0x00, 0x34, 0x3a, 0x03, 0x15, 0x25, 0x03, 0x3e, 0xb8, - 0xff, 0xcc, 0xb4, 0x3e, 0x40, 0x03, 0x1b, 0x25, 0x2b, 0x11, 0x35, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xc9, 0x04, 0xfe, 0x05, 0x81, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x5c, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x0d, 0xb8, 0xff, 0xf2, 0xb4, 0x0d, 0x0f, 0x01, 0x0b, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xfe, 0xc9, 0x04, 0x18, - 0x04, 0x4e, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0xda, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x02, 0x1b, 0x0b, 0x1b, 0x1d, - 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xcb, 0x03, 0xdb, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1b, 0x1b, 0x05, 0x26, 0x01, 0x12, 0xb8, 0xff, 0xf8, 0xb4, 0x12, 0x16, - 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xf6, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, 0x03, 0x52, 0xfe, 0xcb, - 0x00, 0x16, 0x40, 0x0d, 0x02, 0x29, 0x29, 0x11, 0x26, 0x02, 0x20, 0x0a, - 0x20, 0x24, 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x07, 0x06, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, 0x01, 0x86, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x15, 0x05, 0x26, 0x01, 0x15, 0x02, 0x15, - 0x21, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, 0x05, 0xbd, 0x12, 0x26, - 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x02, 0x23, 0x11, 0x26, 0x02, 0x23, 0x08, 0x23, - 0x2f, 0x0c, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0xfc, 0x02, 0xd5, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x18, 0x18, 0x05, 0x26, 0x02, 0x01, - 0x19, 0x66, 0x19, 0x0e, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x56, - 0x06, 0x26, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x04, - 0x02, 0x45, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x26, 0x26, - 0x11, 0x26, 0x03, 0x02, 0x27, 0x71, 0x27, 0x1c, 0x0c, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xfd, 0x02, 0xd1, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x18, 0x18, 0x05, 0x26, 0x02, 0x01, 0x10, 0xb8, 0xff, 0x96, - 0xb4, 0x10, 0x13, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x31, 0xff, 0xec, 0x04, 0x18, - 0x06, 0x26, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x05, - 0x02, 0x45, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x28, 0x28, - 0x11, 0x26, 0x03, 0x02, 0x1e, 0xb8, 0xff, 0xa7, 0xb4, 0x1e, 0x23, 0x0c, - 0x12, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x09, 0xfe, 0x02, 0xc1, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x23, 0x23, 0x05, 0x26, 0x02, 0x01, - 0x24, 0x29, 0x24, 0x15, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x1b, - 0x06, 0x75, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x06, - 0x02, 0x3b, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x32, 0x32, - 0x11, 0x26, 0x03, 0x02, 0x33, 0x4f, 0x33, 0x23, 0x0c, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0x00, 0x00, 0x04, 0xfe, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xff, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x2c, 0x2c, 0x05, 0x26, 0x02, 0x01, 0x14, 0xb8, 0xff, 0xfe, - 0xb4, 0x14, 0x20, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, 0xff, 0xec, 0x04, 0x18, - 0x06, 0xef, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x07, - 0x02, 0x31, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x03, 0x02, 0x22, 0x11, 0x26, - 0x03, 0x02, 0x2c, 0xb8, 0xff, 0xf7, 0xb4, 0x2c, 0x1d, 0x0c, 0x12, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0xa8, - 0xfe, 0xc9, 0x04, 0xfe, 0x06, 0xfe, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, - 0x10, 0x27, 0x08, 0xff, 0x01, 0x77, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0x5c, 0x00, 0x00, 0x00, 0x24, 0x40, 0x0f, 0x01, 0x11, 0x11, 0x05, - 0x26, 0x01, 0x12, 0x00, 0x12, 0x0d, 0x01, 0x02, 0x25, 0x02, 0x17, 0xb8, - 0xff, 0xf2, 0xb4, 0x17, 0x18, 0x01, 0x0b, 0x25, 0x2b, 0x11, 0x35, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, - 0xfe, 0xc9, 0x04, 0x18, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x88, 0x00, 0xe9, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0xda, 0x00, 0x00, 0x00, 0x08, 0xb3, 0x02, 0x20, 0x11, 0x26, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x51, 0x00, 0x00, 0x02, 0x02, - 0x07, 0x2b, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x02, 0x3a, 0x00, 0x00, 0x00, 0x5e, 0x40, 0x4e, 0x01, 0x13, 0x13, 0x05, - 0x26, 0x01, 0x0a, 0x0d, 0x0a, 0x0e, 0x01, 0x03, 0x25, 0x0f, 0x18, 0x01, - 0x13, 0x00, 0x18, 0x10, 0x18, 0x20, 0x18, 0x30, 0x18, 0x40, 0x18, 0x05, - 0x39, 0x00, 0x18, 0x40, 0x18, 0x50, 0x18, 0x60, 0x18, 0x70, 0x18, 0xa0, - 0x18, 0xb0, 0x18, 0xf0, 0x18, 0x08, 0x00, 0x18, 0x10, 0x18, 0x40, 0x18, - 0x50, 0x18, 0xa0, 0x18, 0xb0, 0x18, 0xc0, 0x18, 0xf0, 0x18, 0x08, 0x20, - 0x18, 0x40, 0x18, 0x50, 0x18, 0x60, 0x18, 0x70, 0x18, 0x90, 0x18, 0xf0, - 0x18, 0x07, 0x5d, 0x71, 0x72, 0x5e, 0x5d, 0x5e, 0x5d, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x01, 0xbb, - 0x06, 0x0b, 0x10, 0x26, 0x09, 0x32, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x01, 0xf3, 0xfe, 0xe0, 0x00, 0x44, 0x40, 0x36, 0x01, 0x13, 0x13, 0x11, - 0x26, 0x01, 0x0a, 0x00, 0x0a, 0x0e, 0x01, 0x03, 0x25, 0x1f, 0x18, 0x9f, - 0x18, 0xdf, 0x18, 0xff, 0x18, 0x04, 0x4f, 0x18, 0xdf, 0x18, 0x02, 0x1f, - 0x18, 0x01, 0x00, 0x18, 0x70, 0x18, 0x80, 0x18, 0xb0, 0x18, 0xc0, 0x18, - 0xe0, 0x18, 0x06, 0x90, 0x18, 0xa0, 0x18, 0xb0, 0x18, 0xc0, 0x18, 0xf0, - 0x18, 0x05, 0x71, 0x72, 0x5d, 0x71, 0x72, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbc, 0xfe, 0xc9, 0x01, 0x7c, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x01, 0xad, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, 0x05, 0xb8, 0xff, 0xfa, - 0xb4, 0x05, 0x07, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x89, 0xfe, 0xc9, 0x01, 0x3d, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x4c, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x01, 0x7a, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x02, 0x09, 0x00, 0x09, 0x0b, 0x05, 0x07, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xfe, 0xc9, 0x05, 0xd7, - 0x05, 0x96, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x03, 0xac, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x1c, 0xb8, 0xff, 0xf9, - 0xb4, 0x1c, 0x1e, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0xc9, 0x04, 0x1d, 0x04, 0x4e, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x02, 0xc6, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x02, 0x18, 0xb8, 0xff, 0xf6, 0xb4, 0x18, 0x1a, 0x06, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xcb, 0x04, 0x38, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x2a, 0x2a, 0x05, 0x26, 0x02, 0x21, 0x0b, 0x21, 0x25, 0x08, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0x0b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xcb, 0x03, 0x47, 0xfe, 0xe0, 0x00, 0x18, 0xb6, 0x02, - 0x26, 0x26, 0x11, 0x26, 0x02, 0x1d, 0xb8, 0xff, 0xfd, 0xb4, 0x1d, 0x21, - 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0xfc, 0x03, 0x1c, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x27, 0x27, 0x05, 0x26, 0x03, 0x02, - 0x28, 0x64, 0x28, 0x1d, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x4a, - 0x06, 0x26, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x04, - 0x02, 0x39, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x23, 0x23, - 0x11, 0x26, 0x03, 0x02, 0x24, 0x63, 0x24, 0x19, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xfd, 0x03, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x27, 0x27, 0x05, 0x26, 0x03, 0x02, 0x1f, 0xb8, 0xff, 0x98, - 0xb4, 0x1f, 0x22, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x25, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x26, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x05, - 0x02, 0x39, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x25, 0x25, - 0x11, 0x26, 0x03, 0x02, 0x1b, 0xb8, 0xff, 0x99, 0xb4, 0x1b, 0x20, 0x06, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x09, 0xfe, 0x03, 0x1c, 0x00, 0x00, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x32, 0x32, 0x05, 0x26, 0x03, 0x02, - 0x33, 0x3b, 0x33, 0x24, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x75, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x06, - 0x02, 0x31, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x2f, 0x2f, - 0x11, 0x26, 0x03, 0x02, 0x30, 0x43, 0x30, 0x20, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x05, 0xd7, 0x07, 0x2b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x11, 0x07, 0x09, 0xff, 0x03, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x3b, 0x3b, 0x05, 0x26, 0x03, 0x02, 0x23, 0x00, 0x23, 0x2f, - 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0xef, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x0a, 0x07, 0x02, 0x31, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x1f, 0x1f, 0x11, 0x26, 0x03, 0x02, - 0x29, 0xb8, 0xff, 0xf5, 0xb4, 0x29, 0x1a, 0x06, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xfe, 0xc9, 0x05, 0xd7, 0x07, 0x03, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, - 0x10, 0x27, 0x08, 0xff, 0x01, 0xc8, 0x00, 0x05, 0x11, 0x07, 0x09, 0x12, - 0x03, 0xac, 0x00, 0x00, 0x00, 0x24, 0x40, 0x0f, 0x02, 0x20, 0x20, 0x05, - 0x26, 0x02, 0x22, 0x00, 0x22, 0x1c, 0x08, 0x00, 0x25, 0x03, 0x26, 0xb8, - 0xff, 0xf9, 0xb4, 0x26, 0x27, 0x08, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0xc9, 0x04, 0x1d, 0x05, 0xd3, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x88, 0x00, 0xe0, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0xc6, 0x00, 0x00, 0x00, 0x24, 0x40, 0x0f, 0x02, 0x1c, 0x1c, 0x11, - 0x26, 0x02, 0x1d, 0x00, 0x1d, 0x18, 0x06, 0x00, 0x25, 0x03, 0x22, 0xb8, - 0xff, 0xf6, 0xb4, 0x22, 0x23, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x06, 0xad, 0x06, 0xf0, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfe, 0x02, 0x39, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x2b, 0x2b, 0x05, 0x26, 0x02, 0x27, 0xb8, 0xff, 0xce, 0xb4, 0x27, 0x2a, - 0x08, 0x15, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x03, 0x05, 0xe4, 0x12, 0x26, - 0x01, 0x63, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, 0x01, 0x65, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x26, 0x26, 0x11, 0x26, 0x02, 0x22, 0xb8, 0xff, - 0xd5, 0xb4, 0x22, 0x25, 0x06, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x06, 0xad, - 0x06, 0xf0, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, - 0x01, 0xac, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x2b, 0x2b, 0x05, 0x26, - 0x02, 0x28, 0xb8, 0xff, 0x63, 0xb4, 0x28, 0x2b, 0x08, 0x15, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x05, 0x03, 0x05, 0xe4, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x43, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x26, 0x26, 0x11, 0x26, 0x02, 0x23, 0xb8, 0xff, 0x3b, 0xb4, 0x23, 0x26, - 0x06, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x61, 0xff, 0xec, 0x06, 0xad, 0x07, 0x2b, 0x12, 0x26, - 0x01, 0x62, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, 0x04, 0x38, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x35, 0x35, 0x05, 0x26, 0x02, 0x2c, 0xb8, 0xff, - 0xa1, 0xb4, 0x2c, 0x30, 0x08, 0x15, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x05, 0x03, - 0x06, 0x0b, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x03, 0x47, 0xfe, 0xe0, 0x00, 0x18, 0xb6, 0x02, 0x30, 0x30, 0x11, 0x26, - 0x02, 0x27, 0xb8, 0xff, 0x8a, 0xb4, 0x27, 0x2b, 0x06, 0x11, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, - 0xff, 0xec, 0x06, 0xad, 0x07, 0x06, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x02, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x2f, 0x05, 0x26, 0x02, 0x2f, 0xb8, 0xff, 0x94, 0xb4, 0x2f, 0x3b, 0x08, - 0x15, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x05, 0x03, 0x05, 0xbd, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9e, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x2a, 0x11, 0x26, 0x02, 0x2a, 0xb8, 0xff, 0x97, 0xb4, 0x2a, 0x36, 0x06, - 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x61, - 0xfe, 0xc9, 0x06, 0xad, 0x05, 0x96, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0xac, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, - 0x27, 0xb8, 0xff, 0x8e, 0xb4, 0x27, 0x29, 0x08, 0x15, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xfe, 0xc9, 0x05, 0x03, - 0x04, 0x4e, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, - 0x02, 0xc9, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x22, 0xb8, 0xff, 0x86, - 0xb4, 0x22, 0x24, 0x06, 0x11, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xfe, 0xc9, 0x05, 0x29, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x6e, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x15, 0xb8, 0xff, 0xf4, 0xb4, 0x15, 0x17, 0x05, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xfe, 0xc9, 0x03, 0xeb, 0x04, 0x3a, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x1c, 0xb8, 0xff, 0xd9, 0xb4, 0x1c, 0x1e, 0x1a, 0x0d, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x05, 0x29, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x03, 0xe8, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x23, 0x23, 0x05, 0x26, - 0x01, 0x1a, 0xb8, 0xff, 0xf4, 0xb4, 0x1a, 0x1e, 0x05, 0x10, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xeb, 0x06, 0x0b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xcb, 0x03, 0x47, 0xfe, 0xe0, 0x00, 0x18, 0xb6, 0x01, - 0x2a, 0x2a, 0x11, 0x26, 0x01, 0x21, 0xb8, 0xff, 0xff, 0xb4, 0x21, 0x25, - 0x1a, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x06, 0x80, 0x06, 0xf0, 0x12, 0x26, - 0x01, 0x71, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfe, 0x02, 0x17, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x24, 0x24, 0x05, 0x26, 0x01, 0x20, 0xb8, 0xff, - 0xa4, 0xb4, 0x20, 0x23, 0x05, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x05, 0x1c, - 0x05, 0xe4, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, 0x11, 0x07, 0x00, 0x76, - 0x01, 0x89, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x2b, 0x2b, 0x11, 0x26, - 0x01, 0x27, 0xb8, 0xff, 0xd5, 0xb4, 0x27, 0x2a, 0x25, 0x12, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, - 0xff, 0xec, 0x06, 0x80, 0x06, 0xf0, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, - 0x11, 0x07, 0x08, 0xfd, 0x01, 0x5a, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x24, 0x24, 0x05, 0x26, 0x01, 0x21, 0xb8, 0xff, 0x09, 0xb4, 0x21, 0x24, - 0x05, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x05, 0x1c, 0x05, 0xe4, 0x12, 0x26, - 0x01, 0x72, 0x00, 0x00, 0x11, 0x07, 0x00, 0x43, 0x00, 0x88, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x2b, 0x2b, 0x11, 0x26, 0x01, 0x28, 0xb8, 0xfe, - 0xf6, 0xb4, 0x28, 0x2b, 0x25, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x06, 0x80, - 0x07, 0x2b, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, - 0x03, 0xfc, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x2e, 0x2e, 0x05, 0x26, - 0x01, 0x25, 0xb8, 0xff, 0x5d, 0xb4, 0x25, 0x29, 0x05, 0x17, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x05, 0x1c, 0x06, 0x0b, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, - 0x11, 0x07, 0x02, 0xcb, 0x03, 0x47, 0xfe, 0xe0, 0x00, 0x18, 0xb6, 0x01, - 0x35, 0x35, 0x11, 0x26, 0x01, 0x2c, 0xb8, 0xff, 0x66, 0xb4, 0x2c, 0x30, - 0x25, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x9e, 0xff, 0xec, 0x06, 0x80, 0x07, 0x06, 0x12, 0x26, - 0x01, 0x71, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, 0x01, 0xa8, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x01, 0x28, 0x05, 0x26, 0x01, 0x28, 0xb8, 0xff, 0x69, - 0xb4, 0x28, 0x34, 0x05, 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x05, 0x1c, 0x05, 0xbd, 0x12, 0x26, - 0x01, 0x72, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x01, 0x2f, 0x11, 0x26, 0x01, 0x2f, 0xb8, 0xff, 0x6f, - 0xb4, 0x2f, 0x3b, 0x25, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x9e, 0xfe, 0xc9, 0x06, 0x80, 0x05, 0x81, 0x12, 0x26, - 0x01, 0x71, 0x00, 0x00, 0x11, 0x07, 0x09, 0x12, 0x03, 0x6a, 0x00, 0x00, - 0x00, 0x0f, 0xb1, 0x01, 0x20, 0xb8, 0xff, 0x44, 0xb4, 0x20, 0x22, 0x05, - 0x17, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xfe, 0xc9, 0x05, 0x1c, 0x04, 0x3a, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x02, 0xad, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x01, - 0x27, 0xb8, 0xff, 0x46, 0xb4, 0x27, 0x29, 0x25, 0x12, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, - 0x06, 0xf0, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x08, 0xfd, - 0x01, 0x22, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x09, 0x09, 0x05, 0x26, - 0x01, 0x0a, 0xb8, 0xff, 0xb5, 0xb4, 0x0a, 0x0d, 0x04, 0x08, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, - 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xe4, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, - 0x11, 0x06, 0x00, 0x43, 0x69, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x17, 0x17, - 0x11, 0x26, 0x01, 0x18, 0xb8, 0xff, 0xa7, 0xb4, 0x18, 0x1b, 0x09, 0x12, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x2d, - 0xfe, 0xc9, 0x05, 0x29, 0x05, 0x81, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x12, 0x03, 0x42, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x0a, 0x00, 0x0a, 0x0c, 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x04, 0x3a, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x10, 0x07, 0x09, 0x12, 0x03, 0xc0, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x07, 0x2b, 0x12, 0x26, - 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, 0x03, 0xc1, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x18, 0x18, 0x05, 0x26, 0x01, 0x0f, 0x05, - 0x0f, 0x13, 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x06, 0x0b, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0xcb, 0x03, 0x15, 0xfe, 0xe0, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x26, 0x26, 0x11, 0x26, 0x01, 0x1d, 0x04, - 0x1d, 0x21, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, 0x07, 0x06, 0x12, 0x26, - 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x09, 0x02, 0x01, 0x68, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x12, 0x05, 0x26, 0x01, 0x12, 0x0c, 0x12, - 0x1e, 0x04, 0x08, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x05, 0xfe, 0x57, 0x03, 0xfc, 0x05, 0xbd, 0x12, 0x26, - 0x00, 0x5c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xc4, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x20, 0x11, 0x26, 0x01, 0x20, 0x13, 0x20, - 0x2c, 0x09, 0x12, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, 0x00, 0xdc, 0x00, 0x64, - 0x00, 0x16, 0xb5, 0x02, 0x2c, 0x11, 0x26, 0x02, 0x2c, 0xb8, 0xff, 0xd7, - 0xb4, 0x2c, 0x28, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, 0x00, 0xce, 0x00, 0x64, - 0x00, 0x18, 0xb6, 0x02, 0x2d, 0x2d, 0x11, 0x26, 0x02, 0x31, 0xb8, 0xff, - 0xc2, 0xb4, 0x31, 0x2c, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa1, - 0x00, 0xdc, 0x00, 0x64, 0x00, 0x1a, 0xb7, 0x03, 0x02, 0x32, 0x11, 0x26, - 0x03, 0x02, 0x32, 0xb8, 0xff, 0xcb, 0xb4, 0x32, 0x28, 0x06, 0x10, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x33, 0x33, 0x11, 0x26, 0x03, 0x02, 0x37, 0xb8, 0xff, 0xb7, - 0xb4, 0x37, 0x28, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa2, - 0x01, 0x18, 0x00, 0x64, 0x00, 0x18, 0x40, 0x0e, 0x03, 0x02, 0x32, 0x11, - 0x26, 0x03, 0x02, 0x32, 0x0b, 0x32, 0x29, 0x06, 0x10, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xaf, 0x01, 0x18, 0x00, 0x64, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x33, 0x33, 0x11, 0x26, 0x03, 0x02, 0x37, 0x0b, 0x37, 0x29, - 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2c, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa3, 0x00, 0xd2, 0x00, 0x46, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x45, 0x45, 0x11, 0x26, 0x03, 0x02, - 0x30, 0xb8, 0xff, 0xca, 0xb4, 0x30, 0x3d, 0x06, 0x10, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x07, 0x22, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xb0, 0x00, 0xd2, 0x00, 0x3c, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x46, 0x46, 0x11, 0x26, 0x03, 0x02, 0x30, 0xb8, 0xff, 0xca, - 0xb4, 0x30, 0x3d, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, - 0x05, 0xcc, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x06, 0x07, 0x92, - 0x89, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0x52, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x11, 0x06, 0x07, 0xcc, 0x93, 0x00, 0x00, 0x07, - 0xb2, 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0x00, 0x00, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa1, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x16, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0x00, 0x00, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x16, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0x00, 0x00, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa2, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0x00, 0x00, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xaf, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x3f, - 0x00, 0x00, 0x06, 0x7e, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa3, 0x50, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x3f, - 0x00, 0x00, 0x06, 0x7e, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xb0, 0x50, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x07, 0x07, 0x92, 0x00, 0x86, 0x00, 0x64, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x2c, 0x11, 0x26, 0x01, 0x2c, 0x06, 0x2c, 0x28, 0x0a, 0x04, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xcc, 0x00, 0x93, 0x00, 0x64, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x2d, 0x2d, 0x11, 0x26, 0x01, 0x31, 0x0c, 0x31, 0x2c, 0x0a, 0x04, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xa1, 0x64, 0x64, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x32, - 0x11, 0x26, 0x02, 0x01, 0x32, 0xb8, 0xff, 0xd8, 0xb4, 0x32, 0x28, 0x0a, - 0x04, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x46, 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x67, 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0x64, 0x64, 0x00, 0x1d, - 0x40, 0x09, 0x02, 0x01, 0x33, 0x33, 0x11, 0x26, 0x02, 0x01, 0x37, 0xb8, - 0xff, 0xd8, 0xb4, 0x37, 0x28, 0x0a, 0x04, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa2, 0x00, 0x8c, 0x00, 0x64, 0x00, 0x18, 0x40, 0x0e, - 0x02, 0x01, 0x32, 0x11, 0x26, 0x02, 0x01, 0x32, 0x05, 0x32, 0x29, 0x0a, - 0x04, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x46, 0xff, 0xec, 0x03, 0x6a, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x67, 0x00, 0x00, 0x11, 0x07, 0x07, 0xaf, 0x00, 0x8c, 0x00, 0x64, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x33, 0x33, 0x11, 0x26, 0x02, 0x01, - 0x37, 0x05, 0x37, 0x29, 0x0a, 0x04, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x05, 0xc6, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x00, 0xc8, 0x00, 0x00, 0x11, 0x07, - 0x07, 0x92, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0c, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x05, 0xc6, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x00, 0xc8, 0x00, 0x00, 0x11, 0x07, - 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0c, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x56, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa1, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x11, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x56, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xae, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x11, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x56, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa2, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x0c, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x56, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x28, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xaf, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x0c, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, - 0x00, 0xe2, 0x00, 0x64, 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1f, 0x11, 0x26, - 0x01, 0x1f, 0x0e, 0x1f, 0x1b, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, - 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, - 0x00, 0xed, 0x00, 0x64, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x20, 0x20, 0x11, - 0x26, 0x01, 0x24, 0x12, 0x24, 0x1f, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa1, - 0x00, 0xc8, 0x00, 0x64, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x25, 0x11, 0x26, - 0x02, 0x01, 0x25, 0xb8, 0xff, 0xe8, 0xb4, 0x25, 0x1b, 0x0d, 0x19, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x6a, - 0xfe, 0x58, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x26, 0x26, 0x11, 0x26, 0x02, 0x01, 0x2a, 0xb8, 0xff, 0xe8, - 0xb4, 0x2a, 0x1b, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa2, - 0x01, 0x36, 0x00, 0x64, 0x00, 0x18, 0x40, 0x0e, 0x02, 0x01, 0x25, 0x11, - 0x26, 0x02, 0x01, 0x25, 0x5b, 0x25, 0x1c, 0x0d, 0x19, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, - 0xfe, 0x58, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xaf, 0x01, 0x0a, 0x00, 0x64, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x26, 0x26, 0x11, 0x26, 0x02, 0x01, 0x2a, 0x2f, 0x2a, 0x1c, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, 0x07, 0x22, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa3, 0x00, 0xe2, 0x00, 0x3c, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x38, 0x38, 0x11, 0x26, 0x02, 0x01, - 0x23, 0x0b, 0x23, 0x30, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, - 0x07, 0x22, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x07, 0xb0, - 0x00, 0xed, 0x00, 0x3c, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x39, 0x39, - 0x11, 0x26, 0x02, 0x01, 0x23, 0x16, 0x23, 0x30, 0x0d, 0x19, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x0f, - 0x00, 0x00, 0x05, 0xe8, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x00, 0xc8, - 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, - 0xb2, 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, - 0x00, 0x00, 0x05, 0xe8, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x00, 0xc8, - 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, - 0xb2, 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa1, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0x00, 0x00, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa2, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xaf, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xfa, - 0x00, 0x00, 0x07, 0x78, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xa3, 0x0b, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x2f, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xfa, - 0x00, 0x00, 0x07, 0x78, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xb0, 0x0b, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x2f, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x89, - 0x00, 0x00, 0x01, 0x8d, 0x06, 0x30, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0x92, 0x9d, 0x64, 0x00, 0x16, 0xb5, 0x01, 0x0f, 0x11, - 0x26, 0x01, 0x0f, 0xb8, 0xff, 0xeb, 0xb4, 0x0f, 0x0b, 0x04, 0x09, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, - 0x00, 0x00, 0x01, 0x8d, 0x06, 0x30, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xcc, 0x9d, 0x64, 0x00, 0x18, 0xb6, 0x01, 0x10, 0x10, - 0x11, 0x26, 0x01, 0x14, 0xb8, 0xff, 0xe4, 0xb4, 0x14, 0x0f, 0x04, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0xff, 0xb3, - 0x00, 0x00, 0x01, 0xf7, 0x06, 0x30, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xa1, 0x89, 0x64, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x15, - 0x11, 0x26, 0x02, 0x01, 0x15, 0xb8, 0xff, 0xca, 0xb4, 0x15, 0x0b, 0x04, - 0x09, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x01, 0xf7, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0x89, 0x64, 0x00, 0x1d, - 0x40, 0x09, 0x02, 0x01, 0x16, 0x16, 0x11, 0x26, 0x02, 0x01, 0x1a, 0xb8, - 0xff, 0xca, 0xb4, 0x1a, 0x0b, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, - 0x00, 0x00, 0x02, 0x51, 0x06, 0x30, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xa2, 0xd9, 0x64, 0x00, 0x18, 0x40, 0x0e, 0x02, 0x01, - 0x15, 0x11, 0x26, 0x02, 0x01, 0x15, 0x1f, 0x15, 0x0c, 0x04, 0x09, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x03, - 0x00, 0x00, 0x02, 0x51, 0x06, 0x30, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xaf, 0xd9, 0x64, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, - 0x16, 0x16, 0x11, 0x26, 0x02, 0x01, 0x1a, 0x1f, 0x1a, 0x0c, 0x04, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x8c, 0x00, 0x00, 0x02, 0x59, 0x07, 0x4a, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x07, 0xa3, 0x9d, 0x64, 0x00, 0x1d, - 0x40, 0x09, 0x02, 0x01, 0x28, 0x28, 0x11, 0x26, 0x02, 0x01, 0x13, 0xb8, - 0xff, 0xe8, 0xb4, 0x13, 0x20, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x8c, - 0x00, 0x00, 0x02, 0x59, 0x07, 0x4a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xb0, 0x9d, 0x64, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, - 0x29, 0x29, 0x11, 0x26, 0x02, 0x01, 0x13, 0xb8, 0xff, 0xe8, 0xb4, 0x13, - 0x20, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x44, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x00, 0xc8, 0x00, 0x00, 0x11, 0x07, - 0x07, 0x92, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x04, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x02, 0x44, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x00, 0xc8, 0x00, 0x00, 0x11, 0x07, - 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x04, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x03, 0xd4, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa1, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x09, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x03, 0xd4, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xae, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x09, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x03, 0xd4, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa2, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x04, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x03, 0xd4, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xaf, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x04, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x03, 0xd4, - 0x06, 0xe6, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa3, 0x0b, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x27, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x03, 0xd4, - 0x06, 0xe6, 0x10, 0x27, 0x00, 0x2c, 0x02, 0x58, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xb0, 0x0b, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x27, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x30, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, - 0x00, 0xde, 0x00, 0x64, 0x00, 0x16, 0xb5, 0x02, 0x1c, 0x11, 0x26, 0x02, - 0x1c, 0xb8, 0xff, 0xfd, 0xb4, 0x1c, 0x18, 0x06, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x30, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, - 0x00, 0xde, 0x00, 0x64, 0x00, 0x18, 0xb6, 0x02, 0x1d, 0x1d, 0x11, 0x26, - 0x02, 0x21, 0xb8, 0xff, 0xf6, 0xb4, 0x21, 0x1c, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0x30, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa1, 0x00, 0xc8, 0x00, 0x64, 0x00, 0x1a, 0xb7, 0x03, - 0x02, 0x22, 0x11, 0x26, 0x03, 0x02, 0x22, 0xb8, 0xff, 0xdb, 0xb4, 0x22, - 0x18, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0x30, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x23, 0x23, 0x11, 0x26, 0x03, 0x02, - 0x27, 0xb8, 0xff, 0xdb, 0xb4, 0x27, 0x18, 0x06, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0x30, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa2, 0x01, 0x18, 0x00, 0x64, 0x00, 0x18, 0x40, 0x0e, - 0x03, 0x02, 0x22, 0x11, 0x26, 0x03, 0x02, 0x22, 0x2f, 0x22, 0x19, 0x06, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0x30, 0x12, 0x26, - 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x07, 0xaf, 0x01, 0x18, 0x00, 0x64, - 0x00, 0x1a, 0x40, 0x0f, 0x03, 0x02, 0x23, 0x23, 0x11, 0x26, 0x03, 0x02, - 0x27, 0x2f, 0x27, 0x19, 0x06, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xec, 0x06, 0x3b, - 0x05, 0xcc, 0x10, 0x26, 0x00, 0x32, 0x64, 0x00, 0x11, 0x07, 0x07, 0x92, - 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x1b, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, 0xff, 0xec, 0x06, 0x3b, - 0x05, 0xcc, 0x10, 0x26, 0x00, 0x32, 0x64, 0x00, 0x11, 0x07, 0x07, 0xcc, - 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x25, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x18, 0xff, 0xec, 0x07, 0xcb, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa1, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x2b, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xff, 0xec, 0x07, 0xcb, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x32, 0x01, 0xf4, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xae, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x2b, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xff, 0xec, 0x07, 0x67, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x32, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xa2, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x2b, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xff, 0xec, 0x07, 0x67, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x32, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, - 0x07, 0xaf, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x2b, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, - 0x00, 0xd7, 0x00, 0x64, 0x00, 0x16, 0xb5, 0x01, 0x1b, 0x11, 0x26, 0x01, - 0x1b, 0xb8, 0xff, 0xee, 0xb4, 0x1b, 0x17, 0x07, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, - 0x00, 0xd2, 0x00, 0x64, 0x00, 0x18, 0xb6, 0x01, 0x1c, 0x1c, 0x11, 0x26, - 0x01, 0x20, 0xb8, 0xff, 0xe2, 0xb4, 0x20, 0x1b, 0x07, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0x30, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa1, 0x00, 0xc8, 0x00, 0x64, 0x00, 0x1a, 0xb7, 0x02, - 0x01, 0x21, 0x11, 0x26, 0x02, 0x01, 0x21, 0xb8, 0xff, 0xd3, 0xb4, 0x21, - 0x17, 0x07, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x22, 0x22, 0x11, 0x26, 0x02, 0x01, - 0x26, 0xb8, 0xff, 0xd3, 0xb4, 0x26, 0x17, 0x07, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0x30, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa2, 0x01, 0x2c, 0x00, 0x64, 0x00, 0x18, 0x40, 0x0e, - 0x02, 0x01, 0x21, 0x11, 0x26, 0x02, 0x01, 0x21, 0x3b, 0x21, 0x18, 0x07, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0xaf, 0x01, 0x2c, 0x00, 0x64, - 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x22, 0x22, 0x11, 0x26, 0x02, 0x01, - 0x26, 0x3b, 0x26, 0x18, 0x07, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x07, 0x22, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa3, - 0x00, 0xd7, 0x00, 0x3c, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x34, 0x34, - 0x11, 0x26, 0x02, 0x01, 0x1f, 0xb8, 0xff, 0xeb, 0xb4, 0x1f, 0x2c, 0x07, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x22, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x07, 0xb0, 0x00, 0xd2, 0x00, 0x3c, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x35, 0x35, 0x11, 0x26, 0x02, 0x01, - 0x1f, 0xb8, 0xff, 0xe6, 0xb4, 0x1f, 0x2c, 0x07, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, - 0x00, 0x00, 0x06, 0x55, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x3c, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, - 0xb2, 0x01, 0x13, 0x00, 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0x81, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x3c, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x19, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0x00, 0x00, 0x07, 0xe5, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x3c, 0x02, 0xbc, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xaf, 0xee, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x19, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xef, - 0x00, 0x00, 0x07, 0x81, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x3c, 0x02, 0x58, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xb0, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x22, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x53, - 0xff, 0xec, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x07, 0x92, 0x01, 0xc2, 0x00, 0x64, 0x00, 0x16, 0xb5, 0x01, - 0x30, 0x11, 0x26, 0x01, 0x30, 0xb8, 0xff, 0xfc, 0xb4, 0x30, 0x2c, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xff, 0xec, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xcc, 0x01, 0xae, 0x00, 0x64, 0x00, 0x18, 0xb6, 0x01, - 0x31, 0x31, 0x11, 0x26, 0x01, 0x35, 0xb8, 0xff, 0xe1, 0xb4, 0x35, 0x30, - 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa1, 0x01, 0xc2, 0x00, 0x64, - 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x36, 0x11, 0x26, 0x02, 0x01, 0x36, 0xb8, - 0xff, 0xef, 0xb4, 0x36, 0x2c, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xae, - 0x01, 0xc2, 0x00, 0x64, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x37, 0x37, - 0x11, 0x26, 0x02, 0x01, 0x3b, 0xb8, 0xff, 0xef, 0xb4, 0x3b, 0x2c, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa2, 0x01, 0xf4, 0x00, 0x64, - 0x00, 0x18, 0x40, 0x0e, 0x02, 0x01, 0x36, 0x11, 0x26, 0x02, 0x01, 0x36, - 0x26, 0x36, 0x2d, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xaf, - 0x01, 0xf4, 0x00, 0x64, 0x00, 0x1a, 0x40, 0x0f, 0x02, 0x01, 0x37, 0x37, - 0x11, 0x26, 0x02, 0x01, 0x3b, 0x26, 0x3b, 0x2d, 0x1b, 0x0e, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xff, 0xec, 0x05, 0xeb, 0x07, 0x4a, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa3, 0x01, 0xc2, 0x00, 0x64, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x49, 0x49, 0x11, 0x26, 0x02, 0x01, 0x34, 0xb8, 0xff, 0xf9, - 0xb4, 0x34, 0x41, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, - 0x07, 0x4a, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xb0, - 0x01, 0xae, 0x00, 0x64, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x4a, 0x4a, - 0x11, 0x26, 0x02, 0x01, 0x34, 0xb8, 0xff, 0xe5, 0xb4, 0x34, 0x41, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x06, 0x07, 0x05, 0xcc, 0x10, 0x26, - 0x03, 0x5b, 0x64, 0x00, 0x11, 0x07, 0x07, 0x92, 0xff, 0x1c, 0x00, 0x00, - 0x00, 0x07, 0xb2, 0x01, 0x2e, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, 0x06, 0x07, 0x05, 0xcc, 0x10, 0x26, - 0x03, 0x5b, 0x64, 0x00, 0x11, 0x07, 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, - 0x00, 0x07, 0xb2, 0x01, 0x2e, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x97, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0xf4, 0x00, 0x00, 0x11, 0x06, 0x07, 0xa1, 0xee, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x97, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0xf4, 0x00, 0x00, 0x11, 0x06, 0x07, 0xae, 0xee, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x33, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, 0x07, 0xa2, 0xee, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x18, 0x00, 0x00, 0x07, 0x33, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, 0x07, 0xaf, 0xee, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x07, 0x33, 0x06, 0xe6, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, 0x07, 0xa3, 0xfa, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x47, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x07, 0x33, 0x06, 0xe6, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x11, 0x06, 0x07, 0xb0, 0xfa, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x47, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x07, 0xc0, 0x00, 0x88, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x2c, 0x2c, 0x11, 0x26, 0x02, 0x29, 0xb8, 0xff, - 0x80, 0xb4, 0x29, 0x2c, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0x05, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x2c, 0x2c, 0x11, 0x26, - 0x02, 0x28, 0xb8, 0xff, 0xff, 0xb4, 0x28, 0x2b, 0x06, 0x10, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x07, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xc0, 0x31, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x2c, 0x2c, - 0x11, 0x26, 0x01, 0x29, 0xb8, 0xff, 0xae, 0xb4, 0x29, 0x2c, 0x0a, 0x04, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xec, 0x03, 0x6a, 0x06, 0x07, 0x12, 0x26, 0x03, 0x67, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x39, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x2c, 0x2c, 0x11, 0x26, 0x01, 0x28, 0x22, 0x28, 0x2b, 0x0a, 0x04, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x6a, - 0xfe, 0x58, 0x03, 0xee, 0x06, 0x07, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xc0, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1f, 0x1f, 0x11, 0x26, 0x01, 0x1c, 0xb8, 0xff, 0xd0, 0xb4, 0x1c, 0x1f, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, 0x01, 0x23, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x1f, 0x1f, 0x11, 0x26, 0x01, 0x1b, 0x4e, - 0x1b, 0x1e, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x10, 0x00, 0x00, 0x01, 0x8d, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x07, 0x07, 0xc0, 0xff, 0x45, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x01, 0x0f, 0x0f, 0x11, 0x26, 0x01, 0x0c, 0xb8, 0xff, - 0x8f, 0xb4, 0x0c, 0x0f, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x89, 0x00, 0x00, 0x01, 0xa1, - 0x06, 0x07, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x03, 0x39, - 0xc0, 0x00, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x0f, 0x0f, 0x11, 0x26, 0x01, - 0x0b, 0x0c, 0x0b, 0x0e, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, - 0x06, 0x07, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x07, 0x07, 0xc0, - 0x00, 0x9f, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x1c, 0x1c, 0x11, 0x26, - 0x02, 0x19, 0xb8, 0xff, 0xbb, 0xb4, 0x19, 0x1c, 0x06, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x1d, 0x06, 0x07, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x39, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x1c, 0x1c, 0x11, 0x26, 0x02, 0x18, 0x28, 0x18, 0x1b, 0x06, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0x07, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x06, 0x07, 0xc0, 0x7f, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x1b, 0x1b, - 0x11, 0x26, 0x01, 0x18, 0xb8, 0xff, 0x93, 0xb4, 0x18, 0x1b, 0x07, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0x07, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x39, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x1b, 0x1b, 0x11, 0x26, 0x01, 0x17, 0x12, 0x17, 0x1a, 0x07, 0x00, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xff, 0xec, 0x05, 0xeb, 0x06, 0x07, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xc0, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x30, 0x30, 0x11, 0x26, 0x01, 0x2d, 0xb8, 0xff, 0xa5, 0xb4, 0x2d, 0x30, - 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xff, 0xec, 0x05, 0xeb, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, 0x02, 0x13, 0x00, 0x00, - 0x00, 0x16, 0x40, 0x0d, 0x01, 0x30, 0x30, 0x11, 0x26, 0x01, 0x2c, 0x4b, - 0x2c, 0x2f, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0x92, 0x00, 0xc8, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x2c, 0x11, 0x26, 0x02, 0x2c, 0xb8, 0xff, 0xd7, 0xb4, 0x2c, 0x28, 0x06, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xcc, 0x00, 0xba, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x02, 0x1c, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x2d, 0x2d, 0x11, 0x26, - 0x02, 0x31, 0xb8, 0xff, 0xc2, 0xb4, 0x31, 0x2c, 0x06, 0x10, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xa1, 0x00, 0xc8, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x02, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x03, 0x02, 0x32, 0x11, 0x26, - 0x03, 0x02, 0x32, 0xb8, 0xff, 0xcb, 0xb4, 0x32, 0x28, 0x06, 0x10, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x02, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x33, 0x33, - 0x11, 0x26, 0x03, 0x02, 0x37, 0xb8, 0xff, 0xb7, 0xb4, 0x37, 0x28, 0x06, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x01, 0x13, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, - 0x03, 0x02, 0x32, 0x11, 0x26, 0x03, 0x02, 0x32, 0x0b, 0x32, 0x29, 0x06, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, 0x01, 0x13, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x03, 0x02, 0x33, 0x33, 0x11, 0x26, 0x03, 0x02, 0x37, 0x0b, 0x37, 0x29, - 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x07, 0x22, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa3, 0x00, 0xc8, 0x00, 0x3c, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x03, 0x02, 0x45, 0x45, 0x11, 0x26, 0x03, 0x02, 0x30, 0xb8, 0xff, 0xca, - 0xb4, 0x30, 0x3d, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, - 0x07, 0x22, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xb0, - 0x00, 0xc8, 0x00, 0x3c, 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x03, 0x02, 0x46, 0x46, 0x11, 0x26, 0x03, 0x02, - 0x30, 0xb8, 0xff, 0xca, 0xb4, 0x30, 0x3d, 0x06, 0x10, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, - 0xfe, 0x57, 0x05, 0x52, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x10, 0x26, 0x07, 0x92, 0x9d, 0x00, 0x11, 0x07, 0x03, 0x07, 0x02, 0xad, - 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x04, 0xfe, 0x57, 0x05, 0x52, 0x05, 0xcc, 0x12, 0x26, - 0x00, 0x24, 0x00, 0x00, 0x10, 0x26, 0x07, 0xcc, 0x9d, 0x00, 0x11, 0x07, - 0x03, 0x07, 0x02, 0xad, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x11, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xfe, 0x57, 0x06, 0x7e, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xa1, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, 0x03, 0xd9, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x03, 0x02, 0x16, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x2a, 0xfe, 0x57, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, - 0x00, 0x24, 0x01, 0x2c, 0x00, 0x00, 0x10, 0x26, 0x07, 0xae, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x03, 0xd9, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x16, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, - 0xfe, 0x57, 0x06, 0x7e, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xa2, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x03, 0xd9, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x11, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xfe, 0x57, 0x06, 0x7e, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xaf, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, 0x03, 0xd9, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x03, 0x02, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x3f, 0xfe, 0x57, 0x06, 0x7e, 0x06, 0xe6, 0x10, 0x27, - 0x00, 0x24, 0x01, 0x2c, 0x00, 0x00, 0x10, 0x26, 0x07, 0xa3, 0x50, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x03, 0xd9, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, - 0x02, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x3f, - 0xfe, 0x57, 0x06, 0x7e, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x24, 0x01, 0x2c, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xb0, 0x50, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x03, 0xd9, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x03, 0x02, 0x34, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0x92, - 0x00, 0xe2, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x1f, 0x11, 0x26, 0x01, 0x1f, 0x0e, 0x1f, - 0x1b, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xcc, 0x00, 0xed, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x20, 0x20, 0x11, 0x26, 0x01, 0x24, 0x12, 0x24, 0x1f, 0x0d, 0x19, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x6a, - 0xfe, 0x57, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xa1, 0x00, 0xc8, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x25, 0x11, 0x26, - 0x02, 0x01, 0x25, 0xb8, 0xff, 0xe8, 0xb4, 0x25, 0x1b, 0x0d, 0x19, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x6a, - 0xfe, 0x57, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, 0x03, 0x69, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xae, 0x00, 0xc8, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x26, 0x26, - 0x11, 0x26, 0x02, 0x01, 0x2a, 0xb8, 0xff, 0xe8, 0xb4, 0x2a, 0x1b, 0x0d, - 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x01, 0x36, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, - 0x02, 0x01, 0x25, 0x11, 0x26, 0x02, 0x01, 0x25, 0x5b, 0x25, 0x1c, 0x0d, - 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, 0x01, 0x36, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x26, 0x26, 0x11, 0x26, 0x02, 0x01, 0x2a, 0x2f, 0x2a, 0x1c, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x07, 0x4a, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa3, 0x00, 0xe2, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x38, 0x38, 0x11, 0x26, 0x02, 0x01, 0x23, 0x0b, 0x23, 0x30, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x07, 0x4a, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xb0, 0x00, 0xed, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x39, 0x39, 0x11, 0x26, 0x02, 0x01, 0x23, 0x16, 0x23, 0x30, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x0f, 0xfe, 0x57, 0x05, 0xe8, 0x05, 0xcc, 0x10, 0x27, - 0x00, 0x2b, 0x00, 0xc8, 0x00, 0x00, 0x10, 0x27, 0x07, 0x92, 0xff, 0x1c, - 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, 0x03, 0xac, 0x00, 0x00, 0x00, 0x07, - 0xb2, 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x08, - 0xfe, 0x57, 0x05, 0xe8, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x00, 0xc8, - 0x00, 0x00, 0x10, 0x27, 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x11, 0x07, - 0x03, 0x07, 0x03, 0xac, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0c, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x78, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xa1, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, 0x05, 0x3c, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, - 0x00, 0x2b, 0x02, 0x58, 0x00, 0x00, 0x10, 0x26, 0x07, 0xae, 0xee, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x11, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0xfe, 0x57, 0x07, 0x78, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xa2, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x05, 0x3c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x0c, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x78, - 0x05, 0xcc, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xaf, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, 0x05, 0x3c, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0xff, 0xdd, 0xfe, 0x57, 0x07, 0x78, 0x06, 0xe6, 0x10, 0x27, - 0x00, 0x2b, 0x02, 0x58, 0x00, 0x00, 0x10, 0x26, 0x07, 0xa3, 0xee, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x25, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xdd, - 0xfe, 0x57, 0x07, 0x78, 0x06, 0xe6, 0x10, 0x27, 0x00, 0x2b, 0x02, 0x58, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xb0, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x05, 0x3c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x25, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x92, - 0x01, 0xc2, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x01, 0x30, 0x11, 0x26, 0x01, 0x30, 0xb8, 0xff, 0xfc, - 0xb4, 0x30, 0x2c, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xcc, 0x01, 0xae, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, - 0x30, 0x11, 0x26, 0x01, 0x30, 0xb8, 0xff, 0xfc, 0xb4, 0x30, 0x2c, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xa1, 0x01, 0xc2, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x03, 0x20, 0x00, 0x00, 0x00, 0x1a, 0xb7, 0x02, 0x01, 0x36, 0x11, 0x26, - 0x02, 0x01, 0x36, 0xb8, 0xff, 0xef, 0xb4, 0x36, 0x2c, 0x1b, 0x0e, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xae, 0x01, 0xc2, 0x00, 0x64, 0x11, 0x07, 0x03, 0x07, - 0x03, 0x20, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x37, 0x37, - 0x11, 0x26, 0x02, 0x01, 0x3b, 0xb8, 0xff, 0xef, 0xb4, 0x3b, 0x2c, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x01, 0xf4, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x18, 0x40, 0x0e, - 0x02, 0x01, 0x36, 0x11, 0x26, 0x02, 0x01, 0x36, 0x26, 0x36, 0x2d, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x30, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, 0x01, 0xf4, 0x00, 0x64, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x0f, - 0x02, 0x01, 0x37, 0x37, 0x11, 0x26, 0x02, 0x01, 0x3b, 0x26, 0x3b, 0x2d, - 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x07, 0x22, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa3, 0x01, 0xc2, 0x00, 0x3c, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x1d, 0x40, 0x09, - 0x02, 0x01, 0x49, 0x49, 0x11, 0x26, 0x02, 0x01, 0x34, 0xb8, 0xff, 0xf9, - 0xb4, 0x34, 0x41, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, - 0x07, 0x22, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xb0, - 0x01, 0xae, 0x00, 0x3c, 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x1d, 0x40, 0x09, 0x02, 0x01, 0x4a, 0x4a, 0x11, 0x26, 0x02, 0x01, - 0x34, 0xb8, 0xff, 0xe5, 0xb4, 0x34, 0x41, 0x1b, 0x0e, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x0f, - 0xfe, 0x57, 0x06, 0x07, 0x05, 0xcc, 0x10, 0x26, 0x03, 0x5b, 0x64, 0x00, - 0x10, 0x27, 0x07, 0x92, 0xff, 0x1c, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x03, 0x60, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x2e, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, 0xfe, 0x57, 0x06, 0x07, - 0x05, 0xcc, 0x10, 0x26, 0x03, 0x5b, 0x64, 0x00, 0x10, 0x27, 0x07, 0xcc, - 0xff, 0x1c, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, 0x03, 0x60, 0x00, 0x00, - 0x00, 0x07, 0xb2, 0x01, 0x2e, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x97, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0xf4, 0x00, 0x00, 0x10, 0x26, 0x07, 0xa1, 0xee, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x04, 0xf0, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, - 0xfe, 0x57, 0x07, 0x97, 0x05, 0xcc, 0x10, 0x27, 0x03, 0x5b, 0x01, 0xf4, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xae, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x04, 0xf0, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x33, - 0x05, 0xcc, 0x10, 0x27, 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xa2, 0xee, 0x00, 0x11, 0x07, 0x03, 0x07, 0x04, 0x8c, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x18, 0xfe, 0x57, 0x07, 0x33, 0x05, 0xcc, 0x10, 0x27, - 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x10, 0x26, 0x07, 0xaf, 0xee, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x04, 0x8c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, - 0x01, 0x34, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0xfe, 0x57, 0x07, 0x33, 0x06, 0xe6, 0x10, 0x27, 0x03, 0x5b, 0x01, 0x90, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xa3, 0xfa, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x04, 0x8c, 0x00, 0x00, 0x00, 0x09, 0xb3, 0x02, 0x01, 0x47, 0x00, 0x00, - 0x3f, 0x35, 0x35, 0x00, 0xff, 0xff, 0xff, 0xe9, 0xfe, 0x57, 0x07, 0x33, - 0x06, 0xe6, 0x10, 0x27, 0x03, 0x5b, 0x01, 0x90, 0x00, 0x00, 0x10, 0x26, - 0x07, 0xb0, 0xfa, 0x00, 0x11, 0x07, 0x03, 0x07, 0x04, 0x8c, 0x00, 0x00, - 0x00, 0x09, 0xb3, 0x02, 0x01, 0x47, 0x00, 0x00, 0x3f, 0x35, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x05, 0xe6, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x18, 0xb6, 0x02, 0x27, 0x27, 0x11, 0x26, 0x02, 0x2a, 0xb8, 0xff, - 0xbd, 0xb4, 0x2a, 0x30, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x05, 0x53, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0x00, 0xdc, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x28, 0x28, 0x11, 0x26, - 0x02, 0x29, 0xb8, 0xff, 0xc4, 0xb4, 0x29, 0x2a, 0x06, 0x10, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xfe, 0x57, 0x04, 0x65, 0x06, 0x07, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x26, 0x07, 0xc0, 0x7e, 0x00, 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, - 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, 0x2c, 0x2c, 0x11, 0x26, 0x02, 0x29, - 0xb8, 0xff, 0x80, 0xb4, 0x29, 0x2c, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, - 0x04, 0x4e, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x02, 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x32, 0xb8, 0xff, 0xe9, - 0xb4, 0x32, 0x2d, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x03, 0x39, 0x01, 0x0f, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x02, - 0x2c, 0x2c, 0x11, 0x26, 0x02, 0x28, 0xb8, 0xff, 0xff, 0xb4, 0x28, 0x2b, - 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x05, 0xbd, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xd2, 0x00, 0x00, - 0x00, 0x16, 0xb5, 0x02, 0x30, 0x11, 0x26, 0x02, 0x30, 0xb8, 0xff, 0xc4, - 0xb4, 0x30, 0x3c, 0x06, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xfe, 0x57, 0x04, 0x65, 0x05, 0xbd, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9e, 0x00, 0xd2, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x02, - 0x30, 0x11, 0x26, 0x02, 0x30, 0xb8, 0xff, 0xc4, 0xb4, 0x30, 0x3c, 0x06, - 0x10, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0xf3, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x09, 0x04, 0x01, 0x76, 0x00, 0x00, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x11, 0x11, 0x05, 0x26, 0x02, 0x14, 0x00, 0x14, 0x1c, 0x04, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x01, 0x68, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, - 0x02, 0x12, 0x12, 0x05, 0x26, 0x02, 0x13, 0x02, 0x13, 0x14, 0x04, 0x07, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0x07, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xc0, 0xff, 0x69, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, - 0x14, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, - 0x00, 0x00, 0x05, 0x52, 0x06, 0x07, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, - 0x11, 0x06, 0x03, 0x39, 0x8a, 0x00, 0x00, 0x07, 0xb2, 0x02, 0x14, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x57, 0x05, 0x52, - 0x05, 0x81, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x02, 0xaf, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x02, 0x1c, 0x2e, 0x1c, 0x17, - 0x04, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf3, - 0x04, 0x85, 0x01, 0xbe, 0x05, 0xcc, 0x00, 0x0a, 0x00, 0x20, 0x40, 0x0d, - 0x08, 0x00, 0x00, 0x05, 0x09, 0x09, 0x0c, 0x0b, 0x09, 0x09, 0x00, 0x80, - 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x15, 0x14, 0x06, 0x07, 0x23, - 0x3e, 0x01, 0x35, 0x23, 0x35, 0x01, 0xbe, 0x1f, 0x2d, 0x7f, 0x2d, 0x2e, - 0x57, 0x05, 0xcc, 0x4d, 0x57, 0x6e, 0x35, 0x33, 0x4c, 0x23, 0xa5, 0x00, - 0x00, 0x01, 0x01, 0x14, 0xfe, 0x57, 0x01, 0xf4, 0xff, 0x81, 0x00, 0x0c, - 0x00, 0x1b, 0x40, 0x0b, 0x0c, 0x0b, 0x0b, 0x05, 0x0d, 0x0e, 0x03, 0x0b, - 0x80, 0x08, 0x1b, 0x00, 0x3f, 0x1a, 0xcd, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, - 0x06, 0x23, 0x22, 0x3d, 0x01, 0x33, 0x01, 0x98, 0x15, 0x18, 0x0e, 0x21, - 0x2c, 0x26, 0x8e, 0x84, 0xfc, 0x21, 0x17, 0x06, 0x70, 0x0b, 0x98, 0x92, - 0x00, 0x01, 0x00, 0xf3, 0x04, 0x85, 0x01, 0xbe, 0x05, 0xcc, 0x00, 0x0a, - 0x00, 0x20, 0x40, 0x0d, 0x08, 0x00, 0x00, 0x05, 0x0a, 0x0a, 0x0b, 0x0c, - 0x09, 0x09, 0x00, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x15, - 0x14, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x35, 0x23, 0x35, 0x01, 0xbe, 0x1f, - 0x2d, 0x7f, 0x2d, 0x2e, 0x57, 0x05, 0xcc, 0x4d, 0x57, 0x6e, 0x35, 0x33, - 0x4c, 0x23, 0xa5, 0x00, 0x00, 0x01, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, - 0x05, 0xbd, 0x00, 0x17, 0x00, 0x24, 0x40, 0x0f, 0x14, 0x15, 0x15, 0x19, - 0x08, 0x09, 0x09, 0x18, 0x05, 0x12, 0x14, 0x0d, 0x80, 0x08, 0x00, 0x00, - 0x2f, 0x32, 0x1a, 0xcd, 0x32, 0x39, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x2e, 0x02, 0x23, 0x22, - 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, - 0x33, 0x0e, 0x01, 0x01, 0xec, 0x2a, 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, - 0x09, 0x5b, 0x0b, 0x30, 0x51, 0x3f, 0x2c, 0x54, 0x4e, 0x45, 0x1e, 0x64, - 0x11, 0x5c, 0x11, 0x64, 0x04, 0xb1, 0x25, 0x2d, 0x25, 0x3e, 0x39, 0x66, - 0x69, 0x3d, 0x25, 0x2d, 0x25, 0x77, 0x94, 0x78, 0x00, 0x03, 0x00, 0x11, - 0x04, 0xc3, 0x02, 0x9b, 0x06, 0xc0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1f, - 0x00, 0x3a, 0x40, 0x1a, 0x10, 0x06, 0x05, 0x01, 0x02, 0x05, 0x02, 0x11, - 0x1b, 0x1c, 0x11, 0x1c, 0x20, 0x21, 0x19, 0x0d, 0x1b, 0x14, 0x80, 0x10, - 0x08, 0x08, 0x01, 0x05, 0x00, 0x04, 0x00, 0x2f, 0x33, 0xcd, 0x32, 0x32, - 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x32, 0x31, 0x30, - 0x01, 0x35, 0x33, 0x15, 0x05, 0x35, 0x33, 0x15, 0x13, 0x22, 0x2e, 0x02, - 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x33, - 0x32, 0x37, 0x33, 0x0e, 0x02, 0x01, 0xbf, 0xa3, 0xfd, 0xe6, 0xa5, 0xf7, - 0x26, 0x4c, 0x46, 0x41, 0x1c, 0x33, 0x30, 0x08, 0x53, 0x0d, 0x5d, 0x4e, - 0x28, 0x4c, 0x46, 0x40, 0x1b, 0x5b, 0x0f, 0x53, 0x0c, 0x2a, 0x48, 0x04, - 0xc4, 0xb8, 0xb8, 0x01, 0xb8, 0xb8, 0x01, 0x0a, 0x22, 0x28, 0x22, 0x38, - 0x34, 0x81, 0x72, 0x22, 0x28, 0x22, 0x6c, 0x5f, 0x5e, 0x36, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x07, 0xc0, 0x00, 0xa7, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1f, 0x1f, 0x11, 0x26, 0x01, 0x1b, 0xb8, 0xff, 0xe9, 0xb4, 0x1b, 0x1f, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x04, 0x4e, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x03, 0x39, 0x01, 0x23, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x1f, 0x1f, 0x11, 0x26, 0x01, 0x1b, 0xb8, 0xff, 0xe9, 0xb4, 0x1b, 0x1e, - 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x58, 0x03, 0xee, 0x05, 0xbd, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9e, 0x00, 0xe4, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0c, 0x01, 0x23, 0x11, 0x26, 0x01, 0x23, 0x07, 0x23, - 0x2f, 0x0d, 0x19, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x57, 0x03, 0xee, 0x05, 0xbd, 0x12, 0x26, - 0x03, 0x69, 0x00, 0x00, 0x10, 0x27, 0x02, 0x9e, 0x00, 0xe4, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x23, 0x11, 0x26, 0x01, 0x23, 0x07, 0x23, 0x2f, 0x0d, 0x19, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, - 0x00, 0x00, 0x06, 0x2a, 0x06, 0x07, 0x10, 0x27, 0x00, 0x28, 0x01, 0x2c, - 0x00, 0x00, 0x11, 0x07, 0x07, 0xc0, 0xff, 0x57, 0x00, 0x00, 0x00, 0x15, - 0xb4, 0x01, 0x0f, 0x00, 0x01, 0x11, 0xb8, 0xff, 0x72, 0xb4, 0x11, 0x11, - 0x01, 0x01, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x06, 0x2a, 0x06, 0x07, 0x10, 0x27, - 0x00, 0x28, 0x01, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, 0xff, 0x75, - 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0f, 0x00, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x22, 0x00, 0x00, 0x06, 0x4c, 0x06, 0x07, 0x10, 0x27, - 0x00, 0x2b, 0x01, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x07, 0xc0, 0xff, 0x57, - 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0f, 0x00, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x06, 0x4c, 0x06, 0x07, 0x10, 0x27, - 0x00, 0x2b, 0x01, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, 0xff, 0x75, - 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x0f, 0x00, 0x00, 0x3f, 0x35, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xfe, 0x57, 0x05, 0x20, 0x05, 0x81, 0x12, 0x26, - 0x00, 0x2b, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, 0x02, 0xe4, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x17, 0x2a, 0x17, 0x12, 0x05, 0x0b, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x04, 0x85, 0x02, 0x6e, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x10, 0x00, 0x32, 0x40, 0x16, 0x0e, 0x06, - 0x06, 0x0b, 0x0f, 0x03, 0x00, 0x0f, 0x00, 0x11, 0x12, 0x0f, 0x0f, 0x0a, - 0x04, 0x04, 0x10, 0x0a, 0x80, 0x02, 0x02, 0x0a, 0x00, 0x2f, 0x33, 0x2f, - 0x1a, 0x10, 0xcc, 0x32, 0x2f, 0x11, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x15, - 0x23, 0x03, 0x35, 0x33, 0x21, 0x15, 0x14, 0x06, 0x07, 0x23, 0x3e, 0x01, - 0x35, 0x23, 0x35, 0x02, 0x6e, 0x72, 0xbd, 0xe6, 0xfe, 0xd0, 0x1f, 0x2d, - 0x7f, 0x2d, 0x2e, 0x57, 0x04, 0xac, 0x0c, 0x01, 0x1e, 0x0e, 0x4d, 0x57, - 0x6e, 0x35, 0x33, 0x4c, 0x23, 0xa5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2a, - 0x04, 0x85, 0x02, 0x78, 0x05, 0xcc, 0x00, 0x05, 0x00, 0x10, 0x00, 0x32, - 0x40, 0x16, 0x04, 0x02, 0x0e, 0x06, 0x06, 0x0b, 0x0f, 0x02, 0x0f, 0x12, - 0x11, 0x0f, 0x0f, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x80, 0x04, 0x04, 0x0b, - 0x00, 0x2f, 0x33, 0x2f, 0x1a, 0x10, 0xcc, 0x32, 0x2f, 0x11, 0x39, 0x2f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x33, 0x15, 0x03, 0x23, 0x35, 0x03, 0x15, 0x14, 0x06, - 0x07, 0x23, 0x3e, 0x01, 0x35, 0x23, 0x35, 0x01, 0x92, 0xe6, 0xbd, 0x72, - 0x54, 0x1f, 0x2d, 0x7f, 0x2d, 0x2e, 0x57, 0x05, 0xcc, 0x0e, 0xfe, 0xe2, - 0x0c, 0x01, 0x20, 0x4d, 0x57, 0x6e, 0x35, 0x33, 0x4c, 0x23, 0xa5, 0x00, - 0x00, 0x02, 0xff, 0xef, 0x04, 0x7b, 0x02, 0xbc, 0x06, 0xe6, 0x00, 0x18, - 0x00, 0x23, 0x00, 0x4e, 0x40, 0x27, 0x21, 0x1a, 0x1a, 0x1e, 0x23, 0x23, - 0x24, 0x25, 0x15, 0x16, 0x16, 0x25, 0x08, 0x09, 0x09, 0x24, 0x21, 0x1d, - 0x15, 0x15, 0x05, 0x0d, 0x40, 0x09, 0x0c, 0x48, 0x0d, 0x0d, 0x12, 0x00, - 0x08, 0x08, 0x00, 0x00, 0x0f, 0x23, 0x01, 0x23, 0x1d, 0x00, 0x2f, 0xc4, - 0x5d, 0x32, 0x2f, 0x33, 0x2f, 0x11, 0x33, 0x33, 0x2f, 0x2b, 0x33, 0x33, - 0x2f, 0x11, 0x39, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x22, - 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, - 0x02, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x07, 0x15, 0x14, 0x06, - 0x07, 0x23, 0x3e, 0x01, 0x35, 0x23, 0x35, 0x01, 0xf2, 0x2a, 0x54, 0x4e, - 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, 0x2f, 0x52, 0x3f, 0x2c, 0x55, - 0x50, 0x47, 0x1e, 0x36, 0x32, 0x08, 0x5c, 0x10, 0x63, 0x94, 0x1f, 0x2d, - 0x7f, 0x2d, 0x2e, 0x57, 0x05, 0xee, 0x1d, 0x24, 0x1d, 0x34, 0x39, 0x61, - 0x63, 0x39, 0x1f, 0x25, 0x1f, 0x35, 0x38, 0x8a, 0x6e, 0x2c, 0x4d, 0x57, - 0x6e, 0x35, 0x33, 0x4c, 0x23, 0xa5, 0x00, 0x00, 0xff, 0xff, 0xff, 0x96, - 0x00, 0x00, 0x02, 0x30, 0x05, 0xe6, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x9a, 0xb9, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0a, 0x0a, - 0x11, 0x26, 0x01, 0x0d, 0xb8, 0xff, 0xd8, 0xb4, 0x0d, 0x13, 0x04, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0xff, 0xcf, - 0x00, 0x00, 0x01, 0xf4, 0x05, 0x53, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x11, 0x06, 0x02, 0x8b, 0x9c, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x0b, 0x0b, - 0x11, 0x26, 0x01, 0x0c, 0xb8, 0xff, 0xd7, 0xb4, 0x0c, 0x0d, 0x04, 0x09, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0xff, 0xc9, - 0x00, 0x00, 0x01, 0xf6, 0x06, 0xf7, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x10, 0x26, 0x00, 0x6a, 0x9c, 0x00, 0x11, 0x07, 0x07, 0xc0, 0xff, 0x26, - 0x00, 0xf0, 0x00, 0x46, 0x40, 0x33, 0x03, 0xcf, 0x14, 0x01, 0x02, 0x1f, - 0x14, 0x2f, 0x14, 0x4f, 0x14, 0x6f, 0x14, 0x04, 0x0f, 0x14, 0x3f, 0x14, - 0xaf, 0x14, 0xbf, 0x14, 0x04, 0x40, 0x14, 0x50, 0x14, 0x60, 0x14, 0x70, - 0x14, 0x80, 0x14, 0x05, 0x14, 0x02, 0x01, 0x11, 0x11, 0x11, 0x26, 0x03, - 0x02, 0x01, 0x0e, 0x00, 0x0e, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x5f, - 0x5d, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00, 0x01, 0xf5, - 0x06, 0xf7, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, - 0x9b, 0x00, 0x11, 0x07, 0x03, 0x39, 0xff, 0xe2, 0x00, 0xf0, 0x00, 0x46, - 0x40, 0x33, 0x03, 0xcf, 0x14, 0x01, 0x02, 0x1f, 0x14, 0x2f, 0x14, 0x4f, - 0x14, 0x6f, 0x14, 0x04, 0x0f, 0x14, 0x3f, 0x14, 0xaf, 0x14, 0xbf, 0x14, - 0x04, 0x40, 0x14, 0x50, 0x14, 0x60, 0x14, 0x70, 0x14, 0x80, 0x14, 0x05, - 0x14, 0x02, 0x01, 0x11, 0x11, 0x11, 0x26, 0x03, 0x02, 0x01, 0x0e, 0x00, - 0x0e, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x5f, 0x5d, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x77, 0x00, 0x00, 0x02, 0x44, 0x05, 0xbd, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, 0x8e, 0x00, 0x00, 0x16, - 0xb5, 0x01, 0x13, 0x11, 0x26, 0x01, 0x13, 0xb8, 0xff, 0xd3, 0xb4, 0x13, - 0x1f, 0x04, 0x09, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x02, 0x2c, 0x06, 0xc0, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x11, 0x06, 0x07, 0x96, 0x91, 0x00, 0x00, 0x21, - 0x40, 0x0b, 0x03, 0x02, 0x01, 0x11, 0x11, 0x11, 0x26, 0x03, 0x02, 0x01, - 0x1b, 0xb8, 0xff, 0xdc, 0xb4, 0x1b, 0x26, 0x04, 0x09, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xca, 0x00, 0x00, 0x02, 0x64, 0x07, 0x50, 0x12, 0x26, - 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0xff, 0xed, 0x01, 0x6a, - 0x00, 0x18, 0xb6, 0x01, 0x04, 0x04, 0x05, 0x26, 0x01, 0x07, 0xb8, 0xff, - 0xfb, 0xb4, 0x07, 0x0d, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x00, 0x02, 0x31, - 0x06, 0xa1, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x02, 0x8b, - 0xff, 0xd9, 0x01, 0x4e, 0x00, 0x16, 0x40, 0x0d, 0x01, 0x05, 0x05, 0x05, - 0x26, 0x01, 0x06, 0x02, 0x06, 0x07, 0x01, 0x03, 0x25, 0x2b, 0x11, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, 0x02, 0xa8, - 0x06, 0x07, 0x10, 0x27, 0x00, 0x2c, 0x01, 0x2c, 0x00, 0x00, 0x11, 0x07, - 0x07, 0xc0, 0xff, 0x55, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x07, 0x00, - 0x00, 0x3f, 0x35, 0x00, 0xff, 0xff, 0x00, 0x57, 0x00, 0x00, 0x02, 0xa8, - 0x06, 0x07, 0x10, 0x27, 0x00, 0x2c, 0x01, 0x2c, 0x00, 0x00, 0x11, 0x06, - 0x03, 0x39, 0x8a, 0x00, 0x00, 0x07, 0xb2, 0x01, 0x07, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x04, 0x85, 0x02, 0x6e, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x10, 0x00, 0x30, 0x40, 0x15, 0x04, 0x01, - 0x08, 0x06, 0x06, 0x10, 0x01, 0x10, 0x12, 0x11, 0x07, 0x07, 0x0c, 0x05, - 0x05, 0x06, 0x0c, 0x80, 0x02, 0x02, 0x0c, 0x00, 0x2f, 0x33, 0x2f, 0x1a, - 0x10, 0xcc, 0x32, 0x2f, 0x11, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, 0x03, - 0x35, 0x33, 0x21, 0x15, 0x23, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x3d, - 0x01, 0x02, 0x6e, 0x72, 0xbd, 0xe6, 0xfe, 0xcc, 0x57, 0x2e, 0x2d, 0x7f, - 0x2d, 0x1f, 0x04, 0xac, 0x0c, 0x01, 0x1e, 0x0e, 0xa5, 0x23, 0x4c, 0x33, - 0x36, 0x6e, 0x56, 0x4d, 0x00, 0x02, 0x00, 0x2a, 0x04, 0x85, 0x02, 0x78, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x10, 0x00, 0x30, 0x40, 0x15, 0x04, 0x02, - 0x08, 0x06, 0x06, 0x10, 0x02, 0x10, 0x12, 0x11, 0x07, 0x07, 0x0c, 0x00, - 0x00, 0x06, 0x0c, 0x80, 0x03, 0x03, 0x0c, 0x00, 0x2f, 0x33, 0x2f, 0x1a, - 0x10, 0xcc, 0x32, 0x2f, 0x11, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x15, 0x03, - 0x23, 0x35, 0x03, 0x15, 0x23, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x3d, - 0x01, 0x01, 0x92, 0xe6, 0xbd, 0x72, 0x58, 0x57, 0x2e, 0x2d, 0x7f, 0x2d, - 0x1f, 0x05, 0xcc, 0x0e, 0xfe, 0xe2, 0x0c, 0x01, 0x20, 0xa5, 0x23, 0x4c, - 0x33, 0x36, 0x6e, 0x56, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xef, - 0x04, 0x7b, 0x02, 0xbc, 0x06, 0xe6, 0x00, 0x18, 0x00, 0x23, 0x00, 0x29, - 0x40, 0x15, 0x15, 0x15, 0x05, 0x0d, 0x40, 0x09, 0x0c, 0x48, 0x0d, 0x0d, - 0x12, 0x00, 0x08, 0x08, 0x00, 0x00, 0x0f, 0x23, 0x01, 0x23, 0x1f, 0x00, - 0x2f, 0xcd, 0x5d, 0x32, 0x2f, 0x33, 0x2f, 0x11, 0x33, 0x33, 0x2f, 0x2b, - 0x33, 0x33, 0x2f, 0x31, 0x30, 0x01, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, - 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, - 0x33, 0x0e, 0x01, 0x07, 0x15, 0x23, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, - 0x3d, 0x01, 0x01, 0xf2, 0x2a, 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, 0x09, - 0x5b, 0x0b, 0x2f, 0x52, 0x3f, 0x2c, 0x55, 0x50, 0x47, 0x1e, 0x36, 0x32, - 0x08, 0x5c, 0x10, 0x63, 0x98, 0x57, 0x2e, 0x2d, 0x7f, 0x2d, 0x1f, 0x05, - 0xee, 0x1d, 0x24, 0x1d, 0x34, 0x39, 0x61, 0x63, 0x39, 0x1f, 0x25, 0x1f, - 0x35, 0x38, 0x8a, 0x6e, 0x2c, 0xa5, 0x23, 0x4c, 0x33, 0x36, 0x6e, 0x56, - 0x4d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x05, 0xe6, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, - 0x00, 0xf4, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x16, 0x16, 0x11, 0x26, - 0x01, 0x19, 0xb8, 0xff, 0xdd, 0xb4, 0x19, 0x1f, 0x07, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x05, 0x53, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, - 0x17, 0x17, 0x11, 0x26, 0x01, 0x18, 0xb8, 0xff, 0xe3, 0xb4, 0x18, 0x19, - 0x07, 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x06, 0xf7, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0xc8, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xc0, 0x00, 0x5c, 0x00, 0xf0, 0x00, 0x46, 0x40, 0x33, - 0x03, 0xcf, 0x21, 0x01, 0x02, 0x1f, 0x21, 0x2f, 0x21, 0x4f, 0x21, 0x6f, - 0x21, 0x04, 0x0f, 0x21, 0x3f, 0x21, 0xaf, 0x21, 0xbf, 0x21, 0x04, 0x40, - 0x21, 0x50, 0x21, 0x60, 0x21, 0x70, 0x21, 0x80, 0x21, 0x05, 0x21, 0x02, - 0x01, 0x16, 0x16, 0x11, 0x26, 0x03, 0x02, 0x01, 0x1a, 0x00, 0x1a, 0x19, - 0x06, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x5f, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0xf7, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x10, 0x27, 0x00, 0x6a, 0x00, 0xc8, 0x00, 0x00, 0x11, 0x07, 0x03, 0x39, - 0x01, 0x04, 0x00, 0xf0, 0x00, 0x46, 0x40, 0x33, 0x03, 0xcf, 0x21, 0x01, - 0x02, 0x1f, 0x21, 0x2f, 0x21, 0x4f, 0x21, 0x6f, 0x21, 0x04, 0x0f, 0x21, - 0x3f, 0x21, 0xaf, 0x21, 0xbf, 0x21, 0x04, 0x40, 0x21, 0x50, 0x21, 0x60, - 0x21, 0x70, 0x21, 0x80, 0x21, 0x05, 0x21, 0x02, 0x01, 0x16, 0x16, 0x11, - 0x26, 0x03, 0x02, 0x01, 0x1a, 0x00, 0x1a, 0x19, 0x06, 0x0f, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x35, 0x2f, 0x5d, 0x5d, - 0x71, 0x5f, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x3b, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x73, 0x00, 0x00, 0x11, 0x07, 0x07, 0x92, - 0x01, 0x04, 0x00, 0x64, 0x00, 0x16, 0xb5, 0x02, 0x24, 0x11, 0x26, 0x02, - 0x24, 0xb8, 0xff, 0xfd, 0xb4, 0x24, 0x20, 0x0c, 0x00, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x84, 0xfe, 0x57, 0x04, 0x3b, - 0x06, 0x30, 0x12, 0x26, 0x03, 0x73, 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, - 0x00, 0xfa, 0x00, 0x64, 0x00, 0x18, 0xb6, 0x02, 0x25, 0x25, 0x11, 0x26, - 0x02, 0x29, 0xb8, 0xff, 0xec, 0xb4, 0x29, 0x24, 0x0c, 0x00, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x05, 0xbd, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9e, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, - 0x1f, 0x11, 0x26, 0x01, 0x1f, 0xb8, 0xff, 0xea, 0xb4, 0x1f, 0x2b, 0x07, - 0x00, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x06, 0xc0, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x11, 0x07, 0x07, 0x96, 0x00, 0xba, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x11, - 0x03, 0x02, 0x01, 0x1d, 0x1d, 0x11, 0x26, 0x03, 0x02, 0x01, 0x27, 0x00, - 0x27, 0x32, 0x07, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x35, 0x35, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x29, - 0x06, 0xf3, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x09, 0x04, - 0x01, 0x72, 0x00, 0x00, 0x00, 0x18, 0xb6, 0x01, 0x09, 0x09, 0x05, 0x26, - 0x01, 0x0c, 0xb8, 0xff, 0xfc, 0xb4, 0x0c, 0x14, 0x04, 0x08, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, - 0x00, 0x00, 0x05, 0x29, 0x06, 0x9c, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x8b, 0x01, 0x6c, 0x01, 0x49, 0x00, 0x16, 0x40, 0x0d, - 0x01, 0x0a, 0x0a, 0x05, 0x26, 0x01, 0x0b, 0x06, 0x0b, 0x0c, 0x04, 0x08, - 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x11, 0x35, 0xff, 0xff, 0x00, 0x4b, - 0x00, 0x00, 0x06, 0xb9, 0x06, 0x07, 0x10, 0x27, 0x00, 0x3c, 0x01, 0x90, - 0x00, 0x00, 0x11, 0x06, 0x07, 0xc0, 0x80, 0x00, 0x00, 0x07, 0xb2, 0x01, - 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, - 0x00, 0x00, 0x06, 0xeb, 0x06, 0x07, 0x10, 0x27, 0x00, 0x3c, 0x01, 0xc2, - 0x00, 0x00, 0x11, 0x06, 0x03, 0x39, 0xad, 0x00, 0x00, 0x07, 0xb2, 0x01, - 0x0c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, - 0x00, 0x00, 0x05, 0xb2, 0x05, 0xcc, 0x10, 0x27, 0x00, 0x33, 0x00, 0xc8, - 0x00, 0x00, 0x11, 0x07, 0x07, 0xcc, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x07, - 0xb2, 0x02, 0x1c, 0x00, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x03, 0xff, 0xea, - 0x04, 0xd0, 0x02, 0xc1, 0x05, 0xe3, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0d, - 0x00, 0x2a, 0x40, 0x12, 0x05, 0x01, 0x00, 0x00, 0x0f, 0x0a, 0x08, 0x0b, - 0x0b, 0x0e, 0x02, 0x0c, 0x0c, 0x09, 0x80, 0x0b, 0x06, 0x01, 0x00, 0x2f, - 0x33, 0x33, 0x1a, 0xce, 0x39, 0x2f, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x23, 0x35, 0x33, - 0x07, 0x15, 0x23, 0x03, 0x35, 0x33, 0x03, 0x23, 0x35, 0x33, 0x02, 0xc1, - 0xad, 0xad, 0xea, 0x75, 0xc0, 0xb2, 0xbd, 0xad, 0xad, 0x04, 0xd0, 0xba, - 0xad, 0x0d, 0x01, 0x07, 0x0c, 0xfe, 0xed, 0xba, 0x00, 0x03, 0xff, 0xea, - 0x04, 0xd0, 0x02, 0xc1, 0x05, 0xe3, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0d, - 0x00, 0x2a, 0x40, 0x12, 0x06, 0x01, 0x00, 0x00, 0x0f, 0x0a, 0x09, 0x0b, - 0x0b, 0x0e, 0x02, 0x0c, 0x0c, 0x05, 0x80, 0x0b, 0x08, 0x01, 0x00, 0x2f, - 0x33, 0x33, 0x1a, 0xce, 0x39, 0x2f, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x23, 0x35, 0x33, - 0x25, 0x33, 0x15, 0x03, 0x23, 0x35, 0x07, 0x23, 0x35, 0x33, 0x02, 0xc1, - 0xad, 0xad, 0xfe, 0x95, 0xb2, 0xc0, 0x75, 0x3c, 0xad, 0xad, 0x04, 0xd0, - 0xba, 0x59, 0x0c, 0xfe, 0xf9, 0x0d, 0x0d, 0xba, 0x00, 0x01, 0x00, 0xcb, - 0x04, 0xc2, 0x01, 0xdf, 0x06, 0x07, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x01, - 0x04, 0x06, 0x07, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x03, 0x35, 0x33, 0x13, 0x15, 0x01, - 0x94, 0xc9, 0xcf, 0x45, 0x04, 0xc2, 0x01, 0x20, 0x25, 0xfe, 0xdc, 0x21, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xc0, 0x01, 0x6f, 0x00, 0x00, - 0x10, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0x57, 0x05, 0xeb, 0x04, 0x4f, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, - 0x36, 0x2b, 0x36, 0x31, 0x1b, 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x53, 0xfe, 0x57, 0x05, 0xeb, 0x06, 0x07, 0x12, 0x26, - 0x03, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x03, 0x39, 0x01, 0xeb, 0x00, 0x00, - 0x11, 0x07, 0x03, 0x07, 0x03, 0x20, 0x00, 0x00, 0x00, 0x14, 0x40, 0x0c, - 0x01, 0x2b, 0x11, 0x26, 0x01, 0x2b, 0x37, 0x2b, 0x2e, 0x1b, 0x0e, 0x25, - 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x53, - 0xff, 0xec, 0x05, 0xeb, 0x05, 0xbd, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x11, 0x07, 0x02, 0x9e, 0x01, 0xca, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, - 0x34, 0x11, 0x26, 0x01, 0x34, 0xb8, 0xff, 0xfb, 0xb4, 0x34, 0x40, 0x1b, - 0x0e, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x53, - 0xfe, 0x57, 0x05, 0xeb, 0x05, 0xbd, 0x12, 0x26, 0x03, 0x7b, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x9e, 0x01, 0xca, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x03, 0x20, 0x00, 0x00, 0x00, 0x16, 0xb5, 0x01, 0x34, 0x11, 0x26, 0x01, - 0x34, 0xb8, 0xff, 0xfb, 0xb4, 0x34, 0x40, 0x1b, 0x0e, 0x25, 0x2b, 0x11, - 0x35, 0x00, 0x2b, 0x35, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xec, 0x07, 0x03, - 0x06, 0x07, 0x10, 0x26, 0x07, 0xc0, 0x91, 0x00, 0x11, 0x07, 0x00, 0x32, - 0x01, 0x2c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x00, 0x03, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xec, 0x06, 0x3b, - 0x06, 0x07, 0x10, 0x27, 0x03, 0x39, 0xff, 0x1c, 0x00, 0x00, 0x11, 0x06, - 0x00, 0x32, 0x64, 0x00, 0x00, 0x07, 0xb2, 0x00, 0x03, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0x00, 0x00, 0x06, 0xcf, - 0x06, 0x07, 0x10, 0x26, 0x07, 0xc0, 0x91, 0x00, 0x11, 0x07, 0x03, 0x5b, - 0x01, 0x2c, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x00, 0x03, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2f, 0x00, 0x00, 0x06, 0x07, - 0x06, 0x07, 0x10, 0x27, 0x03, 0x39, 0xff, 0x62, 0x00, 0x00, 0x11, 0x06, - 0x03, 0x5b, 0x64, 0x00, 0x00, 0x07, 0xb2, 0x00, 0x03, 0x00, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x57, 0xfe, 0x57, 0x05, 0xa3, - 0x05, 0x96, 0x12, 0x26, 0x03, 0x5b, 0x00, 0x00, 0x11, 0x07, 0x03, 0x07, - 0x02, 0xfe, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x01, 0x2f, 0x2b, 0x2f, 0x2a, - 0x1b, 0x0a, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf3, - 0x04, 0xab, 0x02, 0x44, 0x05, 0xc2, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x03, - 0x00, 0x07, 0x06, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x13, 0x35, 0x13, 0x33, 0x15, 0x07, 0xf3, - 0x82, 0xcf, 0xf3, 0x04, 0xab, 0x14, 0x01, 0x03, 0x1d, 0xfa, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xec, 0x04, 0x85, 0x01, 0xb7, 0x05, 0xcc, 0x00, 0x0a, - 0x00, 0x22, 0x40, 0x0e, 0x02, 0x09, 0x05, 0x01, 0x01, 0x09, 0x09, 0x0b, - 0x0c, 0x02, 0x02, 0x00, 0x80, 0x06, 0x00, 0x2f, 0x1a, 0xcc, 0x39, 0x2f, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x31, 0x30, - 0x01, 0x15, 0x23, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x3d, 0x01, 0x01, - 0xb3, 0x57, 0x2e, 0x2d, 0x7f, 0x2d, 0x1f, 0x05, 0xcc, 0xa5, 0x23, 0x4c, - 0x33, 0x36, 0x6e, 0x56, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xd6, - 0xfe, 0xef, 0x00, 0x2a, 0x05, 0x07, 0x00, 0x03, 0x00, 0x0a, 0xb2, 0x02, - 0x03, 0x00, 0x00, 0x2f, 0x32, 0x2f, 0x31, 0x30, 0x13, 0x11, 0x23, 0x11, - 0x2a, 0x54, 0x05, 0x07, 0xf9, 0xe8, 0x06, 0x18, 0x00, 0x01, 0xff, 0x20, - 0xfe, 0xef, 0x00, 0xe0, 0x05, 0x86, 0x00, 0x0e, 0x00, 0x22, 0x40, 0x11, - 0x0e, 0x02, 0x0b, 0x05, 0x08, 0x05, 0x09, 0x0d, 0x09, 0x07, 0x0d, 0x03, - 0x03, 0x01, 0x07, 0x03, 0x01, 0x00, 0x2f, 0x3f, 0x12, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x23, 0x11, 0x07, - 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x2a, - 0x54, 0x7f, 0x37, 0xa9, 0xa9, 0x37, 0xa9, 0xa9, 0x37, 0xa9, 0xa9, 0x37, - 0x7f, 0xfe, 0xef, 0x05, 0x59, 0x80, 0x37, 0xa8, 0xa7, 0x38, 0xaa, 0xaa, - 0x38, 0xa7, 0xa8, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xd7, - 0xfe, 0xef, 0x01, 0xb3, 0x05, 0x86, 0x00, 0x0a, 0x00, 0x16, 0x40, 0x09, - 0x01, 0x04, 0x04, 0x07, 0x07, 0x06, 0x0a, 0x03, 0x06, 0x00, 0x2f, 0x3f, - 0x12, 0x39, 0x2f, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, - 0x23, 0x11, 0x23, 0x11, 0x21, 0x27, 0x37, 0x01, 0xb3, 0xdf, 0x37, 0x84, - 0xf8, 0x52, 0x01, 0x4a, 0x84, 0x37, 0x04, 0xa9, 0xdb, 0x37, 0x7d, 0xfa, - 0x6d, 0x05, 0xe2, 0x7d, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x4c, - 0xfe, 0xef, 0x00, 0x28, 0x05, 0x86, 0x00, 0x0a, 0x00, 0x1d, 0x40, 0x0e, - 0x0f, 0x0c, 0x1f, 0x0c, 0x02, 0x05, 0x02, 0x02, 0x0a, 0x0a, 0x01, 0x07, - 0x03, 0x01, 0x00, 0x2f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x33, 0x01, - 0x5d, 0x31, 0x30, 0x13, 0x23, 0x11, 0x23, 0x17, 0x07, 0x27, 0x37, 0x17, - 0x07, 0x21, 0x28, 0x52, 0xf8, 0x84, 0x37, 0xdf, 0xdf, 0x37, 0x84, 0x01, - 0x4a, 0xfe, 0xef, 0x05, 0x93, 0x7d, 0x37, 0xdb, 0xdd, 0x38, 0x7d, 0x00, - 0xff, 0xff, 0x00, 0x00, 0x01, 0xc3, 0x04, 0x72, 0x02, 0x4c, 0x12, 0x06, - 0x07, 0xde, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xc3, 0x04, 0x72, - 0x02, 0x4c, 0x00, 0x03, 0x00, 0x31, 0x40, 0x22, 0x00, 0x02, 0x04, 0x05, - 0x01, 0x00, 0xba, 0x59, 0x0f, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x4f, 0x01, - 0x04, 0x2f, 0x01, 0x3f, 0x01, 0x6f, 0x01, 0xaf, 0x01, 0xdf, 0x01, 0x05, - 0x01, 0x40, 0x26, 0x2b, 0x48, 0x01, 0x00, 0x2f, 0x2b, 0x5d, 0x71, 0x2b, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x11, 0x35, 0x21, 0x15, 0x04, - 0x72, 0x01, 0xc3, 0x89, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x01, 0xc3, 0x08, 0x00, 0x02, 0x4c, 0x00, 0x03, 0x00, 0x31, 0x40, 0x22, - 0x02, 0x00, 0x05, 0x04, 0x01, 0x00, 0xba, 0x59, 0x0f, 0x01, 0x1f, 0x01, - 0x3f, 0x01, 0x4f, 0x01, 0x04, 0x2f, 0x01, 0x3f, 0x01, 0x6f, 0x01, 0xaf, - 0x01, 0xdf, 0x01, 0x05, 0x01, 0x40, 0x26, 0x2b, 0x48, 0x01, 0x00, 0x2f, - 0x2b, 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x11, - 0x35, 0x21, 0x15, 0x08, 0x00, 0x01, 0xc3, 0x89, 0x89, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x01, 0xc3, 0x08, 0x00, 0x02, 0x4c, 0x00, 0x03, - 0x00, 0x31, 0x40, 0x22, 0x02, 0x05, 0x00, 0x04, 0x01, 0x00, 0xba, 0x59, - 0x0f, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x4f, 0x01, 0x04, 0x2f, 0x01, 0x3f, - 0x01, 0x6f, 0x01, 0xaf, 0x01, 0xdf, 0x01, 0x05, 0x01, 0x40, 0x26, 0x2b, - 0x48, 0x01, 0x00, 0x2f, 0x2b, 0x5d, 0x71, 0x2b, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x11, 0x35, 0x21, 0x15, 0x08, 0x00, 0x01, 0xc3, 0x89, - 0x89, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb3, 0x00, 0x00, 0x02, 0x9b, - 0x05, 0xcc, 0x10, 0x06, 0x01, 0x83, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, - 0xfe, 0x4e, 0x04, 0x8a, 0xff, 0xa9, 0x10, 0x26, 0x00, 0x42, 0x00, 0xe5, - 0x11, 0x07, 0x00, 0x42, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x31, 0x40, 0x25, - 0x00, 0x00, 0x01, 0x01, 0x10, 0x01, 0x20, 0x01, 0x90, 0x01, 0xe0, 0x01, - 0xf0, 0x01, 0x05, 0x01, 0x01, 0x1f, 0x05, 0x01, 0x3f, 0x05, 0x4f, 0x05, - 0x5f, 0x05, 0x6f, 0x05, 0x7f, 0x05, 0x05, 0x00, 0x05, 0x90, 0x05, 0x02, - 0x05, 0x00, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x2f, 0x5d, 0x71, 0x35, 0x00, - 0x00, 0x01, 0x00, 0x7f, 0x03, 0xb8, 0x01, 0x48, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x23, 0x40, 0x12, 0x05, 0x09, 0x09, 0x07, 0x00, 0x00, 0x0b, 0x0a, - 0x00, 0x07, 0x9c, 0x5b, 0x05, 0x00, 0xa9, 0x5b, 0x05, 0x03, 0x00, 0x3f, - 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x35, 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x33, 0x15, 0x7f, - 0x25, 0x2b, 0x79, 0x5f, 0x59, 0x03, 0xb8, 0x92, 0x61, 0x93, 0x43, 0x89, - 0x7d, 0xc3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7f, 0x03, 0xb8, 0x01, 0x48, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x23, 0x40, 0x12, 0x06, 0x00, 0x00, 0x04, - 0x08, 0x08, 0x0b, 0x0a, 0x08, 0x07, 0x9c, 0x5b, 0x08, 0x03, 0xa9, 0x5b, - 0x08, 0x03, 0x00, 0x3f, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, - 0x23, 0x35, 0x33, 0x01, 0x48, 0x26, 0x28, 0x7b, 0x5e, 0x58, 0xc3, 0x04, - 0xf0, 0x69, 0x8f, 0x40, 0x88, 0x7c, 0xc5, 0x00, 0x00, 0x01, 0x00, 0x7f, - 0xfe, 0xfa, 0x01, 0x48, 0x00, 0xc3, 0x00, 0x09, 0x00, 0x22, 0x40, 0x11, - 0x06, 0x00, 0x00, 0x04, 0x08, 0x08, 0x0b, 0x0a, 0x08, 0x03, 0xa9, 0x5b, - 0x07, 0x08, 0x9c, 0x5b, 0x07, 0x00, 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x14, 0x06, 0x07, - 0x23, 0x36, 0x35, 0x23, 0x35, 0x33, 0x01, 0x48, 0x26, 0x28, 0x7b, 0x5e, - 0x58, 0xc3, 0x33, 0x6a, 0x8e, 0x41, 0x88, 0x7e, 0xc3, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7e, 0x03, 0xb8, 0x01, 0x47, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x23, 0x40, 0x12, 0x04, 0x01, 0x02, 0x08, 0x01, 0x08, 0x0b, 0x0a, - 0x09, 0x04, 0xa9, 0x5b, 0x09, 0x02, 0x9c, 0x59, 0x09, 0x03, 0x00, 0x3f, - 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x15, 0x23, 0x14, 0x17, 0x23, 0x2e, 0x01, 0x3d, 0x01, 0x01, - 0x41, 0x58, 0x5e, 0x7b, 0x28, 0x26, 0x05, 0x81, 0xc5, 0x7c, 0x88, 0x40, - 0x91, 0x67, 0x91, 0x00, 0x00, 0x02, 0x00, 0x4b, 0x03, 0xb8, 0x02, 0x5f, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x13, 0x00, 0x4a, 0x40, 0x26, 0x0f, 0x13, - 0x13, 0x0a, 0x05, 0x09, 0x07, 0x00, 0x00, 0x09, 0x11, 0x0a, 0x09, 0x0a, - 0x15, 0x14, 0x07, 0x11, 0x0a, 0x11, 0x9c, 0x5b, 0x00, 0x00, 0x0a, 0x0f, - 0x0a, 0xa9, 0x5b, 0x04, 0x0f, 0x03, 0xaf, 0x15, 0x01, 0x9f, 0x15, 0x01, - 0x5d, 0x5d, 0x00, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x35, - 0x34, 0x36, 0x37, 0x33, 0x06, 0x15, 0x33, 0x15, 0x21, 0x35, 0x34, 0x36, - 0x37, 0x33, 0x06, 0x15, 0x33, 0x15, 0x01, 0x97, 0x24, 0x2a, 0x7a, 0x5e, - 0x58, 0xfd, 0xf2, 0x25, 0x2b, 0x79, 0x5f, 0x59, 0x03, 0xb8, 0x92, 0x5f, - 0x95, 0x43, 0x88, 0x7e, 0xc3, 0x92, 0x61, 0x93, 0x43, 0x89, 0x7d, 0xc3, - 0x00, 0x02, 0x00, 0x4b, 0x03, 0xb8, 0x02, 0x5f, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x13, 0x00, 0x4a, 0x40, 0x26, 0x10, 0x0a, 0x0a, 0x12, 0x06, 0x09, - 0x04, 0x08, 0x08, 0x09, 0x0e, 0x12, 0x09, 0x12, 0x15, 0x14, 0x07, 0x11, - 0x12, 0x11, 0x9c, 0x5b, 0x03, 0x03, 0x0d, 0x12, 0x0d, 0xa9, 0x5b, 0x08, - 0x12, 0x03, 0xaf, 0x15, 0x01, 0x9f, 0x15, 0x01, 0x5d, 0x5d, 0x00, 0x3f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x07, 0x23, 0x36, - 0x35, 0x23, 0x35, 0x33, 0x05, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, - 0x35, 0x33, 0x02, 0x5f, 0x22, 0x2d, 0x79, 0x5e, 0x58, 0xc2, 0xfe, 0xb5, - 0x26, 0x28, 0x7b, 0x5e, 0x58, 0xc3, 0x04, 0xf0, 0x5d, 0x92, 0x49, 0x88, - 0x7e, 0xc3, 0x91, 0x69, 0x8f, 0x40, 0x88, 0x7e, 0xc3, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x4b, 0xfe, 0xfa, 0x02, 0x5f, 0x00, 0xc3, 0x00, 0x09, - 0x00, 0x13, 0x00, 0x4a, 0x40, 0x25, 0x10, 0x0a, 0x0a, 0x12, 0x06, 0x00, - 0x00, 0x04, 0x08, 0x08, 0x0e, 0x12, 0x12, 0x15, 0x14, 0x03, 0x03, 0x0d, - 0x12, 0x0d, 0xa9, 0x5b, 0x08, 0x08, 0x12, 0x11, 0x12, 0x9c, 0x5b, 0x07, - 0x11, 0xaf, 0x15, 0x01, 0x9f, 0x15, 0x01, 0x5d, 0x5d, 0x00, 0x2f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, - 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x14, 0x06, 0x07, 0x23, 0x36, - 0x35, 0x23, 0x35, 0x33, 0x05, 0x14, 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, - 0x35, 0x33, 0x02, 0x5f, 0x23, 0x2c, 0x79, 0x5e, 0x58, 0xc2, 0xfe, 0xb5, - 0x26, 0x28, 0x7b, 0x5e, 0x58, 0xc3, 0x33, 0x5f, 0x93, 0x47, 0x88, 0x7e, - 0xc3, 0x90, 0x6a, 0x8e, 0x41, 0x88, 0x7e, 0xc3, 0xff, 0xff, 0x00, 0x48, - 0x03, 0xb8, 0x02, 0x46, 0x05, 0x81, 0x10, 0x26, 0x07, 0xe6, 0xca, 0x00, - 0x10, 0x07, 0x07, 0xe6, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, - 0xff, 0x76, 0x03, 0xea, 0x05, 0xcc, 0x00, 0x0b, 0x00, 0x37, 0x40, 0x1f, - 0x0b, 0x09, 0x08, 0x00, 0x00, 0x07, 0x06, 0x04, 0x03, 0x03, 0x0d, 0x0c, - 0x0a, 0x0b, 0xc1, 0x59, 0x07, 0x0a, 0xc2, 0x59, 0x05, 0x04, 0xc1, 0x59, - 0x07, 0x05, 0xc2, 0x59, 0x07, 0x00, 0x01, 0x00, 0x2f, 0x3f, 0x2b, 0x2b, - 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x03, 0x23, 0x03, 0x05, 0x35, 0x05, - 0x03, 0x33, 0x03, 0x25, 0x15, 0x02, 0x89, 0x16, 0x73, 0x16, 0xfe, 0xa0, - 0x01, 0x60, 0x1c, 0xd7, 0x1c, 0x01, 0x61, 0x03, 0xe8, 0xfb, 0x8e, 0x04, - 0x72, 0x1b, 0xa4, 0x1d, 0x01, 0x78, 0xfe, 0x88, 0x1d, 0xa4, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x88, 0xff, 0x73, 0x03, 0xe9, 0x05, 0xcc, 0x00, 0x15, - 0x00, 0x61, 0x40, 0x3c, 0x0c, 0x08, 0x08, 0x05, 0x06, 0x0b, 0x0e, 0x0f, - 0x05, 0x09, 0x09, 0x00, 0x13, 0x01, 0x01, 0x14, 0x11, 0x03, 0x04, 0x10, - 0x03, 0x00, 0x00, 0x17, 0x16, 0x12, 0x13, 0xc1, 0x59, 0x0f, 0x12, 0xc2, - 0x5b, 0x0d, 0x0c, 0xc1, 0x59, 0x0f, 0x0d, 0xc2, 0x5b, 0x0f, 0x07, 0x08, - 0xc1, 0x59, 0x04, 0x07, 0xc2, 0x5b, 0x02, 0x01, 0xc1, 0x59, 0x04, 0x02, - 0xc2, 0x5b, 0x04, 0x00, 0x00, 0x3f, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x18, - 0x2f, 0x2b, 0x2b, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x17, 0x33, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x17, 0x33, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x05, 0x35, 0x05, 0x03, 0x33, 0x03, 0x25, 0x15, - 0x25, 0x03, 0x13, 0x25, 0x15, 0x25, 0x13, 0x23, 0x13, 0x05, 0x35, 0x05, - 0x13, 0x01, 0xf1, 0xfe, 0x98, 0x01, 0x68, 0x10, 0xaf, 0x10, 0x01, 0x69, - 0xfe, 0x97, 0x1a, 0x1a, 0x01, 0x68, 0xfe, 0x98, 0x10, 0xaf, 0x10, 0xfe, - 0x97, 0x01, 0x69, 0x1a, 0x03, 0xe8, 0x1b, 0xa4, 0x1d, 0x01, 0x78, 0xfe, - 0x88, 0x1d, 0xa4, 0x1b, 0xfe, 0xb6, 0xfe, 0xb9, 0x1b, 0xa4, 0x1d, 0xfe, - 0x88, 0x01, 0x78, 0x1d, 0xa4, 0x1b, 0x01, 0x47, 0x00, 0x01, 0x00, 0x51, - 0x01, 0x91, 0x02, 0x7c, 0x03, 0xbc, 0x00, 0x0b, 0x00, 0x20, 0x40, 0x11, - 0x06, 0x00, 0x0c, 0x0d, 0x8f, 0x03, 0x01, 0x00, 0x03, 0x30, 0x03, 0x02, - 0x03, 0x0f, 0x09, 0x01, 0x09, 0x00, 0x2f, 0x5d, 0xcd, 0x5d, 0x5d, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x7c, 0xa3, 0x76, 0x71, 0xa1, - 0xa2, 0x70, 0x74, 0xa5, 0x02, 0xaa, 0x71, 0xa8, 0xa6, 0x73, 0x73, 0x9f, - 0xa1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x16, 0x00, 0x00, 0x06, 0xea, - 0x00, 0xdb, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2e, 0x40, 0x16, - 0x0b, 0x08, 0x07, 0x04, 0x03, 0x00, 0x00, 0x04, 0x08, 0x03, 0x0c, 0x0d, - 0x05, 0x01, 0x09, 0x08, 0x09, 0x9b, 0x5b, 0x04, 0x00, 0x08, 0x00, 0x2f, - 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x35, 0x33, 0x15, - 0x21, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x06, 0x28, 0xc2, 0xfc, - 0xb7, 0xc0, 0xfc, 0xb5, 0xc3, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00, - 0x00, 0x01, 0xff, 0xd7, 0xfe, 0xef, 0x01, 0xb3, 0x04, 0xd1, 0x00, 0x05, - 0x00, 0x0a, 0xb2, 0x00, 0x03, 0x02, 0x00, 0x2f, 0x2f, 0x33, 0x31, 0x30, - 0x13, 0x11, 0x23, 0x11, 0x21, 0x15, 0x2a, 0x53, 0x01, 0xdc, 0x04, 0x82, - 0xfa, 0x6d, 0x05, 0xe2, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x4d, - 0xfe, 0xef, 0x00, 0x29, 0x04, 0xd1, 0x00, 0x05, 0x00, 0x0a, 0xb2, 0x04, - 0x00, 0x01, 0x00, 0x2f, 0x33, 0x2f, 0x31, 0x30, 0x01, 0x35, 0x21, 0x11, - 0x23, 0x11, 0xfe, 0x4d, 0x01, 0xdc, 0x53, 0x04, 0x82, 0x4f, 0xfa, 0x1e, - 0x05, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0x12, 0xfe, 0xef, 0x00, 0xee, - 0x05, 0x83, 0x00, 0x07, 0x00, 0x11, 0xb6, 0x01, 0x05, 0x05, 0x03, 0x06, - 0x03, 0x03, 0x00, 0x2f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x13, - 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0xee, 0xc4, 0x54, 0xc4, 0x01, - 0xdc, 0x03, 0xd1, 0xfb, 0x1e, 0x04, 0xe2, 0x01, 0xb2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x12, 0xfe, 0xef, 0x00, 0xee, 0x05, 0x83, 0x00, 0x0b, - 0x00, 0x16, 0x40, 0x09, 0x0a, 0x01, 0x05, 0x05, 0x03, 0x09, 0x06, 0x03, - 0x03, 0x00, 0x2f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, - 0xee, 0xc4, 0x54, 0xc4, 0x01, 0xdc, 0xfe, 0x75, 0x01, 0x8b, 0x03, 0xd1, - 0xfb, 0x1e, 0x04, 0xe2, 0x01, 0xb2, 0x4f, 0xfe, 0xeb, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x12, 0xfe, 0xef, 0x00, 0xee, 0x05, 0x83, 0x00, 0x0b, - 0x00, 0x16, 0x40, 0x09, 0x07, 0x00, 0x0b, 0x0b, 0x04, 0x09, 0x03, 0x04, - 0x03, 0x00, 0x3f, 0x33, 0x2f, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x31, 0x30, - 0x03, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, - 0xee, 0x01, 0x8b, 0xfe, 0x75, 0x01, 0xdc, 0xc4, 0x54, 0xc4, 0x04, 0x1f, - 0x01, 0x15, 0x4f, 0xfe, 0x4e, 0xfb, 0x1e, 0x04, 0xe2, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06, - 0x07, 0xd6, 0x00, 0x00, 0x00, 0x07, 0x00, 0x37, 0xff, 0xf5, 0x07, 0xc8, - 0x05, 0x8d, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, - 0x00, 0x3f, 0x00, 0x4b, 0x01, 0xe2, 0x40, 0xff, 0x2e, 0x25, 0x1f, 0x25, - 0xb5, 0x5b, 0x00, 0x01, 0x02, 0x03, 0x01, 0x03, 0x1f, 0x1f, 0x28, 0x28, - 0x0d, 0x46, 0x3d, 0x37, 0x3d, 0xb5, 0x5b, 0x40, 0x37, 0x10, 0x07, 0x0d, - 0x07, 0xb5, 0x5b, 0x16, 0x0d, 0x37, 0x0d, 0x4d, 0x4c, 0x34, 0x43, 0xb6, - 0x59, 0x3a, 0x34, 0xb7, 0x5b, 0x3a, 0x49, 0xb6, 0x59, 0x3a, 0x13, 0x1c, - 0x2b, 0xb6, 0x59, 0x22, 0x1c, 0xb7, 0x5b, 0x22, 0x31, 0xb6, 0x59, 0x22, - 0x13, 0x0a, 0x19, 0xb6, 0x59, 0x04, 0x0a, 0xb7, 0x5b, 0x04, 0x13, 0xb6, - 0x59, 0x04, 0x04, 0x02, 0x03, 0x00, 0x12, 0x79, 0x4d, 0x01, 0x69, 0x4d, - 0x01, 0x5d, 0x4d, 0x01, 0x49, 0x4d, 0x01, 0x39, 0x4d, 0x01, 0x2b, 0x4d, - 0x01, 0x16, 0x4d, 0x01, 0xf9, 0x4d, 0x01, 0xed, 0x4d, 0x01, 0xc9, 0x4d, - 0x01, 0xbb, 0x4d, 0x01, 0x99, 0x4d, 0x01, 0x7b, 0x4d, 0x01, 0x66, 0x4d, - 0x01, 0x49, 0x4d, 0x01, 0x36, 0x4d, 0x01, 0x19, 0x4d, 0x01, 0x09, 0x4d, - 0x01, 0x69, 0xf9, 0x4d, 0x01, 0xeb, 0x4d, 0x01, 0xdd, 0x4d, 0x01, 0xa9, - 0x4d, 0x01, 0x96, 0x4d, 0x01, 0x79, 0x4d, 0x01, 0x6b, 0x4d, 0x01, 0x49, - 0x4d, 0x01, 0x3b, 0x4d, 0x01, 0x19, 0x4d, 0x01, 0x0b, 0x4d, 0x01, 0xfd, - 0x4d, 0x01, 0xd9, 0x4d, 0x01, 0xcb, 0x4d, 0x01, 0xa9, 0x4d, 0x01, 0x9b, - 0x4d, 0x01, 0x8d, 0x4d, 0x01, 0x79, 0x4d, 0x01, 0x6b, 0x4d, 0x01, 0x5b, - 0x4d, 0x01, 0x39, 0x4d, 0x01, 0x2b, 0x4d, 0x01, 0x1b, 0x4d, 0x01, 0xf9, - 0x4d, 0x01, 0xeb, 0x4d, 0x01, 0xc9, 0x4d, 0x01, 0xa9, 0x4d, 0x01, 0x96, - 0x4d, 0x01, 0x79, 0x4d, 0x01, 0x6b, 0x4d, 0x01, 0x39, 0x4d, 0x01, 0x26, - 0x4d, 0x01, 0x09, 0x4d, 0x01, 0x38, 0xf9, 0x4d, 0x01, 0xe6, 0x4d, 0x01, - 0xc9, 0x4d, 0x01, 0xb6, 0x4d, 0x01, 0x99, 0x4d, 0x01, 0x8b, 0x4d, 0x40, - 0x52, 0x01, 0x59, 0x4d, 0x01, 0x46, 0x4d, 0x01, 0x29, 0x4d, 0x01, 0x1b, - 0x4d, 0x01, 0xf9, 0x4d, 0x01, 0xeb, 0x4d, 0x01, 0xc9, 0x4d, 0x01, 0xbb, - 0x4d, 0x01, 0xad, 0x4d, 0x01, 0x01, 0x94, 0x4d, 0x01, 0x7b, 0x4d, 0x01, - 0x64, 0x4d, 0x01, 0x4b, 0x4d, 0x01, 0x3f, 0x4d, 0x01, 0x1b, 0x4d, 0x01, - 0x0f, 0x4d, 0x01, 0xe4, 0x4d, 0x01, 0xcb, 0x4d, 0x01, 0xb0, 0x4d, 0x01, - 0x02, 0xa0, 0x4d, 0x01, 0x8f, 0x4d, 0x01, 0x70, 0x4d, 0x01, 0x5f, 0x4d, - 0x01, 0x40, 0x4d, 0x01, 0x1f, 0x4d, 0x01, 0x00, 0x4d, 0x01, 0x08, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x00, 0x3f, 0x3f, 0x3f, 0x2b, 0x2b, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x2b, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x33, - 0x25, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x05, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, - 0x01, 0x30, 0x9b, 0x03, 0x9a, 0x9d, 0xfc, 0x98, 0x96, 0x8f, 0x98, 0x91, - 0x94, 0x95, 0x91, 0x01, 0x2e, 0x43, 0x4f, 0x54, 0x46, 0x49, 0x4f, 0x4b, - 0x49, 0x02, 0x1e, 0x96, 0x8f, 0x98, 0x91, 0x94, 0x95, 0x91, 0x01, 0x2e, - 0x43, 0x4f, 0x54, 0x46, 0x49, 0x4f, 0x4b, 0x49, 0x01, 0xfd, 0x96, 0x8f, - 0x98, 0x91, 0x94, 0x95, 0x91, 0x01, 0x2e, 0x43, 0x4f, 0x54, 0x46, 0x49, - 0x4f, 0x4b, 0x49, 0x05, 0x81, 0x0c, 0xb7, 0xb2, 0xb4, 0xba, 0xbc, 0xb2, - 0xb5, 0xb4, 0xfe, 0x97, 0x85, 0x78, 0x77, 0x86, 0x84, 0x79, 0x7c, 0xd7, - 0xb7, 0xb2, 0xb4, 0xba, 0xbc, 0xb2, 0xb5, 0xb4, 0xfe, 0x97, 0x85, 0x78, - 0x77, 0x86, 0x84, 0x79, 0x7c, 0x01, 0xea, 0xb7, 0xb2, 0xb4, 0xba, 0xbc, - 0xb2, 0xb5, 0xb4, 0xfe, 0x97, 0x85, 0x78, 0x77, 0x86, 0x84, 0x79, 0x7c, - 0x00, 0x01, 0x00, 0x55, 0x03, 0x7a, 0x01, 0x59, 0x05, 0x81, 0x00, 0x03, - 0x00, 0x1b, 0x40, 0x0b, 0x01, 0x02, 0x03, 0x00, 0x02, 0x00, 0x05, 0x04, - 0x00, 0x01, 0x03, 0x00, 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x1b, 0x01, 0x33, 0x03, 0x55, 0x40, 0xc4, - 0x9e, 0x03, 0x7a, 0x02, 0x07, 0xfd, 0xf9, 0x00, 0xff, 0xff, 0x00, 0x55, - 0x03, 0x7a, 0x02, 0xaf, 0x05, 0x81, 0x10, 0x26, 0x07, 0xf6, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xf6, 0x01, 0x56, 0x00, 0x00, 0x00, 0x09, 0xb4, 0x01, - 0x04, 0x60, 0x04, 0x01, 0x5d, 0x11, 0x35, 0x00, 0xff, 0xff, 0xff, 0xa4, - 0x03, 0x7a, 0x02, 0xd3, 0x05, 0x81, 0x10, 0x27, 0x07, 0xf6, 0xff, 0x4f, - 0x00, 0x00, 0x10, 0x26, 0x07, 0xf6, 0x64, 0x00, 0x10, 0x07, 0x07, 0xf6, - 0x01, 0x7a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x8d, 0x02, 0x51, - 0x03, 0xac, 0x00, 0x08, 0x00, 0x25, 0x40, 0x16, 0x06, 0x01, 0x01, 0x08, - 0x05, 0x03, 0x0a, 0x09, 0x03, 0x00, 0xef, 0x5b, 0x0f, 0x03, 0x2f, 0x03, - 0x6f, 0x03, 0x7f, 0x03, 0x04, 0x03, 0x00, 0x2f, 0x5d, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x25, 0x01, 0x35, 0x01, 0x33, - 0x15, 0x09, 0x01, 0x15, 0x01, 0xa8, 0xfe, 0xb0, 0x01, 0x50, 0xa7, 0xfe, - 0xb1, 0x01, 0x51, 0x8d, 0x01, 0x6d, 0x3f, 0x01, 0x73, 0x1f, 0xfe, 0x8c, - 0xfe, 0x91, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x8d, 0x02, 0x52, - 0x03, 0xac, 0x00, 0x08, 0x00, 0x25, 0x40, 0x16, 0x03, 0x08, 0x01, 0x04, - 0x08, 0x03, 0x0a, 0x09, 0x06, 0x00, 0xef, 0x5b, 0x0f, 0x06, 0x2f, 0x06, - 0x6f, 0x06, 0x7f, 0x06, 0x04, 0x06, 0x00, 0x2f, 0x5d, 0x2b, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x25, 0x23, 0x35, 0x09, 0x01, - 0x35, 0x33, 0x01, 0x15, 0x01, 0x01, 0xa8, 0x01, 0x52, 0xfe, 0xb0, 0xa6, - 0x01, 0x51, 0x8d, 0x1d, 0x01, 0x6f, 0x01, 0x74, 0x1f, 0xfe, 0x8d, 0x3f, - 0xff, 0xff, 0x00, 0xb9, 0x00, 0x00, 0x03, 0x47, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x04, 0x00, 0x00, 0x11, 0x07, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x00, - 0x00, 0x14, 0x40, 0x0b, 0x03, 0x02, 0x08, 0x2f, 0x08, 0x01, 0x01, 0x00, - 0x2f, 0x00, 0x01, 0x5d, 0x35, 0x35, 0x5d, 0x11, 0x35, 0x35, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xc0, 0x05, 0xdf, 0x02, 0xeb, 0x06, 0x54, 0x00, 0x03, - 0x00, 0x11, 0xb5, 0x00, 0x05, 0x01, 0x04, 0x02, 0x01, 0x00, 0x2f, 0xcd, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x02, - 0xeb, 0xfc, 0xd5, 0x03, 0x2b, 0x05, 0xdf, 0x75, 0x00, 0x01, 0xfe, 0x60, - 0x00, 0x00, 0x02, 0x62, 0x05, 0x81, 0x00, 0x03, 0x00, 0x13, 0xb7, 0x03, - 0x05, 0x01, 0x04, 0x02, 0x03, 0x00, 0x12, 0x00, 0x3f, 0x3f, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x33, 0xfe, 0xf4, 0x94, - 0x03, 0x71, 0x91, 0x05, 0x81, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xbb, - 0x00, 0x00, 0x01, 0x7e, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, - 0x00, 0x0f, 0x00, 0x48, 0x40, 0x26, 0x0c, 0x08, 0x04, 0x00, 0x00, 0x0f, - 0x0b, 0x07, 0x03, 0x03, 0x10, 0x11, 0x0d, 0x0c, 0x9b, 0x59, 0x09, 0x08, - 0x9b, 0x59, 0x0d, 0x09, 0x0d, 0x09, 0x00, 0x05, 0x05, 0x04, 0x9b, 0x59, - 0x05, 0x00, 0x00, 0x01, 0x9b, 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x2b, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x31, 0x30, 0x33, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, - 0x03, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0xbb, 0xc3, 0xc3, 0xc3, - 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0x04, 0xf1, 0xdb, 0xdb, 0xfe, 0x5b, - 0xdb, 0xdb, 0xfe, 0x59, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x01, 0xff, 0x12, - 0xfe, 0xef, 0x00, 0xee, 0x05, 0x83, 0x00, 0x0f, 0x00, 0x1c, 0x40, 0x0d, - 0x00, 0x08, 0x0b, 0x03, 0x0f, 0x0f, 0x04, 0x0d, 0x07, 0x03, 0x03, 0x04, - 0x03, 0x00, 0x3f, 0x33, 0x11, 0x33, 0x2f, 0x12, 0x39, 0x2f, 0x17, 0x33, - 0x31, 0x30, 0x03, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, - 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0xee, 0xc4, 0xc4, 0x01, 0xdc, 0xc4, - 0xc4, 0xc4, 0x54, 0xc4, 0x04, 0x1f, 0x01, 0x15, 0x4f, 0x4f, 0xfe, 0xeb, - 0x4e, 0xfb, 0x1e, 0x04, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x12, - 0xfe, 0xef, 0x00, 0xee, 0x05, 0x83, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x16, - 0x40, 0x09, 0x08, 0x00, 0x04, 0x04, 0x05, 0x0a, 0x03, 0x05, 0x03, 0x00, - 0x3f, 0x33, 0x2f, 0x12, 0x39, 0x2f, 0x33, 0x33, 0x31, 0x30, 0x03, 0x21, - 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x9d, 0x01, - 0x3a, 0xfe, 0xc6, 0x51, 0x01, 0xdc, 0xc4, 0x54, 0x04, 0x1f, 0x01, 0x15, - 0xfe, 0x9d, 0x01, 0xb2, 0xfe, 0x4e, 0xfb, 0x1e, 0x04, 0xe2, 0x00, 0x00, - 0x00, 0x01, 0xff, 0x10, 0xfe, 0xef, 0x00, 0xf0, 0x05, 0x83, 0x00, 0x05, - 0x00, 0x0f, 0xb5, 0x05, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x2f, 0x3f, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x23, 0x11, 0x03, 0x21, 0x03, 0x2a, - 0x54, 0xc6, 0x01, 0xe0, 0xc6, 0xfe, 0xef, 0x05, 0x26, 0x01, 0x6e, 0xfe, - 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x10, 0xfe, 0xef, 0x00, 0xf0, - 0x05, 0x8a, 0x00, 0x06, 0x00, 0x11, 0xb6, 0x00, 0x04, 0x04, 0x02, 0x05, - 0x03, 0x02, 0x00, 0x2f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x31, 0x30, 0x13, - 0x11, 0x23, 0x11, 0x23, 0x1b, 0x01, 0x2a, 0x54, 0xc6, 0xf0, 0xf0, 0x03, - 0xd1, 0xfb, 0x1e, 0x04, 0xe2, 0x01, 0xb9, 0xfe, 0x47, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xff, 0x11, 0xfe, 0xef, 0x00, 0xef, 0x05, 0x86, 0x00, 0x06, - 0x00, 0x0a, 0x00, 0x22, 0x40, 0x10, 0x06, 0x02, 0x0a, 0x05, 0x07, 0x03, - 0x09, 0x09, 0x07, 0x0a, 0x03, 0x01, 0x08, 0x04, 0x03, 0x01, 0x00, 0x2f, - 0x3f, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x13, 0x23, 0x11, 0x27, 0x37, 0x17, 0x07, 0x37, 0x27, 0x07, - 0x17, 0x2a, 0x54, 0xc5, 0xef, 0xef, 0xc5, 0x54, 0x7e, 0x7e, 0x7e, 0xfe, - 0xef, 0x05, 0x05, 0xb5, 0xdd, 0xdd, 0xb5, 0xb5, 0x71, 0x71, 0x70, 0x00, - 0x00, 0x01, 0xff, 0x12, 0xfe, 0xef, 0x00, 0xee, 0x05, 0x83, 0x00, 0x0d, - 0x00, 0x18, 0x40, 0x0b, 0x00, 0x06, 0x09, 0x03, 0x0d, 0x0d, 0x04, 0x0b, - 0x03, 0x04, 0x03, 0x00, 0x3f, 0x33, 0x2f, 0x12, 0x39, 0x2f, 0x17, 0x33, - 0x31, 0x30, 0x03, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x23, 0x11, 0x23, 0xee, 0xc4, 0xc4, 0x01, 0x18, 0xc4, 0xc4, 0x54, - 0xc4, 0x04, 0x1f, 0x01, 0x15, 0x4f, 0xfe, 0x9c, 0x4e, 0xfb, 0x1e, 0x04, - 0xe2, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x02, 0x33, 0x02, 0x96, - 0x05, 0x81, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x4e, 0x40, 0x2e, 0x0f, 0x06, - 0x02, 0x02, 0x08, 0x01, 0x0e, 0x05, 0x01, 0x05, 0x12, 0x11, 0x00, 0x04, - 0x0e, 0x04, 0xe5, 0x59, 0x08, 0x05, 0x5f, 0x0e, 0x6f, 0x0e, 0x7f, 0x0e, - 0x03, 0x0f, 0x0e, 0x1f, 0x0e, 0x7f, 0x0e, 0x8f, 0x0e, 0x9f, 0x0e, 0x05, - 0x0e, 0x0e, 0x01, 0x0b, 0x06, 0xdc, 0x01, 0xdf, 0x00, 0x3f, 0x3f, 0x33, - 0x12, 0x39, 0x2f, 0x5d, 0x71, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x01, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0x33, 0x11, 0x33, - 0x15, 0x03, 0x06, 0x07, 0x03, 0x21, 0x11, 0x02, 0x27, 0x83, 0xfe, 0x6a, - 0x01, 0x82, 0x97, 0x6f, 0xf0, 0x15, 0x3d, 0xc7, 0x01, 0x17, 0x02, 0xe5, - 0xb2, 0xb2, 0x6f, 0x02, 0x2d, 0xfd, 0xd5, 0x71, 0x02, 0x17, 0x28, 0x5f, - 0xfe, 0xe1, 0x01, 0x68, 0x00, 0x01, 0x00, 0x35, 0x02, 0x28, 0x02, 0x7c, - 0x05, 0x81, 0x00, 0x1d, 0x00, 0x74, 0x40, 0x43, 0x13, 0x1b, 0x01, 0x03, - 0x00, 0x1b, 0x01, 0x09, 0x04, 0x16, 0x0d, 0x00, 0x17, 0x14, 0x14, 0x13, - 0x18, 0x12, 0x12, 0x06, 0x13, 0x00, 0x13, 0x1f, 0x1e, 0x1b, 0x10, 0xe4, - 0x59, 0x44, 0x07, 0x54, 0x07, 0x64, 0x07, 0x03, 0x35, 0x07, 0x01, 0x03, - 0x00, 0x07, 0x10, 0x07, 0x20, 0x07, 0x03, 0x09, 0x05, 0x07, 0x12, 0x1b, - 0x1b, 0x03, 0x14, 0x14, 0x17, 0xe5, 0x59, 0x14, 0xdc, 0x03, 0x0a, 0xe4, - 0x59, 0x03, 0xdd, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x18, 0x2f, 0x39, 0x39, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x5d, - 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x00, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, - 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, - 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x23, 0x13, 0x21, - 0x15, 0x21, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7c, 0x97, 0x8a, - 0x77, 0x9b, 0x14, 0x85, 0x0b, 0x53, 0x40, 0x47, 0x56, 0x51, 0x4b, 0x5b, - 0x3c, 0x81, 0x21, 0x01, 0xfa, 0xfe, 0x72, 0x13, 0x1d, 0x5b, 0x36, 0x82, - 0x91, 0x03, 0x43, 0x84, 0x97, 0x72, 0x6b, 0x0f, 0x3c, 0x47, 0x55, 0x5d, - 0x51, 0x55, 0x3c, 0x01, 0xd4, 0x71, 0xf5, 0x1a, 0x21, 0x91, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2b, 0x02, 0x34, 0x02, 0x78, 0x05, 0x81, 0x00, 0x0b, - 0x00, 0x2a, 0x40, 0x14, 0x08, 0x04, 0x05, 0x05, 0x00, 0x09, 0x00, 0x09, - 0x0d, 0x0c, 0x00, 0x09, 0x0a, 0x09, 0xe5, 0x59, 0x0a, 0xdc, 0x04, 0xdf, - 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x0e, 0x02, 0x15, - 0x23, 0x34, 0x12, 0x37, 0x21, 0x35, 0x21, 0x02, 0x78, 0x81, 0x6c, 0x35, - 0x85, 0x7c, 0xaa, 0xfe, 0x34, 0x02, 0x4d, 0x05, 0x1c, 0xc4, 0xdd, 0xd4, - 0x73, 0x9b, 0x01, 0x47, 0xfa, 0x71, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2d, - 0x02, 0x28, 0x02, 0x82, 0x05, 0x8e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x30, - 0x00, 0x5c, 0x40, 0x30, 0x2d, 0x20, 0x2a, 0x06, 0x24, 0x24, 0x11, 0x1d, - 0x00, 0x2a, 0x2a, 0x0c, 0x17, 0x1d, 0x17, 0x31, 0x32, 0x2d, 0x21, 0x09, - 0x0e, 0x09, 0x0e, 0xe4, 0x59, 0x0f, 0x09, 0x1f, 0x09, 0x02, 0x09, 0x03, - 0x09, 0x09, 0x1a, 0x27, 0x27, 0x03, 0xe4, 0x59, 0x27, 0xde, 0x1a, 0x14, - 0xe4, 0x59, 0x1a, 0xdd, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, - 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x13, 0x34, - 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x2e, 0x01, 0x35, 0x34, - 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x01, - 0xdf, 0x44, 0x45, 0x45, 0x43, 0x46, 0x43, 0x44, 0x44, 0x15, 0x9e, 0x4c, - 0x4f, 0x4e, 0x50, 0x51, 0x4a, 0x8e, 0x9a, 0x90, 0x8e, 0x9d, 0x5f, 0x4a, - 0x44, 0x51, 0x96, 0x7f, 0x82, 0x95, 0x52, 0x44, 0x52, 0x59, 0x04, 0xa9, - 0x46, 0x3b, 0x3e, 0x43, 0x46, 0x40, 0x3b, 0xfe, 0xd0, 0x90, 0x4c, 0x46, - 0x53, 0x4c, 0x4b, 0x48, 0x76, 0x82, 0x82, 0x75, 0x51, 0x72, 0x0c, 0x03, - 0x0f, 0x6c, 0x49, 0x62, 0x77, 0x76, 0x64, 0x49, 0x6c, 0x0d, 0x03, 0x0e, - 0x6d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x02, 0x07, 0x02, 0x83, - 0x04, 0x9d, 0x00, 0x15, 0x00, 0x62, 0x40, 0x17, 0x0d, 0x08, 0x08, 0x09, - 0x00, 0x15, 0x09, 0x15, 0x16, 0x17, 0x0d, 0x04, 0x11, 0x04, 0xe4, 0x59, - 0x09, 0x8b, 0x00, 0xfb, 0x00, 0x02, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x23, - 0x09, 0x0d, 0x48, 0x00, 0x11, 0x0b, 0x0b, 0x4b, 0x11, 0x5b, 0x11, 0x02, - 0x11, 0x40, 0x15, 0x19, 0x48, 0x11, 0x40, 0x10, 0x13, 0x48, 0x2f, 0x11, - 0x3f, 0x11, 0x02, 0x1b, 0x11, 0x01, 0x0f, 0x11, 0x01, 0x02, 0x11, 0x00, - 0x2f, 0x5f, 0x5d, 0x5d, 0x5d, 0x2b, 0x2b, 0x5d, 0x33, 0x2f, 0x10, 0xcc, - 0x2b, 0x5d, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x27, 0x33, 0x17, 0x33, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x02, 0x02, 0x36, 0x46, 0x48, 0x55, - 0x80, 0x04, 0x77, 0x06, 0x02, 0x23, 0x63, 0x4a, 0x6e, 0x61, 0x02, 0x07, - 0x01, 0x8e, 0x5a, 0x46, 0x64, 0x5e, 0xfe, 0x94, 0x01, 0xff, 0x8b, 0x6f, - 0x41, 0x3a, 0x6c, 0x79, 0xfe, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, - 0xff, 0x67, 0x03, 0x09, 0x02, 0x7e, 0x10, 0x07, 0x05, 0x63, 0x00, 0x02, - 0xfd, 0x8b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0x6a, 0x02, 0xc4, - 0x02, 0x81, 0x10, 0x07, 0x05, 0x69, 0xff, 0xfb, 0xfd, 0x8e, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x3b, 0xff, 0x69, 0x02, 0xcc, 0x02, 0x80, 0x10, 0x07, - 0x05, 0x72, 0x00, 0x00, 0xfd, 0x8d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, - 0xff, 0x78, 0x02, 0x9d, 0x02, 0x73, 0x10, 0x07, 0x03, 0x31, 0x01, 0x4e, - 0xfd, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0x69, 0x02, 0xc4, - 0x02, 0x80, 0x10, 0x07, 0x05, 0x6a, 0xff, 0xfb, 0xfd, 0x8d, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x67, 0x05, 0xd4, 0x00, 0x1e, - 0x00, 0x6c, 0x40, 0x3e, 0x05, 0x18, 0x0d, 0x11, 0x11, 0x08, 0x14, 0x00, - 0x1e, 0x0b, 0x12, 0x12, 0x13, 0x0f, 0x1e, 0x14, 0x18, 0x06, 0x1f, 0x20, - 0x09, 0x0c, 0x60, 0x59, 0x10, 0x15, 0x08, 0x15, 0x60, 0x59, 0x0d, 0x08, - 0x0f, 0x08, 0x4f, 0x08, 0xcf, 0x08, 0xff, 0x08, 0x04, 0x0b, 0x03, 0x09, - 0x08, 0x09, 0x08, 0x1b, 0x14, 0x1b, 0x02, 0x60, 0x59, 0x00, 0x1b, 0x04, - 0x14, 0x11, 0x60, 0x59, 0x14, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, 0x5e, - 0x5d, 0x11, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x11, - 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, - 0x26, 0x02, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x02, 0xd0, 0x2d, - 0xb3, 0x9d, 0x89, 0x8c, 0x99, 0x02, 0x5f, 0xfe, 0x55, 0x01, 0x84, 0xfe, - 0x7c, 0x01, 0xc4, 0xfd, 0x88, 0xf2, 0xef, 0xfe, 0xe9, 0x9c, 0xd0, 0x24, - 0x04, 0xac, 0x9b, 0xb1, 0xbc, 0xc4, 0xb8, 0x01, 0x01, 0xb5, 0x8b, 0xfe, - 0xd5, 0x8a, 0xfe, 0xb9, 0x8b, 0x01, 0xcf, 0x02, 0x01, 0x00, 0x01, 0x05, - 0xf9, 0x01, 0x05, 0x91, 0x83, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x68, - 0xff, 0x8f, 0x05, 0x79, 0x06, 0x08, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2e, - 0x00, 0x78, 0x40, 0x3c, 0x23, 0x09, 0x08, 0x08, 0x22, 0x00, 0x0e, 0x0d, - 0x0d, 0x1d, 0x1e, 0x00, 0x1e, 0x04, 0x12, 0x11, 0x11, 0x17, 0x18, 0x04, - 0x18, 0x2f, 0x30, 0x22, 0x1d, 0x1b, 0x40, 0x25, 0x2c, 0x2e, 0x03, 0x01, - 0x17, 0x17, 0x01, 0x1f, 0x1b, 0x1b, 0x15, 0x5f, 0x59, 0x1b, 0x13, 0x29, - 0x14, 0x0a, 0x12, 0x12, 0x0d, 0x09, 0x0a, 0x40, 0x0a, 0x2b, 0x5f, 0x59, - 0x0f, 0x07, 0x0a, 0x04, 0x00, 0x3f, 0x33, 0x33, 0x2b, 0x00, 0x1a, 0x18, - 0x10, 0xcd, 0x32, 0x33, 0x2f, 0x12, 0x39, 0x39, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x33, 0x33, 0x18, 0x2f, 0x12, 0x17, 0x39, 0x1a, 0x10, 0xce, 0x32, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x32, - 0x31, 0x30, 0x05, 0x37, 0x26, 0x02, 0x35, 0x10, 0x00, 0x25, 0x37, 0x33, - 0x07, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, 0x17, 0x07, 0x26, 0x27, 0x01, - 0x24, 0x13, 0x17, 0x06, 0x04, 0x2b, 0x01, 0x07, 0x23, 0x37, 0x26, 0x27, - 0x07, 0x03, 0x14, 0x17, 0x01, 0x06, 0x02, 0x01, 0x26, 0x27, 0x01, 0x16, - 0x17, 0x01, 0x30, 0x3d, 0x83, 0x82, 0x01, 0x4c, 0x01, 0x30, 0x21, 0x8e, - 0x22, 0x55, 0x48, 0x2a, 0x8e, 0x39, 0x98, 0x47, 0xb5, 0x1f, 0x3f, 0xfe, - 0xdf, 0x01, 0x13, 0x92, 0x9c, 0x57, 0xfe, 0xc5, 0xd0, 0x0c, 0x1a, 0x8e, - 0x1e, 0x53, 0x46, 0x2a, 0x94, 0x7d, 0x01, 0x0f, 0xbd, 0xcf, 0x02, 0xb7, - 0x45, 0x56, 0xfe, 0xd2, 0x40, 0x55, 0x71, 0xda, 0x61, 0x01, 0x38, 0xc5, - 0x01, 0x42, 0x01, 0x7b, 0x10, 0x74, 0x76, 0x08, 0x16, 0x94, 0xca, 0x59, - 0xac, 0x3c, 0x4e, 0x3d, 0xfc, 0x01, 0x0b, 0x01, 0x1a, 0x4e, 0xb6, 0xbe, - 0x5d, 0x6a, 0x0d, 0x1e, 0x95, 0x03, 0x38, 0xf9, 0x9a, 0x03, 0xbe, 0x1d, - 0xfe, 0xdc, 0x01, 0x24, 0x1d, 0x06, 0xfb, 0xd7, 0x29, 0x12, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x68, 0xff, 0xec, 0x05, 0x79, 0x05, 0x96, 0x00, 0x2c, - 0x00, 0x77, 0x40, 0x45, 0x2a, 0x29, 0x29, 0x0c, 0x19, 0x19, 0x07, 0x06, - 0x06, 0x13, 0x1c, 0x03, 0x23, 0x1c, 0x23, 0x2e, 0x2d, 0x10, 0x15, 0x5f, - 0x59, 0x09, 0x09, 0x10, 0x10, 0x1f, 0x26, 0x0f, 0x2a, 0x01, 0x0d, 0x03, - 0x2a, 0x2a, 0x26, 0x26, 0x00, 0x5f, 0x59, 0x26, 0x04, 0x06, 0x19, 0x1f, - 0x19, 0x5f, 0x59, 0x00, 0x1b, 0x10, 0x1b, 0x02, 0x30, 0x1b, 0x40, 0x1b, - 0x70, 0x1b, 0x80, 0x1b, 0xc0, 0x1b, 0xd0, 0x1b, 0x06, 0x1b, 0x1b, 0x1f, - 0x13, 0x00, 0x3f, 0x33, 0x2f, 0x5d, 0x71, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x12, - 0x39, 0x2f, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x32, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x22, 0x00, 0x11, 0x14, 0x12, 0x17, 0x11, 0x34, 0x27, 0x33, - 0x16, 0x15, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, - 0x06, 0x1d, 0x01, 0x24, 0x13, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, 0x02, - 0x35, 0x10, 0x00, 0x21, 0x32, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x03, 0x18, - 0xea, 0xfe, 0xfc, 0xba, 0xa8, 0x06, 0xaa, 0x08, 0x04, 0x2b, 0x70, 0x66, - 0x24, 0x25, 0x24, 0x3c, 0x70, 0x76, 0x01, 0x0e, 0x8f, 0x9c, 0x57, 0xfe, - 0xc5, 0xd0, 0xd5, 0xfe, 0xc9, 0xa3, 0x01, 0x6c, 0x01, 0x42, 0xe1, 0x01, - 0x2e, 0x47, 0xb5, 0x31, 0xd9, 0x04, 0xfa, 0xfe, 0xd3, 0xfe, 0xfa, 0xd3, - 0xfe, 0xd9, 0x30, 0x01, 0xb0, 0x72, 0x8a, 0xb8, 0x25, 0x8b, 0x66, 0x0a, - 0xa5, 0x0a, 0xc1, 0xb4, 0xb9, 0x0e, 0x01, 0x16, 0x4e, 0xb6, 0xbe, 0xb1, - 0x01, 0x49, 0xe1, 0x01, 0x51, 0x01, 0x7e, 0xb0, 0xad, 0x3c, 0x7b, 0x82, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x04, 0x2e, 0x05, 0x81, 0x00, 0x11, - 0x00, 0x70, 0x40, 0x40, 0x05, 0x01, 0x09, 0x09, 0x0e, 0x0c, 0x07, 0x03, - 0x0a, 0x10, 0x0a, 0x10, 0x12, 0x13, 0x08, 0x0c, 0x0d, 0x0c, 0x51, 0x59, - 0x05, 0x1f, 0x0d, 0x01, 0x00, 0x0d, 0x01, 0x08, 0x03, 0x0d, 0x01, 0x40, - 0x01, 0x04, 0x5f, 0x59, 0x0f, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x4f, 0x01, - 0x04, 0x0f, 0x01, 0x3f, 0x01, 0x02, 0x08, 0x03, 0x01, 0x01, 0x09, 0x0f, - 0x0f, 0x00, 0x5f, 0x59, 0x0f, 0x03, 0x09, 0x12, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x2b, 0x00, - 0x1a, 0x18, 0x10, 0xcc, 0x5f, 0x5e, 0x5d, 0x71, 0x32, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x32, 0x32, - 0x32, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x15, 0x21, 0x15, - 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, - 0x01, 0x67, 0x02, 0xaf, 0xfd, 0x51, 0x01, 0x92, 0xfe, 0x6e, 0xb4, 0xaf, - 0xaf, 0x03, 0x7b, 0x04, 0xe6, 0xfe, 0x24, 0x9d, 0xd5, 0x81, 0xfe, 0xe9, - 0x01, 0x17, 0x81, 0x03, 0xe9, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3a, - 0x00, 0x00, 0x04, 0x50, 0x05, 0x96, 0x00, 0x2d, 0x00, 0x98, 0x40, 0x56, - 0x2d, 0x24, 0x20, 0x00, 0x23, 0x1f, 0x26, 0x26, 0x10, 0x0c, 0x08, 0x18, - 0x17, 0x17, 0x2a, 0x00, 0x2a, 0x0f, 0x0b, 0x04, 0x04, 0x08, 0x00, 0x03, - 0x2f, 0x2e, 0x22, 0x0e, 0x0f, 0x0e, 0x51, 0x59, 0x26, 0x0a, 0x0b, 0x0a, - 0x51, 0x59, 0x23, 0xaf, 0x0b, 0x01, 0x00, 0x0b, 0x10, 0x0b, 0x20, 0x0b, - 0x03, 0x0b, 0x40, 0x1f, 0x0f, 0x0f, 0x1f, 0x0f, 0x2f, 0x0f, 0x03, 0x09, - 0x03, 0x0f, 0x0f, 0x04, 0x14, 0x14, 0x1b, 0x73, 0x59, 0x0f, 0x18, 0x01, - 0x0b, 0x05, 0x18, 0x14, 0x07, 0x05, 0x2a, 0x04, 0x2a, 0x74, 0x59, 0x2d, - 0x04, 0x18, 0x00, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, - 0x5f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x5f, 0x5e, - 0x5d, 0x33, 0x1a, 0xce, 0x5d, 0x5d, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, - 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x32, 0x31, 0x30, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x35, - 0x3e, 0x01, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, - 0x1d, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x14, 0x06, - 0x07, 0x21, 0x32, 0x37, 0x04, 0x50, 0x11, 0xb0, 0x90, 0xfd, 0x46, 0x59, - 0x56, 0xba, 0xba, 0xba, 0xba, 0xce, 0xc4, 0x93, 0xc8, 0x22, 0xae, 0x15, - 0x6f, 0x47, 0x72, 0x70, 0x01, 0x98, 0xfe, 0x68, 0x01, 0x98, 0xfe, 0x68, - 0x5c, 0x4d, 0x01, 0xe3, 0xae, 0x1d, 0x01, 0x37, 0x96, 0xa1, 0x9a, 0x2e, - 0xa0, 0x79, 0x19, 0x81, 0x8c, 0x81, 0x82, 0xc3, 0xc9, 0x79, 0x6d, 0x39, - 0x40, 0x4b, 0x73, 0x7d, 0x8a, 0x81, 0x8c, 0x81, 0x07, 0x77, 0xba, 0x29, - 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x88, 0xff, 0x38, 0x06, 0x23, - 0x05, 0x40, 0x00, 0x2e, 0x00, 0x63, 0x40, 0x35, 0x2e, 0x00, 0x00, 0x12, - 0x09, 0x09, 0x0d, 0x0a, 0x19, 0x2b, 0x2b, 0x01, 0x2c, 0x1a, 0x1b, 0x1b, - 0x23, 0x23, 0x22, 0x22, 0x1c, 0x2c, 0x0a, 0x04, 0x2f, 0x30, 0x1e, 0x27, - 0x50, 0x59, 0x1b, 0x40, 0x1e, 0x10, 0x2d, 0x12, 0x19, 0x03, 0x16, 0x0a, - 0x16, 0x05, 0x50, 0x59, 0x16, 0x10, 0x0e, 0x0f, 0x2b, 0x23, 0x00, 0x0a, - 0x15, 0x00, 0x3f, 0xce, 0x33, 0x33, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, - 0x17, 0x39, 0x18, 0x3f, 0x1a, 0xce, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x01, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, - 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x13, 0x33, - 0x07, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, - 0x22, 0x07, 0x03, 0x11, 0x23, 0x35, 0x03, 0x01, 0x7d, 0x01, 0x83, 0x56, - 0x70, 0x73, 0x86, 0xb3, 0x06, 0xaa, 0x01, 0x02, 0x03, 0x02, 0x03, 0x3a, - 0x96, 0x6c, 0x7b, 0x90, 0x1d, 0xdf, 0x9e, 0x7b, 0x2a, 0x1d, 0xa4, 0x95, - 0xb2, 0x56, 0x70, 0x2d, 0x24, 0xa8, 0xb2, 0xe1, 0xc8, 0x03, 0x07, 0x6f, - 0x9d, 0x78, 0xb0, 0xa0, 0xfd, 0x8d, 0x03, 0x53, 0xbd, 0x2a, 0x05, 0x2c, - 0x39, 0x4f, 0x73, 0x5a, 0x62, 0x6b, 0x01, 0xbf, 0xf7, 0x05, 0xb2, 0xcb, - 0xfd, 0x2f, 0x02, 0xae, 0x9d, 0x78, 0x0d, 0xfe, 0xad, 0xfd, 0x9d, 0xfd, - 0xfe, 0x3b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x19, 0x00, 0x00, 0x05, 0xae, - 0x05, 0x81, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x26, 0x00, 0x29, - 0x00, 0x92, 0x40, 0x4b, 0x1b, 0x17, 0x17, 0x29, 0x28, 0x27, 0x20, 0x14, - 0x14, 0x19, 0x01, 0x25, 0x1d, 0x05, 0x24, 0x24, 0x1f, 0x21, 0x03, 0x15, - 0x10, 0x0a, 0x0e, 0x0e, 0x26, 0x0c, 0x08, 0x10, 0x15, 0x10, 0x2a, 0x2b, - 0x25, 0x13, 0x0f, 0x17, 0x18, 0x17, 0x5f, 0x59, 0x20, 0x1c, 0x0c, 0x18, - 0x23, 0x1f, 0x0b, 0x1b, 0x00, 0x1b, 0x5f, 0x59, 0x27, 0x08, 0x04, 0x00, - 0x26, 0x15, 0x18, 0x29, 0x28, 0x18, 0x00, 0x28, 0x28, 0x00, 0x18, 0x03, - 0x02, 0x11, 0x15, 0x12, 0x06, 0x02, 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x33, - 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x11, 0x12, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x11, 0x33, 0x33, 0x33, 0x33, 0x32, - 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x33, 0x13, 0x21, 0x11, 0x33, - 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x01, 0x21, - 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x05, 0x21, 0x35, 0x21, - 0x05, 0x21, 0x27, 0x23, 0x01, 0x23, 0x13, 0x01, 0x33, 0x27, 0x19, 0x8f, - 0xde, 0xfb, 0x01, 0xf3, 0xac, 0x8e, 0x8e, 0x8e, 0x8e, 0xe6, 0xfe, 0xd9, - 0xfe, 0x3f, 0xaa, 0x8f, 0x8f, 0x8f, 0x03, 0x5c, 0x00, 0xff, 0xfe, 0x6f, - 0xfe, 0x6f, 0x01, 0x60, 0x91, 0xcf, 0x03, 0x22, 0x9d, 0xa9, 0xfc, 0xd0, - 0x6f, 0x77, 0x03, 0xf2, 0x01, 0x8f, 0xfe, 0x71, 0x01, 0x8f, 0xfe, 0x71, - 0x9b, 0xe7, 0x9b, 0xfe, 0x2b, 0x01, 0xd5, 0xfe, 0x2b, 0x01, 0xd5, 0x9b, - 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0x7e, 0xfe, 0xf4, 0x03, 0x29, 0xbe, - 0x00, 0x04, 0x00, 0x9e, 0xff, 0xec, 0x08, 0x67, 0x05, 0x81, 0x00, 0x0a, - 0x00, 0x11, 0x00, 0x27, 0x00, 0x4e, 0x01, 0x8b, 0x40, 0x26, 0x0f, 0x05, - 0x05, 0x06, 0x43, 0x42, 0x42, 0x28, 0x00, 0x0b, 0x20, 0x12, 0x3c, 0x1e, - 0x22, 0x22, 0x1b, 0x19, 0x17, 0x2f, 0x2e, 0x2e, 0x48, 0x3c, 0x3c, 0x17, - 0x0b, 0x03, 0x06, 0x34, 0x34, 0x28, 0x28, 0x06, 0x06, 0x50, 0x4f, 0x48, - 0xb8, 0xff, 0xf8, 0x40, 0xd7, 0x13, 0x16, 0x48, 0x34, 0x08, 0x13, 0x16, - 0x48, 0x48, 0x34, 0x3f, 0x2b, 0x2b, 0x32, 0x50, 0x59, 0x2f, 0x2b, 0x16, - 0x14, 0x25, 0x50, 0x59, 0x14, 0x16, 0x0f, 0x04, 0x5f, 0x59, 0x3f, 0x46, - 0x50, 0x59, 0x39, 0x43, 0x01, 0x03, 0x0f, 0x43, 0x1f, 0x43, 0x2f, 0x43, - 0x03, 0x0d, 0x06, 0x43, 0x3f, 0x3f, 0x1a, 0x21, 0x19, 0x1a, 0x19, 0x50, - 0x59, 0x1e, 0x1a, 0x1c, 0x1c, 0x1a, 0x3f, 0x0f, 0x01, 0x0f, 0x40, 0x09, - 0x11, 0x48, 0x0f, 0x1a, 0x1f, 0x1a, 0x02, 0x10, 0x03, 0x0f, 0x1a, 0x0f, - 0x1a, 0x06, 0x07, 0x07, 0x0e, 0x5f, 0x59, 0x07, 0x03, 0x06, 0x12, 0x40, - 0x50, 0x01, 0x30, 0x50, 0x01, 0x20, 0x50, 0x01, 0x10, 0x50, 0x01, 0x00, - 0x50, 0x01, 0xd0, 0x50, 0x01, 0xc0, 0x50, 0x01, 0xb0, 0x50, 0x01, 0xa0, - 0x50, 0x01, 0x90, 0x50, 0x01, 0x80, 0x50, 0x01, 0x70, 0x50, 0x01, 0x60, - 0x50, 0x01, 0x50, 0x50, 0x01, 0xf0, 0x50, 0x01, 0xe0, 0x50, 0x01, 0xd0, - 0x50, 0x01, 0xc0, 0x50, 0x01, 0xb0, 0x50, 0x01, 0x30, 0x50, 0x01, 0x20, - 0x50, 0x01, 0x10, 0x50, 0x01, 0x00, 0x50, 0x01, 0x3b, 0xe0, 0x50, 0x01, - 0xd0, 0x50, 0x01, 0xc0, 0x50, 0x01, 0xb0, 0x50, 0x01, 0xa0, 0x50, 0x01, - 0x90, 0x50, 0x01, 0x80, 0x50, 0x01, 0x70, 0x50, 0x01, 0x60, 0x50, 0x01, - 0x50, 0x50, 0x01, 0x40, 0x50, 0x01, 0x8f, 0x50, 0x01, 0x7f, 0x50, 0x01, - 0x6f, 0x50, 0x01, 0x30, 0x50, 0x01, 0x20, 0x50, 0x01, 0x10, 0x50, 0x01, - 0x00, 0x50, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x00, - 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x5f, - 0x5e, 0x5d, 0x2b, 0x5d, 0x11, 0x33, 0x2f, 0x11, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x33, 0x18, 0x2f, 0x33, 0x5f, 0x5e, 0x5d, 0x5f, 0x5d, 0x2b, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, - 0x00, 0x39, 0x39, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x11, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x04, 0x2b, 0x01, - 0x11, 0x23, 0x11, 0x21, 0x32, 0x04, 0x07, 0x10, 0x21, 0x23, 0x11, 0x33, - 0x20, 0x01, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x37, - 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x25, - 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x35, - 0x34, 0x2e, 0x01, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x02, - 0x03, 0xba, 0xfe, 0xfb, 0xe0, 0x82, 0xb5, 0x01, 0x2b, 0xed, 0x01, 0x04, - 0xb6, 0xfe, 0xb8, 0x69, 0x71, 0x01, 0x40, 0x02, 0x7b, 0x4c, 0x51, 0x69, - 0x5d, 0x68, 0x6f, 0x35, 0x6e, 0x9d, 0x9d, 0x29, 0x37, 0x1c, 0x3d, 0x02, - 0xe8, 0xb7, 0xaa, 0xa1, 0xaf, 0x1c, 0x9f, 0x11, 0x63, 0x58, 0xb8, 0x24, - 0x47, 0x80, 0x6d, 0x68, 0x38, 0xa8, 0xa1, 0x8d, 0xa5, 0x16, 0xa1, 0x0a, - 0x56, 0x46, 0x9b, 0x57, 0x82, 0x72, 0x6c, 0x3c, 0x03, 0xd9, 0xc8, 0xec, - 0xfd, 0xdb, 0x05, 0x81, 0xde, 0xcc, 0x01, 0x11, 0xfd, 0xd4, 0xfd, 0x4c, - 0x18, 0x7b, 0x7a, 0x01, 0xc5, 0x83, 0xf2, 0xf2, 0x83, 0xfe, 0x62, 0x4e, - 0x49, 0x0e, 0x62, 0x78, 0x81, 0x6e, 0x78, 0x1a, 0x3d, 0x3a, 0x69, 0x1f, - 0x2a, 0x1f, 0x20, 0x1b, 0x3b, 0x57, 0x3e, 0x70, 0x77, 0x69, 0x74, 0x11, - 0x30, 0x34, 0x55, 0x26, 0x37, 0x1d, 0x1a, 0x3c, 0x5d, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa8, 0xff, 0xec, 0x09, 0x07, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x00, 0x56, 0x05, 0x51, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x07, 0x7c, 0x05, 0x81, 0x00, 0x1f, - 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x34, - 0x00, 0x80, 0x40, 0x41, 0x2e, 0x32, 0x31, 0x03, 0x16, 0x1e, 0x1f, 0x1f, - 0x01, 0x06, 0x17, 0x16, 0x16, 0x14, 0x10, 0x06, 0x10, 0x36, 0x35, 0x2b, - 0x27, 0x23, 0x03, 0x13, 0x14, 0x13, 0x5f, 0x59, 0x34, 0x1d, 0x18, 0x01, - 0x14, 0x30, 0x2c, 0x0a, 0x07, 0x0f, 0x10, 0x0f, 0x5f, 0x59, 0x28, 0x24, - 0x20, 0x05, 0x10, 0x32, 0x17, 0x14, 0x31, 0x2e, 0x10, 0x14, 0x10, 0x14, - 0x10, 0x0d, 0x1e, 0x1b, 0x17, 0x03, 0x09, 0x0d, 0x12, 0x00, 0x3f, 0x33, - 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0x11, - 0x12, 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x33, - 0x15, 0x23, 0x07, 0x33, 0x15, 0x21, 0x03, 0x23, 0x03, 0x21, 0x03, 0x23, - 0x03, 0x21, 0x35, 0x33, 0x27, 0x23, 0x35, 0x33, 0x03, 0x33, 0x13, 0x21, - 0x13, 0x33, 0x13, 0x21, 0x13, 0x33, 0x01, 0x33, 0x37, 0x21, 0x05, 0x33, - 0x37, 0x21, 0x05, 0x21, 0x27, 0x23, 0x01, 0x23, 0x13, 0x01, 0x23, 0x13, - 0x01, 0x07, 0x33, 0x07, 0x09, 0x6d, 0x9a, 0x42, 0xdc, 0xfe, 0xf8, 0x87, - 0xe4, 0x80, 0xfe, 0x8a, 0x81, 0xe4, 0x87, 0xfe, 0xf8, 0xdb, 0x42, 0x99, - 0x6d, 0x73, 0xc7, 0x6c, 0x01, 0xb7, 0x70, 0xb7, 0x6f, 0x01, 0xb7, 0x6b, - 0xc7, 0xfd, 0x83, 0xe4, 0x3e, 0xfe, 0x9e, 0xfc, 0xf0, 0xe3, 0x40, 0xfe, - 0x9e, 0x01, 0xc7, 0x01, 0x21, 0x3e, 0xa3, 0x02, 0x43, 0x90, 0x47, 0xfc, - 0xf6, 0x8e, 0x47, 0x01, 0xa9, 0x2f, 0x5d, 0x03, 0xf2, 0x9b, 0xe6, 0x9b, - 0xfe, 0x2a, 0x01, 0xd6, 0xfe, 0x2a, 0x01, 0xd6, 0x9b, 0xe6, 0x9b, 0x01, - 0x8f, 0xfe, 0x71, 0x01, 0x8f, 0xfe, 0x71, 0x01, 0x8f, 0xfc, 0xf0, 0xe6, - 0xe6, 0xe6, 0xe6, 0xe6, 0xfe, 0x7f, 0xfe, 0xd2, 0x01, 0x2e, 0xfe, 0xd2, - 0x04, 0x0d, 0xc3, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x17, - 0x04, 0xcb, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x5d, 0x40, 0x17, 0x13, 0x10, - 0x05, 0x06, 0x10, 0x06, 0x1b, 0x0d, 0x0e, 0x0e, 0x20, 0x18, 0x1b, 0x1b, - 0x21, 0x11, 0x11, 0x0f, 0x06, 0x06, 0x10, 0x0f, 0x19, 0x41, 0x0f, 0x01, - 0x39, 0x00, 0x0e, 0x01, 0x3a, 0x00, 0x0f, 0x00, 0x0c, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x0f, 0x01, 0x39, 0x00, 0x10, 0x00, 0x13, 0x01, 0x40, 0x00, - 0x59, 0x00, 0x10, 0x01, 0x3a, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x3f, 0x11, 0x12, 0x39, 0x2f, 0x11, 0x39, 0x2f, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x11, 0x23, - 0x35, 0x34, 0x2e, 0x01, 0x23, 0x21, 0x11, 0x23, 0x11, 0x01, 0x11, 0x33, - 0x11, 0x21, 0x32, 0x3e, 0x01, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x01, - 0x23, 0x02, 0xc1, 0xad, 0xc0, 0x59, 0xb8, 0x31, 0x72, 0x70, 0xfe, 0xb1, - 0xb9, 0x01, 0x8e, 0xb8, 0x01, 0x54, 0x6f, 0x71, 0x30, 0xb9, 0x5b, 0xc1, - 0xab, 0x04, 0xcb, 0x6a, 0xe9, 0xca, 0xfe, 0xf8, 0xfc, 0x99, 0x9f, 0x47, - 0xfb, 0xdf, 0x04, 0xcb, 0xfb, 0x35, 0x02, 0xd9, 0xfd, 0xd1, 0x47, 0xa3, - 0x95, 0x02, 0xa2, 0xfd, 0x52, 0xcb, 0xea, 0x68, 0x00, 0x03, 0x00, 0xa1, - 0x00, 0xe9, 0x03, 0x7e, 0x05, 0xcc, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x2d, - 0x00, 0x67, 0x40, 0x1a, 0x1e, 0x05, 0x05, 0x2d, 0x11, 0x0e, 0x24, 0x24, - 0x14, 0x18, 0x18, 0x2c, 0x2d, 0x2c, 0x2e, 0x2f, 0x27, 0x08, 0x17, 0x0f, - 0x0f, 0x14, 0x10, 0x00, 0x0d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x0b, - 0x12, 0x48, 0x20, 0x10, 0x01, 0x08, 0x10, 0x08, 0x10, 0x12, 0x21, 0x1a, - 0x03, 0x40, 0x09, 0x0f, 0x48, 0x03, 0x2a, 0x50, 0x2d, 0x01, 0x2d, 0x12, - 0x00, 0x00, 0x3f, 0x2f, 0x5d, 0x33, 0xcc, 0x2b, 0x32, 0x32, 0x11, 0x39, - 0x39, 0x2f, 0x2f, 0x5d, 0x2b, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x0e, 0x01, - 0x23, 0x20, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x27, 0x35, - 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x17, - 0x23, 0x26, 0x35, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x03, 0x21, 0x15, 0x21, 0x02, 0xa4, 0x23, 0x6c, 0x56, - 0xfe, 0xe2, 0x95, 0x8c, 0x56, 0x69, 0x23, 0x01, 0x01, 0x78, 0x78, 0x7e, - 0x5c, 0x5c, 0x04, 0x78, 0x07, 0xfe, 0x7f, 0x50, 0x62, 0x6f, 0x5d, 0x5c, - 0x6f, 0x62, 0x51, 0x82, 0x02, 0xce, 0xfd, 0x32, 0x02, 0x37, 0x49, 0x3f, - 0x01, 0x7b, 0xc1, 0xc2, 0x3f, 0x45, 0x36, 0xaa, 0x5c, 0x67, 0x67, 0x5c, - 0xfd, 0x50, 0x64, 0x38, 0x19, 0x61, 0xf7, 0x99, 0x85, 0x90, 0x97, 0x91, - 0x87, 0x89, 0xfd, 0x80, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, - 0xff, 0xec, 0x04, 0x56, 0x05, 0x96, 0x00, 0x2b, 0x00, 0xaa, 0x40, 0x69, - 0x20, 0x27, 0x27, 0x04, 0x29, 0x1f, 0x24, 0x24, 0x0e, 0x10, 0x0b, 0x0b, - 0x12, 0x0a, 0x0e, 0x19, 0x18, 0x18, 0x03, 0x04, 0x0e, 0x04, 0x2c, 0x2d, - 0x22, 0x10, 0x11, 0x10, 0x51, 0x59, 0x29, 0x0b, 0x0c, 0x0b, 0x51, 0x59, - 0x26, 0x0f, 0x0c, 0x1f, 0x0c, 0x7f, 0x0c, 0x8f, 0x0c, 0x9f, 0x0c, 0x05, - 0x0c, 0x40, 0x27, 0x2f, 0x48, 0x00, 0x0c, 0x10, 0x0c, 0x80, 0x0c, 0x03, - 0x09, 0x0c, 0x40, 0x1f, 0x0f, 0x11, 0x1f, 0x11, 0x5f, 0x11, 0x03, 0x0f, - 0x11, 0x1f, 0x11, 0x8f, 0x11, 0xaf, 0x11, 0x04, 0x0f, 0x11, 0x8f, 0x11, - 0x02, 0x0b, 0x03, 0x11, 0x11, 0x00, 0x15, 0x15, 0x1c, 0x73, 0x59, 0x19, - 0x15, 0x07, 0x07, 0x00, 0x73, 0x59, 0x03, 0x07, 0x19, 0x00, 0x3f, 0x33, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x71, 0x72, 0x33, 0x1a, 0xcc, 0x5e, 0x5d, 0x2b, 0x71, - 0x32, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x25, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x03, 0x23, - 0x37, 0x33, 0x27, 0x37, 0x23, 0x37, 0x33, 0x12, 0x36, 0x33, 0x32, 0x16, - 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x21, 0x07, 0x21, 0x06, - 0x15, 0x14, 0x17, 0x21, 0x07, 0x21, 0x1e, 0x01, 0x02, 0xb3, 0x64, 0x78, - 0x0e, 0xb9, 0x1e, 0xdb, 0xae, 0xd9, 0xfd, 0x1e, 0xab, 0x28, 0x78, 0x03, - 0x03, 0xa0, 0x28, 0x81, 0x20, 0xf8, 0xdb, 0xaf, 0xdb, 0x1d, 0xb9, 0x0e, - 0x79, 0x6a, 0x8e, 0x97, 0x15, 0x01, 0xbe, 0x28, 0xfe, 0x63, 0x03, 0x04, - 0x01, 0xc4, 0x28, 0xfe, 0x6c, 0x16, 0xa2, 0x7e, 0x64, 0x5b, 0x0e, 0x9b, - 0xa8, 0x01, 0x06, 0x01, 0x04, 0x81, 0x4e, 0x56, 0x7f, 0x01, 0x01, 0xfb, - 0xa9, 0x9a, 0x0e, 0x5b, 0x64, 0xae, 0xbc, 0x7f, 0x18, 0x3e, 0x28, 0x26, - 0x81, 0xc3, 0xb5, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x3f, - 0x05, 0x81, 0x00, 0x14, 0x00, 0x52, 0x40, 0x29, 0x0e, 0x08, 0x0b, 0x03, - 0x03, 0x06, 0x07, 0x07, 0x0d, 0x09, 0x0c, 0x03, 0x02, 0x02, 0x11, 0x00, - 0x12, 0x0c, 0x12, 0x16, 0x15, 0x0f, 0x0b, 0x14, 0x00, 0x14, 0x5f, 0x59, - 0x08, 0x04, 0x10, 0x12, 0x00, 0x00, 0x02, 0x0d, 0x12, 0x12, 0x06, 0x02, - 0x03, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x33, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x12, - 0x17, 0x39, 0x31, 0x30, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0x33, - 0x01, 0x21, 0x15, 0x21, 0x01, 0x23, 0x01, 0x23, 0x07, 0x11, 0x23, 0x11, - 0x23, 0x1f, 0x89, 0xbf, 0x6a, 0x02, 0x3d, 0xe1, 0xfd, 0xb7, 0x02, 0x90, - 0xfd, 0xc5, 0x02, 0x44, 0xed, 0xfd, 0xcc, 0x23, 0x94, 0xbf, 0x89, 0x03, - 0x2d, 0x02, 0x54, 0xfd, 0xac, 0x02, 0x54, 0xfd, 0xac, 0xa0, 0xfd, 0x73, - 0x02, 0x8d, 0x71, 0xfd, 0xe4, 0x02, 0x8d, 0x00, 0x00, 0x01, 0x00, 0x2e, - 0x00, 0x00, 0x04, 0xb4, 0x05, 0x81, 0x00, 0x17, 0x00, 0x4d, 0x40, 0x28, - 0x00, 0x13, 0x13, 0x0a, 0x05, 0x0e, 0x0e, 0x0a, 0x11, 0x0d, 0x0d, 0x0a, - 0x03, 0x07, 0x07, 0x09, 0x09, 0x0a, 0x15, 0x0a, 0x16, 0x03, 0x19, 0x18, - 0x00, 0x13, 0x15, 0x13, 0x5f, 0x59, 0x0c, 0x10, 0x06, 0x02, 0x04, 0x09, - 0x15, 0x03, 0x09, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x11, 0x25, 0x15, 0x05, 0x15, 0x25, 0x15, 0x05, - 0x11, 0x23, 0x11, 0x05, 0x35, 0x25, 0x35, 0x05, 0x35, 0x25, 0x11, 0x21, - 0x35, 0x21, 0x15, 0x02, 0xd0, 0x01, 0x47, 0xfe, 0xb9, 0x01, 0x47, 0xfe, - 0xb9, 0xbe, 0xfe, 0xb9, 0x01, 0x47, 0xfe, 0xb9, 0x01, 0x47, 0xfe, 0x1c, - 0x04, 0x86, 0x04, 0xe5, 0xfe, 0x9d, 0xac, 0x9f, 0xaa, 0xa5, 0xac, 0x9f, - 0xaa, 0xfe, 0x5d, 0x01, 0x40, 0xa9, 0x9a, 0xab, 0xa6, 0xa9, 0x9a, 0xab, - 0x01, 0xc7, 0x9c, 0x9c, 0x00, 0x05, 0x00, 0x29, 0xfe, 0x69, 0x07, 0xee, - 0x06, 0x73, 0x00, 0x12, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x55, 0x00, 0x5f, - 0x00, 0x95, 0x40, 0x53, 0x5b, 0x1d, 0x2a, 0x17, 0x56, 0x4d, 0x23, 0x31, - 0x33, 0x33, 0x27, 0x37, 0x53, 0x3b, 0x00, 0x00, 0x41, 0x53, 0x09, 0x27, - 0x23, 0x56, 0x1d, 0x08, 0x60, 0x61, 0x27, 0x47, 0x33, 0x47, 0x61, 0x59, - 0x17, 0x4d, 0x56, 0x23, 0x04, 0x20, 0x13, 0x20, 0x58, 0x61, 0x59, 0x05, - 0x10, 0x03, 0x10, 0x3e, 0x60, 0x59, 0x20, 0x10, 0x20, 0x10, 0x1a, 0x30, - 0x33, 0x40, 0x2d, 0x33, 0x2a, 0x2a, 0x33, 0x04, 0x1a, 0x5e, 0x61, 0x59, - 0x09, 0x1a, 0x12, 0x13, 0x4f, 0x60, 0x59, 0x13, 0x12, 0x03, 0x44, 0x60, - 0x59, 0x03, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0xc6, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2f, 0x11, 0x33, 0x1a, 0x10, - 0xcd, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x2b, - 0x11, 0x12, 0x00, 0x17, 0x39, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x27, 0x03, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x37, 0x13, 0x3e, 0x01, 0x33, - 0x32, 0x16, 0x01, 0x22, 0x2e, 0x01, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, - 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x1a, 0x01, 0x37, 0x0e, - 0x01, 0x07, 0x35, 0x36, 0x25, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x1e, - 0x01, 0x12, 0x15, 0x14, 0x02, 0x04, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x0e, 0x02, 0x07, 0x02, 0x07, - 0x16, 0x33, 0x32, 0x36, 0x12, 0x35, 0x34, 0x02, 0x01, 0x26, 0x23, 0x22, - 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x07, 0xee, 0xaf, 0x8e, 0x6c, 0x56, - 0x38, 0x26, 0x1e, 0xb3, 0x1b, 0x32, 0x09, 0x71, 0x24, 0x9b, 0x7e, 0x82, - 0xa8, 0xfb, 0x34, 0x44, 0x63, 0x6e, 0x3e, 0x26, 0x81, 0x4a, 0x58, 0x5d, - 0x64, 0x51, 0x26, 0x56, 0x1d, 0x20, 0x3b, 0x86, 0x5b, 0x7e, 0xec, 0x42, - 0xba, 0x01, 0x32, 0x26, 0x4f, 0x7f, 0x30, 0x4c, 0x4e, 0x9a, 0xe5, 0x79, - 0xa3, 0xfe, 0xf4, 0x03, 0x93, 0x55, 0x48, 0x4c, 0x5c, 0x58, 0x47, 0x49, - 0x5d, 0xfb, 0xff, 0x2c, 0x48, 0x3d, 0x34, 0x46, 0x32, 0x88, 0x8b, 0x77, - 0xc7, 0x76, 0xc2, 0xfd, 0x67, 0x40, 0x49, 0x2b, 0x3d, 0x39, 0x2d, 0x70, - 0x01, 0x36, 0x8e, 0xac, 0x4d, 0xfe, 0xfe, 0xa1, 0x3d, 0x39, 0x9e, 0x26, - 0x01, 0xc4, 0x95, 0x8a, 0x9a, 0xfe, 0x51, 0x1d, 0x3f, 0x37, 0x45, 0x4e, - 0x53, 0x51, 0x46, 0x58, 0x18, 0x12, 0xaf, 0x01, 0x6e, 0x01, 0xae, 0x74, - 0x07, 0x32, 0x24, 0x41, 0x5c, 0x02, 0x29, 0x59, 0x58, 0x1b, 0x4c, 0x73, - 0x04, 0xa8, 0xfe, 0xdf, 0xb8, 0xd7, 0xfe, 0x89, 0xc6, 0x01, 0x1e, 0x61, - 0x71, 0x74, 0x5e, 0x61, 0x74, 0x78, 0x04, 0x96, 0x4a, 0xbc, 0xd0, 0xec, - 0xfe, 0xb4, 0x79, 0x79, 0xc2, 0x01, 0x5f, 0xbd, 0xf8, 0x01, 0x2a, 0xfb, - 0x7b, 0x2a, 0x29, 0x31, 0x31, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, - 0xfe, 0x57, 0x04, 0x08, 0x05, 0xcc, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x4d, - 0x40, 0x2a, 0x22, 0x10, 0x05, 0x1a, 0x13, 0x2b, 0x02, 0x04, 0x00, 0x28, - 0x1c, 0x17, 0x18, 0x19, 0x1c, 0x05, 0x00, 0x06, 0x2f, 0x2e, 0x13, 0x2b, - 0x15, 0x18, 0x2b, 0x18, 0x1f, 0x16, 0x1f, 0x25, 0x60, 0x59, 0x1f, 0x05, - 0x14, 0x16, 0x12, 0x08, 0x0d, 0x60, 0x59, 0x08, 0x00, 0x2f, 0x2b, 0x00, - 0x18, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x12, 0x17, 0x39, - 0x11, 0x33, 0x32, 0x31, 0x30, 0x01, 0x14, 0x03, 0x13, 0x16, 0x15, 0x14, - 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, - 0x0b, 0x02, 0x07, 0x23, 0x01, 0x1b, 0x01, 0x02, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, - 0x3e, 0x01, 0x04, 0x08, 0xe8, 0xb3, 0x17, 0x9a, 0x8c, 0x48, 0x50, 0x53, - 0x45, 0x3e, 0x40, 0x12, 0x7a, 0xe1, 0xa9, 0x7f, 0xa8, 0x01, 0x26, 0xa3, - 0xad, 0xa4, 0x9d, 0x80, 0x7e, 0x96, 0xa6, 0x3e, 0x33, 0x30, 0x40, 0x35, - 0x29, 0x37, 0x4c, 0x04, 0xb6, 0xbc, 0xfe, 0x5c, 0xfd, 0x96, 0x4e, 0x40, - 0x7e, 0x89, 0x13, 0x9b, 0x22, 0x3c, 0x37, 0x33, 0x42, 0x01, 0xc1, 0xfe, - 0x5b, 0x01, 0x13, 0xfa, 0x02, 0x1e, 0xfe, 0xd6, 0x01, 0x44, 0x01, 0xec, - 0x90, 0x80, 0x98, 0x96, 0x72, 0x35, 0x46, 0x43, 0x38, 0x4e, 0xfe, 0x7e, - 0x81, 0xe8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x19, 0x00, 0x00, 0x05, 0x41, - 0x05, 0x81, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x25, 0x00, 0x2a, 0x00, 0xb2, - 0x40, 0x66, 0x1a, 0x01, 0x01, 0x1b, 0x1b, 0x00, 0x19, 0x03, 0x03, 0x00, - 0x27, 0x23, 0x23, 0x1c, 0x1f, 0x1f, 0x0a, 0x00, 0x10, 0x0c, 0x0c, 0x0a, - 0x26, 0x25, 0x1e, 0x09, 0x09, 0x12, 0x0e, 0x0a, 0x00, 0x0a, 0x2c, 0x2b, - 0x25, 0x08, 0x60, 0x59, 0x24, 0x04, 0xef, 0x0c, 0x01, 0x0c, 0x0d, 0x1e, - 0x01, 0x0d, 0x1d, 0x1a, 0xef, 0x10, 0x01, 0x10, 0x11, 0x40, 0x26, 0x17, - 0x11, 0x30, 0x25, 0x40, 0x25, 0x50, 0x25, 0x03, 0x30, 0x0d, 0x40, 0x0d, - 0x50, 0x0d, 0x03, 0x2f, 0x0d, 0x01, 0x00, 0x11, 0x10, 0x11, 0x20, 0x11, - 0x03, 0x09, 0x03, 0x25, 0x0d, 0x11, 0x11, 0x0d, 0x25, 0x03, 0x0a, 0x13, - 0x13, 0x2a, 0x5f, 0x59, 0x13, 0x03, 0x0a, 0x12, 0x00, 0x3f, 0x3f, 0x2b, - 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, 0x2f, 0x2f, 0x2f, 0x5f, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5d, 0x11, 0x33, 0x33, 0x1a, 0x10, 0xcd, 0x5d, 0x32, 0x32, - 0x11, 0x33, 0x33, 0x10, 0xcd, 0x5d, 0x32, 0x32, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x07, - 0x33, 0x15, 0x23, 0x0e, 0x01, 0x23, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, - 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, 0x32, 0x16, 0x17, 0x33, 0x15, - 0x23, 0x07, 0x27, 0x21, 0x15, 0x21, 0x36, 0x01, 0x32, 0x37, 0x21, 0x15, - 0x11, 0x21, 0x26, 0x23, 0x21, 0x04, 0xea, 0x03, 0x5a, 0x7d, 0x33, 0xe6, - 0xa6, 0xfe, 0x62, 0xbf, 0x8f, 0x8f, 0x8f, 0x8f, 0x02, 0x51, 0xb0, 0xf0, - 0x31, 0x77, 0x59, 0xbe, 0x03, 0xfd, 0x40, 0x02, 0xbf, 0x04, 0xfe, 0xc0, - 0xbb, 0x4e, 0xfd, 0x74, 0x02, 0x8b, 0x52, 0xbe, 0xfe, 0x85, 0x03, 0xd9, - 0x38, 0x85, 0x75, 0x82, 0xfd, 0xdb, 0x03, 0x1c, 0x85, 0x62, 0x85, 0xf9, - 0x7e, 0x7b, 0x85, 0x2c, 0x2c, 0x62, 0x1a, 0xfe, 0xfd, 0x64, 0x64, 0x01, - 0xd0, 0x63, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0x2c, 0x05, 0xa0, - 0x06, 0x23, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x69, 0x40, 0x38, 0x0a, 0x09, - 0x09, 0x11, 0x16, 0x0e, 0x06, 0x1a, 0x1a, 0x22, 0x03, 0x1b, 0x1f, 0x00, - 0x00, 0x1b, 0x13, 0x16, 0x04, 0x27, 0x26, 0x0e, 0x22, 0x1c, 0x22, 0x5f, - 0x59, 0x14, 0x13, 0x5f, 0x59, 0x16, 0x1c, 0x14, 0x14, 0x03, 0x1b, 0x40, - 0x19, 0x1c, 0x13, 0x06, 0x0d, 0x5f, 0x59, 0x0a, 0x0a, 0x06, 0x04, 0x03, - 0x23, 0x5f, 0x59, 0x04, 0x03, 0x04, 0x00, 0x3f, 0xcd, 0x2b, 0x00, 0x18, - 0x3f, 0x33, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x1a, 0xcd, 0x12, 0x39, - 0x2f, 0x12, 0x39, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x10, 0x00, 0x25, 0x35, 0x33, 0x15, - 0x16, 0x04, 0x17, 0x07, 0x2e, 0x01, 0x27, 0x11, 0x3e, 0x01, 0x37, 0x35, - 0x23, 0x35, 0x21, 0x11, 0x06, 0x04, 0x07, 0x15, 0x23, 0x35, 0x24, 0x00, - 0x13, 0x14, 0x12, 0x17, 0x11, 0x06, 0x02, 0x67, 0x01, 0x51, 0x01, 0x36, - 0x7c, 0xc7, 0x01, 0x05, 0x4b, 0xb6, 0x35, 0xad, 0x7f, 0x70, 0xcd, 0x49, - 0xf1, 0x01, 0xa1, 0x64, 0xfe, 0xdd, 0xaf, 0x7c, 0xfe, 0xcc, 0xfe, 0xad, - 0xc2, 0xf0, 0xd5, 0xdc, 0xe9, 0x02, 0xc7, 0x01, 0x48, 0x01, 0x76, 0x0f, - 0x8f, 0x8f, 0x0b, 0x9d, 0xa2, 0x36, 0x6a, 0x6c, 0x0d, 0xfb, 0x92, 0x08, - 0x4e, 0x44, 0xfe, 0xa0, 0xfe, 0x1a, 0x66, 0x7c, 0x0b, 0xc2, 0xc2, 0x13, - 0x01, 0x84, 0x01, 0x42, 0xf9, 0xfe, 0xcf, 0x13, 0x04, 0x6e, 0x0f, 0xfe, - 0xde, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 0x57, - 0x05, 0x81, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x70, 0x40, 0x3b, - 0x03, 0x02, 0x20, 0x0b, 0x08, 0x04, 0x20, 0x01, 0x15, 0x12, 0x07, 0x00, - 0x05, 0x00, 0x14, 0x14, 0x10, 0x11, 0x05, 0x09, 0x09, 0x0d, 0x0c, 0x11, - 0x0c, 0x23, 0x24, 0x10, 0x12, 0x19, 0x07, 0x17, 0x00, 0x17, 0x5f, 0x59, - 0x1c, 0x04, 0x00, 0x0f, 0x0b, 0x13, 0x14, 0x13, 0x5f, 0x59, 0x1a, 0x08, - 0x14, 0x20, 0x00, 0x14, 0x00, 0x14, 0x03, 0x0d, 0x12, 0x03, 0x03, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x39, 0x11, 0x33, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x33, 0x11, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x11, 0x21, 0x13, 0x33, 0x13, 0x21, 0x15, 0x21, 0x17, 0x33, - 0x15, 0x23, 0x13, 0x23, 0x03, 0x21, 0x03, 0x23, 0x13, 0x23, 0x35, 0x33, - 0x37, 0x29, 0x02, 0x07, 0x21, 0x01, 0x33, 0x26, 0x2f, 0x01, 0x07, 0x06, - 0x01, 0x81, 0xc2, 0xd9, 0xbe, 0x01, 0x7d, 0xfe, 0xbf, 0x5b, 0xe6, 0xaa, - 0xa5, 0xc3, 0xa1, 0xfd, 0x7e, 0xa2, 0xc6, 0xa8, 0xac, 0xe9, 0x5c, 0xfe, - 0xbb, 0x03, 0x5d, 0xfe, 0xa0, 0x57, 0x02, 0x0f, 0xfe, 0x82, 0xec, 0x45, - 0x16, 0x1b, 0x09, 0x21, 0x03, 0xa7, 0x01, 0xda, 0xfe, 0x26, 0x95, 0xe1, - 0x95, 0xfe, 0x64, 0x01, 0x9c, 0xfe, 0x64, 0x01, 0x9c, 0x95, 0xe1, 0xe1, - 0x01, 0x76, 0xb3, 0x44, 0x53, 0x1c, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x0f, - 0xff, 0xec, 0x04, 0x65, 0x05, 0xd6, 0x00, 0x35, 0x00, 0x81, 0x40, 0x43, - 0x2e, 0x35, 0x35, 0x09, 0x0a, 0x1d, 0x14, 0x34, 0x18, 0x2f, 0x04, 0x2a, - 0x23, 0x24, 0x19, 0x13, 0x13, 0x03, 0x0f, 0x0f, 0x24, 0x2a, 0x0a, 0x04, - 0x37, 0x36, 0x23, 0x23, 0x2c, 0x27, 0x2c, 0x1a, 0x2f, 0x19, 0x1a, 0x19, - 0x5f, 0x59, 0x09, 0x09, 0x01, 0x0c, 0x01, 0x12, 0x13, 0x12, 0x5f, 0x59, - 0x34, 0x13, 0x1a, 0x13, 0x1a, 0x13, 0x27, 0x0c, 0x27, 0x20, 0x60, 0x59, - 0x27, 0x0c, 0x06, 0x60, 0x59, 0x0c, 0x13, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, 0x2f, 0x11, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x18, 0x2f, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x32, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x02, 0x21, 0x22, 0x24, 0x35, 0x34, - 0x37, 0x23, 0x35, 0x33, 0x3e, 0x01, 0x3f, 0x01, 0x21, 0x35, 0x21, 0x36, - 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, - 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x23, 0x0e, 0x01, 0x07, 0x06, 0x07, - 0x21, 0x04, 0x59, 0xfc, 0xb4, 0x0e, 0xa3, 0x86, 0x85, 0xa2, 0x17, 0xab, - 0x44, 0xfe, 0x59, 0xde, 0xff, 0x00, 0x06, 0x3f, 0x75, 0x27, 0x96, 0xa4, - 0x45, 0xfd, 0xe5, 0x03, 0x0a, 0x12, 0x89, 0x7a, 0x6f, 0x87, 0x13, 0xb6, - 0x28, 0xd1, 0xc1, 0xd3, 0xef, 0x09, 0x89, 0xce, 0x28, 0x84, 0x99, 0x70, - 0x47, 0x02, 0xbe, 0x01, 0xe4, 0x28, 0x44, 0x79, 0x8b, 0x85, 0x7e, 0x25, - 0xfe, 0x9a, 0xdf, 0xc1, 0x2f, 0x29, 0x95, 0x3f, 0x5c, 0x31, 0x15, 0x95, - 0x2b, 0x41, 0x70, 0x7e, 0x78, 0x6d, 0x21, 0xb3, 0x9e, 0xcd, 0xc0, 0x2d, - 0x2d, 0x95, 0x2f, 0x47, 0x2a, 0x1f, 0x22, 0x00, 0x00, 0x02, 0x00, 0x68, - 0xff, 0x2c, 0x05, 0x79, 0x06, 0x20, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x5e, - 0x40, 0x30, 0x0b, 0x13, 0x10, 0x09, 0x17, 0x17, 0x1c, 0x06, 0x18, 0x19, - 0x03, 0x03, 0x18, 0x13, 0x03, 0x21, 0x20, 0x0f, 0x1d, 0x06, 0x1d, 0x5f, - 0x59, 0x0c, 0x0c, 0x09, 0x07, 0x40, 0x06, 0x04, 0x00, 0x1c, 0x5f, 0x59, - 0x18, 0x00, 0x40, 0x16, 0x00, 0x12, 0x12, 0x00, 0x00, 0x10, 0x5f, 0x59, - 0x00, 0x13, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x33, - 0x1a, 0x10, 0xcd, 0x2b, 0x00, 0x18, 0x3f, 0x1a, 0xcd, 0x33, 0x33, 0x2f, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x24, - 0x00, 0x11, 0x10, 0x00, 0x25, 0x35, 0x33, 0x15, 0x04, 0x13, 0x07, 0x2e, - 0x01, 0x27, 0x11, 0x24, 0x13, 0x17, 0x06, 0x04, 0x07, 0x15, 0x23, 0x01, - 0x14, 0x12, 0x17, 0x11, 0x06, 0x02, 0x02, 0xce, 0xfe, 0xdd, 0xfe, 0xbd, - 0x01, 0x46, 0x01, 0x20, 0x7c, 0x01, 0x9b, 0x87, 0xb5, 0x2b, 0xbe, 0x84, - 0x01, 0x07, 0x8c, 0x9c, 0x52, 0xfe, 0xe2, 0xbf, 0x7c, 0xfe, 0x5c, 0xe3, - 0xc1, 0xc7, 0xdd, 0x11, 0x17, 0x01, 0x82, 0x01, 0x3f, 0x01, 0x3e, 0x01, - 0x79, 0x15, 0x8d, 0x8c, 0x14, 0xfe, 0xb9, 0x3c, 0x6e, 0x83, 0x0a, 0xfb, - 0x92, 0x16, 0x01, 0x0e, 0x4e, 0xab, 0xbc, 0x0b, 0xc2, 0x03, 0x9b, 0xeb, - 0xfe, 0xce, 0x1b, 0x04, 0x67, 0x17, 0xfe, 0xdb, 0xff, 0xff, 0xfe, 0x9b, - 0x03, 0xd1, 0x01, 0x77, 0x06, 0xa0, 0x10, 0x07, 0x00, 0x0d, 0xfe, 0x7a, - 0x01, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x45, 0xff, 0xf4, 0x06, 0xd0, - 0x05, 0x8c, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x34, 0x00, 0x78, - 0x40, 0x48, 0x0e, 0x0f, 0x0c, 0x0d, 0x2f, 0x2e, 0x2e, 0x21, 0x22, 0x28, - 0x22, 0xb2, 0x5b, 0x1c, 0x28, 0x16, 0x06, 0x00, 0x06, 0xb2, 0x5b, 0x10, - 0x00, 0x00, 0x0f, 0x0d, 0x22, 0x06, 0x28, 0x06, 0x36, 0x35, 0x00, 0x21, - 0x01, 0x0b, 0x05, 0x21, 0x25, 0x25, 0x1e, 0xb6, 0x59, 0x2b, 0x25, 0xb8, - 0x5b, 0x2b, 0x32, 0xb6, 0x59, 0x2f, 0x2b, 0x04, 0x0f, 0x03, 0x0c, 0x12, - 0x09, 0x13, 0xb6, 0x59, 0x03, 0x09, 0xb8, 0x5b, 0x03, 0x19, 0xb6, 0x59, - 0x03, 0x13, 0x00, 0x3f, 0x2b, 0x2b, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x3f, - 0x33, 0x2b, 0x2b, 0x2b, 0x11, 0x00, 0x33, 0x5f, 0x5e, 0x5d, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x01, 0x23, 0x01, 0x33, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x01, 0x10, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, - 0x2e, 0x01, 0x23, 0x22, 0x06, 0x06, 0xd0, 0xa2, 0x9e, 0x9c, 0x9f, 0x99, - 0xa6, 0xa4, 0x98, 0xfb, 0x3b, 0x9b, 0x03, 0x9a, 0x9d, 0x95, 0x4d, 0x5b, - 0x5b, 0x51, 0x4f, 0x5b, 0x58, 0x52, 0xfa, 0x9b, 0xc4, 0x45, 0x5e, 0x0b, - 0x8d, 0x0e, 0xa6, 0x83, 0xa9, 0xb1, 0xb0, 0xa9, 0x7e, 0xa2, 0x13, 0x8f, - 0x0a, 0x53, 0x4b, 0x6c, 0x57, 0x01, 0xb2, 0xd7, 0xe7, 0xe1, 0xdd, 0xe4, - 0xdf, 0xe5, 0xfd, 0x70, 0x05, 0x81, 0xfc, 0x31, 0xb3, 0xa1, 0x9e, 0xb6, - 0xab, 0xa5, 0xa7, 0x02, 0xc6, 0xfe, 0xad, 0x52, 0x57, 0x09, 0x7a, 0x98, - 0xe8, 0xda, 0xd7, 0xe9, 0x8d, 0x76, 0x0b, 0x48, 0x55, 0xa4, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x13, 0xff, 0xec, 0x02, 0x7e, 0x05, 0x95, 0x00, 0x1c, - 0x00, 0x26, 0x00, 0x4b, 0x40, 0x26, 0x24, 0x1a, 0x1a, 0x0f, 0x0c, 0x09, - 0x1d, 0x16, 0x16, 0x02, 0x03, 0x09, 0x03, 0x27, 0x28, 0x4f, 0x28, 0x01, - 0x0a, 0x19, 0x24, 0x0f, 0x24, 0x0f, 0x24, 0x1f, 0x24, 0x02, 0x02, 0x24, - 0x02, 0x24, 0x06, 0x20, 0x13, 0x07, 0x00, 0x06, 0x00, 0x2f, 0xcd, 0x3f, - 0xcd, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x11, 0x33, 0x10, 0xcd, 0x32, - 0x01, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x32, 0x37, 0x33, 0x0e, - 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x06, 0x07, 0x35, 0x36, 0x37, 0x11, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x02, 0x07, 0x15, 0x14, 0x16, - 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x36, 0x12, 0x01, 0xb1, - 0x67, 0x21, 0x45, 0x14, 0x78, 0x6d, 0x6f, 0x7f, 0x33, 0x51, 0x4f, 0x35, - 0x83, 0x7b, 0x65, 0x6e, 0xa1, 0x8a, 0x40, 0x90, 0x38, 0x33, 0x33, 0x32, - 0x5f, 0x71, 0x4e, 0xd5, 0x9a, 0x9d, 0x9f, 0x9b, 0xaf, 0x1b, 0x1f, 0x49, - 0x1f, 0x1c, 0x02, 0x4b, 0x92, 0x99, 0x9c, 0x90, 0xbe, 0xfe, 0xc2, 0x4f, - 0xf4, 0x66, 0x76, 0x04, 0x14, 0x6a, 0x7d, 0x69, 0x77, 0xfe, 0x05, 0x40, - 0x01, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x00, 0xbc, 0x00, 0x00, 0x08, 0x2e, - 0x05, 0x81, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x23, 0x00, 0x27, 0x00, 0x56, - 0x40, 0x2e, 0x26, 0x18, 0x0d, 0x25, 0x1e, 0x13, 0x0c, 0x00, 0x09, 0x06, - 0x01, 0x03, 0x03, 0x04, 0x04, 0x09, 0x13, 0x0d, 0x04, 0x29, 0x28, 0x2f, - 0x29, 0x01, 0x1b, 0x16, 0x0f, 0x0a, 0x01, 0x05, 0x03, 0x21, 0x0f, 0x10, - 0x1f, 0x10, 0x02, 0x10, 0x10, 0x25, 0x24, 0x24, 0x07, 0x00, 0x04, 0x12, - 0x00, 0x3f, 0x33, 0x33, 0x33, 0x2f, 0x33, 0x33, 0x2f, 0x5d, 0x33, 0x3f, - 0x33, 0x33, 0x3f, 0x33, 0x01, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, - 0x31, 0x30, 0x21, 0x01, 0x17, 0x11, 0x23, 0x11, 0x33, 0x01, 0x26, 0x35, - 0x11, 0x33, 0x11, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x20, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x36, 0x01, 0x35, 0x21, 0x15, 0x04, 0x26, 0xfd, 0x30, 0x06, 0xa0, - 0xca, 0x02, 0xd8, 0x08, 0xa2, 0x03, 0x36, 0xb0, 0xaf, 0xa8, 0xb1, 0xb2, - 0xab, 0x01, 0x5b, 0x9f, 0x54, 0x65, 0x66, 0x58, 0x57, 0x5f, 0x67, 0x5a, - 0xfe, 0x10, 0x02, 0x7b, 0x04, 0xa6, 0xfe, 0xfc, 0x58, 0x05, 0x81, 0xfb, - 0x52, 0xa0, 0x72, 0x03, 0x9c, 0xfa, 0x7f, 0x02, 0xb2, 0xbc, 0xcb, 0xc9, - 0xbe, 0xbd, 0xc9, 0xfe, 0x7a, 0x93, 0x83, 0x85, 0x91, 0x91, 0x86, 0x7f, - 0xfd, 0xe6, 0x92, 0x92, 0x00, 0x04, 0x00, 0x1f, 0xff, 0xf0, 0x05, 0xc5, - 0x05, 0x96, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x23, 0x00, 0x33, 0x00, 0x55, - 0x40, 0x2c, 0x24, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x10, 0x01, 0x10, 0x14, - 0x2c, 0x1c, 0x14, 0x1c, 0x35, 0x34, 0x20, 0x28, 0xc8, 0x59, 0x20, 0x04, - 0x0c, 0x0a, 0xc9, 0x59, 0x01, 0x0c, 0x01, 0x0c, 0x18, 0x02, 0x18, 0x30, - 0xc8, 0x59, 0x18, 0x13, 0x02, 0x0b, 0xc9, 0x59, 0x02, 0x10, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x18, 0x2f, - 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x32, 0x31, - 0x30, 0x01, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, - 0x19, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x14, 0x02, - 0x04, 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, - 0x12, 0x07, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x15, 0x14, 0x12, - 0x04, 0x33, 0x32, 0x24, 0x12, 0x02, 0x6f, 0x87, 0x01, 0x5a, 0x84, 0xa9, - 0xa2, 0x8b, 0xd3, 0xca, 0x50, 0x58, 0x57, 0x51, 0x02, 0x8c, 0xc1, 0xfe, - 0xaf, 0xc1, 0xc5, 0xfe, 0xad, 0xbb, 0xc2, 0x01, 0x50, 0xc1, 0xc2, 0x01, - 0x51, 0xc0, 0x5c, 0xa8, 0xfe, 0xdb, 0xaa, 0xa8, 0xfe, 0xdc, 0xa8, 0xa9, - 0x01, 0x22, 0xa9, 0xa9, 0x01, 0x26, 0xa8, 0x01, 0x27, 0x03, 0x2b, 0x84, - 0x71, 0x75, 0x87, 0x01, 0x8a, 0xfe, 0xdc, 0x4c, 0x48, 0x46, 0x4a, 0xfe, - 0xd8, 0xc1, 0xfe, 0xaf, 0xc1, 0xc9, 0x01, 0x4d, 0xbd, 0xc1, 0x01, 0x50, - 0xc2, 0xc3, 0xfe, 0xb2, 0xc2, 0xa9, 0x01, 0x21, 0xaa, 0xa9, 0xfe, 0xdc, - 0xa7, 0xa9, 0xfe, 0xdc, 0xa8, 0xa8, 0x01, 0x24, 0x00, 0x02, 0x00, 0xbc, - 0x02, 0x7a, 0x07, 0x19, 0x05, 0x81, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x4f, - 0x40, 0x2b, 0x15, 0x16, 0x0d, 0x0a, 0x0a, 0x0b, 0x11, 0x00, 0x00, 0x13, - 0x13, 0x0b, 0x16, 0x03, 0x1c, 0x1d, 0x14, 0x18, 0x19, 0x18, 0xca, 0x59, - 0x0f, 0x0b, 0x05, 0x00, 0x00, 0x16, 0x20, 0x16, 0x50, 0x16, 0x80, 0x16, - 0x04, 0x16, 0x01, 0x07, 0x07, 0x11, 0x0c, 0x19, 0x03, 0x00, 0x3f, 0x33, - 0x33, 0x33, 0x11, 0x33, 0xcc, 0x5d, 0x32, 0x32, 0x32, 0x32, 0x2b, 0x11, - 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x0f, 0x01, 0x03, - 0x23, 0x03, 0x27, 0x0f, 0x01, 0x11, 0x23, 0x11, 0x33, 0x13, 0x17, 0x37, - 0x13, 0x33, 0x11, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x06, - 0x9b, 0x09, 0x0b, 0xe6, 0x6c, 0xa3, 0x4d, 0x01, 0x01, 0x80, 0xbe, 0xdf, - 0x0f, 0x4a, 0xa8, 0xb8, 0xfb, 0x28, 0x86, 0xff, 0x02, 0x8a, 0x02, 0x7a, - 0x02, 0x6b, 0x16, 0x20, 0xfd, 0xcb, 0x01, 0x9d, 0xce, 0x14, 0x11, 0xfd, - 0xba, 0x03, 0x07, 0xfd, 0xcd, 0x2a, 0xc0, 0x01, 0x9d, 0xfc, 0xf9, 0x02, - 0x98, 0xfd, 0x68, 0x02, 0x98, 0x6f, 0x6f, 0x00, 0x00, 0x01, 0x00, 0x6c, - 0x00, 0x00, 0x05, 0xb8, 0x05, 0x96, 0x00, 0x23, 0x00, 0x4b, 0x40, 0x25, - 0x1e, 0x19, 0x06, 0x0b, 0x19, 0x0b, 0x15, 0x0f, 0x0f, 0x0a, 0x03, 0x15, - 0x1a, 0x21, 0x03, 0x21, 0x25, 0x24, 0x1e, 0x18, 0x0c, 0x08, 0x06, 0x1b, - 0x1a, 0x1b, 0x5f, 0x59, 0x0b, 0x1a, 0x12, 0x00, 0x12, 0x5f, 0x59, 0x00, - 0x04, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x20, 0x00, 0x11, 0x14, 0x02, 0x07, 0x3f, 0x01, 0x33, 0x15, - 0x21, 0x35, 0x36, 0x12, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, - 0x12, 0x17, 0x15, 0x21, 0x35, 0x33, 0x1f, 0x01, 0x26, 0x02, 0x35, 0x10, - 0x00, 0x03, 0x12, 0x01, 0x2f, 0x01, 0x5b, 0xd7, 0xd1, 0x51, 0x7f, 0xf4, - 0xfd, 0xb3, 0xb3, 0xbb, 0xee, 0xd8, 0xda, 0xee, 0xba, 0xb4, 0xfd, 0xb3, - 0xf4, 0x7f, 0x51, 0xd0, 0xd8, 0x01, 0x5b, 0x05, 0x96, 0xfe, 0xb1, 0xfe, - 0xda, 0xc9, 0xfe, 0xac, 0x73, 0x05, 0x06, 0x9c, 0xe0, 0x5f, 0x01, 0x1d, - 0xb8, 0xe8, 0xfe, 0xfe, 0xe8, 0xb7, 0xfe, 0xe3, 0x60, 0xe0, 0x9c, 0x06, - 0x05, 0x71, 0x01, 0x55, 0xca, 0x01, 0x26, 0x01, 0x4f, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x58, 0xff, 0xde, 0x04, 0x7c, 0x04, 0x48, 0x00, 0x17, - 0x00, 0x1f, 0x00, 0x40, 0x40, 0x22, 0x1f, 0x0e, 0x0e, 0x04, 0x18, 0x15, - 0x0c, 0x20, 0x21, 0x01, 0x0c, 0x04, 0x21, 0x20, 0x0d, 0x2f, 0x1f, 0x01, - 0x1f, 0x1f, 0x00, 0x1c, 0x08, 0x10, 0x11, 0x06, 0x14, 0x01, 0x15, 0x14, - 0x01, 0x14, 0x00, 0x16, 0x00, 0x3f, 0x32, 0x5d, 0x5d, 0xcd, 0x3f, 0xcd, - 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x5d, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x22, 0x26, 0x02, - 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x12, 0x15, 0x21, 0x11, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x01, 0x13, 0x11, 0x2e, 0x01, - 0x23, 0x22, 0x07, 0x11, 0x02, 0x6b, 0x9e, 0xf0, 0x85, 0x8c, 0xf4, 0x93, - 0x97, 0xf4, 0x86, 0xfc, 0xc5, 0x32, 0xa3, 0x55, 0x84, 0xb5, 0x52, 0x48, - 0x60, 0xdb, 0x92, 0x33, 0xa3, 0x56, 0xb3, 0x75, 0x22, 0x91, 0x01, 0x07, - 0x9d, 0xab, 0x01, 0x00, 0x8a, 0x8d, 0xfe, 0xfe, 0xa6, 0xfe, 0x9c, 0x36, - 0x46, 0x68, 0x82, 0x2a, 0x99, 0x7c, 0x02, 0x8a, 0x01, 0x15, 0x35, 0x41, - 0x75, 0xfe, 0xea, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0xc7, 0x07, 0x62, - 0x05, 0xe9, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x7d, - 0x40, 0x43, 0x28, 0x1b, 0x0f, 0x03, 0x00, 0x16, 0x15, 0x15, 0x2e, 0x22, - 0x04, 0x0b, 0x01, 0x02, 0x07, 0x08, 0x08, 0x06, 0x0c, 0x02, 0x05, 0x0b, - 0x22, 0x00, 0x0f, 0x09, 0x37, 0x36, 0x2e, 0x1b, 0x25, 0x12, 0x25, 0x2b, - 0xb6, 0x59, 0x29, 0x25, 0x0d, 0x06, 0xb6, 0x59, 0x0c, 0x09, 0x0d, 0x0d, - 0x04, 0x09, 0x04, 0x08, 0x25, 0x08, 0x25, 0x08, 0x03, 0x02, 0x12, 0x12, - 0x18, 0xb6, 0x59, 0x16, 0x12, 0x13, 0x03, 0x09, 0x00, 0x00, 0x3f, 0xc6, - 0x3f, 0x33, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x11, 0x39, 0x39, 0x2f, 0x2f, - 0x11, 0x33, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x2b, 0x11, 0x00, 0x33, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x09, 0x01, 0x23, 0x09, 0x01, 0x03, 0x21, - 0x07, 0x23, 0x01, 0x33, 0x09, 0x01, 0x03, 0x33, 0x01, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, - 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x1e, 0x02, 0x06, 0x73, 0xfb, - 0xb3, 0x8e, 0x04, 0x4d, 0xfc, 0xa7, 0x59, 0xfe, 0xbf, 0x5d, 0x8d, 0x01, - 0x46, 0x8a, 0x01, 0x41, 0xfe, 0x79, 0x7b, 0xf8, 0x05, 0x53, 0xb6, 0xa6, - 0x95, 0xb2, 0x1d, 0x7e, 0x28, 0xbe, 0x6d, 0x64, 0x46, 0x4d, 0xcd, 0x77, - 0x40, 0xa7, 0xa1, 0x8f, 0xa6, 0x16, 0x80, 0x19, 0xb2, 0x61, 0x5c, 0x24, - 0x43, 0x81, 0x7e, 0x71, 0x40, 0x05, 0xe9, 0xf9, 0xde, 0x06, 0x22, 0xfc, - 0x75, 0x00, 0xff, 0xff, 0x03, 0x6e, 0xfc, 0x92, 0x02, 0xe6, 0xfe, 0x88, - 0xfd, 0x1d, 0x79, 0x84, 0x6e, 0x79, 0x19, 0x90, 0x40, 0x42, 0x34, 0x3d, - 0x13, 0x33, 0x3e, 0x5c, 0x42, 0x75, 0x7d, 0x66, 0x6f, 0x10, 0x76, 0x37, - 0x3c, 0x22, 0x2c, 0x1f, 0x21, 0x20, 0x41, 0x61, 0x00, 0x01, 0x00, 0x60, - 0x00, 0x00, 0x03, 0x5f, 0x04, 0x3a, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1b, - 0x07, 0x03, 0x02, 0x09, 0x05, 0x05, 0x02, 0x03, 0x02, 0x0a, 0x0b, 0x08, - 0x07, 0x50, 0x59, 0x08, 0x08, 0x03, 0x00, 0x03, 0x04, 0x50, 0x59, 0x03, - 0x15, 0x00, 0x0f, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x39, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, - 0x35, 0x21, 0x02, 0xab, 0xb4, 0xfd, 0x01, 0x02, 0x4b, 0xfd, 0xdc, 0x02, - 0x24, 0x04, 0x3a, 0xfb, 0xc6, 0x8b, 0x01, 0x3f, 0x8a, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x50, 0xff, 0xf4, 0x06, 0x7b, 0x05, 0x81, 0x10, 0x26, - 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xfd, 0x02, 0xf9, 0x00, 0x00, - 0x11, 0x07, 0x00, 0x75, 0x03, 0xf9, 0xfd, 0xcd, 0x00, 0x07, 0xb2, 0x02, - 0x12, 0x19, 0x00, 0x3f, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, - 0xff, 0xf4, 0x06, 0x85, 0x05, 0x8d, 0x10, 0x26, 0x00, 0x74, 0xf9, 0x00, - 0x10, 0x27, 0x07, 0xfd, 0x03, 0x03, 0x00, 0x00, 0x11, 0x07, 0x00, 0x75, - 0x04, 0x03, 0xfd, 0xcd, 0x00, 0x07, 0xb2, 0x02, 0x23, 0x19, 0x00, 0x3f, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xf6, 0x06, 0x4e, - 0x05, 0x81, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xfd, - 0x02, 0xf9, 0x00, 0x00, 0x11, 0x07, 0x08, 0x08, 0x03, 0xcc, 0xfd, 0xce, - 0x00, 0x33, 0x40, 0x21, 0x04, 0x03, 0x02, 0x0f, 0x2f, 0x0f, 0x6f, 0x0f, - 0x02, 0x01, 0x0c, 0xbf, 0x0c, 0x01, 0x10, 0x0c, 0x40, 0x0c, 0x60, 0x0c, - 0x70, 0x0c, 0x80, 0x0c, 0x05, 0x2f, 0x41, 0x01, 0x04, 0x03, 0x02, 0x29, - 0x18, 0x00, 0x3f, 0x35, 0x35, 0x35, 0x01, 0x5d, 0x5d, 0x5d, 0x11, 0x35, - 0x5d, 0x11, 0x35, 0x35, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, - 0xff, 0xf6, 0x06, 0x4e, 0x05, 0x8d, 0x10, 0x27, 0x07, 0xfd, 0x02, 0xf9, - 0x00, 0x00, 0x10, 0x27, 0x08, 0x08, 0x03, 0xcc, 0xfd, 0xce, 0x11, 0x06, - 0x00, 0x75, 0x22, 0x00, 0x00, 0x33, 0x40, 0x21, 0x01, 0x03, 0x02, 0x1e, - 0x2f, 0x1e, 0x6f, 0x1e, 0x02, 0x00, 0x01, 0xbf, 0x01, 0x01, 0x10, 0x01, - 0x40, 0x01, 0x60, 0x01, 0x70, 0x01, 0x80, 0x01, 0x05, 0x2f, 0x5c, 0x01, - 0x01, 0x03, 0x02, 0x1e, 0x18, 0x00, 0x3f, 0x35, 0x35, 0x35, 0x01, 0x5d, - 0x5d, 0x5d, 0x11, 0x35, 0x5d, 0x11, 0x35, 0x35, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x5d, 0xff, 0xf6, 0x06, 0x4e, 0x05, 0x81, 0x10, 0x27, - 0x07, 0xfd, 0x02, 0xf9, 0x00, 0x00, 0x10, 0x27, 0x08, 0x08, 0x03, 0xcc, - 0xfd, 0xce, 0x11, 0x06, 0x08, 0x06, 0x28, 0x00, 0x00, 0x33, 0x40, 0x21, - 0x01, 0x03, 0x02, 0x1e, 0x2f, 0x1e, 0x6f, 0x1e, 0x02, 0x00, 0x01, 0xbf, - 0x01, 0x01, 0x10, 0x01, 0x40, 0x01, 0x60, 0x01, 0x70, 0x01, 0x80, 0x01, - 0x05, 0x2f, 0x54, 0x01, 0x01, 0x03, 0x02, 0x1e, 0x18, 0x00, 0x3f, 0x35, - 0x35, 0x35, 0x01, 0x5d, 0x5d, 0x5d, 0x11, 0x35, 0x5d, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x91, 0xff, 0xf6, 0x06, 0x4e, - 0x05, 0x81, 0x10, 0x27, 0x07, 0xfd, 0x02, 0xbd, 0x00, 0x00, 0x10, 0x27, - 0x08, 0x08, 0x03, 0xcc, 0xfd, 0xce, 0x11, 0x06, 0x08, 0x07, 0x66, 0x00, - 0x00, 0x2b, 0x40, 0x19, 0x01, 0x03, 0x02, 0x1e, 0x2f, 0x1e, 0x6f, 0x1e, - 0x02, 0x00, 0x01, 0xbf, 0x01, 0x01, 0x80, 0x01, 0x01, 0x2f, 0x42, 0x01, - 0x01, 0x03, 0x02, 0x1e, 0x18, 0x00, 0x3f, 0x35, 0x35, 0x35, 0x01, 0x5d, - 0x5d, 0x5d, 0x11, 0x35, 0x5d, 0x11, 0x35, 0x35, 0x35, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3b, 0xff, 0xec, 0x03, 0xae, 0x04, 0x4e, 0x00, 0x19, - 0x00, 0x62, 0x40, 0x41, 0x06, 0x07, 0x07, 0x13, 0x00, 0x0d, 0x13, 0x0d, - 0x1a, 0x1b, 0x10, 0x17, 0x50, 0x59, 0x20, 0x14, 0x70, 0x14, 0x80, 0x14, - 0xd0, 0x14, 0xe0, 0x14, 0x05, 0x00, 0x14, 0x10, 0x14, 0x60, 0x14, 0x70, - 0x14, 0x80, 0x14, 0xc0, 0x14, 0xd0, 0x14, 0x07, 0x09, 0x14, 0x14, 0x10, - 0x16, 0x0f, 0x06, 0x6f, 0x06, 0x7f, 0x06, 0xcf, 0x06, 0x04, 0x0a, 0x03, - 0x06, 0x06, 0x0a, 0x0a, 0x03, 0x50, 0x59, 0x0a, 0x10, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x3f, 0x33, 0x2f, 0x5e, - 0x5d, 0x71, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, - 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x02, 0xf2, 0x81, 0x8e, 0x69, 0x72, - 0x0e, 0xb9, 0x1d, 0xd9, 0xa7, 0xe0, 0xf0, 0xef, 0xe3, 0xab, 0xe1, 0x15, - 0xb6, 0x0f, 0x81, 0x60, 0x8a, 0x87, 0x02, 0x22, 0xe2, 0xbd, 0x6a, 0x5a, - 0x0e, 0x97, 0xac, 0xfe, 0xe1, 0xfe, 0xef, 0xfe, 0xed, 0xfe, 0xe1, 0xba, - 0x9c, 0x0c, 0x6c, 0x68, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa2, - 0x00, 0x64, 0x06, 0x5e, 0x02, 0x44, 0x00, 0x0d, 0x00, 0x24, 0x40, 0x0f, - 0x00, 0x0b, 0x05, 0x09, 0x02, 0x02, 0x05, 0x05, 0x0c, 0x0e, 0x0f, 0x02, - 0x0d, 0x08, 0x0c, 0x00, 0x2f, 0x33, 0xcd, 0x32, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x16, - 0x17, 0x23, 0x26, 0x27, 0x35, 0x36, 0x37, 0x33, 0x06, 0x07, 0x21, 0x15, - 0x02, 0x81, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, 0x7f, 0x48, 0x3e, 0x39, - 0x03, 0xdd, 0x01, 0x29, 0x43, 0x82, 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, - 0x43, 0x56, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0xff, 0xc3, 0x02, 0xf0, - 0x04, 0x7f, 0x00, 0x0d, 0x00, 0x24, 0x40, 0x0f, 0x08, 0x0b, 0x0b, 0x03, - 0x00, 0x00, 0x0e, 0x0f, 0x0c, 0x0b, 0x00, 0x09, 0x02, 0x80, 0x05, 0x00, - 0x2f, 0x1a, 0xcc, 0x32, 0x39, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, 0x07, 0x35, 0x36, 0x37, - 0x33, 0x16, 0x17, 0x15, 0x26, 0x27, 0x11, 0x23, 0x01, 0xd5, 0x43, 0x82, - 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, 0x43, 0x56, 0x03, 0xa0, 0x39, 0x3e, - 0x48, 0x7f, 0x8f, 0x8f, 0x7f, 0x48, 0x3e, 0x39, 0xfc, 0x23, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xa2, 0x00, 0x64, 0x06, 0x5e, 0x02, 0x44, 0x00, 0x0d, - 0x00, 0x24, 0x40, 0x0f, 0x0b, 0x00, 0x05, 0x09, 0x02, 0x02, 0x05, 0x0d, - 0x05, 0x0e, 0x0f, 0x08, 0x0c, 0x03, 0x0d, 0x00, 0x2f, 0x33, 0xcd, 0x32, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x15, 0x06, 0x07, 0x23, - 0x36, 0x37, 0x21, 0x35, 0x05, 0x7f, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, - 0x7f, 0x48, 0x3e, 0x39, 0xfc, 0x23, 0x01, 0x7f, 0x43, 0x82, 0x95, 0x49, - 0x24, 0x49, 0x95, 0x82, 0x43, 0x56, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, - 0xff, 0xc3, 0x02, 0xf0, 0x04, 0x7f, 0x00, 0x0d, 0x00, 0x22, 0x40, 0x0e, - 0x03, 0x0d, 0x0d, 0x08, 0x0c, 0x0c, 0x0e, 0x0f, 0x00, 0x0b, 0x02, 0x09, - 0x80, 0x06, 0x00, 0x2f, 0x1a, 0xcc, 0x32, 0x39, 0x39, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x25, 0x36, 0x37, 0x15, - 0x06, 0x07, 0x23, 0x26, 0x27, 0x35, 0x16, 0x17, 0x11, 0x33, 0x02, 0x2b, - 0x43, 0x82, 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, 0x43, 0x56, 0xa2, 0x39, - 0x3e, 0x48, 0x7f, 0x8f, 0x8f, 0x7f, 0x48, 0x3e, 0x39, 0x03, 0xdd, 0x00, - 0x00, 0x01, 0x01, 0xa2, 0x00, 0x64, 0x06, 0x5e, 0x02, 0x44, 0x00, 0x17, - 0x00, 0x3c, 0x40, 0x1b, 0x00, 0x0b, 0x06, 0x02, 0x09, 0x09, 0x06, 0x17, - 0x0c, 0x11, 0x15, 0x0e, 0x0e, 0x11, 0x06, 0x11, 0x18, 0x19, 0x0e, 0x09, - 0x09, 0x0b, 0x15, 0x03, 0x03, 0x00, 0x0b, 0x00, 0x2f, 0xcd, 0x32, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x16, 0x17, 0x23, 0x26, 0x27, 0x35, 0x36, 0x37, 0x33, - 0x06, 0x07, 0x21, 0x26, 0x27, 0x33, 0x16, 0x17, 0x15, 0x06, 0x07, 0x23, - 0x36, 0x37, 0x02, 0x81, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, 0x7f, 0x48, - 0x3e, 0x39, 0x02, 0xfe, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, 0x7f, 0x48, - 0x3e, 0x39, 0x01, 0x29, 0x43, 0x82, 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, - 0x43, 0x43, 0x82, 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, 0x43, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x10, 0xff, 0xc3, 0x02, 0xf0, 0x04, 0x7f, 0x00, 0x17, - 0x00, 0x36, 0x40, 0x18, 0x0f, 0x08, 0x08, 0x0b, 0x0b, 0x00, 0x15, 0x03, - 0x03, 0x00, 0x00, 0x18, 0x19, 0x0c, 0x17, 0x0e, 0x15, 0x12, 0x0b, 0x00, - 0x09, 0x02, 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x32, 0x39, 0x39, 0x2f, - 0xcc, 0x32, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x06, 0x07, 0x35, - 0x36, 0x37, 0x33, 0x16, 0x17, 0x15, 0x26, 0x27, 0x11, 0x36, 0x37, 0x15, - 0x06, 0x07, 0x23, 0x26, 0x27, 0x35, 0x16, 0x17, 0x01, 0xd5, 0x43, 0x82, - 0x95, 0x49, 0x24, 0x49, 0x95, 0x82, 0x43, 0x43, 0x82, 0x95, 0x49, 0x24, - 0x49, 0x95, 0x82, 0x43, 0x03, 0xa0, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, - 0x7f, 0x48, 0x3e, 0x39, 0xfd, 0x02, 0x39, 0x3e, 0x48, 0x7f, 0x8f, 0x8f, - 0x7f, 0x48, 0x3e, 0x39, 0x00, 0x02, 0x01, 0x10, 0xff, 0x48, 0x02, 0xf0, - 0x04, 0x7f, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x3e, 0x40, 0x1c, 0x13, 0x0c, - 0x0c, 0x01, 0x0f, 0x0f, 0x04, 0x19, 0x07, 0x07, 0x00, 0x04, 0x04, 0x1d, - 0x1c, 0x10, 0x1b, 0x12, 0x19, 0x16, 0x03, 0x00, 0x16, 0x0f, 0x04, 0x0d, - 0x06, 0x09, 0x00, 0x2f, 0xcc, 0x32, 0x39, 0x39, 0x2f, 0xde, 0xcd, 0x10, - 0xcc, 0x32, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x21, - 0x15, 0x21, 0x13, 0x06, 0x07, 0x35, 0x36, 0x37, 0x33, 0x16, 0x17, 0x15, - 0x26, 0x27, 0x11, 0x36, 0x37, 0x15, 0x06, 0x07, 0x23, 0x26, 0x27, 0x35, - 0x16, 0x17, 0x01, 0x10, 0x01, 0xe0, 0xfe, 0x20, 0xc5, 0x43, 0x82, 0x95, - 0x49, 0x24, 0x49, 0x95, 0x82, 0x43, 0x43, 0x82, 0x95, 0x49, 0x24, 0x49, - 0x95, 0x82, 0x43, 0x68, 0x50, 0x04, 0x58, 0x39, 0x3e, 0x48, 0x7f, 0x8f, - 0x8f, 0x7f, 0x48, 0x3e, 0x39, 0xfd, 0x02, 0x39, 0x3e, 0x48, 0x7f, 0x8f, - 0x8f, 0x7f, 0x48, 0x3e, 0x39, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x38, - 0xff, 0xe5, 0x03, 0xba, 0x05, 0xc5, 0x00, 0x1c, 0x00, 0x2a, 0x00, 0x59, - 0x40, 0x33, 0x17, 0x08, 0x1d, 0x10, 0x11, 0x11, 0x00, 0x24, 0x08, 0x00, - 0x08, 0x2c, 0x2b, 0x17, 0x14, 0x1a, 0x14, 0x50, 0x59, 0x0c, 0x20, 0x51, - 0x59, 0x0f, 0x0c, 0x0c, 0x05, 0x2f, 0x1a, 0x6f, 0x1a, 0xdf, 0x1a, 0x03, - 0x0f, 0x1a, 0xbf, 0x1a, 0x02, 0x09, 0x03, 0x1a, 0x05, 0x27, 0x50, 0x59, - 0x05, 0x16, 0x2f, 0x2c, 0x01, 0x5d, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x2f, - 0x5f, 0x5e, 0x5d, 0x71, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, 0x0a, 0x01, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x37, 0x34, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x37, 0x36, 0x33, 0x32, 0x12, 0x03, 0x2e, - 0x01, 0x23, 0x22, 0x06, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x12, - 0x03, 0xba, 0x48, 0x93, 0xd6, 0x84, 0xa1, 0xac, 0x7f, 0xce, 0x7e, 0x54, - 0x85, 0x20, 0x04, 0x04, 0x82, 0x81, 0x35, 0x7b, 0x2e, 0x24, 0x71, 0x70, - 0xc3, 0xcf, 0xd3, 0x11, 0x6d, 0x45, 0x51, 0x86, 0x57, 0x5a, 0x52, 0x4e, - 0x87, 0x5f, 0x03, 0xaa, 0x9e, 0xfe, 0x87, 0xfe, 0xe5, 0x93, 0xcb, 0xb4, - 0xa6, 0x01, 0x3e, 0xa4, 0x63, 0x54, 0x75, 0xc4, 0xd1, 0x28, 0x23, 0x93, - 0x3e, 0xfe, 0xe8, 0xfd, 0xfb, 0x58, 0x73, 0x84, 0xfe, 0xfb, 0x84, 0x73, - 0x86, 0x97, 0x01, 0x0b, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0xe1, - 0x05, 0x81, 0x00, 0x05, 0x00, 0x0e, 0x00, 0xb8, 0x40, 0x7c, 0x01, 0x00, - 0x0a, 0x0a, 0x02, 0x0e, 0x05, 0x02, 0x05, 0x10, 0x0f, 0x06, 0x05, 0x02, - 0x0e, 0x04, 0x0e, 0x5f, 0x59, 0x04, 0x12, 0x0a, 0x20, 0x13, 0x16, 0x48, - 0x09, 0x0a, 0x01, 0x12, 0x0a, 0x00, 0x03, 0x7f, 0x10, 0x01, 0x2f, 0x10, - 0x01, 0x0f, 0x10, 0x01, 0xff, 0x10, 0x01, 0xdf, 0x10, 0x01, 0xbf, 0x10, - 0x01, 0xaf, 0x10, 0x01, 0x90, 0x10, 0x01, 0x70, 0x10, 0x01, 0x20, 0x10, - 0x01, 0x8f, 0x10, 0x01, 0x3f, 0x10, 0x01, 0x0f, 0x10, 0x01, 0x3a, 0xff, - 0x10, 0x01, 0xdf, 0x10, 0x01, 0xcf, 0x10, 0x01, 0xaf, 0x10, 0x01, 0x90, - 0x10, 0x01, 0x60, 0x10, 0x01, 0x40, 0x10, 0x01, 0x5f, 0x10, 0x01, 0x0f, - 0x10, 0x01, 0xdf, 0x10, 0x01, 0xbf, 0x10, 0x01, 0x9f, 0x10, 0x01, 0x8f, - 0x10, 0x01, 0x70, 0x10, 0x01, 0x50, 0x10, 0x01, 0x20, 0x10, 0x01, 0x00, - 0x10, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x00, 0x3f, 0x32, - 0x5e, 0x5d, 0x2b, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x33, 0x01, 0x15, 0x21, 0x37, 0x25, 0x01, 0x2e, 0x01, 0x27, 0x07, - 0x06, 0x07, 0x01, 0x02, 0x0a, 0xd9, 0x01, 0xfe, 0xfb, 0x23, 0x01, 0x04, - 0x14, 0xfe, 0xae, 0x1e, 0x33, 0x02, 0x09, 0x1f, 0x2b, 0xfe, 0xad, 0x05, - 0x81, 0xfb, 0x0c, 0x8d, 0x8d, 0x0f, 0x03, 0x5e, 0x4a, 0xa1, 0x0c, 0x20, - 0x6f, 0x6a, 0xfc, 0xa4, 0x00, 0x01, 0x00, 0xeb, 0xfe, 0x4e, 0x05, 0xac, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x22, 0x40, 0x10, 0x03, 0x04, 0x00, 0x07, - 0x04, 0x07, 0x08, 0x09, 0x05, 0x02, 0x5f, 0x59, 0x05, 0x03, 0x04, 0x00, - 0x00, 0x2f, 0x32, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, - 0x04, 0xf4, 0xfc, 0xb6, 0xbf, 0x04, 0xc1, 0xfe, 0x4e, 0x06, 0x91, 0xf9, - 0x6f, 0x07, 0x33, 0xf8, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9a, - 0xfe, 0x4e, 0x05, 0x30, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x45, 0x40, 0x24, - 0x07, 0x03, 0x03, 0x09, 0x00, 0x08, 0x02, 0x0a, 0x06, 0x02, 0x00, 0x04, - 0x0c, 0x0d, 0x03, 0x04, 0x07, 0x04, 0x07, 0x5f, 0x59, 0x02, 0x08, 0x04, - 0x03, 0x01, 0x00, 0x09, 0x00, 0x09, 0x5f, 0x59, 0x00, 0x20, 0x0d, 0x01, - 0x5d, 0x00, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x3f, 0x39, 0x39, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x09, 0x01, 0x35, - 0x21, 0x15, 0x21, 0x09, 0x01, 0x21, 0x15, 0x9a, 0x02, 0x7b, 0xfd, 0x95, - 0x04, 0x42, 0xfc, 0xb2, 0x02, 0x48, 0xfd, 0xa8, 0x03, 0xa2, 0xfe, 0x4e, - 0x6d, 0x03, 0x30, 0x03, 0x2c, 0x6a, 0x98, 0xfd, 0x04, 0xfc, 0xf9, 0x98, - 0x00, 0x01, 0x00, 0x65, 0x02, 0x60, 0x04, 0x48, 0x02, 0xf2, 0x00, 0x03, - 0x00, 0x16, 0x40, 0x0a, 0x00, 0x02, 0x04, 0x05, 0x01, 0x00, 0xad, 0x59, - 0x01, 0xb3, 0x00, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, - 0x13, 0x35, 0x21, 0x15, 0x65, 0x03, 0xe3, 0x02, 0x60, 0x92, 0x92, 0x00, - 0xff, 0xff, 0xfe, 0x60, 0x00, 0x00, 0x02, 0x62, 0x05, 0x81, 0x10, 0x06, - 0x07, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbb, 0x01, 0xbe, 0x01, 0x7e, - 0x02, 0x9a, 0x00, 0x03, 0x00, 0x23, 0x40, 0x14, 0x03, 0x00, 0x00, 0x04, - 0x05, 0x01, 0x00, 0x9b, 0x59, 0x0f, 0x01, 0x1f, 0x01, 0x02, 0x01, 0x40, - 0x0f, 0x26, 0x48, 0x01, 0x00, 0x2f, 0x2b, 0x5d, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0xbb, 0xc3, 0x01, - 0xbe, 0xdc, 0xdc, 0x00, 0x00, 0x01, 0x00, 0x33, 0xff, 0xf2, 0x04, 0x62, - 0x06, 0x54, 0x00, 0x08, 0x00, 0xa4, 0x40, 0x6c, 0x07, 0x01, 0x00, 0x06, - 0x06, 0x08, 0x05, 0x02, 0x02, 0x03, 0x03, 0x08, 0x09, 0x0a, 0x05, 0x02, - 0xaf, 0x59, 0x0f, 0x05, 0x01, 0x0a, 0x05, 0x05, 0x01, 0x07, 0xb3, 0x06, - 0x01, 0xaf, 0x0a, 0x01, 0x90, 0x0a, 0x01, 0x70, 0x0a, 0x01, 0x50, 0x0a, - 0x01, 0x30, 0x0a, 0x01, 0x8f, 0x0a, 0x01, 0x6f, 0x0a, 0x01, 0x30, 0x0a, - 0x01, 0x10, 0x0a, 0x01, 0xf0, 0x0a, 0x01, 0x4f, 0x0a, 0x01, 0x2f, 0x0a, - 0x01, 0x0f, 0x0a, 0x01, 0x39, 0xef, 0x0a, 0x01, 0xd0, 0x0a, 0x01, 0xb0, - 0x0a, 0x01, 0xef, 0x0a, 0x01, 0xcf, 0x0a, 0x01, 0xaf, 0x0a, 0x01, 0x8f, - 0x0a, 0x01, 0x70, 0x0a, 0x01, 0xaf, 0x0a, 0x01, 0x8f, 0x0a, 0x01, 0x6f, - 0x0a, 0x01, 0x4f, 0x0a, 0x01, 0x2f, 0x0a, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x00, - 0x2f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x5e, 0x5d, 0x2b, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x33, 0x33, 0x32, - 0x31, 0x30, 0x05, 0x23, 0x01, 0x23, 0x35, 0x21, 0x13, 0x01, 0x33, 0x02, - 0x6e, 0x6a, 0xfe, 0xe5, 0xb6, 0x01, 0x0e, 0xf2, 0x01, 0xae, 0x81, 0x0e, - 0x03, 0x18, 0x75, 0xfd, 0x4e, 0x05, 0x87, 0x00, 0x00, 0x03, 0x00, 0x57, - 0x00, 0xcb, 0x05, 0x5d, 0x03, 0xd7, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, - 0x00, 0x52, 0x40, 0x31, 0x1f, 0x19, 0x10, 0x05, 0x22, 0x04, 0x00, 0x28, - 0x0b, 0x00, 0x0b, 0x2f, 0x2e, 0x16, 0xe0, 0x25, 0x01, 0x25, 0x0e, 0x1c, - 0xef, 0x2b, 0x01, 0x2b, 0x05, 0x19, 0x22, 0x10, 0x04, 0x03, 0x3f, 0x08, - 0x01, 0x08, 0x40, 0x12, 0x15, 0x48, 0x00, 0x08, 0x50, 0x08, 0x02, 0x08, - 0x13, 0x0f, 0x0e, 0x01, 0x0e, 0x00, 0x2f, 0x5d, 0x33, 0xdc, 0x5d, 0x2b, - 0x71, 0x32, 0x17, 0x39, 0xcd, 0x5d, 0x32, 0x10, 0xcd, 0x5d, 0x32, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x17, 0x39, 0x32, 0x31, 0x30, - 0x01, 0x14, 0x06, 0x23, 0x22, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x25, 0x22, - 0x06, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x05, 0x2e, - 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x05, 0x5d, - 0xb2, 0x85, 0xcb, 0x84, 0x44, 0xab, 0x58, 0x8b, 0xae, 0xb1, 0x88, 0xc9, - 0x80, 0x41, 0xad, 0x61, 0x8c, 0xa9, 0xfe, 0xb3, 0x46, 0x77, 0x38, 0x33, - 0x77, 0x4d, 0x53, 0x6d, 0x6d, 0xfe, 0x33, 0x33, 0x77, 0x4e, 0x54, 0x69, - 0x68, 0x57, 0x46, 0x78, 0x02, 0x4e, 0xa6, 0xdd, 0x01, 0x1a, 0x85, 0x8f, - 0xd3, 0xb0, 0xab, 0xd8, 0xfe, 0xe5, 0x82, 0x93, 0xd6, 0x53, 0x7e, 0x82, - 0x80, 0x80, 0x91, 0x71, 0x6b, 0x93, 0xfa, 0x80, 0x80, 0x93, 0x6f, 0x70, - 0x8e, 0x7e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x98, 0x00, 0x00, 0x06, 0x60, - 0x04, 0xc7, 0x00, 0x05, 0x00, 0x18, 0x40, 0x09, 0x02, 0x05, 0x05, 0x03, - 0x06, 0x07, 0x02, 0x05, 0x01, 0x00, 0x2f, 0x2f, 0xcd, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, - 0x01, 0x98, 0x5e, 0x04, 0x6a, 0xfb, 0x38, 0x04, 0xc7, 0xfb, 0x97, 0x5e, - 0x00, 0x01, 0x01, 0x16, 0xff, 0xfe, 0x04, 0xaa, 0x04, 0x08, 0x00, 0x13, - 0x00, 0x1f, 0x40, 0x0d, 0x13, 0x00, 0x0b, 0x0a, 0x00, 0x0a, 0x14, 0x15, - 0x0f, 0x05, 0x0b, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x2f, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x11, 0x34, - 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, - 0x23, 0x22, 0x06, 0x15, 0x11, 0x01, 0x16, 0x74, 0xd1, 0x82, 0x83, 0xd3, - 0x77, 0x67, 0xc4, 0xa0, 0xa2, 0xc0, 0x02, 0x02, 0x00, 0x96, 0xef, 0x85, - 0x84, 0xf2, 0x94, 0xfe, 0x00, 0x02, 0x02, 0xbe, 0xe4, 0xe2, 0xc2, 0xfe, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9e, 0xfe, 0x4e, 0x02, 0x94, - 0x05, 0xe3, 0x00, 0x16, 0x01, 0x9c, 0x40, 0xff, 0x0e, 0x14, 0x14, 0x03, - 0x07, 0x07, 0x18, 0x17, 0x0b, 0x10, 0x50, 0x59, 0x00, 0x0b, 0x40, 0x0b, - 0x02, 0x0d, 0x03, 0x0b, 0x00, 0x05, 0x50, 0x59, 0x00, 0x74, 0x18, 0x01, - 0x66, 0x18, 0x01, 0x54, 0x18, 0x01, 0x44, 0x18, 0x01, 0x36, 0x18, 0x01, - 0x26, 0x18, 0x01, 0x16, 0x18, 0x01, 0x06, 0x18, 0x01, 0x96, 0x18, 0x01, - 0x49, 0x18, 0x01, 0x39, 0x18, 0x01, 0x29, 0x18, 0x01, 0x19, 0x18, 0x01, - 0x09, 0x18, 0x01, 0x67, 0xf9, 0x18, 0x01, 0xe9, 0x18, 0x01, 0xdb, 0x18, - 0x01, 0xa6, 0x18, 0x01, 0x76, 0x18, 0x01, 0x29, 0x18, 0x01, 0x19, 0x18, - 0x01, 0x09, 0x18, 0x01, 0xe9, 0x18, 0x01, 0xb9, 0x18, 0x01, 0xa9, 0x18, - 0x01, 0x99, 0x18, 0x01, 0x89, 0x18, 0x01, 0x7b, 0x18, 0x01, 0x6b, 0x18, - 0x01, 0x5b, 0x18, 0x01, 0x4b, 0x18, 0x01, 0x3b, 0x18, 0x01, 0x29, 0x18, - 0x01, 0x19, 0x18, 0x01, 0x0b, 0x18, 0x01, 0xfb, 0x18, 0x01, 0xe9, 0x18, - 0x01, 0xd9, 0x18, 0x01, 0xcb, 0x18, 0x01, 0xbb, 0x18, 0x01, 0xab, 0x18, - 0x01, 0x99, 0x18, 0x01, 0x8b, 0x18, 0x01, 0x7b, 0x18, 0x01, 0x6b, 0x18, - 0x01, 0x5b, 0x18, 0x01, 0x49, 0x18, 0x01, 0x39, 0x18, 0x01, 0x29, 0x18, - 0x01, 0x1b, 0x18, 0x01, 0x0b, 0x18, 0x01, 0x37, 0xf9, 0x18, 0x01, 0xe9, - 0x18, 0x01, 0xdb, 0x18, 0x01, 0xcb, 0x18, 0x01, 0xbb, 0x18, 0x01, 0xad, - 0x18, 0x01, 0x9d, 0x18, 0x01, 0x8d, 0x18, 0x01, 0x7b, 0x18, 0x01, 0x6d, - 0x18, 0x01, 0x01, 0x5f, 0x18, 0x01, 0x40, 0x18, 0x01, 0x30, 0x18, 0x01, - 0x20, 0x18, 0x01, 0x10, 0x18, 0x01, 0x00, 0x18, 0x01, 0xf4, 0x18, 0x01, - 0xe4, 0x18, 0x01, 0xd4, 0x18, 0x01, 0xc4, 0x18, 0x01, 0xb4, 0x18, 0x01, - 0xa0, 0x18, 0x01, 0x90, 0x18, 0x01, 0x02, 0x80, 0x18, 0x01, 0x70, 0x40, - 0x27, 0x18, 0x01, 0x60, 0x18, 0x01, 0x50, 0x18, 0x01, 0x10, 0x18, 0x01, - 0xdf, 0x18, 0x01, 0xc0, 0x18, 0x01, 0xb0, 0x18, 0x01, 0xa0, 0x18, 0x01, - 0x70, 0x18, 0x01, 0x60, 0x18, 0x01, 0x2f, 0x18, 0x01, 0x1f, 0x18, 0x01, - 0x0f, 0x18, 0x01, 0x07, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x5f, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5f, 0x72, 0x72, - 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, - 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x00, 0x2f, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x22, - 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x03, 0x34, 0x36, 0x33, 0x32, 0x17, - 0x15, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x24, 0x4f, 0x37, - 0x3c, 0x39, 0xac, 0x02, 0xae, 0xa6, 0x57, 0x2c, 0x31, 0x42, 0x53, 0x59, - 0xae, 0xfe, 0x4e, 0x13, 0x93, 0x18, 0xe9, 0x04, 0xbc, 0xac, 0xb6, 0x12, - 0x94, 0x1b, 0x77, 0x72, 0xfb, 0x42, 0xac, 0xb7, 0x00, 0x02, 0x00, 0x38, - 0x01, 0x50, 0x04, 0x2c, 0x03, 0xf4, 0x00, 0x15, 0x00, 0x2c, 0x00, 0xc6, - 0x40, 0x0d, 0x1e, 0x08, 0x2a, 0x12, 0x08, 0x12, 0x2d, 0x2e, 0x16, 0x27, - 0xad, 0x59, 0x1e, 0xb8, 0xff, 0xc0, 0xb4, 0x23, 0x3c, 0x48, 0x1e, 0x16, - 0xb8, 0xff, 0xc0, 0xb3, 0x17, 0x1c, 0x48, 0x16, 0xb8, 0xff, 0xc0, 0xb3, - 0x10, 0x14, 0x48, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x09, 0x0c, 0x48, - 0x16, 0x40, 0x29, 0x40, 0x29, 0x3c, 0x48, 0x29, 0x21, 0x21, 0x1b, 0xad, - 0x59, 0x6f, 0x21, 0x01, 0x00, 0x21, 0x10, 0x21, 0x02, 0x0b, 0x03, 0x21, - 0x0b, 0x40, 0x00, 0x10, 0xad, 0x59, 0x08, 0xb8, 0xff, 0xc0, 0xb4, 0x27, - 0x3c, 0x48, 0x08, 0x00, 0xb8, 0xff, 0xc0, 0xb3, 0x17, 0x1c, 0x48, 0x00, - 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x14, 0x48, 0x00, 0xb8, 0xff, 0xc0, 0x40, - 0x23, 0x09, 0x0c, 0x48, 0x00, 0x40, 0x12, 0x40, 0x29, 0x3c, 0x48, 0x12, - 0x0b, 0x0b, 0x05, 0xad, 0x59, 0x0f, 0x0b, 0xcf, 0x0b, 0x02, 0x0b, 0x40, - 0x17, 0x1c, 0x48, 0x0b, 0x40, 0x0b, 0x13, 0x48, 0x0b, 0x2f, 0x2e, 0x01, - 0x5d, 0x00, 0x2f, 0x2b, 0x2b, 0x5d, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x2b, - 0x1a, 0xdd, 0x2b, 0x2b, 0x2b, 0xc4, 0x2b, 0x2b, 0x00, 0x1a, 0x18, 0x10, - 0xcc, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x00, 0x18, 0x10, 0xc4, 0x2b, 0x1a, - 0xdd, 0x2b, 0x2b, 0x2b, 0xc4, 0x2b, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x33, 0x32, - 0x37, 0x15, 0x0e, 0x01, 0x03, 0x22, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x35, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, - 0x15, 0x0e, 0x01, 0x03, 0x28, 0x45, 0x91, 0x49, 0x85, 0x54, 0x3f, 0x72, - 0x47, 0x72, 0x95, 0x67, 0x84, 0x6e, 0x73, 0x2d, 0x82, 0x72, 0x3a, 0x75, - 0x55, 0x45, 0x91, 0x49, 0x85, 0x54, 0x43, 0x74, 0x41, 0x6f, 0x98, 0x34, - 0x7f, 0x82, 0x1f, 0x78, 0x2d, 0x82, 0x72, 0x42, 0x71, 0x02, 0xf6, 0x2b, - 0x1a, 0x2d, 0x25, 0x33, 0x90, 0x54, 0x2f, 0x28, 0x20, 0x5e, 0x95, 0x2a, - 0x26, 0xfe, 0x5a, 0x2c, 0x1a, 0x2f, 0x29, 0x2f, 0x8d, 0x54, 0x1a, 0x2e, - 0x0c, 0x21, 0x5c, 0x93, 0x2f, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, - 0x00, 0x37, 0x04, 0x24, 0x05, 0x10, 0x00, 0x13, 0x00, 0x69, 0x40, 0x41, - 0x0c, 0x0b, 0x0d, 0x0a, 0x10, 0x07, 0x11, 0x06, 0x00, 0x03, 0x01, 0x02, - 0x0c, 0x09, 0x12, 0x0e, 0x05, 0x09, 0x0e, 0x09, 0x15, 0x14, 0x10, 0x07, - 0x08, 0x09, 0x08, 0xad, 0x59, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x04, - 0xad, 0x59, 0x11, 0x06, 0x1f, 0x05, 0x2f, 0x05, 0x5f, 0x05, 0x6f, 0x05, - 0xdf, 0x05, 0x05, 0x05, 0x0d, 0x0c, 0x0b, 0x0a, 0x0f, 0x09, 0x01, 0x50, - 0x09, 0xd0, 0x09, 0x02, 0x09, 0x00, 0x2f, 0x5d, 0x5d, 0x33, 0x33, 0x33, - 0x33, 0xce, 0x5d, 0x32, 0x32, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x33, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x03, 0x23, 0x13, 0x23, - 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x33, 0x03, 0x21, 0x15, 0x21, - 0x03, 0x21, 0x15, 0x01, 0xc0, 0x98, 0x91, 0x97, 0xed, 0x01, 0x37, 0xbe, - 0xfe, 0x0b, 0x02, 0x3d, 0x9a, 0x8f, 0x98, 0x01, 0x15, 0xfe, 0xa2, 0xbf, - 0x02, 0x1d, 0x01, 0x58, 0xfe, 0xdf, 0x01, 0x21, 0x94, 0x01, 0x6c, 0x94, - 0x01, 0x24, 0xfe, 0xdc, 0x94, 0xfe, 0x94, 0x94, 0x00, 0x03, 0x00, 0x64, - 0x00, 0xf4, 0x04, 0x47, 0x04, 0x50, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, - 0x00, 0x57, 0x40, 0x34, 0x0b, 0x07, 0x02, 0x08, 0x04, 0x00, 0x02, 0x00, - 0x0d, 0x0c, 0x09, 0x08, 0xad, 0x59, 0x09, 0x09, 0x04, 0x01, 0x04, 0x05, - 0xad, 0x59, 0xb0, 0x04, 0x01, 0x0f, 0x04, 0x3f, 0x04, 0x6f, 0x04, 0x7f, - 0x04, 0x04, 0x0c, 0x03, 0x04, 0x01, 0x00, 0xad, 0x59, 0x50, 0x01, 0x01, - 0x0f, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x03, 0x01, 0x00, 0x2f, 0x5d, 0x5d, - 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x5d, 0x2b, 0x11, 0x12, 0x00, - 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x13, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, - 0x15, 0x01, 0x35, 0x21, 0x15, 0x64, 0x03, 0xe3, 0xfc, 0x1d, 0x03, 0xe3, - 0xfc, 0x1d, 0x03, 0xe3, 0x03, 0xbc, 0x94, 0x94, 0xfd, 0x38, 0x94, 0x94, - 0x01, 0x64, 0x94, 0x94, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x04, 0x24, - 0x04, 0xcf, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x49, 0x40, 0x2a, 0x05, 0x02, - 0x04, 0x07, 0x00, 0x0a, 0x02, 0x00, 0x02, 0x0b, 0x0c, 0x07, 0x08, 0xad, - 0x59, 0x07, 0x05, 0x4f, 0x06, 0x5f, 0x06, 0x8f, 0x06, 0x03, 0x06, 0x03, - 0x40, 0x02, 0x50, 0x02, 0x80, 0x02, 0x03, 0x02, 0x01, 0x00, 0x50, 0x04, - 0x80, 0x04, 0x02, 0x04, 0x00, 0x19, 0x2f, 0x5d, 0x33, 0x33, 0xcd, 0x5d, - 0x32, 0xcd, 0x5d, 0x32, 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x01, - 0x15, 0x09, 0x01, 0x15, 0x05, 0x35, 0x21, 0x15, 0x41, 0x03, 0xe3, 0xfc, - 0xa6, 0x03, 0x5a, 0xfc, 0x1b, 0x03, 0xe3, 0x02, 0x77, 0xcd, 0x01, 0x8b, - 0x9a, 0xfe, 0xa8, 0xfe, 0xa8, 0x99, 0xec, 0x91, 0x91, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x04, 0x24, 0x04, 0xcf, 0x00, 0x06, - 0x00, 0x0a, 0x00, 0x49, 0x40, 0x2a, 0x02, 0x06, 0x03, 0x07, 0x00, 0x09, - 0x06, 0x00, 0x06, 0x0b, 0x0c, 0x07, 0x08, 0xad, 0x59, 0x07, 0x03, 0x40, - 0x04, 0x50, 0x04, 0x80, 0x04, 0x03, 0x04, 0x01, 0x4f, 0x00, 0x5f, 0x00, - 0x8f, 0x00, 0x03, 0x00, 0x06, 0x05, 0x50, 0x02, 0x80, 0x02, 0x02, 0x02, - 0x00, 0x19, 0x2f, 0x5d, 0x33, 0x33, 0xcd, 0x5d, 0x32, 0xcd, 0x5d, 0x32, - 0x18, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x37, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, - 0x01, 0x35, 0x21, 0x15, 0x41, 0x03, 0x5a, 0xfc, 0xa6, 0x03, 0xe3, 0xfc, - 0x1d, 0x03, 0xe3, 0xec, 0x99, 0x01, 0x58, 0x01, 0x58, 0x9a, 0xfe, 0x75, - 0xcd, 0xfd, 0x89, 0x91, 0x91, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, - 0x00, 0x00, 0x04, 0x37, 0x04, 0x81, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2c, - 0x40, 0x14, 0x02, 0x08, 0x05, 0x00, 0x06, 0x04, 0x00, 0x08, 0x04, 0x03, - 0x0b, 0x0a, 0x03, 0x01, 0x01, 0x00, 0x08, 0x02, 0x05, 0x00, 0x00, 0x2f, - 0xcd, 0x2f, 0x33, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x09, 0x01, - 0x11, 0x25, 0x21, 0x11, 0x09, 0x01, 0x9d, 0x01, 0xcd, 0x01, 0xcd, 0xfc, - 0xb6, 0x02, 0xfa, 0xfe, 0x83, 0xfe, 0x83, 0x02, 0x7b, 0x02, 0x06, 0xfd, - 0xfa, 0xfd, 0x85, 0x52, 0x02, 0x06, 0x01, 0xaa, 0xfe, 0x56, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x64, 0x00, 0xb4, 0x04, 0x47, 0x02, 0xf2, 0x00, 0x05, - 0x00, 0x1b, 0x40, 0x0c, 0x05, 0x00, 0x00, 0x02, 0x06, 0x07, 0x01, 0x04, - 0xad, 0x59, 0x01, 0x00, 0x00, 0x2f, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0x64, - 0x03, 0xe3, 0xfc, 0xae, 0xb4, 0x02, 0x3e, 0x92, 0xfe, 0x54, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x22, 0xfd, 0x9a, 0x03, 0xd2, 0x06, 0xaa, 0x00, 0x15, - 0x00, 0x1a, 0x40, 0x0a, 0x00, 0x01, 0x08, 0x01, 0x17, 0x16, 0x11, 0x0b, - 0x05, 0x01, 0x00, 0x2f, 0x2f, 0xcd, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, - 0x06, 0x15, 0x02, 0xb5, 0x93, 0xa8, 0x7e, 0x3f, 0x4b, 0x33, 0x25, 0x1e, - 0x0d, 0x10, 0x26, 0x21, 0x10, 0x24, 0x09, 0x06, 0xfd, 0x9a, 0x07, 0x56, - 0xc4, 0xf6, 0x3f, 0x30, 0x28, 0x34, 0x0a, 0x08, 0x2a, 0x27, 0x27, 0x23, - 0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0xfd, 0x9a, 0x02, 0xb5, - 0x06, 0xaa, 0x00, 0x14, 0x00, 0x1a, 0x40, 0x0a, 0x02, 0x14, 0x08, 0x14, - 0x15, 0x16, 0x11, 0x0b, 0x05, 0x00, 0x00, 0x2f, 0x2f, 0xcd, 0x39, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x02, 0x22, 0x93, 0xa3, 0x84, 0x3b, 0x4e, - 0x32, 0x24, 0x21, 0x1a, 0x0a, 0x1f, 0x1f, 0x10, 0x1d, 0x17, 0x06, 0xaa, - 0xf8, 0xa8, 0xc3, 0xf5, 0x3d, 0x2f, 0x27, 0x35, 0x10, 0x04, 0x29, 0x25, - 0x33, 0x7f, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf6, 0x02, 0x25, 0x05, 0xb5, - 0x02, 0xb6, 0x00, 0x03, 0x00, 0x18, 0xb5, 0x03, 0x05, 0x00, 0x04, 0x01, - 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfc, 0x00, 0x3f, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x15, 0x0a, 0x05, - 0xbf, 0x02, 0x25, 0x91, 0x91, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xd8, - 0xfd, 0x93, 0x02, 0x69, 0x07, 0x48, 0x00, 0x03, 0x00, 0x17, 0xb3, 0x02, - 0x03, 0x04, 0x03, 0xb8, 0x01, 0x06, 0xb4, 0x5b, 0x03, 0xfe, 0x00, 0xfa, - 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, - 0x23, 0x01, 0xd8, 0x91, 0x91, 0x07, 0x48, 0xf6, 0x4b, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x8d, 0xfd, 0x93, 0x05, 0xb5, 0x02, 0xb6, 0x00, 0x05, - 0x00, 0x26, 0xb3, 0x03, 0x00, 0x06, 0x00, 0xb8, 0x01, 0x06, 0xb6, 0x5b, - 0x02, 0x07, 0x05, 0xfe, 0x00, 0x03, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x00, - 0xfc, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x31, 0x30, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x02, 0x8d, - 0x03, 0x28, 0xfd, 0x69, 0x91, 0x02, 0xb6, 0x91, 0xfb, 0x6e, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x03, 0x1e, 0x02, 0xb6, 0x00, 0x05, - 0x00, 0x26, 0xb3, 0x02, 0x05, 0x06, 0x05, 0xb8, 0x01, 0x06, 0xb6, 0x5b, - 0x00, 0x06, 0x04, 0xfe, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, - 0xfc, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, 0x23, 0x11, 0x0a, 0x03, - 0x28, 0x91, 0x02, 0x25, 0x91, 0xfa, 0xdd, 0x04, 0x92, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x8d, 0x02, 0x25, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x05, - 0x00, 0x24, 0xb3, 0x02, 0x05, 0x06, 0x05, 0xb8, 0x01, 0x06, 0xb4, 0x5b, - 0x04, 0x07, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x02, 0xfc, 0x00, - 0xfa, 0x00, 0x3f, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, - 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x02, 0x8d, 0x91, 0x02, - 0x97, 0xfc, 0xd8, 0x07, 0x48, 0xfb, 0x6e, 0x91, 0x00, 0x01, 0xff, 0xf6, - 0x02, 0x25, 0x03, 0x1e, 0x07, 0x48, 0x00, 0x05, 0x00, 0x26, 0xb3, 0x05, - 0x02, 0x06, 0x02, 0xb8, 0x01, 0x06, 0xb6, 0x5b, 0x00, 0x06, 0x03, 0xfa, - 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfc, 0x00, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, - 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x0a, 0x02, 0x97, 0x91, 0x02, 0x25, - 0x91, 0x04, 0x92, 0xfa, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8d, - 0xfd, 0x93, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x07, 0x00, 0x2d, 0xb5, 0x05, - 0x01, 0x01, 0x00, 0x08, 0x00, 0xb8, 0x01, 0x06, 0xb6, 0x5b, 0x04, 0x09, - 0x07, 0xfe, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x02, 0xfc, 0x00, - 0xfa, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, - 0x21, 0x11, 0x23, 0x02, 0x8d, 0x91, 0x02, 0x97, 0xfd, 0x69, 0x91, 0x07, - 0x48, 0xfb, 0x6e, 0x91, 0xfb, 0x6e, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf6, - 0xfd, 0x93, 0x03, 0x1e, 0x07, 0x48, 0x00, 0x07, 0x00, 0x2c, 0xb4, 0x07, - 0x04, 0x02, 0x08, 0x02, 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x00, 0x08, - 0x06, 0xfe, 0x03, 0xfa, 0x02, 0x07, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, - 0xfc, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, - 0x23, 0x11, 0x0a, 0x02, 0x97, 0x91, 0x91, 0x02, 0x25, 0x91, 0x04, 0x92, - 0xf6, 0x4b, 0x04, 0x92, 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x05, 0xb5, - 0x02, 0xb6, 0x00, 0x07, 0x00, 0x2f, 0xb5, 0x03, 0x09, 0x04, 0x07, 0x08, - 0x07, 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x00, 0x08, 0x06, 0xfe, 0x04, - 0x00, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfc, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x15, 0x21, 0x11, 0x23, - 0x11, 0x0a, 0x05, 0xbf, 0xfd, 0x69, 0x91, 0x02, 0x25, 0x91, 0x91, 0xfb, - 0x6e, 0x04, 0x92, 0x00, 0x00, 0x01, 0xff, 0xf6, 0x02, 0x25, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x07, 0x00, 0x2f, 0xb5, 0x07, 0x09, 0x05, 0x02, 0x08, - 0x02, 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x00, 0x08, 0x03, 0xfa, 0x05, - 0x01, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfc, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, - 0x15, 0x0a, 0x02, 0x97, 0x91, 0x02, 0x97, 0x02, 0x25, 0x91, 0x04, 0x92, - 0xfb, 0x6e, 0x91, 0x00, 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x0b, 0x00, 0x3b, 0x40, 0x09, 0x07, 0x0d, 0x05, 0x08, - 0x08, 0x02, 0x0b, 0x0c, 0x0b, 0xb8, 0x01, 0x06, 0x40, 0x0b, 0x5b, 0x00, - 0x0c, 0x0a, 0xfe, 0x03, 0xfa, 0x08, 0x0b, 0x02, 0x0b, 0xb8, 0x01, 0x02, - 0xb3, 0x59, 0x05, 0x02, 0xfc, 0x00, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, - 0x15, 0x21, 0x11, 0x23, 0x11, 0x0a, 0x02, 0x97, 0x91, 0x02, 0x97, 0xfd, - 0x69, 0x91, 0x02, 0x25, 0x91, 0x04, 0x92, 0xfb, 0x6e, 0x91, 0xfb, 0x6e, - 0x04, 0x92, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf6, 0x01, 0x71, 0x05, 0xb5, - 0x03, 0x6a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2e, 0x40, 0x0a, 0x03, 0x07, - 0x07, 0x09, 0x00, 0x04, 0x04, 0x08, 0x05, 0x04, 0xb8, 0x01, 0x02, 0xb4, - 0x59, 0x05, 0xfd, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfb, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, - 0x21, 0x15, 0x0a, 0x05, 0xbf, 0xfa, 0x41, 0x05, 0xbf, 0x02, 0xd9, 0x91, - 0x91, 0xfe, 0x98, 0x91, 0x91, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xd9, - 0xfd, 0x93, 0x03, 0xd2, 0x07, 0x48, 0x00, 0x03, 0x00, 0x07, 0x00, 0x28, - 0xb3, 0x05, 0x04, 0x08, 0x04, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x01, 0x00, - 0x08, 0x00, 0xb8, 0x01, 0x04, 0xb6, 0x5b, 0x07, 0x03, 0xfe, 0x04, 0x00, - 0xfa, 0x00, 0x3f, 0x32, 0x3f, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, - 0x01, 0xd9, 0x91, 0x91, 0x01, 0x68, 0x91, 0x91, 0x07, 0x48, 0xf6, 0x4b, - 0x09, 0xb5, 0xf6, 0x4b, 0x00, 0x01, 0x02, 0x8d, 0xfd, 0x93, 0x05, 0xb5, - 0x03, 0x6a, 0x00, 0x09, 0x00, 0x3c, 0xb5, 0x07, 0x03, 0x03, 0x00, 0x0a, - 0x00, 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x02, 0x06, 0x06, 0x0b, 0x09, - 0xfe, 0x04, 0x07, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x04, 0xfd, 0x00, 0x03, - 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x00, 0xfb, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, - 0x15, 0x21, 0x11, 0x23, 0x02, 0x8d, 0x03, 0x28, 0xfd, 0x69, 0x02, 0x97, - 0xfd, 0x69, 0x91, 0x03, 0x6a, 0x91, 0xd7, 0x91, 0xfc, 0x22, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xd9, 0xfd, 0x93, 0x05, 0xb5, 0x02, 0xb6, 0x00, 0x09, - 0x00, 0x38, 0xb3, 0x06, 0x09, 0x0a, 0x09, 0xb8, 0x01, 0x04, 0xb4, 0x5b, - 0x02, 0x05, 0x0a, 0x05, 0xb8, 0x01, 0x07, 0xb6, 0x5b, 0x01, 0x0b, 0x02, - 0x06, 0x09, 0x06, 0xb8, 0x01, 0x02, 0xb5, 0x59, 0x09, 0xfc, 0x04, 0x08, - 0xfe, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x01, 0x33, - 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x01, 0x15, - 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x05, 0xb5, 0xfe, 0x1d, - 0x91, 0xd7, 0x91, 0x02, 0xb6, 0x91, 0xfb, 0x6e, 0x04, 0x92, 0xfb, 0x6e, - 0x05, 0x23, 0x00, 0x00, 0x00, 0x02, 0x01, 0xd9, 0xfd, 0x93, 0x05, 0xb5, - 0x03, 0x6a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x44, 0xb3, 0x09, 0x06, 0x0c, - 0x06, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x03, 0x00, 0x0c, 0x00, 0xb8, 0x01, - 0x04, 0xb6, 0x5b, 0x02, 0x08, 0x08, 0x0d, 0x06, 0x09, 0xb8, 0x01, 0x02, - 0xb7, 0x59, 0x06, 0xfd, 0x0b, 0x05, 0xfe, 0x00, 0x03, 0xb8, 0x01, 0x02, - 0xb2, 0x59, 0x00, 0xfb, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x3f, - 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x31, 0x30, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x21, - 0x15, 0x21, 0x11, 0x23, 0x01, 0xd9, 0x03, 0xdc, 0xfc, 0xb5, 0x91, 0x01, - 0x68, 0x02, 0x74, 0xfe, 0x1d, 0x91, 0x03, 0x6a, 0x91, 0xfa, 0xba, 0x04, - 0x6f, 0x91, 0xfc, 0x22, 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x03, 0x1e, - 0x03, 0x6a, 0x00, 0x09, 0x00, 0x3a, 0xb4, 0x09, 0x06, 0x03, 0x0a, 0x03, - 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x04, 0x00, 0x00, 0x0a, 0x08, 0xfe, - 0x06, 0x03, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x06, 0xfb, 0x02, 0x09, 0xb8, - 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfd, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, - 0x23, 0x11, 0x0a, 0x02, 0x97, 0xfd, 0x69, 0x03, 0x28, 0x91, 0x01, 0x71, - 0x91, 0xd7, 0x91, 0xfa, 0x29, 0x03, 0xde, 0x00, 0x00, 0x01, 0xff, 0xf6, - 0xfd, 0x93, 0x03, 0xd2, 0x02, 0xb6, 0x00, 0x09, 0x00, 0x3a, 0xb3, 0x06, - 0x09, 0x0a, 0x09, 0xb8, 0x01, 0x04, 0xb4, 0x5b, 0x02, 0x05, 0x0a, 0x05, - 0xb8, 0x01, 0x07, 0x40, 0x0a, 0x5b, 0x00, 0x0a, 0x04, 0x08, 0xfe, 0x06, - 0x00, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfc, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, - 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x0a, 0x03, 0xdc, 0x91, 0xd7, 0x91, - 0x02, 0x25, 0x91, 0xfa, 0xdd, 0x04, 0x92, 0xfb, 0x6e, 0x04, 0x92, 0x00, - 0x00, 0x02, 0xff, 0xf6, 0xfd, 0x93, 0x03, 0xd2, 0x03, 0x6a, 0x00, 0x05, - 0x00, 0x0b, 0x00, 0x44, 0xb3, 0x0b, 0x08, 0x0c, 0x08, 0xb8, 0x01, 0x04, - 0xb4, 0x5b, 0x00, 0x03, 0x0c, 0x03, 0xb8, 0x01, 0x07, 0xb6, 0x5b, 0x04, - 0x09, 0x09, 0x0c, 0x0a, 0x09, 0xb8, 0x01, 0x02, 0xb7, 0x59, 0x0a, 0xfd, - 0x02, 0x07, 0xfe, 0x05, 0x04, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x05, 0xfb, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x23, 0x11, 0x21, 0x35, 0x21, - 0x03, 0xd2, 0x91, 0xfc, 0xb5, 0x02, 0x74, 0x91, 0xfe, 0x1d, 0x02, 0x74, - 0x03, 0x6a, 0xfa, 0x29, 0x05, 0x46, 0x91, 0xfa, 0x29, 0x03, 0xde, 0x91, - 0x00, 0x01, 0x02, 0x8d, 0x01, 0x71, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x09, - 0x00, 0x39, 0xb5, 0x02, 0x06, 0x06, 0x09, 0x0a, 0x09, 0xb8, 0x01, 0x06, - 0xb6, 0x5b, 0x04, 0x08, 0x08, 0x0b, 0x06, 0x09, 0xb8, 0x01, 0x02, 0xb4, - 0x59, 0x06, 0xfd, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x02, 0xfb, - 0x00, 0xfa, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, - 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, - 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x02, 0x8d, 0x91, - 0x02, 0x97, 0xfd, 0x69, 0x02, 0x97, 0xfc, 0xd8, 0x07, 0x48, 0xfc, 0x22, - 0x91, 0xd7, 0x91, 0x00, 0x00, 0x01, 0x01, 0xd9, 0x02, 0x25, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x09, 0x00, 0x35, 0xb3, 0x02, 0x09, 0x0a, 0x09, 0xb8, - 0x01, 0x07, 0xb4, 0x5b, 0x08, 0x05, 0x0a, 0x05, 0xb8, 0x01, 0x04, 0xb4, - 0x5b, 0x04, 0x0b, 0x08, 0x05, 0xb8, 0x01, 0x02, 0xb6, 0x59, 0x02, 0x08, - 0xfc, 0x00, 0x06, 0xfa, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x01, - 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x33, 0x03, 0x41, 0x91, - 0x01, 0xe3, 0xfc, 0x24, 0x91, 0xd7, 0x07, 0x48, 0xfb, 0x6e, 0x91, 0x05, - 0x23, 0xfb, 0x6e, 0x00, 0x00, 0x02, 0x01, 0xd9, 0x01, 0x71, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x44, 0xb3, 0x08, 0x0b, 0x0c, - 0x0b, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x02, 0x05, 0x0c, 0x05, 0xb8, 0x01, - 0x04, 0xb6, 0x5b, 0x0a, 0x04, 0x04, 0x0d, 0x08, 0x0b, 0xb8, 0x01, 0x02, - 0xb4, 0x59, 0x08, 0xfb, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb5, 0x59, 0x02, - 0xfd, 0x06, 0x00, 0xfa, 0x00, 0x3f, 0x32, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x33, - 0x11, 0x21, 0x15, 0x21, 0x01, 0xd9, 0x91, 0x03, 0x4b, 0xfc, 0x24, 0x01, - 0x68, 0x91, 0x01, 0xe3, 0xfd, 0x8c, 0x07, 0x48, 0xfa, 0xba, 0x91, 0x05, - 0xd7, 0xfc, 0x22, 0x91, 0x00, 0x01, 0xff, 0xf6, 0x01, 0x71, 0x03, 0x1e, - 0x07, 0x48, 0x00, 0x09, 0x00, 0x3a, 0xb4, 0x09, 0x06, 0x02, 0x0a, 0x02, - 0xb8, 0x01, 0x06, 0x40, 0x09, 0x5b, 0x04, 0x00, 0x00, 0x0a, 0x07, 0xfa, - 0x06, 0x03, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x06, 0xfb, 0x02, 0x09, 0xb8, - 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfd, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, - 0x33, 0x11, 0x0a, 0x02, 0x97, 0xfd, 0x69, 0x02, 0x97, 0x91, 0x01, 0x71, - 0x91, 0xd7, 0x91, 0x03, 0xde, 0xfa, 0x29, 0x00, 0x00, 0x01, 0xff, 0xf6, - 0x02, 0x25, 0x03, 0xd2, 0x07, 0x48, 0x00, 0x09, 0x00, 0x3a, 0xb3, 0x00, - 0x07, 0x0a, 0x07, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x06, 0x03, 0x0a, 0x03, - 0xb8, 0x01, 0x04, 0x40, 0x0a, 0x5b, 0x01, 0x0a, 0x08, 0x04, 0xfa, 0x06, - 0x02, 0x02, 0x01, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfc, 0x00, 0x3f, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x03, 0xd2, 0xfc, 0x24, 0x01, 0xe3, - 0x91, 0xd7, 0x91, 0x02, 0x25, 0x91, 0x04, 0x92, 0xfb, 0x6e, 0x04, 0x92, - 0x00, 0x02, 0xff, 0xf6, 0x01, 0x71, 0x03, 0xd2, 0x07, 0x48, 0x00, 0x05, - 0x00, 0x0b, 0x00, 0x44, 0xb3, 0x08, 0x0b, 0x0c, 0x0b, 0xb8, 0x01, 0x04, - 0xb4, 0x5b, 0x00, 0x03, 0x0c, 0x03, 0xb8, 0x01, 0x07, 0xb6, 0x5b, 0x09, - 0x01, 0x01, 0x0c, 0x0a, 0x09, 0xb8, 0x01, 0x02, 0xb7, 0x59, 0x0a, 0xfb, - 0x04, 0x06, 0xfa, 0x02, 0x01, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfd, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x3f, 0x2b, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x35, 0x21, 0x11, 0x33, 0x21, 0x33, 0x11, 0x21, 0x35, 0x21, - 0x03, 0xd2, 0xfc, 0x24, 0x03, 0x4b, 0x91, 0xfe, 0x07, 0x91, 0xfd, 0x8c, - 0x01, 0xe3, 0x01, 0x71, 0x91, 0x05, 0x46, 0xfb, 0x91, 0x91, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x8d, 0xfd, 0x93, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x0b, - 0x00, 0x41, 0xb6, 0x06, 0x02, 0x0a, 0x0a, 0x0b, 0x0c, 0x0b, 0xb8, 0x01, - 0x06, 0x40, 0x09, 0x5b, 0x04, 0x08, 0x08, 0x0d, 0x0b, 0xfe, 0x06, 0x09, - 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x06, 0xfd, 0x02, 0x05, 0xb8, 0x01, 0x02, - 0xb4, 0x59, 0x02, 0xfb, 0x00, 0xfa, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, - 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x02, 0x8d, 0x91, 0x02, 0x97, - 0xfd, 0x69, 0x02, 0x97, 0xfd, 0x69, 0x91, 0x07, 0x48, 0xfc, 0x22, 0x91, - 0xd7, 0x91, 0xfc, 0x22, 0x00, 0x02, 0x01, 0xd9, 0xfd, 0x93, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x3f, 0xb3, 0x0a, 0x0b, 0x0c, - 0x0b, 0xb8, 0x01, 0x04, 0xb6, 0x5b, 0x02, 0x06, 0x06, 0x07, 0x0c, 0x07, - 0xb8, 0x01, 0x07, 0x40, 0x0b, 0x5b, 0x04, 0x0d, 0x07, 0x0b, 0xfe, 0x00, - 0x08, 0xfa, 0x02, 0x05, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfc, 0x00, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x01, - 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x03, - 0x41, 0x91, 0x01, 0xe3, 0xfe, 0x1d, 0x91, 0xfe, 0x98, 0x91, 0x91, 0x07, - 0x48, 0xfb, 0x6e, 0x91, 0xfb, 0x6e, 0x09, 0xb5, 0xf6, 0x4b, 0x00, 0x00, - 0x00, 0x03, 0x01, 0xd9, 0xfd, 0x93, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x03, - 0x00, 0x09, 0x00, 0x0f, 0x00, 0x50, 0xb6, 0x0c, 0x08, 0x08, 0x0f, 0x09, - 0x10, 0x09, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x00, 0x01, 0x10, 0x01, 0xb8, - 0x01, 0x04, 0xb6, 0x5b, 0x0e, 0x06, 0x06, 0x11, 0x0c, 0x0f, 0xb8, 0x01, - 0x02, 0xb4, 0x59, 0x0c, 0xfb, 0x04, 0x07, 0xb8, 0x01, 0x02, 0x40, 0x09, - 0x59, 0x04, 0xfd, 0x0a, 0x02, 0xfa, 0x09, 0x01, 0xfe, 0x00, 0x3f, 0x33, - 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, - 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, - 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x02, 0x6a, 0x91, 0x91, 0xd7, 0x02, - 0x74, 0xfe, 0x1d, 0x91, 0x91, 0x01, 0xe3, 0xfd, 0x8c, 0xfd, 0x93, 0x09, - 0xb5, 0xfa, 0xba, 0x91, 0xfc, 0x22, 0x09, 0xb5, 0xfc, 0x22, 0x91, 0x00, - 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x03, 0x1e, 0x07, 0x48, 0x00, 0x0b, - 0x00, 0x3f, 0xb5, 0x09, 0x06, 0x02, 0x0a, 0x0c, 0x0a, 0xb8, 0x01, 0x06, - 0x40, 0x0b, 0x5b, 0x04, 0x00, 0x00, 0x0c, 0x0a, 0xfe, 0x07, 0xfa, 0x06, - 0x03, 0xb8, 0x01, 0x02, 0xb4, 0x59, 0x06, 0xfb, 0x02, 0x0b, 0xb8, 0x01, - 0x02, 0xb2, 0x59, 0x02, 0xfd, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x33, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, - 0x11, 0x33, 0x11, 0x23, 0x11, 0x0a, 0x02, 0x97, 0xfd, 0x69, 0x02, 0x97, - 0x91, 0x91, 0x01, 0x71, 0x91, 0xd7, 0x91, 0x03, 0xde, 0xf6, 0x4b, 0x03, - 0xde, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf6, 0xfd, 0x93, 0x03, 0xd2, - 0x07, 0x48, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x3d, 0xb3, 0x0a, 0x0b, 0x0c, - 0x0b, 0xb8, 0x01, 0x07, 0xb5, 0x5b, 0x05, 0x02, 0x06, 0x0c, 0x06, 0xb8, - 0x01, 0x04, 0x40, 0x0b, 0x5b, 0x00, 0x0c, 0x0b, 0x06, 0xfe, 0x08, 0x03, - 0xfa, 0x02, 0x07, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x02, 0xfc, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, - 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x33, 0x11, 0x23, 0x0a, 0x01, 0xe3, - 0x91, 0x91, 0x01, 0x68, 0x91, 0x91, 0x02, 0x25, 0x91, 0x04, 0x92, 0xf6, - 0x4b, 0x04, 0x92, 0x05, 0x23, 0xf6, 0x4b, 0x00, 0x00, 0x03, 0xff, 0xf6, - 0xfd, 0x93, 0x03, 0xd2, 0x07, 0x48, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, - 0x00, 0x4f, 0xb6, 0x06, 0x0a, 0x0a, 0x09, 0x0b, 0x10, 0x0b, 0xb8, 0x01, - 0x04, 0xb4, 0x5b, 0x02, 0x03, 0x10, 0x03, 0xb8, 0x01, 0x07, 0xb6, 0x5b, - 0x07, 0x0d, 0x0d, 0x10, 0x0f, 0x0c, 0xb8, 0x01, 0x02, 0xb7, 0x59, 0x0f, - 0xfd, 0x03, 0x0b, 0xfe, 0x09, 0x06, 0xb8, 0x01, 0x02, 0xb5, 0x59, 0x09, - 0xfb, 0x00, 0x04, 0xfa, 0x00, 0x3f, 0x33, 0x3f, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, - 0x2b, 0x11, 0x01, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, - 0x23, 0x01, 0x33, 0x11, 0x21, 0x35, 0x21, 0x13, 0x23, 0x11, 0x21, 0x35, - 0x21, 0x03, 0x41, 0x91, 0x91, 0xfe, 0x98, 0x91, 0xfd, 0x8c, 0x01, 0xe3, - 0x91, 0x91, 0xfe, 0x1d, 0x02, 0x74, 0x07, 0x48, 0xf6, 0x4b, 0x09, 0xb5, - 0xfb, 0x91, 0x91, 0xfa, 0x29, 0x03, 0xde, 0x91, 0x00, 0x02, 0xff, 0xf6, - 0xfd, 0x93, 0x05, 0xb5, 0x03, 0x6a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x42, - 0xb7, 0x0b, 0x03, 0x03, 0x0d, 0x04, 0x07, 0x0c, 0x07, 0xb8, 0x01, 0x06, - 0xb6, 0x5b, 0x08, 0x00, 0x00, 0x0c, 0x09, 0x08, 0xb8, 0x01, 0x02, 0x40, - 0x09, 0x59, 0x09, 0xfb, 0x06, 0xfe, 0x04, 0x00, 0x01, 0x00, 0xb8, 0x01, - 0x02, 0xb2, 0x59, 0x01, 0xfd, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, 0x21, 0x15, 0x21, 0x11, - 0x23, 0x11, 0x01, 0x35, 0x21, 0x15, 0x0a, 0x05, 0xbf, 0xfd, 0x69, 0x91, - 0xfd, 0x69, 0x05, 0xbf, 0x01, 0x71, 0x91, 0x91, 0xfc, 0x22, 0x03, 0xde, - 0x01, 0x68, 0x91, 0x91, 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x05, 0xb5, - 0x02, 0xb6, 0x00, 0x0b, 0x00, 0x40, 0xb5, 0x03, 0x0d, 0x08, 0x0b, 0x0c, - 0x0b, 0xb8, 0x01, 0x04, 0xb4, 0x5b, 0x04, 0x07, 0x0c, 0x07, 0xb8, 0x01, - 0x07, 0x40, 0x0b, 0x5b, 0x00, 0x0c, 0x06, 0x0a, 0xfe, 0x08, 0x04, 0x00, - 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfc, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x33, 0x18, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, 0x11, - 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, - 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x0a, 0x05, - 0xbf, 0xfe, 0x1d, 0x91, 0xd7, 0x91, 0x02, 0x25, 0x91, 0x91, 0xfb, 0x6e, - 0x04, 0x92, 0xfb, 0x6e, 0x04, 0x92, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf6, - 0xfd, 0x93, 0x05, 0xb5, 0x03, 0x6a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0f, - 0x00, 0x53, 0xb3, 0x09, 0x06, 0x10, 0x06, 0xb8, 0x01, 0x07, 0x40, 0x09, - 0x5b, 0x0e, 0x03, 0x03, 0x10, 0x05, 0x02, 0x10, 0x02, 0xb8, 0x01, 0x04, - 0xb6, 0x5b, 0x0d, 0x08, 0x08, 0x11, 0x0f, 0x0e, 0xb8, 0x01, 0x02, 0xb6, - 0x59, 0x0f, 0xfb, 0x09, 0x03, 0x04, 0x03, 0xb8, 0x01, 0x02, 0xb6, 0x59, - 0x06, 0x04, 0xfd, 0x0b, 0x01, 0xfe, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, - 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x31, - 0x30, 0x01, 0x23, 0x11, 0x21, 0x35, 0x21, 0x33, 0x21, 0x15, 0x21, 0x11, - 0x23, 0x01, 0x15, 0x21, 0x35, 0x02, 0x6a, 0x91, 0xfe, 0x1d, 0x02, 0x74, - 0xd7, 0x02, 0x74, 0xfe, 0x1d, 0x91, 0x02, 0x74, 0xfa, 0x41, 0xfd, 0x93, - 0x03, 0xde, 0x91, 0x91, 0xfc, 0x22, 0x05, 0xd7, 0x91, 0x91, 0x00, 0x00, - 0x00, 0x02, 0xff, 0xf6, 0x01, 0x71, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x07, - 0x00, 0x0b, 0x00, 0x42, 0xb7, 0x00, 0x08, 0x08, 0x0c, 0x05, 0x02, 0x0c, - 0x02, 0xb8, 0x01, 0x06, 0xb6, 0x5b, 0x07, 0x0b, 0x0b, 0x0d, 0x09, 0x08, - 0xb8, 0x01, 0x02, 0x40, 0x09, 0x59, 0x09, 0xfd, 0x03, 0xfa, 0x05, 0x01, - 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, 0xfb, 0x00, 0x3f, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x03, 0x35, - 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x0a, 0x02, - 0x97, 0x91, 0x02, 0x97, 0xfa, 0x41, 0x05, 0xbf, 0x02, 0xd9, 0x91, 0x03, - 0xde, 0xfc, 0x22, 0x91, 0xfe, 0x98, 0x91, 0x91, 0x00, 0x01, 0xff, 0xf6, - 0x02, 0x25, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x0b, 0x00, 0x40, 0xb5, 0x0b, - 0x0d, 0x09, 0x06, 0x0c, 0x06, 0xb8, 0x01, 0x07, 0xb4, 0x5b, 0x05, 0x02, - 0x0c, 0x02, 0xb8, 0x01, 0x04, 0x40, 0x0b, 0x5b, 0x00, 0x0c, 0x07, 0x03, - 0xfa, 0x09, 0x05, 0x01, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb2, 0x59, 0x01, - 0xfc, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x33, 0x18, 0x3f, 0x33, 0x11, - 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x21, 0x15, 0x0a, 0x01, 0xe3, 0x91, 0xd7, 0x91, 0x01, 0xe3, 0x02, 0x25, - 0x91, 0x04, 0x92, 0xfb, 0x6e, 0x04, 0x92, 0xfb, 0x6e, 0x91, 0x00, 0x00, - 0x00, 0x03, 0xff, 0xf6, 0x01, 0x71, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x05, - 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x52, 0xb7, 0x09, 0x0c, 0x0c, 0x10, 0x08, - 0x0b, 0x10, 0x0b, 0xb8, 0x01, 0x04, 0xb4, 0x5b, 0x02, 0x05, 0x10, 0x05, - 0xb8, 0x01, 0x07, 0xb6, 0x5b, 0x04, 0x0f, 0x0f, 0x11, 0x0d, 0x0c, 0xb8, - 0x01, 0x02, 0xb6, 0x59, 0x0d, 0xfd, 0x05, 0x09, 0x0a, 0x09, 0xb8, 0x01, - 0x02, 0xb6, 0x59, 0x02, 0x0a, 0xfb, 0x00, 0x06, 0xfa, 0x00, 0x3f, 0x33, - 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x33, - 0x11, 0x21, 0x35, 0x21, 0x01, 0x35, 0x21, 0x15, 0x03, 0x41, 0x91, 0x01, - 0xe3, 0xfd, 0x8c, 0xfe, 0x98, 0x91, 0xfd, 0x8c, 0x01, 0xe3, 0xfe, 0x1d, - 0x05, 0xbf, 0x07, 0x48, 0xfc, 0x22, 0x91, 0x04, 0x6f, 0xfb, 0x91, 0x91, - 0xfe, 0x07, 0x91, 0x91, 0x00, 0x01, 0xff, 0xf6, 0xfd, 0x93, 0x05, 0xb5, - 0x07, 0x48, 0x00, 0x13, 0x00, 0x5a, 0x40, 0x0d, 0x0b, 0x0f, 0x0f, 0x15, - 0x0d, 0x09, 0x10, 0x10, 0x06, 0x02, 0x13, 0x14, 0x13, 0xb8, 0x01, 0x06, - 0x40, 0x0d, 0x5b, 0x04, 0x00, 0x00, 0x14, 0x12, 0xfe, 0x07, 0xfa, 0x0c, - 0x04, 0x05, 0x04, 0xb8, 0x01, 0x02, 0xb7, 0x59, 0x09, 0x05, 0xfb, 0x10, - 0x00, 0x01, 0x00, 0xb8, 0x01, 0x02, 0xb3, 0x59, 0x0d, 0x01, 0xfd, 0x00, - 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, - 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x0a, 0x02, 0x97, 0xfd, - 0x69, 0x02, 0x97, 0x91, 0x02, 0x97, 0xfd, 0x69, 0x02, 0x97, 0xfd, 0x69, - 0x91, 0x01, 0x71, 0x91, 0xd7, 0x91, 0x03, 0xde, 0xfc, 0x22, 0x91, 0xd7, - 0x91, 0xfc, 0x22, 0x03, 0xde, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf6, - 0xfd, 0x93, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x13, 0x00, 0x56, 0x40, 0x09, - 0x04, 0x15, 0x12, 0x09, 0x09, 0x0f, 0x0c, 0x14, 0x0c, 0xb8, 0x01, 0x04, - 0xb7, 0x5b, 0x02, 0x05, 0x05, 0x13, 0x08, 0x14, 0x08, 0xb8, 0x01, 0x07, - 0x40, 0x0b, 0x5b, 0x0d, 0x14, 0x00, 0x10, 0xfa, 0x09, 0x05, 0x0d, 0x0e, - 0x0d, 0xb8, 0x01, 0x02, 0xb7, 0x59, 0x12, 0x02, 0x0e, 0xfc, 0x07, 0x0b, - 0xfe, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x33, - 0x18, 0x3f, 0x33, 0x11, 0x01, 0x33, 0x2b, 0x11, 0x01, 0x33, 0x33, 0x11, - 0x33, 0x2b, 0x11, 0x01, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, - 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x03, 0x41, 0x91, 0x01, - 0xe3, 0xfe, 0x1d, 0x91, 0xd7, 0x91, 0xfe, 0x1d, 0x01, 0xe3, 0x91, 0xd7, - 0x07, 0x48, 0xfb, 0x6e, 0x91, 0xfb, 0x6e, 0x04, 0x92, 0xfb, 0x6e, 0x04, - 0x92, 0x91, 0x04, 0x92, 0xfb, 0x6e, 0x00, 0x00, 0x00, 0x04, 0xff, 0xf6, - 0xfd, 0x93, 0x05, 0xb5, 0x07, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, - 0x00, 0x17, 0x00, 0x6d, 0xb6, 0x02, 0x0f, 0x0f, 0x05, 0x0c, 0x18, 0x0c, - 0xb8, 0x01, 0x07, 0x40, 0x0c, 0x5b, 0x15, 0x09, 0x09, 0x18, 0x14, 0x0b, - 0x0b, 0x17, 0x08, 0x18, 0x08, 0xb8, 0x01, 0x04, 0x40, 0x09, 0x5b, 0x04, - 0x0e, 0x0e, 0x19, 0x05, 0x15, 0x16, 0x15, 0xb8, 0x01, 0x02, 0x40, 0x0b, - 0x59, 0x02, 0x16, 0xfb, 0x00, 0x12, 0xfa, 0x0f, 0x09, 0x0a, 0x09, 0xb8, - 0x01, 0x02, 0xb6, 0x59, 0x0c, 0x0a, 0xfd, 0x11, 0x07, 0xfe, 0x00, 0x3f, - 0x33, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x33, 0x3f, 0x33, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, - 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2b, 0x11, 0x01, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x03, - 0x23, 0x11, 0x21, 0x35, 0x21, 0x33, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, - 0x33, 0x11, 0x21, 0x35, 0x21, 0x03, 0x41, 0x91, 0x01, 0xe3, 0xfd, 0x8c, - 0xd7, 0x91, 0xfe, 0x1d, 0x02, 0x74, 0xd7, 0x02, 0x74, 0xfe, 0x1d, 0x91, - 0xfe, 0x98, 0x91, 0xfd, 0x8c, 0x01, 0xe3, 0x07, 0x48, 0xfc, 0x22, 0x91, - 0xfa, 0xba, 0x03, 0xde, 0x91, 0x91, 0xfc, 0x22, 0x09, 0xb5, 0xfb, 0x91, - 0x91, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x6d, 0x05, 0xab, - 0x07, 0x48, 0x00, 0x03, 0x00, 0x12, 0xb6, 0x00, 0x05, 0x01, 0x04, 0x02, - 0xfa, 0x01, 0x00, 0x2f, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x11, 0x21, 0x05, 0xab, 0xfa, 0x55, 0x05, 0xab, 0x02, 0x6d, - 0x04, 0xdb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfd, 0x93, 0x05, 0xab, - 0x02, 0x6d, 0x00, 0x03, 0x00, 0x12, 0xb6, 0x00, 0x05, 0x01, 0x04, 0x02, - 0x01, 0xfe, 0x00, 0x3f, 0x2f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x11, 0x21, 0x05, 0xab, 0xfa, 0x55, 0x05, 0xab, 0xfd, 0x93, - 0x04, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfd, 0x93, 0x05, 0xab, - 0x07, 0x48, 0x00, 0x03, 0x00, 0x13, 0xb7, 0x00, 0x05, 0x01, 0x04, 0x02, - 0xfa, 0x01, 0xfe, 0x00, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x21, 0x11, 0x21, 0x05, 0xab, 0xfa, 0x55, 0x05, 0xab, 0xfd, - 0x93, 0x09, 0xb5, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfd, 0x93, 0x02, 0xd6, - 0x07, 0x48, 0x00, 0x03, 0x00, 0x13, 0xb7, 0x00, 0x05, 0x01, 0x04, 0x02, - 0xfa, 0x01, 0xfe, 0x00, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x12, 0x39, 0x31, - 0x30, 0x01, 0x21, 0x11, 0x21, 0x02, 0xd6, 0xfd, 0x2a, 0x02, 0xd6, 0xfd, - 0x93, 0x09, 0xb5, 0x00, 0x00, 0x01, 0x02, 0xd5, 0xfd, 0x93, 0x05, 0xab, - 0x07, 0x48, 0x00, 0x03, 0x00, 0x13, 0xb7, 0x01, 0x04, 0x00, 0x05, 0x02, - 0xfa, 0x01, 0xfe, 0x00, 0x3f, 0x3f, 0x11, 0x01, 0x33, 0x12, 0x39, 0x31, - 0x30, 0x01, 0x21, 0x11, 0x21, 0x05, 0xab, 0xfd, 0x2a, 0x02, 0xd6, 0xfd, - 0x93, 0x09, 0xb5, 0x00, 0x00, 0x2a, 0x00, 0x67, 0xfd, 0xf5, 0x05, 0xab, - 0x06, 0xa3, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, - 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, - 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, - 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, - 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, - 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, - 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, - 0x00, 0xa7, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, - 0x11, 0x33, 0x15, 0x23, 0x67, 0x68, 0x68, 0x01, 0x9e, 0x68, 0x68, 0x01, - 0xa0, 0x67, 0x67, 0xfd, 0x91, 0x68, 0x68, 0x01, 0x9f, 0x68, 0x68, 0x01, - 0x9f, 0x68, 0x68, 0xcf, 0x67, 0x67, 0xfe, 0x60, 0x68, 0x68, 0xfe, 0x62, - 0x68, 0x68, 0x04, 0x0d, 0x68, 0x68, 0xfe, 0x61, 0x68, 0x68, 0xfe, 0x61, - 0x68, 0x68, 0xcf, 0x68, 0x68, 0x01, 0x9e, 0x68, 0x68, 0x01, 0xa0, 0x67, - 0x67, 0xcf, 0x68, 0x68, 0xfe, 0x61, 0x68, 0x68, 0xfe, 0x61, 0x68, 0x68, - 0xcf, 0x68, 0x68, 0x01, 0x9e, 0x68, 0x68, 0x01, 0xa0, 0x67, 0x67, 0xfd, - 0x91, 0x68, 0x68, 0x01, 0x9f, 0x68, 0x68, 0x01, 0x9f, 0x68, 0x68, 0xcf, - 0x67, 0x67, 0xfe, 0x60, 0x68, 0x68, 0xfe, 0x62, 0x68, 0x68, 0xcf, 0x68, - 0x68, 0x01, 0x9f, 0x68, 0x68, 0x01, 0x9f, 0x68, 0x68, 0xfc, 0xc2, 0x68, - 0x68, 0x01, 0x9f, 0x68, 0x68, 0x01, 0x9f, 0x68, 0x68, 0xfb, 0xf3, 0x68, - 0x68, 0x01, 0x9e, 0x68, 0x68, 0x01, 0xa0, 0x67, 0x67, 0x01, 0x9e, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x05, - 0x22, 0x62, 0x62, 0x62, 0x62, 0x62, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x62, 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x07, 0xed, 0x62, 0x62, 0x62, 0x62, 0x62, 0x01, 0x23, 0x60, 0x60, 0x60, - 0x60, 0x60, 0xfe, 0xdf, 0x62, 0xfe, 0xdf, 0x60, 0xfe, 0xdd, 0x60, 0xfe, - 0xdd, 0x61, 0xfe, 0xde, 0x61, 0x07, 0xee, 0x60, 0x00, 0x54, 0x00, 0x00, - 0xfd, 0xf5, 0x05, 0xab, 0x06, 0xa3, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, - 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, - 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, - 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, - 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x6b, - 0x00, 0x6f, 0x00, 0x73, 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, - 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, - 0x00, 0x9f, 0x00, 0xa3, 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, - 0x00, 0xb7, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0xc3, 0x00, 0xc7, 0x00, 0xcb, - 0x00, 0xcf, 0x00, 0xd3, 0x00, 0xd7, 0x00, 0xdb, 0x00, 0xdf, 0x00, 0xe3, - 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, - 0x00, 0xff, 0x01, 0x03, 0x01, 0x07, 0x01, 0x0b, 0x01, 0x0f, 0x01, 0x13, - 0x01, 0x17, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x23, 0x01, 0x27, 0x01, 0x2b, - 0x01, 0x2f, 0x01, 0x33, 0x01, 0x37, 0x01, 0x3b, 0x01, 0x3f, 0x01, 0x43, - 0x01, 0x47, 0x01, 0x4b, 0x01, 0x4f, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x25, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, - 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, - 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, - 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, - 0x27, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, - 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, - 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, - 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, - 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, - 0x11, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x67, 0x68, 0x68, 0xcf, - 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xcf, - 0x68, 0x68, 0xfb, 0x8c, 0x67, 0x67, 0xcf, 0x67, 0x67, 0xcf, 0x67, 0x67, - 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x67, 0x67, 0xfc, 0x5a, 0x68, - 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x68, - 0x68, 0xcf, 0x68, 0x68, 0xfb, 0x8c, 0x67, 0x67, 0xcf, 0x67, 0x67, 0xcf, - 0x67, 0x67, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x67, 0x67, 0xfc, - 0x5a, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, - 0xd0, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xfb, 0x8c, 0x67, 0x67, 0x01, 0x9e, - 0x67, 0x67, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x67, 0x67, 0xfc, - 0xc2, 0x67, 0x67, 0x03, 0xa5, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, - 0x68, 0xd0, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0x67, 0x67, - 0x67, 0xcf, 0x67, 0x67, 0xcf, 0x67, 0x67, 0xcf, 0x68, 0x68, 0xd0, 0x68, - 0x68, 0xd0, 0x67, 0x67, 0x67, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, - 0x68, 0xd0, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0x67, 0x67, - 0x67, 0xcf, 0x67, 0x67, 0xcf, 0x67, 0x67, 0xcf, 0x68, 0x68, 0xd0, 0x68, - 0x68, 0xd0, 0x67, 0x67, 0xfb, 0xf3, 0x67, 0x67, 0xcf, 0x67, 0x67, 0xcf, - 0x67, 0x67, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, 0xd0, 0x67, 0x67, 0xfc, - 0x5a, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xd0, 0x68, 0x68, - 0xd0, 0x68, 0x68, 0xcf, 0x68, 0x68, 0xcf, 0x68, 0x68, 0x67, 0x67, 0x67, - 0x67, 0x68, 0x68, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x67, 0x67, 0x67, - 0x67, 0x68, 0x68, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x67, 0x67, 0x67, - 0x67, 0x67, 0x67, 0x68, 0x68, 0x05, 0x22, 0x62, 0x62, 0x62, 0x62, 0x62, - 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x62, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x07, 0xed, 0x62, 0x62, 0x62, 0x62, - 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x01, 0x23, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xfe, 0xdf, 0x62, 0x61, - 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x61, 0x62, - 0x5e, 0x62, 0x61, 0x60, 0x60, 0x07, 0xed, 0x62, 0x01, 0x23, 0x60, 0x00, - 0x00, 0x43, 0x00, 0x00, 0xfd, 0x93, 0x05, 0xd5, 0x06, 0xa3, 0x00, 0x49, - 0x00, 0x4d, 0x00, 0x51, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5d, 0x00, 0x61, - 0x00, 0x65, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x79, - 0x00, 0x7d, 0x00, 0x81, 0x00, 0x85, 0x00, 0x89, 0x00, 0x8d, 0x00, 0x91, - 0x00, 0x95, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa5, 0x00, 0xa9, - 0x00, 0xad, 0x00, 0xb1, 0x00, 0xb5, 0x00, 0xb9, 0x00, 0xbd, 0x00, 0xc1, - 0x00, 0xc5, 0x00, 0xc9, 0x00, 0xcd, 0x00, 0xd1, 0x00, 0xd5, 0x00, 0xd9, - 0x00, 0xdd, 0x00, 0xe1, 0x00, 0xe5, 0x00, 0xe9, 0x00, 0xed, 0x00, 0xf1, - 0x00, 0xf5, 0x00, 0xf9, 0x00, 0xfd, 0x01, 0x01, 0x01, 0x05, 0x01, 0x09, - 0x01, 0x0d, 0x01, 0x11, 0x01, 0x15, 0x01, 0x19, 0x01, 0x1d, 0x01, 0x21, - 0x01, 0x25, 0x01, 0x29, 0x01, 0x2d, 0x01, 0x31, 0x01, 0x35, 0x01, 0x39, - 0x01, 0x3d, 0x01, 0x41, 0x01, 0x45, 0x01, 0x49, 0x01, 0x4d, 0x01, 0x51, - 0x00, 0x00, 0x01, 0x21, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, - 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, - 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x33, 0x11, 0x23, 0x15, 0x33, - 0x11, 0x23, 0x15, 0x33, 0x11, 0x23, 0x15, 0x33, 0x11, 0x23, 0x15, 0x33, - 0x11, 0x23, 0x15, 0x33, 0x01, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x17, 0x23, 0x15, 0x33, - 0x27, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, - 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x05, 0x23, 0x15, 0x33, 0x37, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x05, 0x15, 0x33, 0x35, - 0x21, 0x15, 0x33, 0x35, 0x07, 0x35, 0x23, 0x15, 0x25, 0x15, 0x33, 0x35, - 0x13, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, - 0x23, 0x35, 0x23, 0x15, 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x13, 0x35, 0x23, 0x15, - 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, - 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x33, 0x15, 0x33, 0x35, 0x13, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, - 0x27, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, 0x01, 0x23, 0x15, 0x33, - 0x27, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, - 0x01, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x17, 0x23, 0x15, 0x33, - 0x27, 0x23, 0x15, 0x33, 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x07, 0x23, 0x15, 0x33, 0x37, 0x15, 0x33, 0x35, 0x05, 0x15, 0x33, 0x35, - 0x17, 0x35, 0x23, 0x15, 0x17, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, - 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x13, 0x35, 0x23, 0x15, - 0x23, 0x35, 0x23, 0x15, 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, - 0x13, 0x23, 0x15, 0x33, 0x27, 0x23, 0x15, 0x33, 0x13, 0x23, 0x15, 0x33, - 0x27, 0x23, 0x15, 0x33, 0x05, 0xd5, 0xfa, 0x2b, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, - 0x6b, 0x6b, 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, - 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0xfa, 0x95, 0x6b, 0x6a, - 0x6b, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0xd6, 0x6b, 0x6b, 0xd6, - 0x6a, 0x6a, 0xd5, 0x6a, 0x6a, 0xd5, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, - 0x6b, 0xfd, 0xea, 0x6a, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0xfc, - 0xaa, 0x6b, 0x01, 0x3f, 0x6b, 0xd5, 0x6b, 0x01, 0xab, 0x6b, 0x6b, 0x6b, - 0x6b, 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, - 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, - 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0xd6, 0x6b, 0x6b, - 0xd6, 0x6a, 0x6a, 0xd5, 0x6a, 0x6a, 0x02, 0x16, 0x6b, 0x6b, 0xd6, 0x6b, - 0x6b, 0xd5, 0x6b, 0x6b, 0xd5, 0x6b, 0x6b, 0x02, 0xeb, 0x6b, 0x6a, 0x6b, - 0x6a, 0x6a, 0x6a, 0xd5, 0x6a, 0x6a, 0xd5, 0x6b, 0x6a, 0x6b, 0x6b, 0x6a, - 0x6a, 0x6b, 0x6a, 0xfe, 0x56, 0x6b, 0xd5, 0x6b, 0xd5, 0x6a, 0x6b, 0x6a, - 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6a, 0x6b, - 0x6a, 0x6a, 0x6a, 0xd5, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0xd5, 0x6b, 0x6b, - 0xfd, 0x93, 0x01, 0x22, 0x61, 0x01, 0x22, 0x61, 0x01, 0x23, 0x60, 0x01, - 0x21, 0x62, 0x01, 0x21, 0x62, 0x01, 0x21, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xc1, 0x62, 0xfe, 0xdf, - 0x60, 0xfe, 0xdd, 0x60, 0xfe, 0xdd, 0x60, 0xfe, 0xdd, 0x5e, 0xfe, 0xdd, - 0x60, 0x06, 0x6a, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xc0, - 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x61, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x60, 0x60, 0xc0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0xc3, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0xfe, 0xdf, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x5e, - 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0xfe, 0xdf, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, - 0x60, 0x60, 0x06, 0xcd, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x01, - 0x22, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0xfe, 0xdf, 0x60, 0x60, - 0x60, 0x60, 0xc0, 0x62, 0x62, 0x62, 0x61, 0x60, 0x60, 0x60, 0x60, 0xc0, - 0x60, 0x60, 0x60, 0x60, 0xc3, 0x60, 0x60, 0x60, 0x60, 0x60, 0xc1, 0x61, - 0x61, 0x61, 0x61, 0x62, 0x5e, 0x5e, 0x5e, 0x5e, 0xfe, 0xdf, 0x61, 0x61, - 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x06, 0xcd, 0x62, 0x62, 0x62, - 0x01, 0x22, 0x62, 0x62, 0x62, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, - 0x00, 0x75, 0x04, 0x5a, 0x04, 0x54, 0x00, 0x03, 0x00, 0x11, 0xb5, 0x01, - 0x00, 0x05, 0x04, 0x03, 0x01, 0x00, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x31, 0x30, 0x13, 0x21, 0x11, 0x21, 0x7b, 0x03, 0xdf, 0xfc, 0x21, - 0x04, 0x54, 0xfc, 0x21, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x04, 0xcf, - 0x04, 0xc9, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1e, 0x40, 0x0c, 0x04, 0x00, - 0x07, 0x01, 0x00, 0x01, 0x08, 0x09, 0x05, 0x03, 0x04, 0x00, 0x00, 0x2f, - 0xcd, 0x2f, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x13, 0x21, 0x11, 0x21, 0x13, 0x11, 0x21, 0x11, 0x06, 0x04, - 0xc9, 0xfb, 0x37, 0x4c, 0x04, 0x31, 0x04, 0xc9, 0xfb, 0x37, 0x04, 0x7d, - 0xfb, 0xcf, 0x04, 0x31, 0x00, 0x01, 0x00, 0x6d, 0x01, 0x7f, 0x02, 0x69, - 0x03, 0x7b, 0x00, 0x03, 0x00, 0x16, 0x40, 0x09, 0x03, 0x02, 0x05, 0x04, - 0x02, 0x50, 0x01, 0x01, 0x01, 0x00, 0x2f, 0x5d, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x31, 0x30, 0x01, 0x21, 0x11, 0x21, 0x02, 0x69, 0xfe, 0x04, - 0x01, 0xfc, 0x01, 0x7f, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6d, - 0x01, 0x7f, 0x02, 0x69, 0x03, 0x7b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2a, - 0x40, 0x16, 0x05, 0x03, 0x06, 0x02, 0x03, 0x02, 0x09, 0x08, 0xff, 0x06, - 0x01, 0x06, 0x02, 0x07, 0x00, 0x01, 0x10, 0x01, 0x50, 0x01, 0x03, 0x01, - 0x00, 0x2f, 0x5d, 0xcd, 0x2f, 0xcd, 0x71, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x21, 0x03, 0x11, - 0x21, 0x11, 0x02, 0x69, 0xfe, 0x04, 0x01, 0xfc, 0x4c, 0xfe, 0x9c, 0x01, - 0x7f, 0x01, 0xfc, 0xfe, 0x50, 0x01, 0x62, 0xfe, 0x9e, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x68, 0x00, 0x03, - 0x00, 0x12, 0xb6, 0x01, 0x00, 0x05, 0x04, 0x00, 0x03, 0x12, 0x00, 0x3f, - 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x11, 0x21, 0x11, 0x21, - 0x08, 0x00, 0xf8, 0x00, 0x02, 0x68, 0xfd, 0x98, 0x00, 0x01, 0x01, 0x9e, - 0x00, 0x00, 0x06, 0x4c, 0x04, 0xae, 0x00, 0x02, 0x00, 0x15, 0x40, 0x09, - 0x02, 0x01, 0x00, 0x03, 0x03, 0x04, 0x01, 0x00, 0x12, 0x00, 0x3f, 0xcd, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x21, 0x09, 0x01, 0x01, 0x9e, - 0x02, 0x58, 0x02, 0x56, 0x04, 0xae, 0xfb, 0x52, 0x00, 0x01, 0x01, 0x91, - 0xff, 0xe5, 0x06, 0x5a, 0x04, 0xac, 0x00, 0x02, 0x00, 0x12, 0xb6, 0x01, - 0x00, 0x04, 0x03, 0x00, 0x02, 0x13, 0x00, 0x3f, 0xcd, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x31, 0x30, 0x09, 0x02, 0x01, 0x91, 0x04, 0xc9, 0xfb, 0x37, - 0x04, 0xac, 0xfd, 0x9e, 0xfd, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9e, - 0xff, 0xe5, 0x06, 0x4c, 0x04, 0x93, 0x00, 0x02, 0x00, 0x15, 0x40, 0x09, - 0x02, 0x01, 0x00, 0x03, 0x04, 0x03, 0x02, 0x01, 0x13, 0x00, 0x3f, 0xcd, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x09, 0x02, 0x06, 0x4c, 0xfd, - 0xaa, 0xfd, 0xa8, 0x04, 0x93, 0xfb, 0x52, 0x04, 0xae, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x91, 0xff, 0xe5, 0x06, 0x5a, 0x04, 0xac, 0x00, 0x02, - 0x00, 0x12, 0xb6, 0x00, 0x02, 0x04, 0x03, 0x00, 0x01, 0x13, 0x00, 0x3f, - 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x11, 0x01, 0x06, - 0x5a, 0xfb, 0x37, 0x04, 0xac, 0xfb, 0x39, 0x02, 0x65, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x03, 0xee, 0x05, 0xa0, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x31, 0x40, 0x17, 0x00, 0x01, 0x08, 0x03, 0x04, 0x08, - 0x03, 0x06, 0x06, 0x05, 0x07, 0x02, 0x09, 0x05, 0x02, 0x05, 0x0a, 0x0b, - 0x06, 0x03, 0x04, 0x08, 0x01, 0x00, 0x2f, 0x33, 0x3f, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x12, 0x39, 0x11, 0x17, 0x33, - 0x11, 0x33, 0x33, 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, 0x33, 0x09, 0x04, - 0x02, 0x23, 0x52, 0xfe, 0x37, 0x01, 0xc9, 0x52, 0x01, 0xcb, 0xfe, 0x0e, - 0xfe, 0x9e, 0x01, 0x62, 0x01, 0x60, 0x02, 0xcf, 0x02, 0xd1, 0xfd, 0x31, - 0x02, 0x35, 0xfd, 0xcb, 0xfd, 0xc2, 0x02, 0x3e, 0x00, 0x02, 0x00, 0xa7, - 0x00, 0xa2, 0x04, 0x2e, 0x04, 0x29, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x1e, - 0x40, 0x0c, 0x10, 0x00, 0x18, 0x08, 0x00, 0x08, 0x20, 0x21, 0x14, 0x0c, - 0x1c, 0x04, 0x00, 0x2f, 0xcd, 0xdc, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x01, 0x33, 0x32, - 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x37, 0x14, - 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, - 0x0e, 0x01, 0xa7, 0x78, 0xd1, 0x79, 0x7a, 0xd2, 0x79, 0x79, 0xd1, 0x7b, - 0x7a, 0xd0, 0x78, 0x56, 0x62, 0xa7, 0x63, 0x62, 0xa9, 0x64, 0x62, 0xab, - 0x62, 0x61, 0xa9, 0x62, 0x02, 0x64, 0x7a, 0xd2, 0x79, 0x79, 0xd3, 0x79, - 0x79, 0xd1, 0x78, 0x78, 0xd0, 0x7a, 0x62, 0xa9, 0x61, 0x60, 0xaa, 0x62, - 0x62, 0xab, 0x62, 0x62, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x62, - 0x00, 0x56, 0x04, 0x5f, 0x04, 0x52, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x17, - 0x00, 0x1f, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x47, - 0x00, 0x4f, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x67, 0x00, 0x6f, 0x00, 0x77, - 0x00, 0x7f, 0x00, 0x00, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x27, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x13, 0x14, 0x23, 0x22, - 0x35, 0x34, 0x33, 0x32, 0x17, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, - 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, - 0x35, 0x34, 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x07, 0x14, 0x23, 0x22, - 0x35, 0x34, 0x33, 0x32, 0x01, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x25, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, 0x13, 0x14, 0x23, 0x22, - 0x35, 0x34, 0x33, 0x32, 0x27, 0x14, 0x23, 0x22, 0x35, 0x34, 0x33, 0x32, - 0x03, 0xd8, 0x34, 0x38, 0x38, 0x34, 0x94, 0x34, 0x38, 0x38, 0x34, 0xf7, - 0x37, 0x35, 0x37, 0x35, 0x24, 0x34, 0x38, 0x38, 0x34, 0xfe, 0x37, 0x36, - 0x36, 0x36, 0x36, 0xad, 0x37, 0x35, 0x35, 0x37, 0x02, 0x52, 0x37, 0x35, - 0x35, 0x37, 0xfd, 0x1a, 0x36, 0x36, 0x36, 0x36, 0x02, 0x83, 0x34, 0x38, - 0x38, 0x34, 0x94, 0x34, 0x38, 0x38, 0x34, 0xfd, 0xae, 0x34, 0x38, 0x36, - 0x36, 0x24, 0x34, 0x38, 0x38, 0x34, 0x01, 0xc8, 0x36, 0x36, 0x36, 0x36, - 0xfe, 0x5c, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x37, 0x35, 0x35, 0x37, 0x94, - 0x36, 0x36, 0x36, 0x36, 0x03, 0x96, 0x36, 0x36, 0x36, 0x2c, 0x35, 0x35, - 0x37, 0xfe, 0xd3, 0x37, 0x37, 0x35, 0xe3, 0x36, 0x36, 0x36, 0x01, 0x93, - 0x37, 0x37, 0x35, 0x5a, 0x35, 0x35, 0x37, 0xfd, 0x77, 0x35, 0x35, 0x37, - 0x01, 0xb9, 0x36, 0x33, 0x39, 0xfd, 0x44, 0x35, 0x35, 0x37, 0x99, 0x34, - 0x34, 0x38, 0x02, 0x1c, 0x37, 0x37, 0x35, 0xe3, 0x36, 0x36, 0x36, 0xfe, - 0x03, 0x37, 0x37, 0x35, 0xe4, 0x35, 0x35, 0x37, 0xfe, 0xd5, 0x38, 0x34, - 0x38, 0x2a, 0x35, 0x35, 0x37, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb2, - 0x00, 0x89, 0x04, 0x23, 0x03, 0xfa, 0x00, 0x0d, 0x00, 0x16, 0x40, 0x09, - 0x04, 0x0a, 0x0f, 0x0e, 0x07, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x2f, 0x5d, - 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x32, 0x1e, 0x01, - 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x3e, 0x01, 0x02, 0x6a, - 0x6e, 0xd9, 0x72, 0xfe, 0xfe, 0xb7, 0xb6, 0xfe, 0xfe, 0x6f, 0xd7, 0x03, - 0xfa, 0x74, 0xda, 0x6a, 0xb7, 0xfe, 0xfe, 0x01, 0x03, 0xb6, 0x6c, 0xd5, - 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x04, 0xac, - 0x04, 0x83, 0x00, 0x03, 0x00, 0x13, 0x00, 0x1e, 0x40, 0x0c, 0x0c, 0x02, - 0x04, 0x01, 0x02, 0x01, 0x15, 0x14, 0x10, 0x01, 0x08, 0x00, 0x00, 0x2f, - 0xcd, 0x2f, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x33, 0x11, 0x21, 0x11, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, - 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x29, 0x04, - 0x83, 0xfc, 0x04, 0x76, 0xcb, 0x77, 0x76, 0xcd, 0x76, 0x76, 0xcc, 0x77, - 0x76, 0xcd, 0x75, 0x04, 0x83, 0xfb, 0x7d, 0x02, 0x41, 0x76, 0xcc, 0x76, - 0x76, 0xcd, 0x75, 0x76, 0xcd, 0x76, 0x77, 0xcc, 0x00, 0x03, 0x00, 0x29, - 0x00, 0x00, 0x04, 0xac, 0x04, 0x83, 0x00, 0x03, 0x00, 0x13, 0x00, 0x23, - 0x00, 0x2a, 0x40, 0x12, 0x0c, 0x1c, 0x1c, 0x02, 0x04, 0x14, 0x14, 0x01, - 0x02, 0x01, 0x25, 0x24, 0x08, 0x20, 0x01, 0x10, 0x18, 0x00, 0x00, 0x2f, - 0xdd, 0xce, 0x2f, 0xdd, 0xce, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x21, 0x11, - 0x01, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, - 0x23, 0x22, 0x2e, 0x01, 0x27, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, - 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x29, 0x04, 0x83, 0xfc, - 0x51, 0x62, 0xaa, 0x61, 0x61, 0xaa, 0x62, 0x62, 0xaa, 0x61, 0x61, 0xaa, - 0x62, 0x4d, 0x76, 0xcb, 0x77, 0x76, 0xcd, 0x76, 0x76, 0xcc, 0x77, 0x76, - 0xcd, 0x75, 0x04, 0x83, 0xfb, 0x7d, 0x02, 0x41, 0x61, 0xaa, 0x62, 0x62, - 0xaa, 0x61, 0x61, 0xaa, 0x62, 0x62, 0xaa, 0x61, 0x76, 0xcc, 0x76, 0x76, - 0xcd, 0x75, 0x76, 0xcd, 0x76, 0x77, 0xcc, 0x00, 0x00, 0x02, 0x00, 0x73, - 0x01, 0x85, 0x02, 0x63, 0x03, 0x75, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x28, - 0x40, 0x14, 0x0e, 0x00, 0x14, 0x07, 0x00, 0x07, 0x1b, 0x1a, 0x11, 0x40, - 0x0a, 0x90, 0x0a, 0x02, 0x1f, 0x0a, 0x01, 0x0a, 0x17, 0x03, 0x00, 0x2f, - 0xcd, 0x2f, 0x5d, 0x5d, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x02, 0x63, 0x97, 0x61, 0x44, 0x70, - 0x44, 0x93, 0x65, 0x67, 0x47, 0x4a, 0x4c, 0x66, 0x46, 0x46, 0x66, 0x62, - 0x4a, 0x4d, 0x5f, 0x02, 0x7d, 0x6b, 0x8d, 0x41, 0x72, 0x45, 0x67, 0x91, - 0x4a, 0x47, 0x67, 0x46, 0x66, 0x66, 0x46, 0x47, 0x65, 0x69, 0x00, 0x00, - 0x00, 0x05, 0x01, 0xb1, 0xff, 0xe5, 0x06, 0x79, 0x04, 0xac, 0x00, 0x0b, - 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x70, 0x40, 0x3f, - 0x0c, 0x3a, 0x19, 0x1f, 0x36, 0x2b, 0x25, 0x1f, 0x25, 0x00, 0x13, 0x06, - 0x00, 0x06, 0x3c, 0x3b, 0x28, 0x1c, 0x22, 0x2e, 0x22, 0x35, 0x31, 0x68, - 0x31, 0x01, 0x59, 0x31, 0x01, 0x47, 0x31, 0x01, 0x19, 0x31, 0x01, 0x31, - 0x33, 0x38, 0x0f, 0x22, 0x5f, 0x22, 0x6f, 0x22, 0x03, 0x08, 0x38, 0x40, - 0x09, 0x0e, 0x48, 0x22, 0x38, 0x22, 0x38, 0x03, 0x0f, 0x0f, 0x09, 0x01, - 0x09, 0x16, 0x03, 0x00, 0x2f, 0xcd, 0xdc, 0x5d, 0xcd, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x2b, 0x5e, 0x5d, 0x10, 0xcd, 0x33, 0x5d, 0x5d, 0x5d, 0x5d, - 0x11, 0x33, 0x11, 0x33, 0x10, 0xcd, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x32, - 0x31, 0x30, 0x01, 0x14, 0x00, 0x07, 0x22, 0x00, 0x27, 0x34, 0x00, 0x21, - 0x20, 0x00, 0x07, 0x34, 0x00, 0x27, 0x22, 0x07, 0x06, 0x15, 0x14, 0x00, - 0x17, 0x32, 0x00, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x01, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, - 0x27, 0x06, 0x79, 0xfe, 0x98, 0xfc, 0xfd, 0xfe, 0x9a, 0x01, 0x01, 0x62, - 0x01, 0x02, 0x01, 0x02, 0x01, 0x62, 0x5a, 0xfe, 0xce, 0xd8, 0xda, 0x97, - 0x99, 0x01, 0x32, 0xd8, 0xd9, 0x01, 0x30, 0xfd, 0x5b, 0x2e, 0x20, 0x20, - 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x01, 0xd3, 0x2c, 0x20, 0x20, 0x2f, 0x2f, - 0x20, 0x20, 0x2c, 0xfd, 0xea, 0x4c, 0x93, 0x91, 0x4c, 0x3e, 0x62, 0xb9, - 0xb9, 0x62, 0x02, 0x48, 0xfe, 0xfe, 0x9c, 0x01, 0x01, 0x66, 0xfd, 0xfa, - 0x01, 0x6a, 0xfe, 0x95, 0xf9, 0xd9, 0x01, 0x32, 0x01, 0x9a, 0x99, 0xd9, - 0xd8, 0xfe, 0xce, 0x01, 0x01, 0x34, 0x01, 0x56, 0x20, 0x2e, 0x2e, 0x20, - 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x2d, 0x2d, 0xfe, - 0xbf, 0x89, 0x89, 0x23, 0xba, 0xba, 0x00, 0x00, 0x00, 0x04, 0x01, 0xd1, - 0xff, 0xe5, 0x06, 0x99, 0x04, 0xac, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, - 0x00, 0x2d, 0x00, 0x64, 0x40, 0x39, 0x24, 0x0c, 0x12, 0x28, 0x1e, 0x18, - 0x12, 0x18, 0x06, 0x00, 0x06, 0x00, 0x2e, 0x2f, 0x21, 0x15, 0x0f, 0x1b, - 0x0f, 0x29, 0x2d, 0x68, 0x2d, 0x01, 0x59, 0x2d, 0x01, 0x4b, 0x2d, 0x01, - 0x3d, 0x2d, 0x01, 0x2d, 0x2b, 0x26, 0x0f, 0x0f, 0x1f, 0x0f, 0x5f, 0x0f, - 0x6f, 0x0f, 0x04, 0x08, 0x4f, 0x26, 0x5f, 0x26, 0x02, 0x0f, 0x26, 0x0f, - 0x26, 0x09, 0x03, 0x00, 0x2f, 0xcc, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x5e, - 0x5d, 0x10, 0xce, 0x33, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x33, 0x11, 0x33, - 0x10, 0xce, 0x32, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x14, 0x00, 0x07, - 0x22, 0x00, 0x27, 0x34, 0x00, 0x21, 0x20, 0x00, 0x05, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x25, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x16, 0x33, 0x32, - 0x37, 0x27, 0x06, 0x23, 0x22, 0x27, 0x06, 0x99, 0xfe, 0x98, 0xfc, 0xfd, - 0xfe, 0x9a, 0x01, 0x01, 0x62, 0x01, 0x02, 0x01, 0x02, 0x01, 0x62, 0xfd, - 0x00, 0x2e, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x01, 0xd3, 0x2c, - 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x2c, 0xfd, 0xae, 0x62, 0xb9, 0xb9, - 0x62, 0x3e, 0x4c, 0x91, 0x93, 0x4c, 0x02, 0x48, 0xfe, 0xfe, 0x9c, 0x01, - 0x01, 0x66, 0xfd, 0xfa, 0x01, 0x6a, 0xfe, 0x95, 0x7a, 0x20, 0x2d, 0x2d, - 0x20, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x2e, - 0xfe, 0xdc, 0xba, 0xba, 0x23, 0x89, 0x89, 0x00, 0x00, 0x02, 0x01, 0x46, - 0xff, 0x73, 0x06, 0x0e, 0x04, 0x3b, 0x00, 0x2a, 0x00, 0x37, 0x00, 0x7e, - 0x40, 0x43, 0x35, 0x10, 0x0b, 0x07, 0x0a, 0x02, 0x2a, 0x2a, 0x16, 0x19, - 0x2e, 0x26, 0x22, 0x1d, 0x23, 0x23, 0x19, 0x0a, 0x03, 0x39, 0x38, 0x2b, - 0x2a, 0x02, 0x2a, 0x0c, 0x0b, 0x0b, 0x21, 0x22, 0x31, 0x19, 0x16, 0x19, - 0x08, 0x25, 0x2a, 0x0f, 0x1e, 0x22, 0x19, 0x2a, 0x22, 0x19, 0x19, 0x22, - 0x2a, 0x03, 0x01, 0x1c, 0x11, 0xdf, 0x17, 0xef, 0x17, 0x02, 0x17, 0x27, - 0x06, 0x6f, 0x01, 0x7f, 0x01, 0x8f, 0x01, 0x03, 0x01, 0x00, 0x2f, 0x5d, - 0x33, 0x33, 0x2f, 0x5d, 0x33, 0x33, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, - 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x39, 0x11, 0x33, 0x10, 0xcd, 0x10, - 0xcd, 0x33, 0x2f, 0xcd, 0x11, 0x33, 0x10, 0xcd, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x33, 0x15, 0x1e, 0x01, 0x17, - 0x37, 0x17, 0x07, 0x16, 0x17, 0x33, 0x15, 0x23, 0x06, 0x07, 0x17, 0x07, - 0x27, 0x0e, 0x02, 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x07, 0x27, 0x37, - 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x27, 0x37, 0x17, 0x36, 0x37, - 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, - 0x26, 0x03, 0x89, 0x42, 0x42, 0x63, 0x3c, 0xba, 0x2d, 0xb8, 0x56, 0x06, - 0xd7, 0xd7, 0x11, 0x4b, 0xb8, 0x31, 0xb6, 0x24, 0x4a, 0x3e, 0x35, 0x42, - 0x79, 0x64, 0xbc, 0x2b, 0xb6, 0x4e, 0x10, 0xd7, 0xd7, 0x0c, 0x50, 0xb4, - 0x28, 0xbd, 0x6e, 0x71, 0x1f, 0x8b, 0xc1, 0xc3, 0x89, 0x8b, 0x60, 0x63, - 0xc4, 0x04, 0x3b, 0xd9, 0x06, 0x27, 0x2d, 0xb6, 0x2d, 0xb8, 0x71, 0x74, - 0x3e, 0x7d, 0x60, 0xbc, 0x2b, 0xb6, 0x1a, 0x2a, 0x10, 0x08, 0xd9, 0xd9, - 0x11, 0x49, 0xb4, 0x2d, 0xb8, 0x64, 0x7d, 0x3e, 0x80, 0x5f, 0xb8, 0x31, - 0xb6, 0x4d, 0x0d, 0x3d, 0xc6, 0x88, 0x88, 0xc4, 0x61, 0x61, 0x8a, 0x88, - 0xc6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xda, 0x00, 0x50, 0x04, 0x26, - 0x04, 0x81, 0x00, 0x18, 0x00, 0x27, 0x00, 0x5c, 0x40, 0x33, 0x24, 0x10, - 0x0b, 0x12, 0x0e, 0x0e, 0x15, 0x00, 0x1d, 0x17, 0x04, 0x04, 0x00, 0x0b, - 0x03, 0x29, 0x28, 0x12, 0x15, 0x18, 0x0f, 0x18, 0x0e, 0xef, 0x00, 0xff, - 0x00, 0x02, 0x00, 0x20, 0x1f, 0x20, 0x2f, 0x20, 0x02, 0x18, 0x20, 0x18, - 0x20, 0x07, 0x40, 0x13, 0x01, 0x13, 0x19, 0x40, 0x25, 0x28, 0x48, 0x19, - 0x07, 0x00, 0x2f, 0xcd, 0x2b, 0x2f, 0x5d, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x5d, 0x10, 0xcd, 0x71, 0x32, 0x11, 0x33, 0x10, 0xcd, 0x32, 0x11, 0x12, - 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, - 0x11, 0x21, 0x35, 0x21, 0x13, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, - 0x32, 0x37, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x02, 0xdc, 0x4c, 0x6b, 0x44, - 0xae, 0x72, 0x76, 0x53, 0x56, 0x90, 0x6a, 0x01, 0x00, 0xff, 0x00, 0x4a, - 0xfe, 0xfe, 0x01, 0x02, 0x23, 0x38, 0x5c, 0x39, 0x7b, 0x52, 0x57, 0x3b, - 0x3d, 0x39, 0x5d, 0x02, 0x42, 0x0b, 0x4c, 0x7a, 0x4b, 0x7e, 0xa5, 0x56, - 0x53, 0x7a, 0x6d, 0xa2, 0x0d, 0xa6, 0x46, 0xfe, 0xfa, 0x01, 0x06, 0x46, - 0x02, 0x91, 0x35, 0x5f, 0x39, 0x56, 0x79, 0x3e, 0x3d, 0x54, 0x3a, 0x5f, - 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x51, 0x00, 0xfa, 0x04, 0xaf, - 0x04, 0x81, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x3e, 0x40, 0x21, 0x30, 0x2c, - 0x04, 0x1f, 0x03, 0x27, 0x36, 0x14, 0x21, 0x27, 0x21, 0x39, 0x3a, 0x2c, - 0x1f, 0x2a, 0x33, 0x00, 0x24, 0x80, 0x24, 0x02, 0x24, 0x2d, 0x90, 0x0b, - 0x01, 0x0b, 0x0f, 0x2a, 0x01, 0x08, 0x2a, 0x00, 0x2f, 0x5e, 0x5d, 0xcc, - 0x5d, 0xcd, 0xdc, 0x5d, 0xcd, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, 0x32, 0x31, 0x30, 0x01, 0x26, - 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x17, 0x16, 0x33, 0x32, 0x37, - 0x36, 0x33, 0x32, 0x15, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x14, 0x0f, - 0x01, 0x22, 0x2e, 0x01, 0x27, 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x22, 0x06, 0x15, 0x14, - 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03, 0xff, 0x93, 0x2b, 0x08, - 0x06, 0x06, 0x08, 0x21, 0x44, 0x3b, 0x58, 0x29, 0x24, 0x0d, 0x10, 0x06, - 0x10, 0x0c, 0x04, 0x04, 0x0e, 0x13, 0x25, 0x24, 0x0d, 0xed, 0x54, 0xaf, - 0x74, 0x74, 0xad, 0xa9, 0x7a, 0x47, 0x53, 0x9a, 0x59, 0x7c, 0x7e, 0x57, - 0x59, 0x7a, 0x7c, 0x04, 0x00, 0x2b, 0x2b, 0x05, 0x0d, 0x08, 0x09, 0x04, - 0x04, 0x11, 0x0d, 0x0c, 0x0e, 0x1b, 0x3c, 0x62, 0x4e, 0x33, 0x20, 0x09, - 0x06, 0x06, 0x41, 0x5a, 0x32, 0xee, 0x51, 0x6d, 0x7d, 0xae, 0xa3, 0x7a, - 0x78, 0xaa, 0x2b, 0x20, 0x7a, 0x59, 0x5f, 0x76, 0x7d, 0x58, 0x57, 0x7c, - 0x00, 0x01, 0x00, 0x3b, 0x00, 0x00, 0x04, 0x05, 0x04, 0xcf, 0x00, 0x21, - 0x00, 0x30, 0x40, 0x19, 0x12, 0x1c, 0x0b, 0x17, 0x0f, 0x06, 0x06, 0x17, - 0x1c, 0x03, 0x22, 0x23, 0x09, 0x0f, 0x19, 0x1f, 0x19, 0x2f, 0x19, 0x03, - 0x08, 0x19, 0x19, 0x11, 0x00, 0x00, 0x2f, 0x2f, 0x39, 0x2f, 0x5e, 0x5d, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x1e, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x14, 0x06, 0x23, - 0x22, 0x27, 0x1e, 0x02, 0x1f, 0x01, 0x21, 0x37, 0x32, 0x3e, 0x01, 0x3d, - 0x01, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x02, - 0x20, 0x19, 0x60, 0x97, 0x8d, 0x46, 0x02, 0x82, 0x57, 0x9d, 0x63, 0x03, - 0x4f, 0xa3, 0x84, 0x08, 0xfc, 0xe8, 0x06, 0x7c, 0xac, 0x57, 0x5a, 0xaa, - 0x59, 0x82, 0x59, 0x63, 0x8b, 0x84, 0x04, 0xcf, 0x60, 0xa9, 0x8b, 0x7e, - 0x84, 0x47, 0x60, 0x80, 0xbf, 0x9f, 0xa6, 0x5e, 0x09, 0x25, 0x25, 0x61, - 0xac, 0x91, 0x0e, 0xbf, 0x80, 0x5c, 0x59, 0x88, 0x52, 0x77, 0xba, 0x00, - 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x05, 0x04, 0x04, 0xc7, 0x00, 0x34, - 0x00, 0x38, 0x40, 0x1d, 0x02, 0x0f, 0x34, 0x28, 0x28, 0x1e, 0x18, 0x0f, - 0x04, 0x35, 0x36, 0x24, 0x2b, 0x08, 0x2f, 0x14, 0x20, 0x04, 0x0b, 0x1f, - 0x0b, 0x01, 0x12, 0x0b, 0x12, 0x0b, 0x01, 0x1b, 0x01, 0x00, 0x2f, 0x2f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x12, 0x17, 0x39, 0x32, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, - 0x37, 0x3e, 0x03, 0x35, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, - 0x34, 0x36, 0x37, 0x32, 0x17, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, - 0x32, 0x16, 0x15, 0x14, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, - 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x27, 0x1e, 0x03, 0x17, 0x04, - 0x46, 0xfc, 0xb6, 0x08, 0x87, 0x77, 0x5f, 0x35, 0x02, 0x39, 0xb2, 0x59, - 0x4d, 0x81, 0x46, 0x92, 0x5d, 0x3e, 0x64, 0x26, 0x11, 0x0b, 0xa2, 0x71, - 0x74, 0xa0, 0x45, 0x54, 0x10, 0x16, 0x27, 0x69, 0x44, 0x49, 0x9c, 0x74, - 0x38, 0x76, 0x5f, 0x3d, 0x05, 0x31, 0x6d, 0x7f, 0x72, 0x23, 0x1b, 0x36, - 0x78, 0x95, 0x4c, 0x2f, 0x78, 0x76, 0x4c, 0x7e, 0x4d, 0x73, 0x9e, 0x01, - 0x33, 0x41, 0x28, 0x25, 0x26, 0x79, 0x96, 0xa0, 0x6b, 0x56, 0x62, 0x28, - 0x03, 0x08, 0x4e, 0x4c, 0x74, 0x74, 0xa5, 0x31, 0x52, 0x69, 0x7e, 0x99, - 0x78, 0x35, 0x15, 0x00, 0x00, 0x01, 0x00, 0x66, 0xff, 0xe9, 0x04, 0x5a, - 0x04, 0x79, 0x00, 0x18, 0x00, 0x1c, 0x40, 0x0c, 0x00, 0x0d, 0x13, 0x0d, - 0x07, 0x03, 0x19, 0x1a, 0x0d, 0x10, 0x0a, 0x00, 0x00, 0x2f, 0x2f, 0x33, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x05, 0x2e, - 0x01, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, - 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x02, - 0x62, 0x16, 0x5b, 0xb0, 0x5a, 0x4b, 0x36, 0x8b, 0x65, 0x57, 0x8f, 0x26, - 0x22, 0x8e, 0x58, 0x61, 0x8f, 0x58, 0x6f, 0x8c, 0x81, 0x17, 0x56, 0xb6, - 0xec, 0x7b, 0x64, 0x81, 0x42, 0x6b, 0x89, 0x72, 0x78, 0x77, 0x75, 0x88, - 0x62, 0x56, 0xbe, 0x89, 0xb3, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, - 0xff, 0xe7, 0x03, 0xd2, 0x04, 0xc7, 0x00, 0x0c, 0x00, 0x1f, 0x40, 0x0c, - 0x0a, 0x06, 0x03, 0x00, 0x00, 0x0d, 0x0e, 0x03, 0x0a, 0x0a, 0x06, 0x00, - 0x00, 0x2f, 0x2f, 0x39, 0x19, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x31, 0x30, 0x01, 0x16, 0x00, 0x17, 0x06, 0x00, 0x07, - 0x26, 0x02, 0x26, 0x27, 0x36, 0x00, 0x02, 0x07, 0x48, 0x01, 0x09, 0x7a, - 0x44, 0xfe, 0xce, 0x53, 0x25, 0xb9, 0x94, 0x55, 0x74, 0x01, 0x03, 0x04, - 0xc7, 0x7d, 0xfe, 0x97, 0x89, 0x46, 0xfe, 0x69, 0x94, 0x47, 0x01, 0x05, - 0xbf, 0x66, 0x89, 0x01, 0x59, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc4, - 0x00, 0x1d, 0x03, 0x3b, 0x04, 0x81, 0x00, 0x19, 0x00, 0x2e, 0x40, 0x15, - 0x0a, 0x05, 0x02, 0x0e, 0x0e, 0x19, 0x14, 0x19, 0x05, 0x03, 0x1b, 0x1a, - 0x0d, 0x02, 0x02, 0x08, 0x08, 0x00, 0x17, 0x11, 0x00, 0x00, 0x2f, 0x2f, - 0xcd, 0x12, 0x39, 0x2f, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x33, 0x15, 0x17, - 0x16, 0x15, 0x14, 0x07, 0x23, 0x36, 0x35, 0x34, 0x26, 0x27, 0x11, 0x14, - 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x01, 0xe9, - 0x4c, 0x99, 0x6d, 0x5e, 0x2f, 0x39, 0x72, 0x40, 0x93, 0x6b, 0x39, 0x3a, - 0x7d, 0x4e, 0x2c, 0x2e, 0x04, 0x81, 0x64, 0xc1, 0x93, 0xaa, 0x96, 0x79, - 0x80, 0x78, 0x78, 0x9e, 0x0b, 0xfe, 0x06, 0x7b, 0x97, 0x36, 0x2e, 0x4d, - 0x74, 0x13, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0xff, 0xd5, 0x04, 0xef, - 0x04, 0x87, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x5c, 0x40, 0x14, 0x1e, 0x0c, - 0x0c, 0x00, 0x1d, 0x0f, 0x0f, 0x1a, 0x15, 0x1a, 0x07, 0x00, 0x04, 0x22, - 0x21, 0x0e, 0x1d, 0x1d, 0x0d, 0x1e, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x14, - 0x48, 0x1e, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x08, 0x0b, 0x48, 0x1e, 0x1e, - 0x1c, 0x12, 0x20, 0x1b, 0x1b, 0x1f, 0x1c, 0x0a, 0x20, 0x04, 0x01, 0x04, - 0x04, 0x18, 0x12, 0x00, 0x2f, 0xcd, 0x33, 0x2f, 0x5d, 0xcd, 0x2f, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0x2b, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x05, 0x11, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x17, 0x32, 0x17, 0x11, 0x25, 0x01, 0x25, 0x35, - 0x05, 0x04, 0xef, 0x36, 0x7b, 0x49, 0x39, 0x39, 0x7a, 0x4e, 0x30, 0x2a, - 0xfd, 0xda, 0x89, 0x73, 0x39, 0x3a, 0x7c, 0x4f, 0x2d, 0x2d, 0x02, 0xba, - 0xfd, 0x90, 0x02, 0x26, 0xfd, 0xda, 0x01, 0x44, 0x4e, 0x71, 0x54, 0x36, - 0x2f, 0x51, 0x6f, 0x12, 0x01, 0xc0, 0x95, 0xfe, 0x76, 0x75, 0x9b, 0x35, - 0x2d, 0x4c, 0x78, 0x03, 0x13, 0x02, 0xf0, 0xb2, 0xfe, 0x67, 0x95, 0x75, - 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0xff, 0x38, 0x03, 0xce, - 0x05, 0xcc, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x68, 0x40, 0x37, 0x18, 0x1f, - 0x12, 0x06, 0x06, 0x0f, 0x0b, 0x07, 0x1a, 0x16, 0x02, 0x02, 0x1c, 0x13, - 0x03, 0x07, 0x03, 0x00, 0x0d, 0x09, 0x00, 0x09, 0x21, 0x20, 0x17, 0x10, - 0x16, 0x1d, 0x12, 0x0c, 0x0d, 0x1b, 0x1a, 0x04, 0x1f, 0x08, 0x09, 0x09, - 0x08, 0x1f, 0x04, 0x1a, 0x1b, 0x0d, 0x0c, 0x12, 0x1d, 0x16, 0x10, 0x0c, - 0x03, 0x14, 0x07, 0x03, 0x12, 0x00, 0x3f, 0xc4, 0x2f, 0x12, 0x17, 0x39, - 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, - 0x33, 0x32, 0x31, 0x30, 0x01, 0x07, 0x11, 0x23, 0x11, 0x05, 0x11, 0x23, - 0x11, 0x07, 0x35, 0x37, 0x11, 0x07, 0x35, 0x37, 0x11, 0x33, 0x11, 0x25, - 0x11, 0x33, 0x11, 0x37, 0x15, 0x07, 0x11, 0x37, 0x05, 0x11, 0x05, 0x11, - 0x03, 0xce, 0xc8, 0x60, 0xfe, 0xb4, 0x60, 0xc8, 0xc8, 0xc8, 0xc8, 0x60, - 0x01, 0x4c, 0x60, 0xc8, 0xc8, 0xc8, 0xfe, 0xd8, 0xfe, 0xb4, 0x01, 0xbd, - 0x59, 0xfe, 0x9c, 0x01, 0x3d, 0xa0, 0xfe, 0x9b, 0x01, 0x3e, 0x59, 0x9f, - 0x59, 0x01, 0xf5, 0x59, 0x9f, 0x59, 0x01, 0x47, 0xfe, 0xe0, 0xa0, 0x01, - 0x5c, 0xfe, 0xcb, 0x59, 0x9f, 0x59, 0xfe, 0x0b, 0x59, 0x80, 0x01, 0xf5, - 0xa0, 0xfe, 0x0b, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x04, 0x2f, - 0x05, 0x81, 0x00, 0x15, 0x00, 0x77, 0x40, 0x47, 0x0d, 0x11, 0x0f, 0x0b, - 0x13, 0x13, 0x00, 0x06, 0x02, 0x02, 0x08, 0x04, 0x00, 0x00, 0x11, 0x14, - 0x03, 0x17, 0x16, 0x0e, 0x06, 0x07, 0x06, 0x60, 0x59, 0x12, 0x02, 0x03, - 0x02, 0x60, 0x59, 0x0f, 0x03, 0x40, 0x13, 0x16, 0x48, 0x00, 0x03, 0x10, - 0x03, 0x02, 0x03, 0x40, 0x0b, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x4f, - 0x07, 0x5f, 0x07, 0xef, 0x07, 0x06, 0x09, 0x03, 0x07, 0x07, 0x00, 0x09, - 0x03, 0x00, 0x13, 0x5f, 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, - 0x3f, 0x12, 0x39, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x1a, 0xce, 0x5d, 0x2b, - 0x32, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, - 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, - 0x11, 0x21, 0x15, 0xa8, 0x8f, 0x8f, 0x8f, 0x8f, 0xbf, 0x01, 0x84, 0xfe, - 0x7c, 0x01, 0x84, 0xfe, 0x7c, 0x02, 0xc8, 0x01, 0xe4, 0x85, 0x94, 0x85, - 0x01, 0xff, 0xfe, 0x01, 0x85, 0x94, 0x85, 0xfe, 0xb8, 0x9c, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xac, 0x05, 0xcc, 0x00, 0x13, - 0x00, 0x60, 0x40, 0x37, 0x0d, 0x11, 0x11, 0x13, 0x06, 0x02, 0x02, 0x08, - 0x04, 0x00, 0x00, 0x0f, 0x0b, 0x13, 0x13, 0x15, 0x14, 0x0e, 0x06, 0x07, - 0x06, 0x50, 0x59, 0x12, 0x02, 0x03, 0x02, 0x50, 0x59, 0x0f, 0x03, 0x40, - 0x13, 0x16, 0x48, 0x00, 0x03, 0x10, 0x03, 0x02, 0x03, 0x0b, 0x0f, 0x07, - 0x1f, 0x07, 0x2f, 0x07, 0x03, 0x07, 0x07, 0x09, 0x00, 0x00, 0x15, 0x00, - 0x3f, 0x3f, 0x39, 0x2f, 0x5d, 0x33, 0xc6, 0x5d, 0x2b, 0x32, 0x2b, 0x11, - 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x8a, 0x6e, - 0x6e, 0x6e, 0x6e, 0xb4, 0x6e, 0x6e, 0x6e, 0x6e, 0x02, 0x0c, 0x85, 0x94, - 0x85, 0x02, 0x22, 0xfd, 0xde, 0x85, 0x94, 0x85, 0xfd, 0xf4, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x04, 0x40, 0x05, 0x81, 0x00, 0x1b, - 0x00, 0x47, 0x40, 0x25, 0x0d, 0x19, 0x19, 0x0a, 0x06, 0x00, 0x00, 0x13, - 0x1a, 0x03, 0x1d, 0x1c, 0x02, 0x09, 0x09, 0x12, 0x0f, 0x16, 0x16, 0x05, - 0x80, 0x12, 0x40, 0x09, 0x0c, 0x48, 0x12, 0x12, 0x00, 0x0b, 0x03, 0x00, - 0x19, 0x5f, 0x59, 0x00, 0x12, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, - 0x39, 0x2f, 0x2b, 0x1a, 0xcc, 0x32, 0x11, 0x33, 0x11, 0x33, 0x2f, 0x33, - 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x33, 0x11, 0x27, 0x22, 0x06, 0x15, 0x23, 0x3e, 0x01, 0x33, 0x17, - 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x06, 0x23, - 0x22, 0x27, 0x11, 0x21, 0x15, 0xda, 0x23, 0x27, 0x1b, 0x82, 0x02, 0x6b, - 0x54, 0x26, 0xbf, 0x1c, 0x1a, 0x1f, 0x1a, 0x06, 0x82, 0x5a, 0x60, 0x21, - 0x1c, 0x02, 0xa7, 0x02, 0xb9, 0x04, 0x30, 0x2f, 0x68, 0x7c, 0x03, 0x02, - 0x42, 0xfd, 0x76, 0x05, 0x2f, 0x30, 0x72, 0x72, 0x05, 0xfe, 0x2a, 0x9c, - 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x04, 0xea, 0x05, 0x81, 0x00, 0x0e, - 0x00, 0x19, 0x00, 0x4c, 0x40, 0x28, 0x0f, 0x06, 0x17, 0x13, 0x0b, 0x0b, - 0x0e, 0x01, 0x0c, 0x0c, 0x15, 0x06, 0x03, 0x1b, 0x1a, 0x17, 0x0a, 0x5f, - 0x59, 0x16, 0x0e, 0x00, 0x0e, 0x60, 0x59, 0x13, 0x00, 0x17, 0x00, 0x17, - 0x00, 0x02, 0x0c, 0x12, 0x02, 0x12, 0x5f, 0x59, 0x02, 0x03, 0x00, 0x3f, - 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x2b, - 0x11, 0x00, 0x33, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x33, 0x11, 0x21, - 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x21, 0x11, 0x23, 0x11, 0x23, 0x25, - 0x10, 0x29, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x20, 0x1a, 0x8e, - 0x02, 0x51, 0xed, 0x01, 0x04, 0xfe, 0xfb, 0xe0, 0xfe, 0x62, 0xbf, 0x8e, - 0x04, 0x10, 0xfe, 0xb8, 0xfe, 0x85, 0x01, 0x5c, 0xfe, 0xa4, 0x01, 0x83, - 0x01, 0x40, 0x04, 0x0f, 0x01, 0x72, 0xde, 0xca, 0xc8, 0xec, 0xfd, 0xdb, - 0x03, 0x8a, 0x4d, 0x01, 0x11, 0xd9, 0x85, 0xce, 0x00, 0x02, 0x00, 0xa8, - 0xfe, 0x57, 0x05, 0x68, 0x05, 0x81, 0x00, 0x17, 0x00, 0x20, 0x00, 0x50, - 0x40, 0x29, 0x00, 0x17, 0x17, 0x18, 0x16, 0x01, 0x13, 0x1d, 0x1d, 0x03, - 0x03, 0x0e, 0x0e, 0x09, 0x13, 0x03, 0x22, 0x21, 0x16, 0x02, 0x1d, 0x02, - 0x5f, 0x59, 0x1d, 0x1d, 0x00, 0x0f, 0x0f, 0x1c, 0x5f, 0x59, 0x0f, 0x03, - 0x0b, 0x06, 0x5f, 0x59, 0x0b, 0x00, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x11, 0x00, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x32, 0x32, 0x11, 0x33, 0x31, 0x30, 0x21, 0x01, 0x21, 0x11, - 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, - 0x21, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x01, 0x03, 0x34, 0x26, 0x23, - 0x21, 0x11, 0x21, 0x32, 0x36, 0x04, 0x8c, 0xfe, 0x92, 0xfe, 0x49, 0x2f, - 0x34, 0x3c, 0x32, 0x46, 0x3e, 0x81, 0x8b, 0x02, 0x97, 0xee, 0x01, 0x03, - 0xb7, 0xa1, 0x01, 0x90, 0xf8, 0xa7, 0x9d, 0xfe, 0x3b, 0x01, 0xcd, 0x97, - 0xa5, 0x02, 0x49, 0xfd, 0x4a, 0x51, 0x4c, 0x10, 0x9e, 0x11, 0x94, 0x88, - 0x06, 0x0e, 0xd5, 0xbe, 0x9d, 0xd6, 0x1c, 0xfd, 0xa1, 0x03, 0xec, 0x7b, - 0x81, 0xfd, 0xf8, 0x8d, 0x00, 0x04, 0x00, 0x50, 0xfe, 0x58, 0x04, 0x73, - 0x05, 0xcc, 0x00, 0x29, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x93, - 0x40, 0x50, 0x37, 0x23, 0x2e, 0x2e, 0x18, 0x15, 0x12, 0x34, 0x33, 0x01, - 0x05, 0x00, 0x13, 0x14, 0x14, 0x1d, 0x18, 0x0d, 0x0e, 0x0e, 0x03, 0x29, - 0x00, 0x00, 0x31, 0x03, 0x18, 0x03, 0x3d, 0x3c, 0x33, 0x2a, 0x27, 0x2a, - 0x50, 0x59, 0x34, 0x30, 0x3a, 0x30, 0x51, 0x59, 0x07, 0x23, 0x27, 0x3a, - 0x3a, 0x10, 0x29, 0x40, 0x01, 0x27, 0x16, 0x20, 0x1b, 0x51, 0x59, 0x20, - 0x16, 0x39, 0x0a, 0x10, 0x0a, 0x50, 0x59, 0x15, 0x13, 0x10, 0x5f, 0x0d, - 0x01, 0x2f, 0x0d, 0x8f, 0x0d, 0x02, 0x0d, 0x0d, 0x10, 0x10, 0x00, 0x3f, - 0x33, 0x2f, 0x5d, 0x71, 0x10, 0xce, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x33, 0x1a, 0xce, 0x12, 0x39, 0x2f, 0x12, - 0x39, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x31, 0x30, 0x1b, 0x01, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, 0x13, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x12, 0x21, 0x32, 0x17, 0x13, 0x33, - 0x03, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, - 0x22, 0x26, 0x27, 0x23, 0x0e, 0x01, 0x2b, 0x01, 0x03, 0x13, 0x3e, 0x02, - 0x3d, 0x01, 0x07, 0x05, 0x14, 0x17, 0x13, 0x0e, 0x01, 0x01, 0x34, 0x27, - 0x07, 0x37, 0x50, 0xbe, 0xb7, 0xdd, 0xf6, 0x08, 0x80, 0x30, 0x4d, 0x79, - 0x6e, 0x0b, 0xbc, 0x2e, 0x01, 0x84, 0x64, 0x51, 0xb6, 0x8e, 0xd1, 0x72, - 0x2a, 0x3b, 0x1a, 0x21, 0x44, 0x47, 0x64, 0x5b, 0x06, 0x06, 0x45, 0xb7, - 0x83, 0x0b, 0xb4, 0xf0, 0x61, 0x98, 0x55, 0x94, 0xfe, 0x87, 0x40, 0xa7, - 0x7b, 0x6c, 0x02, 0x0d, 0x0e, 0x4d, 0x5b, 0xfe, 0x58, 0x01, 0xaa, 0x42, - 0xea, 0xa8, 0xb4, 0x06, 0x01, 0x1f, 0x16, 0x52, 0x5a, 0x11, 0x01, 0x24, - 0x19, 0x01, 0x97, 0xfe, 0x2c, 0x5e, 0xb8, 0xfe, 0x2e, 0x50, 0x51, 0x07, - 0x70, 0x10, 0x69, 0x70, 0x7c, 0x67, 0xfe, 0x6c, 0x02, 0x1b, 0x01, 0x5f, - 0x99, 0x51, 0x59, 0x03, 0xe8, 0x67, 0x2f, 0x01, 0x77, 0x0f, 0x6e, 0x01, - 0x40, 0x49, 0x28, 0xae, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7a, - 0xfe, 0x58, 0x03, 0x54, 0x05, 0xcc, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x60, - 0x40, 0x32, 0x0d, 0x08, 0x19, 0x19, 0x01, 0x18, 0x00, 0x00, 0x17, 0x05, - 0x03, 0x01, 0x0a, 0x0b, 0x0b, 0x12, 0x01, 0x12, 0x1c, 0x1d, 0x18, 0x1b, - 0x19, 0x0c, 0x01, 0x17, 0x04, 0x15, 0x05, 0x15, 0x10, 0x50, 0x59, 0x15, - 0x16, 0x08, 0x1b, 0x51, 0x59, 0x0b, 0x07, 0x40, 0x08, 0x0f, 0x05, 0x02, - 0x51, 0x59, 0x05, 0x0f, 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x1a, 0xcd, - 0xcc, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x11, 0x12, 0x00, 0x17, 0x39, 0x18, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x03, 0x01, 0x11, 0x23, 0x35, 0x33, 0x37, 0x33, 0x15, 0x33, 0x13, 0x33, - 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, - 0x03, 0x01, 0x13, 0x23, 0x86, 0x01, 0x22, 0x7d, 0x84, 0x35, 0x78, 0xc4, - 0xb2, 0x8e, 0xfd, 0xfc, 0x33, 0x3f, 0x24, 0x44, 0x59, 0x5d, 0x68, 0x36, - 0xcd, 0x01, 0x47, 0x8a, 0x8a, 0xfe, 0x58, 0x02, 0x8f, 0x02, 0xd0, 0x83, - 0xf2, 0xf2, 0x01, 0x92, 0xfb, 0x70, 0x30, 0x4e, 0x3f, 0x0e, 0x85, 0x18, - 0x38, 0xfe, 0x30, 0x04, 0x17, 0x01, 0x48, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0xfe, 0x68, 0x05, 0xab, 0x05, 0x81, 0x00, 0x0f, 0x00, 0x47, 0x40, 0x24, - 0x08, 0x04, 0x04, 0x05, 0x09, 0x01, 0x01, 0x0c, 0x0c, 0x0f, 0x0f, 0x0e, - 0x05, 0x0e, 0x10, 0x11, 0x08, 0x03, 0x5f, 0x59, 0x08, 0x08, 0x01, 0x0a, - 0x06, 0x03, 0x05, 0x12, 0x0f, 0x01, 0x01, 0x0c, 0x5f, 0x59, 0x01, 0x12, - 0x00, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, - 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x23, 0x04, 0xfa, 0x99, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0xbf, 0x8b, - 0xb1, 0x02, 0x8d, 0xfd, 0x73, 0x05, 0x81, 0xfd, 0xac, 0x02, 0x54, 0xfb, - 0x1f, 0xfd, 0xc8, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xfe, 0x68, 0x04, 0x63, - 0x05, 0xcc, 0x00, 0x1c, 0x00, 0x48, 0x40, 0x24, 0x1c, 0x19, 0x15, 0x15, - 0x16, 0x0c, 0x07, 0x07, 0x0a, 0x09, 0x16, 0x09, 0x1d, 0x1e, 0x17, 0x00, - 0x16, 0x15, 0x00, 0x1c, 0x1c, 0x03, 0x0a, 0x0c, 0x0c, 0x07, 0x51, 0x59, - 0x0c, 0x15, 0x03, 0x11, 0x50, 0x59, 0x03, 0x10, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x12, 0x39, 0x11, 0x33, 0x3f, - 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x15, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, - 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x14, 0x06, 0x07, 0x01, - 0x3d, 0x3a, 0xa3, 0x7d, 0xb0, 0xa7, 0x75, 0xa3, 0x87, 0x2a, 0x60, 0x55, - 0x7f, 0x99, 0xb4, 0xb4, 0x07, 0x01, 0x03, 0x81, 0x6a, 0x63, 0xaf, 0xce, - 0xfd, 0xb2, 0xfd, 0xe5, 0x01, 0x98, 0x02, 0xae, 0x72, 0x6f, 0x34, 0xb0, - 0x95, 0xfd, 0x82, 0x05, 0xcc, 0xfe, 0x7e, 0x3d, 0x82, 0x0a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x68, 0x05, 0x41, 0x05, 0x81, 0x00, 0x0f, - 0x00, 0x52, 0x40, 0x28, 0x00, 0x07, 0x0f, 0x0d, 0x0d, 0x09, 0x09, 0x0a, - 0x0e, 0x0f, 0x0f, 0x03, 0x06, 0x04, 0x04, 0x01, 0x03, 0x0a, 0x03, 0x10, - 0x11, 0x08, 0x00, 0x0d, 0x07, 0x0d, 0x06, 0x0e, 0x0b, 0x03, 0x0a, 0x12, - 0x04, 0x06, 0x06, 0x01, 0x5f, 0x59, 0x06, 0x12, 0x00, 0x3f, 0x2b, 0x00, - 0x18, 0x10, 0xc6, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, - 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, - 0x33, 0x11, 0x01, 0x33, 0x02, 0x97, 0x02, 0x1f, 0x8b, 0xb1, 0x3e, 0xfd, - 0xcd, 0xb8, 0xbf, 0xbf, 0x02, 0xa7, 0xe1, 0x03, 0x1d, 0xfd, 0x83, 0xfd, - 0xc8, 0x01, 0x98, 0x02, 0xa8, 0x8c, 0xfd, 0xe4, 0x05, 0x81, 0xfd, 0x3e, - 0x02, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0xfe, 0x68, 0x03, 0xfd, - 0x05, 0xcc, 0x00, 0x0f, 0x00, 0x51, 0x40, 0x28, 0x0f, 0x0a, 0x0a, 0x0c, - 0x09, 0x00, 0x06, 0x07, 0x08, 0x08, 0x0d, 0x0c, 0x06, 0x02, 0x02, 0x03, - 0x0c, 0x03, 0x11, 0x10, 0x09, 0x01, 0x06, 0x00, 0x06, 0x07, 0x0d, 0x0f, - 0x0f, 0x0a, 0x51, 0x59, 0x0f, 0x15, 0x07, 0x0f, 0x04, 0x00, 0x03, 0x15, - 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x10, 0xc6, 0x12, 0x39, - 0x39, 0x11, 0x33, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, - 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0xc2, 0x84, 0xb4, 0xb4, - 0x01, 0xdb, 0xd3, 0xfe, 0x49, 0x01, 0x67, 0x61, 0xa3, 0x2f, 0x01, 0xee, - 0x6d, 0xfe, 0x7f, 0x05, 0xcc, 0xfc, 0x61, 0x02, 0x0d, 0xfe, 0x2f, 0xfe, - 0x1a, 0xfd, 0xe5, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, - 0xfe, 0x68, 0x04, 0xa3, 0x05, 0x81, 0x00, 0x0b, 0x00, 0x3a, 0x40, 0x1e, - 0x01, 0x00, 0x05, 0x09, 0x0a, 0x03, 0x03, 0x06, 0x09, 0x00, 0x04, 0x0d, - 0x0c, 0x09, 0x06, 0x07, 0x06, 0x5f, 0x59, 0x07, 0x03, 0x04, 0x0a, 0x03, - 0x0a, 0x5f, 0x59, 0x01, 0x03, 0x12, 0x00, 0x3f, 0xc6, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x11, 0x21, - 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x04, 0xa3, 0xb1, 0xfc, - 0x4f, 0x03, 0x5a, 0xfc, 0xef, 0x03, 0xea, 0xfc, 0xa6, 0x03, 0x89, 0xfe, - 0x68, 0x01, 0x98, 0x8f, 0x04, 0x56, 0x9c, 0x8b, 0xfb, 0xa6, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x31, 0xfe, 0x68, 0x03, 0xb6, 0x04, 0x3a, 0x00, 0x0b, - 0x00, 0x3b, 0x40, 0x1d, 0x02, 0x06, 0x06, 0x0a, 0x09, 0x07, 0x03, 0x00, - 0x09, 0x00, 0x0d, 0x0c, 0x06, 0x03, 0x04, 0x03, 0x50, 0x59, 0x04, 0x0f, - 0x01, 0x07, 0x00, 0x07, 0x50, 0x59, 0x0a, 0x00, 0x15, 0x00, 0x3f, 0xc6, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x33, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x11, 0x23, - 0x11, 0x31, 0x02, 0x95, 0xfd, 0x93, 0x03, 0x38, 0xfd, 0x6a, 0x02, 0xbb, - 0xa3, 0x89, 0x03, 0x26, 0x8b, 0x89, 0xfc, 0xda, 0xfd, 0xdd, 0x01, 0x98, - 0x00, 0x02, 0x00, 0x61, 0xff, 0xec, 0x05, 0x35, 0x05, 0x96, 0x00, 0x0e, - 0x00, 0x19, 0x00, 0x3a, 0x40, 0x1d, 0x17, 0x06, 0x11, 0x00, 0x00, 0x0e, - 0x06, 0x0e, 0x1a, 0x1b, 0x01, 0x0b, 0x00, 0x0c, 0x03, 0x09, 0x14, 0x5f, - 0x59, 0x09, 0x04, 0x03, 0x0f, 0x5f, 0x59, 0x03, 0x13, 0x00, 0x12, 0x00, - 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x35, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, - 0x32, 0x17, 0x37, 0x33, 0x11, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, - 0x00, 0x11, 0x10, 0x00, 0x04, 0x76, 0xb6, 0xaa, 0xfe, 0xb9, 0xfe, 0x92, - 0x01, 0x72, 0x01, 0x4a, 0xc3, 0xa0, 0x96, 0x1f, 0xfd, 0xe1, 0xea, 0x76, - 0x73, 0xe6, 0xf1, 0xfe, 0xf7, 0x01, 0x0b, 0x47, 0x5b, 0x01, 0x86, 0x01, - 0x55, 0x01, 0x52, 0x01, 0x7d, 0x4d, 0x38, 0xfa, 0x7f, 0x85, 0x67, 0x03, - 0xad, 0x64, 0xfe, 0xd7, 0xfe, 0xf3, 0xfe, 0xf1, 0xfe, 0xcd, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x04, 0xe3, 0x04, 0x4e, 0x00, 0x15, - 0x00, 0x30, 0x40, 0x18, 0x03, 0x02, 0x01, 0x00, 0x06, 0x02, 0x06, 0x16, - 0x0e, 0x17, 0x0c, 0x12, 0x53, 0x59, 0x0f, 0x0f, 0x0c, 0x10, 0x06, 0x01, - 0x02, 0x0f, 0x01, 0x15, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3f, 0x33, 0x2f, - 0x2b, 0x11, 0x01, 0x33, 0x12, 0x39, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x33, 0x13, 0x16, 0x17, 0x3f, 0x01, 0x13, - 0x3e, 0x01, 0x33, 0x32, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, - 0x02, 0x65, 0xd5, 0xfe, 0x77, 0xc0, 0xee, 0x0d, 0x38, 0x10, 0x3a, 0x8e, - 0x2a, 0x7a, 0x68, 0xa5, 0x60, 0x6a, 0x29, 0x3b, 0x24, 0x2a, 0x32, 0x17, - 0x04, 0x3a, 0xfd, 0x40, 0x28, 0xc5, 0x35, 0xb6, 0x01, 0xd0, 0x89, 0x7d, - 0x9b, 0x64, 0x3c, 0x27, 0x3a, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, - 0x00, 0x00, 0x08, 0xb1, 0x05, 0x96, 0x00, 0x24, 0x00, 0x37, 0x40, 0x1e, - 0x14, 0x13, 0x1e, 0x0e, 0x17, 0x13, 0x04, 0x25, 0x02, 0x26, 0x1b, 0x03, - 0x0e, 0x1e, 0x17, 0x03, 0x12, 0x13, 0x03, 0x12, 0x12, 0x09, 0x12, 0x00, - 0x05, 0x5f, 0x59, 0x03, 0x00, 0x04, 0x00, 0x3f, 0x32, 0x2b, 0x00, 0x18, - 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x11, 0x01, 0x33, 0x12, 0x17, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, - 0x06, 0x07, 0x01, 0x23, 0x03, 0x2e, 0x01, 0x27, 0x06, 0x07, 0x03, 0x23, - 0x01, 0x33, 0x13, 0x16, 0x17, 0x36, 0x12, 0x13, 0x33, 0x13, 0x16, 0x17, - 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x07, 0xb1, 0x9e, 0x62, 0x71, 0x42, - 0x49, 0x32, 0x3c, 0x14, 0xfe, 0xb4, 0xe4, 0xf4, 0x10, 0x2d, 0x09, 0x12, - 0x35, 0xf6, 0xe4, 0xfe, 0x61, 0xc7, 0xfd, 0x2d, 0x26, 0x18, 0x3f, 0xf6, - 0xb7, 0xf5, 0x38, 0x20, 0x09, 0x39, 0x13, 0xba, 0x23, 0x8e, 0x05, 0x96, - 0x93, 0x6b, 0x63, 0x39, 0x45, 0xfb, 0x83, 0x03, 0x7f, 0x35, 0xc5, 0x32, - 0x6f, 0xbd, 0xfc, 0x81, 0x05, 0x81, 0xfc, 0x81, 0xa8, 0xb2, 0x6e, 0x01, - 0x04, 0x03, 0x67, 0xfc, 0x93, 0xd7, 0x95, 0x23, 0xf4, 0x43, 0x02, 0x99, - 0x81, 0x7a, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x06, 0xe6, - 0x04, 0x4e, 0x00, 0x22, 0x00, 0x38, 0x40, 0x1f, 0x0c, 0x03, 0x11, 0x03, - 0x23, 0x1b, 0x24, 0x09, 0x08, 0x08, 0x23, 0x18, 0x1f, 0x53, 0x59, 0x1c, - 0x18, 0x10, 0x11, 0x0c, 0x03, 0x03, 0x07, 0x0e, 0x10, 0x08, 0x0f, 0x07, - 0x15, 0x00, 0x15, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, - 0x33, 0x2b, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, - 0x31, 0x30, 0x21, 0x23, 0x03, 0x27, 0x0f, 0x01, 0x03, 0x23, 0x01, 0x33, - 0x13, 0x16, 0x17, 0x37, 0x13, 0x33, 0x13, 0x17, 0x36, 0x37, 0x13, 0x3e, - 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, - 0x04, 0x96, 0xd1, 0xad, 0x34, 0x07, 0x2f, 0xb2, 0xd0, 0xfe, 0xd1, 0xb2, - 0xb7, 0x09, 0x22, 0x23, 0xd0, 0xc1, 0xbd, 0x2e, 0x19, 0x14, 0x86, 0x17, - 0x43, 0x5c, 0x54, 0x4a, 0x7a, 0x35, 0x6a, 0x1e, 0x3f, 0x2b, 0x2c, 0x36, - 0x11, 0x02, 0xba, 0xeb, 0x23, 0xcc, 0xfd, 0x4a, 0x04, 0x3a, 0xfd, 0x27, - 0x21, 0xaa, 0x90, 0x03, 0x14, 0xfd, 0x1f, 0xc4, 0x8a, 0x42, 0x01, 0xff, - 0x58, 0x68, 0x2e, 0x46, 0x55, 0x64, 0x2d, 0x36, 0x3e, 0x40, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xf9, 0x04, 0x45, 0x00, 0x19, - 0x00, 0x23, 0x00, 0x52, 0x40, 0x2b, 0x1a, 0x09, 0x1c, 0x07, 0x0f, 0x1e, - 0x1e, 0x07, 0x09, 0x03, 0x05, 0x00, 0x12, 0x03, 0x03, 0x05, 0x05, 0x16, - 0x00, 0x03, 0x25, 0x24, 0x03, 0x12, 0x1c, 0x12, 0x51, 0x59, 0x07, 0x16, - 0x1c, 0x1c, 0x02, 0x19, 0x0f, 0x0c, 0x21, 0x50, 0x59, 0x0c, 0x10, 0x02, - 0x15, 0x00, 0x3f, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x2f, 0x39, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x09, 0x01, 0x23, 0x03, 0x07, 0x27, 0x36, 0x37, 0x26, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x16, 0x1f, - 0x01, 0x3f, 0x01, 0x13, 0x05, 0x14, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x03, 0xf9, 0xfe, 0x6c, 0xd5, 0xc6, 0x6a, 0x33, 0x46, 0x29, - 0x26, 0x82, 0x6c, 0x5c, 0x71, 0x63, 0x6e, 0x55, 0x13, 0x24, 0x0e, 0x10, - 0x3a, 0xf6, 0xfd, 0xd7, 0x22, 0x69, 0x22, 0x1d, 0x1d, 0x2f, 0x04, 0x3a, - 0xfb, 0xc6, 0x02, 0x23, 0x24, 0x80, 0x14, 0x10, 0x72, 0x48, 0x66, 0x82, - 0x78, 0x63, 0x59, 0x80, 0x34, 0xe3, 0x31, 0x87, 0x35, 0x35, 0xb6, 0x02, - 0xc2, 0xde, 0x2d, 0x55, 0x3b, 0x4d, 0x22, 0x2b, 0x27, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa8, 0x00, 0x00, 0x04, 0x61, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x27, 0x40, 0x13, 0x06, 0x02, 0x02, 0x03, 0x00, 0x03, 0x09, 0x08, - 0x06, 0x01, 0x5f, 0x59, 0x06, 0x06, 0x03, 0x04, 0x03, 0x03, 0x12, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, - 0x21, 0x04, 0x61, 0xfd, 0x06, 0xbf, 0xbf, 0x02, 0xfa, 0x02, 0x8d, 0xfd, - 0x73, 0x05, 0x81, 0xfd, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, - 0x00, 0x00, 0x03, 0x29, 0x04, 0x3a, 0x00, 0x07, 0x00, 0x27, 0x40, 0x13, - 0x01, 0x05, 0x05, 0x06, 0x02, 0x06, 0x09, 0x08, 0x01, 0x04, 0x51, 0x59, - 0x01, 0x01, 0x06, 0x07, 0x0f, 0x06, 0x15, 0x00, 0x3f, 0x3f, 0x12, 0x39, - 0x2f, 0x2b, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x01, 0x42, 0x01, - 0xe7, 0xfe, 0x19, 0xb4, 0x04, 0x3a, 0xfe, 0x36, 0x83, 0xfe, 0x13, 0x04, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x55, 0xff, 0xec, 0x04, 0xda, - 0x04, 0x52, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x39, 0x40, 0x1e, 0x16, 0x00, - 0x1c, 0x09, 0x0f, 0x0c, 0x05, 0x05, 0x0f, 0x00, 0x03, 0x20, 0x1f, 0x13, - 0x19, 0x50, 0x59, 0x13, 0x10, 0x09, 0x08, 0x10, 0x1c, 0x0f, 0x02, 0x0f, - 0x50, 0x59, 0x02, 0x16, 0x00, 0x3f, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, - 0x33, 0x3f, 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x10, 0x21, 0x20, 0x00, 0x11, 0x34, - 0x12, 0x37, 0x17, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, - 0x33, 0x32, 0x12, 0x07, 0x34, 0x26, 0x23, 0x22, 0x19, 0x01, 0x3e, 0x01, - 0x04, 0xda, 0xfd, 0xb8, 0xfe, 0xdc, 0xfe, 0xe7, 0xdf, 0xc5, 0x15, 0x7c, - 0x80, 0x8f, 0x9b, 0x9a, 0x9e, 0xa7, 0xbf, 0xbd, 0x57, 0x50, 0x90, 0xa1, - 0x96, 0x02, 0x35, 0xfd, 0xb7, 0x01, 0x1c, 0x01, 0x19, 0xe7, 0x01, 0x2a, - 0x20, 0x88, 0x1b, 0xda, 0xb8, 0xce, 0xcc, 0x09, 0x02, 0x41, 0xc1, 0xd4, - 0xfe, 0xdc, 0xf5, 0xc1, 0xd3, 0xfe, 0xf3, 0xfd, 0xbc, 0x07, 0xd8, 0x00, - 0x00, 0x02, 0x00, 0x41, 0x00, 0x8b, 0x02, 0x6a, 0x03, 0x87, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x24, 0x40, 0x0f, 0x05, 0x01, 0x04, 0x00, 0x01, 0x00, - 0x08, 0x09, 0x01, 0x07, 0x01, 0x07, 0x03, 0x05, 0x03, 0x00, 0x2f, 0x2f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x05, 0x35, 0x25, 0x11, 0x05, 0x35, 0x25, - 0x02, 0x6a, 0xfd, 0xd7, 0x02, 0x29, 0xfd, 0xd7, 0x02, 0x29, 0x02, 0xe5, - 0xf0, 0xa2, 0xf0, 0xfd, 0xf4, 0xf0, 0xa2, 0xf0, 0x00, 0x02, 0xff, 0x4a, - 0x03, 0xb6, 0x00, 0xb4, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, - 0xb6, 0x00, 0x40, 0x01, 0x01, 0x06, 0x80, 0x04, 0x00, 0x2f, 0x1a, 0xcd, - 0x39, 0x2f, 0x1a, 0xcd, 0x31, 0x30, 0x03, 0x35, 0x33, 0x15, 0x17, 0x11, - 0x33, 0x11, 0xb6, 0x9a, 0x55, 0x7b, 0x04, 0x73, 0x93, 0x93, 0xbd, 0x02, - 0x16, 0xfd, 0xea, 0x00, 0x00, 0x02, 0xff, 0xb3, 0x03, 0xf7, 0x01, 0x87, - 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x14, 0xb7, 0x07, 0x07, 0x01, - 0x06, 0x06, 0x03, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x2f, 0x12, - 0x39, 0x2f, 0x31, 0x30, 0x09, 0x01, 0x27, 0x01, 0x05, 0x35, 0x33, 0x15, - 0x01, 0x87, 0xfe, 0x93, 0x57, 0x01, 0x6d, 0xfe, 0x83, 0x9a, 0x05, 0x64, - 0xfe, 0x93, 0x56, 0x01, 0x6d, 0x81, 0x93, 0x93, 0x00, 0x02, 0xfe, 0xee, - 0x04, 0x5f, 0x01, 0x12, 0x05, 0xcc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x10, - 0xb5, 0x07, 0x07, 0x06, 0x80, 0x02, 0x01, 0x00, 0x2f, 0x33, 0x1a, 0xcc, - 0x39, 0x2f, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x25, 0x35, 0x33, 0x15, - 0x01, 0x12, 0xfd, 0xdc, 0x02, 0x24, 0xfe, 0xa1, 0x9a, 0x04, 0x5f, 0x79, - 0x61, 0x93, 0x93, 0x00, 0x00, 0x01, 0xfe, 0xee, 0x04, 0x5f, 0x01, 0x12, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x0c, 0xb3, 0x03, 0x80, 0x00, 0x05, 0x00, - 0x2f, 0x33, 0x1a, 0xcc, 0x31, 0x30, 0x01, 0x21, 0x35, 0x33, 0x11, 0x21, - 0xfe, 0xee, 0x01, 0xa7, 0x7d, 0xfd, 0xdc, 0x04, 0xd8, 0xf4, 0xfe, 0x93, - 0x00, 0x01, 0x00, 0x99, 0x04, 0x07, 0x03, 0x68, 0x07, 0x76, 0x00, 0x09, - 0x00, 0x1e, 0x40, 0x0d, 0x02, 0x03, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, - 0x01, 0x05, 0x05, 0x03, 0x08, 0x00, 0x2f, 0xcd, 0x39, 0x2f, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, 0x11, 0x23, - 0x11, 0x21, 0x35, 0x01, 0x33, 0x01, 0x03, 0x68, 0xfe, 0xe2, 0x93, 0xfe, - 0xe2, 0x01, 0x5b, 0x11, 0x01, 0x63, 0x06, 0x0a, 0xfd, 0xfd, 0x02, 0x03, - 0x17, 0x01, 0x55, 0xfe, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, - 0x04, 0x07, 0x03, 0x68, 0x07, 0x76, 0x00, 0x09, 0x00, 0x1e, 0x40, 0x0d, - 0x08, 0x05, 0x00, 0x05, 0x03, 0x03, 0x0a, 0x0b, 0x08, 0x04, 0x04, 0x01, - 0x07, 0x00, 0x2f, 0xcd, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x09, 0x01, 0x23, 0x01, 0x35, 0x21, 0x11, 0x33, - 0x11, 0x21, 0x03, 0x68, 0xfe, 0x9d, 0x11, 0xfe, 0xa5, 0x01, 0x1e, 0x93, - 0x01, 0x1e, 0x05, 0x5d, 0xfe, 0xaa, 0x01, 0x55, 0x17, 0x02, 0x03, 0xfd, - 0xfd, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb0, 0x03, 0xa6, 0x01, 0x8c, - 0x07, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x22, 0x40, 0x0e, 0x07, 0x03, - 0x02, 0x04, 0x03, 0x04, 0x09, 0x08, 0x01, 0x01, 0x03, 0x05, 0x04, 0x03, - 0x00, 0x2f, 0x2f, 0xcd, 0x11, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x03, 0x33, 0x03, 0x35, - 0x33, 0x15, 0x01, 0x53, 0x69, 0x38, 0xda, 0xdc, 0xd7, 0x04, 0xd2, 0x02, - 0xfb, 0xfb, 0xd9, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb0, - 0x03, 0xa6, 0x01, 0x8c, 0x07, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, - 0x40, 0x0f, 0x06, 0x01, 0x01, 0x05, 0x00, 0x00, 0x08, 0x09, 0x02, 0x02, - 0x01, 0x06, 0x06, 0x07, 0x01, 0x00, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x13, 0x33, 0x13, 0x15, 0x23, 0x35, 0x01, 0x8c, 0xda, 0x38, - 0x69, 0x34, 0xd7, 0x03, 0xa6, 0x02, 0xfb, 0x01, 0x2c, 0x98, 0x98, 0x00, - 0x00, 0x02, 0x00, 0xb0, 0x01, 0xa5, 0x01, 0x8c, 0x05, 0xcc, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x20, 0x40, 0x0d, 0x06, 0x01, 0x01, 0x05, 0x00, 0x00, - 0x08, 0x09, 0x02, 0x01, 0x06, 0x07, 0x01, 0x00, 0x2f, 0x2f, 0xcd, 0x11, - 0x39, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x23, 0x13, 0x33, 0x13, 0x15, 0x23, 0x35, 0x01, 0x8c, 0xda, 0x38, - 0x69, 0x34, 0xd7, 0x01, 0xa5, 0x02, 0xfb, 0x01, 0x2c, 0x98, 0x98, 0x00, - 0x00, 0x01, 0xfe, 0xa0, 0x04, 0x69, 0x01, 0x38, 0x05, 0xcc, 0x00, 0x09, - 0x00, 0x10, 0xb5, 0x05, 0x00, 0x09, 0x80, 0x07, 0x03, 0x00, 0x2f, 0x33, - 0x1a, 0xcc, 0x32, 0x32, 0x31, 0x30, 0x01, 0x23, 0x15, 0x23, 0x35, 0x23, - 0x15, 0x23, 0x11, 0x21, 0x01, 0x38, 0xef, 0x7d, 0xaf, 0x7d, 0x02, 0x98, - 0x05, 0x4f, 0xe6, 0xe6, 0xe6, 0x01, 0x63, 0x00, 0x00, 0x01, 0xfe, 0xa0, - 0x00, 0x00, 0x01, 0x38, 0x01, 0x63, 0x00, 0x09, 0x00, 0x12, 0xb6, 0x08, - 0x04, 0x04, 0x06, 0x03, 0x80, 0x01, 0x00, 0x2f, 0x1a, 0xcd, 0x32, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x29, 0x01, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, - 0x15, 0x33, 0x01, 0x38, 0xfd, 0x68, 0x7d, 0xaf, 0x7d, 0xef, 0x01, 0x63, - 0xe6, 0xe6, 0xe6, 0x00, 0x00, 0x01, 0x00, 0x1c, 0xfe, 0x57, 0x02, 0x95, - 0xff, 0x74, 0x00, 0x06, 0x00, 0x1c, 0x40, 0x0d, 0x03, 0x05, 0x00, 0x03, - 0x07, 0x08, 0x04, 0x80, 0x0f, 0x02, 0x01, 0x08, 0x02, 0x00, 0x2f, 0x5e, - 0x5d, 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x1b, 0x01, - 0x33, 0x13, 0x23, 0x27, 0x07, 0x1c, 0xeb, 0xac, 0xe2, 0xaa, 0x95, 0x92, - 0xfe, 0x57, 0x01, 0x1d, 0xfe, 0xe3, 0xbe, 0xbe, 0x00, 0x02, 0x00, 0xbb, - 0x00, 0xc9, 0x01, 0x7e, 0x04, 0x3a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1e, - 0x40, 0x0c, 0x00, 0x04, 0x04, 0x03, 0x07, 0x07, 0x08, 0x09, 0x05, 0x04, - 0x00, 0x02, 0x00, 0x2f, 0x33, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x11, - 0x33, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, - 0x33, 0x15, 0xbb, 0xc3, 0xc3, 0xc3, 0x03, 0x6b, 0xcf, 0xcf, 0xfd, 0x5e, - 0xcf, 0xcf, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0xf4, 0x03, 0x1c, - 0x03, 0x6a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1e, 0x40, 0x0c, 0x04, 0x00, - 0x07, 0x02, 0x00, 0x02, 0x08, 0x09, 0x05, 0x04, 0x00, 0x01, 0x00, 0x2f, - 0x33, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x13, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x64, 0x02, - 0xb8, 0xfd, 0x48, 0x02, 0xb8, 0x02, 0xd6, 0x94, 0x94, 0xfe, 0x1e, 0x94, - 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x59, 0x01, 0x1d, - 0x05, 0xcc, 0x00, 0x05, 0x00, 0x14, 0xb7, 0x03, 0x00, 0x00, 0x06, 0x07, - 0x01, 0x05, 0x00, 0x00, 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x01, 0x03, 0x23, 0x03, 0x35, 0x33, 0x01, 0x1d, 0x35, 0x51, - 0x33, 0xb9, 0x04, 0xeb, 0xfd, 0x6e, 0x02, 0x92, 0xe1, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x64, 0x03, 0x50, 0x01, 0x1d, 0x05, 0xcc, 0x00, 0x05, - 0x00, 0x14, 0xb7, 0x03, 0x00, 0x00, 0x06, 0x07, 0x02, 0x04, 0x00, 0x00, - 0x3f, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x03, - 0x23, 0x03, 0x35, 0x33, 0x01, 0x1d, 0x35, 0x51, 0x33, 0xb9, 0x04, 0xeb, - 0xfe, 0x65, 0x01, 0x9b, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, - 0x00, 0x00, 0x03, 0x76, 0x05, 0xcc, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, - 0x00, 0x56, 0x40, 0x2c, 0x06, 0x04, 0x02, 0x15, 0x13, 0x0d, 0x01, 0x01, - 0x02, 0x16, 0x1a, 0x1a, 0x19, 0x1d, 0x02, 0x1d, 0x1e, 0x1f, 0x1c, 0x0f, - 0x18, 0x19, 0x53, 0x59, 0x18, 0x00, 0x0a, 0x0f, 0x50, 0x59, 0x0a, 0x00, - 0x00, 0x04, 0x05, 0x04, 0x50, 0x59, 0x13, 0x05, 0x0f, 0x1a, 0x01, 0x15, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x3f, 0x2b, - 0x00, 0x18, 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, - 0x33, 0x33, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, - 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, - 0x33, 0x15, 0x13, 0x35, 0x33, 0x15, 0x03, 0x11, 0x33, 0x11, 0x01, 0x69, - 0xb4, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, 0x23, 0x45, 0x3e, 0xd3, - 0x86, 0xb4, 0xb4, 0xb4, 0x03, 0xb7, 0xfc, 0x49, 0x03, 0xb7, 0x83, 0x7a, - 0x94, 0x82, 0x0c, 0x89, 0x08, 0x46, 0x5c, 0x61, 0x83, 0x01, 0x69, 0xac, - 0xac, 0xfa, 0xe0, 0x04, 0x3a, 0xfb, 0xc6, 0x00, 0x00, 0x02, 0x00, 0x1d, - 0x00, 0x00, 0x03, 0x77, 0x05, 0xcc, 0x00, 0x15, 0x00, 0x19, 0x00, 0x48, - 0x40, 0x24, 0x15, 0x13, 0x01, 0x06, 0x04, 0x02, 0x0d, 0x01, 0x01, 0x02, - 0x16, 0x19, 0x02, 0x19, 0x1a, 0x1b, 0x18, 0x00, 0x0a, 0x0f, 0x50, 0x59, - 0x0a, 0x00, 0x00, 0x04, 0x05, 0x04, 0x50, 0x59, 0x13, 0x05, 0x0f, 0x16, - 0x01, 0x15, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x18, - 0x3f, 0x2b, 0x00, 0x18, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, - 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x33, 0x15, 0x13, 0x11, - 0x33, 0x11, 0x01, 0x69, 0xb4, 0x98, 0x98, 0x82, 0x86, 0x4b, 0x34, 0x2d, - 0x23, 0x45, 0x3e, 0xd3, 0x87, 0xb4, 0x03, 0xb7, 0xfc, 0x49, 0x03, 0xb7, - 0x83, 0x7a, 0x94, 0x82, 0x0c, 0x89, 0x08, 0x46, 0x5c, 0x61, 0x83, 0xfc, - 0x49, 0x05, 0xcc, 0xfa, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, - 0x01, 0x26, 0x01, 0x66, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x09, 0x00, 0x00, - 0x10, 0x07, 0x04, 0xf4, 0x01, 0x0a, 0xfe, 0xb5, 0x00, 0x01, 0xfe, 0xb6, - 0x05, 0xa6, 0x01, 0x4a, 0x06, 0xe3, 0x00, 0x0d, 0x00, 0x13, 0xb6, 0x06, - 0x0f, 0x00, 0x01, 0x00, 0x0a, 0x03, 0xb8, 0x01, 0x3f, 0x00, 0x3f, 0x33, - 0xcd, 0x5d, 0x32, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, - 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x4a, 0xb4, 0x96, 0x96, - 0xb4, 0xa2, 0x5a, 0x4e, 0x4d, 0x5b, 0x06, 0xe3, 0x91, 0xac, 0xaf, 0x8e, - 0x4d, 0x5d, 0x60, 0x4a, 0xff, 0xff, 0x00, 0xae, 0x01, 0x3c, 0x03, 0x64, - 0x04, 0xcb, 0x10, 0x26, 0x05, 0x09, 0x00, 0x00, 0x10, 0x27, 0x05, 0x09, - 0x01, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x04, 0xef, 0x02, 0x0a, 0x02, 0x23, - 0xff, 0xff, 0x00, 0x29, 0xff, 0xdf, 0x04, 0x42, 0x04, 0xcb, 0x12, 0x06, - 0x05, 0x12, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x04, 0xec, - 0x04, 0xcb, 0x12, 0x06, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x29, - 0x00, 0x00, 0x04, 0x37, 0x04, 0xcb, 0x12, 0x06, 0x05, 0x03, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x98, 0x00, 0x00, 0x04, 0x6f, 0x04, 0xcb, 0x12, 0x06, - 0x05, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0x00, 0x00, 0x03, 0xc3, - 0x04, 0xcb, 0x12, 0x06, 0x05, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xd3, 0x03, 0xdb, 0x06, 0x81, 0x12, 0x06, 0x05, 0x0c, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x04, 0xc9, 0x04, 0xcb, 0x12, 0x06, - 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0x00, 0x00, 0x03, 0xa2, - 0x04, 0xcb, 0x12, 0x06, 0x05, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, - 0x00, 0x00, 0x04, 0xe3, 0x04, 0xcb, 0x12, 0x06, 0x05, 0x1a, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x5a, 0x02, 0x02, 0x04, 0x27, 0x04, 0x68, 0x00, 0x07, - 0x00, 0x2c, 0x40, 0x0d, 0x06, 0x03, 0x03, 0x01, 0x00, 0x00, 0x01, 0x09, - 0x08, 0x06, 0x02, 0x01, 0x02, 0xb8, 0x01, 0x41, 0xb2, 0x59, 0x01, 0x04, - 0xb8, 0x01, 0x37, 0x00, 0x3f, 0xc4, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x31, 0x30, 0x01, 0x21, - 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x04, 0x27, 0xfc, 0x33, 0x01, 0x87, - 0xbb, 0x01, 0x8b, 0x02, 0x02, 0xba, 0x01, 0xac, 0xfe, 0x54, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x33, 0xff, 0xf6, 0x05, 0x7f, 0x06, 0x46, 0x12, 0x26, - 0x05, 0x19, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf1, 0x05, 0x2d, 0x00, 0x00, - 0x00, 0x0c, 0xb7, 0x01, 0x1e, 0x0f, 0x1e, 0x24, 0x0f, 0x10, 0x25, 0x2b, - 0x11, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf6, 0x05, 0x7f, - 0x06, 0x46, 0x12, 0x26, 0x05, 0x19, 0x00, 0x00, 0x10, 0x07, 0x04, 0xf1, - 0x00, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf6, 0x05, 0xa0, - 0x06, 0x46, 0x12, 0x26, 0x05, 0x19, 0x00, 0x00, 0x10, 0x27, 0x04, 0xf1, - 0x05, 0x50, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x03, 0xbe, 0xff, 0xb1, - 0x00, 0x2a, 0x40, 0x1b, 0x02, 0x5f, 0x2a, 0x01, 0x2a, 0x02, 0x9b, 0x2a, - 0x01, 0x84, 0x2a, 0x01, 0x7b, 0x2a, 0x01, 0x54, 0x2a, 0x01, 0x2a, 0x01, - 0x1e, 0x0f, 0x1e, 0x24, 0x0f, 0x10, 0x25, 0x2b, 0x11, 0x35, 0x11, 0x5d, - 0x5d, 0x5d, 0x5d, 0x35, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x33, - 0xff, 0xf6, 0x05, 0x7f, 0x06, 0x46, 0x12, 0x26, 0x05, 0x19, 0x00, 0x00, - 0x10, 0x27, 0x04, 0xf4, 0x03, 0xbe, 0xff, 0xb1, 0x11, 0x07, 0x04, 0xf1, - 0x00, 0x91, 0x00, 0x00, 0x00, 0x1f, 0x40, 0x13, 0x01, 0x5f, 0x1e, 0x01, - 0x1e, 0x01, 0x9b, 0x1e, 0x01, 0x84, 0x1e, 0x01, 0x7b, 0x1e, 0x01, 0x54, - 0x1e, 0x01, 0x1e, 0x11, 0x5d, 0x5d, 0x5d, 0x5d, 0x35, 0x00, 0x11, 0x5d, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0xff, 0x19, 0x04, 0xec, - 0x04, 0xcb, 0x12, 0x26, 0x05, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0xef, - 0x02, 0x83, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0xfe, 0xa4, 0x04, 0xec, - 0x04, 0xcb, 0x12, 0x26, 0x05, 0x00, 0x00, 0x00, 0x10, 0x07, 0x04, 0xf0, - 0x02, 0x83, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x04, 0xec, - 0x04, 0xcb, 0x12, 0x26, 0x05, 0x00, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, - 0x02, 0x39, 0xfd, 0xb7, 0x00, 0x0e, 0xb7, 0x01, 0x60, 0x23, 0x01, 0x30, - 0x23, 0x01, 0x23, 0x00, 0x11, 0x5d, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x52, - 0x00, 0x00, 0x04, 0x81, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x01, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x01, - 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x3f, - 0x00, 0x00, 0x03, 0x2d, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x02, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x00, 0xc9, 0x00, 0x4c, 0x00, 0x0e, 0xb7, 0x01, - 0x4f, 0x24, 0x01, 0x2f, 0x24, 0x01, 0x24, 0x00, 0x11, 0x5d, 0x5d, 0x35, - 0xff, 0xff, 0x00, 0x29, 0x00, 0x00, 0x04, 0x37, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x03, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x01, 0x7f, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x01, 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, - 0xff, 0xff, 0x00, 0x98, 0x00, 0x00, 0x04, 0x6f, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x04, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x02, 0x81, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x02, 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, - 0xff, 0xff, 0xff, 0xba, 0x00, 0x00, 0x01, 0x66, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x05, 0x00, 0x00, 0x11, 0x06, 0x04, 0xf4, 0x0a, 0x00, 0x00, 0x0a, - 0xb4, 0x01, 0x00, 0x04, 0x01, 0x04, 0x00, 0x11, 0x5d, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x02, 0x79, 0x04, 0xdd, 0x12, 0x26, - 0x05, 0x06, 0x00, 0x00, 0x11, 0x06, 0x04, 0xf4, 0x1b, 0x00, 0x00, 0x0a, - 0xb4, 0x01, 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0xa4, 0xff, 0xec, 0x04, 0xcb, 0x04, 0xdf, 0x12, 0x26, - 0x05, 0x08, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x02, 0xb6, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x01, 0x00, 0x24, 0x01, 0x24, 0x00, 0x11, 0x5d, 0x35, - 0xff, 0xff, 0xff, 0xba, 0x02, 0x46, 0x01, 0x66, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x09, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x00, 0x0a, 0x00, 0xac, - 0x00, 0x1b, 0x40, 0x11, 0x01, 0xcb, 0x04, 0x01, 0x8f, 0x04, 0x01, 0x7f, - 0x04, 0x01, 0x2f, 0x04, 0x01, 0x00, 0x04, 0x01, 0x04, 0x00, 0x11, 0x5d, - 0x5d, 0x5d, 0x5d, 0x5d, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, - 0xfe, 0x7f, 0x03, 0xa2, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x0a, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x01, 0x98, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x01, - 0x00, 0x0c, 0x01, 0x0c, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x50, - 0x00, 0x00, 0x03, 0xc3, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x0b, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x01, 0xd1, 0xff, 0xbb, 0x00, 0x0a, 0xb4, 0x01, - 0x00, 0x12, 0x01, 0x12, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x46, - 0xff, 0xd3, 0x03, 0xdb, 0x06, 0x81, 0x12, 0x26, 0x05, 0x0c, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x01, 0xac, 0x00, 0x10, 0x00, 0x13, 0x40, 0x0a, - 0x01, 0x02, 0x1a, 0x01, 0x1a, 0x01, 0x04, 0x1a, 0x01, 0x1a, 0x11, 0x5d, - 0x35, 0x00, 0x11, 0x5d, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x37, - 0x00, 0x00, 0x04, 0xdb, 0x04, 0xdf, 0x12, 0x26, 0x05, 0x0e, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x02, 0xf8, 0x00, 0x10, 0x00, 0x17, 0x40, 0x0d, - 0x01, 0x30, 0x22, 0x01, 0x00, 0x22, 0x01, 0x22, 0x01, 0x64, 0x22, 0x01, - 0x22, 0x11, 0x5d, 0x35, 0x00, 0x11, 0x5d, 0x5d, 0x35, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x48, 0x00, 0x00, 0x02, 0x79, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x10, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x00, 0xc9, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x01, 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, - 0xff, 0xff, 0x00, 0x33, 0xff, 0xec, 0x04, 0xcf, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x11, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x02, 0xa6, 0x00, 0x00, - 0x00, 0x0a, 0xb4, 0x02, 0x00, 0x22, 0x01, 0x22, 0x00, 0x11, 0x5d, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xfe, 0x7f, 0x04, 0x58, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x13, 0x00, 0x00, 0x10, 0x07, 0x04, 0xf4, 0x02, 0x35, 0x00, 0xba, - 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00, 0x04, 0x71, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x14, 0x00, 0x00, 0x10, 0x07, 0x04, 0xf4, 0x02, 0x2d, 0x00, 0xb4, - 0xff, 0xff, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x04, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x16, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, 0x01, 0x48, 0xfe, 0xd4, - 0x00, 0x17, 0x40, 0x0d, 0x01, 0x2f, 0x12, 0x01, 0x12, 0x01, 0x24, 0x12, - 0x01, 0x10, 0x12, 0x01, 0x12, 0x11, 0x5d, 0x5d, 0x35, 0x00, 0x11, 0x5d, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0xfe, 0x7f, 0x04, 0x48, - 0x04, 0xcb, 0x12, 0x26, 0x05, 0x17, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, - 0x02, 0x54, 0x00, 0x64, 0x00, 0x0e, 0xb7, 0x02, 0xa0, 0x1d, 0x01, 0x30, - 0x1d, 0x01, 0x1d, 0x00, 0x11, 0x5d, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x27, - 0x00, 0x00, 0x03, 0xa2, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x18, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x01, 0x98, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x01, - 0x00, 0x10, 0x01, 0x10, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0x33, - 0xff, 0xf6, 0x05, 0x7f, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x19, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x03, 0xb8, 0xff, 0xb1, 0x00, 0x1f, 0x40, 0x13, - 0x01, 0x5f, 0x1e, 0x01, 0x1e, 0x01, 0x9b, 0x1e, 0x01, 0x84, 0x1e, 0x01, - 0x7b, 0x1e, 0x01, 0x54, 0x1e, 0x01, 0x1e, 0x11, 0x5d, 0x5d, 0x5d, 0x5d, - 0x35, 0x00, 0x11, 0x5d, 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, - 0x00, 0x00, 0x04, 0xe3, 0x04, 0xcb, 0x12, 0x26, 0x05, 0x1a, 0x00, 0x00, - 0x11, 0x07, 0x04, 0xf4, 0x02, 0xe1, 0x00, 0x00, 0x00, 0x0a, 0xb4, 0x01, - 0x00, 0x1a, 0x01, 0x1a, 0x00, 0x11, 0x5d, 0x35, 0xff, 0xff, 0x00, 0xae, - 0x00, 0x00, 0x01, 0x66, 0x06, 0x46, 0x12, 0x26, 0x05, 0x05, 0x00, 0x00, - 0x10, 0x07, 0x04, 0xf1, 0x01, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, - 0x00, 0x00, 0x04, 0x81, 0x06, 0x2b, 0x12, 0x26, 0x05, 0x01, 0x00, 0x00, - 0x10, 0x07, 0x04, 0xf7, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, - 0x00, 0x00, 0x03, 0xc3, 0x06, 0x2b, 0x12, 0x26, 0x05, 0x0b, 0x00, 0x00, - 0x10, 0x07, 0x04, 0xf7, 0x01, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8f, - 0x00, 0x00, 0x04, 0x71, 0x06, 0x2b, 0x12, 0x26, 0x05, 0x14, 0x00, 0x00, - 0x10, 0x07, 0x04, 0xf7, 0x02, 0x42, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x04, 0xec, 0x06, 0x81, 0x00, 0x11, 0x00, 0x4a, 0x40, 0x17, - 0x00, 0x05, 0x09, 0x0a, 0x0a, 0x0f, 0x06, 0x05, 0x04, 0x01, 0x11, 0x10, - 0x10, 0x13, 0x04, 0x01, 0x01, 0x12, 0x0f, 0x06, 0x06, 0x04, 0x11, 0x41, - 0x09, 0x01, 0x3a, 0x00, 0x10, 0x00, 0x09, 0x01, 0x39, 0x00, 0x01, 0x00, - 0x04, 0x01, 0x39, 0x00, 0x02, 0x01, 0x36, 0x00, 0x3f, 0x3f, 0x33, 0x3f, - 0x2f, 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x12, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x13, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, 0x36, 0x13, 0x37, 0x33, 0x07, - 0x0e, 0x02, 0x07, 0x01, 0x23, 0xee, 0x9e, 0xba, 0x56, 0x01, 0xc3, 0x96, - 0x1c, 0x17, 0xbe, 0x17, 0x0a, 0x3c, 0x63, 0x67, 0x01, 0x69, 0xea, 0x04, - 0x2f, 0x02, 0x52, 0xfe, 0x4a, 0xfd, 0x93, 0x8c, 0x01, 0x02, 0xdf, 0xdb, - 0x6b, 0xac, 0x96, 0x66, 0xfe, 0x23, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xe9, - 0x04, 0xbf, 0x00, 0x04, 0x06, 0x32, 0x00, 0x09, 0x00, 0x0a, 0xb2, 0x09, - 0x80, 0x05, 0x00, 0x2f, 0x1a, 0xcc, 0x31, 0x30, 0x13, 0x23, 0x22, 0x04, - 0x07, 0x23, 0x36, 0x24, 0x21, 0x33, 0x04, 0x04, 0xeb, 0xfe, 0xb7, 0x5e, - 0x85, 0x78, 0x01, 0x7e, 0x01, 0x0d, 0x18, 0x05, 0xb7, 0x76, 0x82, 0xbe, - 0xb5, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfd, 0x04, 0xbf, 0x03, 0x18, - 0x06, 0x32, 0x00, 0x09, 0x00, 0x0a, 0xb2, 0x01, 0x80, 0x05, 0x00, 0x2f, - 0x1a, 0xcc, 0x31, 0x30, 0x03, 0x33, 0x20, 0x04, 0x17, 0x23, 0x26, 0x24, - 0x2b, 0x01, 0x03, 0x18, 0x01, 0x0c, 0x01, 0x7f, 0x78, 0x85, 0x5e, 0xfe, - 0xb7, 0xeb, 0x04, 0x06, 0x32, 0xb5, 0xbe, 0x82, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xfc, 0xfc, 0x04, 0xc4, 0x00, 0x00, 0x05, 0xd0, 0x00, 0x0d, - 0x00, 0x10, 0xb5, 0x00, 0x00, 0x03, 0x0b, 0x80, 0x08, 0x00, 0x2f, 0x1a, - 0xcd, 0x32, 0x39, 0x2f, 0x31, 0x30, 0x11, 0x2e, 0x01, 0x23, 0x22, 0x0e, - 0x01, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x60, 0xb0, 0x46, 0x5b, - 0x71, 0x3e, 0x12, 0x92, 0x20, 0xdc, 0xba, 0x77, 0xd7, 0x04, 0xfb, 0x17, - 0x29, 0x17, 0x2e, 0x32, 0x8f, 0x7d, 0x35, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x04, 0xc4, 0x03, 0x05, 0x05, 0xd0, 0x00, 0x0e, 0x00, 0x0c, 0xb3, 0x07, - 0x80, 0x03, 0x0b, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x31, 0x30, 0x11, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, - 0x61, 0xb1, 0x45, 0x84, 0x82, 0x14, 0x94, 0x19, 0x6d, 0xb2, 0x7a, 0x4e, - 0xad, 0x58, 0x05, 0x9b, 0x18, 0x2a, 0x34, 0x43, 0x66, 0x71, 0x35, 0x22, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x05, 0xc1, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x17, - 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x41, - 0x00, 0x4f, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x6a, 0x00, 0x76, 0x00, 0xf9, - 0x40, 0x82, 0x07, 0x1f, 0x1f, 0x12, 0x06, 0x1e, 0x1e, 0x12, 0x0b, 0x01, - 0x15, 0x15, 0x12, 0x71, 0x65, 0x18, 0x2a, 0x60, 0x6b, 0x55, 0x5d, 0x5d, - 0x46, 0x4d, 0x4a, 0x50, 0x42, 0x58, 0x3f, 0x3a, 0x03, 0x13, 0x13, 0x3a, - 0x3c, 0x33, 0x58, 0x50, 0x46, 0x6b, 0x2a, 0x65, 0x0a, 0x2b, 0x0a, 0x00, - 0x12, 0x12, 0x78, 0x22, 0x1a, 0x2e, 0x2e, 0x2b, 0x0f, 0x27, 0x27, 0x2b, - 0x0e, 0x26, 0x26, 0x23, 0x1b, 0x2b, 0x2b, 0x77, 0x28, 0x20, 0x14, 0x2e, - 0x2e, 0x2b, 0x6e, 0x68, 0x68, 0x47, 0x3c, 0x54, 0x54, 0x3d, 0x47, 0x01, - 0x1b, 0x0c, 0x24, 0x5c, 0x55, 0x0b, 0x23, 0x46, 0x30, 0x62, 0x62, 0x5d, - 0x37, 0x74, 0x16, 0x2c, 0x47, 0x1b, 0x24, 0x55, 0x23, 0x34, 0x74, 0x2c, - 0x2c, 0x74, 0x34, 0x23, 0x55, 0x24, 0x1b, 0x47, 0x08, 0x2b, 0x0f, 0x07, - 0x03, 0x19, 0x19, 0x10, 0x08, 0x04, 0x1c, 0x27, 0x1f, 0x13, 0x2b, 0x12, - 0x00, 0x3f, 0x33, 0x33, 0x33, 0xc6, 0x32, 0x32, 0x32, 0x32, 0x11, 0x33, - 0x33, 0x33, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x2f, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x2f, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x33, 0x11, 0x01, 0x33, - 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x12, 0x17, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, - 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x33, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x23, 0x35, - 0x23, 0x35, 0x21, 0x05, 0x21, 0x35, 0x21, 0x01, 0x23, 0x11, 0x33, 0x01, - 0x21, 0x35, 0x21, 0x01, 0x21, 0x35, 0x33, 0x35, 0x33, 0x01, 0x23, 0x15, - 0x23, 0x11, 0x21, 0x01, 0x21, 0x35, 0x21, 0x01, 0x23, 0x11, 0x33, 0x01, - 0x21, 0x35, 0x21, 0x05, 0x21, 0x11, 0x33, 0x15, 0x33, 0x25, 0x22, 0x26, - 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, - 0x11, 0x14, 0x06, 0x25, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x20, 0x15, - 0x14, 0x06, 0x07, 0x1e, 0x01, 0x03, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, - 0x32, 0x17, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x01, 0x10, 0x21, - 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, - 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x08, 0x00, 0x64, 0xdf, - 0x01, 0x43, 0xfd, 0xc1, 0xfe, 0xbd, 0x01, 0x43, 0x02, 0x3f, 0x64, 0x64, - 0xfb, 0x82, 0xfe, 0xbd, 0x01, 0x43, 0x04, 0x7e, 0xfe, 0xbd, 0xdf, 0x64, - 0xf9, 0x43, 0xdf, 0x64, 0x01, 0x43, 0x04, 0x7e, 0xfe, 0xbd, 0x01, 0x43, - 0xfa, 0xa3, 0x64, 0x64, 0x03, 0x1e, 0xfe, 0xbd, 0x01, 0x43, 0xfd, 0xc1, - 0xfe, 0xbd, 0x64, 0xdf, 0x05, 0x00, 0x5d, 0x5f, 0x15, 0x6b, 0x0c, 0x2a, - 0x30, 0x32, 0x2c, 0x5e, 0xca, 0x64, 0xfe, 0x8f, 0x9b, 0x8f, 0xb0, 0x8e, - 0x01, 0x1e, 0x4d, 0x4e, 0x63, 0x66, 0x9d, 0x59, 0x56, 0x20, 0x20, 0xaf, - 0x2f, 0x65, 0x65, 0x34, 0x3d, 0xc1, 0xfe, 0x40, 0xfe, 0xd9, 0x95, 0x92, - 0x92, 0x96, 0x94, 0x92, 0x71, 0x59, 0x5c, 0x60, 0x57, 0x5a, 0x5c, 0x5d, - 0x59, 0x04, 0x7e, 0xdf, 0x64, 0x64, 0x64, 0xfc, 0x7e, 0x01, 0x43, 0x01, - 0xdb, 0x64, 0xfa, 0x3f, 0x64, 0xdf, 0x04, 0x1a, 0xdf, 0x01, 0x43, 0xfa, - 0x3f, 0x64, 0x01, 0xdb, 0x01, 0x43, 0xfc, 0x7e, 0x64, 0x64, 0x01, 0x43, - 0xdf, 0xe3, 0x5f, 0x77, 0x12, 0x4b, 0x44, 0x43, 0x5f, 0x01, 0xe2, 0x5a, - 0xfd, 0xc7, 0x82, 0x7c, 0xf1, 0x6c, 0x79, 0x03, 0x2b, 0xc4, 0x44, 0x66, - 0x11, 0x0b, 0x6b, 0x01, 0x23, 0x42, 0x39, 0xfe, 0xfe, 0xe4, 0x45, 0x4a, - 0xfe, 0xda, 0x01, 0x43, 0xfe, 0x5a, 0xcd, 0xd9, 0xd5, 0xc9, 0xc9, 0xd5, - 0xab, 0x99, 0x9a, 0xaa, 0xae, 0x9f, 0x97, 0x00, 0x00, 0x01, 0x00, 0x7f, - 0xfe, 0x4e, 0x01, 0x48, 0xff, 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x40, 0x19, - 0x07, 0x00, 0x04, 0x09, 0x00, 0x09, 0x0c, 0x0b, 0x08, 0x08, 0x03, 0x00, - 0x09, 0x10, 0x09, 0x02, 0x09, 0x00, 0x03, 0x10, 0x03, 0x20, 0x03, 0x03, - 0x03, 0x00, 0x2f, 0x5d, 0x2f, 0x5d, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x06, 0x07, - 0x23, 0x3e, 0x01, 0x35, 0x23, 0x35, 0x33, 0x01, 0x48, 0x2c, 0x28, 0x75, - 0x2d, 0x31, 0x58, 0xc3, 0xc1, 0x57, 0x6b, 0x2f, 0x30, 0x56, 0x2e, 0x9c, - 0x00, 0x01, 0xff, 0xe5, 0x04, 0xb0, 0x02, 0xc3, 0x05, 0xf0, 0x00, 0x09, - 0x00, 0x25, 0x40, 0x10, 0x07, 0x08, 0x08, 0x0b, 0x03, 0x02, 0x0a, 0x07, - 0x02, 0x00, 0x80, 0x00, 0x05, 0x8e, 0x59, 0x00, 0x00, 0x2f, 0x2b, 0x00, - 0x1a, 0x18, 0x10, 0xcc, 0x32, 0x11, 0x01, 0x33, 0x32, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, - 0x02, 0x01, 0x54, 0xfe, 0x9c, 0x0b, 0xa4, 0x0c, 0xbf, 0xbf, 0x0c, 0xa4, - 0x0b, 0x04, 0xb0, 0x01, 0x40, 0xc7, 0xc7, 0xfe, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x7c, 0x04, 0x1c, 0x01, 0x45, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2c, 0x40, 0x19, 0x06, 0x00, 0x04, 0x08, 0x00, 0x08, 0x0b, 0x0a, - 0x08, 0x07, 0x92, 0x59, 0x50, 0x03, 0x60, 0x03, 0x02, 0xa0, 0x03, 0xb0, - 0x03, 0x02, 0x03, 0x08, 0x03, 0x00, 0x3f, 0xcc, 0x5d, 0x71, 0x2b, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x01, 0x14, - 0x06, 0x07, 0x23, 0x36, 0x35, 0x23, 0x35, 0x33, 0x01, 0x45, 0x2c, 0x28, - 0x75, 0x5e, 0x58, 0xc3, 0x05, 0x17, 0x57, 0x75, 0x2f, 0x64, 0x5a, 0xa7, - 0x00, 0x01, 0x00, 0x82, 0x04, 0xbb, 0x01, 0x4b, 0x06, 0x20, 0x00, 0x09, - 0x00, 0x37, 0x40, 0x22, 0x06, 0x09, 0x04, 0x08, 0x09, 0x08, 0x0a, 0x0b, - 0x09, 0x06, 0x92, 0x59, 0x5f, 0x03, 0x6f, 0x03, 0x02, 0xaf, 0x03, 0xbf, - 0x03, 0x02, 0x03, 0x50, 0x09, 0x01, 0x0f, 0x09, 0x3f, 0x09, 0x7f, 0x09, - 0x03, 0x09, 0x00, 0x2f, 0x5d, 0x71, 0xcd, 0x5d, 0x71, 0x2b, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x13, 0x34, 0x36, - 0x37, 0x33, 0x06, 0x15, 0x33, 0x15, 0x23, 0x82, 0x2c, 0x28, 0x75, 0x5e, - 0x58, 0xc3, 0x05, 0x25, 0x57, 0x75, 0x2f, 0x64, 0x5a, 0xa7, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x6a, 0x05, 0xfa, 0x02, 0x12, 0x06, 0xf0, 0x00, 0x05, - 0x00, 0x26, 0x40, 0x17, 0x01, 0x04, 0x06, 0x07, 0x9f, 0x02, 0xaf, 0x02, - 0xbf, 0x02, 0x03, 0x02, 0x80, 0x1f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x5f, - 0x00, 0x04, 0x00, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, 0x5d, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x31, 0x30, 0x01, 0x25, 0x35, 0x33, 0x17, 0x15, 0x01, 0xa0, - 0xfe, 0xca, 0xcf, 0xd9, 0x05, 0xfa, 0xd9, 0x1d, 0xe2, 0x14, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x48, 0x05, 0xfa, 0x01, 0xf0, 0x06, 0xf0, 0x00, 0x05, - 0x00, 0x26, 0x40, 0x17, 0x01, 0x04, 0x06, 0x07, 0x9f, 0x02, 0xaf, 0x02, - 0xbf, 0x02, 0x03, 0x02, 0x80, 0x1f, 0x00, 0x2f, 0x00, 0x3f, 0x00, 0x5f, - 0x00, 0x04, 0x00, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, 0x5d, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x35, 0x37, 0x33, 0x15, 0x05, 0x48, 0xd9, - 0xcf, 0xfe, 0xca, 0x05, 0xfa, 0x14, 0xe2, 0x1d, 0xd9, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x05, 0xfa, 0x02, 0x96, 0x06, 0xfe, 0x00, 0x09, - 0x00, 0x34, 0x40, 0x1d, 0x09, 0x08, 0x03, 0x03, 0x01, 0x06, 0x00, 0x06, - 0x0b, 0x0a, 0x03, 0x9f, 0x08, 0xaf, 0x08, 0x02, 0x08, 0x80, 0x05, 0x1f, - 0x01, 0x2f, 0x01, 0x3f, 0x01, 0x5f, 0x01, 0x04, 0x01, 0x00, 0x2f, 0x5d, - 0x33, 0x1a, 0xcd, 0x5d, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x12, - 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, 0x27, 0x23, 0x07, - 0x23, 0x35, 0x37, 0x33, 0x02, 0x96, 0x69, 0xdb, 0x02, 0xe8, 0x68, 0xea, - 0xcc, 0x06, 0x0e, 0x14, 0x8b, 0x8b, 0x14, 0xf0, 0x00, 0x01, 0x00, 0x00, - 0x05, 0xfa, 0x02, 0x96, 0x06, 0xfe, 0x00, 0x09, 0x00, 0x30, 0x40, 0x1b, - 0x00, 0x01, 0x05, 0x05, 0x08, 0x03, 0x03, 0x08, 0x0a, 0x0b, 0x9f, 0x03, - 0xaf, 0x03, 0x02, 0x03, 0x80, 0x1f, 0x01, 0x2f, 0x01, 0x3f, 0x01, 0x5f, - 0x01, 0x04, 0x01, 0x00, 0x2f, 0x5d, 0x1a, 0xcd, 0x5d, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x33, 0x31, 0x30, 0x01, 0x23, - 0x27, 0x35, 0x33, 0x17, 0x33, 0x37, 0x33, 0x15, 0x01, 0xb6, 0xcc, 0xea, - 0x68, 0xe8, 0x02, 0xdb, 0x69, 0x05, 0xfa, 0xef, 0x15, 0x8b, 0x8b, 0x15, - 0x00, 0x02, 0x00, 0x2d, 0x05, 0xfa, 0x02, 0x5a, 0x06, 0xb2, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x24, 0x40, 0x10, 0x07, 0x04, 0x00, 0x03, 0x04, 0x03, - 0x08, 0x09, 0x01, 0x05, 0x04, 0x05, 0x91, 0x59, 0x00, 0x04, 0x00, 0x2f, - 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x01, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, - 0x01, 0xb7, 0xa3, 0xfd, 0xd3, 0xa5, 0x05, 0xfa, 0xb8, 0xb8, 0xb8, 0xb8, - 0x00, 0x01, 0xff, 0xe9, 0x05, 0xfa, 0x02, 0xb6, 0x07, 0x06, 0x00, 0x17, - 0x00, 0x49, 0x40, 0x2a, 0x14, 0x15, 0x15, 0x19, 0x08, 0x09, 0x09, 0x18, - 0x14, 0x0d, 0x0d, 0x05, 0x8f, 0x59, 0x1f, 0x0d, 0x01, 0xb0, 0x0d, 0xc0, - 0x0d, 0xd0, 0x0d, 0x03, 0x0f, 0x0d, 0x1f, 0x0d, 0x2f, 0x0d, 0x03, 0x09, - 0x03, 0x0d, 0x00, 0x40, 0x00, 0x12, 0x8f, 0x59, 0x08, 0x00, 0x00, 0x2f, - 0x32, 0x2b, 0x00, 0x1a, 0x18, 0x10, 0xcd, 0x5f, 0x5e, 0x5d, 0x5d, 0x71, - 0x2b, 0x11, 0x00, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x23, - 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, - 0x01, 0xec, 0x2a, 0x54, 0x4e, 0x47, 0x1f, 0x37, 0x36, 0x09, 0x5b, 0x0b, - 0x30, 0x51, 0x3f, 0x2c, 0x54, 0x4e, 0x45, 0x1e, 0x64, 0x11, 0x5c, 0x11, - 0x64, 0x05, 0xfa, 0x25, 0x2d, 0x25, 0x3e, 0x39, 0x66, 0x69, 0x3d, 0x25, - 0x2d, 0x25, 0x77, 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, - 0x05, 0xfa, 0x03, 0x0f, 0x06, 0xf1, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x2d, - 0x40, 0x1c, 0x0a, 0x04, 0x07, 0x01, 0x04, 0x0c, 0x0d, 0x08, 0x9f, 0x02, - 0xaf, 0x02, 0xbf, 0x02, 0x03, 0x02, 0x80, 0x06, 0x1f, 0x00, 0x2f, 0x00, - 0x3f, 0x00, 0x5f, 0x00, 0x04, 0x00, 0x00, 0x2f, 0x5d, 0x32, 0x1a, 0xcd, - 0x5d, 0x32, 0x11, 0x12, 0x01, 0x17, 0x39, 0x31, 0x30, 0x13, 0x35, 0x37, - 0x33, 0x15, 0x05, 0x33, 0x35, 0x37, 0x33, 0x15, 0x05, 0x20, 0xc5, 0xcf, - 0xfe, 0xca, 0xfd, 0xc5, 0xcf, 0xfe, 0xca, 0x05, 0xfa, 0x14, 0xe3, 0x1d, - 0xda, 0x14, 0xe3, 0x1d, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe8, - 0x05, 0xfa, 0x02, 0x82, 0x06, 0xf3, 0x00, 0x0d, 0x00, 0x26, 0x40, 0x13, - 0x0a, 0x0b, 0x0b, 0x0f, 0x04, 0x03, 0x0e, 0x0a, 0x9f, 0x03, 0xaf, 0x03, - 0xbf, 0x03, 0x03, 0x03, 0x80, 0x07, 0x00, 0x00, 0x2f, 0xcd, 0x1a, 0xcd, - 0x5d, 0x32, 0x11, 0x01, 0x33, 0x32, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, - 0x0e, 0x01, 0x01, 0x34, 0x85, 0xb5, 0x12, 0x75, 0x11, 0x6d, 0x5b, 0x5b, - 0x6b, 0x11, 0x75, 0x15, 0xb4, 0x05, 0xfa, 0x8a, 0x6f, 0x35, 0x3c, 0x3d, - 0x34, 0x72, 0x87, 0x00, 0xff, 0xff, 0x00, 0x6a, 0x04, 0xb1, 0x02, 0x12, - 0x05, 0xe4, 0x10, 0x06, 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, - 0x04, 0xb1, 0x02, 0x12, 0x05, 0xe4, 0x10, 0x06, 0x00, 0x43, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0x04, 0xb1, 0x02, 0x12, 0x05, 0xe4, 0x10, 0x06, - 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x48, 0x04, 0xb1, 0x01, 0xf0, - 0x05, 0xe4, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x48, - 0x04, 0xb1, 0x01, 0xf0, 0x05, 0xe4, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x48, 0x04, 0xb1, 0x01, 0xf0, 0x05, 0xe4, 0x10, 0x06, - 0x00, 0x76, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x17, 0x05, 0xc9, 0xff, 0xc8, - 0x07, 0x2b, 0x00, 0x12, 0x00, 0x0c, 0xb3, 0x03, 0x10, 0x08, 0x0f, 0x00, - 0x2f, 0xcc, 0x39, 0x39, 0x31, 0x30, 0x03, 0x34, 0x26, 0x23, 0x22, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x3e, - 0x01, 0xdf, 0x33, 0x2a, 0x48, 0x46, 0x1f, 0x5a, 0x6a, 0xed, 0x51, 0x5b, - 0x70, 0x45, 0x30, 0x06, 0x81, 0x1f, 0x22, 0x18, 0x63, 0x1e, 0x95, 0x3b, - 0x55, 0x0b, 0x32, 0x78, 0x03, 0x1e, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x11, - 0x05, 0xc9, 0xfe, 0xc2, 0x07, 0x2b, 0x00, 0x12, 0x00, 0x0c, 0xb3, 0x03, - 0x10, 0x08, 0x0f, 0x00, 0x2f, 0xcc, 0x39, 0x39, 0x31, 0x30, 0x01, 0x34, - 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x07, - 0x15, 0x23, 0x35, 0x3e, 0x01, 0xfe, 0x1b, 0x33, 0x2a, 0x48, 0x46, 0x1f, - 0x5a, 0x6a, 0xed, 0x51, 0x5b, 0x70, 0x45, 0x30, 0x06, 0x81, 0x1f, 0x22, - 0x18, 0x63, 0x1e, 0x95, 0x3b, 0x55, 0x0b, 0x32, 0x78, 0x03, 0x1e, 0x00, - 0x00, 0x01, 0xfc, 0x58, 0x05, 0xc9, 0xfe, 0x09, 0x07, 0x2b, 0x00, 0x12, - 0x00, 0x0c, 0xb3, 0x03, 0x10, 0x08, 0x0f, 0x00, 0x2f, 0xcc, 0x39, 0x39, - 0x31, 0x30, 0x01, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, - 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x3e, 0x01, 0xfd, 0x62, 0x33, - 0x2a, 0x48, 0x46, 0x1f, 0x5a, 0x6a, 0xed, 0x51, 0x5b, 0x70, 0x45, 0x30, - 0x06, 0x81, 0x1f, 0x22, 0x18, 0x63, 0x1e, 0x95, 0x3b, 0x55, 0x0b, 0x32, - 0x78, 0x03, 0x1e, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, - 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xdd, 0x04, 0xb1, 0x02, 0x77, 0x05, 0xe6, 0x10, 0x06, - 0x02, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x04, 0xb1, 0x02, 0x96, - 0x05, 0xd3, 0x10, 0x06, 0x02, 0x88, 0x00, 0x00, 0x00, 0x01, 0xff, 0x0f, - 0xfe, 0xc9, 0xff, 0xc3, 0xff, 0x75, 0x00, 0x03, 0x00, 0x08, 0xb1, 0x00, - 0x02, 0x00, 0x2f, 0xcd, 0x31, 0x30, 0x03, 0x35, 0x33, 0x15, 0xf1, 0xb4, - 0xfe, 0xc9, 0xac, 0xac, 0xff, 0xff, 0x00, 0x48, 0x04, 0xb1, 0x01, 0xf0, - 0x05, 0xe4, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x48, - 0x04, 0xb1, 0x01, 0xf0, 0x05, 0xe4, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x6a, 0x04, 0xb1, 0x02, 0x12, 0x05, 0xe4, 0x10, 0x06, - 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0x04, 0xb1, 0x02, 0x12, - 0x05, 0xe4, 0x10, 0x06, 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x17, - 0x05, 0xc9, 0xff, 0xc8, 0x07, 0x2b, 0x12, 0x06, 0x02, 0xcb, 0x00, 0x00, - 0xff, 0xff, 0xfe, 0x17, 0x05, 0xc9, 0xff, 0xc8, 0x07, 0x2b, 0x12, 0x06, - 0x02, 0xcb, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, - 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, - 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, - 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, - 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xc9, 0xfd, 0xb3, - 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfc, 0x8b, 0xfe, 0xc9, 0xfd, 0x3f, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfd, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xeb, - 0xfe, 0xc9, 0xfc, 0x9f, 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfc, 0xdc, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0xc9, 0xfd, 0x83, - 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfb, 0xa6, 0xfe, 0xc9, 0xfc, 0x5a, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfc, 0x97, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0xff, 0xff, 0xfd, 0x6d, 0xfe, 0xc9, 0xfe, 0x21, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfe, 0x5e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x84, - 0xfe, 0xc9, 0xff, 0x38, 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xff, 0x75, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xca, 0xfe, 0xc9, 0xff, 0x7e, - 0xff, 0x75, 0x10, 0x06, 0x09, 0x12, 0xbb, 0x00, 0xff, 0xff, 0xfc, 0xf9, - 0xfe, 0xc9, 0xfd, 0xad, 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfd, 0xea, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x7a, 0xfe, 0xc9, 0xfe, 0x2e, - 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfe, 0x6b, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfd, 0x66, 0xfe, 0xc9, 0xfe, 0x1a, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfe, 0x57, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x9e, - 0xfe, 0xc9, 0xfd, 0x52, 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfd, 0x8f, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x23, 0xfe, 0xc9, 0xfd, 0xd7, - 0xff, 0x75, 0x10, 0x07, 0x09, 0x12, 0xfe, 0x14, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xfc, 0x3a, 0xfe, 0xc9, 0xfc, 0xee, 0xff, 0x75, 0x10, 0x07, - 0x09, 0x12, 0xfd, 0x2b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, - 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x04, 0xb1, 0x02, 0xb6, - 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, - 0x04, 0xb1, 0x02, 0xb6, 0x05, 0xbd, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x01, 0x3c, 0x04, 0x26, 0x00, 0x03, - 0x00, 0x16, 0x40, 0x09, 0x03, 0x00, 0x00, 0x04, 0x05, 0x02, 0x0f, 0x00, - 0x15, 0x00, 0x3f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x33, 0x11, 0x33, 0x11, 0x88, 0xb4, 0x04, 0x26, 0xfb, 0xda, 0x00, 0x00, - 0x00, 0x03, 0xfe, 0xd6, 0x05, 0xb2, 0x01, 0x2b, 0x07, 0x2b, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x0b, 0x00, 0x25, 0x40, 0x15, 0x08, 0x9f, 0x0b, 0xff, - 0x0b, 0x02, 0x0b, 0x40, 0x09, 0x0d, 0x48, 0x0b, 0x0b, 0x05, 0x01, 0x01, - 0x04, 0x6f, 0x00, 0x01, 0x00, 0x00, 0x2f, 0x72, 0x32, 0x32, 0x11, 0x33, - 0x32, 0x2f, 0x2b, 0x5d, 0x33, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x21, - 0x35, 0x33, 0x15, 0x25, 0x21, 0x35, 0x21, 0x88, 0xa3, 0xfd, 0xab, 0xa3, - 0x01, 0x9a, 0xfd, 0xdb, 0x02, 0x25, 0x05, 0xb2, 0xb8, 0xb8, 0xb8, 0xb8, - 0xfa, 0x7f, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xd6, 0x05, 0xa8, 0x01, 0x2b, - 0x07, 0x2b, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x55, 0x40, 0x1c, - 0x0c, 0x07, 0x04, 0x07, 0x04, 0x06, 0x01, 0x0d, 0x0d, 0x6b, 0x06, 0x01, - 0x06, 0x84, 0x01, 0x01, 0xf0, 0x01, 0x01, 0x02, 0xb0, 0x01, 0xd0, 0x01, - 0xe0, 0x01, 0x03, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x1e, 0x21, 0x48, - 0x0f, 0x01, 0x01, 0xe0, 0x01, 0xf0, 0x01, 0x02, 0x9f, 0x01, 0x01, 0x30, - 0x01, 0x40, 0x01, 0x50, 0x01, 0x70, 0x01, 0x80, 0x01, 0x05, 0x01, 0x00, - 0x2f, 0x5d, 0x5d, 0x5d, 0x71, 0x2b, 0x71, 0x5f, 0x71, 0x72, 0x2f, 0x72, - 0x33, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x31, 0x30, 0x13, - 0x33, 0x15, 0x05, 0x23, 0x35, 0x17, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, - 0x15, 0x3e, 0xe2, 0xfe, 0xfb, 0x82, 0xef, 0xa3, 0xfd, 0xab, 0xa3, 0x07, - 0x2b, 0x0c, 0xab, 0x0a, 0xd6, 0xb8, 0xb8, 0xb8, 0xb8, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xfe, 0xcf, 0x05, 0xa8, 0x01, 0x33, 0x07, 0x2b, 0x00, 0x08, - 0x00, 0x0c, 0x00, 0x10, 0x00, 0x5b, 0x40, 0x1f, 0x08, 0x03, 0x07, 0x0f, - 0x0b, 0x03, 0x0b, 0x03, 0x0b, 0x10, 0x6b, 0x0c, 0x01, 0x0c, 0x07, 0x07, - 0x84, 0x00, 0x01, 0xf0, 0x00, 0x01, 0x02, 0xb0, 0x00, 0xd0, 0x00, 0xe0, - 0x00, 0x03, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x1e, 0x21, 0x48, 0x0f, - 0x00, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x02, 0x9f, 0x00, 0x01, 0x30, 0x00, - 0x40, 0x00, 0x50, 0x00, 0x70, 0x00, 0x80, 0x00, 0x05, 0x00, 0x00, 0x2f, - 0x5d, 0x5d, 0x5d, 0x71, 0x2b, 0x71, 0x5f, 0x71, 0x72, 0x32, 0x2f, 0x2f, - 0x72, 0x33, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x39, 0x31, - 0x30, 0x13, 0x33, 0x15, 0x07, 0x23, 0x27, 0x35, 0x33, 0x17, 0x13, 0x35, - 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x98, 0x9b, 0xd0, 0xc3, 0xd1, 0x9b, - 0x97, 0x87, 0xa3, 0xfd, 0xab, 0xa3, 0x07, 0x2b, 0x0a, 0xad, 0xab, 0x0c, - 0x61, 0xfe, 0xde, 0xb8, 0xb8, 0xb8, 0xb8, 0x00, 0x00, 0x03, 0xfe, 0xd6, - 0x05, 0xa8, 0x01, 0x2b, 0x07, 0x2b, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, - 0x00, 0x53, 0x40, 0x1b, 0x0b, 0x08, 0x02, 0x08, 0x02, 0x08, 0x05, 0x0a, - 0x6b, 0x09, 0x01, 0x09, 0x84, 0x05, 0x01, 0xf0, 0x05, 0x01, 0x02, 0xb0, - 0x05, 0xd0, 0x05, 0xe0, 0x05, 0x03, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x1a, - 0x1e, 0x21, 0x48, 0x0f, 0x05, 0x01, 0xe0, 0x05, 0xf0, 0x05, 0x02, 0x9f, - 0x05, 0x01, 0x30, 0x05, 0x40, 0x05, 0x50, 0x05, 0x70, 0x05, 0x80, 0x05, - 0x05, 0x05, 0x00, 0x2f, 0x5d, 0x5d, 0x5d, 0x71, 0x2b, 0x71, 0x5f, 0x71, - 0x72, 0x2f, 0x72, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x31, - 0x30, 0x13, 0x15, 0x23, 0x25, 0x35, 0x33, 0x03, 0x35, 0x33, 0x15, 0x21, - 0x35, 0x33, 0x15, 0x68, 0x82, 0xfe, 0xfb, 0xe2, 0xed, 0xa3, 0x01, 0x0f, - 0xa3, 0x06, 0x7e, 0x0a, 0xab, 0x0c, 0xfe, 0x7d, 0xb8, 0xb8, 0xb8, 0xb8, - 0x00, 0x02, 0xfe, 0xee, 0x05, 0xbc, 0x01, 0x13, 0x07, 0x2b, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x27, 0x40, 0x19, 0x04, 0x0f, 0x07, 0x5f, 0x07, 0x02, - 0xaf, 0x07, 0xff, 0x07, 0x02, 0x07, 0x40, 0x09, 0x0d, 0x48, 0x07, 0x07, - 0x01, 0x50, 0x00, 0xf0, 0x00, 0x02, 0x00, 0x00, 0x2f, 0x71, 0x32, 0x32, - 0x2f, 0x2b, 0x5d, 0x71, 0x33, 0x31, 0x30, 0x03, 0x35, 0x33, 0x15, 0x37, - 0x21, 0x35, 0x21, 0x57, 0xa3, 0xc7, 0xfd, 0xdb, 0x02, 0x25, 0x05, 0xbc, - 0xb8, 0xb8, 0xf0, 0x7f, 0x00, 0x02, 0xfe, 0xc2, 0x05, 0xc3, 0x01, 0x3f, - 0x07, 0x2b, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x37, 0x40, 0x24, 0x17, 0x08, - 0x20, 0x10, 0x30, 0x10, 0x40, 0x10, 0x03, 0x10, 0x10, 0x01, 0x14, 0x0b, - 0x04, 0x08, 0x01, 0x18, 0x01, 0x02, 0x01, 0x6f, 0x02, 0x7f, 0x02, 0x9f, - 0x02, 0xaf, 0x02, 0x04, 0x02, 0x40, 0x19, 0x1e, 0x48, 0x02, 0x00, 0x2f, - 0x2b, 0x5d, 0x33, 0x71, 0x2f, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x71, 0x33, - 0x33, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x03, 0x22, 0x27, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x02, 0x01, 0x13, 0xfd, 0xdb, 0x02, 0x25, 0x94, - 0x33, 0x54, 0x55, 0x24, 0x2d, 0x2d, 0x08, 0x5b, 0x0b, 0x2b, 0x4c, 0x3f, - 0x37, 0x53, 0x53, 0x22, 0x30, 0x2b, 0x06, 0x5c, 0x0c, 0x2a, 0x4b, 0x06, - 0xac, 0x7f, 0xfe, 0x98, 0x26, 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, 0x25, - 0x26, 0x26, 0x25, 0x51, 0x4a, 0x27, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x27, 0x40, 0x12, - 0x07, 0x01, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, 0x08, 0x03, 0x07, 0x07, - 0x01, 0x04, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0xa4, 0xfe, 0xcd, 0x01, 0x65, 0x01, 0x2a, 0x88, 0x03, - 0x9d, 0x01, 0x5c, 0x88, 0xfe, 0xd6, 0x01, 0x2a, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x27, 0x40, 0x12, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x08, 0x03, 0x07, 0x07, - 0x01, 0x04, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0x90, 0xfe, 0xe1, 0x01, 0x65, 0x01, 0x2a, 0x88, 0x02, - 0xd5, 0x02, 0x24, 0x88, 0xfe, 0x45, 0x01, 0xbb, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x27, 0x40, 0x12, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x08, 0x03, 0x07, 0x07, - 0x01, 0x04, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0x86, 0xfe, 0xeb, 0x01, 0x6f, 0x01, 0x20, 0x88, 0x01, - 0x9f, 0x03, 0x5a, 0x88, 0xfd, 0x5a, 0x02, 0xa6, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x23, 0x40, 0x10, - 0x06, 0x00, 0x00, 0x03, 0x0a, 0x09, 0x07, 0x03, 0x06, 0x06, 0x01, 0x03, - 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x3f, - 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, - 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x7f, 0xfe, - 0xf2, 0x01, 0x6f, 0x01, 0x20, 0x88, 0x04, 0xf9, 0x88, 0xfc, 0x44, 0x03, - 0xbc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x25, 0x40, 0x11, 0x01, 0x00, 0x00, 0x04, - 0x0a, 0x09, 0x02, 0x07, 0x03, 0x03, 0x06, 0x06, 0x01, 0x05, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x3f, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, - 0x37, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x66, 0x5c, - 0x01, 0x3e, 0x01, 0x48, 0x88, 0x04, 0xc7, 0xfe, 0xcc, 0x01, 0x85, 0x61, - 0xfe, 0xd4, 0x01, 0x34, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x27, 0x40, 0x12, 0x07, 0x01, 0x01, 0x00, - 0x04, 0x00, 0x0a, 0x0b, 0x08, 0x03, 0x03, 0x06, 0x06, 0x01, 0x05, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x3f, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, - 0x21, 0x01, 0x37, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x94, - 0xfe, 0x8f, 0x62, 0x01, 0x47, 0x01, 0x34, 0x88, 0x03, 0xa7, 0x01, 0x6f, - 0x61, 0xfe, 0xb8, 0x01, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x07, 0x00, 0x27, 0x40, 0x12, - 0x05, 0x01, 0x01, 0x00, 0x03, 0x00, 0x08, 0x09, 0x06, 0x03, 0x02, 0x05, - 0x05, 0x01, 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, - 0x33, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfd, 0x1e, 0x5f, 0x02, 0x83, 0x88, 0x02, 0x4a, 0x02, 0xcc, 0x5e, 0xfd, - 0x9b, 0x02, 0x72, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x27, 0x40, 0x12, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x0b, 0x0a, 0x08, 0x03, 0x02, 0x07, 0x07, 0x01, 0x05, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x3f, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, - 0x09, 0x01, 0x37, 0x01, 0x13, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, - 0xfe, 0x66, 0x53, 0x01, 0xb3, 0xdc, 0x88, 0xec, 0x02, 0xa5, 0x01, 0x85, - 0x6b, 0xfe, 0x68, 0xfe, 0x2f, 0x03, 0x69, 0x00, 0x00, 0x01, 0x00, 0x46, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x24, 0x40, 0x10, - 0x06, 0x00, 0x00, 0x03, 0x0a, 0x09, 0x06, 0x06, 0x01, 0x04, 0x07, 0x07, - 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x2f, 0x11, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x09, 0x01, 0x37, 0x01, 0x13, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xa7, - 0xfe, 0x70, 0x5a, 0x01, 0xae, 0xe1, 0x88, 0x03, 0xa1, 0x01, 0x7a, 0x66, - 0xfe, 0x6a, 0xfd, 0x9c, 0x03, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, 0x00, 0x27, 0x40, 0x12, - 0x05, 0x01, 0x01, 0x00, 0x00, 0x03, 0x09, 0x08, 0x06, 0x03, 0x02, 0x05, - 0x05, 0x01, 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, - 0x33, 0x3f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, - 0xfe, 0x5e, 0x5a, 0x01, 0x48, 0x88, 0x03, 0x9d, 0x01, 0x80, 0x64, 0xfe, - 0xd8, 0x01, 0x28, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x25, 0x40, 0x11, 0x01, 0x00, 0x00, 0x04, - 0x0a, 0x09, 0x02, 0x07, 0x03, 0x03, 0x06, 0x06, 0x01, 0x05, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x3f, 0x33, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, - 0x37, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb4, 0xfe, 0x52, 0x6b, - 0x01, 0x47, 0x01, 0x48, 0x88, 0x04, 0x79, 0xfd, 0xd6, 0x02, 0xe4, 0x4e, - 0xfd, 0xdf, 0x02, 0x21, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x31, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x0b, 0x0a, 0x08, 0x03, 0x03, 0x06, 0x02, 0x07, 0x07, 0x05, - 0x06, 0x06, 0x01, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, - 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x3f, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, - 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb4, 0xfe, 0x52, - 0x6b, 0x01, 0x61, 0x01, 0x2e, 0x88, 0x03, 0xa1, 0xfe, 0xb1, 0x02, 0xe4, - 0x4b, 0xfd, 0xb3, 0x01, 0x2d, 0x01, 0x20, 0x00, 0x00, 0x01, 0x00, 0x4f, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x26, 0x40, 0x11, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x03, 0x06, 0x06, 0x01, - 0x08, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x21, 0x01, 0x37, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xa8, 0xfe, 0x78, 0x74, 0x01, 0x64, 0x01, 0x08, 0x88, 0x02, - 0x9b, 0x02, 0x9e, 0x48, 0xfd, 0xa2, 0x02, 0x5e, 0x00, 0x01, 0x00, 0x2d, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x26, 0x40, 0x11, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x02, 0x07, 0x07, 0x01, - 0x08, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x01, 0x17, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0x9e, 0xfe, 0x60, 0x76, 0x01, 0x94, 0xf8, 0x88, 0x01, 0x0e, - 0x01, 0x63, 0x02, 0xca, 0x46, 0xfd, 0x46, 0xf9, 0x03, 0xb3, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x06, - 0x00, 0x20, 0x40, 0x0e, 0x04, 0x00, 0x00, 0x02, 0x08, 0x07, 0x04, 0x04, - 0x01, 0x05, 0x03, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x01, 0x37, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfd, 0x19, 0x77, 0x02, - 0x70, 0x88, 0x05, 0x3d, 0x44, 0xfb, 0x99, 0x04, 0x67, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x26, 0x40, 0x11, 0x05, 0x01, 0x01, 0x00, 0x00, 0x03, 0x09, 0x08, - 0x02, 0x05, 0x05, 0x01, 0x06, 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, - 0x33, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, - 0x02, 0x70, 0x88, 0xfe, 0x45, 0x73, 0x01, 0x48, 0x88, 0x02, 0x56, 0x02, - 0xe3, 0x48, 0xfd, 0xdf, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x25, 0x40, 0x11, - 0x01, 0x00, 0x00, 0x04, 0x0a, 0x09, 0x02, 0x07, 0x03, 0x03, 0x06, 0x06, - 0x01, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, - 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, - 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb8, 0xfe, 0x3d, 0x7c, 0x01, 0x47, 0x01, 0x48, 0x88, 0x04, 0x19, 0xfc, - 0xdd, 0x04, 0x59, 0x32, 0xfc, 0xdd, 0x03, 0x23, 0x00, 0x01, 0x00, 0x25, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x16, - 0x07, 0x01, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, 0x03, 0x06, 0x02, 0x07, - 0x07, 0x05, 0x06, 0x06, 0x01, 0x08, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xc2, 0xfe, 0x34, 0x7e, 0x01, 0x58, 0x01, 0x34, 0x88, 0x03, 0x9f, 0xfd, - 0x85, 0x04, 0x28, 0x35, 0xfc, 0xe8, 0x02, 0x66, 0xb2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x30, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, - 0x03, 0x06, 0x02, 0x07, 0x07, 0x05, 0x06, 0x06, 0x01, 0x08, 0x05, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xb3, 0xfe, 0x43, 0x7b, 0x01, 0x73, 0x01, 0x1c, - 0x88, 0x02, 0x56, 0xfe, 0xb1, 0x04, 0x48, 0x32, 0xfc, 0x7d, 0x01, 0x12, - 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x26, 0x40, 0x11, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x0b, 0x0a, 0x03, 0x06, 0x06, 0x01, 0x08, 0x05, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, - 0x01, 0x37, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x95, 0xfe, - 0x63, 0x79, 0x01, 0x83, 0x01, 0x0c, 0x88, 0x01, 0x51, 0x03, 0xfe, 0x32, - 0xfc, 0x58, 0x03, 0xa8, 0x00, 0x01, 0x00, 0x2f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x1c, 0x40, 0x0c, 0x06, 0x00, 0x03, 0x00, - 0x09, 0x0a, 0x07, 0x04, 0x03, 0x06, 0x01, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x09, 0x01, 0x37, 0x01, 0x17, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, - 0xfe, 0x48, 0x7f, 0x01, 0xad, 0xd4, 0x88, 0x01, 0x47, 0x04, 0x03, 0x37, - 0xfc, 0x14, 0xd6, 0x04, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, 0x00, 0x26, 0x40, 0x11, - 0x05, 0x01, 0x01, 0x00, 0x03, 0x00, 0x08, 0x09, 0x02, 0x05, 0x05, 0x01, - 0x06, 0x04, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x35, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, - 0x3d, 0x7b, 0x01, 0x48, 0x88, 0xf3, 0x04, 0x5c, 0x32, 0xfc, 0xdd, 0x03, - 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x22, 0x40, 0x0f, 0x01, 0x00, 0x04, 0x00, - 0x09, 0x0a, 0x06, 0x02, 0x03, 0x07, 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, - 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, - 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x36, 0x7d, 0x01, 0x4d, 0x01, - 0x48, 0x88, 0x03, 0xd7, 0xfc, 0x29, 0x05, 0x51, 0x30, 0xfc, 0x29, 0x03, - 0xd7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2a, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, - 0x04, 0x00, 0x0a, 0x0b, 0x06, 0x02, 0x06, 0x02, 0x03, 0x08, 0x05, 0x03, - 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x35, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x30, 0x7e, 0x01, 0x59, 0x01, 0x41, 0x88, 0x03, - 0x75, 0xfc, 0x8b, 0x05, 0x4f, 0x2f, 0xfc, 0x17, 0x03, 0x6c, 0x80, 0x00, - 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2a, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, - 0x06, 0x02, 0x06, 0x02, 0x03, 0x08, 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, - 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, - 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, - 0x4f, 0x7f, 0x01, 0x4e, 0x01, 0x2c, 0x88, 0x02, 0x8f, 0xfd, 0x71, 0x05, - 0x53, 0x2d, 0xfb, 0xe3, 0x02, 0x6d, 0x01, 0xb1, 0x00, 0x01, 0x00, 0x36, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x2a, 0x40, 0x13, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x06, 0x02, 0x06, 0x02, - 0x03, 0x08, 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x01, 0x25, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x4f, 0x7e, 0x01, 0x74, - 0x01, 0x07, 0x88, 0x01, 0x38, 0xfe, 0xc8, 0x05, 0x53, 0x2d, 0xfb, 0x7b, - 0xfa, 0x03, 0x8c, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x1e, 0x40, 0x0e, 0x05, 0x00, 0x02, 0x01, - 0x00, 0x03, 0x09, 0x08, 0x06, 0x03, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, - 0xcd, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x29, 0x01, 0x01, 0x37, 0x01, 0x33, 0x11, 0x33, 0x03, 0xb7, 0xfe, 0x2b, - 0xfe, 0x4e, 0x81, 0x01, 0x93, 0xeb, 0x88, 0x05, 0x53, 0x2e, 0xfb, 0x07, - 0x04, 0xf9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, 0x04, 0x00, 0x00, 0x02, - 0x08, 0x07, 0x04, 0x04, 0x01, 0x05, 0x03, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, - 0xfe, 0x41, 0x81, 0x01, 0x3e, 0x88, 0x05, 0x53, 0x2e, 0xfc, 0x29, 0x03, - 0xd7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x22, 0x40, 0x10, 0x01, 0x00, 0x00, 0x06, - 0x05, 0x03, 0x08, 0x09, 0x04, 0x04, 0x01, 0x03, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x27, 0x01, 0x21, - 0x03, 0xb7, 0x88, 0xfe, 0xcc, 0xfe, 0xb5, 0x61, 0x01, 0x74, 0x01, 0xf4, - 0x04, 0xf9, 0xfe, 0xb8, 0x61, 0x01, 0x6f, 0x00, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x05, 0x03, 0x00, 0x03, 0x0b, 0x0a, 0x02, 0x07, - 0x04, 0x07, 0x04, 0x07, 0x01, 0x08, 0x03, 0x06, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb7, 0xfe, 0xc1, 0x5b, 0x01, 0x9b, 0x01, 0x48, 0x88, 0x03, 0x92, 0x01, - 0x35, 0xfe, 0xdb, 0x66, 0x01, 0x79, 0xfe, 0xcc, 0x01, 0x34, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x05, 0x03, 0x00, 0x03, - 0x0b, 0x0a, 0x02, 0x07, 0x04, 0x07, 0x04, 0x01, 0x08, 0x03, 0x06, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0x98, 0xfe, 0xda, 0x55, 0x01, 0x9b, 0x01, 0x48, 0x88, 0x02, - 0x29, 0x02, 0x81, 0xfe, 0xf6, 0x68, 0x01, 0x79, 0xfd, 0xc1, 0x02, 0x3f, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2c, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, - 0x0a, 0x0b, 0x07, 0x04, 0x07, 0x04, 0x01, 0x08, 0x03, 0x06, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x35, 0x01, 0x05, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0x84, 0xfe, 0xec, 0x53, 0x01, 0x9b, 0x01, 0x48, 0x88, 0xe9, 0x03, 0xad, - 0xf6, 0x68, 0x01, 0x79, 0xfc, 0xd3, 0x03, 0x2d, 0x00, 0x01, 0x00, 0x5e, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, - 0x06, 0x00, 0x04, 0x02, 0x00, 0x03, 0x0a, 0x09, 0x06, 0x03, 0x06, 0x03, - 0x01, 0x07, 0x02, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x05, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0x8d, 0xfe, 0xf3, 0x51, 0x01, 0x9b, 0x01, 0x36, 0x88, - 0x04, 0x89, 0xe7, 0x66, 0x01, 0x79, 0xfc, 0x3d, 0x03, 0xc3, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x06, - 0x00, 0x20, 0x40, 0x0e, 0x01, 0x00, 0x04, 0x00, 0x07, 0x08, 0x03, 0x03, - 0x01, 0x02, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x27, 0x01, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xc2, 0x5e, 0x01, - 0x9c, 0x88, 0x04, 0xc2, 0xfe, 0xdd, 0x69, 0x01, 0x79, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x22, 0x40, 0x0f, 0x01, 0x00, 0x04, 0x00, 0x09, 0x0a, 0x04, 0x05, - 0x05, 0x01, 0x02, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, - 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x07, 0x21, 0x35, 0x21, 0x01, 0x33, 0x03, 0xb7, 0x88, - 0xff, 0xfe, 0x70, 0x01, 0x54, 0x01, 0x3b, 0x88, 0x04, 0xc4, 0xe1, 0x88, - 0x01, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x0b, 0x0a, 0x02, 0x07, 0x04, 0x05, 0x07, 0x05, 0x07, 0x05, - 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x9b, 0xfe, 0xd6, 0x01, 0x61, 0x01, - 0x2e, 0x88, 0x02, 0x69, 0x01, 0x7a, 0x88, 0xfe, 0xc2, 0x02, 0x54, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2a, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, - 0x04, 0x05, 0x07, 0x05, 0x07, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, - 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x9e, 0xfe, - 0xd3, 0x01, 0x7f, 0x01, 0x10, 0x88, 0x01, 0x35, 0x02, 0xae, 0x88, 0xfd, - 0xf2, 0x03, 0x24, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x11, 0x06, 0x00, 0x03, 0x00, - 0x09, 0x0a, 0x03, 0x04, 0x06, 0x04, 0x06, 0x04, 0x01, 0x07, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x21, - 0x35, 0x21, 0x13, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xad, 0xfe, 0xc4, - 0x01, 0x9e, 0xf1, 0x88, 0x03, 0xe3, 0x88, 0xfd, 0x3f, 0x03, 0xd7, 0x00, - 0x00, 0x01, 0x00, 0x50, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x28, 0x40, 0x13, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x09, 0x0a, - 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x02, 0x07, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, - 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb9, 0xfe, 0x68, 0x60, 0x01, - 0x1e, 0x01, 0x61, 0x88, 0x04, 0x78, 0xfd, 0xd5, 0x01, 0xa1, 0x62, 0xfe, - 0xdb, 0x02, 0x56, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1a, 0x07, 0x01, 0x01, 0x00, - 0x04, 0x06, 0x00, 0x03, 0x0b, 0x0a, 0x03, 0x06, 0x02, 0x07, 0x07, 0x05, - 0x08, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x65, 0x60, 0x01, 0x3b, 0x01, 0x48, 0x88, 0x03, - 0xb0, 0xfe, 0xb9, 0x01, 0x9c, 0x60, 0xfe, 0xc5, 0x01, 0x47, 0x01, 0x10, - 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x28, 0x40, 0x12, 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, - 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x37, - 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x66, 0xfe, 0xb1, 0x62, - 0x01, 0x2a, 0x01, 0x5d, 0x88, 0x02, 0x9b, 0x01, 0x76, 0x5c, 0xfe, 0xb6, - 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x28, 0x40, 0x12, 0x05, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x09, 0x08, 0x02, 0x05, 0x04, 0x05, 0x04, 0x01, 0x06, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfd, 0x1d, 0x5e, - 0x02, 0x85, 0x88, 0x01, 0x27, 0x02, 0xe4, 0x63, 0xfd, 0x7b, 0x03, 0x98, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x22, 0x40, 0x0f, 0x06, 0x00, 0x00, 0x03, 0x0a, 0x09, 0x06, 0x04, - 0x06, 0x04, 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, - 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x09, 0x01, 0x37, 0x01, 0x13, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfe, 0xb8, 0xfe, 0x65, 0x5b, 0x01, 0xb0, 0xd8, 0x88, 0x02, 0x73, 0x01, - 0x9a, 0x63, 0xfe, 0x53, 0xfe, 0x63, 0x04, 0x5b, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, 0x00, 0x28, 0x40, 0x12, - 0x05, 0x01, 0x01, 0x00, 0x03, 0x00, 0x08, 0x09, 0x02, 0x05, 0x04, 0x05, - 0x04, 0x01, 0x06, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, - 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, - 0x88, 0xfe, 0x64, 0x5d, 0x01, 0x3f, 0x88, 0x02, 0x64, 0x01, 0x9c, 0x65, - 0xfe, 0xc1, 0x02, 0x5b, 0x00, 0x01, 0x00, 0x2f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, 0x01, 0x00, 0x04, 0x06, - 0x00, 0x03, 0x0a, 0x09, 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x02, 0x07, - 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb9, - 0xfe, 0x47, 0x75, 0x01, 0x37, 0x01, 0x54, 0x88, 0x04, 0x1d, 0xfc, 0xe5, - 0x03, 0x61, 0x46, 0xfd, 0x99, 0x03, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x39, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1a, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x03, 0x06, - 0x02, 0x07, 0x07, 0x05, 0x08, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, - 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x52, 0x76, 0x01, 0x38, - 0x01, 0x48, 0x88, 0x03, 0x9d, 0xfd, 0x71, 0x03, 0x47, 0x47, 0xfd, 0xa1, - 0x02, 0x8f, 0xb5, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x34, 0x40, 0x19, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x03, 0x06, 0x02, 0x07, 0x07, 0x05, - 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xc2, 0xfe, 0x4e, 0x77, 0x01, 0x5d, 0x01, 0x1c, 0x88, 0x02, 0x73, 0xfe, - 0xa4, 0x03, 0x58, 0x3d, 0xfd, 0x55, 0x01, 0x38, 0x02, 0x48, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2a, 0x40, 0x14, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x04, 0x03, - 0x0a, 0x0b, 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, - 0x01, 0x37, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xa3, 0xfe, - 0x6d, 0x77, 0x01, 0x6f, 0x01, 0x0a, 0x88, 0x01, 0x56, 0x03, 0x19, 0x3d, - 0xfd, 0x32, 0x03, 0xa3, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x20, 0x40, 0x0e, 0x06, 0x00, 0x00, 0x03, - 0x0a, 0x09, 0x04, 0x04, 0x01, 0x07, 0x03, 0x06, 0x01, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, 0x37, 0x01, 0x17, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0xb4, 0xfe, 0x5c, 0x77, 0x01, 0x9a, 0xdf, 0x88, 0x01, - 0x35, 0x03, 0x3a, 0x3d, 0xfc, 0xde, 0xcb, 0x04, 0xc2, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x26, 0x40, 0x11, 0x05, 0x01, 0x01, 0x00, 0x00, 0x03, 0x09, 0x08, - 0x05, 0x04, 0x05, 0x04, 0x01, 0x06, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, - 0x02, 0x70, 0x88, 0xfe, 0x57, 0x77, 0x01, 0x32, 0x88, 0x01, 0x2d, 0x03, - 0x42, 0x3d, 0xfd, 0xaa, 0x03, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x12, - 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x09, 0x0a, 0x06, 0x02, 0x05, 0x05, - 0x03, 0x07, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, - 0x2f, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, - 0xfe, 0xb8, 0xfe, 0x4f, 0x7d, 0x01, 0x34, 0x01, 0x48, 0x88, 0x03, 0xd7, - 0xfc, 0x29, 0x05, 0x09, 0x30, 0xfc, 0x71, 0x03, 0xd7, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, - 0x0a, 0x0b, 0x02, 0x07, 0x06, 0x07, 0x05, 0x05, 0x03, 0x08, 0x03, 0x01, - 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x35, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x4e, 0x7d, 0x01, 0x3c, 0x01, 0x41, 0x88, 0x03, - 0x75, 0xfc, 0x8b, 0x05, 0x09, 0x31, 0xfc, 0x5b, 0x03, 0x6c, 0x80, 0x00, - 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x04, 0x06, 0x00, 0x03, - 0x0b, 0x0a, 0x02, 0x07, 0x06, 0x07, 0x05, 0x05, 0x03, 0x08, 0x03, 0x01, - 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x4f, 0x7f, 0x01, 0x4e, 0x01, 0x2c, 0x88, 0x02, - 0x8f, 0xfd, 0x71, 0x05, 0x0b, 0x2d, 0xfc, 0x2b, 0x02, 0x6d, 0x01, 0xb1, - 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x04, 0x06, 0x00, 0x03, - 0x0b, 0x0a, 0x02, 0x07, 0x07, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, 0x01, - 0x03, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x01, 0x25, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x4f, 0x7e, 0x01, 0x74, 0x01, 0x07, 0x88, 0x01, - 0x38, 0xfe, 0xc8, 0x05, 0x0a, 0x2d, 0xfb, 0xc4, 0xfa, 0x03, 0x8c, 0x00, - 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x22, 0x40, 0x10, 0x05, 0x00, 0x02, 0x01, 0x00, 0x03, 0x09, 0x08, - 0x03, 0x03, 0x01, 0x06, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x29, 0x01, 0x01, 0x37, 0x01, 0x33, 0x11, 0x33, 0x03, 0xb7, 0xfe, 0x30, - 0xfe, 0x4f, 0x7e, 0x01, 0x9b, 0xe0, 0x88, 0x05, 0x0a, 0x2d, 0xfb, 0x51, - 0x04, 0xf9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, 0x04, 0x00, 0x00, 0x02, - 0x08, 0x07, 0x04, 0x03, 0x03, 0x01, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, - 0xfe, 0x4d, 0x7f, 0x01, 0x34, 0x88, 0x05, 0x0a, 0x2d, 0xfc, 0x7a, 0x03, - 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x22, 0x40, 0x10, 0x01, 0x00, 0x00, 0x06, - 0x05, 0x03, 0x08, 0x09, 0x04, 0x04, 0x01, 0x03, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x27, 0x01, 0x21, - 0x03, 0xb7, 0x88, 0xfe, 0xe1, 0xfe, 0xab, 0x6f, 0x01, 0x77, 0x01, 0xf4, - 0x04, 0xf9, 0xfd, 0xc3, 0x4b, 0x02, 0x7a, 0x00, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, - 0x04, 0x07, 0x04, 0x07, 0x01, 0x08, 0x03, 0x06, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xd2, 0xfe, 0xba, 0x6f, 0x01, 0x9b, 0x01, 0x48, 0x88, 0x03, 0x92, 0x01, - 0x1e, 0xfe, 0x0c, 0x4b, 0x02, 0x7a, 0xfe, 0xcc, 0x01, 0x34, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x30, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, - 0x0a, 0x0b, 0x02, 0x07, 0x04, 0x07, 0x04, 0x07, 0x01, 0x08, 0x03, 0x06, - 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xb1, 0xfe, 0xdb, 0x6f, 0x01, 0x9b, 0x01, 0x48, - 0x88, 0x02, 0x29, 0x02, 0x53, 0xfe, 0x40, 0x4b, 0x02, 0x7a, 0xfd, 0xc1, - 0x02, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x04, 0x07, 0x04, 0x01, - 0x08, 0x03, 0x06, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, - 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x09, 0x01, 0x27, 0x09, 0x01, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x9b, 0xfe, 0xf1, 0x6f, 0x01, 0x9b, - 0x01, 0x48, 0x88, 0xe9, 0x03, 0x75, 0xfe, 0x5e, 0x4b, 0x02, 0x7a, 0xfc, - 0xd3, 0x03, 0x2d, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x11, 0x06, 0x00, 0x00, 0x04, - 0x0a, 0x09, 0x06, 0x03, 0x06, 0x03, 0x01, 0x07, 0x02, 0x05, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, - 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x9e, 0xfe, 0xee, - 0x6f, 0x01, 0xad, 0x01, 0x36, 0x88, 0x04, 0x52, 0xfe, 0x6a, 0x4b, 0x02, - 0x7a, 0xfc, 0x3d, 0x03, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, - 0x01, 0x00, 0x00, 0x04, 0x08, 0x07, 0x03, 0x03, 0x01, 0x02, 0x05, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, - 0x33, 0x02, 0x70, 0x88, 0xfe, 0xef, 0x6f, 0x01, 0x80, 0x88, 0x04, 0x7e, - 0xfe, 0x3c, 0x4d, 0x02, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, - 0x01, 0x00, 0x04, 0x00, 0x07, 0x08, 0x03, 0x03, 0x01, 0x02, 0x05, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, - 0x33, 0x03, 0xb7, 0x88, 0xfd, 0x6b, 0x4e, 0x02, 0xe3, 0x88, 0x04, 0xcf, - 0xfd, 0xd0, 0x68, 0x02, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x2c, 0x40, 0x15, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x03, 0x06, - 0x04, 0x06, 0x04, 0x06, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x27, - 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xbe, 0xfe, 0xbb, 0x62, - 0x01, 0x6a, 0x01, 0x7f, 0x88, 0x03, 0xe3, 0xfe, 0x98, 0x5c, 0x01, 0x94, - 0x01, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x34, 0x40, 0x1a, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x03, 0x06, 0x04, 0x07, - 0x06, 0x06, 0x07, 0x04, 0x03, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb7, 0xfe, 0xc1, 0x5b, 0x01, 0x9b, 0x01, 0x48, 0x88, 0x02, 0x81, 0x01, - 0x35, 0xfe, 0xdb, 0x66, 0x01, 0x79, 0xfe, 0xcc, 0x02, 0x45, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x34, 0x40, 0x1a, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, - 0x0a, 0x0b, 0x02, 0x07, 0x03, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x07, - 0x03, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, - 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, - 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x98, 0xfe, 0xda, 0x55, - 0x01, 0x9b, 0x01, 0x48, 0x88, 0x01, 0x19, 0x02, 0x81, 0xfe, 0xf6, 0x68, - 0x01, 0x79, 0xfd, 0xc1, 0x03, 0x4f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x2a, 0x40, 0x14, - 0x06, 0x00, 0x00, 0x02, 0x04, 0x03, 0x09, 0x0a, 0x02, 0x05, 0x06, 0x03, - 0x05, 0x03, 0x05, 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, - 0x39, 0x39, 0x2f, 0x2f, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x03, 0x27, 0x09, 0x01, 0x11, - 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x69, 0xe5, 0x67, 0x01, 0x73, 0x01, 0x70, - 0x88, 0x03, 0xb7, 0xfe, 0xe4, 0x5c, 0x01, 0xc2, 0xfc, 0xa4, 0x04, 0x24, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x2a, 0x40, 0x13, 0x05, 0x01, 0x01, 0x00, 0x00, 0x04, 0x09, 0x08, - 0x02, 0x05, 0x05, 0x06, 0x03, 0x03, 0x01, 0x06, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, - 0x27, 0x01, 0x35, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xc1, 0x5d, 0x01, 0x9c, - 0x88, 0x03, 0xc9, 0xfe, 0xc1, 0x65, 0x01, 0x9c, 0xf6, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x22, 0x40, 0x0f, 0x01, 0x00, 0x04, 0x00, 0x09, 0x0a, 0x04, 0x05, - 0x05, 0x01, 0x02, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, - 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x03, 0x21, 0x35, 0x21, 0x01, 0x33, 0x03, 0xb7, 0x88, - 0xe7, 0xfe, 0x58, 0x01, 0x56, 0x01, 0x39, 0x88, 0x04, 0x5a, 0xfe, 0x41, - 0x88, 0x02, 0x5e, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x0b, 0x0a, 0x04, 0x05, 0x02, 0x07, 0x07, 0x08, 0x05, 0x05, - 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x07, 0x21, 0x35, 0x21, 0x01, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xf2, 0xfe, 0x63, 0x01, 0x66, 0x01, 0x29, - 0x88, 0x03, 0x99, 0xfe, 0x88, 0x01, 0x3a, 0x01, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, - 0x02, 0x07, 0x04, 0x05, 0x07, 0x05, 0x07, 0x05, 0x01, 0x08, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0x9d, 0xfe, 0xd4, 0x01, 0x63, 0x01, 0x2c, 0x88, 0x01, 0x24, - 0x01, 0x77, 0x88, 0xfe, 0xc5, 0x03, 0x99, 0x00, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x11, - 0x06, 0x00, 0x03, 0x00, 0x09, 0x0a, 0x03, 0x04, 0x06, 0x04, 0x06, 0x04, - 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfe, 0xa8, 0xfe, 0xc9, 0x01, 0x89, 0x01, 0x06, 0x88, 0x02, 0x9b, 0x88, - 0xfe, 0x04, 0x04, 0x5a, 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, 0x01, 0x00, 0x00, 0x06, - 0x04, 0x03, 0x09, 0x0a, 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x02, 0x07, - 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x05, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xc0, - 0xfe, 0x67, 0x5f, 0x01, 0x09, 0x01, 0x71, 0x88, 0x04, 0x24, 0xfd, 0x11, - 0x01, 0x8b, 0x5e, 0xfe, 0x03, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1a, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x03, 0x06, - 0x02, 0x07, 0x07, 0x05, 0x08, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, - 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x70, 0x5e, 0x01, 0x12, - 0x01, 0x68, 0x88, 0x03, 0x80, 0xfd, 0xbd, 0x01, 0x83, 0x5e, 0xfe, 0xf8, - 0x02, 0x7a, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x36, 0x40, 0x1a, 0x07, 0x01, 0x01, 0x00, - 0x04, 0x06, 0x00, 0x03, 0x0b, 0x0a, 0x03, 0x06, 0x02, 0x07, 0x07, 0x05, - 0x08, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb8, 0xfe, 0x72, 0x5b, 0x01, 0x34, 0x01, 0x47, 0x88, 0x02, - 0x6c, 0xfe, 0xcc, 0x01, 0x82, 0x66, 0xfe, 0xd5, 0x01, 0x32, 0x02, 0x5a, - 0x00, 0x01, 0x00, 0x57, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x28, 0x40, 0x12, 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, - 0x03, 0x06, 0x05, 0x06, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x37, - 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0x98, 0xfe, 0x90, 0x62, - 0x01, 0x4b, 0x01, 0x2b, 0x88, 0x01, 0x56, 0x01, 0x6c, 0x5c, 0xfe, 0xc0, - 0x03, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, 0x04, 0x00, 0x02, 0x00, - 0x07, 0x08, 0x03, 0x03, 0x01, 0x05, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x37, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfd, 0x27, 0x5f, 0x02, 0x7a, 0x88, 0x02, 0xc0, 0x5e, 0xfd, 0x9e, 0x04, - 0xc5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x28, 0x40, 0x12, 0x05, 0x01, 0x01, 0x00, - 0x03, 0x00, 0x08, 0x09, 0x02, 0x05, 0x04, 0x05, 0x04, 0x01, 0x06, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, 0x74, 0x5d, - 0x01, 0x2f, 0x88, 0x01, 0x34, 0x01, 0x8b, 0x65, 0xfe, 0xd2, 0x03, 0x8b, - 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x26, 0x40, 0x12, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x09, 0x0a, - 0x05, 0x05, 0x03, 0x02, 0x07, 0x03, 0x06, 0x01, 0x03, 0x12, 0x00, 0x3f, - 0x33, 0x33, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, - 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xca, 0xfe, 0x3f, 0x6f, 0x01, 0x2b, 0x01, - 0x5d, 0x88, 0x03, 0xc3, 0xfc, 0x3d, 0x02, 0xd9, 0x4b, 0xfe, 0x19, 0x04, - 0x44, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x07, 0x08, 0x05, 0x05, - 0x03, 0x08, 0x03, 0x06, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, - 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, - 0x09, 0x01, 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x50, 0x6f, - 0x01, 0x2a, 0x01, 0x5f, 0x88, 0x03, 0x2d, 0xfc, 0xd3, 0x02, 0xd9, 0x4b, - 0xfe, 0x0c, 0x03, 0x68, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x04, 0x06, 0x00, 0x03, 0x0b, 0x0a, 0x02, 0x07, - 0x07, 0x08, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, 0x01, 0x03, 0x12, 0x00, - 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb8, 0xfe, 0x50, 0x6f, 0x01, 0x3f, 0x01, 0x4a, 0x88, 0x02, 0x3f, 0xfd, - 0xc1, 0x02, 0xd9, 0x4b, 0xfd, 0xe9, 0x02, 0x4b, 0x02, 0x29, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x38, 0xff, 0xfd, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2e, 0x40, 0x16, 0x07, 0x01, 0x01, 0x00, 0x04, 0x06, 0x00, 0x03, - 0x0b, 0x0a, 0x02, 0x07, 0x07, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, 0x01, - 0x03, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xb9, 0xfe, 0x50, 0x6f, 0x01, 0x5a, 0x01, 0x2e, 0x88, 0x01, - 0x59, 0xfe, 0xa4, 0x02, 0xdc, 0x4b, 0xfd, 0xba, 0x01, 0x41, 0x03, 0x62, - 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x22, 0x40, 0x10, 0x05, 0x00, 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, - 0x03, 0x03, 0x01, 0x06, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x29, 0x01, 0x01, 0x37, 0x01, 0x33, 0x11, 0x33, 0x03, 0xb7, 0xfe, 0x30, - 0xfe, 0x51, 0x6f, 0x01, 0x8d, 0xfb, 0x88, 0x02, 0xd9, 0x4b, 0xfd, 0x64, - 0x04, 0xf9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, 0x04, 0x00, 0x00, 0x02, - 0x08, 0x07, 0x03, 0x03, 0x01, 0x05, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x37, 0x01, 0x11, 0x33, 0x02, 0x70, 0x89, - 0xfe, 0x51, 0x6f, 0x01, 0x41, 0x88, 0x02, 0xd9, 0x4b, 0xfd, 0xe3, 0x04, - 0x7a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x22, 0x40, 0x10, 0x01, 0x00, 0x00, 0x06, - 0x05, 0x03, 0x08, 0x09, 0x04, 0x04, 0x01, 0x03, 0x06, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x23, 0x01, 0x27, 0x01, 0x21, - 0x03, 0xb7, 0x88, 0xee, 0xfe, 0x7f, 0x79, 0x01, 0x9b, 0x01, 0xd5, 0x04, - 0xf9, 0xfc, 0x5d, 0x32, 0x03, 0xf9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, - 0x04, 0x07, 0x04, 0x07, 0x01, 0x08, 0x03, 0x06, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xe4, 0xfe, 0xad, 0x7b, 0x01, 0x9d, 0x01, 0x4d, 0x88, 0x03, 0x78, 0x01, - 0x12, 0xfc, 0xcc, 0x32, 0x03, 0xf9, 0xfe, 0xb1, 0x01, 0x4f, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x45, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x30, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, 0x05, 0x03, 0x00, 0x03, - 0x0b, 0x0a, 0x02, 0x07, 0x04, 0x07, 0x04, 0x07, 0x01, 0x08, 0x03, 0x06, - 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x39, 0x2f, - 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xce, 0xfe, 0xc3, 0x7b, 0x01, 0xa2, 0x01, 0x48, - 0x88, 0x02, 0x63, 0x01, 0xf1, 0xfd, 0x02, 0x31, 0x03, 0xfa, 0xfd, 0xe7, - 0x02, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x84, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x04, 0x07, 0x04, 0x07, - 0x01, 0x08, 0x03, 0x06, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x09, 0x01, 0x27, - 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb5, 0xfe, 0xdc, 0x7b, - 0x01, 0xa2, 0x01, 0x48, 0x88, 0x9d, 0x03, 0x75, 0xfd, 0x44, 0x32, 0x03, - 0xfc, 0xfc, 0xa0, 0x03, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x45, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, - 0x06, 0x00, 0x04, 0x02, 0x00, 0x03, 0x0a, 0x09, 0x03, 0x06, 0x03, 0x06, - 0x01, 0x07, 0x02, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x33, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0xac, 0xfe, 0xe5, 0x7b, 0x01, 0xa2, 0x01, 0x48, 0x88, - 0x03, 0xfd, 0xfd, 0x59, 0x32, 0x03, 0xf9, 0xfc, 0x29, 0x03, 0xd7, 0x00, - 0x00, 0x01, 0x00, 0x45, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x06, - 0x00, 0x20, 0x40, 0x0e, 0x01, 0x00, 0x04, 0x00, 0x07, 0x08, 0x03, 0x03, - 0x01, 0x02, 0x05, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x27, 0x01, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xd8, 0x7b, 0x01, - 0xa2, 0x89, 0x04, 0x1c, 0xfd, 0x3a, 0x32, 0x03, 0xf9, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x81, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x20, 0x40, 0x0e, 0x01, 0x00, 0x00, 0x05, 0x0a, 0x09, 0x04, 0x04, - 0x01, 0x02, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x07, 0x01, 0x27, 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xdf, 0xfe, - 0xa8, 0x77, 0x01, 0x62, 0x01, 0x4c, 0x88, 0x04, 0xc2, 0xcb, 0xfd, 0x5f, - 0x3d, 0x02, 0xb9, 0x01, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x2a, 0x40, 0x13, - 0x07, 0x01, 0x01, 0x00, 0x05, 0x00, 0x0a, 0x0b, 0x03, 0x06, 0x04, 0x06, - 0x04, 0x06, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, - 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x23, 0x01, 0x27, 0x01, 0x21, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xe9, 0xfe, 0xb1, 0x76, 0x01, 0x72, 0x01, - 0x3c, 0x88, 0x03, 0xe3, 0xfd, 0x73, 0x3d, 0x02, 0xd8, 0x01, 0x16, 0x00, - 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x34, 0x40, 0x1a, 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, - 0x0a, 0x0b, 0x02, 0x07, 0x03, 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, - 0x03, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, - 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, - 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xd2, 0xfe, 0xae, 0x76, - 0x01, 0xae, 0x01, 0x48, 0x88, 0x02, 0x59, 0x01, 0x8c, 0xfd, 0x71, 0x47, - 0x03, 0x47, 0xfe, 0x54, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x18, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x03, 0x06, - 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, 0x03, 0x01, 0x08, 0x03, 0x01, 0x12, - 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x35, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb0, 0xfe, 0xd0, 0x76, 0x01, 0xae, 0x01, 0x48, 0x88, 0xb5, 0x02, 0xee, - 0xfd, 0xb4, 0x47, 0x03, 0x47, 0xfd, 0x20, 0x03, 0x7c, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x28, 0x40, 0x12, 0x06, 0x00, 0x04, 0x00, 0x09, 0x0a, 0x02, 0x06, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x32, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, 0x27, 0x09, - 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xa8, 0xfe, 0xd8, 0x75, 0x01, - 0xad, 0x01, 0x48, 0x88, 0x03, 0x93, 0xfd, 0xc4, 0x46, 0x03, 0x48, 0xfc, - 0x95, 0x04, 0x07, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, 0x02, 0x70, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x2a, 0x40, 0x13, 0x05, 0x01, 0x01, 0x00, - 0x04, 0x00, 0x08, 0x09, 0x02, 0x05, 0x05, 0x06, 0x03, 0x03, 0x01, 0x06, - 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, 0x35, 0x33, 0x02, 0x70, 0x88, 0xfe, - 0xc8, 0x77, 0x01, 0xaf, 0x88, 0x03, 0xb9, 0xfd, 0x9f, 0x3d, 0x03, 0x4d, - 0x9f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x20, 0x40, 0x0e, 0x01, 0x00, 0x05, 0x00, - 0x09, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, - 0x3f, 0x33, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x03, 0x01, 0x27, 0x09, 0x01, 0x33, 0x03, - 0xb7, 0x88, 0xd8, 0xfe, 0x95, 0x5b, 0x01, 0x56, 0x01, 0x48, 0x88, 0x04, - 0x5b, 0xfe, 0x63, 0xfe, 0x98, 0x63, 0x01, 0x55, 0x02, 0x73, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x91, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x28, 0x40, 0x12, 0x03, 0x07, 0x07, 0x06, 0x02, 0x06, 0x08, 0x09, - 0x00, 0x03, 0x03, 0x01, 0x01, 0x04, 0x07, 0x12, 0x04, 0x03, 0x00, 0x3f, - 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x09, 0x01, 0x27, 0x01, 0x35, 0x33, - 0x11, 0x23, 0x03, 0x2f, 0xfd, 0xbd, 0x5b, 0x02, 0x9e, 0x88, 0x88, 0x03, - 0xdc, 0xfd, 0x7a, 0x63, 0x02, 0xe3, 0xe5, 0xfa, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x91, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2c, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, 0x05, 0x06, 0x00, 0x03, - 0x0b, 0x0a, 0x03, 0x06, 0x04, 0x06, 0x04, 0x06, 0x01, 0x08, 0x03, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x21, 0x01, 0x27, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xe0, 0xfe, 0xdd, 0x5b, 0x01, 0x48, 0x01, 0x56, 0x88, 0x02, 0x9b, 0xfe, - 0xbb, 0x63, 0x01, 0x6a, 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x34, 0x40, 0x1a, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, - 0x03, 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, 0x03, 0x01, 0x08, 0x03, - 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, - 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x03, 0x27, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xbc, 0xff, 0x5b, 0x01, 0x56, 0x01, 0x48, 0x88, - 0x01, 0x42, 0x01, 0x31, 0xfe, 0xe3, 0x63, 0x01, 0x78, 0xfe, 0xcc, 0x03, - 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x2c, 0x40, 0x16, 0x06, 0x00, 0x00, 0x02, - 0x04, 0x03, 0x09, 0x0a, 0x02, 0x05, 0x06, 0x03, 0x05, 0x05, 0x03, 0x06, - 0x03, 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, - 0x2f, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x01, 0x07, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0x9e, 0xde, 0x5e, 0x01, 0x56, 0x01, 0x48, 0x88, 0x02, - 0x4c, 0xf9, 0x66, 0x01, 0x78, 0xfd, 0xd3, 0x04, 0x7d, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x2a, 0x40, 0x13, 0x05, 0x01, 0x01, 0x00, 0x04, 0x00, 0x08, 0x09, - 0x02, 0x05, 0x05, 0x06, 0x03, 0x03, 0x01, 0x06, 0x03, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, - 0x27, 0x01, 0x11, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xc1, 0x5d, 0x01, 0x9c, - 0x88, 0x02, 0x94, 0xfe, 0xc1, 0x65, 0x01, 0x9c, 0x02, 0x2b, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x24, 0x40, 0x10, 0x01, 0x00, 0x00, 0x04, 0x0a, 0x09, 0x04, 0x02, - 0x07, 0x05, 0x05, 0x01, 0x07, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, - 0x39, 0x2f, 0x12, 0x39, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x03, 0x21, 0x35, 0x21, 0x01, 0x33, 0x03, - 0xb7, 0x88, 0xdb, 0xfe, 0x4c, 0x01, 0x52, 0x01, 0x3d, 0x88, 0x03, 0xd7, - 0xfd, 0x7f, 0x88, 0x03, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x15, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, 0x04, 0x05, 0x02, 0x07, - 0x07, 0x08, 0x05, 0x05, 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, - 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x03, - 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xef, 0xfe, 0x60, - 0x01, 0x4e, 0x01, 0x41, 0x88, 0x03, 0x24, 0xfe, 0x32, 0x88, 0x02, 0x6e, - 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2e, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, - 0x05, 0x00, 0x0a, 0x0b, 0x04, 0x05, 0x02, 0x07, 0x07, 0x08, 0x05, 0x05, - 0x01, 0x08, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xd6, 0xfe, 0x9b, 0x01, 0x1f, 0x01, - 0x70, 0x88, 0x02, 0x93, 0xfe, 0xc3, 0x88, 0x01, 0x87, 0x02, 0x1c, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x22, 0x40, 0x0f, 0x04, 0x07, 0x01, 0x07, 0x09, 0x0a, 0x01, 0x02, - 0x02, 0x05, 0x04, 0x08, 0x12, 0x05, 0x03, 0x00, 0x3f, 0x3f, 0x33, 0x12, - 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0xbf, 0xfe, - 0xe1, 0x01, 0x65, 0x01, 0x2a, 0x88, 0x88, 0x01, 0x56, 0x88, 0xfe, 0xeb, - 0x04, 0xb8, 0xfa, 0x7f, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, 0x01, 0x00, 0x00, 0x06, - 0x04, 0x03, 0x09, 0x0a, 0x02, 0x07, 0x05, 0x05, 0x03, 0x07, 0x03, 0x06, - 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, - 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x05, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, - 0xfe, 0x65, 0x5b, 0x01, 0x00, 0x01, 0x88, 0x88, 0x03, 0xd2, 0xfc, 0x2e, - 0x01, 0x79, 0x66, 0xeb, 0x04, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x02, 0x07, - 0x07, 0x08, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, 0x01, 0x03, 0x12, 0x00, - 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x05, 0x01, 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb8, 0xfe, 0x65, 0x5b, 0x01, 0x0c, 0x01, 0x7c, 0x88, 0x03, 0x55, 0xfc, - 0xab, 0x01, 0x79, 0x66, 0xf7, 0x03, 0xd8, 0xc1, 0x00, 0x01, 0x00, 0x4c, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x17, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x02, 0x07, - 0x07, 0x08, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, 0x01, 0x03, 0x12, 0x00, - 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xb8, 0xfe, 0x65, 0x5b, 0x01, 0x1d, 0x01, 0x6b, 0x88, 0x02, 0x3f, 0xfd, - 0xc1, 0x01, 0x79, 0x66, 0xfe, 0xfa, 0x02, 0x7f, 0x02, 0x29, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x30, 0x40, 0x17, 0x07, 0x01, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, - 0x0a, 0x0b, 0x02, 0x07, 0x07, 0x08, 0x05, 0x05, 0x03, 0x08, 0x03, 0x06, - 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, 0x01, 0x37, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0x65, 0x5b, 0x01, 0x3f, 0x01, 0x49, - 0x88, 0x01, 0x34, 0xfe, 0xcc, 0x01, 0x79, 0x66, 0xfe, 0xdb, 0x01, 0x35, - 0x03, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x20, 0x40, 0x0e, 0x05, 0x00, 0x00, 0x02, - 0x09, 0x08, 0x03, 0x03, 0x01, 0x06, 0x03, 0x04, 0x01, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x29, 0x01, 0x01, 0x37, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, - 0xfe, 0x31, 0xfe, 0x67, 0x5e, 0x01, 0x77, 0x01, 0x0b, 0x88, 0x01, 0x76, - 0x69, 0xfe, 0xa9, 0x04, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x06, 0x00, 0x20, 0x40, 0x0e, - 0x04, 0x00, 0x02, 0x00, 0x07, 0x08, 0x03, 0x03, 0x01, 0x05, 0x03, 0x04, - 0x01, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x01, 0x37, 0x01, 0x11, - 0x33, 0x02, 0x70, 0x88, 0xfe, 0x67, 0x5e, 0x01, 0x3b, 0x88, 0x01, 0x76, - 0x69, 0xfe, 0xe0, 0x04, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x07, 0x00, 0x1c, 0x40, 0x0c, - 0x01, 0x00, 0x00, 0x05, 0x09, 0x08, 0x03, 0x06, 0x03, 0x01, 0x04, 0x12, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x23, 0x01, 0x27, 0x01, 0x21, 0x03, 0xb7, - 0x88, 0xeb, 0xfe, 0x6d, 0x81, 0x01, 0xb2, 0x01, 0xd5, 0x04, 0xf9, 0xfb, - 0x07, 0x2e, 0x05, 0x53, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2c, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, - 0x05, 0x03, 0x00, 0x03, 0x0b, 0x0a, 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, - 0x06, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x12, - 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x25, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, - 0x03, 0xb7, 0x88, 0xfe, 0xf9, 0xfe, 0x8c, 0x7e, 0x01, 0xb1, 0x01, 0x48, - 0x88, 0x03, 0x8c, 0xfa, 0xfb, 0x7b, 0x2d, 0x05, 0x53, 0xfe, 0xc8, 0x01, - 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2a, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x05, 0x0b, 0x0a, 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, 0x06, 0x03, - 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, - 0x88, 0xfe, 0xdc, 0xfe, 0xaa, 0x7f, 0x01, 0xb1, 0x01, 0x48, 0x88, 0x02, - 0x4a, 0x01, 0xed, 0xfb, 0xca, 0x2d, 0x05, 0x53, 0xfd, 0xd5, 0x02, 0x2b, - 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x2a, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, 0x00, 0x05, 0x0b, 0x0a, - 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, 0x06, 0x03, 0x01, 0x04, 0x12, 0x00, - 0x3f, 0x33, 0x3f, 0x33, 0x33, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x09, - 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xc3, 0xfe, - 0xa3, 0x7e, 0x01, 0xd0, 0x01, 0x48, 0x88, 0xea, 0x03, 0x10, 0xfc, 0x09, - 0x2f, 0x05, 0x4f, 0xfc, 0xdb, 0x03, 0x25, 0x00, 0x00, 0x01, 0x00, 0x1d, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x11, - 0x06, 0x00, 0x00, 0x04, 0x0a, 0x09, 0x06, 0x02, 0x06, 0x02, 0x03, 0x07, - 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x12, 0x39, - 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfe, 0xb8, 0xfe, 0xb3, 0x7d, 0x01, 0xca, 0x01, 0x48, 0x88, 0x03, 0xd7, - 0xfc, 0x29, 0x30, 0x05, 0x51, 0xfc, 0x29, 0x03, 0xd7, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x29, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x06, - 0x00, 0x20, 0x40, 0x0e, 0x01, 0x00, 0x00, 0x04, 0x08, 0x07, 0x02, 0x02, - 0x03, 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, - 0x2f, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x27, 0x01, 0x33, 0x02, 0x70, 0x88, 0xfe, 0xc2, 0x81, 0x01, - 0xbf, 0x88, 0x03, 0xd7, 0xfc, 0x29, 0x2e, 0x05, 0x53, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2f, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x1c, 0x40, 0x0c, 0x01, 0x00, 0x00, 0x05, 0x0a, 0x09, 0x02, 0x07, - 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x07, 0x01, 0x27, - 0x09, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xd4, 0xfe, 0x53, 0x7f, 0x01, 0xb8, - 0x01, 0x48, 0x88, 0x04, 0xc2, 0xd6, 0xfc, 0x14, 0x37, 0x04, 0x03, 0x01, - 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x26, 0x40, 0x11, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x05, 0x0b, 0x0a, 0x03, 0x06, 0x06, 0x04, 0x08, 0x03, 0x01, 0x04, - 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x23, - 0x01, 0x27, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xf4, 0xfe, 0x65, - 0x79, 0x01, 0xb5, 0x01, 0x53, 0x88, 0x03, 0xe3, 0xfc, 0x1d, 0x32, 0x04, - 0x39, 0x01, 0x16, 0x00, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x32, 0x40, 0x18, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x03, 0x06, 0x07, 0x06, - 0x07, 0x06, 0x04, 0x08, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, - 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xe4, 0xfe, - 0x8d, 0x7b, 0x01, 0xbd, 0x01, 0x4d, 0x88, 0x02, 0x71, 0x01, 0x12, 0xfc, - 0x7d, 0x32, 0x04, 0x48, 0xfe, 0xb1, 0x02, 0x56, 0x00, 0x01, 0x00, 0x25, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x30, 0x40, 0x16, - 0x07, 0x01, 0x01, 0x00, 0x00, 0x05, 0x0b, 0x0a, 0x02, 0x07, 0x03, 0x06, - 0x07, 0x06, 0x07, 0x06, 0x04, 0x08, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, - 0x33, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x35, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, - 0xd7, 0xfe, 0x9d, 0x7e, 0x01, 0xd7, 0x01, 0x33, 0x88, 0xc6, 0x02, 0x6a, - 0xfc, 0xd0, 0x35, 0x04, 0x40, 0xfd, 0x81, 0x03, 0x8b, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, - 0x00, 0x2a, 0x40, 0x14, 0x06, 0x00, 0x04, 0x02, 0x00, 0x03, 0x0a, 0x09, - 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x03, 0x07, 0x03, 0x01, 0x03, 0x12, - 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x09, 0x01, - 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, 0xfe, 0xb9, - 0x7c, 0x01, 0xc3, 0x01, 0x48, 0x88, 0x03, 0x23, 0xfc, 0xdd, 0x32, 0x04, - 0x59, 0xfc, 0xdd, 0x04, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, 0x00, 0x26, 0x40, 0x11, - 0x05, 0x01, 0x01, 0x00, 0x04, 0x00, 0x08, 0x09, 0x02, 0x05, 0x05, 0x03, - 0x06, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x11, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, 0x35, 0x33, 0x02, 0x70, 0x88, 0xfe, - 0xb8, 0x7b, 0x01, 0xc3, 0x88, 0x03, 0x78, 0xfc, 0x88, 0x32, 0x04, 0xc0, - 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x06, 0x00, 0x1c, 0x40, 0x0c, 0x01, 0x00, 0x04, 0x00, - 0x07, 0x08, 0x02, 0x05, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x27, 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfd, 0x90, 0x77, 0x02, - 0xe7, 0x88, 0x04, 0x67, 0xfb, 0x99, 0x44, 0x05, 0x3d, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x26, 0x40, 0x11, 0x07, 0x01, 0x01, 0x00, 0x00, 0x05, 0x0b, 0x0a, - 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, - 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x07, 0x01, 0x27, 0x09, 0x01, - 0x11, 0x33, 0x03, 0xb7, 0x88, 0xf8, 0xfe, 0x6c, 0x76, 0x01, 0xa0, 0x01, - 0x62, 0x88, 0x03, 0xb3, 0xf9, 0xfd, 0x46, 0x46, 0x02, 0xca, 0x01, 0x63, - 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x26, 0x40, 0x11, 0x07, 0x01, 0x01, 0x00, - 0x05, 0x00, 0x0a, 0x0b, 0x03, 0x06, 0x06, 0x04, 0x08, 0x03, 0x01, 0x04, - 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, - 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, - 0x01, 0x27, 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xf8, 0xfe, - 0x9c, 0x74, 0x01, 0x88, 0x01, 0x58, 0x88, 0x02, 0x9b, 0xfd, 0x65, 0x48, - 0x02, 0xdb, 0x02, 0x5e, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x32, 0x40, 0x18, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x05, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x03, 0x06, 0x07, 0x06, - 0x07, 0x06, 0x04, 0x08, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, - 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x09, - 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xd2, 0xfe, - 0x9f, 0x6b, 0x01, 0xae, 0x01, 0x4c, 0x88, 0x01, 0x20, 0x01, 0x2d, 0xfd, - 0xb3, 0x4b, 0x02, 0xe4, 0xfe, 0xb1, 0x03, 0xa1, 0x00, 0x01, 0x00, 0x35, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x26, 0x40, 0x12, - 0x06, 0x00, 0x04, 0x02, 0x00, 0x03, 0x0a, 0x09, 0x02, 0x06, 0x05, 0x05, - 0x03, 0x07, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, 0x3f, 0x12, 0x39, - 0x2f, 0x39, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, - 0x21, 0x23, 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, - 0xfe, 0xb8, 0xfe, 0xb9, 0x6b, 0x01, 0xae, 0x01, 0x4c, 0x88, 0x02, 0x21, - 0xfd, 0xdf, 0x4e, 0x02, 0xe4, 0xfd, 0xd6, 0x04, 0x79, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, - 0x00, 0x26, 0x40, 0x11, 0x05, 0x01, 0x01, 0x00, 0x04, 0x00, 0x08, 0x09, - 0x02, 0x05, 0x05, 0x03, 0x06, 0x03, 0x01, 0x03, 0x12, 0x00, 0x3f, 0x33, - 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, 0x11, 0x33, - 0x02, 0x70, 0x88, 0xfe, 0xb8, 0x73, 0x01, 0xbb, 0x88, 0x02, 0x21, 0xfd, - 0xdf, 0x48, 0x02, 0xe3, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x08, 0x00, 0x1c, 0x40, 0x0c, - 0x01, 0x00, 0x00, 0x05, 0x0a, 0x09, 0x02, 0x07, 0x03, 0x01, 0x04, 0x12, - 0x00, 0x3f, 0x33, 0x3f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x03, 0x01, 0x27, 0x09, 0x01, 0x33, 0x03, - 0xb7, 0x88, 0xe1, 0xfe, 0x52, 0x5a, 0x01, 0x90, 0x01, 0x59, 0x88, 0x03, - 0xfa, 0xfd, 0x9c, 0xfe, 0x6a, 0x66, 0x01, 0x7a, 0x03, 0xa1, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x26, 0x40, 0x11, 0x07, 0x01, 0x01, 0x00, 0x05, 0x00, 0x0a, 0x0b, - 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, 0x01, 0x04, 0x12, 0x00, 0x3f, 0x33, - 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x03, 0x01, 0x27, 0x09, 0x01, - 0x35, 0x33, 0x03, 0xb7, 0x88, 0xdc, 0xfe, 0x4d, 0x53, 0x01, 0x9a, 0x01, - 0x48, 0x88, 0x03, 0x69, 0xfe, 0x2f, 0xfe, 0x68, 0x6b, 0x01, 0x85, 0x02, - 0xa5, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x07, 0x00, 0x28, 0x40, 0x12, 0x05, 0x01, 0x01, 0x00, - 0x00, 0x04, 0x09, 0x08, 0x02, 0x05, 0x05, 0x03, 0x06, 0x03, 0x03, 0x03, - 0x00, 0x12, 0x00, 0x3f, 0x32, 0x2f, 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x11, 0x01, 0x27, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfd, 0x7d, 0x5f, - 0x02, 0xe2, 0x88, 0x02, 0x72, 0xfd, 0x9b, 0x5e, 0x02, 0xcc, 0x02, 0x4a, - 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x28, 0x40, 0x12, 0x07, 0x01, 0x01, 0x00, 0x00, 0x05, 0x0b, 0x0a, - 0x03, 0x06, 0x06, 0x04, 0x08, 0x03, 0x04, 0x04, 0x00, 0x12, 0x00, 0x3f, - 0x32, 0x2f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, - 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x21, 0x01, 0x27, - 0x01, 0x21, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xcc, 0xfe, 0xb9, 0x62, - 0x01, 0x71, 0x01, 0x6c, 0x88, 0x01, 0x56, 0xfe, 0xb4, 0x61, 0x01, 0x73, - 0x03, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x28, 0x40, 0x13, 0x06, 0x00, 0x04, 0x02, - 0x00, 0x03, 0x0a, 0x09, 0x02, 0x05, 0x05, 0x03, 0x07, 0x03, 0x03, 0x03, - 0x06, 0x00, 0x12, 0x00, 0x3f, 0x32, 0x32, 0x2f, 0x3f, 0x12, 0x39, 0x2f, - 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, - 0x09, 0x01, 0x27, 0x09, 0x01, 0x11, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xb8, - 0xfe, 0xc2, 0x5c, 0x01, 0x9a, 0x01, 0x48, 0x88, 0x01, 0x34, 0xfe, 0xd4, - 0x61, 0x01, 0x85, 0xfe, 0xcc, 0x04, 0xc7, 0x00, 0x00, 0x01, 0x00, 0x46, - 0x00, 0x00, 0x02, 0x70, 0x05, 0x81, 0x00, 0x07, 0x00, 0x28, 0x40, 0x12, - 0x05, 0x01, 0x01, 0x00, 0x00, 0x04, 0x09, 0x08, 0x02, 0x05, 0x05, 0x03, - 0x06, 0x03, 0x03, 0x03, 0x01, 0x12, 0x00, 0x3f, 0x33, 0x2f, 0x3f, 0x12, - 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, 0x33, - 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x27, 0x01, 0x11, 0x33, 0x02, 0x70, - 0x88, 0xfe, 0xb8, 0x5a, 0x01, 0xa2, 0x88, 0x01, 0x28, 0xfe, 0xd8, 0x64, - 0x01, 0x80, 0x03, 0x9d, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x08, 0x00, 0x23, 0x40, 0x11, 0x01, 0x00, 0x04, 0x06, - 0x00, 0x03, 0x0a, 0x09, 0x02, 0x04, 0x07, 0x03, 0x05, 0x04, 0x12, 0x01, - 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x11, 0x12, 0x01, 0x17, - 0x39, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, - 0x01, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xe0, 0xfe, 0x91, 0x01, 0x0e, 0x01, - 0x81, 0x88, 0x03, 0xbc, 0xfc, 0x44, 0x88, 0x04, 0xf9, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, - 0x00, 0x29, 0x40, 0x13, 0x07, 0x01, 0x01, 0x00, 0x00, 0x04, 0x0b, 0x0a, - 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, 0x05, 0x04, 0x12, 0x01, 0x12, 0x00, - 0x3f, 0x3f, 0x33, 0x3f, 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, - 0x35, 0x21, 0x01, 0x35, 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xe0, 0xfe, 0x91, - 0x01, 0x10, 0x01, 0x7f, 0x88, 0x03, 0x26, 0xfc, 0xda, 0x88, 0x04, 0x29, - 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x03, 0xb7, - 0x05, 0x81, 0x00, 0x09, 0x00, 0x2b, 0x40, 0x15, 0x07, 0x01, 0x01, 0x00, - 0x00, 0x06, 0x04, 0x03, 0x0a, 0x0b, 0x02, 0x07, 0x07, 0x04, 0x08, 0x03, - 0x05, 0x04, 0x12, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x3f, 0x12, 0x39, - 0x11, 0x33, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x11, 0x33, 0x31, - 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, 0x33, 0x03, - 0xb7, 0x88, 0xfe, 0xe2, 0xfe, 0x8f, 0x01, 0x1c, 0x01, 0x73, 0x88, 0x02, - 0x44, 0xfd, 0xbc, 0x88, 0x02, 0xf3, 0x02, 0x06, 0x00, 0x01, 0x00, 0xa0, - 0x00, 0x00, 0x03, 0xb7, 0x05, 0x81, 0x00, 0x09, 0x00, 0x29, 0x40, 0x13, - 0x07, 0x01, 0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, 0x02, 0x07, 0x07, 0x04, - 0x08, 0x03, 0x05, 0x04, 0x12, 0x01, 0x12, 0x00, 0x3f, 0x3f, 0x33, 0x3f, - 0x12, 0x39, 0x11, 0x33, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x21, 0x23, 0x11, 0x01, 0x21, 0x35, 0x21, 0x01, 0x11, - 0x33, 0x03, 0xb7, 0x88, 0xfe, 0xd6, 0xfe, 0x9b, 0x01, 0x33, 0x01, 0x5c, - 0x88, 0x01, 0x2a, 0xfe, 0xd6, 0x88, 0x01, 0x5c, 0x03, 0x9d, 0x00, 0x00, - 0x00, 0x01, 0xfe, 0x37, 0x04, 0xbe, 0x01, 0xc9, 0x05, 0x81, 0x00, 0x0b, - 0x00, 0x16, 0x40, 0x09, 0x03, 0x07, 0x07, 0x06, 0x02, 0x09, 0x80, 0x0b, - 0x03, 0x00, 0x3f, 0x1a, 0xcd, 0x32, 0x32, 0x39, 0x2f, 0x33, 0x31, 0x30, - 0x01, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, - 0x01, 0xc9, 0x5a, 0x28, 0x2f, 0xd5, 0x2f, 0x28, 0x2f, 0xd5, 0x2f, 0x28, - 0x5a, 0x05, 0x81, 0xc3, 0x65, 0x65, 0x65, 0x65, 0xc3, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xee, 0x05, 0xd8, 0x01, 0x13, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x27, 0x40, 0x18, 0x02, 0x05, 0x08, 0xe4, 0x08, 0xf4, - 0x08, 0x02, 0x08, 0x07, 0x70, 0x05, 0x01, 0x50, 0x05, 0x80, 0x05, 0xf0, - 0x05, 0x03, 0x0f, 0x05, 0x01, 0x05, 0x00, 0x2f, 0x5d, 0x5d, 0x71, 0x2f, - 0x33, 0x5d, 0x11, 0x12, 0x39, 0x31, 0x30, 0x13, 0x15, 0x23, 0x25, 0x35, - 0x33, 0x01, 0x21, 0x35, 0x21, 0x80, 0x82, 0xfe, 0xfb, 0xe2, 0x01, 0x38, - 0xfd, 0xdb, 0x02, 0x25, 0x06, 0x7e, 0x0a, 0xab, 0x0c, 0xfe, 0xad, 0x7f, - 0x00, 0x02, 0xfe, 0xee, 0x05, 0xd8, 0x01, 0x13, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x09, 0x00, 0x25, 0x40, 0x17, 0x03, 0x06, 0xe4, 0x06, 0xf4, 0x06, - 0x02, 0x06, 0x09, 0x70, 0x00, 0x01, 0x50, 0x00, 0x80, 0x00, 0xf0, 0x00, - 0x03, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x2f, 0x5d, 0x5d, 0x71, 0x2f, 0x33, - 0x5d, 0x11, 0x39, 0x31, 0x30, 0x13, 0x33, 0x15, 0x05, 0x23, 0x35, 0x07, - 0x21, 0x15, 0x21, 0x26, 0xe2, 0xfe, 0xfb, 0x82, 0x93, 0x02, 0x25, 0xfd, - 0xdb, 0x07, 0x2b, 0x0c, 0xab, 0x0a, 0x27, 0x7f, 0x00, 0x02, 0xfe, 0xc2, - 0x05, 0xc3, 0x01, 0x3f, 0x07, 0x2b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x43, - 0x40, 0x2d, 0x13, 0x1b, 0x18, 0x10, 0x04, 0x0c, 0x0c, 0x10, 0x18, 0x20, - 0x18, 0x02, 0xd0, 0x18, 0xe0, 0x18, 0xf0, 0x18, 0x03, 0xcf, 0x18, 0x01, - 0x60, 0x18, 0x70, 0x18, 0x02, 0xf0, 0x18, 0x01, 0x9f, 0x18, 0xaf, 0x18, - 0x02, 0x40, 0x18, 0x50, 0x18, 0x80, 0x18, 0x03, 0x18, 0x07, 0x00, 0x00, - 0x2f, 0x32, 0x2f, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x39, 0x2f, - 0x39, 0x39, 0x12, 0x39, 0x33, 0x31, 0x30, 0x13, 0x22, 0x27, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x02, 0x03, 0x33, 0x15, 0x07, 0x23, 0x35, 0x7f, - 0x33, 0x54, 0x55, 0x24, 0x2d, 0x2d, 0x08, 0x5b, 0x0b, 0x2b, 0x4c, 0x3f, - 0x37, 0x53, 0x53, 0x22, 0x30, 0x2b, 0x06, 0x5c, 0x0c, 0x2a, 0x4b, 0x98, - 0xe2, 0xe7, 0x82, 0x05, 0xc3, 0x26, 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, - 0x25, 0x26, 0x26, 0x25, 0x51, 0x4a, 0x27, 0x01, 0x68, 0x0c, 0x83, 0x0a, - 0x00, 0x03, 0xfe, 0xc2, 0x05, 0xc3, 0x01, 0x3f, 0x07, 0x2b, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x1f, 0x00, 0x76, 0xb5, 0x0c, 0x18, 0x08, 0x1b, 0x1b, - 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x19, 0x20, 0x48, 0x14, 0x14, 0x0f, - 0x08, 0x02, 0xdf, 0x05, 0xef, 0x05, 0xff, 0x05, 0x03, 0xc0, 0x05, 0x01, - 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x36, 0x12, 0x16, 0x48, 0x05, 0x03, 0x10, - 0x07, 0x20, 0x07, 0x40, 0x07, 0x50, 0x07, 0x60, 0x07, 0x80, 0x07, 0x06, - 0xd0, 0x07, 0xe0, 0x07, 0xf0, 0x07, 0x03, 0xcf, 0x07, 0x01, 0x60, 0x07, - 0x70, 0x07, 0x02, 0x0f, 0x07, 0x1f, 0x07, 0x02, 0xf0, 0x07, 0x01, 0x9f, - 0x07, 0xaf, 0x07, 0x02, 0x40, 0x07, 0x50, 0x07, 0x80, 0x07, 0x03, 0x07, - 0x00, 0x2f, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x33, 0xcd, - 0x2b, 0x71, 0x71, 0x32, 0x2f, 0x33, 0x39, 0x2f, 0x2b, 0x33, 0x11, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x13, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, - 0x01, 0x22, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, - 0x32, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x02, 0xda, 0x77, - 0xc5, 0x77, 0x01, 0x58, 0x33, 0x54, 0x55, 0x24, 0x2d, 0x2d, 0x08, 0x5b, - 0x0b, 0x2b, 0x4c, 0x3f, 0x37, 0x53, 0x53, 0x22, 0x30, 0x2b, 0x06, 0x5c, - 0x0c, 0x2a, 0x4b, 0x07, 0x2b, 0x87, 0x87, 0x87, 0x87, 0xfe, 0x98, 0x26, - 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, 0x25, 0x26, 0x26, 0x25, 0x51, 0x4a, - 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x59, 0x05, 0xe2, 0x01, 0x58, - 0x07, 0x15, 0x00, 0x03, 0x00, 0x09, 0x00, 0x17, 0x40, 0x0a, 0x02, 0x01, - 0x02, 0x01, 0x80, 0x07, 0x01, 0x07, 0x80, 0x04, 0x00, 0x2f, 0x1a, 0xcd, - 0x5d, 0x39, 0x39, 0x2f, 0x2f, 0x31, 0x30, 0x03, 0x23, 0x35, 0x33, 0x03, - 0x35, 0x13, 0x33, 0x15, 0x01, 0x20, 0x87, 0x87, 0x30, 0xd9, 0xcf, 0xfe, - 0xb6, 0x06, 0x82, 0x89, 0xfe, 0xd7, 0x14, 0x01, 0x1f, 0x1d, 0xfe, 0xea, - 0x00, 0x02, 0xfe, 0xb5, 0x05, 0xda, 0x01, 0x4b, 0x07, 0x2b, 0x00, 0x03, - 0x00, 0x0d, 0x00, 0x1f, 0xb6, 0x00, 0x09, 0x05, 0x0b, 0x02, 0x40, 0x08, - 0xb8, 0xff, 0xc0, 0xb5, 0x09, 0x11, 0x48, 0x08, 0x80, 0x05, 0x00, 0x2f, - 0x1a, 0xdd, 0x2b, 0x1a, 0xce, 0x33, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, - 0x23, 0x35, 0x33, 0x13, 0x23, 0x27, 0x35, 0x33, 0x17, 0x33, 0x37, 0x33, - 0x15, 0x44, 0x87, 0x87, 0x27, 0xcc, 0xea, 0x68, 0xe8, 0x02, 0xdb, 0x69, - 0x06, 0xa2, 0x89, 0xfe, 0xaf, 0xef, 0x15, 0x8b, 0x8b, 0x15, 0x00, 0x00, - 0x00, 0x03, 0xfe, 0xd6, 0x05, 0xb2, 0x01, 0x2b, 0x07, 0x2b, 0x00, 0x03, - 0x00, 0x07, 0x00, 0x0b, 0x00, 0x33, 0x40, 0x23, 0x02, 0x0a, 0x09, 0x05, - 0x05, 0x07, 0x09, 0x03, 0x50, 0x07, 0x60, 0x07, 0x70, 0x07, 0xd0, 0x07, - 0xe0, 0x07, 0xf0, 0x07, 0x06, 0x40, 0x07, 0x50, 0x07, 0x70, 0x07, 0x80, - 0x07, 0xe0, 0x07, 0xf0, 0x07, 0x06, 0x07, 0x00, 0x2f, 0x5d, 0x71, 0x33, - 0x2f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, - 0x35, 0x21, 0x15, 0x23, 0x35, 0x01, 0x21, 0x35, 0x21, 0x01, 0x2b, 0xa3, - 0xfe, 0xf1, 0xa3, 0x02, 0x3d, 0xfd, 0xdb, 0x02, 0x25, 0x07, 0x2b, 0xb8, - 0xb8, 0xb8, 0xb8, 0xfe, 0x87, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1a, - 0x00, 0x00, 0x01, 0xad, 0x04, 0x3a, 0x00, 0x0b, 0x00, 0x32, 0x40, 0x18, - 0x0b, 0x01, 0x09, 0x09, 0x06, 0x04, 0x08, 0x08, 0x0c, 0x0d, 0x07, 0x0b, - 0x00, 0x0b, 0x50, 0x59, 0x04, 0x00, 0x00, 0x02, 0x09, 0x15, 0x02, 0x0f, - 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x11, - 0x12, 0x01, 0x39, 0x11, 0x33, 0x33, 0x33, 0x11, 0x33, 0x33, 0x31, 0x30, - 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, - 0x1a, 0x6d, 0xb4, 0x72, 0x72, 0xb4, 0x6d, 0x02, 0x69, 0x01, 0xd1, 0xfe, - 0x2f, 0x85, 0xfe, 0x1c, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x8b, 0x00, 0xdc, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa1, - 0x00, 0xe6, 0x01, 0x5e, 0x00, 0x36, 0x40, 0x26, 0x04, 0x03, 0x1f, 0x30, - 0x2f, 0x30, 0x4f, 0x30, 0x03, 0xbf, 0x30, 0x01, 0x10, 0x30, 0x80, 0x30, - 0xa0, 0x30, 0xc0, 0x30, 0xf0, 0x30, 0x05, 0x30, 0x02, 0x28, 0x11, 0x26, - 0x04, 0x03, 0x02, 0x28, 0x00, 0x28, 0x27, 0x06, 0x13, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x00, 0xdc, 0x00, 0x00, - 0x11, 0x07, 0x07, 0xa2, 0x00, 0xe6, 0x01, 0x5e, 0x00, 0x36, 0x40, 0x26, - 0x04, 0x03, 0x1f, 0x3b, 0x2f, 0x3b, 0x4f, 0x3b, 0x03, 0xbf, 0x3b, 0x01, - 0x10, 0x3b, 0x80, 0x3b, 0xa0, 0x3b, 0xc0, 0x3b, 0xf0, 0x3b, 0x05, 0x3b, - 0x02, 0x28, 0x11, 0x26, 0x04, 0x03, 0x02, 0x28, 0x00, 0x28, 0x27, 0x06, - 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x2f, 0x5d, - 0x5d, 0x71, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, - 0x00, 0xdc, 0x00, 0x00, 0x11, 0x07, 0x07, 0xae, 0x00, 0xe6, 0x01, 0x5e, - 0x00, 0x36, 0x40, 0x26, 0x04, 0x03, 0x1f, 0x3b, 0x2f, 0x3b, 0x4f, 0x3b, - 0x03, 0xbf, 0x3b, 0x01, 0x10, 0x3b, 0x80, 0x3b, 0xa0, 0x3b, 0xc0, 0x3b, - 0xf0, 0x3b, 0x05, 0x3b, 0x02, 0x28, 0x11, 0x26, 0x04, 0x03, 0x02, 0x28, - 0x00, 0x28, 0x27, 0x06, 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, - 0x2b, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0xff, 0xff, 0x00, 0x56, - 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, 0x03, 0x63, 0x00, 0x00, - 0x10, 0x27, 0x02, 0x8b, 0x00, 0xdc, 0x00, 0x00, 0x11, 0x07, 0x07, 0xaf, - 0x00, 0xe6, 0x01, 0x5e, 0x00, 0x36, 0x40, 0x26, 0x04, 0x03, 0x1f, 0x3b, - 0x2f, 0x3b, 0x4f, 0x3b, 0x03, 0xbf, 0x3b, 0x01, 0x10, 0x3b, 0x80, 0x3b, - 0xa0, 0x3b, 0xc0, 0x3b, 0xf0, 0x3b, 0x05, 0x3b, 0x02, 0x28, 0x11, 0x26, - 0x04, 0x03, 0x02, 0x28, 0x00, 0x28, 0x27, 0x06, 0x13, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x00, 0x2b, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x02, 0xc8, 0x02, 0x1a, 0xff, 0xd9, - 0x11, 0x07, 0x07, 0xa1, 0x00, 0xe6, 0x01, 0x5e, 0x00, 0x30, 0x40, 0x20, - 0x04, 0x03, 0x2f, 0x45, 0x3f, 0x45, 0x4f, 0x45, 0xbf, 0x45, 0x04, 0x80, - 0x45, 0xf0, 0x45, 0x02, 0x45, 0x02, 0x27, 0x27, 0x11, 0x26, 0x04, 0x03, - 0x02, 0x2a, 0x00, 0x2a, 0x32, 0x06, 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x00, 0xe6, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1a, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x02, 0x03, 0x2f, 0x37, 0x3f, 0x37, 0x4f, 0x37, 0xbf, 0x37, 0x04, 0x80, - 0x37, 0xf0, 0x37, 0x02, 0x37, 0x04, 0x38, 0x38, 0x11, 0x26, 0x04, 0x03, - 0x02, 0x3b, 0x00, 0x3b, 0x43, 0x06, 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xae, 0x00, 0xe6, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1a, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x02, 0x03, 0x2f, 0x37, 0x3f, 0x37, 0x4f, 0x37, 0xbf, 0x37, 0x04, 0x80, - 0x37, 0xf0, 0x37, 0x02, 0x37, 0x04, 0x38, 0x38, 0x11, 0x26, 0x04, 0x03, - 0x02, 0x3b, 0x00, 0x3b, 0x43, 0x06, 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x56, 0xff, 0xec, 0x04, 0x65, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x63, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, 0x00, 0xe6, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1a, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x02, 0x03, 0x2f, 0x37, 0x3f, 0x37, 0x4f, 0x37, 0xbf, 0x37, 0x04, 0x80, - 0x37, 0xf0, 0x37, 0x02, 0x37, 0x04, 0x38, 0x38, 0x11, 0x26, 0x04, 0x03, - 0x02, 0x3b, 0x00, 0x3b, 0x43, 0x06, 0x13, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x06, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x02, 0x8b, 0xa2, 0x00, 0x11, 0x07, - 0x07, 0xa1, 0xff, 0x98, 0x01, 0x5e, 0x00, 0x38, 0x40, 0x27, 0x03, 0x02, - 0x1f, 0x1e, 0x2f, 0x1e, 0x4f, 0x1e, 0x03, 0xbf, 0x1e, 0x01, 0x10, 0x1e, - 0x80, 0x1e, 0xa0, 0x1e, 0xc0, 0x1e, 0xf0, 0x1e, 0x05, 0x1e, 0x01, 0x0a, - 0x0a, 0x11, 0x26, 0x03, 0x02, 0x01, 0x0c, 0x00, 0x0c, 0x0d, 0x04, 0x05, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, - 0x5d, 0x71, 0x35, 0x35, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0x02, 0x24, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x02, 0x8b, - 0xa2, 0x00, 0x11, 0x07, 0x07, 0xa2, 0xff, 0xac, 0x01, 0x5e, 0x00, 0x38, - 0x40, 0x27, 0x03, 0x02, 0x1f, 0x1e, 0x2f, 0x1e, 0x4f, 0x1e, 0x03, 0xbf, - 0x1e, 0x01, 0x10, 0x1e, 0x80, 0x1e, 0xa0, 0x1e, 0xc0, 0x1e, 0xf0, 0x1e, - 0x05, 0x1e, 0x01, 0x0a, 0x0a, 0x11, 0x26, 0x03, 0x02, 0x01, 0x0c, 0x00, - 0x0c, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, - 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0xff, 0xff, 0xff, 0xbd, - 0x00, 0x00, 0x02, 0x01, 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, - 0x10, 0x26, 0x02, 0x8b, 0xa2, 0x00, 0x11, 0x07, 0x07, 0xae, 0xff, 0x93, - 0x01, 0x5e, 0x00, 0x38, 0x40, 0x27, 0x03, 0x02, 0x1f, 0x1e, 0x2f, 0x1e, - 0x4f, 0x1e, 0x03, 0xbf, 0x1e, 0x01, 0x10, 0x1e, 0x80, 0x1e, 0xa0, 0x1e, - 0xc0, 0x1e, 0xf0, 0x1e, 0x05, 0x1e, 0x01, 0x0a, 0x0a, 0x11, 0x26, 0x03, - 0x02, 0x01, 0x0c, 0x00, 0x0c, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, - 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0x02, 0x33, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x02, 0x8b, 0xa2, 0x00, 0x11, 0x07, - 0x07, 0xaf, 0xff, 0xbb, 0x01, 0x5e, 0x00, 0x38, 0x40, 0x27, 0x03, 0x02, - 0x1f, 0x1e, 0x2f, 0x1e, 0x4f, 0x1e, 0x03, 0xbf, 0x1e, 0x01, 0x10, 0x1e, - 0x80, 0x1e, 0xa0, 0x1e, 0xc0, 0x1e, 0xf0, 0x1e, 0x05, 0x1e, 0x01, 0x0a, - 0x0a, 0x11, 0x26, 0x03, 0x02, 0x01, 0x0c, 0x00, 0x0c, 0x0d, 0x04, 0x05, - 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, - 0x5d, 0x71, 0x35, 0x35, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x0b, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa1, - 0xff, 0x9d, 0x01, 0x5e, 0x11, 0x07, 0x02, 0xc8, 0x00, 0xe6, 0xff, 0xd9, - 0x00, 0x30, 0x40, 0x20, 0x01, 0x02, 0x2f, 0x1a, 0x3f, 0x1a, 0x4f, 0x1a, - 0xbf, 0x1a, 0x04, 0x80, 0x1a, 0xf0, 0x1a, 0x02, 0x1a, 0x03, 0x1b, 0x1b, - 0x11, 0x26, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x1e, 0x26, 0x04, 0x05, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x15, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, - 0xff, 0x9d, 0x01, 0x5e, 0x11, 0x07, 0x02, 0xc8, 0x00, 0xe6, 0xff, 0xd9, - 0x00, 0x30, 0x40, 0x20, 0x01, 0x02, 0x2f, 0x1a, 0x3f, 0x1a, 0x4f, 0x1a, - 0xbf, 0x1a, 0x04, 0x80, 0x1a, 0xf0, 0x1a, 0x02, 0x1a, 0x03, 0x1b, 0x1b, - 0x11, 0x26, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x1e, 0x26, 0x04, 0x05, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x0b, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xae, - 0xff, 0x9d, 0x01, 0x5e, 0x11, 0x07, 0x02, 0xc8, 0x00, 0xe6, 0xff, 0xd9, - 0x00, 0x30, 0x40, 0x20, 0x01, 0x02, 0x2f, 0x1a, 0x3f, 0x1a, 0x4f, 0x1a, - 0xbf, 0x1a, 0x04, 0x80, 0x1a, 0xf0, 0x1a, 0x02, 0x1a, 0x03, 0x1b, 0x1b, - 0x11, 0x26, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x1e, 0x26, 0x04, 0x05, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x15, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, - 0xff, 0x9d, 0x01, 0x5e, 0x11, 0x07, 0x02, 0xc8, 0x00, 0xe6, 0xff, 0xd9, - 0x00, 0x30, 0x40, 0x20, 0x01, 0x02, 0x2f, 0x1a, 0x3f, 0x1a, 0x4f, 0x1a, - 0xbf, 0x1a, 0x04, 0x80, 0x1a, 0xf0, 0x1a, 0x02, 0x1a, 0x03, 0x1b, 0x1b, - 0x11, 0x26, 0x01, 0x03, 0x02, 0x1e, 0x00, 0x1e, 0x26, 0x04, 0x05, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, - 0x00, 0xd2, 0x00, 0x00, 0x11, 0x07, 0x07, 0xa1, 0x00, 0xc8, 0x01, 0x5e, - 0x00, 0x38, 0x40, 0x27, 0x03, 0x02, 0x1f, 0x2a, 0x2f, 0x2a, 0x4f, 0x2a, - 0x03, 0xbf, 0x2a, 0x01, 0x10, 0x2a, 0x80, 0x2a, 0xa0, 0x2a, 0xc0, 0x2a, - 0xf0, 0x2a, 0x05, 0x2a, 0x01, 0x16, 0x16, 0x11, 0x26, 0x03, 0x02, 0x01, - 0x18, 0x00, 0x18, 0x19, 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x00, 0xdc, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0x8b, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x38, 0x40, 0x27, - 0x01, 0x02, 0x1f, 0x26, 0x2f, 0x26, 0x4f, 0x26, 0x03, 0xbf, 0x26, 0x01, - 0x10, 0x26, 0x80, 0x26, 0xa0, 0x26, 0xc0, 0x26, 0xf0, 0x26, 0x05, 0x26, - 0x03, 0x28, 0x28, 0x11, 0x26, 0x03, 0x02, 0x01, 0x29, 0x00, 0x29, 0x2a, - 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, - 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, - 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, - 0x10, 0x27, 0x07, 0xae, 0x00, 0xc8, 0x01, 0x5e, 0x11, 0x07, 0x02, 0x8b, - 0x00, 0xd2, 0x00, 0x00, 0x00, 0x38, 0x40, 0x27, 0x01, 0x02, 0x1f, 0x26, - 0x2f, 0x26, 0x4f, 0x26, 0x03, 0xbf, 0x26, 0x01, 0x10, 0x26, 0x80, 0x26, - 0xa0, 0x26, 0xc0, 0x26, 0xf0, 0x26, 0x05, 0x26, 0x03, 0x28, 0x28, 0x11, - 0x26, 0x03, 0x02, 0x01, 0x29, 0x00, 0x29, 0x2a, 0x06, 0x0d, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, - 0x35, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x07, 0x2a, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, - 0x00, 0xf0, 0x01, 0x5e, 0x11, 0x07, 0x02, 0x8b, 0x00, 0xd2, 0x00, 0x00, - 0x00, 0x38, 0x40, 0x27, 0x01, 0x02, 0x1f, 0x26, 0x2f, 0x26, 0x4f, 0x26, - 0x03, 0xbf, 0x26, 0x01, 0x10, 0x26, 0x80, 0x26, 0xa0, 0x26, 0xc0, 0x26, - 0xf0, 0x26, 0x05, 0x26, 0x03, 0x28, 0x28, 0x11, 0x26, 0x03, 0x02, 0x01, - 0x29, 0x00, 0x29, 0x2a, 0x06, 0x0d, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, - 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x71, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa1, 0x00, 0xd2, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1c, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x01, 0x02, 0x2f, 0x26, 0x3f, 0x26, 0x4f, 0x26, 0xbf, 0x26, 0x04, 0x80, - 0x26, 0xf0, 0x26, 0x02, 0x26, 0x03, 0x27, 0x27, 0x11, 0x26, 0x01, 0x03, - 0x02, 0x2a, 0x00, 0x2a, 0x32, 0x06, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x00, 0xdc, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1c, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x01, 0x02, 0x2f, 0x26, 0x3f, 0x26, 0x4f, 0x26, 0xbf, 0x26, 0x04, 0x80, - 0x26, 0xf0, 0x26, 0x02, 0x26, 0x03, 0x27, 0x27, 0x11, 0x26, 0x01, 0x03, - 0x02, 0x2a, 0x00, 0x2a, 0x32, 0x06, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xae, 0x00, 0xbe, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1c, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x01, 0x02, 0x2f, 0x26, 0x3f, 0x26, 0x4f, 0x26, 0xbf, 0x26, 0x04, 0x80, - 0x26, 0xf0, 0x26, 0x02, 0x26, 0x03, 0x27, 0x27, 0x11, 0x26, 0x01, 0x03, - 0x02, 0x2a, 0x00, 0x2a, 0x32, 0x06, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2a, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x07, 0xaf, 0x01, 0x04, 0x01, 0x5e, - 0x11, 0x07, 0x02, 0xc8, 0x02, 0x1c, 0xff, 0xd9, 0x00, 0x30, 0x40, 0x20, - 0x01, 0x02, 0x2f, 0x26, 0x3f, 0x26, 0x4f, 0x26, 0xbf, 0x26, 0x04, 0x80, - 0x26, 0xf0, 0x26, 0x02, 0x26, 0x03, 0x27, 0x27, 0x11, 0x26, 0x01, 0x03, - 0x02, 0x2a, 0x00, 0x2a, 0x32, 0x06, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, - 0x35, 0x00, 0x2b, 0x11, 0x35, 0x2f, 0x5d, 0x5d, 0x35, 0x35, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x01, 0xfc, 0x07, 0x2b, 0x12, 0x26, - 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, 0xa2, 0xbb, 0x10, 0x27, - 0x02, 0x8b, 0xff, 0xa0, 0x00, 0xa6, 0x11, 0x07, 0x0a, 0x0c, 0xff, 0x58, - 0x00, 0x00, 0x00, 0xb2, 0x40, 0x94, 0x04, 0x2b, 0x18, 0x3b, 0x18, 0x6b, - 0x18, 0x7b, 0x18, 0x04, 0x0b, 0x18, 0x1b, 0x18, 0x2b, 0x18, 0x3b, 0x18, - 0x5b, 0x18, 0x8b, 0x18, 0x9b, 0x18, 0x07, 0x3b, 0x18, 0x7b, 0x18, 0x9b, - 0x18, 0x03, 0xd4, 0x18, 0x01, 0xf4, 0x18, 0x01, 0x18, 0x03, 0x9f, 0x14, - 0x01, 0x02, 0x1f, 0x14, 0x2f, 0x14, 0x6f, 0x14, 0x7f, 0x14, 0x9f, 0x14, - 0xbf, 0x14, 0xcf, 0x14, 0xef, 0x14, 0x08, 0x0f, 0x14, 0x2f, 0x14, 0x3f, - 0x14, 0x5f, 0x14, 0x8f, 0x14, 0xcf, 0x14, 0xff, 0x14, 0x07, 0x3f, 0x14, - 0x5f, 0x14, 0x6f, 0x14, 0x7f, 0x14, 0x8f, 0x14, 0xaf, 0x14, 0xbf, 0x14, - 0xdf, 0x14, 0xef, 0x14, 0xff, 0x14, 0x0a, 0x14, 0x02, 0x01, 0x0a, 0x5f, - 0x0a, 0x01, 0x00, 0x0a, 0x10, 0x0a, 0x20, 0x0a, 0x30, 0x0a, 0x40, 0x0a, - 0x05, 0x10, 0x0a, 0x20, 0x0a, 0x40, 0x0a, 0x50, 0x0a, 0x60, 0x0a, 0x70, - 0x0a, 0xd0, 0x0a, 0xe0, 0x0a, 0xf0, 0x0a, 0x09, 0x0a, 0x11, 0x26, 0x04, - 0x03, 0x02, 0x01, 0x0e, 0x00, 0x0e, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, - 0x35, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x11, 0x35, 0x35, - 0x2f, 0x5d, 0x71, 0x72, 0x5f, 0x5d, 0x35, 0x2f, 0x5d, 0x71, 0x5d, 0x71, - 0x72, 0x35, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcf, 0x00, 0x00, 0x01, 0xfc, - 0x07, 0x2b, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, - 0xa2, 0xbb, 0x10, 0x27, 0x02, 0x8b, 0xff, 0xa0, 0x00, 0xa6, 0x11, 0x06, - 0x0a, 0x0d, 0xd6, 0x00, 0x00, 0xb2, 0x40, 0x94, 0x04, 0x2b, 0x18, 0x3b, - 0x18, 0x6b, 0x18, 0x7b, 0x18, 0x04, 0x0b, 0x18, 0x1b, 0x18, 0x2b, 0x18, - 0x3b, 0x18, 0x5b, 0x18, 0x8b, 0x18, 0x9b, 0x18, 0x07, 0x3b, 0x18, 0x7b, - 0x18, 0x9b, 0x18, 0x03, 0xd4, 0x18, 0x01, 0xf4, 0x18, 0x01, 0x18, 0x03, - 0x9f, 0x14, 0x01, 0x02, 0x1f, 0x14, 0x2f, 0x14, 0x6f, 0x14, 0x7f, 0x14, - 0x9f, 0x14, 0xbf, 0x14, 0xcf, 0x14, 0xef, 0x14, 0x08, 0x0f, 0x14, 0x2f, - 0x14, 0x3f, 0x14, 0x5f, 0x14, 0x8f, 0x14, 0xcf, 0x14, 0xff, 0x14, 0x07, - 0x3f, 0x14, 0x5f, 0x14, 0x6f, 0x14, 0x7f, 0x14, 0x8f, 0x14, 0xaf, 0x14, - 0xbf, 0x14, 0xdf, 0x14, 0xef, 0x14, 0xff, 0x14, 0x0a, 0x14, 0x02, 0x01, - 0x0a, 0x5f, 0x0a, 0x01, 0x00, 0x0a, 0x10, 0x0a, 0x20, 0x0a, 0x30, 0x0a, - 0x40, 0x0a, 0x05, 0x10, 0x0a, 0x20, 0x0a, 0x40, 0x0a, 0x50, 0x0a, 0x60, - 0x0a, 0x70, 0x0a, 0xd0, 0x0a, 0xe0, 0x0a, 0xf0, 0x0a, 0x09, 0x0a, 0x11, - 0x26, 0x04, 0x03, 0x02, 0x01, 0x0f, 0x00, 0x0f, 0x0c, 0x04, 0x05, 0x25, - 0x2b, 0x11, 0x35, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x11, - 0x35, 0x35, 0x2f, 0x5d, 0x71, 0x72, 0x5f, 0x5d, 0x35, 0x2f, 0x5d, 0x71, - 0x5d, 0x71, 0x72, 0x35, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x0a, - 0x07, 0x2b, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, - 0xa2, 0xbb, 0x10, 0x27, 0x02, 0xc8, 0x00, 0xe6, 0x00, 0xa6, 0x11, 0x07, - 0x0a, 0x0c, 0xff, 0x58, 0x00, 0x00, 0x00, 0xa1, 0x40, 0x83, 0x04, 0x6f, - 0x22, 0x7f, 0x22, 0x8f, 0x22, 0xbf, 0x22, 0x04, 0x3f, 0x22, 0x8f, 0x22, - 0x9f, 0x22, 0x03, 0x0f, 0x22, 0x3f, 0x22, 0x4f, 0x22, 0x7f, 0x22, 0x9f, - 0x22, 0xbf, 0x22, 0x06, 0xd0, 0x22, 0x01, 0xf0, 0x22, 0x01, 0x22, 0x03, - 0x1f, 0x15, 0x2f, 0x15, 0x6f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0xbf, 0x15, - 0xcf, 0x15, 0xef, 0x15, 0x08, 0x3f, 0x15, 0x8f, 0x15, 0x9f, 0x15, 0x03, - 0x0f, 0x15, 0x2f, 0x15, 0x3f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0x05, 0x15, - 0x02, 0x01, 0x0e, 0x5f, 0x0e, 0x01, 0x00, 0x0e, 0x10, 0x0e, 0x20, 0x0e, - 0x30, 0x0e, 0x40, 0x0e, 0x05, 0x10, 0x0e, 0x20, 0x0e, 0x40, 0x0e, 0x50, - 0x0e, 0x60, 0x0e, 0x70, 0x0e, 0xd0, 0x0e, 0xe0, 0x0e, 0xf0, 0x0e, 0x09, - 0x0e, 0x11, 0x26, 0x04, 0x03, 0x15, 0x00, 0x15, 0x1d, 0x04, 0x05, 0x25, - 0x02, 0x01, 0x0e, 0x00, 0x0e, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x2b, 0x11, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x11, 0x35, - 0x35, 0x2f, 0x5d, 0x71, 0x72, 0x35, 0x2f, 0x5d, 0x71, 0x5d, 0x71, 0x72, - 0x35, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x02, 0x0a, - 0x07, 0x2b, 0x12, 0x26, 0x03, 0x6b, 0x00, 0x00, 0x10, 0x26, 0x00, 0x6a, - 0xa2, 0xbb, 0x10, 0x27, 0x02, 0xc8, 0x00, 0xe6, 0x00, 0xa6, 0x11, 0x06, - 0x0a, 0x0d, 0xd6, 0x00, 0x00, 0xa1, 0x40, 0x83, 0x04, 0x6f, 0x22, 0x7f, - 0x22, 0x8f, 0x22, 0xbf, 0x22, 0x04, 0x3f, 0x22, 0x8f, 0x22, 0x9f, 0x22, - 0x03, 0x0f, 0x22, 0x3f, 0x22, 0x4f, 0x22, 0x7f, 0x22, 0x9f, 0x22, 0xbf, - 0x22, 0x06, 0xd0, 0x22, 0x01, 0xf0, 0x22, 0x01, 0x22, 0x03, 0x1f, 0x15, - 0x2f, 0x15, 0x6f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0xbf, 0x15, 0xcf, 0x15, - 0xef, 0x15, 0x08, 0x3f, 0x15, 0x8f, 0x15, 0x9f, 0x15, 0x03, 0x0f, 0x15, - 0x2f, 0x15, 0x3f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0x05, 0x15, 0x02, 0x01, - 0x0e, 0x5f, 0x0e, 0x01, 0x00, 0x0e, 0x10, 0x0e, 0x20, 0x0e, 0x30, 0x0e, - 0x40, 0x0e, 0x05, 0x10, 0x0e, 0x20, 0x0e, 0x40, 0x0e, 0x50, 0x0e, 0x60, - 0x0e, 0x70, 0x0e, 0xd0, 0x0e, 0xe0, 0x0e, 0xf0, 0x0e, 0x09, 0x0e, 0x11, - 0x26, 0x04, 0x03, 0x15, 0x00, 0x15, 0x1d, 0x04, 0x05, 0x25, 0x02, 0x01, - 0x0e, 0x00, 0x0e, 0x0d, 0x04, 0x05, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x2b, - 0x11, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x11, 0x35, 0x35, 0x2f, - 0x5d, 0x71, 0x72, 0x35, 0x2f, 0x5d, 0x71, 0x5d, 0x71, 0x72, 0x35, 0x00, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2b, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x00, 0xcb, 0x00, 0xa6, - 0x10, 0x27, 0x00, 0x6a, 0x00, 0xcd, 0xff, 0xbb, 0x11, 0x06, 0x0a, 0x0c, - 0x79, 0x00, 0x00, 0xb0, 0x40, 0x93, 0x04, 0x2b, 0x24, 0x3b, 0x24, 0x6b, - 0x24, 0x7b, 0x24, 0x04, 0x0b, 0x24, 0x1b, 0x24, 0x2b, 0x24, 0x3b, 0x24, - 0x5b, 0x24, 0x8b, 0x24, 0x9b, 0x24, 0x07, 0x3b, 0x24, 0x7b, 0x24, 0x9b, - 0x24, 0x03, 0xd4, 0x24, 0x01, 0xf4, 0x24, 0x01, 0x24, 0x01, 0x9f, 0x18, - 0x01, 0x02, 0x1f, 0x18, 0x2f, 0x18, 0x6f, 0x18, 0x7f, 0x18, 0x9f, 0x18, - 0xbf, 0x18, 0xcf, 0x18, 0xef, 0x18, 0x08, 0x0f, 0x18, 0x2f, 0x18, 0x3f, - 0x18, 0x5f, 0x18, 0x8f, 0x18, 0xcf, 0x18, 0xff, 0x18, 0x07, 0x3f, 0x18, - 0x5f, 0x18, 0x6f, 0x18, 0x7f, 0x18, 0x8f, 0x18, 0xaf, 0x18, 0xbf, 0x18, - 0xdf, 0x18, 0xef, 0x18, 0xff, 0x18, 0x0a, 0x18, 0x02, 0x03, 0x5f, 0x1e, - 0x01, 0x00, 0x1e, 0x10, 0x1e, 0x20, 0x1e, 0x30, 0x1e, 0x40, 0x1e, 0x05, - 0x10, 0x1e, 0x20, 0x1e, 0x40, 0x1e, 0x50, 0x1e, 0x60, 0x1e, 0x70, 0x1e, - 0xd0, 0x1e, 0xe0, 0x1e, 0xf0, 0x1e, 0x09, 0x1e, 0x11, 0x26, 0x04, 0x03, - 0x02, 0x01, 0x1e, 0x00, 0x1e, 0x1d, 0x07, 0x0f, 0x25, 0x2b, 0x11, 0x35, - 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x35, 0x35, 0x2f, 0x5d, - 0x71, 0x72, 0x5f, 0x5d, 0x35, 0x2f, 0x5d, 0x71, 0x5d, 0x71, 0x72, 0x35, - 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, 0x07, 0x2b, 0x12, 0x26, - 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x02, 0x8b, 0x00, 0xcb, 0x00, 0xa6, - 0x10, 0x27, 0x00, 0x6a, 0x00, 0xcd, 0xff, 0xbb, 0x11, 0x07, 0x0a, 0x0d, - 0x00, 0xf4, 0x00, 0x00, 0x00, 0xb0, 0x40, 0x93, 0x04, 0x2b, 0x24, 0x3b, - 0x24, 0x6b, 0x24, 0x7b, 0x24, 0x04, 0x0b, 0x24, 0x1b, 0x24, 0x2b, 0x24, - 0x3b, 0x24, 0x5b, 0x24, 0x8b, 0x24, 0x9b, 0x24, 0x07, 0x3b, 0x24, 0x7b, - 0x24, 0x9b, 0x24, 0x03, 0xd4, 0x24, 0x01, 0xf4, 0x24, 0x01, 0x24, 0x01, - 0x9f, 0x18, 0x01, 0x02, 0x1f, 0x18, 0x2f, 0x18, 0x6f, 0x18, 0x7f, 0x18, - 0x9f, 0x18, 0xbf, 0x18, 0xcf, 0x18, 0xef, 0x18, 0x08, 0x0f, 0x18, 0x2f, - 0x18, 0x3f, 0x18, 0x5f, 0x18, 0x8f, 0x18, 0xcf, 0x18, 0xff, 0x18, 0x07, - 0x3f, 0x18, 0x5f, 0x18, 0x6f, 0x18, 0x7f, 0x18, 0x8f, 0x18, 0xaf, 0x18, - 0xbf, 0x18, 0xdf, 0x18, 0xef, 0x18, 0xff, 0x18, 0x0a, 0x18, 0x02, 0x03, - 0x5f, 0x1e, 0x01, 0x00, 0x1e, 0x10, 0x1e, 0x20, 0x1e, 0x30, 0x1e, 0x40, - 0x1e, 0x05, 0x10, 0x1e, 0x20, 0x1e, 0x40, 0x1e, 0x50, 0x1e, 0x60, 0x1e, - 0x70, 0x1e, 0xd0, 0x1e, 0xe0, 0x1e, 0xf0, 0x1e, 0x09, 0x1e, 0x11, 0x26, - 0x04, 0x03, 0x02, 0x01, 0x1e, 0x00, 0x1e, 0x1d, 0x07, 0x0f, 0x25, 0x2b, - 0x11, 0x35, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, 0x72, 0x72, 0x35, 0x35, - 0x2f, 0x5d, 0x71, 0x72, 0x5f, 0x5d, 0x35, 0x2f, 0x5d, 0x71, 0x5d, 0x71, - 0x72, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x07, 0x2b, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, - 0x00, 0xcd, 0xff, 0xbb, 0x10, 0x27, 0x02, 0xc8, 0x02, 0x12, 0x00, 0xa6, - 0x11, 0x07, 0x0a, 0x0c, 0x00, 0x81, 0x00, 0x00, 0x00, 0x96, 0x40, 0x7b, - 0x04, 0x6f, 0x2e, 0x7f, 0x2e, 0x8f, 0x2e, 0xbf, 0x2e, 0x04, 0x3f, 0x2e, - 0x8f, 0x2e, 0x9f, 0x2e, 0x03, 0x0f, 0x2e, 0x3f, 0x2e, 0x4f, 0x2e, 0x7f, - 0x2e, 0x9f, 0x2e, 0xbf, 0x2e, 0x06, 0xd0, 0x2e, 0x01, 0xf0, 0x2e, 0x01, - 0x2e, 0x03, 0x1f, 0x21, 0x2f, 0x21, 0x6f, 0x21, 0x7f, 0x21, 0x9f, 0x21, - 0xbf, 0x21, 0xcf, 0x21, 0xef, 0x21, 0x08, 0x3f, 0x21, 0x8f, 0x21, 0x9f, - 0x21, 0x03, 0x0f, 0x21, 0x2f, 0x21, 0x3f, 0x21, 0x7f, 0x21, 0x9f, 0x21, - 0x05, 0x21, 0x02, 0x01, 0x5f, 0x1a, 0x01, 0x00, 0x1a, 0x10, 0x1a, 0x20, - 0x1a, 0x30, 0x1a, 0x40, 0x1a, 0x05, 0x10, 0x1a, 0x20, 0x1a, 0x40, 0x1a, - 0x50, 0x1a, 0x60, 0x1a, 0x70, 0x1a, 0xd0, 0x1a, 0xe0, 0x1a, 0xf0, 0x1a, - 0x09, 0x1a, 0x11, 0x26, 0x04, 0x03, 0x02, 0x01, 0x1a, 0x00, 0x1a, 0x19, - 0x07, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, - 0x72, 0x72, 0x35, 0x35, 0x2f, 0x5d, 0x71, 0x72, 0x35, 0x2f, 0x5d, 0x71, - 0x5d, 0x71, 0x72, 0x35, 0xff, 0xff, 0x00, 0x85, 0xff, 0xec, 0x03, 0xfe, - 0x07, 0x2b, 0x12, 0x26, 0x03, 0x77, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, - 0x00, 0xc6, 0xff, 0xbb, 0x10, 0x27, 0x02, 0xc8, 0x02, 0x0b, 0x00, 0xa6, - 0x11, 0x07, 0x0a, 0x0d, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x96, 0x40, 0x7b, - 0x04, 0x6f, 0x2e, 0x7f, 0x2e, 0x8f, 0x2e, 0xbf, 0x2e, 0x04, 0x3f, 0x2e, - 0x8f, 0x2e, 0x9f, 0x2e, 0x03, 0x0f, 0x2e, 0x3f, 0x2e, 0x4f, 0x2e, 0x7f, - 0x2e, 0x9f, 0x2e, 0xbf, 0x2e, 0x06, 0xd0, 0x2e, 0x01, 0xf0, 0x2e, 0x01, - 0x2e, 0x03, 0x1f, 0x21, 0x2f, 0x21, 0x6f, 0x21, 0x7f, 0x21, 0x9f, 0x21, - 0xbf, 0x21, 0xcf, 0x21, 0xef, 0x21, 0x08, 0x3f, 0x21, 0x8f, 0x21, 0x9f, - 0x21, 0x03, 0x0f, 0x21, 0x2f, 0x21, 0x3f, 0x21, 0x7f, 0x21, 0x9f, 0x21, - 0x05, 0x21, 0x02, 0x01, 0x5f, 0x1a, 0x01, 0x00, 0x1a, 0x10, 0x1a, 0x20, - 0x1a, 0x30, 0x1a, 0x40, 0x1a, 0x05, 0x10, 0x1a, 0x20, 0x1a, 0x40, 0x1a, - 0x50, 0x1a, 0x60, 0x1a, 0x70, 0x1a, 0xd0, 0x1a, 0xe0, 0x1a, 0xf0, 0x1a, - 0x09, 0x1a, 0x11, 0x26, 0x04, 0x03, 0x02, 0x01, 0x1a, 0x00, 0x1a, 0x19, - 0x07, 0x0f, 0x25, 0x2b, 0x11, 0x35, 0x35, 0x35, 0x35, 0x00, 0x2b, 0x71, - 0x72, 0x72, 0x35, 0x35, 0x2f, 0x5d, 0x71, 0x72, 0x35, 0x2f, 0x5d, 0x71, - 0x5d, 0x71, 0x72, 0x35, 0xff, 0xff, 0x00, 0x68, 0x00, 0x00, 0x02, 0x10, - 0x07, 0x2b, 0x12, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x11, 0x06, 0x08, 0xfe, - 0x20, 0x3b, 0x00, 0x24, 0x40, 0x19, 0x02, 0x0d, 0x9f, 0x0d, 0xaf, 0x0d, - 0x02, 0x00, 0x0d, 0xc0, 0x0d, 0xf0, 0x0d, 0x03, 0x0d, 0x05, 0x26, 0x02, - 0x09, 0x59, 0x09, 0x0c, 0x05, 0x07, 0x25, 0x2b, 0x11, 0x35, 0x00, 0x2b, - 0x5d, 0x5d, 0x11, 0x35, 0x00, 0x01, 0x00, 0xa8, 0xfe, 0x57, 0x05, 0x5d, - 0x05, 0x95, 0x00, 0x22, 0x00, 0x39, 0x40, 0x1e, 0x09, 0x20, 0x18, 0x12, - 0x12, 0x14, 0x13, 0x13, 0x03, 0x20, 0x03, 0x24, 0x23, 0x1c, 0x0d, 0x5f, - 0x59, 0x1c, 0x04, 0x19, 0x13, 0x15, 0x03, 0x00, 0x06, 0x5f, 0x59, 0x00, - 0x13, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x00, 0x18, 0x3f, 0x12, 0x39, 0x3f, - 0x2b, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x33, 0x33, 0x11, 0x33, 0x11, - 0x33, 0x31, 0x30, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, - 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x11, 0x23, 0x11, - 0x03, 0x33, 0x16, 0x15, 0x33, 0x36, 0x24, 0x33, 0x32, 0x00, 0x19, 0x01, - 0x10, 0x02, 0x03, 0xb0, 0x5f, 0xa4, 0x3b, 0x7f, 0x5a, 0x6a, 0x80, 0x6a, - 0xc4, 0xb0, 0x77, 0xd0, 0x79, 0xbf, 0x04, 0xb8, 0x07, 0x04, 0x48, 0x01, - 0x0f, 0xa3, 0xf3, 0x01, 0x05, 0xd4, 0xfe, 0x57, 0x4a, 0x4a, 0x73, 0x6e, - 0xd6, 0xf9, 0x02, 0x73, 0xd7, 0xf1, 0x68, 0xb2, 0x65, 0xfc, 0x85, 0x04, - 0x44, 0x01, 0x3d, 0x9a, 0x61, 0x81, 0x8e, 0xfe, 0xcf, 0xfe, 0xe3, 0xfd, - 0x74, 0xfe, 0xc1, 0xfe, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, - 0xfe, 0x57, 0x05, 0x20, 0x05, 0x81, 0x00, 0x19, 0x00, 0x3b, 0x40, 0x1d, - 0x17, 0x15, 0x15, 0x00, 0x0e, 0x11, 0x11, 0x0c, 0x12, 0x00, 0x12, 0x05, - 0x00, 0x03, 0x1b, 0x1a, 0x15, 0x0e, 0x12, 0x18, 0x13, 0x03, 0x03, 0x08, - 0x5f, 0x59, 0x03, 0x12, 0x12, 0x00, 0x3f, 0xc4, 0x2b, 0x00, 0x18, 0x3f, - 0x33, 0x12, 0x39, 0x39, 0x11, 0x12, 0x01, 0x17, 0x39, 0x11, 0x12, 0x39, - 0x32, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, 0x14, 0x06, - 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x3d, 0x01, 0x01, - 0x1f, 0x01, 0x11, 0x23, 0x11, 0x33, 0x01, 0x26, 0x35, 0x11, 0x33, 0x05, - 0x20, 0x7d, 0x7a, 0x52, 0x41, 0x34, 0x28, 0x2d, 0x31, 0x15, 0xfc, 0xe3, - 0x05, 0x05, 0xaa, 0xde, 0x02, 0xfa, 0x0c, 0xac, 0x86, 0x96, 0x8d, 0x0e, - 0x98, 0x0b, 0x1c, 0x41, 0x53, 0x5b, 0x04, 0xb3, 0x61, 0xa7, 0xfc, 0x58, - 0x05, 0x81, 0xfb, 0x84, 0xc4, 0x58, 0x03, 0x60, 0x00, 0x01, 0x00, 0xa8, - 0xff, 0xec, 0x05, 0x5d, 0x05, 0x95, 0x00, 0x25, 0x00, 0x49, 0x40, 0x24, - 0x0c, 0x23, 0x1b, 0x15, 0x15, 0x16, 0x05, 0x04, 0x04, 0x17, 0x16, 0x23, - 0x16, 0x27, 0x26, 0x1b, 0x1f, 0x16, 0x16, 0x1f, 0x1f, 0x10, 0x5f, 0x59, - 0x1f, 0x04, 0x18, 0x03, 0x00, 0x09, 0x5f, 0x59, 0x04, 0x04, 0x00, 0x13, - 0x00, 0x3f, 0x32, 0x2f, 0x2b, 0x00, 0x18, 0x3f, 0x3f, 0x2b, 0x11, 0x00, - 0x33, 0x18, 0x2f, 0x12, 0x39, 0x11, 0x12, 0x01, 0x39, 0x39, 0x11, 0x33, - 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x31, 0x30, 0x05, - 0x22, 0x24, 0x26, 0x27, 0x33, 0x1e, 0x02, 0x33, 0x32, 0x12, 0x11, 0x35, - 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x11, 0x03, 0x33, - 0x16, 0x15, 0x33, 0x36, 0x24, 0x33, 0x32, 0x00, 0x11, 0x15, 0x10, 0x00, - 0x02, 0xf9, 0xb4, 0xfe, 0xfa, 0x89, 0x0a, 0xbf, 0x0a, 0x5d, 0xa1, 0x8a, - 0xd4, 0xce, 0xc4, 0xb0, 0x77, 0xd0, 0x79, 0xbf, 0x04, 0xb8, 0x07, 0x04, - 0x48, 0x01, 0x08, 0xaa, 0xf3, 0x01, 0x05, 0xfe, 0xcb, 0x14, 0x79, 0xe3, - 0xa1, 0x7f, 0x9d, 0x4a, 0x01, 0x03, 0x01, 0x13, 0x99, 0xd7, 0xf1, 0x68, - 0xb2, 0x65, 0xbf, 0x01, 0x88, 0x01, 0x3d, 0x9a, 0x4d, 0x77, 0x84, 0xfe, - 0xcf, 0xfe, 0xe3, 0xb2, 0xfe, 0xac, 0xfe, 0xab, 0x00, 0x02, 0xfe, 0xcc, - 0x00, 0x6a, 0x01, 0x32, 0x03, 0x6a, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x27, - 0x40, 0x17, 0x09, 0x0f, 0xe5, 0x59, 0x00, 0x09, 0x01, 0x29, 0x03, 0x09, - 0x03, 0x15, 0xe5, 0x59, 0x2f, 0x03, 0x3f, 0x03, 0x02, 0x10, 0x03, 0x01, - 0x03, 0x00, 0x2f, 0x5d, 0x71, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x2b, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x01, 0x32, 0x9e, 0x97, 0x96, 0x9b, 0x95, 0xa0, 0x9c, 0x95, - 0x92, 0x4c, 0x53, 0x56, 0x4d, 0x4e, 0x52, 0xa2, 0x01, 0xea, 0xbd, 0xc3, - 0xc1, 0xbf, 0xc2, 0xbe, 0xc1, 0xbf, 0x8b, 0x80, 0x81, 0x8a, 0x84, 0x87, - 0x00, 0x01, 0xff, 0x58, 0x00, 0x7d, 0x00, 0xa7, 0x03, 0x63, 0x00, 0x06, - 0x00, 0x2b, 0x40, 0x1b, 0x01, 0x00, 0x02, 0x80, 0x2f, 0x04, 0x9f, 0x04, - 0x02, 0xbf, 0x04, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, - 0x02, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x2f, 0x5d, 0x71, 0x72, - 0x2f, 0x5d, 0x71, 0x1a, 0xcd, 0x12, 0x39, 0x31, 0x30, 0x37, 0x11, 0x07, - 0x35, 0x37, 0x33, 0x11, 0x1f, 0xc7, 0xd0, 0x7f, 0x7d, 0x02, 0x59, 0x78, - 0x8c, 0x79, 0xfd, 0x1a, 0x00, 0x01, 0xfe, 0xdd, 0x00, 0x7d, 0x01, 0x24, - 0x03, 0x6a, 0x00, 0x1c, 0x00, 0x41, 0x40, 0x25, 0x07, 0x17, 0x11, 0x00, - 0x0d, 0x0d, 0x11, 0x11, 0x0a, 0xe5, 0x59, 0x00, 0x11, 0x01, 0x29, 0x03, - 0x11, 0x01, 0x1a, 0x00, 0x1a, 0xe5, 0x59, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x10, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x2f, 0x5d, - 0x71, 0x72, 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, - 0x11, 0x00, 0x33, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x25, - 0x35, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, - 0x01, 0x07, 0x21, 0x15, 0xfe, 0xdd, 0x24, 0x7a, 0x64, 0x5c, 0x45, 0x46, - 0x3d, 0x3a, 0x53, 0x08, 0x86, 0x0b, 0x9c, 0x79, 0x83, 0x91, 0x54, 0x51, - 0x7a, 0x55, 0x15, 0x01, 0x97, 0x7d, 0x43, 0x46, 0x7c, 0x46, 0x40, 0x53, - 0x2c, 0x36, 0x38, 0x36, 0x35, 0x1d, 0x58, 0x6b, 0x70, 0x64, 0x45, 0x76, - 0x36, 0x51, 0x45, 0x24, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xd0, - 0x00, 0x6a, 0x01, 0x30, 0x03, 0x6a, 0x00, 0x23, 0x00, 0x5f, 0x40, 0x3a, - 0x21, 0x10, 0x0f, 0x10, 0x0f, 0xe4, 0x59, 0x10, 0x40, 0x09, 0x0c, 0x48, - 0x10, 0x10, 0x1c, 0x03, 0x0f, 0x18, 0x1f, 0x18, 0x2f, 0x18, 0x03, 0x0f, - 0x03, 0x18, 0x18, 0x1c, 0x1c, 0x16, 0xe5, 0x59, 0x00, 0x1c, 0x01, 0x29, - 0x03, 0x1c, 0x03, 0x09, 0xe5, 0x59, 0x50, 0x07, 0x60, 0x07, 0x02, 0x07, - 0x07, 0x2f, 0x03, 0x3f, 0x03, 0x02, 0x10, 0x03, 0x01, 0x03, 0x00, 0x2f, - 0x5d, 0x71, 0x33, 0x2f, 0x5d, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, - 0x2b, 0x11, 0x00, 0x33, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x11, 0x12, 0x39, - 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, - 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2b, - 0x01, 0x37, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x27, 0x3e, - 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x15, 0x16, 0x01, 0x30, 0x9a, - 0x92, 0x83, 0xa3, 0x0e, 0x93, 0x12, 0x8e, 0x48, 0x52, 0xba, 0x3f, 0x0e, - 0x33, 0x57, 0x4d, 0x8c, 0x85, 0x0c, 0x8c, 0x0b, 0x9c, 0x79, 0x84, 0x93, - 0xae, 0xc7, 0x01, 0x4b, 0x67, 0x7a, 0x6d, 0x5e, 0x1a, 0x70, 0x40, 0x3b, - 0x6a, 0x6b, 0x2f, 0x31, 0x65, 0x62, 0x0f, 0x5b, 0x6e, 0x70, 0x5e, 0x87, - 0x21, 0x02, 0x13, 0x00, 0x00, 0x02, 0xfe, 0xc2, 0x00, 0x7d, 0x01, 0x41, - 0x03, 0x63, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x41, 0x40, 0x29, 0x00, 0x04, - 0x0f, 0x04, 0xe5, 0x59, 0x08, 0x05, 0x0b, 0x06, 0x0f, 0x40, 0x09, 0x0c, - 0x48, 0x0f, 0x0f, 0x02, 0x2f, 0x06, 0x9f, 0x06, 0x02, 0xbf, 0x06, 0x01, - 0x06, 0x00, 0x02, 0x01, 0x00, 0x02, 0x10, 0x02, 0x02, 0x00, 0x02, 0x10, - 0x02, 0x02, 0x02, 0x00, 0x2f, 0x5d, 0x71, 0x72, 0x2f, 0x5d, 0x71, 0x12, - 0x39, 0x2f, 0x2b, 0x12, 0x39, 0x33, 0x33, 0x2b, 0x11, 0x00, 0x33, 0x31, - 0x30, 0x13, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0x33, 0x11, 0x33, 0x15, - 0x03, 0x0f, 0x01, 0x06, 0x07, 0x33, 0xd0, 0x74, 0xfe, 0x66, 0x01, 0x8d, - 0x81, 0x71, 0xec, 0x24, 0xb3, 0x0d, 0x18, 0xfc, 0x01, 0x1c, 0x9f, 0x9f, - 0x54, 0x01, 0xf3, 0xfe, 0x2a, 0x71, 0x01, 0xaf, 0x35, 0xdf, 0x15, 0x15, - 0x00, 0x01, 0xfe, 0xcf, 0x00, 0x6a, 0x01, 0x31, 0x03, 0x5b, 0x00, 0x1d, - 0x00, 0x64, 0x40, 0x0a, 0x18, 0x1b, 0x13, 0x13, 0x1b, 0x1b, 0x0f, 0xe4, - 0x59, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x32, 0x09, 0x0c, 0x48, 0x1b, 0x1b, - 0x14, 0x03, 0x14, 0x17, 0xe5, 0x59, 0x3f, 0x14, 0x5f, 0x14, 0xaf, 0x14, - 0x03, 0x0f, 0x14, 0x7f, 0x14, 0xcf, 0x14, 0xef, 0x14, 0x04, 0x0d, 0x03, - 0x14, 0x03, 0x09, 0xe5, 0x59, 0x50, 0x06, 0x60, 0x06, 0x02, 0x06, 0x06, - 0x2f, 0x03, 0x3f, 0x03, 0x02, 0x10, 0x03, 0x01, 0x03, 0x00, 0x2f, 0x5d, - 0x71, 0x33, 0x2f, 0x5d, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, - 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x2b, 0x11, 0x00, 0x33, - 0x18, 0x2f, 0x12, 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x20, 0x27, - 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x07, 0x23, 0x13, 0x21, 0x15, 0x21, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, - 0x01, 0x31, 0xa5, 0x8b, 0xfe, 0xff, 0x31, 0x93, 0x14, 0x4f, 0x3e, 0x4c, - 0x57, 0x49, 0x50, 0x3f, 0x51, 0x20, 0x75, 0x1d, 0x01, 0xfd, 0xfe, 0x72, - 0x11, 0x23, 0x54, 0x3f, 0x82, 0x96, 0x01, 0x7a, 0x7d, 0x93, 0xc9, 0x18, - 0x3b, 0x35, 0x53, 0x47, 0x43, 0x52, 0x28, 0x1e, 0x01, 0x97, 0x75, 0xb1, - 0x1c, 0x23, 0x87, 0x00, 0x00, 0x02, 0xfe, 0xd7, 0x00, 0x69, 0x01, 0x29, - 0x03, 0x6a, 0x00, 0x16, 0x00, 0x22, 0x00, 0x47, 0xb5, 0x14, 0x1a, 0xe4, - 0x59, 0x11, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x09, 0x0c, 0x48, 0x14, - 0x14, 0x03, 0x09, 0x09, 0x0e, 0xe4, 0x59, 0x0c, 0x0c, 0x00, 0x09, 0x01, - 0x29, 0x03, 0x09, 0x03, 0x20, 0xe4, 0x59, 0x2f, 0x03, 0x3f, 0x03, 0x4f, - 0x03, 0x03, 0x10, 0x03, 0x01, 0x03, 0x00, 0x2f, 0x5d, 0x71, 0x2b, 0x00, - 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x33, 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x18, 0x2f, 0x2b, 0x39, 0x2b, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, - 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, - 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x29, 0x9c, 0x83, 0x96, 0x9d, - 0xa7, 0x94, 0xc4, 0x37, 0x87, 0x1c, 0x5e, 0x4e, 0x5b, 0x17, 0x60, 0x48, - 0x76, 0x91, 0x91, 0x46, 0x51, 0x43, 0x48, 0x49, 0x46, 0x45, 0x4e, 0x01, - 0x6f, 0x77, 0x8f, 0xbc, 0xb3, 0xc7, 0xcb, 0x99, 0x19, 0x4c, 0x7b, 0x7d, - 0x22, 0x31, 0x80, 0x7b, 0x4b, 0x43, 0x4a, 0x44, 0x45, 0x4e, 0x4e, 0x00, - 0x00, 0x01, 0xfe, 0xdd, 0x00, 0x7c, 0x01, 0x23, 0x03, 0x5c, 0x00, 0x0a, - 0x00, 0x2f, 0x40, 0x20, 0x00, 0x08, 0x09, 0x08, 0xe5, 0x59, 0x2f, 0x09, - 0x7f, 0x09, 0x9f, 0x09, 0xef, 0x09, 0x04, 0x4f, 0x09, 0xbf, 0x09, 0x02, - 0x09, 0x00, 0x04, 0x10, 0x04, 0x02, 0x00, 0x04, 0x10, 0x04, 0x02, 0x04, - 0x00, 0x2f, 0x5d, 0x71, 0x2f, 0x5d, 0x71, 0x2b, 0x11, 0x00, 0x33, 0x31, - 0x30, 0x01, 0x06, 0x02, 0x15, 0x23, 0x34, 0x12, 0x37, 0x21, 0x35, 0x21, - 0x01, 0x23, 0x9f, 0x7d, 0x94, 0x80, 0xa5, 0xfe, 0x45, 0x02, 0x46, 0x02, - 0xfc, 0xab, 0xfe, 0xd8, 0xad, 0x96, 0x01, 0x23, 0xb8, 0x6f, 0x00, 0x00, - 0x00, 0x03, 0xfe, 0xd7, 0x00, 0x6a, 0x01, 0x30, 0x03, 0x6a, 0x00, 0x19, - 0x00, 0x22, 0x00, 0x2d, 0x00, 0x45, 0x40, 0x28, 0x16, 0x09, 0x21, 0x26, - 0x21, 0x26, 0xe4, 0x59, 0x21, 0x40, 0x09, 0x0c, 0x48, 0x21, 0x21, 0x10, - 0x03, 0x10, 0x1c, 0xe4, 0x59, 0x00, 0x10, 0x01, 0x29, 0x03, 0x10, 0x03, - 0x2b, 0xe4, 0x59, 0x2f, 0x03, 0x3f, 0x03, 0x02, 0x10, 0x03, 0x01, 0x03, - 0x00, 0x2f, 0x5d, 0x71, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x2b, - 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x2b, 0x11, 0x12, 0x00, 0x39, - 0x39, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, - 0x37, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, - 0x06, 0x07, 0x15, 0x1e, 0x01, 0x03, 0x34, 0x23, 0x22, 0x15, 0x14, 0x16, - 0x33, 0x32, 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, - 0x36, 0x01, 0x30, 0x9d, 0x8f, 0x8f, 0x9e, 0x60, 0x50, 0x4b, 0x4f, 0x97, - 0x7e, 0x7f, 0x9a, 0x51, 0x4c, 0x51, 0x61, 0xa4, 0x8a, 0x89, 0x45, 0x45, - 0x89, 0x12, 0x51, 0x4b, 0x49, 0x50, 0x9d, 0x4e, 0x4a, 0x01, 0x42, 0x69, - 0x6f, 0x70, 0x67, 0x48, 0x66, 0x0c, 0x02, 0x0f, 0x5e, 0x3e, 0x56, 0x6c, - 0x6a, 0x59, 0x3d, 0x5e, 0x0e, 0x02, 0x0b, 0x62, 0x01, 0x14, 0x69, 0x69, - 0x36, 0x39, 0xe2, 0x3a, 0x3b, 0x40, 0x37, 0x81, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xd8, 0x00, 0x69, 0x01, 0x2a, 0x03, 0x6a, 0x00, 0x18, - 0x00, 0x24, 0x00, 0x46, 0x40, 0x2a, 0x1c, 0x16, 0xe4, 0x59, 0x13, 0x09, - 0x1c, 0x40, 0x09, 0x0f, 0x48, 0x1c, 0x1c, 0x03, 0x09, 0x09, 0x10, 0xe4, - 0x59, 0x0d, 0x0d, 0x1f, 0x09, 0x2f, 0x09, 0x3f, 0x09, 0x03, 0x00, 0x09, - 0x01, 0x0a, 0x03, 0x09, 0x03, 0x22, 0xe4, 0x59, 0x00, 0x03, 0x01, 0x03, - 0x00, 0x2f, 0x72, 0x2b, 0x00, 0x18, 0x2f, 0x5f, 0x5e, 0x5d, 0x71, 0x33, - 0x2f, 0x2b, 0x11, 0x12, 0x00, 0x39, 0x18, 0x2f, 0x2b, 0x12, 0x39, 0x2b, - 0x31, 0x30, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, - 0x22, 0x26, 0x27, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x0e, 0x01, - 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, - 0x23, 0x22, 0x06, 0xfe, 0xd8, 0x9c, 0x83, 0x94, 0x9f, 0x98, 0xa3, 0x65, - 0x88, 0x1c, 0x87, 0x0f, 0x4e, 0x2b, 0x4e, 0x5b, 0x17, 0x60, 0x48, 0x76, - 0x91, 0x91, 0x4c, 0x4b, 0x43, 0x48, 0x49, 0x46, 0x45, 0x4e, 0x02, 0x64, - 0x77, 0x8f, 0xbb, 0xb4, 0xc8, 0xca, 0x53, 0x4d, 0x19, 0x29, 0x27, 0x78, - 0x7d, 0x22, 0x31, 0x80, 0x7d, 0x52, 0x40, 0x4c, 0x46, 0x45, 0x4a, 0x4a, - 0x00, 0x02, 0xfe, 0xb7, 0x05, 0xb6, 0x02, 0x11, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x0f, 0x00, 0x1b, 0x40, 0x0c, 0x80, 0x00, 0x01, 0x00, 0x40, 0x03, - 0x03, 0x09, 0x0e, 0x80, 0x08, 0x0b, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, - 0x39, 0x2f, 0x1a, 0xcd, 0x5d, 0x31, 0x30, 0x01, 0x33, 0x15, 0x07, 0x23, - 0x35, 0x17, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, 0x01, - 0x38, 0xd9, 0xe2, 0x60, 0x74, 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, 0xcc, - 0x07, 0x2b, 0x0c, 0xb0, 0x0a, 0xaf, 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x0e, - 0x00, 0x02, 0xfd, 0xec, 0x05, 0xb6, 0x01, 0x43, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x0f, 0x00, 0x1b, 0x40, 0x0c, 0x80, 0x05, 0x01, 0x05, 0x40, 0x02, - 0x02, 0x09, 0x0e, 0x80, 0x08, 0x0b, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, - 0x39, 0x2f, 0x1a, 0xcd, 0x5d, 0x31, 0x30, 0x03, 0x15, 0x23, 0x27, 0x35, - 0x33, 0x01, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, 0xd2, - 0x60, 0xe2, 0xd9, 0x02, 0x7e, 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, 0xcc, - 0x06, 0x79, 0x0a, 0xb0, 0x0c, 0xfe, 0x9f, 0x14, 0xa9, 0xa9, 0x14, 0x01, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xb7, 0x05, 0xb6, 0x01, 0xbf, - 0x07, 0x2b, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x23, 0x40, 0x11, 0x02, 0x0c, - 0x80, 0x07, 0x01, 0x07, 0x40, 0xf0, 0x0e, 0x01, 0x0e, 0x0e, 0x14, 0x19, - 0x80, 0x13, 0x16, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, 0x2f, 0x5d, - 0x1a, 0xcc, 0x5d, 0x39, 0x39, 0x31, 0x30, 0x01, 0x34, 0x23, 0x22, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x23, 0x15, 0x23, 0x35, 0x32, - 0x07, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, 0x01, 0x54, - 0x3b, 0x33, 0x28, 0x14, 0x3a, 0x43, 0x98, 0x43, 0x36, 0x3d, 0x4b, 0x11, - 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, 0xcc, 0x06, 0xc4, 0x23, 0x10, 0x40, - 0x14, 0x60, 0x2c, 0x38, 0x17, 0x4e, 0xd4, 0x14, 0xa9, 0xa9, 0x14, 0x01, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xc2, 0x05, 0xb6, 0x01, 0x3f, - 0x07, 0x2b, 0x00, 0x17, 0x00, 0x20, 0x00, 0x2f, 0x40, 0x1c, 0x13, 0x04, - 0x0f, 0x0c, 0x1f, 0x0c, 0x02, 0x0c, 0x40, 0x09, 0x0f, 0x48, 0x0c, 0x10, - 0x07, 0x00, 0x00, 0x18, 0x8f, 0x1c, 0x9f, 0x1c, 0xaf, 0x1c, 0x03, 0x1c, - 0x20, 0x19, 0x00, 0x2f, 0x33, 0xcd, 0x5d, 0x32, 0x32, 0x2f, 0x33, 0x33, - 0xcd, 0x2b, 0x71, 0x32, 0x32, 0x31, 0x30, 0x13, 0x22, 0x27, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x02, 0x0f, 0x01, 0x23, 0x35, 0x37, 0x33, 0x17, - 0x15, 0x23, 0x7f, 0x33, 0x54, 0x55, 0x24, 0x2d, 0x2d, 0x08, 0x5b, 0x0b, - 0x2b, 0x4c, 0x3f, 0x37, 0x53, 0x53, 0x22, 0x30, 0x2b, 0x06, 0x5c, 0x0c, - 0x2a, 0x4b, 0xbd, 0x97, 0x9b, 0xd1, 0xc3, 0xd0, 0x9b, 0x06, 0x69, 0x26, - 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, 0x25, 0x26, 0x26, 0x25, 0x51, 0x4a, - 0x27, 0x70, 0x43, 0x0c, 0x8d, 0x8f, 0x0a, 0x00, 0x00, 0x02, 0xfe, 0xc7, - 0x05, 0xb6, 0x01, 0x39, 0x07, 0x2b, 0x00, 0x05, 0x00, 0x13, 0x00, 0x44, - 0x40, 0x28, 0x9f, 0x00, 0xaf, 0x00, 0x02, 0x00, 0x0d, 0x06, 0x50, 0x03, - 0x60, 0x03, 0x02, 0x03, 0x03, 0x10, 0x20, 0x0a, 0x40, 0x0a, 0x50, 0x0a, - 0x60, 0x0a, 0x80, 0x0a, 0xd0, 0x0a, 0x06, 0xd0, 0x0a, 0xe0, 0x0a, 0xf0, - 0x0a, 0x03, 0x40, 0x0a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0xb4, 0x15, 0x18, - 0x48, 0x0a, 0x06, 0x00, 0x2f, 0xcc, 0x2b, 0x5d, 0x71, 0x72, 0x32, 0x39, - 0x2f, 0x72, 0x12, 0x39, 0xcd, 0x5d, 0x31, 0x30, 0x13, 0x33, 0x15, 0x07, - 0x23, 0x35, 0x17, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, - 0x37, 0x33, 0x0e, 0x01, 0x23, 0xe2, 0xdd, 0x82, 0x59, 0x81, 0xa5, 0x12, - 0x6b, 0x11, 0x6a, 0x54, 0x54, 0x68, 0x11, 0x6b, 0x16, 0xa3, 0x07, 0x2b, - 0x0c, 0x92, 0x0a, 0xe1, 0x85, 0x74, 0x44, 0x37, 0x38, 0x43, 0x78, 0x81, - 0x00, 0x02, 0xfe, 0xc7, 0x05, 0xb6, 0x01, 0x39, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x13, 0x00, 0x44, 0x40, 0x28, 0x9f, 0x05, 0xaf, 0x05, 0x02, 0x05, - 0x0d, 0x06, 0x50, 0x02, 0x60, 0x02, 0x02, 0x02, 0x02, 0x10, 0x20, 0x09, - 0x40, 0x09, 0x50, 0x09, 0x60, 0x09, 0x80, 0x09, 0xd0, 0x09, 0x06, 0xd0, - 0x09, 0xe0, 0x09, 0xf0, 0x09, 0x03, 0x40, 0x09, 0x01, 0x09, 0xb8, 0xff, - 0xc0, 0xb4, 0x15, 0x18, 0x48, 0x09, 0x06, 0x00, 0x2f, 0xcd, 0x2b, 0x5d, - 0x71, 0x72, 0x32, 0x39, 0x2f, 0x72, 0x12, 0x39, 0xcd, 0x5d, 0x31, 0x30, - 0x13, 0x15, 0x23, 0x27, 0x35, 0x33, 0x13, 0x22, 0x26, 0x27, 0x33, 0x1e, - 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x5c, 0x82, 0xdd, 0xe2, - 0x20, 0x81, 0xa5, 0x12, 0x6b, 0x11, 0x6a, 0x54, 0x54, 0x68, 0x11, 0x6b, - 0x16, 0xa3, 0x06, 0x97, 0x0a, 0x92, 0x0c, 0xfe, 0x8b, 0x85, 0x74, 0x44, - 0x37, 0x38, 0x43, 0x78, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xc7, - 0x05, 0xb6, 0x01, 0x39, 0x07, 0x2b, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x58, - 0x40, 0x26, 0x10, 0x1c, 0x15, 0x1a, 0x00, 0x1b, 0x1b, 0x00, 0x15, 0x40, - 0x0e, 0x18, 0x48, 0x15, 0x07, 0x0a, 0x0a, 0x20, 0x04, 0x40, 0x04, 0x50, - 0x04, 0x60, 0x04, 0x80, 0x04, 0xd0, 0x04, 0x06, 0xd0, 0x04, 0xe0, 0x04, - 0xf0, 0x04, 0x03, 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x20, 0x48, 0x04, - 0xb8, 0xff, 0xc0, 0xb3, 0x15, 0x18, 0x48, 0x04, 0xb8, 0xff, 0xc0, 0xb4, - 0x0d, 0x11, 0x48, 0x04, 0x00, 0x00, 0x2f, 0xdc, 0x2b, 0x2b, 0x2b, 0x71, - 0x72, 0x32, 0x12, 0x39, 0xcc, 0x2b, 0x11, 0x39, 0x2f, 0x12, 0x39, 0x12, - 0x39, 0x39, 0x31, 0x30, 0x03, 0x22, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x33, - 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x03, 0x34, 0x23, 0x22, 0x07, 0x27, - 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x32, 0x01, 0x81, - 0xa5, 0x12, 0x6b, 0x11, 0x6a, 0x54, 0x54, 0x68, 0x11, 0x6b, 0x16, 0xa3, - 0x63, 0x3b, 0x33, 0x28, 0x14, 0x3a, 0x43, 0x98, 0x4a, 0x49, 0x23, 0x4b, - 0x05, 0xb6, 0x85, 0x74, 0x44, 0x37, 0x38, 0x43, 0x78, 0x81, 0x01, 0x0e, - 0x23, 0x10, 0x40, 0x14, 0x60, 0x30, 0x34, 0x37, 0x00, 0x02, 0xfe, 0xc2, - 0x05, 0xb6, 0x01, 0x3f, 0x07, 0x2b, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x4b, - 0x40, 0x1f, 0x1d, 0x14, 0x0c, 0x0c, 0x08, 0x04, 0x04, 0x20, 0x11, 0x80, - 0x18, 0x01, 0x50, 0x18, 0x60, 0x18, 0x70, 0x18, 0xd0, 0x18, 0xe0, 0x18, - 0xf0, 0x18, 0x06, 0xe0, 0x18, 0xf0, 0x18, 0x02, 0x18, 0xb8, 0xff, 0xc0, - 0x40, 0x10, 0x2a, 0x2f, 0x48, 0x6f, 0x18, 0x9f, 0x18, 0xaf, 0x18, 0x03, - 0x40, 0x18, 0x01, 0x18, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x2f, 0x5d, 0x5d, - 0x2b, 0x5d, 0x71, 0x72, 0x33, 0x33, 0x39, 0x2f, 0x33, 0x33, 0x2f, 0x33, - 0x33, 0x31, 0x30, 0x13, 0x22, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, - 0x33, 0x0e, 0x01, 0x37, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x23, 0x3e, - 0x02, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x02, - 0x01, 0x66, 0x85, 0x0e, 0x55, 0x1d, 0x89, 0x87, 0x1d, 0x55, 0x15, 0x81, - 0x19, 0x23, 0x44, 0x41, 0x3d, 0x1b, 0x51, 0x11, 0x5b, 0x0c, 0x2a, 0x4b, - 0x40, 0x24, 0x46, 0x40, 0x3b, 0x1a, 0x30, 0x2b, 0x06, 0x5c, 0x0b, 0x2a, - 0x4c, 0x05, 0xb6, 0x6a, 0x5d, 0x53, 0x53, 0x64, 0x63, 0xdb, 0x13, 0x16, - 0x13, 0x3c, 0x41, 0x39, 0x20, 0x13, 0x16, 0x13, 0x1f, 0x1d, 0x40, 0x3b, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xb7, 0x04, 0xb1, 0x02, 0x11, - 0x06, 0x26, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x14, 0xb7, 0x00, 0x03, 0x03, - 0x09, 0x0e, 0x80, 0x0b, 0x08, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, - 0x2f, 0xcd, 0x31, 0x30, 0x01, 0x33, 0x15, 0x07, 0x23, 0x35, 0x17, 0x15, - 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x13, 0x33, 0x01, 0x38, 0xd9, 0xe2, - 0x60, 0x74, 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, 0xcc, 0x06, 0x26, 0x0c, - 0xb0, 0x0a, 0xaf, 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xfd, 0xec, 0x04, 0xb1, 0x01, 0x46, 0x06, 0x26, 0x00, 0x05, - 0x00, 0x0f, 0x00, 0x14, 0xb7, 0x05, 0x02, 0x02, 0x0b, 0x07, 0x80, 0x0d, - 0x0a, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x39, 0x2f, 0xcd, 0x31, 0x30, - 0x03, 0x15, 0x23, 0x27, 0x35, 0x33, 0x17, 0x33, 0x13, 0x15, 0x23, 0x27, - 0x23, 0x07, 0x23, 0x35, 0xd2, 0x60, 0xe2, 0xd9, 0xd5, 0xcc, 0xe0, 0x68, - 0xde, 0x02, 0xdb, 0x69, 0x05, 0x74, 0x0a, 0xb0, 0x0c, 0x53, 0xfe, 0xf2, - 0x14, 0xa9, 0xa9, 0x14, 0x00, 0x02, 0xfe, 0xb7, 0x04, 0xb1, 0x01, 0xe0, - 0x06, 0x75, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x1b, 0x40, 0x0b, 0x0f, 0x14, - 0x02, 0x07, 0x0e, 0x0e, 0x15, 0x1a, 0x80, 0x17, 0x14, 0x00, 0x2f, 0x33, - 0x1a, 0xcd, 0x32, 0x39, 0x2f, 0xcc, 0x32, 0x11, 0x39, 0x31, 0x30, 0x01, - 0x34, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x07, - 0x15, 0x23, 0x35, 0x3e, 0x01, 0x03, 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, - 0x35, 0x13, 0x33, 0x01, 0x59, 0x4c, 0x3d, 0x35, 0x1a, 0x46, 0x59, 0xc0, - 0x42, 0x49, 0x5b, 0x2a, 0x35, 0x16, 0x69, 0xdb, 0x02, 0xde, 0x68, 0xe0, - 0xcc, 0x05, 0xf4, 0x2c, 0x13, 0x50, 0x18, 0x70, 0x30, 0x45, 0x09, 0x26, - 0x5e, 0x02, 0x12, 0xfe, 0xf2, 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x0e, 0x00, - 0x00, 0x02, 0xfe, 0xb5, 0x04, 0xb1, 0x01, 0x46, 0x06, 0xef, 0x00, 0x09, - 0x00, 0x21, 0x00, 0x35, 0x40, 0x11, 0x1d, 0x0e, 0x16, 0x40, 0x17, 0x1a, - 0x48, 0x16, 0x40, 0x09, 0x0f, 0x48, 0x16, 0x40, 0x1a, 0x11, 0x0a, 0xb8, - 0xff, 0xc0, 0x40, 0x0a, 0x0c, 0x0f, 0x48, 0x0a, 0x0a, 0x05, 0x00, 0x80, - 0x04, 0x07, 0x00, 0x2f, 0x33, 0x1a, 0xcd, 0x32, 0x32, 0x2f, 0x2b, 0x33, - 0x33, 0x1a, 0xcd, 0x2b, 0x2b, 0x32, 0x32, 0x31, 0x30, 0x03, 0x33, 0x13, - 0x15, 0x23, 0x27, 0x23, 0x07, 0x23, 0x35, 0x01, 0x22, 0x27, 0x26, 0x23, - 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, - 0x36, 0x37, 0x33, 0x0e, 0x02, 0x66, 0xcc, 0xe0, 0x68, 0xde, 0x02, 0xdb, - 0x69, 0x01, 0xb8, 0x33, 0x54, 0x55, 0x24, 0x2d, 0x2d, 0x08, 0x5b, 0x0b, - 0x2b, 0x4c, 0x3f, 0x37, 0x53, 0x53, 0x22, 0x30, 0x2b, 0x06, 0x5c, 0x0c, - 0x2a, 0x4b, 0x05, 0xd3, 0xfe, 0xf2, 0x14, 0xa9, 0xa9, 0x14, 0x01, 0x68, - 0x26, 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, 0x25, 0x26, 0x26, 0x25, 0x51, - 0x4a, 0x27, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xb3, 0x04, 0xb1, 0x01, 0x4d, - 0x06, 0xf0, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x14, 0xb7, 0x0e, 0x11, 0x11, - 0x08, 0x03, 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcc, 0x32, 0x32, - 0x2f, 0xcd, 0x31, 0x30, 0x03, 0x22, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, - 0x37, 0x33, 0x0e, 0x01, 0x03, 0x35, 0x37, 0x33, 0x15, 0x05, 0x01, 0x84, - 0xb6, 0x12, 0x75, 0x1c, 0xbd, 0xba, 0x1d, 0x75, 0x15, 0xb3, 0xf1, 0xd9, - 0xcf, 0xfe, 0xca, 0x04, 0xb1, 0xaa, 0x8b, 0x99, 0x99, 0x8e, 0xa7, 0x01, - 0x49, 0x14, 0xe2, 0x1d, 0xd9, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xb3, - 0x04, 0xb1, 0x01, 0x4d, 0x06, 0xf0, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x14, - 0xb7, 0x0f, 0x0c, 0x0c, 0x08, 0x03, 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, - 0x1a, 0xcc, 0x32, 0x32, 0x2f, 0xcd, 0x31, 0x30, 0x13, 0x22, 0x26, 0x27, - 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x03, 0x25, 0x35, 0x33, - 0x17, 0x15, 0x01, 0x87, 0xb2, 0x15, 0x75, 0x1d, 0xba, 0xbd, 0x1c, 0x75, - 0x12, 0xb6, 0x8b, 0xfe, 0xca, 0xcf, 0xd9, 0x04, 0xb1, 0xa8, 0x8d, 0x99, - 0x99, 0x8c, 0xa9, 0x01, 0x49, 0xd9, 0x1d, 0xe2, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xfe, 0xb3, 0x04, 0xb1, 0x01, 0x4d, 0x07, 0x2b, 0x00, 0x0b, - 0x00, 0x1d, 0x00, 0x1b, 0x40, 0x0b, 0x1b, 0x18, 0x0e, 0x13, 0x1a, 0x1a, - 0x09, 0x03, 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcc, 0x32, 0x32, - 0x2f, 0xcc, 0x32, 0x39, 0x39, 0x31, 0x30, 0x03, 0x22, 0x26, 0x27, 0x33, - 0x16, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x03, 0x34, 0x23, 0x22, 0x07, - 0x27, 0x36, 0x33, 0x32, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x3e, - 0x01, 0x01, 0x84, 0xb6, 0x12, 0x75, 0x1c, 0xbd, 0xba, 0x1d, 0x75, 0x15, - 0xb3, 0x52, 0x5d, 0x48, 0x46, 0x1f, 0x5a, 0x6a, 0xed, 0x51, 0x5b, 0x70, - 0x45, 0x30, 0x04, 0xb1, 0xaa, 0x8b, 0x99, 0x99, 0x8e, 0xa7, 0x01, 0xda, - 0x37, 0x18, 0x63, 0x1e, 0x8b, 0x3b, 0x55, 0x0b, 0x28, 0x6e, 0x03, 0x1e, - 0x00, 0x02, 0xfe, 0xb3, 0x04, 0xb1, 0x01, 0x4d, 0x06, 0xef, 0x00, 0x0b, - 0x00, 0x23, 0x00, 0x29, 0x40, 0x15, 0x1f, 0x10, 0x18, 0x40, 0x09, 0x0f, - 0x48, 0x18, 0x40, 0x1c, 0x13, 0x0c, 0x0c, 0x09, 0x80, 0x03, 0x01, 0x03, - 0x80, 0x06, 0x00, 0x00, 0x2f, 0x32, 0x1a, 0xcc, 0x5d, 0x32, 0x32, 0x2f, - 0x33, 0x33, 0x1a, 0xcd, 0x2b, 0x32, 0x32, 0x31, 0x30, 0x03, 0x22, 0x26, - 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x0e, 0x01, 0x03, 0x22, 0x27, - 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x16, - 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x02, 0x01, 0x84, 0xb6, 0x12, 0x75, - 0x1c, 0xbd, 0xba, 0x1d, 0x75, 0x15, 0xb3, 0x09, 0x33, 0x54, 0x55, 0x24, - 0x2d, 0x2d, 0x08, 0x5b, 0x0b, 0x2b, 0x4c, 0x3f, 0x37, 0x53, 0x53, 0x22, - 0x30, 0x2b, 0x06, 0x5c, 0x0c, 0x2a, 0x4b, 0x04, 0xb1, 0xaa, 0x8b, 0x99, - 0x99, 0x8e, 0xa7, 0x01, 0x7c, 0x26, 0x25, 0x23, 0x28, 0x52, 0x48, 0x28, - 0x25, 0x26, 0x26, 0x25, 0x51, 0x4a, 0x27, 0x00, 0x00, 0x01, 0x00, 0xcb, - 0x06, 0x36, 0x01, 0xdf, 0x07, 0x2b, 0x00, 0x05, 0x00, 0x13, 0xb6, 0x04, - 0x01, 0x07, 0x06, 0x03, 0x80, 0x00, 0x00, 0x2f, 0x1a, 0xcd, 0x11, 0x12, - 0x01, 0x39, 0x39, 0x31, 0x30, 0x01, 0x27, 0x35, 0x33, 0x17, 0x15, 0x01, - 0x94, 0xc9, 0xcf, 0x45, 0x06, 0x36, 0xd0, 0x25, 0xd4, 0x21, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xcb, 0x06, 0x36, 0x01, 0xdf, 0x07, 0x2b, 0x00, 0x05, - 0x00, 0x13, 0xb6, 0x00, 0x03, 0x06, 0x07, 0x03, 0x80, 0x00, 0x00, 0x2f, - 0x1a, 0xcd, 0x11, 0x12, 0x01, 0x39, 0x39, 0x31, 0x30, 0x13, 0x35, 0x37, - 0x33, 0x15, 0x07, 0xcb, 0x45, 0xcf, 0xc9, 0x06, 0x36, 0x21, 0xd4, 0x25, - 0xd0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x6b, 0xff, 0xd3, 0x03, 0xdb, - 0x06, 0x81, 0x12, 0x26, 0x05, 0x0c, 0x00, 0x00, 0x10, 0x26, 0x04, 0xf1, - 0xbb, 0x00, 0x10, 0x07, 0x04, 0xf4, 0x01, 0xaa, 0x00, 0x14, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x6b, 0xff, 0xd3, 0x03, 0xdb, 0x06, 0x81, 0x12, 0x26, - 0x05, 0x0c, 0x00, 0x00, 0x10, 0x06, 0x04, 0xf1, 0xbb, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x27, 0xfe, 0x7f, 0x03, 0xa2, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x0a, 0x00, 0x00, 0x10, 0x07, 0x04, 0xf0, 0x01, 0x81, 0x03, 0x4a, - 0xff, 0xff, 0x00, 0x27, 0xfe, 0x7f, 0x03, 0xa2, 0x04, 0xcb, 0x12, 0x26, - 0x05, 0x0a, 0x00, 0x00, 0x10, 0x07, 0x04, 0xe8, 0x01, 0x98, 0x03, 0x2b, - 0xff, 0xff, 0x00, 0x50, 0xfe, 0x7f, 0x04, 0xec, 0x06, 0x81, 0x12, 0x26, - 0x08, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x04, 0xe9, 0x02, 0x98, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x50, 0xfe, 0x7f, 0x04, 0xec, 0x06, 0x81, 0x12, 0x26, - 0x08, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x04, 0xee, 0x02, 0x85, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x50, 0xfe, 0xa4, 0x04, 0xec, 0x06, 0x81, 0x12, 0x26, - 0x08, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x04, 0xed, 0x02, 0x8b, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x46, 0xff, 0xd3, 0x03, 0xdb, 0x06, 0x81, 0x12, 0x06, - 0x05, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x04, 0xec, - 0x04, 0xcb, 0x12, 0x26, 0x05, 0x00, 0x00, 0x00, 0x11, 0x07, 0x04, 0xf4, - 0x02, 0x39, 0xfd, 0xb7, 0x00, 0x0e, 0xb7, 0x01, 0x60, 0x23, 0x01, 0x30, - 0x23, 0x01, 0x23, 0x00, 0x11, 0x5d, 0x5d, 0x35, 0x00, 0x06, 0xfe, 0x26, - 0xfe, 0x7f, 0x01, 0x69, 0xff, 0xee, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, - 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x33, 0x40, 0x18, 0x2d, 0x33, - 0x27, 0x39, 0x39, 0x3f, 0x1b, 0x09, 0x15, 0x03, 0x0f, 0x21, 0x21, 0x3f, - 0x3e, 0x27, 0x27, 0x3e, 0x0f, 0x0f, 0x3e, 0x03, 0x03, 0x3e, 0x00, 0x2f, - 0x33, 0x2f, 0x11, 0x33, 0x2f, 0x11, 0x33, 0x2f, 0x10, 0xcd, 0x32, 0x2f, - 0x12, 0x17, 0x39, 0x11, 0x33, 0x2f, 0x12, 0x39, 0x39, 0x30, 0x31, 0x05, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x15, - 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, - 0x11, 0x33, 0x11, 0xfe, 0x26, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, - 0x2e, 0xe5, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x72, 0x2d, - 0x20, 0x23, 0x2d, 0x2d, 0x23, 0x20, 0x2d, 0x02, 0x32, 0x2e, 0x20, 0x22, - 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x20, 0x30, 0x2f, 0x21, 0x22, - 0x2c, 0xc8, 0x6e, 0x60, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0x22, - 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e, 0xaf, 0x22, 0x2e, 0x2e, 0x22, - 0x20, 0x30, 0x30, 0xef, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0xaf, - 0x22, 0x2e, 0x30, 0x20, 0x20, 0x30, 0x2e, 0x2e, 0x01, 0x6f, 0xfe, 0x91, - 0x00, 0x04, 0xfe, 0x12, 0xfe, 0x7f, 0x01, 0x1a, 0xff, 0xee, 0x00, 0x03, - 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x21, 0x40, 0x0e, 0x0d, 0x13, - 0x07, 0x19, 0x19, 0x1f, 0x1e, 0x07, 0x07, 0x1e, 0x03, 0x02, 0x02, 0x1e, - 0x00, 0x2f, 0x33, 0x2f, 0x33, 0x11, 0x33, 0x2f, 0x10, 0xcd, 0x32, 0x2f, - 0x12, 0x39, 0x39, 0x30, 0x31, 0x05, 0x35, 0x21, 0x15, 0x25, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x15, 0x34, 0x36, - 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x07, 0x11, 0x33, - 0x11, 0xfe, 0x12, 0x01, 0x47, 0x01, 0x22, 0x2d, 0x23, 0x20, 0x2f, 0x2f, - 0x20, 0x23, 0x2d, 0x2d, 0x20, 0x23, 0x2d, 0x2d, 0x23, 0x20, 0x2d, 0xc8, - 0x6e, 0xa2, 0x6d, 0x6d, 0x40, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, - 0xaf, 0x20, 0x30, 0x30, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x01, 0x6f, 0xfe, - 0x91, 0x00, 0x00, 0x00, 0x00, 0x04, 0xfe, 0x5c, 0xfe, 0x7f, 0x01, 0x64, - 0xff, 0xee, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x34, - 0x40, 0x0f, 0x11, 0x17, 0x0b, 0x1d, 0x1d, 0x23, 0x22, 0x40, 0x0b, 0x0b, - 0x22, 0x01, 0x05, 0x05, 0x07, 0xb8, 0xff, 0xc0, 0xb7, 0x12, 0x16, 0x48, - 0x07, 0x80, 0x04, 0x04, 0x22, 0x00, 0x2f, 0x33, 0x2f, 0x1a, 0xcc, 0x2b, - 0x39, 0x11, 0x33, 0x11, 0x33, 0x2f, 0x1a, 0x10, 0xcd, 0x32, 0x2f, 0x12, - 0x39, 0x39, 0x30, 0x31, 0x01, 0x35, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, - 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, - 0x15, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, - 0x07, 0x11, 0x33, 0x11, 0xfe, 0xca, 0x6e, 0x01, 0x47, 0x6a, 0x01, 0x8c, - 0x2d, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x23, 0x2d, 0x2d, 0x20, 0x23, 0x2f, - 0x2f, 0x23, 0x20, 0x2d, 0xc8, 0x6e, 0xfe, 0xec, 0x72, 0x6d, 0x6d, 0x72, - 0xb2, 0x22, 0x2e, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0xaf, 0x20, 0x30, 0x30, - 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x01, 0x6f, 0xfe, 0x91, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x56, 0xff, 0xec, 0x04, 0x1d, 0x06, 0x1b, 0x00, 0x13, - 0x00, 0x30, 0x00, 0x00, 0x01, 0x34, 0x2e, 0x02, 0x27, 0x0e, 0x03, 0x15, - 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x09, 0x01, 0x16, 0x17, 0x1e, - 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, - 0x02, 0x37, 0x01, 0x35, 0x24, 0x05, 0x15, 0x26, 0x03, 0x60, 0x31, 0x45, - 0x4c, 0x1a, 0x49, 0x86, 0x66, 0x3c, 0x23, 0x49, 0x6f, 0x4d, 0x51, 0x70, - 0x45, 0x1f, 0xfe, 0x72, 0x01, 0x2f, 0x5a, 0x0f, 0x33, 0x4f, 0x31, 0x40, - 0x7b, 0xb4, 0x73, 0x72, 0xb4, 0x7d, 0x42, 0x49, 0x7f, 0xa9, 0x60, 0xfe, - 0xe2, 0x01, 0x96, 0x01, 0x2e, 0xe8, 0x01, 0xd7, 0x55, 0x91, 0x73, 0x56, - 0x1b, 0x1a, 0x51, 0x72, 0x92, 0x5b, 0x4c, 0x83, 0x60, 0x37, 0x36, 0x5f, - 0x83, 0x03, 0xc6, 0xfe, 0xbd, 0x60, 0x11, 0x3a, 0x86, 0x9f, 0x61, 0x6e, - 0xb6, 0x83, 0x48, 0x44, 0x7f, 0xb7, 0x73, 0x70, 0xb0, 0x87, 0x61, 0x21, - 0x01, 0x3a, 0x77, 0xbc, 0x54, 0x84, 0x53, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x15, 0x56, 0x00, 0x01, 0x03, 0x8c, 0x0c, 0x00, 0x00, 0x09, - 0x09, 0x48, 0x00, 0x03, 0x00, 0x24, 0xff, 0x8f, 0x00, 0x03, 0x00, 0x37, - 0xff, 0xdb, 0x00, 0x03, 0x00, 0x3c, 0xff, 0xdb, 0x00, 0x03, 0x03, 0x3b, - 0xff, 0x8f, 0x00, 0x03, 0x03, 0x44, 0xff, 0x8f, 0x00, 0x03, 0x03, 0x47, - 0xff, 0x8f, 0x00, 0x03, 0x03, 0x4e, 0xff, 0x8f, 0x00, 0x03, 0x03, 0x56, - 0xff, 0xdb, 0x00, 0x03, 0x03, 0x57, 0xff, 0xdb, 0x00, 0x03, 0x03, 0x5d, - 0xff, 0xdb, 0x00, 0x14, 0x00, 0x14, 0xff, 0x68, 0x00, 0x24, 0x00, 0x03, - 0xff, 0x8f, 0x00, 0x24, 0x00, 0x37, 0xff, 0x68, 0x00, 0x24, 0x00, 0x39, - 0xff, 0x68, 0x00, 0x24, 0x00, 0x3a, 0xff, 0xb4, 0x00, 0x24, 0x00, 0x3c, - 0xff, 0x68, 0x00, 0x24, 0x00, 0x59, 0xff, 0xdb, 0x00, 0x24, 0x00, 0x5a, - 0xff, 0xdb, 0x00, 0x24, 0x00, 0x5c, 0xff, 0xdb, 0x00, 0x24, 0x07, 0xe4, - 0xff, 0x68, 0x00, 0x29, 0x00, 0x0f, 0xff, 0x1d, 0x00, 0x29, 0x00, 0x11, - 0xff, 0x1d, 0x00, 0x29, 0x00, 0x24, 0xff, 0x8f, 0x00, 0x2f, 0x00, 0x03, - 0xff, 0xb4, 0x00, 0x2f, 0x00, 0x37, 0xff, 0x68, 0x00, 0x2f, 0x00, 0x39, - 0xff, 0x68, 0x00, 0x2f, 0x00, 0x3a, 0xff, 0x68, 0x00, 0x2f, 0x00, 0x3c, - 0xff, 0x68, 0x00, 0x2f, 0x00, 0x5c, 0xff, 0xb4, 0x00, 0x2f, 0x07, 0xe4, - 0xff, 0x8f, 0x00, 0x33, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x33, 0x00, 0x0f, - 0xfe, 0xf8, 0x00, 0x33, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x33, 0x00, 0x24, - 0xff, 0x68, 0x00, 0x35, 0x00, 0x37, 0xff, 0xdb, 0x00, 0x35, 0x00, 0x39, - 0xff, 0xdb, 0x00, 0x35, 0x00, 0x3a, 0xff, 0xdb, 0x00, 0x35, 0x00, 0x3c, - 0xff, 0xdb, 0x00, 0x37, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x37, 0x00, 0x0f, - 0xff, 0x1d, 0x00, 0x37, 0x00, 0x10, 0xff, 0x8f, 0x00, 0x37, 0x00, 0x11, - 0xff, 0x1d, 0x00, 0x37, 0x00, 0x1d, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x1e, - 0xff, 0x1d, 0x00, 0x37, 0x00, 0x24, 0xff, 0x68, 0x00, 0x37, 0x00, 0x32, - 0xff, 0xdb, 0x00, 0x37, 0x00, 0x44, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x46, - 0xff, 0x1d, 0x00, 0x37, 0x00, 0x48, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x4c, - 0xff, 0xb4, 0x00, 0x37, 0x00, 0x52, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x55, - 0xff, 0xb4, 0x00, 0x37, 0x00, 0x56, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x58, - 0xff, 0xb4, 0x00, 0x37, 0x00, 0x5a, 0xff, 0x8f, 0x00, 0x37, 0x00, 0x5c, - 0xff, 0x8f, 0x00, 0x39, 0x00, 0x0f, 0xff, 0x44, 0x00, 0x39, 0x00, 0x10, - 0xff, 0x8f, 0x00, 0x39, 0x00, 0x11, 0xff, 0x44, 0x00, 0x39, 0x00, 0x1d, - 0xff, 0xb4, 0x00, 0x39, 0x00, 0x1e, 0xff, 0xb4, 0x00, 0x39, 0x00, 0x24, - 0xff, 0x68, 0x00, 0x39, 0x00, 0x44, 0xff, 0x68, 0x00, 0x39, 0x00, 0x48, - 0xff, 0x8f, 0x00, 0x39, 0x00, 0x4c, 0xff, 0xdb, 0x00, 0x39, 0x00, 0x52, - 0xff, 0x8f, 0x00, 0x39, 0x00, 0x55, 0xff, 0xb4, 0x00, 0x39, 0x00, 0x58, - 0xff, 0xb4, 0x00, 0x39, 0x00, 0x5c, 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x0f, - 0xff, 0x8f, 0x00, 0x3a, 0x00, 0x10, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x11, - 0xff, 0x8f, 0x00, 0x3a, 0x00, 0x1d, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x1e, - 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x24, 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x44, - 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x48, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x52, - 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x55, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x58, - 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x5c, 0xff, 0xee, 0x00, 0x3c, 0x00, 0x03, - 0xff, 0xdb, 0x00, 0x3c, 0x00, 0x0f, 0xfe, 0xf8, 0x00, 0x3c, 0x00, 0x10, - 0xff, 0x44, 0x00, 0x3c, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x3c, 0x00, 0x1d, - 0xff, 0x8f, 0x00, 0x3c, 0x00, 0x1e, 0xff, 0x7b, 0x00, 0x3c, 0x00, 0x24, - 0xff, 0x68, 0x00, 0x3c, 0x00, 0x44, 0xff, 0x68, 0x00, 0x3c, 0x00, 0x48, - 0xff, 0x44, 0x00, 0x3c, 0x00, 0x4c, 0xff, 0xb4, 0x00, 0x3c, 0x00, 0x52, - 0xff, 0x44, 0x00, 0x3c, 0x00, 0x53, 0xff, 0x68, 0x00, 0x3c, 0x00, 0x54, - 0xff, 0x44, 0x00, 0x3c, 0x00, 0x58, 0xff, 0x8f, 0x00, 0x3c, 0x00, 0x59, - 0xff, 0x8f, 0x00, 0x49, 0x00, 0x49, 0xff, 0xdb, 0x00, 0x49, 0x07, 0xe4, - 0x00, 0x25, 0x00, 0x55, 0x00, 0x0f, 0xff, 0x8f, 0x00, 0x55, 0x00, 0x11, - 0xff, 0x8f, 0x00, 0x55, 0x07, 0xe4, 0x00, 0x4c, 0x00, 0x59, 0x00, 0x0f, - 0xff, 0x68, 0x00, 0x59, 0x00, 0x11, 0xff, 0x68, 0x00, 0x5a, 0x00, 0x0f, - 0xff, 0x8f, 0x00, 0x5a, 0x00, 0x11, 0xff, 0x8f, 0x00, 0x5c, 0x00, 0x0f, - 0xff, 0x68, 0x00, 0x5c, 0x00, 0x11, 0xff, 0x68, 0x03, 0x3b, 0x03, 0x4b, - 0xff, 0xd5, 0x03, 0x3b, 0x03, 0x52, 0xff, 0xd5, 0x03, 0x3b, 0x03, 0x56, - 0xff, 0x68, 0x03, 0x3b, 0x03, 0x57, 0xff, 0x68, 0x03, 0x3b, 0x03, 0x58, - 0xff, 0xc5, 0x03, 0x3b, 0x03, 0x5d, 0xff, 0x68, 0x03, 0x3b, 0x03, 0x65, - 0xff, 0xdb, 0x03, 0x3b, 0x03, 0x6f, 0xff, 0xdb, 0x03, 0x3b, 0x03, 0x79, - 0xff, 0xdb, 0x03, 0x40, 0x03, 0x57, 0xff, 0xbe, 0x03, 0x41, 0x03, 0x43, - 0x00, 0xaa, 0x03, 0x41, 0x03, 0x44, 0xff, 0x68, 0x03, 0x41, 0x03, 0x47, - 0xff, 0x68, 0x03, 0x41, 0x03, 0x4b, 0xff, 0x8d, 0x03, 0x41, 0x03, 0x4e, - 0xff, 0x68, 0x03, 0x41, 0x03, 0x52, 0xff, 0x8d, 0x03, 0x41, 0x03, 0x58, - 0xff, 0x8d, 0x03, 0x41, 0x03, 0x5b, 0xff, 0x9e, 0x03, 0x41, 0x03, 0x60, - 0xff, 0x68, 0x03, 0x41, 0x03, 0x61, 0xff, 0xb4, 0x03, 0x41, 0x03, 0x63, - 0xff, 0x46, 0x03, 0x41, 0x03, 0x69, 0xff, 0x68, 0x03, 0x41, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x41, 0x03, 0x6c, 0xff, 0x68, 0x03, 0x41, 0x03, 0x6e, - 0xff, 0x68, 0x03, 0x41, 0x03, 0x71, 0xff, 0x46, 0x03, 0x41, 0x03, 0x75, - 0xff, 0x46, 0x03, 0x41, 0x03, 0x78, 0xff, 0x46, 0x03, 0x41, 0x03, 0x7c, - 0x00, 0x62, 0x03, 0x41, 0x03, 0x7e, 0xff, 0x46, 0x03, 0x42, 0x03, 0x57, - 0xff, 0xd1, 0x03, 0x42, 0x03, 0x5d, 0xff, 0xd1, 0x03, 0x44, 0x00, 0x03, - 0xff, 0x8f, 0x03, 0x44, 0x03, 0x4b, 0xff, 0xd5, 0x03, 0x44, 0x03, 0x52, - 0xff, 0xd5, 0x03, 0x44, 0x03, 0x56, 0xff, 0x68, 0x03, 0x44, 0x03, 0x57, - 0xff, 0x68, 0x03, 0x44, 0x03, 0x58, 0xff, 0xc5, 0x03, 0x44, 0x03, 0x5d, - 0xff, 0x68, 0x03, 0x44, 0x03, 0x65, 0xff, 0xdb, 0x03, 0x44, 0x03, 0x6f, - 0xff, 0xdb, 0x03, 0x44, 0x03, 0x79, 0xff, 0xdb, 0x03, 0x44, 0x07, 0xe4, - 0xff, 0x68, 0x03, 0x46, 0x00, 0x0f, 0xff, 0x1f, 0x03, 0x46, 0x00, 0x11, - 0xff, 0x1f, 0x03, 0x46, 0x03, 0x43, 0x00, 0xa4, 0x03, 0x46, 0x03, 0x44, - 0xff, 0x44, 0x03, 0x46, 0x03, 0x47, 0xff, 0x44, 0x03, 0x46, 0x03, 0x4e, - 0xff, 0x44, 0x03, 0x46, 0x03, 0x6b, 0xff, 0xa8, 0x03, 0x46, 0x03, 0x7c, - 0x00, 0x58, 0x03, 0x47, 0x00, 0x03, 0xff, 0x8f, 0x03, 0x47, 0x03, 0x4b, - 0xff, 0xd5, 0x03, 0x47, 0x03, 0x52, 0xff, 0xd5, 0x03, 0x47, 0x03, 0x56, - 0xff, 0x89, 0x03, 0x47, 0x03, 0x57, 0xff, 0x68, 0x03, 0x47, 0x03, 0x5d, - 0xff, 0x68, 0x03, 0x4b, 0x03, 0x44, 0xff, 0xdb, 0x03, 0x4b, 0x03, 0x47, - 0xff, 0xdb, 0x03, 0x4b, 0x03, 0x4e, 0xff, 0xdb, 0x03, 0x4b, 0x03, 0x57, - 0xff, 0xbe, 0x03, 0x4b, 0x03, 0x5d, 0xff, 0xbe, 0x03, 0x4d, 0x03, 0x4b, - 0xff, 0xc1, 0x03, 0x4d, 0x03, 0x52, 0xff, 0xc1, 0x03, 0x4d, 0x03, 0x58, - 0xff, 0x8f, 0x03, 0x4d, 0x03, 0x5e, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x63, - 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x66, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x68, - 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x6a, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x70, - 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x71, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x75, - 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x78, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x7b, - 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x7e, 0xff, 0xe7, 0x03, 0x4d, 0x03, 0x80, - 0xff, 0xe7, 0x03, 0x4e, 0x00, 0x03, 0xff, 0x8f, 0x03, 0x4e, 0x03, 0x4b, - 0xff, 0xd5, 0x03, 0x4e, 0x03, 0x52, 0xff, 0xd5, 0x03, 0x4e, 0x03, 0x56, - 0xff, 0x68, 0x03, 0x4e, 0x03, 0x57, 0xff, 0x68, 0x03, 0x4e, 0x03, 0x5d, - 0xff, 0x68, 0x03, 0x52, 0x03, 0x44, 0xff, 0xdb, 0x03, 0x52, 0x03, 0x47, - 0xff, 0xd5, 0x03, 0x52, 0x03, 0x4e, 0xff, 0xdb, 0x03, 0x52, 0x03, 0x57, - 0xff, 0xbe, 0x03, 0x52, 0x03, 0x5d, 0xff, 0xbe, 0x03, 0x54, 0x00, 0x03, - 0xff, 0xdb, 0x03, 0x54, 0x00, 0x0f, 0xfe, 0xfa, 0x03, 0x54, 0x00, 0x11, - 0xfe, 0xfa, 0x03, 0x54, 0x03, 0x44, 0xff, 0x68, 0x03, 0x54, 0x03, 0x47, - 0xff, 0x68, 0x03, 0x54, 0x03, 0x4e, 0xff, 0x68, 0x03, 0x55, 0x03, 0x72, - 0xff, 0x9e, 0x03, 0x55, 0x03, 0x76, 0xff, 0x9e, 0x03, 0x56, 0x00, 0x03, - 0xff, 0xdb, 0x03, 0x56, 0x00, 0x0f, 0xff, 0x1f, 0x03, 0x56, 0x00, 0x11, - 0xff, 0x1f, 0x03, 0x56, 0x00, 0x1d, 0xff, 0x1f, 0x03, 0x56, 0x00, 0x1e, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x43, 0x00, 0xbc, 0x03, 0x56, 0x03, 0x44, - 0xff, 0x68, 0x03, 0x56, 0x03, 0x47, 0xff, 0x68, 0x03, 0x56, 0x03, 0x4b, - 0xff, 0xdb, 0x03, 0x56, 0x03, 0x4e, 0xff, 0x68, 0x03, 0x56, 0x03, 0x52, - 0xff, 0xdb, 0x03, 0x56, 0x03, 0x58, 0xff, 0xdb, 0x03, 0x56, 0x03, 0x5b, - 0xff, 0xdb, 0x03, 0x56, 0x03, 0x5e, 0xff, 0x1f, 0x03, 0x56, 0x03, 0x5f, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x62, 0xff, 0x4e, 0x03, 0x56, 0x03, 0x63, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x65, 0xff, 0x4e, 0x03, 0x56, 0x03, 0x67, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x69, 0xff, 0x6a, 0x03, 0x56, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x56, 0x03, 0x6e, 0xff, 0x6a, 0x03, 0x56, 0x03, 0x6f, - 0xff, 0x8f, 0x03, 0x56, 0x03, 0x71, 0xff, 0x1f, 0x03, 0x56, 0x03, 0x75, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x77, 0xff, 0x50, 0x03, 0x56, 0x03, 0x78, - 0xff, 0x1f, 0x03, 0x56, 0x03, 0x79, 0xff, 0x8f, 0x03, 0x56, 0x03, 0x7a, - 0xff, 0x6a, 0x03, 0x56, 0x03, 0x7c, 0x00, 0xbc, 0x03, 0x56, 0x03, 0x7d, - 0xff, 0x4e, 0x03, 0x56, 0x03, 0x7e, 0xff, 0x1f, 0x03, 0x56, 0x03, 0x7f, - 0xff, 0x4e, 0x03, 0x57, 0x00, 0x03, 0xff, 0xdb, 0x03, 0x57, 0x00, 0x0f, - 0xfe, 0xfa, 0x03, 0x57, 0x00, 0x10, 0xff, 0x46, 0x03, 0x57, 0x00, 0x11, - 0xfe, 0xfa, 0x03, 0x57, 0x00, 0x1d, 0xff, 0x8f, 0x03, 0x57, 0x00, 0x1e, - 0xff, 0x8f, 0x03, 0x57, 0x03, 0x43, 0x00, 0xbc, 0x03, 0x57, 0x03, 0x44, - 0xff, 0x68, 0x03, 0x57, 0x03, 0x47, 0xff, 0x68, 0x03, 0x57, 0x03, 0x4b, - 0xff, 0x8d, 0x03, 0x57, 0x03, 0x4e, 0xff, 0x68, 0x03, 0x57, 0x03, 0x52, - 0xff, 0x8d, 0x03, 0x57, 0x03, 0x58, 0xff, 0x8d, 0x03, 0x57, 0x03, 0x5b, - 0xff, 0x9e, 0x03, 0x57, 0x03, 0x60, 0xff, 0x68, 0x03, 0x57, 0x03, 0x61, - 0xff, 0xb4, 0x03, 0x57, 0x03, 0x63, 0xff, 0x46, 0x03, 0x57, 0x03, 0x65, - 0xff, 0x9e, 0x03, 0x57, 0x03, 0x69, 0xff, 0x68, 0x03, 0x57, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x57, 0x03, 0x6c, 0xff, 0x68, 0x03, 0x57, 0x03, 0x6e, - 0xff, 0x68, 0x03, 0x57, 0x03, 0x71, 0xff, 0x46, 0x03, 0x57, 0x03, 0x75, - 0xff, 0x46, 0x03, 0x57, 0x03, 0x78, 0xff, 0x46, 0x03, 0x57, 0x03, 0x7c, - 0x00, 0x79, 0x03, 0x57, 0x03, 0x7e, 0xff, 0x46, 0x03, 0x58, 0x03, 0x44, - 0xff, 0xc5, 0x03, 0x58, 0x03, 0x57, 0xff, 0xbe, 0x03, 0x58, 0x03, 0x5d, - 0xff, 0xbe, 0x03, 0x5a, 0x03, 0x5e, 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x63, - 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x66, 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x6a, - 0xff, 0xd9, 0x03, 0x5a, 0x03, 0x71, 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x75, - 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x78, 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x7b, - 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x7e, 0xff, 0xb2, 0x03, 0x5a, 0x03, 0x80, - 0xff, 0xb2, 0x03, 0x5b, 0x03, 0x57, 0xff, 0xd1, 0x03, 0x5b, 0x03, 0x5d, - 0xff, 0xd1, 0x03, 0x5d, 0x00, 0x03, 0xff, 0xdb, 0x03, 0x5d, 0x03, 0x43, - 0x00, 0xaa, 0x03, 0x5d, 0x03, 0x44, 0xff, 0x68, 0x03, 0x5d, 0x03, 0x47, - 0xff, 0x68, 0x03, 0x5d, 0x03, 0x4b, 0xff, 0x8d, 0x03, 0x5d, 0x03, 0x4e, - 0xff, 0x68, 0x03, 0x5d, 0x03, 0x52, 0xff, 0x8d, 0x03, 0x5d, 0x03, 0x58, - 0xff, 0x8d, 0x03, 0x5d, 0x03, 0x5b, 0xff, 0x9e, 0x03, 0x5d, 0x03, 0x60, - 0xff, 0x68, 0x03, 0x5d, 0x03, 0x61, 0xff, 0xb4, 0x03, 0x5d, 0x03, 0x63, - 0xff, 0x46, 0x03, 0x5d, 0x03, 0x69, 0xff, 0x68, 0x03, 0x5d, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x5d, 0x03, 0x6c, 0xff, 0x68, 0x03, 0x5d, 0x03, 0x6e, - 0xff, 0x68, 0x03, 0x5d, 0x03, 0x71, 0xff, 0x46, 0x03, 0x5d, 0x03, 0x75, - 0xff, 0x46, 0x03, 0x5d, 0x03, 0x78, 0xff, 0x46, 0x03, 0x5d, 0x03, 0x7c, - 0x00, 0x62, 0x03, 0x5d, 0x03, 0x7e, 0xff, 0x46, 0x03, 0x66, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x66, 0x03, 0x72, 0xff, 0xe3, 0x03, 0x66, 0x03, 0x76, - 0xff, 0xe3, 0x03, 0x66, 0x03, 0x79, 0xff, 0xc9, 0x03, 0x68, 0x03, 0x5e, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x60, 0xff, 0xdb, 0x03, 0x68, 0x03, 0x63, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x65, 0xff, 0xaa, 0x03, 0x68, 0x03, 0x66, - 0xff, 0xb4, 0x03, 0x68, 0x03, 0x69, 0xff, 0xdb, 0x03, 0x68, 0x03, 0x6a, - 0xff, 0x9e, 0x03, 0x68, 0x03, 0x6b, 0xff, 0xdb, 0x03, 0x68, 0x03, 0x6c, - 0xff, 0xdb, 0x03, 0x68, 0x03, 0x6f, 0xff, 0xaa, 0x03, 0x68, 0x03, 0x71, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x72, 0xff, 0xaa, 0x03, 0x68, 0x03, 0x75, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x76, 0xff, 0xaa, 0x03, 0x68, 0x03, 0x78, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x7b, 0xff, 0x77, 0x03, 0x68, 0x03, 0x7e, - 0xff, 0x77, 0x03, 0x68, 0x03, 0x80, 0xff, 0x77, 0x03, 0x6a, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x6c, 0x03, 0x5e, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x63, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x66, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x68, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x6a, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x70, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x71, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x74, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x75, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x78, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x7b, 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x7e, - 0xff, 0xe7, 0x03, 0x6c, 0x03, 0x80, 0xff, 0xe7, 0x03, 0x6d, 0x03, 0x5e, - 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x63, 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x66, - 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x70, 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x71, - 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x74, 0xff, 0xd1, 0x03, 0x6d, 0x03, 0x75, - 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x77, 0xff, 0xcf, 0x03, 0x6d, 0x03, 0x78, - 0xff, 0xdb, 0x03, 0x6d, 0x03, 0x7b, 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x7e, - 0xff, 0xe1, 0x03, 0x6d, 0x03, 0x7f, 0xff, 0xcf, 0x03, 0x6d, 0x03, 0x80, - 0xff, 0xe1, 0x03, 0x70, 0x03, 0x5e, 0xff, 0xc9, 0x03, 0x70, 0x03, 0x63, - 0xff, 0xc9, 0x03, 0x70, 0x03, 0x66, 0xff, 0xc9, 0x03, 0x70, 0x03, 0x68, - 0xff, 0xc9, 0x03, 0x70, 0x03, 0x70, 0xff, 0xc9, 0x03, 0x70, 0x03, 0x71, - 0xff, 0xc9, 0x03, 0x70, 0x03, 0x74, 0xff, 0xc9, 0x03, 0x70, 0x03, 0x75, - 0xff, 0xc9, 0x03, 0x70, 0x03, 0x78, 0xff, 0xc9, 0x03, 0x70, 0x03, 0x7e, - 0xff, 0xc9, 0x03, 0x71, 0x03, 0x6d, 0xff, 0xd9, 0x03, 0x71, 0x03, 0x72, - 0xff, 0xe3, 0x03, 0x71, 0x03, 0x76, 0xff, 0xe3, 0x03, 0x71, 0x03, 0x79, - 0xff, 0xc9, 0x03, 0x72, 0x03, 0x5e, 0xff, 0xe3, 0x03, 0x72, 0x03, 0x63, - 0xff, 0xe3, 0x03, 0x72, 0x03, 0x68, 0xff, 0xe3, 0x03, 0x72, 0x03, 0x71, - 0xff, 0xe3, 0x03, 0x72, 0x03, 0x74, 0xff, 0xe3, 0x03, 0x72, 0x03, 0x75, - 0xff, 0xe3, 0x03, 0x72, 0x03, 0x78, 0xff, 0xe3, 0x03, 0x72, 0x03, 0x7b, - 0xff, 0xe3, 0x03, 0x72, 0x03, 0x80, 0xff, 0xe3, 0x03, 0x73, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x73, 0x03, 0x72, 0xff, 0xe3, 0x03, 0x73, 0x03, 0x76, - 0xff, 0xe3, 0x03, 0x76, 0x03, 0x5e, 0xff, 0xe3, 0x03, 0x76, 0x03, 0x63, - 0xff, 0xe3, 0x03, 0x76, 0x03, 0x66, 0xff, 0xe3, 0x03, 0x76, 0x03, 0x68, - 0xff, 0xe3, 0x03, 0x76, 0x03, 0x71, 0xff, 0xe3, 0x03, 0x76, 0x03, 0x74, - 0xff, 0xe3, 0x03, 0x76, 0x03, 0x75, 0xff, 0xe3, 0x03, 0x76, 0x03, 0x78, - 0xff, 0xe3, 0x03, 0x76, 0x03, 0x7b, 0xff, 0xe3, 0x03, 0x76, 0x03, 0x80, - 0xff, 0xe3, 0x03, 0x78, 0x03, 0x6d, 0xff, 0xd9, 0x03, 0x78, 0x03, 0x72, - 0xff, 0xe3, 0x03, 0x78, 0x03, 0x76, 0xff, 0xe3, 0x03, 0x78, 0x03, 0x79, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x5e, 0xff, 0xc9, 0x03, 0x79, 0x03, 0x63, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x66, 0xff, 0xc9, 0x03, 0x79, 0x03, 0x68, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x71, 0xff, 0xc9, 0x03, 0x79, 0x03, 0x74, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x75, 0xff, 0xc9, 0x03, 0x79, 0x03, 0x78, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x7b, 0xff, 0xc9, 0x03, 0x79, 0x03, 0x7e, - 0xff, 0xc9, 0x03, 0x79, 0x03, 0x80, 0xff, 0xc9, 0x03, 0x7b, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x7b, 0x03, 0x72, 0xff, 0xe3, 0x03, 0x7b, 0x03, 0x76, - 0xff, 0xe3, 0x03, 0x7b, 0x03, 0x79, 0xff, 0xc9, 0x03, 0x7e, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x7e, 0x03, 0x72, 0xff, 0xe3, 0x03, 0x7e, 0x03, 0x76, - 0xff, 0xe3, 0x03, 0x7e, 0x03, 0x79, 0xff, 0xc9, 0x03, 0x80, 0x03, 0x6d, - 0xff, 0xd9, 0x03, 0x80, 0x03, 0x72, 0xff, 0xe3, 0x03, 0x80, 0x03, 0x76, - 0xff, 0xe3, 0x03, 0x80, 0x03, 0x79, 0xff, 0xc9, 0x03, 0xb4, 0x00, 0x0f, - 0xff, 0x06, 0x03, 0xb4, 0x00, 0x11, 0xff, 0x06, 0x03, 0xb4, 0x00, 0x6d, - 0xff, 0x77, 0x03, 0xb4, 0x00, 0x7d, 0xff, 0x77, 0x03, 0xb4, 0x07, 0xdf, - 0xff, 0xd3, 0x03, 0xba, 0x07, 0xe4, 0xff, 0x60, 0x03, 0xbb, 0x07, 0xe4, - 0xff, 0x77, 0x03, 0xc1, 0x03, 0xc5, 0x00, 0x44, 0x03, 0xc1, 0x03, 0xc8, - 0xff, 0xe9, 0x03, 0xc1, 0x03, 0xcc, 0x00, 0x2d, 0x03, 0xc1, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xc1, 0x03, 0xd0, 0xff, 0xe9, 0x03, 0xc1, 0x03, 0xd2, - 0xff, 0xd3, 0x03, 0xc1, 0x03, 0xd3, 0xff, 0x60, 0x03, 0xc1, 0x03, 0xd4, - 0xff, 0xa6, 0x03, 0xc1, 0x03, 0xd5, 0xff, 0xbc, 0x03, 0xc1, 0x03, 0xd8, - 0xff, 0x60, 0x03, 0xc1, 0x03, 0xde, 0xff, 0xd3, 0x03, 0xc1, 0x03, 0xe1, - 0x00, 0x17, 0x03, 0xc1, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xc1, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xc1, 0x03, 0xf5, 0x00, 0x17, 0x03, 0xc1, 0x03, 0xfe, - 0x00, 0x2d, 0x03, 0xc1, 0x07, 0xe4, 0xff, 0x8d, 0x03, 0xc2, 0x03, 0xc1, - 0xff, 0xd3, 0x03, 0xc2, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xcf, - 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xd3, - 0xff, 0xa4, 0x03, 0xc2, 0x03, 0xd4, 0xff, 0xd1, 0x03, 0xc2, 0x03, 0xd5, - 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xd6, 0xff, 0xd3, 0x03, 0xc2, 0x03, 0xd8, - 0xff, 0xa4, 0x03, 0xc2, 0x03, 0xdb, 0xff, 0xbc, 0x03, 0xc2, 0x03, 0xde, - 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xe0, 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xec, - 0xff, 0xe9, 0x03, 0xc2, 0x03, 0xf4, 0xff, 0xd3, 0x03, 0xc3, 0x03, 0xc1, - 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xc5, 0xff, 0xd3, 0x03, 0xc3, 0x03, 0xc7, - 0xff, 0xd3, 0x03, 0xc3, 0x03, 0xc8, 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xcc, - 0xff, 0xe9, 0x03, 0xc3, 0x03, 0xcf, 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xd2, - 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xd3, 0xff, 0x77, 0x03, 0xc3, 0x03, 0xd4, - 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xd5, 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xd6, - 0xff, 0xa6, 0x03, 0xc3, 0x03, 0xd8, 0xff, 0xa4, 0x03, 0xc3, 0x03, 0xdb, - 0xff, 0x8d, 0x03, 0xc3, 0x03, 0xe0, 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xe5, - 0xff, 0xe9, 0x03, 0xc3, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xc3, 0x03, 0xf3, - 0xff, 0xbc, 0x03, 0xc3, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xc3, 0x03, 0xf6, - 0xff, 0xe9, 0x03, 0xc3, 0x03, 0xf8, 0xff, 0xbc, 0x03, 0xc3, 0x04, 0x00, - 0xff, 0xe9, 0x03, 0xc4, 0x00, 0x0f, 0xff, 0x06, 0x03, 0xc4, 0x00, 0x11, - 0xff, 0x06, 0x03, 0xc4, 0x00, 0x6d, 0xff, 0x77, 0x03, 0xc4, 0x00, 0x7d, - 0xff, 0x77, 0x03, 0xc4, 0x03, 0xc1, 0xff, 0x77, 0x03, 0xc4, 0x03, 0xc5, - 0xff, 0x77, 0x03, 0xc4, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xc4, 0x03, 0xcc, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xcd, 0xff, 0xd1, 0x03, 0xc4, 0x03, 0xcf, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xd2, 0xff, 0xa4, 0x03, 0xc4, 0x03, 0xe0, - 0xff, 0xbc, 0x03, 0xc4, 0x03, 0xe1, 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xe3, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xe5, 0xff, 0x77, 0x03, 0xc4, 0x03, 0xe6, - 0xff, 0x77, 0x03, 0xc4, 0x03, 0xe9, 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xec, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xed, 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xee, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xef, 0xff, 0x77, 0x03, 0xc4, 0x03, 0xf1, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xf4, 0xff, 0x77, 0x03, 0xc4, 0x03, 0xfc, - 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xfd, 0xff, 0x8d, 0x03, 0xc4, 0x03, 0xff, - 0xff, 0x8d, 0x03, 0xc4, 0x04, 0x00, 0xff, 0x77, 0x03, 0xc4, 0x07, 0xdf, - 0xff, 0xd3, 0x03, 0xc5, 0x03, 0xd4, 0x00, 0x17, 0x03, 0xc5, 0x03, 0xd5, - 0xff, 0xd3, 0x03, 0xc5, 0x03, 0xd8, 0xff, 0xba, 0x03, 0xc5, 0x03, 0xe8, - 0x00, 0x44, 0x03, 0xc5, 0x03, 0xef, 0x00, 0x17, 0x03, 0xc5, 0x03, 0xf4, - 0x00, 0x2d, 0x03, 0xc6, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xc6, 0x03, 0xf2, - 0xff, 0xe9, 0x03, 0xc7, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xc7, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xc7, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xc7, 0x03, 0xd3, - 0x00, 0x17, 0x03, 0xc7, 0x03, 0xd4, 0x00, 0x2d, 0x03, 0xc7, 0x03, 0xdb, - 0x00, 0x2d, 0x03, 0xc7, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xc7, 0x03, 0xe6, - 0xff, 0xe7, 0x03, 0xc7, 0x03, 0xef, 0xff, 0xe9, 0x03, 0xc7, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xcc, 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xcf, - 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xd3, - 0xff, 0xd3, 0x03, 0xc8, 0x03, 0xd4, 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xd5, - 0xff, 0xe9, 0x03, 0xc8, 0x03, 0xd8, 0xff, 0xd3, 0x03, 0xc8, 0x03, 0xe0, - 0xff, 0xe9, 0x03, 0xcb, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcb, 0x03, 0xcf, - 0xff, 0xe9, 0x03, 0xcb, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xcb, 0x03, 0xd4, - 0x00, 0x17, 0x03, 0xcb, 0x03, 0xd5, 0xff, 0xba, 0x03, 0xcc, 0x03, 0xd5, - 0xff, 0xe9, 0x03, 0xcc, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xcc, 0x03, 0xf4, - 0x00, 0x17, 0x03, 0xcd, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xcd, 0x03, 0xd8, - 0xff, 0xe9, 0x03, 0xcd, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xcd, 0x03, 0xe6, - 0x00, 0x17, 0x03, 0xcd, 0x03, 0xef, 0x00, 0x17, 0x03, 0xcd, 0x03, 0xf2, - 0x00, 0x17, 0x03, 0xcd, 0x03, 0xf4, 0x00, 0x17, 0x03, 0xcd, 0x03, 0xf8, - 0xff, 0xe9, 0x03, 0xcd, 0x03, 0xfe, 0x00, 0x17, 0x03, 0xcf, 0x03, 0xc1, - 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xc5, 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xc7, - 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xcc, 0xff, 0xe9, 0x03, 0xcf, 0x03, 0xd4, - 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xd6, 0xff, 0xa4, 0x03, 0xcf, 0x03, 0xd8, - 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xe5, - 0xff, 0xd3, 0x03, 0xcf, 0x03, 0xec, 0xff, 0xe9, 0x03, 0xcf, 0x03, 0xf6, - 0xff, 0xe9, 0x03, 0xd1, 0x00, 0x0f, 0xfe, 0x7d, 0x03, 0xd1, 0x00, 0x11, - 0xfe, 0x7d, 0x03, 0xd1, 0x00, 0x1d, 0xff, 0xd3, 0x03, 0xd1, 0x00, 0x1e, - 0xff, 0xd3, 0x03, 0xd1, 0x00, 0x7d, 0xff, 0x8d, 0x03, 0xd1, 0x03, 0xc1, - 0xff, 0x77, 0x03, 0xd1, 0x03, 0xc5, 0xff, 0x77, 0x03, 0xd1, 0x03, 0xc7, - 0xff, 0xe9, 0x03, 0xd1, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xd1, 0x03, 0xcc, - 0xff, 0x8d, 0x03, 0xd1, 0x03, 0xcd, 0xff, 0xe9, 0x03, 0xd1, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xd1, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd1, 0x03, 0xd3, - 0xff, 0xa4, 0x03, 0xd1, 0x03, 0xd4, 0xff, 0xd3, 0x03, 0xd1, 0x03, 0xd5, - 0xff, 0xe9, 0x03, 0xd1, 0x03, 0xd6, 0xff, 0xa4, 0x03, 0xd1, 0x03, 0xe0, - 0xff, 0xd3, 0x03, 0xd1, 0x03, 0xe1, 0xff, 0xbc, 0x03, 0xd1, 0x03, 0xe5, - 0xff, 0x60, 0x03, 0xd1, 0x03, 0xe6, 0xff, 0xa6, 0x03, 0xd1, 0x03, 0xef, - 0xff, 0xa6, 0x03, 0xd1, 0x03, 0xfe, 0xff, 0xd3, 0x03, 0xd1, 0x04, 0x00, - 0xff, 0xbc, 0x03, 0xd2, 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xd2, 0x03, 0xc5, - 0xff, 0xd3, 0x03, 0xd2, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xd2, 0x03, 0xcc, - 0xff, 0xbc, 0x03, 0xd2, 0x03, 0xcd, 0xff, 0xe9, 0x03, 0xd2, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xd2, 0x03, 0xd3, 0xff, 0xbc, 0x03, 0xd2, 0x03, 0xd4, - 0xff, 0xbc, 0x03, 0xd2, 0x03, 0xd6, 0xff, 0x8d, 0x03, 0xd2, 0x03, 0xd8, - 0xff, 0xbc, 0x03, 0xd2, 0x03, 0xdb, 0xff, 0xba, 0x03, 0xd2, 0x03, 0xde, - 0xff, 0xe9, 0x03, 0xd2, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xd2, 0x03, 0xe7, - 0x00, 0x2d, 0x03, 0xd2, 0x03, 0xf8, 0xff, 0xe9, 0x03, 0xd3, 0x00, 0x0f, - 0xff, 0x1d, 0x03, 0xd3, 0x00, 0x11, 0xff, 0x1d, 0x03, 0xd3, 0x00, 0x6d, - 0xff, 0xa6, 0x03, 0xd3, 0x00, 0x7d, 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xc1, - 0xff, 0xbc, 0x03, 0xd3, 0x03, 0xc5, 0xff, 0xbc, 0x03, 0xd3, 0x03, 0xc7, - 0x00, 0x17, 0x03, 0xd3, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xd3, 0x03, 0xcc, - 0xff, 0xd3, 0x03, 0xd3, 0x03, 0xcf, 0xff, 0xa4, 0x03, 0xd3, 0x03, 0xd5, - 0xff, 0xbc, 0x03, 0xd3, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xd3, 0x03, 0xe1, - 0xff, 0xa4, 0x03, 0xd3, 0x03, 0xe3, 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xe6, - 0xff, 0x8d, 0x03, 0xd3, 0x03, 0xe9, 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xeb, - 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xec, 0xff, 0xa4, 0x03, 0xd3, 0x03, 0xed, - 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xef, 0xff, 0x60, 0x03, 0xd3, 0x03, 0xf0, - 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xf1, 0xff, 0x8d, 0x03, 0xd3, 0x03, 0xf2, - 0xff, 0x8d, 0x03, 0xd3, 0x03, 0xf4, 0xff, 0x8d, 0x03, 0xd3, 0x03, 0xf6, - 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xfa, 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xfc, - 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xfd, 0xff, 0xa6, 0x03, 0xd3, 0x03, 0xff, - 0xff, 0xa6, 0x03, 0xd3, 0x04, 0x00, 0xff, 0x8d, 0x03, 0xd3, 0x07, 0xdf, - 0xff, 0xd3, 0x03, 0xd4, 0x00, 0x0f, 0xfe, 0xf0, 0x03, 0xd4, 0x00, 0x11, - 0xfe, 0xf0, 0x03, 0xd4, 0x00, 0x1d, 0xff, 0xd3, 0x03, 0xd4, 0x00, 0x1e, - 0xff, 0xd3, 0x03, 0xd4, 0x00, 0x6d, 0xff, 0xa6, 0x03, 0xd4, 0x00, 0x7d, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xc1, 0xff, 0x77, 0x03, 0xd4, 0x03, 0xc5, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xd4, 0x03, 0xcc, - 0xff, 0xbc, 0x03, 0xd4, 0x03, 0xcf, 0xff, 0xbc, 0x03, 0xd4, 0x03, 0xd5, - 0xff, 0xbc, 0x03, 0xd4, 0x03, 0xde, 0xff, 0xd3, 0x03, 0xd4, 0x03, 0xe0, - 0xff, 0xd3, 0x03, 0xd4, 0x03, 0xe2, 0xff, 0xd3, 0x03, 0xd4, 0x03, 0xe3, - 0xff, 0x8d, 0x03, 0xd4, 0x03, 0xe4, 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xe5, - 0xff, 0x60, 0x03, 0xd4, 0x03, 0xe6, 0xff, 0x77, 0x03, 0xd4, 0x03, 0xe7, - 0xff, 0xbc, 0x03, 0xd4, 0x03, 0xe8, 0xff, 0x8d, 0x03, 0xd4, 0x03, 0xe9, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xea, 0xff, 0xbc, 0x03, 0xd4, 0x03, 0xeb, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xec, 0xff, 0x77, 0x03, 0xd4, 0x03, 0xed, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xee, 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xef, - 0xff, 0x77, 0x03, 0xd4, 0x03, 0xf0, 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xf1, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xf2, 0xff, 0x77, 0x03, 0xd4, 0x03, 0xf6, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xf7, 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xf9, - 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xfa, 0xff, 0xa4, 0x03, 0xd4, 0x03, 0xff, - 0xff, 0xa4, 0x03, 0xd4, 0x04, 0x00, 0xff, 0x77, 0x03, 0xd4, 0x07, 0xdf, - 0xff, 0xe9, 0x03, 0xd5, 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xd5, 0x03, 0xc5, - 0xff, 0xbc, 0x03, 0xd5, 0x03, 0xcc, 0xff, 0xbc, 0x03, 0xd5, 0x03, 0xd3, - 0xff, 0x8d, 0x03, 0xd5, 0x03, 0xd4, 0xff, 0xa4, 0x03, 0xd5, 0x03, 0xd8, - 0xff, 0xd3, 0x03, 0xd5, 0x03, 0xe0, 0xff, 0xba, 0x03, 0xd5, 0x03, 0xec, - 0xff, 0xbc, 0x03, 0xd6, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xd6, 0x03, 0xcf, - 0xff, 0xbc, 0x03, 0xd6, 0x03, 0xd2, 0xff, 0xbc, 0x03, 0xd6, 0x03, 0xd5, - 0xff, 0xbc, 0x03, 0xd6, 0x03, 0xde, 0xff, 0xba, 0x03, 0xd6, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xd6, 0x03, 0xf4, 0xff, 0xd3, 0x03, 0xd7, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xd7, 0x03, 0xe1, 0x00, 0x2d, 0x03, 0xda, 0x03, 0xe1, - 0x00, 0x17, 0x03, 0xda, 0x03, 0xf4, 0x00, 0x2d, 0x03, 0xdb, 0x03, 0xe0, - 0xff, 0xbc, 0x03, 0xdb, 0x07, 0xe4, 0xff, 0x77, 0x03, 0xdd, 0x03, 0xc1, - 0xff, 0xd3, 0x03, 0xdd, 0x03, 0xc5, 0xff, 0xd3, 0x03, 0xdd, 0x03, 0xc7, - 0xff, 0xbc, 0x03, 0xdd, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xdd, 0x03, 0xcc, - 0xff, 0xba, 0x03, 0xdd, 0x03, 0xcd, 0xff, 0xd3, 0x03, 0xdd, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xdd, 0x03, 0xd2, 0xff, 0xd3, 0x03, 0xdd, 0x03, 0xd3, - 0xff, 0x33, 0x03, 0xdd, 0x03, 0xd6, 0xff, 0xa4, 0x03, 0xdd, 0x03, 0xd8, - 0xff, 0x60, 0x03, 0xdd, 0x03, 0xde, 0xff, 0xe9, 0x03, 0xdd, 0x03, 0xe0, - 0xff, 0xa4, 0x03, 0xdd, 0x07, 0xe4, 0xff, 0x60, 0x03, 0xde, 0x03, 0xc5, - 0xff, 0xbc, 0x03, 0xde, 0x03, 0xc7, 0xff, 0xe7, 0x03, 0xde, 0x03, 0xc8, - 0xff, 0xe9, 0x03, 0xde, 0x03, 0xcc, 0xff, 0xbc, 0x03, 0xde, 0x03, 0xd6, - 0xff, 0xba, 0x03, 0xde, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xde, 0x03, 0xe5, - 0xff, 0xbc, 0x03, 0xde, 0x03, 0xe7, 0x00, 0x17, 0x03, 0xde, 0x03, 0xec, - 0xff, 0xbc, 0x03, 0xde, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xde, 0x04, 0x00, - 0xff, 0xe9, 0x03, 0xdf, 0x03, 0xc1, 0xff, 0xbc, 0x03, 0xdf, 0x03, 0xc5, - 0xff, 0xa6, 0x03, 0xdf, 0x03, 0xc7, 0xff, 0xd3, 0x03, 0xdf, 0x03, 0xcc, - 0xff, 0xa4, 0x03, 0xdf, 0x03, 0xcf, 0xff, 0xe9, 0x03, 0xdf, 0x03, 0xd2, - 0xff, 0xe9, 0x03, 0xdf, 0x03, 0xd3, 0xff, 0x8d, 0x03, 0xdf, 0x03, 0xd6, - 0xff, 0xa4, 0x03, 0xdf, 0x03, 0xd8, 0xff, 0xbc, 0x03, 0xdf, 0x03, 0xe5, - 0xff, 0xa4, 0x03, 0xdf, 0x03, 0xec, 0xff, 0xa4, 0x03, 0xdf, 0x03, 0xed, - 0xff, 0xe9, 0x03, 0xe1, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xe1, 0x03, 0xf3, - 0xff, 0xd3, 0x03, 0xe1, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xe1, 0x03, 0xf8, - 0xff, 0xd3, 0x03, 0xe2, 0x03, 0xe1, 0xff, 0xd1, 0x03, 0xe2, 0x03, 0xe5, - 0xff, 0xa4, 0x03, 0xe2, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe2, 0x03, 0xe7, - 0xff, 0xe9, 0x03, 0xe2, 0x03, 0xe8, 0xff, 0xd3, 0x03, 0xe2, 0x03, 0xec, - 0xff, 0xa4, 0x03, 0xe2, 0x03, 0xed, 0xff, 0xd3, 0x03, 0xe2, 0x03, 0xf2, - 0xff, 0xe9, 0x03, 0xe2, 0x03, 0xf4, 0xff, 0xd3, 0x03, 0xe2, 0x03, 0xf5, - 0xff, 0xe9, 0x03, 0xe2, 0x03, 0xf6, 0xff, 0xbc, 0x03, 0xe2, 0x03, 0xf8, - 0xff, 0xbc, 0x03, 0xe2, 0x03, 0xfb, 0xff, 0xbc, 0x03, 0xe2, 0x03, 0xfe, - 0xff, 0xe9, 0x03, 0xe2, 0x04, 0x00, 0xff, 0xd3, 0x03, 0xe3, 0x03, 0xe1, - 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xe5, - 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xe7, - 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xec, - 0xff, 0xd1, 0x03, 0xe3, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xf3, - 0xff, 0xd3, 0x03, 0xe3, 0x03, 0xf4, 0xff, 0xd3, 0x03, 0xe3, 0x03, 0xf5, - 0xff, 0xe9, 0x03, 0xe3, 0x03, 0xf8, 0xff, 0xa4, 0x03, 0xe3, 0x03, 0xfb, - 0xff, 0xbc, 0x03, 0xe3, 0x04, 0x00, 0xff, 0xe9, 0x03, 0xe4, 0x00, 0x0f, - 0xff, 0x06, 0x03, 0xe4, 0x00, 0x11, 0xff, 0x06, 0x03, 0xe4, 0x03, 0xe1, - 0xff, 0xd3, 0x03, 0xe4, 0x03, 0xe5, 0xff, 0xa4, 0x03, 0xe4, 0x03, 0xe6, - 0xff, 0xd3, 0x03, 0xe4, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xe4, 0x03, 0xec, - 0xff, 0xd3, 0x03, 0xe4, 0x03, 0xef, 0xff, 0xd3, 0x03, 0xe4, 0x03, 0xf2, - 0xff, 0xd3, 0x03, 0xe4, 0x04, 0x00, 0xff, 0xe9, 0x03, 0xe5, 0x03, 0xfb, - 0xff, 0xd3, 0x03, 0xe5, 0x03, 0xfe, 0x00, 0x17, 0x03, 0xe6, 0x03, 0xe2, - 0xff, 0xe9, 0x03, 0xe6, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe6, 0x03, 0xe7, - 0xff, 0xe9, 0x03, 0xe6, 0x03, 0xe8, 0xff, 0xd3, 0x03, 0xe6, 0x03, 0xec, - 0xff, 0xbc, 0x03, 0xe6, 0x03, 0xf3, 0xff, 0xbc, 0x03, 0xe6, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xe6, 0x03, 0xf6, 0xff, 0xd3, 0x03, 0xe6, 0x03, 0xf8, - 0xff, 0xbc, 0x03, 0xe7, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xe7, 0x03, 0xf4, - 0x00, 0x17, 0x03, 0xe7, 0x03, 0xf8, 0xff, 0xe9, 0x03, 0xe7, 0x03, 0xfb, - 0x00, 0x2d, 0x03, 0xe8, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xe5, - 0xff, 0xd3, 0x03, 0xe8, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xec, 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xe8, 0x03, 0xf8, - 0xff, 0xbc, 0x03, 0xe8, 0x03, 0xfb, 0xff, 0xd3, 0x03, 0xeb, 0x03, 0xe1, - 0x00, 0x2d, 0x03, 0xeb, 0x03, 0xe2, 0x00, 0x2d, 0x03, 0xeb, 0x03, 0xe6, - 0x00, 0x17, 0x03, 0xeb, 0x03, 0xe8, 0x00, 0x17, 0x03, 0xeb, 0x03, 0xec, - 0x00, 0x17, 0x03, 0xeb, 0x03, 0xef, 0x00, 0x17, 0x03, 0xeb, 0x03, 0xf2, - 0x00, 0x17, 0x03, 0xeb, 0x03, 0xf3, 0x00, 0x17, 0x03, 0xeb, 0x03, 0xf4, - 0x00, 0x17, 0x03, 0xeb, 0x03, 0xfe, 0x00, 0x17, 0x03, 0xec, 0x03, 0xef, - 0x00, 0x17, 0x03, 0xec, 0x03, 0xf8, 0xff, 0xd3, 0x03, 0xed, 0x03, 0xe2, - 0xff, 0xe9, 0x03, 0xed, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xed, 0x03, 0xf4, - 0x00, 0x17, 0x03, 0xef, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xef, 0x03, 0xe7, - 0xff, 0xe9, 0x03, 0xef, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xef, 0x03, 0xec, - 0xff, 0xd3, 0x03, 0xef, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xef, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xef, 0x03, 0xf6, 0xff, 0xe9, 0x03, 0xef, 0x03, 0xf8, - 0xff, 0xd3, 0x03, 0xf1, 0x03, 0xe5, 0xff, 0xd1, 0x03, 0xf1, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xf1, 0x03, 0xec, 0xff, 0xba, 0x03, 0xf1, 0x03, 0xf3, - 0xff, 0xd3, 0x03, 0xf1, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf1, 0x03, 0xf6, - 0xff, 0xe9, 0x03, 0xf1, 0x03, 0xf8, 0xff, 0xd3, 0x03, 0xf1, 0x04, 0x00, - 0xff, 0xe9, 0x03, 0xf2, 0x03, 0xe7, 0x00, 0x17, 0x03, 0xf2, 0x03, 0xef, - 0x00, 0x17, 0x03, 0xf2, 0x03, 0xf8, 0xff, 0xe9, 0x03, 0xf2, 0x03, 0xfe, - 0x00, 0x17, 0x03, 0xf3, 0x00, 0x0f, 0xff, 0x1d, 0x03, 0xf3, 0x00, 0x11, - 0xff, 0x1d, 0x03, 0xf3, 0x03, 0xe1, 0xff, 0xe9, 0x03, 0xf3, 0x03, 0xe5, - 0xff, 0xbc, 0x03, 0xf3, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xf3, 0x03, 0xe7, - 0x00, 0x44, 0x03, 0xf3, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xf3, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xf3, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf3, 0x03, 0xf4, - 0x00, 0x17, 0x03, 0xf4, 0x00, 0x0f, 0xff, 0x33, 0x03, 0xf4, 0x00, 0x11, - 0xff, 0x33, 0x03, 0xf4, 0x00, 0x7d, 0x00, 0x17, 0x03, 0xf4, 0x03, 0xe1, - 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xf4, 0x03, 0xe5, - 0xff, 0xbc, 0x03, 0xf4, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xe7, - 0x00, 0x17, 0x03, 0xf4, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xf4, 0x03, 0xed, - 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xef, 0xff, 0xe7, 0x03, 0xf4, 0x03, 0xf1, - 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xf5, - 0xff, 0xe9, 0x03, 0xf4, 0x03, 0xfe, 0xff, 0xe9, 0x03, 0xf4, 0x04, 0x00, - 0xff, 0xe9, 0x03, 0xf5, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xf5, 0x03, 0xe5, - 0xff, 0xd3, 0x03, 0xf5, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xf5, 0x03, 0xf3, - 0xff, 0xd3, 0x03, 0xf5, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf5, 0x03, 0xf8, - 0xff, 0xd3, 0x03, 0xf5, 0x04, 0x00, 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xe1, - 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xe6, - 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xf3, - 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xf6, 0x03, 0xf8, - 0xff, 0xd3, 0x03, 0xf7, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xf7, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xf7, 0x03, 0xef, 0xff, 0xe9, 0x03, 0xf7, 0x03, 0xf2, - 0xff, 0xe9, 0x03, 0xfa, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xfa, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xfa, 0x03, 0xf4, 0x00, 0x17, 0x03, 0xfd, 0x03, 0xf3, - 0xff, 0x60, 0x03, 0xfd, 0x03, 0xf8, 0xff, 0x77, 0x03, 0xfe, 0x03, 0xe5, - 0xff, 0xd3, 0x03, 0xfe, 0x03, 0xe6, 0x00, 0x17, 0x03, 0xfe, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xfe, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xfe, 0x03, 0xef, - 0x00, 0x17, 0x03, 0xfe, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xfe, 0x03, 0xf6, - 0xff, 0xe9, 0x03, 0xfe, 0x04, 0x00, 0xff, 0xe9, 0x03, 0xff, 0x03, 0xe5, - 0xff, 0xd3, 0x03, 0xff, 0x03, 0xe7, 0xff, 0xe9, 0x03, 0xff, 0x03, 0xec, - 0xff, 0xd3, 0x03, 0xff, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xff, 0x03, 0xf3, - 0xff, 0xd3, 0x03, 0xff, 0x03, 0xf6, 0xff, 0xe9, 0x03, 0xff, 0x03, 0xf8, - 0xff, 0xd3, 0x04, 0x0f, 0x00, 0x0f, 0xff, 0x33, 0x04, 0x0f, 0x00, 0x11, - 0xff, 0x33, 0x04, 0x41, 0x00, 0x0f, 0xff, 0x06, 0x04, 0x41, 0x00, 0x11, - 0xff, 0x06, 0x04, 0x41, 0x00, 0x1d, 0xff, 0xd3, 0x04, 0x41, 0x00, 0x1e, - 0xff, 0xd3, 0x04, 0x41, 0x00, 0x6d, 0xff, 0x60, 0x04, 0x41, 0x00, 0x7d, - 0xff, 0x60, 0x04, 0x41, 0x07, 0xdf, 0xff, 0xd3, 0x07, 0xe3, 0x07, 0xe3, - 0xff, 0xdb, 0x07, 0xe4, 0x00, 0x03, 0xff, 0xb4, 0x07, 0xe4, 0x00, 0x56, - 0xff, 0xdb, 0x07, 0xe4, 0x07, 0xe4, 0xff, 0xdb, 0x07, 0xe9, 0x03, 0xb3, - 0xff, 0x60, 0x07, 0xe9, 0x03, 0xbc, 0xff, 0x60, 0x07, 0xe9, 0x03, 0xd3, - 0xff, 0x60, 0x07, 0xe9, 0x03, 0xd8, 0xff, 0xbc, 0x07, 0xe9, 0x03, 0xdb, - 0xff, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x6e, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xb0, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x01, 0x28, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x01, 0x48, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0f, 0x01, 0xc1, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0e, 0x01, 0xef, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, 0x02, 0x1c, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7a, 0x03, 0x21, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x03, 0xc6, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0e, 0x03, 0xf9, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x69, 0x06, 0xdc, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x1c, 0x08, 0x80, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0xfb, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x35, 0x09, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1a, 0x0a, 0x02, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x1e, 0x01, 0x08, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, 0x01, 0x38, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x34, 0x01, 0x50, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x1e, 0x01, 0xa1, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x1c, 0x01, 0xd1, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x1c, 0x01, 0xfe, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0xf4, 0x02, 0x2b, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x28, 0x03, 0x9c, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x09, 0x00, 0x1c, 0x03, 0xdb, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0a, 0x02, 0xd2, 0x04, 0x08, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x38, 0x08, 0x46, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x5c, 0x08, 0x9d, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x00, 0x6a, 0x09, 0x2a, 0x00, 0x03, - 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x34, 0x09, 0xcc, 0x00, 0x44, - 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x7a, - 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, - 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, - 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, - 0x00, 0x31, 0x00, 0x30, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6f, 0x00, 0x6f, - 0x00, 0x67, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, - 0x00, 0x72, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x0a, - 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, - 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, - 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, - 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x48, - 0x00, 0x61, 0x00, 0x74, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, - 0x00, 0x63, 0x00, 0x2e, 0x00, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 0x69, - 0x7a, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, - 0x30, 0x31, 0x30, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x43, - 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, - 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, - 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x32, 0x20, 0x52, 0x65, 0x64, 0x20, - 0x48, 0x61, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x00, 0x00, 0x4c, - 0x00, 0x69, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, - 0x00, 0x6e, 0x00, 0x73, 0x00, 0x00, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x52, - 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, - 0x00, 0x00, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x00, 0x41, - 0x00, 0x73, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, - 0x00, 0x72, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, - 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, - 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0x73, 0x00, 0x00, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x2d, 0x20, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x4c, 0x00, 0x69, 0x00, - 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, - 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, - 0x73, 0x00, 0x00, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x56, 0x00, 0x65, 0x00, - 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, - 0x32, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x31, 0x00, - 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x30, - 0x30, 0x2e, 0x31, 0x00, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x62, 0x00, 0x65, - 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, - 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x00, 0x4c, 0x69, - 0x62, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6e, 0x73, - 0x00, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, - 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, - 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, - 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, - 0x52, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x48, 0x00, 0x61, 0x00, - 0x74, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, - 0x2e, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x67, 0x00, 0x69, 0x00, - 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, - 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x2e, 0x00, - 0x53, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x50, 0x00, 0x61, 0x00, 0x74, 0x00, - 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, - 0x64, 0x00, 0x20, 0x00, 0x54, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, - 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, - 0x4f, 0x00, 0x66, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, - 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x63, 0x00, - 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, - 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x20, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, - 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, - 0x6e, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x00, 0x4c, 0x69, 0x62, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, - 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x20, - 0x52, 0x65, 0x64, 0x20, 0x48, 0x61, 0x74, 0x2c, 0x20, 0x49, 0x6e, 0x63, - 0x2e, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x50, 0x61, 0x74, - 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6a, 0x75, 0x72, 0x69, 0x73, - 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x00, 0x00, 0x41, - 0x00, 0x73, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, - 0x00, 0x72, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x70, - 0x00, 0x6f, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, - 0x00, 0x6e, 0x00, 0x00, 0x41, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x00, 0x53, 0x00, 0x74, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, - 0x20, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, - 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x00, 0x53, 0x74, 0x65, 0x76, 0x65, - 0x20, 0x4d, 0x61, 0x74, 0x74, 0x65, 0x73, 0x6f, 0x6e, 0x00, 0x00, 0x42, - 0x00, 0x61, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6f, - 0x00, 0x6e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6d, - 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x69, - 0x00, 0x63, 0x00, 0x68, 0x00, 0x20, 0x00, 0x77, 0x00, 0x61, 0x00, 0x73, - 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, - 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, - 0x00, 0x20, 0x00, 0x53, 0x00, 0x74, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, - 0x00, 0x20, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, - 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, - 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, - 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, - 0x00, 0x76, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, - 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x68, 0x00, 0x69, - 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0x73, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, - 0x00, 0x66, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, - 0x00, 0x67, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, - 0x00, 0x74, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, - 0x00, 0x65, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, - 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, - 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x62, - 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, - 0x00, 0x68, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61, - 0x00, 0x6c, 0x21, 0x22, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, - 0x00, 0x69, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, - 0x00, 0x66, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, - 0x00, 0x6d, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, - 0x00, 0x64, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2d, 0x00, 0x73, - 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, - 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x64, 0x00, 0x61, 0x00, 0x62, - 0x00, 0x69, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x20, - 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, - 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x63, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, - 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x2d, 0x00, 0x45, 0x00, 0x75, - 0x00, 0x72, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6e, - 0x00, 0x20, 0x00, 0x57, 0x00, 0x47, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x63, - 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, - 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x74, - 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x73, - 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x76, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, - 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x65, - 0x00, 0x65, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, - 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6c, - 0x00, 0x6f, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, - 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x6e, - 0x00, 0x67, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, - 0x00, 0x77, 0x00, 0x69, 0x00, 0x64, 0x00, 0x74, 0x00, 0x68, 0x00, 0x2d, - 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, - 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, - 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x72, - 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, - 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, - 0x00, 0x20, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x61, - 0x00, 0x62, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, - 0x00, 0x20, 0x00, 0x61, 0x00, 0x63, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x73, - 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x73, 0x00, 0x2e, - 0x00, 0x00, 0x42, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x41, - 0x72, 0x69, 0x6d, 0x6f, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x53, 0x74, 0x65, 0x76, 0x65, 0x20, 0x4d, 0x61, - 0x74, 0x74, 0x65, 0x73, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, - 0x20, 0x69, 0x6e, 0x6e, 0x6f, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2c, - 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x73, 0x61, 0x6e, 0x73, 0x20, 0x73, 0x65, 0x72, 0x69, 0x66, 0x20, 0x64, - 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, - 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, 0xaa, 0x2e, - 0x20, 0x41, 0x72, 0x69, 0x6d, 0x6f, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x73, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, - 0x6e, 0x2d, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x61, - 0x64, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x6e, - 0x2d, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x57, 0x47, - 0x4c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, - 0x73, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x73, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x6f, - 0x72, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x61, 0x63, - 0x72, 0x6f, 0x73, 0x73, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x73, 0x2e, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, - 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, - 0x00, 0x2e, 0x00, 0x61, 0x00, 0x73, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, - 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x72, - 0x00, 0x70, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2f, - 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, - 0x2e, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x63, 0x6f, 0x72, - 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, - 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, - 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x73, 0x00, 0x63, 0x00, - 0x65, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x63, 0x00, - 0x6f, 0x00, 0x72, 0x00, 0x70, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, - 0x6d, 0x00, 0x2f, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, - 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, - 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x68, 0x00, 0x74, 0x00, - 0x6d, 0x00, 0x6c, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x79, 0x70, - 0x65, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x2e, 0x68, - 0x74, 0x6d, 0x6c, 0x00, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, - 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, - 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, - 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4c, - 0x00, 0x20, 0x00, 0x4f, 0x00, 0x70, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, - 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4c, - 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, - 0x00, 0x2c, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, - 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, - 0x00, 0x31, 0x00, 0x00, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, - 0x49, 0x4c, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x46, 0x6f, 0x6e, 0x74, - 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x31, 0x00, 0x00, 0x68, - 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, - 0x00, 0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, - 0x00, 0x73, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x2e, - 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00, 0x4f, 0x00, 0x46, - 0x00, 0x4c, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x69, 0x6c, 0x2e, 0x6f, - 0x72, 0x67, 0x2f, 0x4f, 0x46, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x27, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, - 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, - 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, - 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, - 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, - 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, - 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, - 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, - 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, - 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, - 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, - 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, - 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, - 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, - 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, - 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x01, 0x02, - 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, - 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa4, - 0x01, 0x03, 0x00, 0x8a, 0x01, 0x04, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, - 0x00, 0xf3, 0x00, 0x8d, 0x01, 0x05, 0x00, 0x88, 0x01, 0x06, 0x00, 0xde, - 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, - 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, 0x00, 0x62, - 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, - 0x00, 0xca, 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, - 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, - 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x68, - 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, - 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, - 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, - 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x7b, - 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, - 0x00, 0x80, 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x07, - 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x00, 0xfd, - 0x00, 0xfe, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x00, 0xff, - 0x01, 0x00, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x01, 0x01, 0x14, - 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, - 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x00, 0xf8, - 0x00, 0xf9, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, - 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, - 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x00, 0xfa, - 0x00, 0xd7, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, 0x34, - 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, - 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x00, 0xe2, 0x00, 0xe3, - 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, - 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, - 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x00, 0xb0, 0x00, 0xb1, 0x01, 0x4e, - 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, - 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xe4, - 0x00, 0xe5, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, - 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, - 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, - 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x00, 0xbb, - 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x00, 0xe6, 0x00, 0xe7, - 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, - 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, - 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, - 0x01, 0x84, 0x00, 0xa6, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, - 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, - 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, - 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, - 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, - 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, - 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, - 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, - 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, - 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, - 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, - 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, - 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, - 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, - 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, - 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, - 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, - 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, - 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, - 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, - 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, - 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, - 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, - 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, - 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, - 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, - 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, - 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, - 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, - 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, - 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, - 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, - 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, - 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, - 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, - 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, - 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, - 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, - 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, - 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, - 0x02, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, - 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, - 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, - 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, - 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, - 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, - 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, - 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, - 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, - 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, - 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, - 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x00, 0xd8, 0x00, 0xe1, 0x02, 0xb8, - 0x00, 0xda, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, - 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, - 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, - 0x00, 0xe0, 0x00, 0xd9, 0x00, 0xdf, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0xc9, - 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, - 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, - 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, - 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, - 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, - 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, - 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, - 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, - 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, - 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, - 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, - 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, - 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, - 0x03, 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, - 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, - 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, - 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, - 0x03, 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, - 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, - 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, - 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, - 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, - 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, - 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, - 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, - 0x03, 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, - 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, - 0x03, 0x6c, 0x03, 0x6d, 0x00, 0xa8, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, - 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, - 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, - 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x00, 0x9f, 0x03, 0x81, - 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, - 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8d, - 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x00, 0x97, - 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x00, 0x9b, 0x03, 0x96, 0x03, 0x97, - 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, - 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, - 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, - 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, - 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, - 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, - 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, - 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, - 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, - 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, - 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, - 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, - 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, - 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, - 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, - 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, - 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, - 0x03, 0xfe, 0x03, 0xff, 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, - 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, - 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, - 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, - 0x04, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, - 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, - 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, - 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, - 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, - 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, - 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, - 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, - 0x04, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, - 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, - 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, - 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, - 0x04, 0x5e, 0x04, 0x5f, 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, - 0x04, 0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, - 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6e, 0x04, 0x6f, - 0x04, 0x70, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x74, 0x04, 0x75, - 0x04, 0x76, 0x04, 0x77, 0x04, 0x78, 0x04, 0x79, 0x04, 0x7a, 0x04, 0x7b, - 0x04, 0x7c, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x81, - 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, - 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, - 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, - 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0x99, - 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, - 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, - 0x04, 0xa6, 0x04, 0xa7, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xab, - 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb1, - 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, - 0x04, 0xb8, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, - 0x04, 0xbe, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, - 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, - 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, - 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, - 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe0, 0x04, 0xe1, - 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, - 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, - 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf1, 0x04, 0xf2, 0x04, 0xf3, - 0x04, 0xf4, 0x04, 0xf5, 0x04, 0xf6, 0x04, 0xf7, 0x04, 0xf8, 0x04, 0xf9, - 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, - 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, - 0x05, 0x06, 0x05, 0x07, 0x05, 0x08, 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, - 0x05, 0x0c, 0x05, 0x0d, 0x05, 0x0e, 0x05, 0x0f, 0x05, 0x10, 0x05, 0x11, - 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, - 0x05, 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, - 0x05, 0x1e, 0x05, 0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, - 0x05, 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, 0x28, 0x05, 0x29, - 0x05, 0x2a, 0x05, 0x2b, 0x05, 0x2c, 0x05, 0x2d, 0x05, 0x2e, 0x05, 0x2f, - 0x05, 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, 0x34, 0x05, 0x35, - 0x05, 0x36, 0x05, 0x37, 0x05, 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, - 0x05, 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x40, 0x05, 0x41, - 0x05, 0x42, 0x05, 0x43, 0x05, 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, - 0x05, 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, 0x4c, 0x05, 0x4d, - 0x05, 0x4e, 0x05, 0x4f, 0x05, 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, - 0x05, 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, 0x58, 0x05, 0x59, - 0x05, 0x5a, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x5d, 0x05, 0x5e, 0x05, 0x5f, - 0x05, 0x60, 0x05, 0x61, 0x05, 0x62, 0x05, 0x63, 0x05, 0x64, 0x05, 0x65, - 0x05, 0x66, 0x05, 0x67, 0x05, 0x68, 0x05, 0x69, 0x05, 0x6a, 0x05, 0x6b, - 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6f, 0x05, 0x70, 0x05, 0x71, - 0x05, 0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, - 0x05, 0x78, 0x05, 0x79, 0x05, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x05, 0x7d, - 0x05, 0x7e, 0x05, 0x7f, 0x05, 0x80, 0x05, 0x81, 0x05, 0x82, 0x05, 0x83, - 0x05, 0x84, 0x05, 0x85, 0x05, 0x86, 0x05, 0x87, 0x05, 0x88, 0x05, 0x89, - 0x05, 0x8a, 0x05, 0x8b, 0x05, 0x8c, 0x05, 0x8d, 0x05, 0x8e, 0x05, 0x8f, - 0x05, 0x90, 0x05, 0x91, 0x05, 0x92, 0x05, 0x93, 0x05, 0x94, 0x05, 0x95, - 0x05, 0x96, 0x05, 0x97, 0x05, 0x98, 0x05, 0x99, 0x05, 0x9a, 0x05, 0x9b, - 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9f, 0x05, 0xa0, 0x05, 0xa1, - 0x05, 0xa2, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa6, 0x05, 0xa7, - 0x05, 0xa8, 0x05, 0xa9, 0x05, 0xaa, 0x05, 0xab, 0x05, 0xac, 0x05, 0xad, - 0x05, 0xae, 0x05, 0xaf, 0x05, 0xb0, 0x05, 0xb1, 0x05, 0xb2, 0x05, 0xb3, - 0x05, 0xb4, 0x05, 0xb5, 0x05, 0xb6, 0x05, 0xb7, 0x05, 0xb8, 0x05, 0xb9, - 0x05, 0xba, 0x05, 0xbb, 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbe, 0x05, 0xbf, - 0x05, 0xc0, 0x05, 0xc1, 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xc4, 0x05, 0xc5, - 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xc8, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, - 0x05, 0xcc, 0x05, 0xcd, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xd0, 0x05, 0xd1, - 0x05, 0xd2, 0x05, 0xd3, 0x05, 0xd4, 0x05, 0xd5, 0x05, 0xd6, 0x05, 0xd7, - 0x05, 0xd8, 0x05, 0xd9, 0x05, 0xda, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, - 0x05, 0xde, 0x05, 0xdf, 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, - 0x05, 0xe4, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, - 0x05, 0xea, 0x05, 0xeb, 0x05, 0xec, 0x05, 0xed, 0x05, 0xee, 0x05, 0xef, - 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xf2, 0x05, 0xf3, 0x05, 0xf4, 0x05, 0xf5, - 0x05, 0xf6, 0x05, 0xf7, 0x05, 0xf8, 0x05, 0xf9, 0x05, 0xfa, 0x05, 0xfb, - 0x05, 0xfc, 0x05, 0xfd, 0x05, 0xfe, 0x05, 0xff, 0x06, 0x00, 0x06, 0x01, - 0x06, 0x02, 0x06, 0x03, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, 0x06, 0x07, - 0x06, 0x08, 0x06, 0x09, 0x06, 0x0a, 0x06, 0x0b, 0x06, 0x0c, 0x06, 0x0d, - 0x06, 0x0e, 0x06, 0x0f, 0x06, 0x10, 0x06, 0x11, 0x06, 0x12, 0x06, 0x13, - 0x06, 0x14, 0x06, 0x15, 0x06, 0x16, 0x06, 0x17, 0x06, 0x18, 0x06, 0x19, - 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x1c, 0x06, 0x1d, 0x06, 0x1e, 0x06, 0x1f, - 0x06, 0x20, 0x06, 0x21, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, - 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x2b, - 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, - 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, - 0x06, 0x38, 0x06, 0x39, 0x06, 0x3a, 0x06, 0x3b, 0x06, 0x3c, 0x06, 0x3d, - 0x06, 0x3e, 0x06, 0x3f, 0x06, 0x40, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, - 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, - 0x06, 0x4a, 0x06, 0x4b, 0x06, 0x4c, 0x06, 0x4d, 0x06, 0x4e, 0x06, 0x4f, - 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0x06, 0x53, 0x06, 0x54, 0x06, 0x55, - 0x06, 0x56, 0x06, 0x57, 0x06, 0x58, 0x06, 0x59, 0x06, 0x5a, 0x06, 0x5b, - 0x06, 0x5c, 0x06, 0x5d, 0x06, 0x5e, 0x06, 0x5f, 0x06, 0x60, 0x06, 0x61, - 0x06, 0x62, 0x06, 0x63, 0x06, 0x64, 0x06, 0x65, 0x06, 0x66, 0x06, 0x67, - 0x06, 0x68, 0x06, 0x69, 0x06, 0x6a, 0x06, 0x6b, 0x06, 0x6c, 0x06, 0x6d, - 0x06, 0x6e, 0x06, 0x6f, 0x06, 0x70, 0x06, 0x71, 0x06, 0x72, 0x06, 0x73, - 0x06, 0x74, 0x06, 0x75, 0x06, 0x76, 0x06, 0x77, 0x06, 0x78, 0x06, 0x79, - 0x06, 0x7a, 0x06, 0x7b, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x7e, 0x06, 0x7f, - 0x06, 0x80, 0x06, 0x81, 0x06, 0x82, 0x06, 0x83, 0x06, 0x84, 0x06, 0x85, - 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x89, 0x06, 0x8a, 0x06, 0x8b, - 0x06, 0x8c, 0x06, 0x8d, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x90, 0x06, 0x91, - 0x06, 0x92, 0x06, 0x93, 0x06, 0x94, 0x06, 0x95, 0x06, 0x96, 0x06, 0x97, - 0x06, 0x98, 0x06, 0x99, 0x06, 0x9a, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x9d, - 0x06, 0x9e, 0x06, 0x9f, 0x06, 0xa0, 0x06, 0xa1, 0x06, 0xa2, 0x06, 0xa3, - 0x06, 0xa4, 0x06, 0xa5, 0x06, 0xa6, 0x06, 0xa7, 0x06, 0xa8, 0x06, 0xa9, - 0x06, 0xaa, 0x06, 0xab, 0x06, 0xac, 0x06, 0xad, 0x06, 0xae, 0x06, 0xaf, - 0x06, 0xb0, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xb3, 0x06, 0xb4, 0x06, 0xb5, - 0x06, 0xb6, 0x06, 0xb7, 0x06, 0xb8, 0x06, 0xb9, 0x06, 0xba, 0x06, 0xbb, - 0x06, 0xbc, 0x06, 0xbd, 0x06, 0xbe, 0x06, 0xbf, 0x06, 0xc0, 0x06, 0xc1, - 0x06, 0xc2, 0x06, 0xc3, 0x06, 0xc4, 0x06, 0xc5, 0x06, 0xc6, 0x06, 0xc7, - 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xca, 0x06, 0xcb, 0x06, 0xcc, 0x06, 0xcd, - 0x06, 0xce, 0x06, 0xcf, 0x06, 0xd0, 0x06, 0xd1, 0x06, 0xd2, 0x06, 0xd3, - 0x06, 0xd4, 0x06, 0xd5, 0x06, 0xd6, 0x06, 0xd7, 0x06, 0xd8, 0x06, 0xd9, - 0x06, 0xda, 0x06, 0xdb, 0x06, 0xdc, 0x06, 0xdd, 0x06, 0xde, 0x06, 0xdf, - 0x06, 0xe0, 0x06, 0xe1, 0x06, 0xe2, 0x06, 0xe3, 0x06, 0xe4, 0x06, 0xe5, - 0x06, 0xe6, 0x06, 0xe7, 0x06, 0xe8, 0x06, 0xe9, 0x06, 0xea, 0x06, 0xeb, - 0x06, 0xec, 0x06, 0xed, 0x06, 0xee, 0x06, 0xef, 0x06, 0xf0, 0x06, 0xf1, - 0x06, 0xf2, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xf5, 0x06, 0xf6, 0x06, 0xf7, - 0x06, 0xf8, 0x06, 0xf9, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xfc, 0x06, 0xfd, - 0x06, 0xfe, 0x06, 0xff, 0x07, 0x00, 0x07, 0x01, 0x07, 0x02, 0x07, 0x03, - 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x08, 0x07, 0x09, - 0x07, 0x0a, 0x07, 0x0b, 0x07, 0x0c, 0x07, 0x0d, 0x07, 0x0e, 0x07, 0x0f, - 0x07, 0x10, 0x07, 0x11, 0x07, 0x12, 0x07, 0x13, 0x07, 0x14, 0x07, 0x15, - 0x07, 0x16, 0x07, 0x17, 0x07, 0x18, 0x07, 0x19, 0x07, 0x1a, 0x07, 0x1b, - 0x07, 0x1c, 0x07, 0x1d, 0x07, 0x1e, 0x07, 0x1f, 0x07, 0x20, 0x07, 0x21, - 0x07, 0x22, 0x07, 0x23, 0x07, 0x24, 0x07, 0x25, 0x07, 0x26, 0x07, 0x27, - 0x07, 0x28, 0x07, 0x29, 0x07, 0x2a, 0x07, 0x2b, 0x07, 0x2c, 0x07, 0x2d, - 0x07, 0x2e, 0x07, 0x2f, 0x07, 0x30, 0x07, 0x31, 0x07, 0x32, 0x07, 0x33, - 0x07, 0x34, 0x07, 0x35, 0x07, 0x36, 0x07, 0x37, 0x07, 0x38, 0x07, 0x39, - 0x07, 0x3a, 0x07, 0x3b, 0x07, 0x3c, 0x07, 0x3d, 0x07, 0x3e, 0x07, 0x3f, - 0x07, 0x40, 0x07, 0x41, 0x07, 0x42, 0x07, 0x43, 0x07, 0x44, 0x07, 0x45, - 0x07, 0x46, 0x07, 0x47, 0x07, 0x48, 0x07, 0x49, 0x07, 0x4a, 0x07, 0x4b, - 0x07, 0x4c, 0x07, 0x4d, 0x07, 0x4e, 0x07, 0x4f, 0x07, 0x50, 0x07, 0x51, - 0x07, 0x52, 0x07, 0x53, 0x07, 0x54, 0x07, 0x55, 0x07, 0x56, 0x07, 0x57, - 0x07, 0x58, 0x07, 0x59, 0x07, 0x5a, 0x07, 0x5b, 0x07, 0x5c, 0x07, 0x5d, - 0x07, 0x5e, 0x07, 0x5f, 0x07, 0x60, 0x07, 0x61, 0x07, 0x62, 0x07, 0x63, - 0x07, 0x64, 0x07, 0x65, 0x07, 0x66, 0x07, 0x67, 0x07, 0x68, 0x07, 0x69, - 0x07, 0x6a, 0x07, 0x6b, 0x07, 0x6c, 0x07, 0x6d, 0x07, 0x6e, 0x07, 0x6f, - 0x07, 0x70, 0x07, 0x71, 0x07, 0x72, 0x07, 0x73, 0x07, 0x74, 0x07, 0x75, - 0x07, 0x76, 0x07, 0x77, 0x07, 0x78, 0x07, 0x79, 0x07, 0x7a, 0x07, 0x7b, - 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7e, 0x07, 0x7f, 0x07, 0x80, 0x07, 0x81, - 0x07, 0x82, 0x07, 0x83, 0x07, 0x84, 0x07, 0x85, 0x07, 0x86, 0x07, 0x87, - 0x07, 0x88, 0x07, 0x89, 0x07, 0x8a, 0x07, 0x8b, 0x07, 0x8c, 0x07, 0x8d, - 0x07, 0x8e, 0x07, 0x8f, 0x07, 0x90, 0x07, 0x91, 0x07, 0x92, 0x07, 0x93, - 0x07, 0x94, 0x07, 0x95, 0x07, 0x96, 0x07, 0x97, 0x07, 0x98, 0x07, 0x99, - 0x07, 0x9a, 0x07, 0x9b, 0x07, 0x9c, 0x07, 0x9d, 0x07, 0x9e, 0x07, 0x9f, - 0x07, 0xa0, 0x07, 0xa1, 0x07, 0xa2, 0x07, 0xa3, 0x07, 0xa4, 0x07, 0xa5, - 0x07, 0xa6, 0x07, 0xa7, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0xaa, 0x07, 0xab, - 0x07, 0xac, 0x07, 0xad, 0x07, 0xae, 0x07, 0xaf, 0x07, 0xb0, 0x07, 0xb1, - 0x07, 0xb2, 0x07, 0xb3, 0x07, 0xb4, 0x07, 0xb5, 0x07, 0xb6, 0x07, 0xb7, - 0x07, 0xb8, 0x07, 0xb9, 0x07, 0xba, 0x07, 0xbb, 0x07, 0xbc, 0x07, 0xbd, - 0x07, 0xbe, 0x07, 0xbf, 0x07, 0xc0, 0x07, 0xc1, 0x07, 0xc2, 0x07, 0xc3, - 0x07, 0xc4, 0x07, 0xc5, 0x07, 0xc6, 0x07, 0xc7, 0x07, 0xc8, 0x07, 0xc9, - 0x07, 0xca, 0x07, 0xcb, 0x07, 0xcc, 0x07, 0xcd, 0x07, 0xce, 0x07, 0xcf, - 0x07, 0xd0, 0x07, 0xd1, 0x07, 0xd2, 0x07, 0xd3, 0x07, 0xd4, 0x07, 0xd5, - 0x07, 0xd6, 0x07, 0xd7, 0x07, 0xd8, 0x07, 0xd9, 0x07, 0xda, 0x07, 0xdb, - 0x07, 0xdc, 0x07, 0xdd, 0x07, 0xde, 0x07, 0xdf, 0x07, 0xe0, 0x07, 0xe1, - 0x07, 0xe2, 0x07, 0xe3, 0x07, 0xe4, 0x07, 0xe5, 0x07, 0xe6, 0x07, 0xe7, - 0x07, 0xe8, 0x07, 0xe9, 0x07, 0xea, 0x07, 0xeb, 0x07, 0xec, 0x07, 0xed, - 0x07, 0xee, 0x07, 0xef, 0x07, 0xf0, 0x07, 0xf1, 0x07, 0xf2, 0x07, 0xf3, - 0x07, 0xf4, 0x07, 0xf5, 0x07, 0xf6, 0x07, 0xf7, 0x07, 0xf8, 0x07, 0xf9, - 0x07, 0xfa, 0x07, 0xfb, 0x07, 0xfc, 0x07, 0xfd, 0x07, 0xfe, 0x07, 0xff, - 0x08, 0x00, 0x00, 0xb2, 0x00, 0xb3, 0x08, 0x01, 0x08, 0x02, 0x08, 0x03, - 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xc4, 0x08, 0x04, 0x00, 0xb4, 0x00, 0xb5, - 0x00, 0xc5, 0x08, 0x05, 0x00, 0x82, 0x00, 0xc2, 0x00, 0x87, 0x00, 0xab, - 0x08, 0x06, 0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, - 0x00, 0xc6, 0x08, 0x0c, 0x08, 0x0d, 0x08, 0x0e, 0x00, 0xbe, 0x00, 0xbf, - 0x08, 0x0f, 0x08, 0x10, 0x00, 0xbc, 0x08, 0x11, 0x08, 0x12, 0x08, 0x13, - 0x08, 0x14, 0x08, 0x15, 0x08, 0x16, 0x08, 0x17, 0x08, 0x18, 0x08, 0x19, - 0x08, 0x1a, 0x08, 0x1b, 0x08, 0x1c, 0x08, 0x1d, 0x08, 0x1e, 0x08, 0x1f, - 0x08, 0x20, 0x08, 0x21, 0x08, 0x22, 0x08, 0x23, 0x08, 0x24, 0x00, 0xf7, - 0x08, 0x25, 0x08, 0x26, 0x08, 0x27, 0x08, 0x28, 0x08, 0x29, 0x08, 0x2a, - 0x08, 0x2b, 0x08, 0x2c, 0x08, 0x2d, 0x08, 0x2e, 0x08, 0x2f, 0x08, 0x30, - 0x08, 0x31, 0x08, 0x32, 0x08, 0x33, 0x08, 0x34, 0x08, 0x35, 0x08, 0x36, - 0x08, 0x37, 0x08, 0x38, 0x08, 0x39, 0x08, 0x3a, 0x08, 0x3b, 0x00, 0x8c, - 0x08, 0x3c, 0x08, 0x3d, 0x08, 0x3e, 0x08, 0x3f, 0x08, 0x40, 0x08, 0x41, - 0x08, 0x42, 0x08, 0x43, 0x08, 0x44, 0x08, 0x45, 0x08, 0x46, 0x08, 0x47, - 0x08, 0x48, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x4b, 0x08, 0x4c, 0x08, 0x4d, - 0x00, 0x98, 0x08, 0x4e, 0x00, 0x9a, 0x00, 0x99, 0x00, 0xef, 0x08, 0x4f, - 0x00, 0xc3, 0x00, 0xa5, 0x00, 0x92, 0x08, 0x50, 0x08, 0x51, 0x00, 0x9c, - 0x00, 0xa7, 0x00, 0x8f, 0x08, 0x52, 0x00, 0x94, 0x00, 0x95, 0x08, 0x53, - 0x08, 0x54, 0x08, 0x55, 0x08, 0x56, 0x08, 0x57, 0x08, 0x58, 0x08, 0x59, - 0x08, 0x5a, 0x08, 0x5b, 0x08, 0x5c, 0x08, 0x5d, 0x08, 0x5e, 0x08, 0x5f, - 0x08, 0x60, 0x08, 0x61, 0x08, 0x62, 0x08, 0x63, 0x08, 0x64, 0x08, 0x65, - 0x08, 0x66, 0x08, 0x67, 0x08, 0x68, 0x08, 0x69, 0x08, 0x6a, 0x08, 0x6b, - 0x08, 0x6c, 0x08, 0x6d, 0x08, 0x6e, 0x08, 0x6f, 0x08, 0x70, 0x08, 0x71, - 0x08, 0x72, 0x08, 0x73, 0x08, 0x74, 0x08, 0x75, 0x08, 0x76, 0x08, 0x77, - 0x08, 0x78, 0x08, 0x79, 0x08, 0x7a, 0x08, 0x7b, 0x08, 0x7c, 0x08, 0x7d, - 0x08, 0x7e, 0x08, 0x7f, 0x08, 0x80, 0x08, 0x81, 0x08, 0x82, 0x08, 0x83, - 0x08, 0x84, 0x08, 0x85, 0x08, 0x86, 0x08, 0x87, 0x08, 0x88, 0x08, 0x89, - 0x08, 0x8a, 0x08, 0x8b, 0x08, 0x8c, 0x08, 0x8d, 0x08, 0x8e, 0x08, 0x8f, - 0x00, 0xb9, 0x08, 0x90, 0x08, 0x91, 0x08, 0x92, 0x08, 0x93, 0x08, 0x94, - 0x08, 0x95, 0x08, 0x96, 0x08, 0x97, 0x08, 0x98, 0x08, 0x99, 0x08, 0x9a, - 0x08, 0x9b, 0x08, 0x9c, 0x08, 0x9d, 0x08, 0x9e, 0x08, 0x9f, 0x08, 0xa0, - 0x08, 0xa1, 0x08, 0xa2, 0x08, 0xa3, 0x08, 0xa4, 0x08, 0xa5, 0x08, 0xa6, - 0x08, 0xa7, 0x08, 0xa8, 0x08, 0xa9, 0x08, 0xaa, 0x08, 0xab, 0x08, 0xac, - 0x08, 0xad, 0x08, 0xae, 0x08, 0xaf, 0x08, 0xb0, 0x08, 0xb1, 0x08, 0xb2, - 0x08, 0xb3, 0x08, 0xb4, 0x08, 0xb5, 0x08, 0xb6, 0x08, 0xb7, 0x08, 0xb8, - 0x08, 0xb9, 0x08, 0xba, 0x08, 0xbb, 0x08, 0xbc, 0x08, 0xbd, 0x08, 0xbe, - 0x08, 0xbf, 0x08, 0xc0, 0x08, 0xc1, 0x08, 0xc2, 0x08, 0xc3, 0x08, 0xc4, - 0x08, 0xc5, 0x08, 0xc6, 0x08, 0xc7, 0x08, 0xc8, 0x08, 0xc9, 0x08, 0xca, - 0x08, 0xcb, 0x08, 0xcc, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xcf, 0x08, 0xd0, - 0x08, 0xd1, 0x08, 0xd2, 0x08, 0xd3, 0x08, 0xd4, 0x08, 0xd5, 0x08, 0xd6, - 0x08, 0xd7, 0x08, 0xd8, 0x08, 0xd9, 0x08, 0xda, 0x08, 0xdb, 0x08, 0xdc, - 0x08, 0xdd, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe0, 0x08, 0xe1, 0x08, 0xe2, - 0x08, 0xe3, 0x08, 0xe4, 0x08, 0xe5, 0x08, 0xe6, 0x08, 0xe7, 0x08, 0xe8, - 0x08, 0xe9, 0x08, 0xea, 0x08, 0xeb, 0x08, 0xec, 0x08, 0xed, 0x08, 0xee, - 0x08, 0xef, 0x08, 0xf0, 0x08, 0xf1, 0x08, 0xf2, 0x08, 0xf3, 0x08, 0xf4, - 0x08, 0xf5, 0x08, 0xf6, 0x08, 0xf7, 0x08, 0xf8, 0x08, 0xf9, 0x08, 0xfa, - 0x08, 0xfb, 0x08, 0xfc, 0x08, 0xfd, 0x08, 0xfe, 0x08, 0xff, 0x09, 0x00, - 0x09, 0x01, 0x09, 0x02, 0x09, 0x03, 0x09, 0x04, 0x09, 0x05, 0x09, 0x06, - 0x09, 0x07, 0x09, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x0b, 0x09, 0x0c, - 0x09, 0x0d, 0x09, 0x0e, 0x09, 0x0f, 0x09, 0x10, 0x09, 0x11, 0x09, 0x12, - 0x09, 0x13, 0x09, 0x14, 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x18, - 0x09, 0x19, 0x09, 0x1a, 0x09, 0x1b, 0x09, 0x1c, 0x09, 0x1d, 0x09, 0x1e, - 0x09, 0x1f, 0x09, 0x20, 0x09, 0x21, 0x09, 0x22, 0x09, 0x23, 0x09, 0x24, - 0x09, 0x25, 0x09, 0x26, 0x09, 0x27, 0x09, 0x28, 0x09, 0x29, 0x09, 0x2a, - 0x09, 0x2b, 0x09, 0x2c, 0x09, 0x2d, 0x09, 0x2e, 0x09, 0x2f, 0x09, 0x30, - 0x09, 0x31, 0x09, 0x32, 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, 0x09, 0x36, - 0x09, 0x37, 0x09, 0x38, 0x09, 0x39, 0x09, 0x3a, 0x09, 0x3b, 0x09, 0x3c, - 0x09, 0x3d, 0x09, 0x3e, 0x09, 0x3f, 0x09, 0x40, 0x09, 0x41, 0x09, 0x42, - 0x09, 0x43, 0x09, 0x44, 0x09, 0x45, 0x09, 0x46, 0x09, 0x47, 0x09, 0x48, - 0x09, 0x49, 0x09, 0x4a, 0x09, 0x4b, 0x09, 0x4c, 0x09, 0x4d, 0x09, 0x4e, - 0x09, 0x4f, 0x09, 0x50, 0x09, 0x51, 0x09, 0x52, 0x09, 0x53, 0x09, 0x54, - 0x09, 0x55, 0x09, 0x56, 0x09, 0x57, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5a, - 0x09, 0x5b, 0x09, 0x5c, 0x09, 0x5d, 0x09, 0x5e, 0x09, 0x5f, 0x09, 0x60, - 0x09, 0x61, 0x09, 0x62, 0x09, 0x63, 0x09, 0x64, 0x09, 0x65, 0x09, 0x66, - 0x09, 0x67, 0x09, 0x68, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x6b, 0x09, 0x6c, - 0x09, 0x6d, 0x09, 0x6e, 0x09, 0x6f, 0x09, 0x70, 0x09, 0x71, 0x09, 0x72, - 0x09, 0x73, 0x09, 0x74, 0x09, 0x75, 0x09, 0x76, 0x09, 0x77, 0x09, 0x78, - 0x09, 0x79, 0x09, 0x7a, 0x09, 0x7b, 0x09, 0x7c, 0x09, 0x7d, 0x09, 0x7e, - 0x09, 0x7f, 0x09, 0x80, 0x09, 0x81, 0x09, 0x82, 0x09, 0x83, 0x09, 0x84, - 0x09, 0x85, 0x09, 0x86, 0x09, 0x87, 0x09, 0x88, 0x09, 0x89, 0x09, 0x8a, - 0x09, 0x8b, 0x09, 0x8c, 0x09, 0x8d, 0x09, 0x8e, 0x09, 0x8f, 0x09, 0x90, - 0x09, 0x91, 0x09, 0x92, 0x09, 0x93, 0x09, 0x94, 0x09, 0x95, 0x09, 0x96, - 0x09, 0x97, 0x09, 0x98, 0x09, 0x99, 0x09, 0x9a, 0x09, 0x9b, 0x09, 0x9c, - 0x09, 0x9d, 0x09, 0x9e, 0x09, 0x9f, 0x09, 0xa0, 0x09, 0xa1, 0x09, 0xa2, - 0x09, 0xa3, 0x09, 0xa4, 0x09, 0xa5, 0x09, 0xa6, 0x09, 0xa7, 0x09, 0xa8, - 0x09, 0xa9, 0x09, 0xaa, 0x09, 0xab, 0x09, 0xac, 0x09, 0xad, 0x09, 0xae, - 0x09, 0xaf, 0x09, 0xb0, 0x09, 0xb1, 0x09, 0xb2, 0x09, 0xb3, 0x09, 0xb4, - 0x09, 0xb5, 0x09, 0xb6, 0x09, 0xb7, 0x09, 0xb8, 0x09, 0xb9, 0x09, 0xba, - 0x09, 0xbb, 0x09, 0xbc, 0x09, 0xbd, 0x09, 0xbe, 0x09, 0xbf, 0x09, 0xc0, - 0x09, 0xc1, 0x09, 0xc2, 0x09, 0xc3, 0x09, 0xc4, 0x09, 0xc5, 0x09, 0xc6, - 0x09, 0xc7, 0x09, 0xc8, 0x09, 0xc9, 0x09, 0xca, 0x09, 0xcb, 0x09, 0xcc, - 0x09, 0xcd, 0x09, 0xce, 0x09, 0xcf, 0x09, 0xd0, 0x09, 0xd1, 0x09, 0xd2, - 0x09, 0xd3, 0x09, 0xd4, 0x09, 0xd5, 0x09, 0xd6, 0x09, 0xd7, 0x09, 0xd8, - 0x09, 0xd9, 0x09, 0xda, 0x09, 0xdb, 0x09, 0xdc, 0x09, 0xdd, 0x09, 0xde, - 0x09, 0xdf, 0x09, 0xe0, 0x09, 0xe1, 0x09, 0xe2, 0x09, 0xe3, 0x09, 0xe4, - 0x09, 0xe5, 0x09, 0xe6, 0x09, 0xe7, 0x09, 0xe8, 0x09, 0xe9, 0x09, 0xea, - 0x09, 0xeb, 0x09, 0xec, 0x09, 0xed, 0x09, 0xee, 0x09, 0xef, 0x09, 0xf0, - 0x09, 0xf1, 0x09, 0xf2, 0x09, 0xf3, 0x09, 0xf4, 0x09, 0xf5, 0x09, 0xf6, - 0x09, 0xf7, 0x09, 0xf8, 0x09, 0xf9, 0x09, 0xfa, 0x09, 0xfb, 0x09, 0xfc, - 0x09, 0xfd, 0x09, 0xfe, 0x09, 0xff, 0x0a, 0x00, 0x0a, 0x01, 0x0a, 0x02, - 0x0a, 0x03, 0x0a, 0x04, 0x0a, 0x05, 0x0a, 0x06, 0x0a, 0x07, 0x0a, 0x08, - 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0c, 0x0a, 0x0d, 0x0a, 0x0e, - 0x0a, 0x0f, 0x0a, 0x10, 0x0a, 0x11, 0x0a, 0x12, 0x0a, 0x13, 0x0a, 0x14, - 0x0a, 0x15, 0x0a, 0x16, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x0a, 0x1a, - 0x0a, 0x1b, 0x0a, 0x1c, 0x0a, 0x1d, 0x0a, 0x1e, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x30, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, 0x44, - 0x09, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x03, 0x6d, - 0x75, 0x31, 0x06, 0x6d, 0x69, 0x64, 0x64, 0x6f, 0x74, 0x07, 0x41, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x61, 0x6d, 0x61, 0x63, 0x72, 0x6f, - 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x61, 0x62, 0x72, - 0x65, 0x76, 0x65, 0x07, 0x41, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, - 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x63, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x43, 0x64, 0x6f, 0x74, - 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x63, 0x64, 0x6f, 0x74, 0x61, - 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, - 0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, 0x72, 0x6f, - 0x61, 0x74, 0x07, 0x45, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x65, - 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x06, 0x65, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, - 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, - 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, - 0x65, 0x6b, 0x07, 0x65, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x45, - 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, - 0x0b, 0x47, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x0b, 0x67, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x0a, 0x47, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, - 0x67, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x47, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, - 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, - 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x04, 0x48, 0x62, 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, 0x49, - 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6c, 0x64, 0x65, - 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, 0x61, - 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, - 0x69, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, 0x6e, - 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x02, 0x49, - 0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, - 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x67, 0x72, 0x65, 0x65, - 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, 0x75, - 0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, - 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, 0x6f, - 0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, - 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, - 0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, - 0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, - 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, - 0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, - 0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x6f, 0x6d, - 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, - 0x06, 0x6f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, - 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, - 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x06, - 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x0c, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, - 0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, - 0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x72, - 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, - 0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x54, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x74, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x54, 0x63, - 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, - 0x54, 0x62, 0x61, 0x72, 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, - 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, - 0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, - 0x62, 0x72, 0x65, 0x76, 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, - 0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, - 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, - 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, - 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, - 0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x0b, 0x79, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, - 0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, - 0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, - 0x74, 0x05, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x31, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x34, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x37, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x41, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x44, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x30, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x34, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x37, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x41, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x44, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x39, 0x46, 0x05, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x6f, 0x68, - 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x32, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x38, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x42, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x45, 0x05, - 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x33, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x36, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x39, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x43, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x46, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x32, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x38, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x42, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x45, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x31, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x34, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x37, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x41, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x44, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x30, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x33, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x36, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x39, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x43, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x46, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x32, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x38, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x39, 0x0a, 0x41, 0x72, 0x69, 0x6e, - 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x07, 0x61, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x4f, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x32, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, - 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x35, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, - 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x38, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, - 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x31, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, - 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x34, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, - 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x37, 0x0c, 0x53, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x73, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x43, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x46, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x32, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x38, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x42, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x45, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x31, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x34, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x32, 0x33, 0x36, 0x09, 0x6a, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, - 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x31, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x34, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x37, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x44, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, - 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x30, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, - 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x33, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, - 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x36, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, - 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x39, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, - 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x43, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, - 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x46, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x32, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, - 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x35, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, - 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x38, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x31, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x34, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x37, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x41, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x44, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, - 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x30, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, - 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x33, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, - 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x36, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, - 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x39, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, - 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x43, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, - 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x46, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x32, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, - 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x35, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, - 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x38, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x31, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x34, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x37, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x41, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x44, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, - 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x30, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, - 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x33, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, - 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x36, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, - 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x39, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, - 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x43, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, - 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x46, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x32, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, - 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x35, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, - 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x31, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, - 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x34, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, - 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x37, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, - 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x30, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, - 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x33, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, - 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, - 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, - 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x43, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, - 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x46, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x32, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, - 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x35, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, - 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x38, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, - 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x42, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x45, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x32, 0x46, 0x46, 0x09, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, - 0x6f, 0x6d, 0x62, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, 0x6f, 0x6d, - 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x09, 0x74, 0x69, - 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x33, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, - 0x33, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x0d, - 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x63, 0x6f, 0x6d, - 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x41, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, - 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x44, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, - 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x30, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, - 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x33, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, - 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x36, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, - 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x39, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, - 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x43, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, - 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x46, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, - 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x32, 0x0c, 0x64, 0x6f, - 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x37, 0x45, 0x05, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0d, 0x64, 0x69, 0x65, - 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x41, - 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x61, 0x6e, - 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x69, 0x61, 0x0c, 0x45, 0x70, 0x73, 0x69, - 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, - 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, - 0x6e, 0x6f, 0x73, 0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, - 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, - 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, - 0x6f, 0x6e, 0x6f, 0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, - 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x41, - 0x6c, 0x70, 0x68, 0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, 0x47, 0x61, - 0x6d, 0x6d, 0x61, 0x07, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, - 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, 0x54, 0x68, 0x65, - 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, 0x61, 0x70, 0x70, - 0x61, 0x06, 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, 0x4d, 0x75, 0x02, - 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, - 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, 0x53, 0x69, 0x67, - 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, 0x73, 0x69, 0x6c, - 0x6f, 0x6e, 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, 0x69, 0x03, 0x50, - 0x73, 0x69, 0x0c, 0x49, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, - 0x73, 0x69, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, - 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0a, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, 0x73, 0x69, 0x6c, - 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, 0x74, 0x61, 0x74, - 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x69, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, - 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, - 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, 0x61, 0x05, 0x67, - 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x65, - 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, 0x74, 0x61, 0x03, - 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, 0x04, 0x69, 0x6f, - 0x74, 0x61, 0x05, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x6c, 0x61, 0x6d, - 0x62, 0x64, 0x61, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, - 0x67, 0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x74, - 0x61, 0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x70, - 0x68, 0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, - 0x6d, 0x65, 0x67, 0x61, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, - 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, - 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x6f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x75, - 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, - 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x33, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, - 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, - 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, - 0x6e, 0x69, 0x30, 0x34, 0x44, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, - 0x30, 0x38, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x34, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x30, 0x35, 0x41, 0x46, 0x05, 0x73, 0x68, 0x65, 0x76, 0x61, 0x0a, 0x68, - 0x61, 0x74, 0x61, 0x66, 0x73, 0x65, 0x67, 0x6f, 0x6c, 0x0a, 0x68, 0x61, - 0x74, 0x61, 0x66, 0x70, 0x61, 0x74, 0x61, 0x68, 0x0b, 0x68, 0x61, 0x74, - 0x61, 0x66, 0x71, 0x61, 0x6d, 0x61, 0x74, 0x73, 0x05, 0x68, 0x69, 0x72, - 0x69, 0x71, 0x05, 0x74, 0x73, 0x65, 0x72, 0x65, 0x05, 0x73, 0x65, 0x67, - 0x6f, 0x6c, 0x05, 0x70, 0x61, 0x74, 0x61, 0x68, 0x06, 0x71, 0x61, 0x6d, - 0x61, 0x74, 0x73, 0x05, 0x68, 0x6f, 0x6c, 0x61, 0x6d, 0x07, 0x75, 0x6e, - 0x69, 0x30, 0x35, 0x42, 0x41, 0x06, 0x71, 0x75, 0x62, 0x75, 0x74, 0x73, - 0x06, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x05, 0x6d, 0x65, 0x74, 0x65, - 0x67, 0x05, 0x6d, 0x61, 0x71, 0x61, 0x66, 0x04, 0x72, 0x61, 0x66, 0x65, - 0x05, 0x70, 0x61, 0x73, 0x65, 0x71, 0x07, 0x73, 0x68, 0x69, 0x6e, 0x64, - 0x6f, 0x74, 0x06, 0x73, 0x69, 0x6e, 0x64, 0x6f, 0x74, 0x08, 0x73, 0x6f, - 0x66, 0x70, 0x61, 0x73, 0x75, 0x71, 0x09, 0x75, 0x70, 0x70, 0x65, 0x72, - 0x5f, 0x64, 0x6f, 0x74, 0x08, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x64, 0x6f, - 0x74, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x43, 0x36, 0x0b, 0x71, 0x61, - 0x6d, 0x61, 0x74, 0x73, 0x71, 0x61, 0x74, 0x61, 0x6e, 0x04, 0x61, 0x6c, - 0x65, 0x66, 0x03, 0x62, 0x65, 0x74, 0x05, 0x67, 0x69, 0x6d, 0x65, 0x6c, - 0x05, 0x64, 0x61, 0x6c, 0x65, 0x74, 0x02, 0x68, 0x65, 0x03, 0x76, 0x61, - 0x76, 0x05, 0x7a, 0x61, 0x79, 0x69, 0x6e, 0x03, 0x68, 0x65, 0x74, 0x03, - 0x74, 0x65, 0x74, 0x03, 0x79, 0x6f, 0x64, 0x08, 0x66, 0x69, 0x6e, 0x61, - 0x6c, 0x6b, 0x61, 0x66, 0x03, 0x6b, 0x61, 0x66, 0x05, 0x6c, 0x61, 0x6d, - 0x65, 0x64, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6d, 0x65, 0x6d, 0x03, - 0x6d, 0x65, 0x6d, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6e, 0x75, 0x6e, - 0x03, 0x6e, 0x75, 0x6e, 0x06, 0x73, 0x61, 0x6d, 0x65, 0x6b, 0x68, 0x04, - 0x61, 0x79, 0x69, 0x6e, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x70, 0x65, - 0x02, 0x70, 0x65, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x74, 0x73, 0x61, - 0x64, 0x69, 0x05, 0x74, 0x73, 0x61, 0x64, 0x69, 0x03, 0x71, 0x6f, 0x66, - 0x04, 0x72, 0x65, 0x73, 0x68, 0x04, 0x73, 0x68, 0x69, 0x6e, 0x03, 0x74, - 0x61, 0x76, 0x06, 0x76, 0x61, 0x76, 0x76, 0x61, 0x76, 0x06, 0x76, 0x61, - 0x76, 0x79, 0x6f, 0x64, 0x06, 0x79, 0x6f, 0x64, 0x79, 0x6f, 0x64, 0x06, - 0x67, 0x65, 0x72, 0x65, 0x73, 0x68, 0x09, 0x67, 0x65, 0x72, 0x73, 0x68, - 0x61, 0x79, 0x69, 0x6d, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x44, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x46, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x37, 0x46, 0x06, 0x57, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, - 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x57, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x06, 0x77, 0x61, 0x63, 0x75, 0x74, 0x65, 0x09, 0x57, 0x64, 0x69, - 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, 0x77, 0x64, 0x69, 0x65, 0x72, - 0x65, 0x73, 0x69, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x45, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x45, 0x09, 0x41, 0x64, 0x6f, - 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x09, 0x61, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x0a, 0x41, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, - 0x6f, 0x76, 0x65, 0x0a, 0x61, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, - 0x76, 0x65, 0x10, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, - 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, 0x10, 0x61, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, - 0x10, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x67, 0x72, 0x61, 0x76, 0x65, 0x10, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, - 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x14, 0x41, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, - 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x14, 0x61, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, 0x6f, 0x6b, 0x61, - 0x62, 0x6f, 0x76, 0x65, 0x10, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x10, 0x61, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, - 0x64, 0x65, 0x13, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, - 0x65, 0x78, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x13, 0x61, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x64, 0x6f, - 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x0b, 0x41, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x61, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x41, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0b, 0x61, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0f, 0x41, 0x62, 0x72, 0x65, 0x76, - 0x65, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0f, 0x61, - 0x62, 0x72, 0x65, 0x76, 0x65, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, - 0x76, 0x65, 0x0b, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x74, 0x69, 0x6c, - 0x64, 0x65, 0x0b, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, 0x74, 0x69, 0x6c, - 0x64, 0x65, 0x0e, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x64, 0x6f, 0x74, - 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x0e, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, - 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x09, 0x45, 0x64, 0x6f, - 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x09, 0x65, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x0a, 0x45, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, - 0x6f, 0x76, 0x65, 0x0a, 0x65, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, - 0x76, 0x65, 0x06, 0x45, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x65, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x10, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, 0x10, 0x65, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, - 0x74, 0x65, 0x10, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, - 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x10, 0x65, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, - 0x14, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x14, 0x65, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, 0x6f, - 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x10, 0x45, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x10, - 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x13, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x13, 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, - 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x0a, 0x49, 0x68, 0x6f, - 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0a, 0x69, 0x68, 0x6f, 0x6f, - 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x09, 0x49, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x09, 0x69, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x09, 0x4f, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x09, 0x6f, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x0a, 0x4f, - 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0a, 0x6f, 0x68, - 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x10, 0x4f, 0x63, 0x69, - 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x10, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x61, 0x63, 0x75, 0x74, 0x65, 0x10, 0x4f, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x10, - 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x67, - 0x72, 0x61, 0x76, 0x65, 0x14, 0x4f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, - 0x65, 0x14, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x10, 0x4f, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, - 0x6c, 0x64, 0x65, 0x10, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, - 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x13, 0x4f, 0x63, 0x69, - 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x13, 0x6f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x0a, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, - 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x4f, - 0x68, 0x6f, 0x72, 0x6e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x6f, 0x68, - 0x6f, 0x72, 0x6e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0e, 0x4f, 0x68, 0x6f, - 0x72, 0x6e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0e, - 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, - 0x76, 0x65, 0x0a, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x74, 0x69, 0x6c, 0x64, - 0x65, 0x0a, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x74, 0x69, 0x6c, 0x64, 0x65, - 0x0d, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x0d, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x09, 0x55, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x09, 0x75, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x0a, 0x55, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0a, - 0x75, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0a, 0x55, - 0x68, 0x6f, 0x72, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x75, 0x68, - 0x6f, 0x72, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x55, 0x68, 0x6f, - 0x72, 0x6e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x75, 0x68, 0x6f, 0x72, - 0x6e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0e, 0x55, 0x68, 0x6f, 0x72, 0x6e, - 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0e, 0x75, 0x68, - 0x6f, 0x72, 0x6e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, - 0x0a, 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x0a, - 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x0d, 0x55, - 0x68, 0x6f, 0x72, 0x6e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x0d, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x79, 0x67, - 0x72, 0x61, 0x76, 0x65, 0x09, 0x59, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x09, 0x79, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x0a, 0x59, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0a, - 0x79, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x06, 0x59, - 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x79, 0x74, 0x69, 0x6c, 0x64, 0x65, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x35, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x42, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x45, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x32, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x31, 0x46, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x36, - 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x64, - 0x62, 0x6c, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x65, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x46, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x30, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x46, - 0x06, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x06, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x34, 0x09, 0x65, - 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x62, 0x6c, 0x09, 0x72, 0x61, 0x64, - 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x41, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x30, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x44, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x30, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x36, 0x46, 0x0c, 0x66, 0x6f, 0x75, 0x72, 0x73, 0x75, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x69, 0x76, 0x65, 0x73, 0x75, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x09, 0x6e, 0x73, 0x75, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x31, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x30, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x34, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x30, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, - 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x32, 0x04, 0x6c, - 0x69, 0x72, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x36, 0x06, 0x70, 0x65, 0x73, 0x65, - 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x30, 0x41, 0x39, 0x06, 0x73, 0x68, 0x65, 0x71, 0x65, - 0x6c, 0x04, 0x64, 0x6f, 0x6e, 0x67, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, - 0x30, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x46, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, - 0x30, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x32, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, - 0x30, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x35, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x30, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, - 0x31, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x33, 0x07, - 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, - 0x31, 0x31, 0x37, 0x03, 0x4f, 0x68, 0x6d, 0x09, 0x65, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, - 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x45, 0x08, 0x6f, 0x6e, - 0x65, 0x74, 0x68, 0x69, 0x72, 0x64, 0x09, 0x74, 0x77, 0x6f, 0x74, 0x68, - 0x69, 0x72, 0x64, 0x73, 0x09, 0x6f, 0x6e, 0x65, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x68, 0x73, 0x0c, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x68, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x34, - 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x07, 0x61, - 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, - 0x6f, 0x77, 0x6e, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, - 0x68, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x0c, - 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x62, 0x73, 0x65, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x32, 0x31, 0x35, 0x0a, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, 0x6f, - 0x6e, 0x61, 0x6c, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x0b, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, - 0x65, 0x6e, 0x63, 0x65, 0x05, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x0d, 0x72, - 0x65, 0x76, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, - 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x70, 0x0a, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x30, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x33, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x36, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x39, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x43, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x35, 0x46, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x32, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x35, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x38, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x42, 0x07, 0x75, - 0x6e, 0x69, 0x32, 0x35, 0x36, 0x43, 0x07, 0x75, 0x70, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x07, 0x64, 0x6e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x05, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x66, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x07, 0x72, 0x74, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x74, 0x73, - 0x68, 0x61, 0x64, 0x65, 0x05, 0x73, 0x68, 0x61, 0x64, 0x65, 0x07, 0x64, - 0x6b, 0x73, 0x68, 0x61, 0x64, 0x65, 0x09, 0x66, 0x69, 0x6c, 0x6c, 0x65, - 0x64, 0x62, 0x6f, 0x78, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x35, 0x41, 0x42, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x72, - 0x65, 0x63, 0x74, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x75, 0x70, 0x07, - 0x74, 0x72, 0x69, 0x61, 0x67, 0x72, 0x74, 0x07, 0x74, 0x72, 0x69, 0x61, - 0x67, 0x64, 0x6e, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x6c, 0x66, 0x06, - 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, - 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x46, 0x09, 0x69, - 0x6e, 0x76, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x09, 0x69, 0x6e, 0x76, - 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x62, - 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x09, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x66, - 0x61, 0x63, 0x65, 0x0c, 0x69, 0x6e, 0x76, 0x73, 0x6d, 0x69, 0x6c, 0x65, - 0x66, 0x61, 0x63, 0x65, 0x03, 0x73, 0x75, 0x6e, 0x06, 0x66, 0x65, 0x6d, - 0x61, 0x6c, 0x65, 0x04, 0x6d, 0x61, 0x6c, 0x65, 0x05, 0x73, 0x70, 0x61, - 0x64, 0x65, 0x04, 0x63, 0x6c, 0x75, 0x62, 0x05, 0x68, 0x65, 0x61, 0x72, - 0x74, 0x07, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x0b, 0x6d, 0x75, - 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x0e, 0x6d, 0x75, - 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x62, 0x6c, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x31, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x34, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x33, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x43, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x36, - 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, - 0x32, 0x45, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x37, - 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, - 0x41, 0x37, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x41, - 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, - 0x41, 0x37, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, - 0x41, 0x37, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x30, - 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x41, 0x37, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x39, - 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, - 0x41, 0x37, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x43, - 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, - 0x46, 0x42, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x31, 0x44, - 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x31, 0x45, 0x0c, 0x79, 0x6f, 0x64, - 0x79, 0x6f, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x61, 0x68, 0x0f, 0x61, 0x6c, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x61, 0x79, 0x69, - 0x6e, 0x08, 0x61, 0x6c, 0x65, 0x66, 0x77, 0x69, 0x64, 0x65, 0x09, 0x64, - 0x61, 0x6c, 0x65, 0x74, 0x77, 0x69, 0x64, 0x65, 0x06, 0x68, 0x65, 0x77, - 0x69, 0x64, 0x65, 0x07, 0x6b, 0x61, 0x66, 0x77, 0x69, 0x64, 0x65, 0x09, - 0x6c, 0x61, 0x6d, 0x65, 0x64, 0x77, 0x69, 0x64, 0x65, 0x0c, 0x66, 0x69, - 0x6e, 0x61, 0x6c, 0x6d, 0x65, 0x6d, 0x77, 0x69, 0x64, 0x65, 0x08, 0x72, - 0x65, 0x73, 0x68, 0x77, 0x69, 0x64, 0x65, 0x07, 0x74, 0x61, 0x76, 0x77, - 0x69, 0x64, 0x65, 0x0c, 0x61, 0x6c, 0x74, 0x5f, 0x70, 0x6c, 0x75, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x0b, 0x73, 0x68, 0x69, 0x6e, 0x73, 0x68, 0x69, - 0x6e, 0x64, 0x6f, 0x74, 0x0a, 0x73, 0x68, 0x69, 0x6e, 0x73, 0x69, 0x6e, - 0x64, 0x6f, 0x74, 0x11, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x61, 0x67, 0x65, - 0x73, 0x68, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x6f, 0x74, 0x10, 0x73, 0x68, - 0x69, 0x6e, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x73, 0x69, 0x6e, 0x64, - 0x6f, 0x74, 0x09, 0x61, 0x6c, 0x65, 0x66, 0x70, 0x61, 0x74, 0x61, 0x68, - 0x0a, 0x61, 0x6c, 0x65, 0x66, 0x71, 0x61, 0x6d, 0x61, 0x74, 0x73, 0x09, - 0x61, 0x6c, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x69, 0x71, 0x09, 0x62, 0x65, - 0x74, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0b, 0x67, 0x69, 0x6d, 0x65, - 0x6c, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0b, 0x64, 0x61, 0x6c, 0x65, - 0x74, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x08, 0x68, 0x65, 0x64, 0x61, - 0x67, 0x65, 0x73, 0x68, 0x09, 0x76, 0x61, 0x76, 0x64, 0x61, 0x67, 0x65, - 0x73, 0x68, 0x0b, 0x7a, 0x61, 0x79, 0x69, 0x6e, 0x64, 0x61, 0x67, 0x65, - 0x73, 0x68, 0x09, 0x74, 0x65, 0x74, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, - 0x09, 0x79, 0x6f, 0x64, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0e, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x6b, 0x61, 0x66, 0x64, 0x61, 0x67, 0x65, 0x73, - 0x68, 0x09, 0x6b, 0x61, 0x66, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0b, - 0x6c, 0x61, 0x6d, 0x65, 0x64, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x09, - 0x6d, 0x65, 0x6d, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x09, 0x6e, 0x75, - 0x6e, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0c, 0x73, 0x61, 0x6d, 0x65, - 0x6b, 0x68, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0d, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x70, 0x65, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x08, 0x70, - 0x65, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x0b, 0x74, 0x73, 0x61, 0x64, - 0x69, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, 0x09, 0x71, 0x6f, 0x66, 0x64, - 0x61, 0x67, 0x65, 0x73, 0x68, 0x0a, 0x72, 0x65, 0x73, 0x68, 0x64, 0x61, - 0x67, 0x65, 0x73, 0x68, 0x0a, 0x73, 0x68, 0x69, 0x6e, 0x64, 0x61, 0x67, - 0x65, 0x73, 0x68, 0x09, 0x74, 0x61, 0x76, 0x64, 0x61, 0x67, 0x65, 0x73, - 0x68, 0x08, 0x76, 0x61, 0x76, 0x68, 0x6f, 0x6c, 0x61, 0x6d, 0x07, 0x62, - 0x65, 0x74, 0x72, 0x61, 0x66, 0x65, 0x07, 0x6b, 0x61, 0x66, 0x72, 0x61, - 0x66, 0x65, 0x06, 0x70, 0x65, 0x72, 0x61, 0x66, 0x65, 0x09, 0x61, 0x6c, - 0x65, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x46, - 0x45, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x31, 0x07, - 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, - 0x45, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x43, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x09, - 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x79, 0x72, 0x10, 0x63, 0x61, - 0x72, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, - 0x6e, 0x74, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, - 0x6e, 0x74, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x08, 0x67, 0x72, 0x61, - 0x76, 0x65, 0x2e, 0x75, 0x63, 0x08, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, - 0x75, 0x63, 0x0d, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, - 0x78, 0x2e, 0x75, 0x63, 0x08, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x75, - 0x63, 0x0b, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x75, - 0x63, 0x08, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x75, 0x63, 0x0f, 0x68, - 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x2e, - 0x75, 0x63, 0x08, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x75, 0x63, 0x0a, - 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x0a, 0x67, - 0x72, 0x61, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x32, 0x0a, 0x67, 0x72, - 0x61, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x33, 0x0a, 0x61, 0x63, 0x75, - 0x74, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x0a, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x32, 0x0a, 0x61, 0x63, 0x75, 0x74, 0x65, - 0x2e, 0x61, 0x6c, 0x74, 0x33, 0x0e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, - 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x0e, 0x68, 0x6f, 0x6f, - 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x32, 0x0e, - 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x6c, - 0x74, 0x33, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, - 0x31, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x32, - 0x0a, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x0f, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x61, - 0x6c, 0x74, 0x31, 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x0a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, - 0x61, 0x6c, 0x74, 0x34, 0x0a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x61, - 0x6c, 0x74, 0x35, 0x0a, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x61, 0x6c, - 0x74, 0x34, 0x0a, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, - 0x35, 0x0e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2e, - 0x61, 0x6c, 0x74, 0x34, 0x0e, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, - 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x35, 0x0a, 0x74, 0x69, 0x6c, 0x64, - 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x33, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, - 0x2e, 0x61, 0x6c, 0x74, 0x34, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, - 0x61, 0x6c, 0x74, 0x35, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, - 0x6c, 0x74, 0x36, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, - 0x74, 0x37, 0x0a, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, - 0x38, 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, - 0x6c, 0x74, 0x32, 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, - 0x2e, 0x61, 0x6c, 0x74, 0x33, 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, - 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x34, 0x0d, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x35, 0x0d, 0x64, 0x6f, - 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x36, 0x0a, - 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x39, 0x0d, 0x64, - 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x37, - 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, - 0x74, 0x38, 0x0d, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, - 0x61, 0x6c, 0x74, 0x39, 0x0e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, - 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x30, 0x0e, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x31, 0x0e, 0x64, - 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x31, - 0x32, 0x0e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, - 0x6c, 0x74, 0x31, 0x33, 0x0e, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, - 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x34, 0x0e, 0x64, 0x6f, 0x74, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x35, 0x0b, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x30, 0x0b, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x31, 0x0b, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x32, 0x0b, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x33, 0x0d, 0x64, - 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x69, 0x2e, 0x61, 0x6c, 0x74, 0x31, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x34, - 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, - 0x30, 0x33, 0x30, 0x31, 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x43, 0x2e, 0x63, 0x61, 0x70, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x30, - 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x37, - 0x30, 0x33, 0x30, 0x34, 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x34, 0x2e, 0x63, 0x61, 0x70, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x39, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x39, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x39, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x35, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x36, - 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x36, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x37, - 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x37, 0x30, 0x32, 0x45, 0x39, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x35, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x37, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, - 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x38, 0x30, 0x32, 0x45, 0x39, 0x0b, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x35, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x36, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x37, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x39, 0x30, 0x32, 0x45, 0x38, - 0x0f, 0x63, 0x79, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x5f, 0x6f, 0x74, - 0x6d, 0x61, 0x72, 0x6b, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, - 0x30, 0x33, 0x30, 0x30, 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x31, 0x2e, 0x63, 0x61, 0x70, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x31, - 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, - 0x30, 0x33, 0x30, 0x38, 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, - 0x30, 0x33, 0x30, 0x31, 0x30, 0x33, 0x30, 0x37, 0x2e, 0x63, 0x61, 0x70, - 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x43, 0x30, 0x33, 0x30, 0x37, - 0x2e, 0x63, 0x61, 0x70, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, - 0x30, 0x33, 0x30, 0x38, 0x2e, 0x63, 0x61, 0x70, 0x0c, 0x62, 0x61, 0x72, - 0x69, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x31, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, - 0x33, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x31, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, - 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x31, 0x30, 0x33, 0x30, - 0x34, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x31, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, - 0x34, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x31, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, - 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x31, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x31, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, - 0x34, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x31, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, - 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, - 0x34, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, - 0x33, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x39, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, - 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, - 0x34, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, - 0x33, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x39, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, - 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, - 0x34, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, - 0x35, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, - 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, - 0x34, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, - 0x34, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, - 0x35, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, - 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x31, 0x33, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, - 0x33, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, - 0x35, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, - 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, - 0x34, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, - 0x39, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, - 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, - 0x38, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x42, 0x39, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, - 0x35, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, - 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, - 0x38, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x31, 0x13, 0x75, 0x6e, - 0x69, 0x30, 0x33, 0x43, 0x35, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, - 0x36, 0x30, 0x33, 0x30, 0x30, 0x13, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, - 0x35, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, - 0x31, 0x0c, 0x64, 0x6f, 0x74, 0x74, 0x65, 0x64, 0x69, 0x61, 0x63, 0x75, - 0x74, 0x65, 0x08, 0x45, 0x6e, 0x67, 0x2e, 0x61, 0x6c, 0x74, 0x31, 0x08, - 0x45, 0x6e, 0x67, 0x2e, 0x61, 0x6c, 0x74, 0x32, 0x08, 0x45, 0x6e, 0x67, - 0x2e, 0x61, 0x6c, 0x74, 0x33, 0x08, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x61, - 0x6c, 0x74, 0x07, 0x6f, 0x6e, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x07, 0x74, - 0x77, 0x6f, 0x2e, 0x61, 0x6c, 0x74, 0x09, 0x74, 0x68, 0x72, 0x65, 0x65, - 0x2e, 0x61, 0x6c, 0x74, 0x08, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x61, 0x6c, - 0x74, 0x08, 0x66, 0x69, 0x76, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x07, 0x73, - 0x69, 0x78, 0x2e, 0x61, 0x6c, 0x74, 0x09, 0x73, 0x65, 0x76, 0x65, 0x6e, - 0x2e, 0x61, 0x6c, 0x74, 0x09, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x61, - 0x6c, 0x74, 0x08, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x61, 0x6c, 0x74, 0x0f, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, - 0x75, 0x74, 0x65, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, - 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0e, 0x63, 0x69, 0x72, 0x63, - 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, 0x6f, 0x6b, 0x0f, 0x63, - 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, - 0x64, 0x65, 0x0a, 0x62, 0x72, 0x65, 0x76, 0x65, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x0a, 0x62, 0x72, 0x65, 0x76, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, - 0x09, 0x62, 0x72, 0x65, 0x76, 0x65, 0x68, 0x6f, 0x6f, 0x6b, 0x0a, 0x62, - 0x72, 0x65, 0x76, 0x65, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x12, 0x63, 0x69, - 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x61, 0x63, 0x75, 0x74, - 0x65, 0x2e, 0x6c, 0x63, 0x12, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, - 0x6c, 0x65, 0x78, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x6c, 0x63, 0x11, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x68, 0x6f, - 0x6f, 0x6b, 0x2e, 0x6c, 0x63, 0x12, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, - 0x66, 0x6c, 0x65, 0x78, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x6c, 0x63, - 0x0d, 0x62, 0x72, 0x65, 0x76, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, - 0x6c, 0x63, 0x0d, 0x62, 0x72, 0x65, 0x76, 0x65, 0x67, 0x72, 0x61, 0x76, - 0x65, 0x2e, 0x6c, 0x63, 0x0c, 0x62, 0x72, 0x65, 0x76, 0x65, 0x68, 0x6f, - 0x6f, 0x6b, 0x2e, 0x6c, 0x63, 0x0d, 0x62, 0x72, 0x65, 0x76, 0x65, 0x74, - 0x69, 0x6c, 0x64, 0x65, 0x2e, 0x6c, 0x63, 0x0d, 0x75, 0x6e, 0x69, 0x31, - 0x46, 0x45, 0x46, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x0b, 0x74, 0x6f, - 0x6e, 0x6f, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x10, 0x6c, 0x61, - 0x6d, 0x65, 0x64, 0x68, 0x6f, 0x6c, 0x61, 0x6d, 0x64, 0x61, 0x67, 0x65, - 0x73, 0x68, 0x0a, 0x6c, 0x61, 0x6d, 0x65, 0x64, 0x68, 0x6f, 0x6c, 0x61, - 0x6d, 0x0e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6b, 0x61, 0x66, 0x71, 0x61, - 0x6d, 0x61, 0x74, 0x73, 0x0d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6b, 0x61, - 0x66, 0x73, 0x68, 0x65, 0x76, 0x61, 0x13, 0x61, 0x6c, 0x65, 0x66, 0x6c, - 0x61, 0x6d, 0x65, 0x64, 0x68, 0x61, 0x74, 0x61, 0x66, 0x73, 0x65, 0x67, - 0x6f, 0x6c, 0x0e, 0x61, 0x6c, 0x65, 0x66, 0x6c, 0x61, 0x6d, 0x65, 0x64, - 0x73, 0x65, 0x67, 0x6f, 0x6c, 0x0e, 0x61, 0x6c, 0x65, 0x66, 0x6c, 0x61, - 0x6d, 0x65, 0x64, 0x74, 0x73, 0x65, 0x72, 0x65, 0x10, 0x61, 0x6c, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x61, 0x6d, 0x65, - 0x64, 0x0a, 0x61, 0x6c, 0x65, 0x66, 0x64, 0x61, 0x67, 0x65, 0x73, 0x68, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x42, 0x31, 0x30, 0x35, 0x42, 0x44, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x42, 0x32, 0x30, 0x35, 0x42, 0x44, - 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x42, 0x33, 0x30, 0x35, 0x42, 0x44, - 0x04, 0x53, 0x5f, 0x42, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0xff, 0xff, 0x00, 0x03, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x04, 0xc8, 0x00, 0x01, - 0x04, 0xc9, 0x04, 0xf5, 0x00, 0x03, 0x04, 0xf6, 0x04, 0xf6, 0x00, 0x01, - 0x04, 0xf7, 0x04, 0xf7, 0x00, 0x03, 0x04, 0xf8, 0x04, 0xf8, 0x00, 0x01, - 0x04, 0xf9, 0x04, 0xfd, 0x00, 0x03, 0x04, 0xfe, 0x04, 0xfe, 0x00, 0x01, - 0x04, 0xff, 0x04, 0xff, 0x00, 0x03, 0x05, 0x00, 0x08, 0xc6, 0x00, 0x01, - 0x08, 0xc7, 0x08, 0xc7, 0x00, 0x03, 0x08, 0xc8, 0x08, 0xf2, 0x00, 0x01, - 0x08, 0xf3, 0x08, 0xf3, 0x00, 0x02, 0x08, 0xf4, 0x0a, 0x11, 0x00, 0x01, - 0x0a, 0x12, 0x0a, 0x14, 0x00, 0x02, 0x0a, 0x15, 0x0a, 0x16, 0x00, 0x01, - 0x0a, 0x17, 0x0a, 0x19, 0x00, 0x03, 0x0a, 0x1a, 0x0a, 0x1a, 0x00, 0x01, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x62, - 0x00, 0x96, 0x00, 0x04, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x1a, 0x67, 0x72, - 0x65, 0x6b, 0x00, 0x32, 0x68, 0x65, 0x62, 0x72, 0x00, 0x3e, 0x6c, 0x61, - 0x74, 0x6e, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, - 0x00, 0x10, 0x53, 0x52, 0x42, 0x20, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x63, 0x63, 0x6d, 0x70, - 0x00, 0x1a, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x20, 0x64, 0x6c, 0x69, 0x67, - 0x00, 0x28, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x0e, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x34, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x44, - 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x02, 0x06, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x40, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x07, 0xac, - 0x00, 0x01, 0x00, 0x06, 0x06, 0x38, 0x00, 0x01, 0x00, 0x01, 0x03, 0xe2, - 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, - 0x08, 0xf3, 0x00, 0x02, 0x05, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x05, 0x00, - 0x00, 0x01, 0x01, 0x9c, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4c, - 0x00, 0x56, 0x00, 0x60, 0x00, 0x6a, 0x00, 0x74, 0x00, 0x7e, 0x00, 0x88, - 0x00, 0x9a, 0x00, 0xa4, 0x00, 0xae, 0x00, 0xc0, 0x00, 0xda, 0x00, 0xe4, - 0x01, 0x00, 0x01, 0x0a, 0x01, 0x14, 0x01, 0x1e, 0x01, 0x28, 0x01, 0x32, - 0x01, 0x3c, 0x01, 0x46, 0x01, 0x50, 0x01, 0x92, 0x00, 0x01, 0x00, 0x04, - 0x0a, 0x17, 0x00, 0x02, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x04, 0x0a, 0x18, - 0x00, 0x02, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x04, 0x0a, 0x19, 0x00, 0x02, - 0x04, 0xf5, 0x00, 0x01, 0x00, 0x04, 0x0a, 0x16, 0x00, 0x02, 0x04, 0xf4, - 0x00, 0x01, 0x00, 0x04, 0x08, 0xda, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, - 0x00, 0x04, 0x08, 0xdb, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, - 0x08, 0xdc, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xdd, - 0x00, 0x02, 0x04, 0xf4, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x08, 0xef, - 0x00, 0x02, 0x04, 0xf1, 0x08, 0xde, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, - 0x00, 0x04, 0x08, 0xdf, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, - 0x08, 0xe0, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, - 0x08, 0xe1, 0x00, 0x02, 0x04, 0xf4, 0x08, 0xc6, 0x00, 0x02, 0x04, 0xec, - 0x00, 0x03, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x14, 0x0a, 0x11, 0x00, 0x02, - 0x04, 0xe8, 0x0a, 0x10, 0x00, 0x02, 0x04, 0xf0, 0x08, 0xe2, 0x00, 0x02, - 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xe3, 0x00, 0x02, 0x04, 0xf4, - 0x00, 0x03, 0x00, 0x08, 0x00, 0x10, 0x00, 0x16, 0x0a, 0x0e, 0x00, 0x03, - 0x04, 0xf4, 0x04, 0xf1, 0x0a, 0x0f, 0x00, 0x02, 0x04, 0xf1, 0x08, 0xe4, - 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xe5, 0x00, 0x02, - 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xe6, 0x00, 0x02, 0x04, 0xf4, - 0x00, 0x01, 0x00, 0x04, 0x08, 0xe7, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, - 0x00, 0x04, 0x08, 0xe8, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, - 0x08, 0xe9, 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xea, - 0x00, 0x02, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xeb, 0x00, 0x02, - 0x04, 0xf4, 0x00, 0x01, 0x00, 0x04, 0x08, 0xec, 0x00, 0x02, 0x04, 0xf4, - 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, - 0x00, 0x36, 0x00, 0x3c, 0x08, 0xd6, 0x00, 0x03, 0x04, 0xfa, 0x04, 0xf4, - 0x08, 0xd6, 0x00, 0x03, 0x04, 0xf4, 0x04, 0xfa, 0x08, 0xd5, 0x00, 0x03, - 0x04, 0xf9, 0x04, 0xf4, 0x08, 0xd5, 0x00, 0x03, 0x04, 0xf4, 0x04, 0xf9, - 0x08, 0xed, 0x00, 0x02, 0x04, 0xf4, 0x08, 0xd4, 0x00, 0x02, 0x04, 0xfa, - 0x08, 0xd3, 0x00, 0x02, 0x04, 0xf9, 0x00, 0x01, 0x00, 0x04, 0x08, 0xee, - 0x00, 0x02, 0x04, 0xf4, 0x00, 0x02, 0x00, 0x07, 0x04, 0xe9, 0x04, 0xeb, - 0x00, 0x00, 0x05, 0x00, 0x05, 0x06, 0x00, 0x03, 0x05, 0x08, 0x05, 0x0c, - 0x00, 0x0a, 0x05, 0x0e, 0x05, 0x0e, 0x00, 0x0f, 0x05, 0x10, 0x05, 0x11, - 0x00, 0x10, 0x05, 0x13, 0x05, 0x14, 0x00, 0x12, 0x05, 0x16, 0x05, 0x1a, - 0x00, 0x14, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x22, - 0x00, 0x01, 0x00, 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, - 0x00, 0x05, 0x05, 0x00, 0x05, 0x01, 0x05, 0x0b, 0x05, 0x14, 0x05, 0x1d, - 0x00, 0x01, 0x00, 0x03, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf7, 0x00, 0x02, - 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x01, 0x05, 0x6a, - 0x00, 0x05, 0x00, 0x10, 0x01, 0x22, 0x02, 0x34, 0x03, 0x46, 0x04, 0x58, - 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, - 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, - 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, - 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, - 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x09, 0x53, - 0x00, 0x03, 0x02, 0xab, 0x02, 0xab, 0x09, 0x52, 0x00, 0x03, 0x02, 0xab, - 0x02, 0xaa, 0x09, 0x51, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa9, 0x09, 0x50, - 0x00, 0x03, 0x02, 0xab, 0x02, 0xa8, 0x09, 0x4f, 0x00, 0x03, 0x02, 0xab, - 0x02, 0xa7, 0x09, 0x4d, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xab, 0x09, 0x4c, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xaa, 0x09, 0x4b, 0x00, 0x03, 0x02, 0xaa, - 0x02, 0xa9, 0x09, 0x4a, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa8, 0x09, 0x49, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa7, 0x09, 0x47, 0x00, 0x03, 0x02, 0xa9, - 0x02, 0xab, 0x09, 0x46, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xaa, 0x09, 0x45, - 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa9, 0x09, 0x44, 0x00, 0x03, 0x02, 0xa9, - 0x02, 0xa8, 0x09, 0x43, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa7, 0x09, 0x41, - 0x00, 0x03, 0x02, 0xa8, 0x02, 0xab, 0x09, 0x40, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xaa, 0x09, 0x3f, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa9, 0x09, 0x3e, - 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa8, 0x09, 0x3d, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xa7, 0x09, 0x3c, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xab, 0x09, 0x3b, - 0x00, 0x03, 0x02, 0xa7, 0x02, 0xaa, 0x09, 0x3a, 0x00, 0x03, 0x02, 0xa7, - 0x02, 0xa9, 0x09, 0x39, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa8, 0x09, 0x4e, - 0x00, 0x02, 0x02, 0xaa, 0x09, 0x54, 0x00, 0x02, 0x02, 0xab, 0x09, 0x42, - 0x00, 0x02, 0x02, 0xa8, 0x09, 0x48, 0x00, 0x02, 0x02, 0xa9, 0x00, 0x1c, - 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, - 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, - 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, - 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, - 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x09, 0x6f, 0x00, 0x03, - 0x02, 0xab, 0x02, 0xab, 0x09, 0x6e, 0x00, 0x03, 0x02, 0xab, 0x02, 0xaa, - 0x09, 0x6d, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa9, 0x09, 0x6c, 0x00, 0x03, - 0x02, 0xab, 0x02, 0xa8, 0x09, 0x6b, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa7, - 0x09, 0x69, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xab, 0x09, 0x68, 0x00, 0x03, - 0x02, 0xaa, 0x02, 0xaa, 0x09, 0x67, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa9, - 0x09, 0x66, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa8, 0x09, 0x65, 0x00, 0x03, - 0x02, 0xaa, 0x02, 0xa7, 0x09, 0x63, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xab, - 0x09, 0x62, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xaa, 0x09, 0x61, 0x00, 0x03, - 0x02, 0xa9, 0x02, 0xa9, 0x09, 0x60, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa8, - 0x09, 0x5f, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa7, 0x09, 0x5e, 0x00, 0x03, - 0x02, 0xa8, 0x02, 0xab, 0x09, 0x5d, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xaa, - 0x09, 0x5c, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa9, 0x09, 0x5b, 0x00, 0x03, - 0x02, 0xa8, 0x02, 0xa7, 0x09, 0x59, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xab, - 0x09, 0x58, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xaa, 0x09, 0x57, 0x00, 0x03, - 0x02, 0xa7, 0x02, 0xa9, 0x09, 0x56, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa8, - 0x09, 0x55, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa7, 0x09, 0x70, 0x00, 0x02, - 0x02, 0xab, 0x09, 0x64, 0x00, 0x02, 0x02, 0xa9, 0x09, 0x5a, 0x00, 0x02, - 0x02, 0xa7, 0x09, 0x6a, 0x00, 0x02, 0x02, 0xaa, 0x00, 0x1c, 0x00, 0x3a, - 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, - 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, - 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, - 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, - 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x09, 0x8b, 0x00, 0x03, 0x02, 0xab, - 0x02, 0xab, 0x09, 0x8a, 0x00, 0x03, 0x02, 0xab, 0x02, 0xaa, 0x09, 0x89, - 0x00, 0x03, 0x02, 0xab, 0x02, 0xa9, 0x09, 0x88, 0x00, 0x03, 0x02, 0xab, - 0x02, 0xa8, 0x09, 0x87, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa7, 0x09, 0x85, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xab, 0x09, 0x84, 0x00, 0x03, 0x02, 0xaa, - 0x02, 0xaa, 0x09, 0x83, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa9, 0x09, 0x82, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa8, 0x09, 0x81, 0x00, 0x03, 0x02, 0xaa, - 0x02, 0xa7, 0x09, 0x80, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xab, 0x09, 0x7f, - 0x00, 0x03, 0x02, 0xa9, 0x02, 0xaa, 0x09, 0x7e, 0x00, 0x03, 0x02, 0xa9, - 0x02, 0xa8, 0x09, 0x7d, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa7, 0x09, 0x7b, - 0x00, 0x03, 0x02, 0xa8, 0x02, 0xab, 0x09, 0x7a, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xaa, 0x09, 0x79, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa9, 0x09, 0x78, - 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa8, 0x09, 0x77, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xa7, 0x09, 0x75, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xab, 0x09, 0x74, - 0x00, 0x03, 0x02, 0xa7, 0x02, 0xaa, 0x09, 0x73, 0x00, 0x03, 0x02, 0xa7, - 0x02, 0xa9, 0x09, 0x72, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa8, 0x09, 0x71, - 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa7, 0x09, 0x86, 0x00, 0x02, 0x02, 0xaa, - 0x09, 0x8c, 0x00, 0x02, 0x02, 0xab, 0x09, 0x76, 0x00, 0x02, 0x02, 0xa7, - 0x09, 0x7c, 0x00, 0x02, 0x02, 0xa8, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x42, - 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, - 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, - 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, - 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x00, - 0x01, 0x06, 0x01, 0x0c, 0x09, 0xa7, 0x00, 0x03, 0x02, 0xab, 0x02, 0xab, - 0x09, 0xa6, 0x00, 0x03, 0x02, 0xab, 0x02, 0xaa, 0x09, 0xa5, 0x00, 0x03, - 0x02, 0xab, 0x02, 0xa9, 0x09, 0xa4, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa8, - 0x09, 0xa3, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa7, 0x09, 0xa2, 0x00, 0x03, - 0x02, 0xaa, 0x02, 0xab, 0x09, 0xa1, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa9, - 0x09, 0xa0, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa8, 0x09, 0x9f, 0x00, 0x03, - 0x02, 0xaa, 0x02, 0xa7, 0x09, 0x9d, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xab, - 0x09, 0x9c, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xaa, 0x09, 0x9b, 0x00, 0x03, - 0x02, 0xa9, 0x02, 0xa9, 0x09, 0x9a, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa8, - 0x09, 0x99, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa7, 0x09, 0x97, 0x00, 0x03, - 0x02, 0xa8, 0x02, 0xab, 0x09, 0x96, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xaa, - 0x09, 0x95, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa9, 0x09, 0x94, 0x00, 0x03, - 0x02, 0xa8, 0x02, 0xa8, 0x09, 0x93, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa7, - 0x09, 0x91, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xab, 0x09, 0x90, 0x00, 0x03, - 0x02, 0xa7, 0x02, 0xaa, 0x09, 0x8f, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa9, - 0x09, 0x8e, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa8, 0x09, 0x8d, 0x00, 0x03, - 0x02, 0xa7, 0x02, 0xa7, 0x09, 0x9e, 0x00, 0x02, 0x02, 0xa9, 0x09, 0xa8, - 0x00, 0x02, 0x02, 0xab, 0x09, 0x92, 0x00, 0x02, 0x02, 0xa7, 0x09, 0x98, - 0x00, 0x02, 0x02, 0xa8, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, - 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, - 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, - 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, - 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, - 0x01, 0x0c, 0x09, 0xc4, 0x00, 0x03, 0x02, 0xab, 0x02, 0xaa, 0x09, 0xc3, - 0x00, 0x03, 0x02, 0xab, 0x02, 0xa9, 0x09, 0xc2, 0x00, 0x03, 0x02, 0xab, - 0x02, 0xa8, 0x09, 0xc1, 0x00, 0x03, 0x02, 0xab, 0x02, 0xa7, 0x09, 0xbf, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xab, 0x09, 0xbe, 0x00, 0x03, 0x02, 0xaa, - 0x02, 0xaa, 0x09, 0xbd, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa9, 0x09, 0xbc, - 0x00, 0x03, 0x02, 0xaa, 0x02, 0xa8, 0x09, 0xbb, 0x00, 0x03, 0x02, 0xaa, - 0x02, 0xa7, 0x09, 0xb9, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xab, 0x09, 0xb8, - 0x00, 0x03, 0x02, 0xa9, 0x02, 0xaa, 0x09, 0xb7, 0x00, 0x03, 0x02, 0xa9, - 0x02, 0xa9, 0x09, 0xb6, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa8, 0x09, 0xb5, - 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa7, 0x09, 0xb3, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xab, 0x09, 0xb2, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xaa, 0x09, 0xb1, - 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa9, 0x09, 0xb0, 0x00, 0x03, 0x02, 0xa8, - 0x02, 0xa8, 0x09, 0xaf, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa7, 0x09, 0xad, - 0x00, 0x03, 0x02, 0xa7, 0x02, 0xab, 0x09, 0xac, 0x00, 0x03, 0x02, 0xa7, - 0x02, 0xaa, 0x09, 0xab, 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa9, 0x09, 0xaa, - 0x00, 0x03, 0x02, 0xa7, 0x02, 0xa8, 0x09, 0xa9, 0x00, 0x03, 0x02, 0xa7, - 0x02, 0xa7, 0x09, 0xba, 0x00, 0x02, 0x02, 0xa9, 0x09, 0xc0, 0x00, 0x02, - 0x02, 0xaa, 0x09, 0xae, 0x00, 0x02, 0x02, 0xa7, 0x09, 0xb4, 0x00, 0x02, - 0x02, 0xa8, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x4a, 0x00, 0x05, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2c, - 0x00, 0x36, 0x00, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x08, 0xd8, - 0x00, 0x02, 0x04, 0xf0, 0x08, 0xd7, 0x00, 0x02, 0x04, 0xef, 0x00, 0x01, - 0x00, 0x04, 0x08, 0xf0, 0x00, 0x02, 0x04, 0xf7, 0x00, 0x01, 0x00, 0x04, - 0x08, 0xf1, 0x00, 0x02, 0x04, 0xf7, 0x00, 0x01, 0x00, 0x04, 0x08, 0xf2, - 0x00, 0x02, 0x04, 0xf7, 0x00, 0x01, 0x00, 0x04, 0x08, 0xc8, 0x00, 0x02, - 0x04, 0xef, 0x00, 0x01, 0x00, 0x05, 0x05, 0x00, 0x05, 0x01, 0x05, 0x0b, - 0x05, 0x14, 0x05, 0x1d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x62, - 0x00, 0xa6, 0x00, 0x04, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x1a, 0x67, 0x72, - 0x65, 0x6b, 0x00, 0x32, 0x68, 0x65, 0x62, 0x72, 0x00, 0x3e, 0x6c, 0x61, - 0x74, 0x6e, 0x00, 0x4c, 0x00, 0x10, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, - 0x00, 0x10, 0x53, 0x52, 0x42, 0x20, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x6b, 0x65, 0x72, 0x6e, - 0x00, 0x14, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x1a, 0x6d, 0x61, 0x72, 0x6b, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, - 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, - 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, - 0x00, 0x10, 0x00, 0x1a, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, - 0x00, 0x56, 0x00, 0x5e, 0x00, 0x66, 0x00, 0x6e, 0x00, 0x7c, 0x00, 0x8a, - 0x00, 0x98, 0x00, 0xa6, 0x00, 0xae, 0x00, 0xb6, 0x00, 0xbe, 0x00, 0xd4, - 0x00, 0xf4, 0x00, 0xfe, 0x01, 0x06, 0x01, 0x0e, 0x01, 0x16, 0x01, 0x1e, - 0x01, 0x26, 0x01, 0x2e, 0x01, 0x36, 0x01, 0x3e, 0x00, 0x02, 0x00, 0x09, - 0x00, 0x01, 0x01, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x08, 0x18, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x0a, 0xb8, 0x00, 0x04, 0x00, 0x07, - 0x00, 0x01, 0x0a, 0xe4, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x0b, 0x0a, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x0b, 0xda, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x01, 0x11, 0x9a, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x17, 0xc6, - 0x18, 0x18, 0x18, 0x6a, 0x18, 0xbc, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, - 0x19, 0x00, 0x19, 0x78, 0x19, 0xfa, 0x1a, 0x7c, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x04, 0x1a, 0xe6, 0x1b, 0x38, 0x1b, 0x8a, 0x1b, 0xdc, 0x00, 0x08, - 0x00, 0x01, 0x00, 0x04, 0x1c, 0x20, 0x1c, 0xa2, 0x1d, 0x1a, 0x1d, 0x9c, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x1e, 0x06, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x01, 0x20, 0xbe, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x23, 0x6a, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x26, 0x16, 0x26, 0x84, 0x26, 0xde, - 0x27, 0x38, 0x27, 0x92, 0x27, 0xec, 0x28, 0x46, 0x28, 0xa0, 0x00, 0x08, - 0x00, 0x01, 0x00, 0x0d, 0x28, 0xdc, 0x29, 0x0c, 0x29, 0x3c, 0x29, 0x6c, - 0x29, 0x9c, 0x29, 0xcc, 0x29, 0xfc, 0x2a, 0x2c, 0x2a, 0x5c, 0x2a, 0x8c, - 0x2a, 0xbc, 0x2a, 0xec, 0x2b, 0x1c, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, - 0x2b, 0x2c, 0x2b, 0x5a, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x2b, 0x7e, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x3b, 0xbc, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x01, 0x3b, 0xc4, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x3e, 0x70, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x42, 0x30, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x01, 0x45, 0x6c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x49, 0x2c, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x49, 0x34, 0x00, 0x02, 0x00, 0x01, - 0x00, 0x01, 0x49, 0x50, 0x00, 0x01, 0x06, 0xaa, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x31, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0xce, 0x01, 0x7e, - 0x02, 0x2e, 0x02, 0x36, 0x00, 0xce, 0x00, 0x6c, 0x02, 0xe0, 0x03, 0xea, - 0x00, 0x6c, 0x04, 0x4c, 0x02, 0xe0, 0x04, 0xf6, 0x00, 0xce, 0x02, 0x2e, - 0x00, 0x6c, 0x06, 0x06, 0x06, 0x06, 0x00, 0x6c, 0x00, 0xce, 0x00, 0x6c, - 0x02, 0xe0, 0x00, 0xce, 0x00, 0x6c, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0x2e, - 0x02, 0x2e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0xce, - 0x02, 0x2e, 0x00, 0xce, 0x02, 0xe0, 0x02, 0xe0, 0x00, 0xce, 0x02, 0x2e, - 0x00, 0x6c, 0x00, 0x6c, 0x02, 0xe0, 0x04, 0xf6, 0x00, 0xce, 0x00, 0xce, - 0x02, 0xe0, 0x00, 0x6c, 0x00, 0x10, 0x05, 0x0c, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x12, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x17, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x19, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xc9, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xce, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd3, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xd4, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd5, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xd6, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe4, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xeb, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xed, 0xff, 0xd7, 0xff, 0xd7, - 0x0a, 0x0e, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x0f, 0xff, 0xd7, 0xff, 0xd7, - 0x0a, 0x15, 0xff, 0xd7, 0xff, 0xd7, 0x00, 0x1d, 0x05, 0x01, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x02, 0xff, 0x9a, 0xff, 0x9a, 0x05, 0x04, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x06, 0x00, 0x29, 0x00, 0x29, 0x05, 0x07, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x0a, 0xff, 0xc3, 0xff, 0xc3, 0x05, 0x0b, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x0d, 0xff, 0xc3, 0xff, 0xc3, 0x05, 0x0e, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x11, 0xff, 0xc3, 0xff, 0xc3, 0x05, 0x13, 0xff, 0xc3, - 0xff, 0xc3, 0x05, 0x14, 0xff, 0xc3, 0xff, 0xc3, 0x05, 0x1a, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xcc, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xcd, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xcf, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xd1, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xdd, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xe0, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xe3, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xe7, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xe8, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xe9, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xee, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xf0, 0xff, 0xc3, - 0xff, 0xc3, 0x08, 0xf1, 0xff, 0xc3, 0xff, 0xc3, 0x08, 0xf2, 0xff, 0xc3, - 0xff, 0xc3, 0x0a, 0x10, 0xff, 0xc3, 0xff, 0xc3, 0x0a, 0x11, 0xff, 0xc3, - 0xff, 0xc3, 0x00, 0x1d, 0x05, 0x01, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x02, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x03, 0x00, 0x29, 0x00, 0x29, 0x05, 0x04, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x07, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0a, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0b, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0d, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0e, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x11, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x13, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x14, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x1a, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcc, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcd, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcf, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xdd, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe3, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe7, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe8, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe9, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xee, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf1, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf2, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x10, - 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x11, 0xff, 0xd7, 0xff, 0xd7, 0x00, 0x01, - 0x05, 0x02, 0xff, 0xd7, 0xff, 0xd7, 0x00, 0x1c, 0x05, 0x01, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x02, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x04, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x07, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0a, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x0b, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0d, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x0e, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x11, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x13, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x14, 0xff, 0xd7, - 0xff, 0xd7, 0x05, 0x1a, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcc, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xcd, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcf, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xd1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xdd, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xe0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe3, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xe7, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe8, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xe9, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xee, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xf0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf1, 0xff, 0xd7, - 0xff, 0xd7, 0x08, 0xf2, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x10, 0xff, 0xd7, - 0xff, 0xd7, 0x0a, 0x11, 0xff, 0xd7, 0xff, 0xd7, 0x00, 0x2c, 0x05, 0x01, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x02, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x04, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x07, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0a, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0b, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0c, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x0d, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0e, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x11, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x12, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x13, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x14, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x17, 0xff, 0xec, 0xff, 0xec, 0x05, 0x19, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x1a, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xc9, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xcc, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcd, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xce, 0xff, 0xec, 0xff, 0xec, 0x08, 0xcf, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd3, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xd4, 0xff, 0xec, 0xff, 0xec, 0x08, 0xd5, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xd6, 0xff, 0xec, 0xff, 0xec, 0x08, 0xdd, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe3, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe4, 0xff, 0xec, 0xff, 0xec, 0x08, 0xe7, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe8, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe9, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xeb, 0xff, 0xec, 0xff, 0xec, 0x08, 0xed, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xee, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf0, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf2, - 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x0e, 0xff, 0xec, 0xff, 0xec, 0x0a, 0x0f, - 0xff, 0xec, 0xff, 0xec, 0x0a, 0x10, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x11, - 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x15, 0xff, 0xec, 0xff, 0xec, 0x00, 0x10, - 0x05, 0x0c, 0xff, 0xec, 0xff, 0xec, 0x05, 0x12, 0xff, 0xec, 0xff, 0xec, - 0x05, 0x17, 0xff, 0xec, 0xff, 0xec, 0x05, 0x19, 0xff, 0xec, 0xff, 0xec, - 0x08, 0xc9, 0xff, 0xec, 0xff, 0xec, 0x08, 0xce, 0xff, 0xec, 0xff, 0xec, - 0x08, 0xd3, 0xff, 0xec, 0xff, 0xec, 0x08, 0xd4, 0xff, 0xec, 0xff, 0xec, - 0x08, 0xd5, 0xff, 0xec, 0xff, 0xec, 0x08, 0xd6, 0xff, 0xec, 0xff, 0xec, - 0x08, 0xe4, 0xff, 0xec, 0xff, 0xec, 0x08, 0xeb, 0xff, 0xec, 0xff, 0xec, - 0x08, 0xed, 0xff, 0xec, 0xff, 0xec, 0x0a, 0x0e, 0xff, 0xec, 0xff, 0xec, - 0x0a, 0x0f, 0xff, 0xec, 0xff, 0xec, 0x0a, 0x15, 0xff, 0xec, 0xff, 0xec, - 0x00, 0x1c, 0x05, 0x01, 0xff, 0xec, 0xff, 0xec, 0x05, 0x04, 0xff, 0xec, - 0xff, 0xec, 0x05, 0x06, 0x00, 0x29, 0x00, 0x29, 0x05, 0x07, 0xff, 0xec, - 0xff, 0xec, 0x05, 0x0a, 0xff, 0xec, 0xff, 0xec, 0x05, 0x0b, 0xff, 0xec, - 0xff, 0xec, 0x05, 0x0d, 0xff, 0xec, 0xff, 0xec, 0x05, 0x0e, 0xff, 0xec, - 0xff, 0xec, 0x05, 0x11, 0xff, 0xec, 0xff, 0xec, 0x05, 0x13, 0xff, 0xec, - 0xff, 0xec, 0x05, 0x14, 0xff, 0xec, 0xff, 0xec, 0x05, 0x1a, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xcc, 0xff, 0xec, 0xff, 0xec, 0x08, 0xcd, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xcf, 0xff, 0xec, 0xff, 0xec, 0x08, 0xd1, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xdd, 0xff, 0xec, 0xff, 0xec, 0x08, 0xe0, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xe3, 0xff, 0xec, 0xff, 0xec, 0x08, 0xe7, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xe8, 0xff, 0xec, 0xff, 0xec, 0x08, 0xe9, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xee, 0xff, 0xec, 0xff, 0xec, 0x08, 0xf0, 0xff, 0xec, - 0xff, 0xec, 0x08, 0xf1, 0xff, 0xec, 0xff, 0xec, 0x08, 0xf2, 0xff, 0xec, - 0xff, 0xec, 0x0a, 0x10, 0xff, 0xec, 0xff, 0xec, 0x0a, 0x11, 0xff, 0xec, - 0xff, 0xec, 0x00, 0x2d, 0x05, 0x01, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x02, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x04, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x07, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x08, 0xff, 0xec, 0xff, 0xec, 0x05, 0x0a, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0b, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0c, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x0d, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0e, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x11, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x12, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x13, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x14, - 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x17, 0xff, 0xec, 0xff, 0xec, 0x05, 0x19, - 0xff, 0xec, 0xff, 0xec, 0x05, 0x1a, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xc9, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xcc, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcd, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xce, 0xff, 0xec, 0xff, 0xec, 0x08, 0xcf, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xd3, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xd4, 0xff, 0xec, 0xff, 0xec, 0x08, 0xd5, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xd6, 0xff, 0xec, 0xff, 0xec, 0x08, 0xdd, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe3, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe4, 0xff, 0xec, 0xff, 0xec, 0x08, 0xe7, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe8, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe9, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xeb, 0xff, 0xec, 0xff, 0xec, 0x08, 0xed, - 0xff, 0xec, 0xff, 0xec, 0x08, 0xee, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf0, - 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf2, - 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x0e, 0xff, 0xec, 0xff, 0xec, 0x0a, 0x0f, - 0xff, 0xec, 0xff, 0xec, 0x0a, 0x10, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x11, - 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x15, 0xff, 0xec, 0xff, 0xec, 0x00, 0x1b, - 0x05, 0x01, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x04, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x07, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0a, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x0b, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x0d, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x0e, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x11, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x13, 0xff, 0xd7, 0xff, 0xd7, 0x05, 0x14, 0xff, 0xd7, 0xff, 0xd7, - 0x05, 0x1a, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcc, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xcd, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xcf, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xd1, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xdd, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xe0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe3, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xe7, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xe8, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xe9, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xee, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xf0, 0xff, 0xd7, 0xff, 0xd7, 0x08, 0xf1, 0xff, 0xd7, 0xff, 0xd7, - 0x08, 0xf2, 0xff, 0xd7, 0xff, 0xd7, 0x0a, 0x10, 0xff, 0xd7, 0xff, 0xd7, - 0x0a, 0x11, 0xff, 0xd7, 0xff, 0xd7, 0x00, 0x01, 0x00, 0x31, 0x05, 0x00, - 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x06, 0x05, 0x08, 0x05, 0x09, - 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0e, 0x05, 0x10, 0x05, 0x11, - 0x05, 0x13, 0x05, 0x15, 0x05, 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1c, - 0x05, 0x1d, 0x08, 0xca, 0x08, 0xcb, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xd0, - 0x08, 0xd1, 0x08, 0xd3, 0x08, 0xd4, 0x08, 0xd5, 0x08, 0xd6, 0x08, 0xd7, - 0x08, 0xd8, 0x08, 0xd9, 0x08, 0xda, 0x08, 0xdc, 0x08, 0xe0, 0x08, 0xe2, - 0x08, 0xe4, 0x08, 0xe8, 0x08, 0xec, 0x08, 0xed, 0x08, 0xee, 0x08, 0xf0, - 0x0a, 0x0e, 0x0a, 0x0f, 0x0a, 0x10, 0x0a, 0x11, 0x0a, 0x15, 0x0a, 0x16, - 0x00, 0x01, 0x02, 0x96, 0x02, 0x6e, 0x00, 0x01, 0x02, 0x9c, 0x00, 0x0c, - 0x00, 0x4c, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, - 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, - 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, - 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, - 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, - 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, - 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, - 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, - 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, - 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, - 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, - 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, - 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x01, 0x04, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0xff, 0x7e, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x50, 0x05, 0x96, 0x00, 0x01, 0x00, 0x50, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x64, 0x05, 0xa1, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0xff, 0x7e, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0xff, 0xb0, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0xff, 0xb0, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0xff, 0x7e, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0xff, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x3c, 0x05, 0x96, 0x00, 0x01, - 0xfe, 0xd4, 0x05, 0x96, 0x00, 0x01, 0xfe, 0xd4, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x02, - 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, - 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, - 0x00, 0x48, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf1, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x03, 0x00, 0x01, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf1, 0x00, 0x02, 0x00, 0x04, - 0x05, 0x00, 0x05, 0x04, 0x00, 0x00, 0x05, 0x06, 0x05, 0x1a, 0x00, 0x05, - 0x05, 0x1c, 0x05, 0x1d, 0x00, 0x1a, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1c, - 0x00, 0x01, 0x00, 0x1c, 0x00, 0x16, 0x00, 0x01, 0x00, 0x22, 0x00, 0x0c, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x02, 0x58, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x01, 0x08, 0x8d, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf9, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0xc6, 0x00, 0x9e, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, 0x12, - 0x00, 0x26, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x44, - 0x00, 0x4a, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5c, 0x00, 0x62, 0x00, 0x68, - 0x00, 0x6e, 0x00, 0x74, 0x00, 0x7a, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8c, - 0x00, 0x01, 0x02, 0x8a, 0x02, 0xbc, 0x00, 0x01, 0x02, 0xa8, 0x02, 0x80, - 0x00, 0x01, 0xff, 0xce, 0x02, 0xbc, 0x00, 0x01, 0x02, 0x94, 0x03, 0x20, - 0x00, 0x01, 0x00, 0x78, 0x02, 0x1c, 0x00, 0x01, 0xff, 0xce, 0x02, 0xbc, - 0x00, 0x01, 0xff, 0xce, 0x03, 0x20, 0x00, 0x01, 0xff, 0xce, 0x03, 0x20, - 0x00, 0x01, 0x02, 0x58, 0x02, 0x58, 0x00, 0x01, 0x02, 0x26, 0x01, 0x04, - 0x00, 0x01, 0x01, 0x7c, 0x02, 0xbc, 0x00, 0x01, 0x02, 0x76, 0x02, 0xbc, - 0x00, 0x01, 0x01, 0xb8, 0x02, 0x94, 0x00, 0x01, 0x01, 0xae, 0x02, 0xd0, - 0x00, 0x01, 0x01, 0x9a, 0x02, 0xbc, 0x00, 0x01, 0x02, 0xe4, 0x02, 0xbc, - 0x00, 0x01, 0x03, 0xb6, 0x02, 0x6c, 0x00, 0x01, 0x03, 0xb6, 0x02, 0x6c, - 0x00, 0x01, 0x00, 0x12, 0x05, 0x07, 0x05, 0x0d, 0x05, 0x0f, 0x05, 0x12, - 0x05, 0x15, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, 0x08, 0x8d, 0x08, 0xca, - 0x08, 0xcb, 0x08, 0xcc, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xd1, - 0x08, 0xd3, 0x08, 0xd4, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf4, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x02, 0xbc, 0x00, 0x01, - 0x04, 0xf6, 0x04, 0xce, 0x00, 0x02, 0x05, 0x1c, 0x00, 0x0c, 0x00, 0x4c, - 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x4a, 0x01, 0x50, - 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, 0x01, 0x6e, 0x01, 0x74, - 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, 0x01, 0x92, 0x01, 0x98, - 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, 0x01, 0xb6, 0x01, 0xbc, - 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xda, 0x01, 0xe0, - 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, 0x01, 0xfe, 0x02, 0x04, - 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, 0x02, 0x22, 0x02, 0x28, - 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4c, - 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, 0x02, 0x6a, 0x02, 0x70, - 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, 0x02, 0x8e, 0x02, 0x94, - 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, 0x02, 0xb2, 0x02, 0xb8, - 0x02, 0xbe, 0x02, 0xc4, 0x02, 0xca, 0x02, 0xd0, 0x02, 0xd6, 0x02, 0xdc, - 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xee, 0x02, 0xf4, 0x02, 0xfa, 0x03, 0x00, - 0x03, 0x06, 0x03, 0x0c, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1e, 0x03, 0x24, - 0x03, 0x2a, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3c, 0x03, 0x42, 0x03, 0x48, - 0x03, 0x4e, 0x03, 0x54, 0x03, 0x5a, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6c, - 0x03, 0x72, 0x03, 0x78, 0x03, 0x7e, 0x03, 0x84, 0x03, 0x8a, 0x03, 0x90, - 0x03, 0x96, 0x03, 0x9c, 0x03, 0xa2, 0x03, 0xa8, 0x03, 0xae, 0x03, 0xb4, - 0x03, 0xba, 0x03, 0xc0, 0x03, 0xc6, 0x03, 0xcc, 0x03, 0xd2, 0x03, 0xd8, - 0x03, 0xde, 0x03, 0xe4, 0x03, 0xea, 0x03, 0xf0, 0x03, 0xf6, 0x03, 0xfc, - 0x04, 0x02, 0x04, 0x08, 0x04, 0x0e, 0x04, 0x14, 0x04, 0x1a, 0x04, 0x20, - 0x04, 0x26, 0x04, 0x2c, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3e, 0x04, 0x44, - 0x04, 0x4a, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5c, 0x04, 0x62, 0x04, 0x68, - 0x04, 0x6e, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8c, - 0x04, 0x92, 0x04, 0x98, 0x04, 0x9e, 0x04, 0xa4, 0x04, 0xaa, 0x04, 0xb0, - 0x04, 0xb6, 0x04, 0xbc, 0x00, 0x01, 0x02, 0x9f, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xf4, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x68, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x1c, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, 0x00, 0x01, - 0x03, 0x0c, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x40, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x40, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x80, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x80, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x30, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x30, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x1c, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xf4, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x68, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x1c, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, 0x00, 0x01, - 0x03, 0x0c, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x40, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x40, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x80, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x80, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x30, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x30, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xf8, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xf8, 0x06, 0xa4, 0x00, 0x01, 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, - 0x01, 0x0e, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xf4, 0x06, 0xa4, 0x00, 0x01, - 0x01, 0xf4, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xcc, 0x06, 0xa4, 0x00, 0x01, - 0x01, 0xcc, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x30, 0x06, 0xa4, 0x00, 0x01, - 0x02, 0x30, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x06, 0xa4, 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, - 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, - 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, - 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, 0x00, 0x11, - 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, - 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, - 0x04, 0xe4, 0x04, 0xe7, 0x04, 0xf7, 0x04, 0xfc, 0x08, 0xc7, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x64, - 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x76, - 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x88, - 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x01, 0x00, 0xe6, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0xaa, - 0x05, 0x46, 0x00, 0x01, 0x01, 0x04, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0xa0, - 0x05, 0x46, 0x00, 0x01, 0xff, 0x9c, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x14, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x6e, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x96, 0x00, 0x01, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x96, 0x00, 0x01, 0x04, 0xf6, 0x04, 0xce, 0x00, 0x02, 0x05, 0x2e, - 0x00, 0x0c, 0x00, 0x4c, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, - 0x01, 0x4a, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, - 0x01, 0x6e, 0x01, 0x74, 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, - 0x01, 0x92, 0x01, 0x98, 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, - 0x01, 0xb6, 0x01, 0xbc, 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, - 0x01, 0xda, 0x01, 0xe0, 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, - 0x01, 0xfe, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, - 0x02, 0x22, 0x02, 0x28, 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, - 0x02, 0x46, 0x02, 0x4c, 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, - 0x02, 0x6a, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, - 0x02, 0x8e, 0x02, 0x94, 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, - 0x02, 0xb2, 0x02, 0xb8, 0x02, 0xbe, 0x02, 0xc4, 0x02, 0xca, 0x02, 0xd0, - 0x02, 0xd6, 0x02, 0xdc, 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xee, 0x02, 0xf4, - 0x02, 0xfa, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0c, 0x03, 0x12, 0x03, 0x18, - 0x03, 0x1e, 0x03, 0x24, 0x03, 0x2a, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3c, - 0x03, 0x42, 0x03, 0x48, 0x03, 0x4e, 0x03, 0x54, 0x03, 0x5a, 0x03, 0x60, - 0x03, 0x66, 0x03, 0x6c, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7e, 0x03, 0x84, - 0x03, 0x8a, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9c, 0x03, 0xa2, 0x03, 0xa8, - 0x03, 0xae, 0x03, 0xb4, 0x03, 0xba, 0x03, 0xc0, 0x03, 0xc6, 0x03, 0xcc, - 0x03, 0xd2, 0x03, 0xd8, 0x03, 0xde, 0x03, 0xe4, 0x03, 0xea, 0x03, 0xf0, - 0x03, 0xf6, 0x03, 0xfc, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0e, 0x04, 0x14, - 0x04, 0x1a, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2c, 0x04, 0x32, 0x04, 0x38, - 0x04, 0x3e, 0x04, 0x44, 0x04, 0x4a, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5c, - 0x04, 0x62, 0x04, 0x68, 0x04, 0x6e, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x80, - 0x04, 0x86, 0x04, 0x8c, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9e, 0x04, 0xa4, - 0x04, 0xaa, 0x04, 0xb0, 0x04, 0xb6, 0x04, 0xbc, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x03, 0x3e, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xfc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x03, 0x5c, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x34, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x03, 0x3e, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x03, 0x34, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x03, 0x3e, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x03, 0x5c, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x34, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, - 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, - 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, - 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, - 0x00, 0x01, 0x00, 0x1a, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, - 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, - 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, - 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xfd, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x6a, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, - 0x00, 0x7c, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, - 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, - 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, - 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, - 0x00, 0xc4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, - 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x01, - 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, - 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x01, 0x00, 0xfd, 0x00, 0x00, - 0x00, 0x01, 0xff, 0xe2, 0x00, 0x14, 0x00, 0x01, 0xff, 0xc4, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 0x01, 0x00, 0x1c, - 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x32, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x01, 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x02, - 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x0e, - 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, - 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, - 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x03, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x3c, - 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x01, 0x00, 0x0e, - 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, - 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, - 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x02, 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, - 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, - 0x00, 0x1f, 0x00, 0x03, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, - 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x02, 0x00, 0x03, 0x08, 0xc8, - 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, 0x0a, 0x0e, - 0x0a, 0x11, 0x00, 0x21, 0x00, 0x01, 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, - 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, - 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, - 0x00, 0x03, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x02, - 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x01, 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, - 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, - 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, - 0x00, 0x02, 0x00, 0x03, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, - 0x08, 0xf2, 0x00, 0x01, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, 0x00, 0x03, - 0x00, 0x01, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x60, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, - 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, - 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, - 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, - 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, - 0x00, 0x02, 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, - 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x01, - 0x00, 0x0a, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x00, 0x03, - 0x00, 0x01, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x60, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, - 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, - 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, - 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, - 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, - 0x00, 0x02, 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, - 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x01, - 0x00, 0x0f, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, - 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x03, 0x00, 0x01, - 0x00, 0x4a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x60, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, - 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, - 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, - 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, - 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x02, - 0x00, 0x03, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, - 0x00, 0x01, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, 0x00, 0x01, 0x00, 0x0f, - 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, - 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, - 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x03, 0x00, 0x01, 0x00, 0x4a, - 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x60, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, - 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, - 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, - 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x02, 0x00, 0x03, - 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, - 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, 0x00, 0x01, 0x00, 0x0a, 0x04, 0xc9, - 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, - 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x00, 0x03, 0x00, 0x02, 0x00, 0x34, - 0x00, 0x3c, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x01, 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, - 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, - 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x01, - 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x02, 0x00, 0x03, 0x05, 0x00, - 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xca, - 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x01, 0x00, 0x34, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, - 0x00, 0x01, 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, - 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, - 0x04, 0xe0, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x02, 0x00, 0x03, - 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, - 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x02, 0x04, 0xf7, - 0x08, 0xc7, 0x00, 0x03, 0x00, 0x02, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, - 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, - 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, - 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x01, 0x00, 0x02, 0x04, 0xf7, - 0x08, 0xc7, 0x00, 0x02, 0x00, 0x03, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, - 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, - 0x00, 0x03, 0x00, 0x01, 0x00, 0x34, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, - 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x0e, - 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, - 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, - 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x02, 0x00, 0x03, 0x08, 0xc8, 0x08, 0xc8, - 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, 0x0a, 0x0e, 0x0a, 0x11, - 0x00, 0x21, 0x00, 0x01, 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x03, - 0x00, 0x02, 0x00, 0x4a, 0x00, 0x6c, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, - 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, - 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, - 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, - 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, - 0x00, 0x01, 0x00, 0x0f, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, - 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, - 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x02, - 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x02, - 0x00, 0x4a, 0x00, 0x62, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, - 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, - 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, - 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, - 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x01, - 0x00, 0x0a, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x00, 0x02, - 0x00, 0x03, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x02, - 0x00, 0x4a, 0x00, 0x6c, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, - 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, - 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, - 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, - 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x01, - 0x00, 0x0f, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, - 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x02, 0x00, 0x03, - 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, - 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, 0x00, 0x03, 0x00, 0x02, 0x00, 0x4a, - 0x00, 0x62, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, - 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, - 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, - 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x01, 0x00, 0x0a, - 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, - 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x00, 0x02, 0x00, 0x03, - 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x00, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x01, - 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x21, 0x00, 0x01, 0x02, 0x96, 0x02, 0x6e, - 0x00, 0x01, 0x02, 0xa0, 0x00, 0x0c, 0x00, 0x4c, 0x00, 0x9a, 0x00, 0xa0, - 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, - 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, - 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, - 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, - 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, - 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, - 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, - 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, - 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, - 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, - 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, - 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, - 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0x64, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xf0, 0x05, 0x46, 0x00, 0x01, 0xff, 0x4c, 0x05, 0x46, 0x00, 0x01, - 0xff, 0x4c, 0x05, 0x46, 0x00, 0x01, 0x00, 0x8c, 0x05, 0x46, 0x00, 0x01, - 0x00, 0x8c, 0x05, 0x46, 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, - 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, - 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, - 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, 0x00, 0x03, - 0x04, 0xd1, 0x04, 0xe1, 0x04, 0xe6, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, - 0x05, 0x46, 0x00, 0x01, 0x02, 0x96, 0x02, 0x6e, 0x00, 0x01, 0x02, 0x9e, - 0x00, 0x0c, 0x00, 0x4c, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, - 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, - 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, - 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, - 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, - 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, - 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, - 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, - 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, - 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, - 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, - 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, - 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xcc, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x5c, 0x05, 0x46, 0x00, 0x01, 0x05, 0x14, 0x05, 0x46, - 0x00, 0x01, 0x04, 0x4c, 0x05, 0x46, 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0x0c, 0x05, 0x46, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x5c, 0x05, 0x46, 0x00, 0x01, 0x04, 0x4c, 0x05, 0x46, - 0x00, 0x01, 0x05, 0xb4, 0x05, 0x46, 0x00, 0x01, 0x05, 0x14, 0x05, 0x46, - 0x00, 0x01, 0x05, 0xb4, 0x05, 0x46, 0x00, 0x01, 0x05, 0x14, 0x05, 0x46, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x46, 0x00, 0x01, 0x04, 0x38, 0x05, 0x46, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xcc, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, 0x00, 0x01, 0x03, 0x5c, 0x05, 0x46, - 0x00, 0x01, 0x05, 0x14, 0x05, 0x46, 0x00, 0x01, 0x04, 0x4c, 0x05, 0x46, - 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, 0x03, 0x84, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, - 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, - 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, - 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, - 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd5, 0x04, 0xd8, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x96, 0x02, 0x6e, 0x00, 0x01, 0x02, 0x9e, 0x00, 0x0c, 0x00, 0x4c, - 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, - 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, - 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, - 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, - 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, - 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, - 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, - 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, - 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, - 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, - 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, - 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, - 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, 0x04, 0x24, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x48, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, - 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, - 0x00, 0x00, 0x00, 0x01, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x03, 0xfc, - 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x04, 0x10, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x03, 0x5c, - 0x00, 0x00, 0x00, 0x01, 0x04, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x03, 0xe8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x48, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, - 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, - 0x00, 0x00, 0x00, 0x01, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x03, 0xe8, - 0x00, 0x00, 0x00, 0x01, 0x04, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x20, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x04, 0x38, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x48, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf8, - 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x04, 0x10, - 0x00, 0x00, 0x00, 0x01, 0x04, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, - 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, - 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, - 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x02, 0x00, 0x1c, - 0x00, 0x3e, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x01, - 0x00, 0x0f, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, - 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, - 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x01, 0x00, 0x16, - 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, - 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, - 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, - 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, - 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xec, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xe8, 0x00, 0x01, 0x00, 0x16, 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, - 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, - 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, - 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, - 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, - 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xe8, 0x00, 0x01, 0x00, 0x16, - 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, - 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, - 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, - 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, - 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xec, 0x00, 0x01, 0x00, 0x16, 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, - 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, - 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, - 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, - 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, - 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xed, 0x00, 0x01, 0x00, 0x16, - 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, - 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, - 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, - 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, - 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xef, 0x00, 0x01, 0x00, 0x16, 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, - 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, - 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, - 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, - 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, - 0x00, 0x01, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x01, 0x00, 0x16, - 0x05, 0x02, 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, - 0x05, 0x10, 0x05, 0x18, 0x08, 0xcb, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, - 0x08, 0xdc, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, - 0x08, 0xec, 0x08, 0xef, 0x0a, 0x0e, 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x02, - 0x00, 0x1c, 0x00, 0x22, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x16, 0x05, 0x02, - 0x05, 0x03, 0x05, 0x05, 0x05, 0x06, 0x05, 0x09, 0x05, 0x0c, 0x05, 0x10, - 0x05, 0x18, 0x08, 0xcb, 0x08, 0xce, 0x08, 0xd0, 0x08, 0xdb, 0x08, 0xdc, - 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe1, 0x08, 0xe4, 0x08, 0xe6, 0x08, 0xec, - 0x08, 0xef, 0x0a, 0x0e, 0x0a, 0x0f, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xec, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdb, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xed, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xed, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdb, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xee, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xd2, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xee, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xce, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xef, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xe8, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xec, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xce, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xd2, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdb, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdc, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x24, - 0x00, 0x2a, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf5, - 0x00, 0x01, 0x00, 0x01, 0x04, 0xf0, 0x00, 0x03, 0x00, 0x02, 0x00, 0x22, - 0x00, 0x28, 0x00, 0x02, 0x00, 0x16, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdc, 0x00, 0x01, - 0x00, 0x01, 0x04, 0xdd, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf1, 0x00, 0x01, - 0x00, 0x01, 0x05, 0x12, 0x00, 0x03, 0x00, 0x02, 0x00, 0x22, 0x00, 0x28, - 0x00, 0x02, 0x00, 0x16, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x19, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdc, 0x00, 0x01, 0x00, 0x01, - 0x04, 0xdd, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf4, 0x00, 0x01, 0x00, 0x01, - 0x05, 0x12, 0x00, 0x01, 0x0f, 0x70, 0x00, 0x04, 0x00, 0x00, 0x00, 0x69, - 0x00, 0xdc, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x32, 0x01, 0x40, 0x01, 0x5e, - 0x01, 0x70, 0x01, 0x82, 0x01, 0xcc, 0x02, 0x02, 0x02, 0x34, 0x02, 0x72, - 0x02, 0x7c, 0x02, 0x8a, 0x02, 0x94, 0x02, 0x8a, 0x02, 0x9e, 0x02, 0xc4, - 0x02, 0xca, 0x03, 0x1c, 0x03, 0x26, 0x03, 0x54, 0x03, 0x76, 0x03, 0x90, - 0x03, 0xa6, 0x03, 0xe4, 0x03, 0xfe, 0x04, 0x14, 0x04, 0x2e, 0x04, 0x38, - 0x04, 0xbe, 0x05, 0x2c, 0x05, 0x3a, 0x03, 0x1c, 0x05, 0x64, 0x05, 0xba, - 0x05, 0xcc, 0x06, 0x16, 0x06, 0x1c, 0x06, 0x52, 0x06, 0x88, 0x05, 0xba, - 0x06, 0xb2, 0x06, 0xd8, 0x06, 0xe6, 0x05, 0xba, 0x07, 0x10, 0x05, 0xba, - 0x05, 0xba, 0x05, 0xba, 0x07, 0x3e, 0x07, 0x54, 0x07, 0x5a, 0x07, 0x60, - 0x07, 0xa6, 0x07, 0xe0, 0x08, 0x36, 0x08, 0xa8, 0x08, 0xc2, 0x08, 0xcc, - 0x08, 0xf6, 0x09, 0x18, 0x09, 0x2e, 0x09, 0x3c, 0x09, 0x62, 0x09, 0x90, - 0x09, 0xf2, 0x0a, 0x30, 0x0a, 0xae, 0x0b, 0x48, 0x0b, 0x6a, 0x0b, 0x88, - 0x0b, 0x92, 0x0b, 0x9c, 0x0b, 0xa6, 0x0b, 0xe0, 0x0c, 0x0e, 0x0c, 0x40, - 0x0c, 0x52, 0x0c, 0x90, 0x0c, 0xd2, 0x0c, 0xfc, 0x0d, 0x06, 0x0d, 0x2c, - 0x0d, 0x3e, 0x0d, 0x6c, 0x0d, 0x96, 0x0d, 0xa0, 0x0d, 0xae, 0x0d, 0xd0, - 0x0d, 0xf2, 0x0e, 0x04, 0x0e, 0x2e, 0x0e, 0x70, 0x0e, 0x8e, 0x0e, 0xb4, - 0x0e, 0xc6, 0x0e, 0xd4, 0x0e, 0xde, 0x0f, 0x00, 0x0f, 0x1e, 0x0f, 0x28, - 0x0f, 0x46, 0x0f, 0x4c, 0x0f, 0x5a, 0x00, 0x0a, 0x00, 0x24, 0xff, 0x8f, - 0x00, 0x37, 0xff, 0xdb, 0x00, 0x3c, 0xff, 0xdb, 0x03, 0x3b, 0xff, 0x8f, - 0x03, 0x44, 0xff, 0x8f, 0x03, 0x47, 0xff, 0x8f, 0x03, 0x4e, 0xff, 0x8f, - 0x03, 0x56, 0xff, 0xdb, 0x03, 0x57, 0xff, 0xdb, 0x03, 0x5d, 0xff, 0xdb, - 0x00, 0x01, 0x00, 0x14, 0xff, 0x68, 0x00, 0x09, 0x00, 0x03, 0xff, 0x8f, - 0x00, 0x37, 0xff, 0x68, 0x00, 0x39, 0xff, 0x68, 0x00, 0x3a, 0xff, 0xb4, - 0x00, 0x3c, 0xff, 0x68, 0x00, 0x59, 0xff, 0xdb, 0x00, 0x5a, 0xff, 0xdb, - 0x00, 0x5c, 0xff, 0xdb, 0x07, 0xe4, 0xff, 0x68, 0x00, 0x03, 0x00, 0x0f, - 0xff, 0x1d, 0x00, 0x11, 0xff, 0x1d, 0x00, 0x24, 0xff, 0x8f, 0x00, 0x07, - 0x00, 0x03, 0xff, 0xb4, 0x00, 0x37, 0xff, 0x68, 0x00, 0x39, 0xff, 0x68, - 0x00, 0x3a, 0xff, 0x68, 0x00, 0x3c, 0xff, 0x68, 0x00, 0x5c, 0xff, 0xb4, - 0x07, 0xe4, 0xff, 0x8f, 0x00, 0x04, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, - 0xfe, 0xf8, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x24, 0xff, 0x68, 0x00, 0x04, - 0x00, 0x37, 0xff, 0xdb, 0x00, 0x39, 0xff, 0xdb, 0x00, 0x3a, 0xff, 0xdb, - 0x00, 0x3c, 0xff, 0xdb, 0x00, 0x12, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, - 0xff, 0x1d, 0x00, 0x10, 0xff, 0x8f, 0x00, 0x11, 0xff, 0x1d, 0x00, 0x1d, - 0xff, 0x1d, 0x00, 0x1e, 0xff, 0x1d, 0x00, 0x24, 0xff, 0x68, 0x00, 0x32, - 0xff, 0xdb, 0x00, 0x44, 0xff, 0x1d, 0x00, 0x46, 0xff, 0x1d, 0x00, 0x48, - 0xff, 0x1d, 0x00, 0x4c, 0xff, 0xb4, 0x00, 0x52, 0xff, 0x1d, 0x00, 0x55, - 0xff, 0xb4, 0x00, 0x56, 0xff, 0x1d, 0x00, 0x58, 0xff, 0xb4, 0x00, 0x5a, - 0xff, 0x8f, 0x00, 0x5c, 0xff, 0x8f, 0x00, 0x0d, 0x00, 0x0f, 0xff, 0x44, - 0x00, 0x10, 0xff, 0x8f, 0x00, 0x11, 0xff, 0x44, 0x00, 0x1d, 0xff, 0xb4, - 0x00, 0x1e, 0xff, 0xb4, 0x00, 0x24, 0xff, 0x68, 0x00, 0x44, 0xff, 0x68, - 0x00, 0x48, 0xff, 0x8f, 0x00, 0x4c, 0xff, 0xdb, 0x00, 0x52, 0xff, 0x8f, - 0x00, 0x55, 0xff, 0xb4, 0x00, 0x58, 0xff, 0xb4, 0x00, 0x5c, 0xff, 0xb4, - 0x00, 0x0c, 0x00, 0x0f, 0xff, 0x8f, 0x00, 0x10, 0xff, 0xdb, 0x00, 0x11, - 0xff, 0x8f, 0x00, 0x1d, 0xff, 0xdb, 0x00, 0x1e, 0xff, 0xdb, 0x00, 0x24, - 0xff, 0xb4, 0x00, 0x44, 0xff, 0xb4, 0x00, 0x48, 0xff, 0xdb, 0x00, 0x52, - 0xff, 0xdb, 0x00, 0x55, 0xff, 0xdb, 0x00, 0x58, 0xff, 0xdb, 0x00, 0x5c, - 0xff, 0xee, 0x00, 0x0f, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, 0xfe, 0xf8, - 0x00, 0x10, 0xff, 0x44, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x1d, 0xff, 0x8f, - 0x00, 0x1e, 0xff, 0x7b, 0x00, 0x24, 0xff, 0x68, 0x00, 0x44, 0xff, 0x68, - 0x00, 0x48, 0xff, 0x44, 0x00, 0x4c, 0xff, 0xb4, 0x00, 0x52, 0xff, 0x44, - 0x00, 0x53, 0xff, 0x68, 0x00, 0x54, 0xff, 0x44, 0x00, 0x58, 0xff, 0x8f, - 0x00, 0x59, 0xff, 0x8f, 0x00, 0x02, 0x00, 0x49, 0xff, 0xdb, 0x07, 0xe4, - 0x00, 0x25, 0x00, 0x03, 0x00, 0x0f, 0xff, 0x8f, 0x00, 0x11, 0xff, 0x8f, - 0x07, 0xe4, 0x00, 0x4c, 0x00, 0x02, 0x00, 0x0f, 0xff, 0x68, 0x00, 0x11, - 0xff, 0x68, 0x00, 0x02, 0x00, 0x0f, 0xff, 0x8f, 0x00, 0x11, 0xff, 0x8f, - 0x00, 0x09, 0x03, 0x4b, 0xff, 0xd5, 0x03, 0x52, 0xff, 0xd5, 0x03, 0x56, - 0xff, 0x68, 0x03, 0x57, 0xff, 0x68, 0x03, 0x58, 0xff, 0xc5, 0x03, 0x5d, - 0xff, 0x68, 0x03, 0x65, 0xff, 0xdb, 0x03, 0x6f, 0xff, 0xdb, 0x03, 0x79, - 0xff, 0xdb, 0x00, 0x01, 0x03, 0x57, 0xff, 0xbe, 0x00, 0x14, 0x03, 0x43, - 0x00, 0xaa, 0x03, 0x44, 0xff, 0x68, 0x03, 0x47, 0xff, 0x68, 0x03, 0x4b, - 0xff, 0x8d, 0x03, 0x4e, 0xff, 0x68, 0x03, 0x52, 0xff, 0x8d, 0x03, 0x58, - 0xff, 0x8d, 0x03, 0x5b, 0xff, 0x9e, 0x03, 0x60, 0xff, 0x68, 0x03, 0x61, - 0xff, 0xb4, 0x03, 0x63, 0xff, 0x46, 0x03, 0x69, 0xff, 0x68, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x6c, 0xff, 0x68, 0x03, 0x6e, 0xff, 0x68, 0x03, 0x71, - 0xff, 0x46, 0x03, 0x75, 0xff, 0x46, 0x03, 0x78, 0xff, 0x46, 0x03, 0x7c, - 0x00, 0x62, 0x03, 0x7e, 0xff, 0x46, 0x00, 0x02, 0x03, 0x57, 0xff, 0xd1, - 0x03, 0x5d, 0xff, 0xd1, 0x00, 0x0b, 0x00, 0x03, 0xff, 0x8f, 0x03, 0x4b, - 0xff, 0xd5, 0x03, 0x52, 0xff, 0xd5, 0x03, 0x56, 0xff, 0x68, 0x03, 0x57, - 0xff, 0x68, 0x03, 0x58, 0xff, 0xc5, 0x03, 0x5d, 0xff, 0x68, 0x03, 0x65, - 0xff, 0xdb, 0x03, 0x6f, 0xff, 0xdb, 0x03, 0x79, 0xff, 0xdb, 0x07, 0xe4, - 0xff, 0x68, 0x00, 0x08, 0x00, 0x0f, 0xff, 0x1f, 0x00, 0x11, 0xff, 0x1f, - 0x03, 0x43, 0x00, 0xa4, 0x03, 0x44, 0xff, 0x44, 0x03, 0x47, 0xff, 0x44, - 0x03, 0x4e, 0xff, 0x44, 0x03, 0x6b, 0xff, 0xa8, 0x03, 0x7c, 0x00, 0x58, - 0x00, 0x06, 0x00, 0x03, 0xff, 0x8f, 0x03, 0x4b, 0xff, 0xd5, 0x03, 0x52, - 0xff, 0xd5, 0x03, 0x56, 0xff, 0x89, 0x03, 0x57, 0xff, 0x68, 0x03, 0x5d, - 0xff, 0x68, 0x00, 0x05, 0x03, 0x44, 0xff, 0xdb, 0x03, 0x47, 0xff, 0xdb, - 0x03, 0x4e, 0xff, 0xdb, 0x03, 0x57, 0xff, 0xbe, 0x03, 0x5d, 0xff, 0xbe, - 0x00, 0x0f, 0x03, 0x4b, 0xff, 0xc1, 0x03, 0x52, 0xff, 0xc1, 0x03, 0x58, - 0xff, 0x8f, 0x03, 0x5e, 0xff, 0xe7, 0x03, 0x63, 0xff, 0xe7, 0x03, 0x66, - 0xff, 0xe7, 0x03, 0x68, 0xff, 0xe7, 0x03, 0x6a, 0xff, 0xe7, 0x03, 0x70, - 0xff, 0xe7, 0x03, 0x71, 0xff, 0xe7, 0x03, 0x75, 0xff, 0xe7, 0x03, 0x78, - 0xff, 0xe7, 0x03, 0x7b, 0xff, 0xe7, 0x03, 0x7e, 0xff, 0xe7, 0x03, 0x80, - 0xff, 0xe7, 0x00, 0x06, 0x00, 0x03, 0xff, 0x8f, 0x03, 0x4b, 0xff, 0xd5, - 0x03, 0x52, 0xff, 0xd5, 0x03, 0x56, 0xff, 0x68, 0x03, 0x57, 0xff, 0x68, - 0x03, 0x5d, 0xff, 0x68, 0x00, 0x05, 0x03, 0x44, 0xff, 0xdb, 0x03, 0x47, - 0xff, 0xd5, 0x03, 0x4e, 0xff, 0xdb, 0x03, 0x57, 0xff, 0xbe, 0x03, 0x5d, - 0xff, 0xbe, 0x00, 0x06, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, 0xfe, 0xfa, - 0x00, 0x11, 0xfe, 0xfa, 0x03, 0x44, 0xff, 0x68, 0x03, 0x47, 0xff, 0x68, - 0x03, 0x4e, 0xff, 0x68, 0x00, 0x02, 0x03, 0x72, 0xff, 0x9e, 0x03, 0x76, - 0xff, 0x9e, 0x00, 0x21, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, 0xff, 0x1f, - 0x00, 0x11, 0xff, 0x1f, 0x00, 0x1d, 0xff, 0x1f, 0x00, 0x1e, 0xff, 0x1f, - 0x03, 0x43, 0x00, 0xbc, 0x03, 0x44, 0xff, 0x68, 0x03, 0x47, 0xff, 0x68, - 0x03, 0x4b, 0xff, 0xdb, 0x03, 0x4e, 0xff, 0x68, 0x03, 0x52, 0xff, 0xdb, - 0x03, 0x58, 0xff, 0xdb, 0x03, 0x5b, 0xff, 0xdb, 0x03, 0x5e, 0xff, 0x1f, - 0x03, 0x5f, 0xff, 0x1f, 0x03, 0x62, 0xff, 0x4e, 0x03, 0x63, 0xff, 0x1f, - 0x03, 0x65, 0xff, 0x4e, 0x03, 0x67, 0xff, 0x1f, 0x03, 0x69, 0xff, 0x6a, - 0x03, 0x6b, 0xff, 0xb4, 0x03, 0x6e, 0xff, 0x6a, 0x03, 0x6f, 0xff, 0x8f, - 0x03, 0x71, 0xff, 0x1f, 0x03, 0x75, 0xff, 0x1f, 0x03, 0x77, 0xff, 0x50, - 0x03, 0x78, 0xff, 0x1f, 0x03, 0x79, 0xff, 0x8f, 0x03, 0x7a, 0xff, 0x6a, - 0x03, 0x7c, 0x00, 0xbc, 0x03, 0x7d, 0xff, 0x4e, 0x03, 0x7e, 0xff, 0x1f, - 0x03, 0x7f, 0xff, 0x4e, 0x00, 0x1b, 0x00, 0x03, 0xff, 0xdb, 0x00, 0x0f, - 0xfe, 0xfa, 0x00, 0x10, 0xff, 0x46, 0x00, 0x11, 0xfe, 0xfa, 0x00, 0x1d, - 0xff, 0x8f, 0x00, 0x1e, 0xff, 0x8f, 0x03, 0x43, 0x00, 0xbc, 0x03, 0x44, - 0xff, 0x68, 0x03, 0x47, 0xff, 0x68, 0x03, 0x4b, 0xff, 0x8d, 0x03, 0x4e, - 0xff, 0x68, 0x03, 0x52, 0xff, 0x8d, 0x03, 0x58, 0xff, 0x8d, 0x03, 0x5b, - 0xff, 0x9e, 0x03, 0x60, 0xff, 0x68, 0x03, 0x61, 0xff, 0xb4, 0x03, 0x63, - 0xff, 0x46, 0x03, 0x65, 0xff, 0x9e, 0x03, 0x69, 0xff, 0x68, 0x03, 0x6b, - 0xff, 0xb4, 0x03, 0x6c, 0xff, 0x68, 0x03, 0x6e, 0xff, 0x68, 0x03, 0x71, - 0xff, 0x46, 0x03, 0x75, 0xff, 0x46, 0x03, 0x78, 0xff, 0x46, 0x03, 0x7c, - 0x00, 0x79, 0x03, 0x7e, 0xff, 0x46, 0x00, 0x03, 0x03, 0x44, 0xff, 0xc5, - 0x03, 0x57, 0xff, 0xbe, 0x03, 0x5d, 0xff, 0xbe, 0x00, 0x0a, 0x03, 0x5e, - 0xff, 0xb2, 0x03, 0x63, 0xff, 0xb2, 0x03, 0x66, 0xff, 0xb2, 0x03, 0x6a, - 0xff, 0xd9, 0x03, 0x71, 0xff, 0xb2, 0x03, 0x75, 0xff, 0xb2, 0x03, 0x78, - 0xff, 0xb2, 0x03, 0x7b, 0xff, 0xb2, 0x03, 0x7e, 0xff, 0xb2, 0x03, 0x80, - 0xff, 0xb2, 0x00, 0x15, 0x00, 0x03, 0xff, 0xdb, 0x03, 0x43, 0x00, 0xaa, - 0x03, 0x44, 0xff, 0x68, 0x03, 0x47, 0xff, 0x68, 0x03, 0x4b, 0xff, 0x8d, - 0x03, 0x4e, 0xff, 0x68, 0x03, 0x52, 0xff, 0x8d, 0x03, 0x58, 0xff, 0x8d, - 0x03, 0x5b, 0xff, 0x9e, 0x03, 0x60, 0xff, 0x68, 0x03, 0x61, 0xff, 0xb4, - 0x03, 0x63, 0xff, 0x46, 0x03, 0x69, 0xff, 0x68, 0x03, 0x6b, 0xff, 0xb4, - 0x03, 0x6c, 0xff, 0x68, 0x03, 0x6e, 0xff, 0x68, 0x03, 0x71, 0xff, 0x46, - 0x03, 0x75, 0xff, 0x46, 0x03, 0x78, 0xff, 0x46, 0x03, 0x7c, 0x00, 0x62, - 0x03, 0x7e, 0xff, 0x46, 0x00, 0x04, 0x03, 0x6d, 0xff, 0xd9, 0x03, 0x72, - 0xff, 0xe3, 0x03, 0x76, 0xff, 0xe3, 0x03, 0x79, 0xff, 0xc9, 0x00, 0x12, - 0x03, 0x5e, 0xff, 0x77, 0x03, 0x60, 0xff, 0xdb, 0x03, 0x63, 0xff, 0x77, - 0x03, 0x65, 0xff, 0xaa, 0x03, 0x66, 0xff, 0xb4, 0x03, 0x69, 0xff, 0xdb, - 0x03, 0x6a, 0xff, 0x9e, 0x03, 0x6b, 0xff, 0xdb, 0x03, 0x6c, 0xff, 0xdb, - 0x03, 0x6f, 0xff, 0xaa, 0x03, 0x71, 0xff, 0x77, 0x03, 0x72, 0xff, 0xaa, - 0x03, 0x75, 0xff, 0x77, 0x03, 0x76, 0xff, 0xaa, 0x03, 0x78, 0xff, 0x77, - 0x03, 0x7b, 0xff, 0x77, 0x03, 0x7e, 0xff, 0x77, 0x03, 0x80, 0xff, 0x77, - 0x00, 0x01, 0x03, 0x6d, 0xff, 0xd9, 0x00, 0x0d, 0x03, 0x5e, 0xff, 0xe7, - 0x03, 0x63, 0xff, 0xe7, 0x03, 0x66, 0xff, 0xe7, 0x03, 0x68, 0xff, 0xe7, - 0x03, 0x6a, 0xff, 0xe7, 0x03, 0x70, 0xff, 0xe7, 0x03, 0x71, 0xff, 0xe7, - 0x03, 0x74, 0xff, 0xe7, 0x03, 0x75, 0xff, 0xe7, 0x03, 0x78, 0xff, 0xe7, - 0x03, 0x7b, 0xff, 0xe7, 0x03, 0x7e, 0xff, 0xe7, 0x03, 0x80, 0xff, 0xe7, - 0x00, 0x0d, 0x03, 0x5e, 0xff, 0xe1, 0x03, 0x63, 0xff, 0xe1, 0x03, 0x66, - 0xff, 0xe1, 0x03, 0x70, 0xff, 0xe1, 0x03, 0x71, 0xff, 0xe1, 0x03, 0x74, - 0xff, 0xd1, 0x03, 0x75, 0xff, 0xe1, 0x03, 0x77, 0xff, 0xcf, 0x03, 0x78, - 0xff, 0xdb, 0x03, 0x7b, 0xff, 0xe1, 0x03, 0x7e, 0xff, 0xe1, 0x03, 0x7f, - 0xff, 0xcf, 0x03, 0x80, 0xff, 0xe1, 0x00, 0x0a, 0x03, 0x5e, 0xff, 0xc9, - 0x03, 0x63, 0xff, 0xc9, 0x03, 0x66, 0xff, 0xc9, 0x03, 0x68, 0xff, 0xc9, - 0x03, 0x70, 0xff, 0xc9, 0x03, 0x71, 0xff, 0xc9, 0x03, 0x74, 0xff, 0xc9, - 0x03, 0x75, 0xff, 0xc9, 0x03, 0x78, 0xff, 0xc9, 0x03, 0x7e, 0xff, 0xc9, - 0x00, 0x09, 0x03, 0x5e, 0xff, 0xe3, 0x03, 0x63, 0xff, 0xe3, 0x03, 0x68, - 0xff, 0xe3, 0x03, 0x71, 0xff, 0xe3, 0x03, 0x74, 0xff, 0xe3, 0x03, 0x75, - 0xff, 0xe3, 0x03, 0x78, 0xff, 0xe3, 0x03, 0x7b, 0xff, 0xe3, 0x03, 0x80, - 0xff, 0xe3, 0x00, 0x03, 0x03, 0x6d, 0xff, 0xd9, 0x03, 0x72, 0xff, 0xe3, - 0x03, 0x76, 0xff, 0xe3, 0x00, 0x0a, 0x03, 0x5e, 0xff, 0xe3, 0x03, 0x63, - 0xff, 0xe3, 0x03, 0x66, 0xff, 0xe3, 0x03, 0x68, 0xff, 0xe3, 0x03, 0x71, - 0xff, 0xe3, 0x03, 0x74, 0xff, 0xe3, 0x03, 0x75, 0xff, 0xe3, 0x03, 0x78, - 0xff, 0xe3, 0x03, 0x7b, 0xff, 0xe3, 0x03, 0x80, 0xff, 0xe3, 0x00, 0x0b, - 0x03, 0x5e, 0xff, 0xc9, 0x03, 0x63, 0xff, 0xc9, 0x03, 0x66, 0xff, 0xc9, - 0x03, 0x68, 0xff, 0xc9, 0x03, 0x71, 0xff, 0xc9, 0x03, 0x74, 0xff, 0xc9, - 0x03, 0x75, 0xff, 0xc9, 0x03, 0x78, 0xff, 0xc9, 0x03, 0x7b, 0xff, 0xc9, - 0x03, 0x7e, 0xff, 0xc9, 0x03, 0x80, 0xff, 0xc9, 0x00, 0x05, 0x00, 0x0f, - 0xff, 0x06, 0x00, 0x11, 0xff, 0x06, 0x00, 0x6d, 0xff, 0x77, 0x00, 0x7d, - 0xff, 0x77, 0x07, 0xdf, 0xff, 0xd3, 0x00, 0x01, 0x07, 0xe4, 0xff, 0x60, - 0x00, 0x01, 0x07, 0xe4, 0xff, 0x77, 0x00, 0x11, 0x03, 0xc5, 0x00, 0x44, - 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcc, 0x00, 0x2d, 0x03, 0xcf, 0xff, 0xd3, - 0x03, 0xd0, 0xff, 0xe9, 0x03, 0xd2, 0xff, 0xd3, 0x03, 0xd3, 0xff, 0x60, - 0x03, 0xd4, 0xff, 0xa6, 0x03, 0xd5, 0xff, 0xbc, 0x03, 0xd8, 0xff, 0x60, - 0x03, 0xde, 0xff, 0xd3, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xf3, 0xff, 0xd3, - 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf5, 0x00, 0x17, 0x03, 0xfe, 0x00, 0x2d, - 0x07, 0xe4, 0xff, 0x8d, 0x00, 0x0e, 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xc8, - 0xff, 0xe9, 0x03, 0xcf, 0xff, 0xe9, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd3, - 0xff, 0xa4, 0x03, 0xd4, 0xff, 0xd1, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xd6, - 0xff, 0xd3, 0x03, 0xd8, 0xff, 0xa4, 0x03, 0xdb, 0xff, 0xbc, 0x03, 0xde, - 0xff, 0xe9, 0x03, 0xe0, 0xff, 0xe9, 0x03, 0xec, 0xff, 0xe9, 0x03, 0xf4, - 0xff, 0xd3, 0x00, 0x15, 0x03, 0xc1, 0xff, 0xbc, 0x03, 0xc5, 0xff, 0xd3, - 0x03, 0xc7, 0xff, 0xd3, 0x03, 0xc8, 0xff, 0xbc, 0x03, 0xcc, 0xff, 0xe9, - 0x03, 0xcf, 0xff, 0xbc, 0x03, 0xd2, 0xff, 0xbc, 0x03, 0xd3, 0xff, 0x77, - 0x03, 0xd4, 0xff, 0xbc, 0x03, 0xd5, 0xff, 0xbc, 0x03, 0xd6, 0xff, 0xa6, - 0x03, 0xd8, 0xff, 0xa4, 0x03, 0xdb, 0xff, 0x8d, 0x03, 0xe0, 0xff, 0xbc, - 0x03, 0xe5, 0xff, 0xe9, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xf3, 0xff, 0xbc, - 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf6, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xbc, - 0x04, 0x00, 0xff, 0xe9, 0x00, 0x1c, 0x00, 0x0f, 0xff, 0x06, 0x00, 0x11, - 0xff, 0x06, 0x00, 0x6d, 0xff, 0x77, 0x00, 0x7d, 0xff, 0x77, 0x03, 0xc1, - 0xff, 0x77, 0x03, 0xc5, 0xff, 0x77, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xcc, - 0xff, 0x8d, 0x03, 0xcd, 0xff, 0xd1, 0x03, 0xcf, 0xff, 0x8d, 0x03, 0xd2, - 0xff, 0xa4, 0x03, 0xe0, 0xff, 0xbc, 0x03, 0xe1, 0xff, 0x8d, 0x03, 0xe3, - 0xff, 0x8d, 0x03, 0xe5, 0xff, 0x77, 0x03, 0xe6, 0xff, 0x77, 0x03, 0xe9, - 0xff, 0x8d, 0x03, 0xec, 0xff, 0x8d, 0x03, 0xed, 0xff, 0x8d, 0x03, 0xee, - 0xff, 0x8d, 0x03, 0xef, 0xff, 0x77, 0x03, 0xf1, 0xff, 0x8d, 0x03, 0xf4, - 0xff, 0x77, 0x03, 0xfc, 0xff, 0x8d, 0x03, 0xfd, 0xff, 0x8d, 0x03, 0xff, - 0xff, 0x8d, 0x04, 0x00, 0xff, 0x77, 0x07, 0xdf, 0xff, 0xd3, 0x00, 0x06, - 0x03, 0xd4, 0x00, 0x17, 0x03, 0xd5, 0xff, 0xd3, 0x03, 0xd8, 0xff, 0xba, - 0x03, 0xe8, 0x00, 0x44, 0x03, 0xef, 0x00, 0x17, 0x03, 0xf4, 0x00, 0x2d, - 0x00, 0x02, 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xf2, 0xff, 0xe9, 0x00, 0x0a, - 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcf, 0xff, 0xd3, 0x03, 0xd2, 0xff, 0xe9, - 0x03, 0xd3, 0x00, 0x17, 0x03, 0xd4, 0x00, 0x2d, 0x03, 0xdb, 0x00, 0x2d, - 0x03, 0xe1, 0x00, 0x17, 0x03, 0xe6, 0xff, 0xe7, 0x03, 0xef, 0xff, 0xe9, - 0x03, 0xf4, 0xff, 0xe9, 0x00, 0x08, 0x03, 0xcc, 0xff, 0xe9, 0x03, 0xcf, - 0xff, 0xe9, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd3, 0xff, 0xd3, 0x03, 0xd4, - 0xff, 0xe9, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xd8, 0xff, 0xd3, 0x03, 0xe0, - 0xff, 0xe9, 0x00, 0x05, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcf, 0xff, 0xe9, - 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd4, 0x00, 0x17, 0x03, 0xd5, 0xff, 0xba, - 0x00, 0x03, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xf4, - 0x00, 0x17, 0x00, 0x09, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xd8, 0xff, 0xe9, - 0x03, 0xe1, 0x00, 0x17, 0x03, 0xe6, 0x00, 0x17, 0x03, 0xef, 0x00, 0x17, - 0x03, 0xf2, 0x00, 0x17, 0x03, 0xf4, 0x00, 0x17, 0x03, 0xf8, 0xff, 0xe9, - 0x03, 0xfe, 0x00, 0x17, 0x00, 0x0b, 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xc5, - 0xff, 0xd3, 0x03, 0xc7, 0xff, 0xd3, 0x03, 0xcc, 0xff, 0xe9, 0x03, 0xd4, - 0xff, 0xd3, 0x03, 0xd6, 0xff, 0xa4, 0x03, 0xd8, 0xff, 0xd3, 0x03, 0xe0, - 0xff, 0xd3, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xec, 0xff, 0xe9, 0x03, 0xf6, - 0xff, 0xe9, 0x00, 0x18, 0x00, 0x0f, 0xfe, 0x7d, 0x00, 0x11, 0xfe, 0x7d, - 0x00, 0x1d, 0xff, 0xd3, 0x00, 0x1e, 0xff, 0xd3, 0x00, 0x7d, 0xff, 0x8d, - 0x03, 0xc1, 0xff, 0x77, 0x03, 0xc5, 0xff, 0x77, 0x03, 0xc7, 0xff, 0xe9, - 0x03, 0xc8, 0xff, 0xd3, 0x03, 0xcc, 0xff, 0x8d, 0x03, 0xcd, 0xff, 0xe9, - 0x03, 0xcf, 0xff, 0xd3, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd3, 0xff, 0xa4, - 0x03, 0xd4, 0xff, 0xd3, 0x03, 0xd5, 0xff, 0xe9, 0x03, 0xd6, 0xff, 0xa4, - 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xe1, 0xff, 0xbc, 0x03, 0xe5, 0xff, 0x60, - 0x03, 0xe6, 0xff, 0xa6, 0x03, 0xef, 0xff, 0xa6, 0x03, 0xfe, 0xff, 0xd3, - 0x04, 0x00, 0xff, 0xbc, 0x00, 0x0f, 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xc5, - 0xff, 0xd3, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcc, 0xff, 0xbc, 0x03, 0xcd, - 0xff, 0xe9, 0x03, 0xcf, 0xff, 0xd3, 0x03, 0xd3, 0xff, 0xbc, 0x03, 0xd4, - 0xff, 0xbc, 0x03, 0xd6, 0xff, 0x8d, 0x03, 0xd8, 0xff, 0xbc, 0x03, 0xdb, - 0xff, 0xba, 0x03, 0xde, 0xff, 0xe9, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xe7, - 0x00, 0x2d, 0x03, 0xf8, 0xff, 0xe9, 0x00, 0x1f, 0x00, 0x0f, 0xff, 0x1d, - 0x00, 0x11, 0xff, 0x1d, 0x00, 0x6d, 0xff, 0xa6, 0x00, 0x7d, 0xff, 0xa6, - 0x03, 0xc1, 0xff, 0xbc, 0x03, 0xc5, 0xff, 0xbc, 0x03, 0xc7, 0x00, 0x17, - 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcc, 0xff, 0xd3, 0x03, 0xcf, 0xff, 0xa4, - 0x03, 0xd5, 0xff, 0xbc, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xe1, 0xff, 0xa4, - 0x03, 0xe3, 0xff, 0xa6, 0x03, 0xe6, 0xff, 0x8d, 0x03, 0xe9, 0xff, 0xa6, - 0x03, 0xeb, 0xff, 0xa6, 0x03, 0xec, 0xff, 0xa4, 0x03, 0xed, 0xff, 0xa6, - 0x03, 0xef, 0xff, 0x60, 0x03, 0xf0, 0xff, 0xa6, 0x03, 0xf1, 0xff, 0x8d, - 0x03, 0xf2, 0xff, 0x8d, 0x03, 0xf4, 0xff, 0x8d, 0x03, 0xf6, 0xff, 0xa6, - 0x03, 0xfa, 0xff, 0xa6, 0x03, 0xfc, 0xff, 0xa6, 0x03, 0xfd, 0xff, 0xa6, - 0x03, 0xff, 0xff, 0xa6, 0x04, 0x00, 0xff, 0x8d, 0x07, 0xdf, 0xff, 0xd3, - 0x00, 0x26, 0x00, 0x0f, 0xfe, 0xf0, 0x00, 0x11, 0xfe, 0xf0, 0x00, 0x1d, - 0xff, 0xd3, 0x00, 0x1e, 0xff, 0xd3, 0x00, 0x6d, 0xff, 0xa6, 0x00, 0x7d, - 0xff, 0xa4, 0x03, 0xc1, 0xff, 0x77, 0x03, 0xc5, 0xff, 0xa4, 0x03, 0xc8, - 0xff, 0xd3, 0x03, 0xcc, 0xff, 0xbc, 0x03, 0xcf, 0xff, 0xbc, 0x03, 0xd5, - 0xff, 0xbc, 0x03, 0xde, 0xff, 0xd3, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xe2, - 0xff, 0xd3, 0x03, 0xe3, 0xff, 0x8d, 0x03, 0xe4, 0xff, 0xa4, 0x03, 0xe5, - 0xff, 0x60, 0x03, 0xe6, 0xff, 0x77, 0x03, 0xe7, 0xff, 0xbc, 0x03, 0xe8, - 0xff, 0x8d, 0x03, 0xe9, 0xff, 0xa4, 0x03, 0xea, 0xff, 0xbc, 0x03, 0xeb, - 0xff, 0xa4, 0x03, 0xec, 0xff, 0x77, 0x03, 0xed, 0xff, 0xa4, 0x03, 0xee, - 0xff, 0xa4, 0x03, 0xef, 0xff, 0x77, 0x03, 0xf0, 0xff, 0xa4, 0x03, 0xf1, - 0xff, 0xa4, 0x03, 0xf2, 0xff, 0x77, 0x03, 0xf6, 0xff, 0xa4, 0x03, 0xf7, - 0xff, 0xa4, 0x03, 0xf9, 0xff, 0xa4, 0x03, 0xfa, 0xff, 0xa4, 0x03, 0xff, - 0xff, 0xa4, 0x04, 0x00, 0xff, 0x77, 0x07, 0xdf, 0xff, 0xe9, 0x00, 0x08, - 0x03, 0xc1, 0xff, 0xd3, 0x03, 0xc5, 0xff, 0xbc, 0x03, 0xcc, 0xff, 0xbc, - 0x03, 0xd3, 0xff, 0x8d, 0x03, 0xd4, 0xff, 0xa4, 0x03, 0xd8, 0xff, 0xd3, - 0x03, 0xe0, 0xff, 0xba, 0x03, 0xec, 0xff, 0xbc, 0x00, 0x07, 0x03, 0xc8, - 0xff, 0xd3, 0x03, 0xcf, 0xff, 0xbc, 0x03, 0xd2, 0xff, 0xbc, 0x03, 0xd5, - 0xff, 0xbc, 0x03, 0xde, 0xff, 0xba, 0x03, 0xef, 0xff, 0xe9, 0x03, 0xf4, - 0xff, 0xd3, 0x00, 0x02, 0x03, 0xcf, 0xff, 0xd3, 0x03, 0xe1, 0x00, 0x2d, - 0x00, 0x02, 0x03, 0xe1, 0x00, 0x17, 0x03, 0xf4, 0x00, 0x2d, 0x00, 0x02, - 0x03, 0xe0, 0xff, 0xbc, 0x07, 0xe4, 0xff, 0x77, 0x00, 0x0e, 0x03, 0xc1, - 0xff, 0xd3, 0x03, 0xc5, 0xff, 0xd3, 0x03, 0xc7, 0xff, 0xbc, 0x03, 0xc8, - 0xff, 0xe9, 0x03, 0xcc, 0xff, 0xba, 0x03, 0xcd, 0xff, 0xd3, 0x03, 0xcf, - 0xff, 0xd3, 0x03, 0xd2, 0xff, 0xd3, 0x03, 0xd3, 0xff, 0x33, 0x03, 0xd6, - 0xff, 0xa4, 0x03, 0xd8, 0xff, 0x60, 0x03, 0xde, 0xff, 0xe9, 0x03, 0xe0, - 0xff, 0xa4, 0x07, 0xe4, 0xff, 0x60, 0x00, 0x0b, 0x03, 0xc5, 0xff, 0xbc, - 0x03, 0xc7, 0xff, 0xe7, 0x03, 0xc8, 0xff, 0xe9, 0x03, 0xcc, 0xff, 0xbc, - 0x03, 0xd6, 0xff, 0xba, 0x03, 0xe0, 0xff, 0xd3, 0x03, 0xe5, 0xff, 0xbc, - 0x03, 0xe7, 0x00, 0x17, 0x03, 0xec, 0xff, 0xbc, 0x03, 0xed, 0xff, 0xe9, - 0x04, 0x00, 0xff, 0xe9, 0x00, 0x0c, 0x03, 0xc1, 0xff, 0xbc, 0x03, 0xc5, - 0xff, 0xa6, 0x03, 0xc7, 0xff, 0xd3, 0x03, 0xcc, 0xff, 0xa4, 0x03, 0xcf, - 0xff, 0xe9, 0x03, 0xd2, 0xff, 0xe9, 0x03, 0xd3, 0xff, 0x8d, 0x03, 0xd6, - 0xff, 0xa4, 0x03, 0xd8, 0xff, 0xbc, 0x03, 0xe5, 0xff, 0xa4, 0x03, 0xec, - 0xff, 0xa4, 0x03, 0xed, 0xff, 0xe9, 0x00, 0x04, 0x03, 0xe8, 0xff, 0xe9, - 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xd3, - 0x00, 0x0f, 0x03, 0xe1, 0xff, 0xd1, 0x03, 0xe5, 0xff, 0xa4, 0x03, 0xe6, - 0xff, 0xe9, 0x03, 0xe7, 0xff, 0xe9, 0x03, 0xe8, 0xff, 0xd3, 0x03, 0xec, - 0xff, 0xa4, 0x03, 0xed, 0xff, 0xd3, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf4, - 0xff, 0xd3, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xf6, 0xff, 0xbc, 0x03, 0xf8, - 0xff, 0xbc, 0x03, 0xfb, 0xff, 0xbc, 0x03, 0xfe, 0xff, 0xe9, 0x04, 0x00, - 0xff, 0xd3, 0x00, 0x10, 0x03, 0xe1, 0xff, 0xe9, 0x03, 0xe2, 0xff, 0xe9, - 0x03, 0xe5, 0xff, 0xe9, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe7, 0xff, 0xe9, - 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xec, 0xff, 0xd1, 0x03, 0xed, 0xff, 0xe9, - 0x03, 0xef, 0xff, 0xe9, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf3, 0xff, 0xd3, - 0x03, 0xf4, 0xff, 0xd3, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xa4, - 0x03, 0xfb, 0xff, 0xbc, 0x04, 0x00, 0xff, 0xe9, 0x00, 0x0a, 0x00, 0x0f, - 0xff, 0x06, 0x00, 0x11, 0xff, 0x06, 0x03, 0xe1, 0xff, 0xd3, 0x03, 0xe5, - 0xff, 0xa4, 0x03, 0xe6, 0xff, 0xd3, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xec, - 0xff, 0xd3, 0x03, 0xef, 0xff, 0xd3, 0x03, 0xf2, 0xff, 0xd3, 0x04, 0x00, - 0xff, 0xe9, 0x00, 0x02, 0x03, 0xfb, 0xff, 0xd3, 0x03, 0xfe, 0x00, 0x17, - 0x00, 0x09, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe7, - 0xff, 0xe9, 0x03, 0xe8, 0xff, 0xd3, 0x03, 0xec, 0xff, 0xbc, 0x03, 0xf3, - 0xff, 0xbc, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf6, 0xff, 0xd3, 0x03, 0xf8, - 0xff, 0xbc, 0x00, 0x04, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xf4, 0x00, 0x17, - 0x03, 0xf8, 0xff, 0xe9, 0x03, 0xfb, 0x00, 0x2d, 0x00, 0x0b, 0x03, 0xe2, - 0xff, 0xe9, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xec, 0xff, 0xe9, 0x03, 0xef, 0xff, 0xe9, 0x03, 0xf2, - 0xff, 0xe9, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xf8, - 0xff, 0xbc, 0x03, 0xfb, 0xff, 0xd3, 0x00, 0x0a, 0x03, 0xe1, 0x00, 0x2d, - 0x03, 0xe2, 0x00, 0x2d, 0x03, 0xe6, 0x00, 0x17, 0x03, 0xe8, 0x00, 0x17, - 0x03, 0xec, 0x00, 0x17, 0x03, 0xef, 0x00, 0x17, 0x03, 0xf2, 0x00, 0x17, - 0x03, 0xf3, 0x00, 0x17, 0x03, 0xf4, 0x00, 0x17, 0x03, 0xfe, 0x00, 0x17, - 0x00, 0x02, 0x03, 0xef, 0x00, 0x17, 0x03, 0xf8, 0xff, 0xd3, 0x00, 0x03, - 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xf4, 0x00, 0x17, - 0x00, 0x08, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe7, 0xff, 0xe9, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xf4, - 0xff, 0xe9, 0x03, 0xf6, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xd3, 0x00, 0x08, - 0x03, 0xe5, 0xff, 0xd1, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xec, 0xff, 0xba, - 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xf4, 0xff, 0xe9, 0x03, 0xf6, 0xff, 0xe9, - 0x03, 0xf8, 0xff, 0xd3, 0x04, 0x00, 0xff, 0xe9, 0x00, 0x04, 0x03, 0xe7, - 0x00, 0x17, 0x03, 0xef, 0x00, 0x17, 0x03, 0xf8, 0xff, 0xe9, 0x03, 0xfe, - 0x00, 0x17, 0x00, 0x0a, 0x00, 0x0f, 0xff, 0x1d, 0x00, 0x11, 0xff, 0x1d, - 0x03, 0xe1, 0xff, 0xe9, 0x03, 0xe5, 0xff, 0xbc, 0x03, 0xe6, 0xff, 0xe9, - 0x03, 0xe7, 0x00, 0x44, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xef, 0xff, 0xe9, - 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf4, 0x00, 0x17, 0x00, 0x10, 0x00, 0x0f, - 0xff, 0x33, 0x00, 0x11, 0xff, 0x33, 0x00, 0x7d, 0x00, 0x17, 0x03, 0xe1, - 0xff, 0xe9, 0x03, 0xe2, 0x00, 0x17, 0x03, 0xe5, 0xff, 0xbc, 0x03, 0xe6, - 0xff, 0xe9, 0x03, 0xe7, 0x00, 0x17, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xed, - 0xff, 0xe9, 0x03, 0xef, 0xff, 0xe7, 0x03, 0xf1, 0xff, 0xe9, 0x03, 0xf2, - 0xff, 0xe9, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xfe, 0xff, 0xe9, 0x04, 0x00, - 0xff, 0xe9, 0x00, 0x07, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe5, 0xff, 0xd3, - 0x03, 0xec, 0xff, 0xd3, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xf4, 0xff, 0xe9, - 0x03, 0xf8, 0xff, 0xd3, 0x04, 0x00, 0xff, 0xe9, 0x00, 0x09, 0x03, 0xe1, - 0xff, 0xe9, 0x03, 0xe2, 0xff, 0xe9, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe8, - 0xff, 0xe9, 0x03, 0xef, 0xff, 0xe9, 0x03, 0xf2, 0xff, 0xe9, 0x03, 0xf3, - 0xff, 0xe9, 0x03, 0xf5, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xd3, 0x00, 0x04, - 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xef, 0xff, 0xe9, - 0x03, 0xf2, 0xff, 0xe9, 0x00, 0x03, 0x03, 0xe6, 0xff, 0xe9, 0x03, 0xef, - 0xff, 0xe9, 0x03, 0xf4, 0x00, 0x17, 0x00, 0x02, 0x03, 0xf3, 0xff, 0x60, - 0x03, 0xf8, 0xff, 0x77, 0x00, 0x08, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe6, - 0x00, 0x17, 0x03, 0xe8, 0xff, 0xe9, 0x03, 0xec, 0xff, 0xd3, 0x03, 0xef, - 0x00, 0x17, 0x03, 0xf3, 0xff, 0xd3, 0x03, 0xf6, 0xff, 0xe9, 0x04, 0x00, - 0xff, 0xe9, 0x00, 0x07, 0x03, 0xe5, 0xff, 0xd3, 0x03, 0xe7, 0xff, 0xe9, - 0x03, 0xec, 0xff, 0xd3, 0x03, 0xed, 0xff, 0xe9, 0x03, 0xf3, 0xff, 0xd3, - 0x03, 0xf6, 0xff, 0xe9, 0x03, 0xf8, 0xff, 0xd3, 0x00, 0x02, 0x00, 0x0f, - 0xff, 0x33, 0x00, 0x11, 0xff, 0x33, 0x00, 0x07, 0x00, 0x0f, 0xff, 0x06, - 0x00, 0x11, 0xff, 0x06, 0x00, 0x1d, 0xff, 0xd3, 0x00, 0x1e, 0xff, 0xd3, - 0x00, 0x6d, 0xff, 0x60, 0x00, 0x7d, 0xff, 0x60, 0x07, 0xdf, 0xff, 0xd3, - 0x00, 0x01, 0x07, 0xe3, 0xff, 0xdb, 0x00, 0x03, 0x00, 0x03, 0xff, 0xb4, - 0x00, 0x56, 0xff, 0xdb, 0x07, 0xe4, 0xff, 0xdb, 0x00, 0x05, 0x03, 0xb3, - 0xff, 0x60, 0x03, 0xbc, 0xff, 0x60, 0x03, 0xd3, 0xff, 0x60, 0x03, 0xd8, - 0xff, 0xbc, 0x03, 0xdb, 0xff, 0xbc, 0x00, 0x01, 0x00, 0x69, 0x00, 0x03, - 0x00, 0x14, 0x00, 0x24, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x35, - 0x00, 0x37, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3c, 0x00, 0x49, 0x00, 0x55, - 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5c, 0x03, 0x3b, 0x03, 0x40, 0x03, 0x41, - 0x03, 0x42, 0x03, 0x44, 0x03, 0x46, 0x03, 0x47, 0x03, 0x4b, 0x03, 0x4d, - 0x03, 0x4e, 0x03, 0x52, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, - 0x03, 0x58, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5d, 0x03, 0x66, 0x03, 0x68, - 0x03, 0x6a, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, - 0x03, 0x73, 0x03, 0x76, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7b, 0x03, 0x7e, - 0x03, 0x80, 0x03, 0xb4, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xc1, 0x03, 0xc2, - 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, - 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xcf, 0x03, 0xd1, 0x03, 0xd2, - 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xda, - 0x03, 0xdb, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe1, 0x03, 0xe2, - 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, - 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xef, 0x03, 0xf1, 0x03, 0xf2, - 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xfa, - 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x04, 0x0f, 0x04, 0x41, 0x07, 0xe3, - 0x07, 0xe4, 0x07, 0xe9, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x19, - 0x00, 0x0a, 0x00, 0x01, 0x00, 0x01, 0x04, 0xf1, 0x00, 0x01, 0x02, 0x96, - 0x02, 0x6e, 0x00, 0x01, 0x02, 0x9e, 0x00, 0x0c, 0x00, 0x4c, 0x00, 0x9a, - 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, - 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, - 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, - 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, - 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, - 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, - 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, - 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, - 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, - 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, - 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, - 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, - 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, 0x04, 0x60, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xac, 0x05, 0x96, 0x00, 0x01, 0x02, 0x80, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xc0, 0x05, 0x96, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x96, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x96, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x96, 0x00, 0x01, 0x04, 0x38, 0x05, 0x96, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x96, 0x00, 0x01, 0x02, 0x8a, 0x05, 0x96, - 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x04, 0x38, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x4c, 0x05, 0x96, 0x00, 0x01, 0x04, 0x4c, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xd4, 0x05, 0x96, 0x00, 0x01, 0x03, 0xd4, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x38, 0x05, 0x96, 0x00, 0x01, 0x03, 0x5c, 0x05, 0x96, - 0x00, 0x01, 0x05, 0x50, 0x05, 0x96, 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x04, 0x60, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xc0, 0x05, 0x96, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x03, 0x5c, 0x05, 0x96, - 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x06, 0xa4, 0x05, 0x96, - 0x00, 0x01, 0x05, 0x50, 0x05, 0x96, 0x00, 0x01, 0x06, 0xa4, 0x05, 0x96, - 0x00, 0x01, 0x05, 0x50, 0x05, 0x96, 0x00, 0x01, 0x04, 0x60, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x60, 0x05, 0x96, 0x00, 0x01, 0x04, 0x60, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xac, 0x05, 0x96, 0x00, 0x01, 0x02, 0x80, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xc0, 0x05, 0x96, 0x00, 0x01, 0x03, 0xe8, 0x05, 0x96, - 0x00, 0x01, 0x01, 0xf4, 0x05, 0x96, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x9c, 0x05, 0x96, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, - 0x00, 0x01, 0x02, 0x8a, 0x05, 0x96, 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x4c, 0x05, 0x96, 0x00, 0x01, 0x04, 0x4c, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xd4, 0x05, 0x96, 0x00, 0x01, 0x04, 0x38, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x5c, 0x05, 0x96, 0x00, 0x01, 0x05, 0x50, 0x05, 0x96, - 0x00, 0x01, 0x04, 0xb0, 0x05, 0x96, 0x00, 0x01, 0x02, 0x94, 0x05, 0x96, - 0x00, 0x01, 0x03, 0xfc, 0x05, 0x96, 0x00, 0x01, 0x03, 0xd4, 0x05, 0x96, - 0x00, 0x01, 0x04, 0x4c, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, - 0x00, 0x01, 0x03, 0x70, 0x05, 0x96, 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, - 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, - 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, - 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, - 0x00, 0x02, 0x04, 0xf7, 0x08, 0xc7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, - 0x00, 0x00, 0x05, 0x96, 0x00, 0x01, 0x02, 0x96, 0x02, 0x6e, 0x00, 0x01, - 0x02, 0xcc, 0x00, 0x0c, 0x00, 0x4c, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, - 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, - 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, - 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, - 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, - 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, - 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, - 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, - 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, - 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, - 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, - 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, - 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, - 0x02, 0x5c, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x26, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc8, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0xb8, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0xae, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x6c, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, - 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc0, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0xae, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, - 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x30, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, - 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, - 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, - 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, - 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, 0x00, 0x19, 0x04, 0xc9, - 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, - 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, - 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, - 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, - 0x00, 0x19, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, - 0x00, 0x72, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, - 0x00, 0x84, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, - 0x00, 0x96, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, - 0x00, 0xa8, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, - 0x00, 0xba, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, - 0x00, 0xcc, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, - 0x00, 0xde, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, - 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, - 0x00, 0x01, 0xfe, 0xb6, 0x00, 0x14, 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x38, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, - 0x00, 0x01, 0xff, 0x10, 0x00, 0x14, 0x00, 0x01, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xc0, 0x00, 0x14, - 0x00, 0x01, 0xfe, 0xac, 0x00, 0x14, 0x00, 0x01, 0xfe, 0xd4, 0x00, 0x14, - 0x00, 0x01, 0x02, 0x96, 0x02, 0x6e, 0x00, 0x01, 0x02, 0xb6, 0x00, 0x0c, - 0x00, 0x4c, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, - 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, - 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, - 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, - 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, - 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, - 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, - 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, - 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, - 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, - 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, - 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, - 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x03, 0x0c, 0x05, 0x46, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x40, 0x05, 0x46, 0x00, 0x01, 0x02, 0x80, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, 0x02, 0x30, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x02, 0x30, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x01, 0xcc, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, 0x03, 0x20, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, 0x01, 0xf4, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, - 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x0e, 0x05, 0x46, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, - 0x03, 0x0c, 0x05, 0x46, 0x00, 0x01, 0x01, 0x40, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x80, 0x05, 0x46, 0x00, 0x01, 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x58, 0x05, 0x46, 0x00, 0x01, 0x02, 0x08, 0x05, 0x46, 0x00, 0x01, - 0x02, 0x30, 0x05, 0x46, 0x00, 0x01, 0x01, 0xa4, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xbc, 0x05, 0x46, 0x00, 0x01, 0x02, 0x94, 0x05, 0x46, 0x00, 0x01, - 0x00, 0xb4, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x2c, 0x05, 0x46, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, - 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, 0x02, 0xa8, 0x05, 0x46, 0x00, 0x01, - 0x01, 0x90, 0x05, 0x46, 0x00, 0x01, 0x01, 0x90, 0x05, 0x46, 0x00, 0x02, - 0x00, 0x06, 0x05, 0x00, 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, - 0x00, 0x1e, 0x08, 0xc8, 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, - 0x00, 0x20, 0x08, 0xd3, 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, - 0x00, 0x48, 0x00, 0x01, 0x00, 0x0e, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, - 0x04, 0xcd, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd7, - 0x04, 0xd9, 0x04, 0xe0, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe7, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x46, - 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x58, - 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x6a, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x7c, - 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x88, 0x00, 0x01, 0x01, 0xe0, - 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x01, 0x2c, - 0x05, 0x46, 0x00, 0x01, 0x01, 0xe0, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, - 0x05, 0x46, 0x00, 0x01, 0x01, 0x2c, 0x05, 0x46, 0x00, 0x01, 0x01, 0x68, - 0x05, 0x46, 0x00, 0x01, 0x01, 0x2c, 0x05, 0x46, 0x00, 0x01, 0x01, 0xf4, - 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, - 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, 0x05, 0x46, 0x00, 0x01, 0x00, 0xc8, - 0x05, 0x46, 0x00, 0x01, 0x00, 0xf0, 0x05, 0x6e, 0x00, 0x01, 0x02, 0x96, - 0x02, 0x6e, 0x00, 0x01, 0x02, 0xcc, 0x00, 0x0c, 0x00, 0x4c, 0x00, 0x9a, - 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, - 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, - 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, - 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, - 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, - 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, - 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, - 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, - 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, - 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, - 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, - 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, - 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x7c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7c, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x00, - 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0xbc, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcc, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x58, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, - 0x00, 0x01, 0x01, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x05, 0x00, - 0x05, 0x1d, 0x00, 0x00, 0x08, 0x8d, 0x08, 0x8d, 0x00, 0x1e, 0x08, 0xc8, - 0x08, 0xc8, 0x00, 0x1f, 0x08, 0xca, 0x08, 0xd1, 0x00, 0x20, 0x08, 0xd3, - 0x08, 0xf2, 0x00, 0x28, 0x0a, 0x0e, 0x0a, 0x11, 0x00, 0x48, 0x00, 0x01, - 0x00, 0x19, 0x04, 0xc9, 0x04, 0xce, 0x04, 0xd3, 0x04, 0xda, 0x04, 0xdb, - 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe2, 0x04, 0xe8, - 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, - 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf3, 0x04, 0xf5, 0x04, 0xff, 0x0a, 0x17, - 0x0a, 0x18, 0x0a, 0x19, 0x00, 0x19, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, - 0x00, 0x7e, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, - 0x00, 0x90, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, - 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, - 0x00, 0xb4, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0x00, 0xc6, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, - 0x00, 0xd8, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, - 0x00, 0xea, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x01, - 0x00, 0xdc, 0x00, 0x14, 0x00, 0x01, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x01, - 0x00, 0xb4, 0x00, 0x14, 0x00, 0x01, 0x00, 0xdc, 0x00, 0x14, 0x00, 0x01, - 0x00, 0xb4, 0x00, 0x14, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x14, 0x00, 0x01, - 0x00, 0xc8, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0x00, 0x00, 0x00, 0x01, - 0x00, 0xb4, 0x00, 0x14, 0x00, 0x01, 0x00, 0xdc, 0x00, 0x14, 0x00, 0x01, - 0x00, 0xa0, 0x00, 0x14, 0x00, 0x01, 0x01, 0x40, 0x00, 0x14, 0x00, 0x01, - 0x01, 0x2c, 0x00, 0x14, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x14, 0x00, 0x01, - 0x00, 0x8c, 0x00, 0x14, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x14, 0x00, 0x01, - 0x00, 0xf0, 0x00, 0x14, 0x00, 0x01, 0x00, 0xc8, 0x00, 0x14, 0x00, 0x01, - 0x00, 0xc8, 0x00, 0x14, 0x00, 0x01, 0x01, 0x04, 0x00, 0x14, 0x00, 0x01, - 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x7c, 0x00, 0x14, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x14, 0x00, 0x01, - 0x01, 0x7c, 0x00, 0x14, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x40, - 0x00, 0x01, 0x00, 0x02, 0x04, 0xd2, 0x04, 0xe5, 0x00, 0x02, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x06, 0xfd, 0xe4, 0xfd, 0xe4, 0xfd, 0xe4, 0xfd, 0xe4, - 0xfd, 0xe4, 0xfe, 0x70, 0x00, 0x01, 0x00, 0x06, 0x04, 0xc9, 0x04, 0xce, - 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xf5, 0x00, 0x01, 0x00, 0x14, - 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x01, 0x04, 0xdd, - 0x00, 0xc8, 0xff, 0x38, 0x00, 0x01, 0x00, 0x01, 0x04, 0xdc, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x3d, 0xa2, 0xcf, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x40, 0xf9, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0xcc, 0x91, 0xee, 0xe9 diff --git a/GDCpp/GDCpp/Runtime/Log.cpp b/GDCpp/GDCpp/Runtime/Log.cpp deleted file mode 100644 index c06c23189..000000000 --- a/GDCpp/GDCpp/Runtime/Log.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include -#include -#include "GDCore/Tools/VersionWrapper.h" -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/Log.cpp" -#endif - -void GD_API GDLogBanner() { -#if defined(LINUX) - gd::String sys = "Target system : GNU/Linux, "; -#elif defined(WINDOWS) - gd::String sys = "Target system : Windows, "; -#elif defined(MACOS) - gd::String sys = "Target system : Mac OS, "; -#else - gd::String sys = "Target system : Unknown, "; -#endif - if (sizeof(int*) == 4) - sys += "32-bits"; - else if (sizeof(int*) == 8) - sys += "64-bits"; - - std::cout << "GDevelop - " << gd::VersionWrapper::FullString() << " " - << gd::VersionWrapper::Status() << std::endl; - std::cout << "Built " << gd::VersionWrapper::Date() << "/" - << gd::VersionWrapper::Month() << "/" << gd::VersionWrapper::Year() - << std::endl; - std::cout << sys << std::endl; - std::cout << std::endl; -} diff --git a/GDCpp/GDCpp/Runtime/Log.h b/GDCpp/GDCpp/Runtime/Log.h deleted file mode 100644 index d49003132..000000000 --- a/GDCpp/GDCpp/Runtime/Log.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef LOG_H_INCLUDED -#define LOG_H_INCLUDED - -#include -#include - -/** - * Display GDevelop version and some informations to std::cout. - */ -void GD_API GDLogBanner(); - -#endif // LOG_H_INCLUDED diff --git a/GDCpp/GDCpp/Runtime/ManualTimer.cpp b/GDCpp/GDCpp/Runtime/ManualTimer.cpp deleted file mode 100644 index 700bc027b..000000000 --- a/GDCpp/GDCpp/Runtime/ManualTimer.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/ManualTimer.h" - -ManualTimer::ManualTimer() : time(0), isPaused(false) {} diff --git a/GDCpp/GDCpp/Runtime/ManualTimer.h b/GDCpp/GDCpp/Runtime/ManualTimer.h deleted file mode 100644 index 21014d4ed..000000000 --- a/GDCpp/GDCpp/Runtime/ManualTimer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef MANUALTIMER_H -#define MANUALTIMER_H -#include -#include "GDCpp/Runtime/String.h" - -/** - * \brief Manual timer, updated using ManualTimer::UpdateTime member function. - * - * \ingroup GameEngine - */ -class GD_API ManualTimer { - public: - ManualTimer(); - - virtual ~ManualTimer(){}; - - /** - * \brief Update the time of the timer - * \param time Time to add in microseconds - */ - inline void UpdateTime(signed long long time_) { - if (!isPaused) time += time_; - }; - - /** - * \brief Reset time to zero. - */ - inline void Reset() { time = 0; }; - - /** - * \brief Get the timer elapsed time, in microseconds. - * \return Elapsed time, in microseconds. - */ - inline signed long long GetTime() const { return time; }; - - /** - * \brief Change the timer's value. - * \param newTime The timer's new value - */ - inline void SetTime(signed long long newTime) { time = newTime; }; - - /** - * \brief Return true if the timer is paused. - */ - inline bool IsPaused() const { return isPaused; }; - - /** - * \brief Set the paused state of the timer. - * @param newState true to pause the timer, false to unpause it. - */ - inline void SetPaused(bool newState = true) { isPaused = newState; }; - - private: - signed long long time; ///< Time elapsed in microseconds - bool isPaused; ///< True if timer is paused -}; - -#endif // MANUALTIMER_H diff --git a/GDCpp/GDCpp/Runtime/Music.cpp b/GDCpp/GDCpp/Runtime/Music.cpp deleted file mode 100644 index f58192bb9..000000000 --- a/GDCpp/GDCpp/Runtime/Music.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "GDCpp/Runtime/Music.h" -#include -#include -#include -#include -#include "GDCpp/Runtime/SoundManager.h" - -using namespace std; - -Music::Music() : buffer(NULL), volume(100) {} - -bool Music::OpenFromFile(const gd::String& filename) { -#if defined(GD_IDE_ONLY) - file = filename; -#endif - return music.openFromFile(filename.ToLocale()); -} - -void Music::SetBuffer(const char* newbuffer, std::size_t size) { - if (newbuffer == NULL) { - cout << "Tried to change buffer of a music to a NULL buffer"; - return; - } - - if (buffer != NULL) delete buffer; - - buffer = new char[size]; - memcpy(buffer, newbuffer, size); -} - -bool Music::OpenFromMemory(std::size_t size) { - music.openFromMemory(buffer, size); - - return true; -} - -void Music::Play() { music.play(); } - -void Music::Pause() { music.pause(); } - -void Music::Stop() { music.stop(); } - -void Music::SetLoop(bool loop) { music.setLoop(loop); } - -void Music::SetVolume(float volume_, float globalVolume) { - volume = volume_; - if (volume < 0) volume = 0; - if (volume > 100) volume = 100; - - UpdateVolume(globalVolume); -} - -void Music::UpdateVolume(float globalVolume) { - music.setVolume(volume * globalVolume / 100.f); -} diff --git a/GDCpp/GDCpp/Runtime/Music.h b/GDCpp/GDCpp/Runtime/Music.h deleted file mode 100644 index f6968406e..000000000 --- a/GDCpp/GDCpp/Runtime/Music.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef MUSIC_H -#define MUSIC_H -#include -#include -#include "GDCpp/Runtime/String.h" - -/** - * \brief Represents a music to be played - * - * \see SoundManager - * \ingroup SoundEngine - */ -class GD_API Music { - public: - Music(); - virtual ~Music(){}; - - /** - * \brief Open the music from a file. - * - * Example : - * \code - * Music myMusic; - * myMusic.OpenFromFile("sound.ogg"); - * myMusic.Play(); - * \endcode - */ - bool OpenFromFile(const gd::String& filename); - - /** - * \brief Change music buffer. - * - * You must call OpenFromMemory after to use this buffer. - */ - void SetBuffer(const char* newbuffer, std::size_t size); - - /** - * Open music stored in buffer. - * \param size The buffer size. - */ - bool OpenFromMemory(std::size_t size); - - sf::Music music; ///< SFML Music - char* buffer; ///< Music buffer when music have been loaded from memory - - /** - * \brief Play the music. - */ - void Play(); - - /** - * \brief Pause the music. - */ - void Pause(); - - /** - * \brief Stop the music. - */ - void Stop(); - - /** - * \brief Get the music status - * \return sf::Music::Paused, sf::Music::Playing or sf::Music::Stopped. - */ - inline sf::Music::Status GetStatus() const { return music.getStatus(); }; - - /** - * Make music looping or not. - * \param loop true to activate looping. - */ - void SetLoop(bool loop); - - /** - * \brief Change the music volume. - * \param volume The new volume, between 0 and 100. - */ - void SetVolume(float volume_, float globalVolume); - - /** - * \brief Get the music volume. - */ - inline float GetVolume() const { return volume; } - - /** - * \brief Change the music pitch. - */ - void SetPitch(float newPitch) { music.setPitch(newPitch); }; - - /** - * \brief Get the music pitch. - */ - float GetPitch() const { return music.getPitch(); }; - - /** - * \brief Change the current playing position of the music. - * \param timeOffset The new playing position, in seconds. - */ - void SetPlayingOffset(double timeOffset) { - music.setPlayingOffset(sf::seconds(timeOffset)); - }; - - /** - * \brief Return the current playing position of the music, in seconds. - */ - double GetPlayingOffset() const { - return music.getPlayingOffset().asSeconds(); - }; - - /** - * \brief Internal member functions to update music volume according to global - * volume. - * - * Called by the sound manager when the global volume is updated. - */ - void UpdateVolume(float globalVolume); - -#if defined(GD_IDE_ONLY) - gd::String file; ///< Only useful for GD debugger -#endif - - private: - float volume; ///< Music volume -}; - -#endif // MUSIC_H diff --git a/GDCpp/GDCpp/Runtime/ObjInstancesHolder.cpp b/GDCpp/GDCpp/Runtime/ObjInstancesHolder.cpp deleted file mode 100644 index 83070ed95..000000000 --- a/GDCpp/GDCpp/Runtime/ObjInstancesHolder.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/ObjInstancesHolder.h" -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/profile.h" - -RuntimeObject* ObjInstancesHolder::AddObject(RuntimeObjSPtr&& object) { - auto it = objectsInstances[object->GetName()].insert( - objectsInstances[object->GetName()].end(), std::move(object)); - objectsInstancesRefs[(*it)->GetName()].push_back(it->get()); - - return it->get(); -} - -RuntimeObjNonOwningPtrList ObjInstancesHolder::GetObjectsRawPointers( - const gd::String& name) { - return objectsInstancesRefs[name]; -} - -void ObjInstancesHolder::ObjectNameHasChanged(const RuntimeObject* object) { - std::unique_ptr theObject; // We need the object to keep - // alive. - - // Find and erase the object from the object lists. - for (auto it = objectsInstances.begin(); it != objectsInstances.end(); ++it) { - RuntimeObjList& list = it->second; - for (std::size_t i = 0; i < list.size(); ++i) { - if (list[i].get() == object) { - theObject = std::move(list[i]); - list.erase(list.begin() + i); - break; - } - } - } - // Find and erase the object from the object raw pointers lists. - for (auto it = objectsInstancesRefs.begin(); it != objectsInstancesRefs.end(); - ++it) { - RuntimeObjNonOwningPtrList& associatedList = it->second; - associatedList.erase( - std::remove(associatedList.begin(), associatedList.end(), object), - associatedList.end()); - } - - AddObject(std::move(theObject)); -} - -void ObjInstancesHolder::Init(const ObjInstancesHolder& other) { - objectsInstances.clear(); - objectsInstancesRefs.clear(); - - for (auto it = other.objectsInstances.cbegin(); - it != other.objectsInstances.cend(); - ++it) { - for (std::size_t i = 0; i < it->second.size(); - ++i) // We need to really copy the objects - AddObject(std::unique_ptr(it->second[i]->Clone())); - } -} - -ObjInstancesHolder::ObjInstancesHolder(const ObjInstancesHolder& other) { - Init(other); -} - -ObjInstancesHolder::~ObjInstancesHolder() {} - -ObjInstancesHolder& ObjInstancesHolder::operator=( - const ObjInstancesHolder& other) { - if ((this) != &other) Init(other); - - return *this; -} diff --git a/GDCpp/GDCpp/Runtime/ObjInstancesHolder.h b/GDCpp/GDCpp/Runtime/ObjInstancesHolder.h deleted file mode 100644 index 6fe962912..000000000 --- a/GDCpp/GDCpp/Runtime/ObjInstancesHolder.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef OBJINSTANCESHOLDER_H -#define OBJINSTANCESHOLDER_H - -#include -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/RuntimeObject.h" -#include "GDCpp/Runtime/String.h" - -class RuntimeObject; - -using RuntimeObjList = std::vector>; -using RuntimeObjNonOwningPtrList = std::vector; - -using RuntimeObjSPtr = std::unique_ptr; - -/** - * \brief Contains lists of objects classified by the name of the objects. - * - * \see RuntimeScene - * \ingroup GameEngine - */ -class GD_API ObjInstancesHolder { - public: - /** - * \brief Default constructor - */ - ObjInstancesHolder(){}; - - /** - * \brief Copy constructor - * \note All objects contained inside the container copied are also copied. - * The new container is fully independent from the original one. - */ - ObjInstancesHolder(const ObjInstancesHolder& other); - - ~ObjInstancesHolder(); - - /** - * \brief Assignment operator - * \note All objects contained inside the container copied are also copied. - * The new container is fully independent from the original one. - */ - ObjInstancesHolder& operator=(const ObjInstancesHolder& other); - - /** - * \brief Add a new object to the lists. - * \note The object is then hold in the container and you can - * forget the shared pointer to it. - */ - RuntimeObject* AddObject(RuntimeObjSPtr&& object); - - /** - * \brief Get all objects with the specified name - */ - inline const RuntimeObjList& GetObjects(const gd::String& name) { - return objectsInstances[name]; - } - - /** - * \brief Get a "raw pointers" list to objects with the specified name - */ - RuntimeObjNonOwningPtrList GetObjectsRawPointers(const gd::String& name); - - /** - * \brief Get a list of all objects contained. - */ - inline RuntimeObjNonOwningPtrList GetAllObjects() { - RuntimeObjNonOwningPtrList objList; - - for (auto it = objectsInstances.begin(); it != objectsInstances.end(); - ++it) { - for (auto it2 = it->second.begin(); it2 != it->second.end(); ++it2) { - objList.push_back(it2->get()); - } - } - - return objList; - } - - /** - * \brief Remove an object - * - * \warning During the game, do not directly remove an object using this - * function, but make its name empty instead. Example: \code - * myObject->SetName(""); //The scene will take care of deleting the object - * scene.objectsInstances.ObjectNameHasChanged(myObject); - * \endcode - */ - inline void RemoveObject(RuntimeObject* object) { - for (auto it = objectsInstances.begin(); it != objectsInstances.end(); - ++it) { - RuntimeObjList& associatedList = it->second; - associatedList.erase( - std::remove_if( - associatedList.begin(), - associatedList.end(), - [&object](const std::unique_ptr& objectPtr) { - return objectPtr.get() == object; - }), - associatedList.end()); - } - for (auto it = objectsInstancesRefs.begin(); - it != objectsInstancesRefs.end(); - ++it) { - RuntimeObjNonOwningPtrList& associatedList = it->second; - associatedList.erase( - std::remove(associatedList.begin(), associatedList.end(), object), - associatedList.end()); - } - } - - /** - * \brief Remove an entire list of object with a given name - */ - inline void RemoveObjects(const gd::String& name) { - objectsInstances[name].clear(); - objectsInstancesRefs[name].clear(); - } - - /** - * \brief To be called when an object has changed its name. - */ - void ObjectNameHasChanged(const RuntimeObject* object); - - /** - * \brief Clear the container. - * \note All objects contained inside are destroyed. - */ - inline void Clear() { - objectsInstances.clear(); - objectsInstancesRefs.clear(); - } - - private: - void Init(const ObjInstancesHolder& other); - - std::unordered_map - objectsInstances; ///< The list of all objects, classified by name - std::unordered_map - objectsInstancesRefs; ///< Clones of the objectsInstances lists, but with - ///< references instead. -}; - -#endif // OBJINSTANCESHOLDER_H diff --git a/GDCpp/GDCpp/Runtime/Point.cpp b/GDCpp/GDCpp/Runtime/Point.cpp deleted file mode 100644 index b60f3d0a1..000000000 --- a/GDCpp/GDCpp/Runtime/Point.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/SpriteExtension/Point.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Point.h b/GDCpp/GDCpp/Runtime/Point.h deleted file mode 100644 index 9bb22242c..000000000 --- a/GDCpp/GDCpp/Runtime/Point.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Extensions/Builtin/SpriteExtension/Point.h" diff --git a/GDCpp/GDCpp/Runtime/Polygon2d.cpp b/GDCpp/GDCpp/Runtime/Polygon2d.cpp deleted file mode 100644 index 7903c4d3c..000000000 --- a/GDCpp/GDCpp/Runtime/Polygon2d.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Polygon2d.h b/GDCpp/GDCpp/Runtime/Polygon2d.h deleted file mode 100644 index 70a33ac52..000000000 --- a/GDCpp/GDCpp/Runtime/Polygon2d.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Extensions/Builtin/SpriteExtension/Polygon2d.h" diff --git a/GDCpp/GDCpp/Runtime/PolygonCollision.cpp b/GDCpp/GDCpp/Runtime/PolygonCollision.cpp deleted file mode 100644 index 697a65cd8..000000000 --- a/GDCpp/GDCpp/Runtime/PolygonCollision.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/PolygonCollision.h" -#include -#include -#include -#include "GDCpp/Runtime/Polygon2d.h" - -namespace { - -void normalise(sf::Vector2f& v) { - float length = sqrt(v.x * v.x + v.y * v.y); - - if (length != 0.0f) { - v.x /= length; - v.y /= length; - } else - return; -} - -float dotProduct(const sf::Vector2f a, const sf::Vector2f b) { - float dp = a.x * b.x + a.y * b.y; - - return dp; -} - -float crossProduct(const sf::Vector2f a, const sf::Vector2f b) { - float cp = a.x * b.y - a.y * b.x; - - return cp; -} - -void project(const sf::Vector2f axis, - const Polygon2d& p, - float& min, - float& max) { - float dp = dotProduct(axis, p.vertices[0]); - - min = dp; - max = dp; - - for (std::size_t i = 1; i < p.vertices.size(); i++) { - dp = dotProduct(axis, p.vertices[i]); - - if (dp < min) - min = dp; - else if (dp > max) - max = dp; - } -} - -float distance(float minA, float maxA, float minB, float maxB) { - if (minA < minB) - return minB - maxA; - else - return minA - maxB; -} - -} // namespace - -CollisionResult GD_API PolygonCollisionTest(Polygon2d& p1, - Polygon2d& p2, - bool ignoreTouchingEdges) { - if (p1.vertices.size() < 3 || p2.vertices.size() < 3) { - CollisionResult result; - result.collision = false; - result.move_axis.x = 0.0f; - result.move_axis.y = 0.0f; - return result; - } - - p1.ComputeEdges(); - p2.ComputeEdges(); - - sf::Vector2f edge; - sf::Vector2f move_axis(0, 0); - sf::Vector2f mtd(0, 0); - - float min_dist = FLT_MAX; - - CollisionResult result; - - // Iterate over all the edges composing the polygons - for (std::size_t i = 0; i < p1.vertices.size() + p2.vertices.size(); i++) { - if (i < p1.vertices.size()) // or <= - { - edge = p1.edges[i]; - } else { - edge = p2.edges[i - p1.vertices.size()]; - } - - sf::Vector2f axis( - -edge.y, edge.x); // Get the axis to which polygons will be projected - normalise(axis); - - float minA = 0; - float minB = 0; - float maxA = 0; - float maxB = 0; - - project(axis, p1, minA, maxA); - project(axis, p2, minB, maxB); - - float dist = distance(minA, maxA, minB, maxB); - if (dist > 0.0f || (dist == 0.0 && ignoreTouchingEdges)) { - // If the projections on the axis do not overlap, then - // there is no collision - result.collision = false; - result.move_axis.x = 0.0f; - result.move_axis.y = 0.0f; - - return result; - } - - float absDist = std::abs(dist); - - if (absDist < min_dist) { - min_dist = absDist; - move_axis = axis; - } - } - - result.collision = true; - - sf::Vector2f d = p1.ComputeCenter() - p2.ComputeCenter(); - if (dotProduct(d, move_axis) < 0.0f) move_axis = -move_axis; - result.move_axis = move_axis * min_dist; - - return result; -} - -RaycastResult GD_API PolygonRaycastTest( - Polygon2d& poly, float startX, float startY, float endX, float endY) { - RaycastResult result; - result.collision = false; - - if (poly.vertices.size() < 2) { - return result; - } - - poly.ComputeEdges(); - sf::Vector2f p, q, r, s; - float minSqDist = FLT_MAX; - - // Ray segment: p + t*r, with p = start and r = end - start - p.x = startX; - p.y = startY; - r.x = endX - startX; - r.y = endY - startY; - - for (int i = 0; i < poly.edges.size(); i++) { - // Edge segment: q + u*s - q = poly.vertices[i]; - s = poly.edges[i]; - sf::Vector2f deltaQP = q - p; - float crossRS = crossProduct(r, s); - float t = crossProduct(deltaQP, s) / crossRS; - float u = crossProduct(deltaQP, r) / crossRS; - - // Collinear - if (abs(crossRS) <= 0.0001 && abs(crossProduct(deltaQP, r)) <= 0.0001) { - // Project the ray and the edge to work on floats, keeping linearity - // through t - sf::Vector2f axis(r.x, r.y); - normalise(axis); - float rayA = 0.0f; - float rayB = dotProduct(axis, r); - float edgeA = dotProduct(axis, deltaQP); - float edgeB = dotProduct(axis, deltaQP + s); - // Get overlapping range - float minOverlap = std::max(std::min(rayA, rayB), std::min(edgeA, edgeB)); - float maxOverlap = std::min(std::max(rayA, rayB), std::max(edgeA, edgeB)); - if (minOverlap > maxOverlap) { - return result; - } - result.collision = true; - // Zero distance ray - if (rayB == 0.0f) { - result.closePoint = p; - result.closeSqDist = 0.0f; - result.farPoint = p; - result.farSqDist = 0.0f; - } - float t1 = minOverlap / abs(rayB); - float t2 = maxOverlap / abs(rayB); - result.closePoint = p + t1 * r; - result.closeSqDist = t1 * t1 * (r.x * r.x + r.y * r.y); - result.farPoint = p + t2 * r; - result.farSqDist = t2 * t2 * (r.x * r.x + r.y * r.y); - - return result; - } else if (crossRS != 0 && 0 <= t && t <= 1 && 0 <= u && u <= 1) { - sf::Vector2f point = p + t * r; - - float sqDist = (point.x - startX) * (point.x - startX) + - (point.y - startY) * (point.y - startY); - if (sqDist < minSqDist) { - if (!result.collision) { - result.farPoint = point; - result.farSqDist = sqDist; - } - minSqDist = sqDist; - result.closePoint = point; - result.closeSqDist = sqDist; - result.collision = true; - } else { - result.farPoint = point; - result.farSqDist = sqDist; - } - } - } - - return result; -} - -bool GD_API IsPointInsidePolygon(Polygon2d& poly, float x, float y) { - bool inside = false; - sf::Vector2f vi, vj; - - for (std::size_t i = 0, j = poly.vertices.size() - 1; - i < poly.vertices.size(); - j = i++) { - vi = poly.vertices[i]; - vj = poly.vertices[j]; - if (((vi.y > y) != (vj.y > y)) && - (x < (vj.x - vi.x) * (y - vi.y) / (vj.y - vi.y) + vi.x)) - inside = !inside; - } - - return inside; -} \ No newline at end of file diff --git a/GDCpp/GDCpp/Runtime/PolygonCollision.h b/GDCpp/GDCpp/Runtime/PolygonCollision.h deleted file mode 100644 index 79a26387b..000000000 --- a/GDCpp/GDCpp/Runtime/PolygonCollision.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef POLYGONCOLLISION_H -#define POLYGONCOLLISION_H -#include -class Polygon2d; - -/** - * \brief Contains the result of PolygonCollisionTest. - * \see PolygonCollisionTest - * \ingroup GameEngine - */ -struct CollisionResult { - bool collision; - sf::Vector2f move_axis; -}; - -struct RaycastResult { - bool collision; - sf::Vector2f closePoint; - float closeSqDist; - sf::Vector2f farPoint; - float farSqDist; -}; - -/** - * Do a collision test between the two polygons. - * \warning Polygons must convexes. - * - * Uses Separating Axis Theorem ( - * http://en.wikipedia.org/wiki/Hyperplane_separation_theorem ) Based on - * http://www.codeproject.com/Articles/15573/2D-Polygon-Collision-Detection and - * http://stackoverflow.com/questions/5742329/problem-with-collision-response-sat - * - * \param p1 The first polygon - * \param p2 The second polygon - * \param ignoreTouchingEdges If true, then edges that are touching each other, - * without the polygons actually overlapping, won't be considered in collision. - * - * \return true if polygons are overlapping - * - * \ingroup GameEngine - */ -CollisionResult GD_API PolygonCollisionTest(Polygon2d& p1, - Polygon2d& p2, - bool ignoreTouchingEdges = false); - -/** - * Do a raycast test. - * \warning Polygon must be convex. - * For some theory check "Find the Intersection Point of Two Line Segments" - * (https://www.codeproject.com/Tips/862988/Find-the-Intersection-Point-of-Two-Line-Segments) - * - * \return A raycast result with the contact points and distances - * - * \ingroup GameEngine - */ -RaycastResult GD_API PolygonRaycastTest( - Polygon2d& poly, float startX, float startY, float endX, float endY); - -/** - * Check if a point is inside a polygon. - * - * Uses PNPOLY by W. Randolph Franklin - * (https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html) - * - * \return true if the point is inside the polygon - * - * \ingroup GameEngine - */ -bool GD_API IsPointInsidePolygon(Polygon2d& poly, float x, float y); - -#endif // POLYGONCOLLISION_H diff --git a/GDCpp/GDCpp/Runtime/Project/Behavior.cpp b/GDCpp/GDCpp/Runtime/Project/Behavior.cpp deleted file mode 100644 index dd28ef94b..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Behavior.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Behavior.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Behavior.h b/GDCpp/GDCpp/Runtime/Project/Behavior.h deleted file mode 100644 index 72d6c95a2..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Behavior.h +++ /dev/null @@ -1,8 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/Behavior.h" -typedef gd::Behavior Behavior; diff --git a/GDCpp/GDCpp/Runtime/Project/BehaviorContent.cpp b/GDCpp/GDCpp/Runtime/Project/BehaviorContent.cpp deleted file mode 100644 index 6d5f1b4ba..000000000 --- a/GDCpp/GDCpp/Runtime/Project/BehaviorContent.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/BehaviorContent.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/BehaviorContent.h b/GDCpp/GDCpp/Runtime/Project/BehaviorContent.h deleted file mode 100644 index f2656e7a2..000000000 --- a/GDCpp/GDCpp/Runtime/Project/BehaviorContent.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/BehaviorContent.h" diff --git a/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.cpp b/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.cpp deleted file mode 100644 index 99d42329c..000000000 --- a/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/BehaviorsSharedData.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.h b/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.h deleted file mode 100644 index 237feae00..000000000 --- a/GDCpp/GDCpp/Runtime/Project/BehaviorsSharedData.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/BehaviorsSharedData.h" diff --git a/GDCpp/GDCpp/Runtime/Project/Effect.cpp b/GDCpp/GDCpp/Runtime/Project/Effect.cpp deleted file mode 100644 index 56be37612..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Effect.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Effect.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Effect.h b/GDCpp/GDCpp/Runtime/Project/Effect.h deleted file mode 100644 index e54d95d5f..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Effect.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/Effect.h" diff --git a/GDCpp/GDCpp/Runtime/Project/EffectsContainer.cpp b/GDCpp/GDCpp/Runtime/Project/EffectsContainer.cpp deleted file mode 100644 index 1e13a433c..000000000 --- a/GDCpp/GDCpp/Runtime/Project/EffectsContainer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/EffectsContainer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/EffectsContainer.h b/GDCpp/GDCpp/Runtime/Project/EffectsContainer.h deleted file mode 100644 index b429d5610..000000000 --- a/GDCpp/GDCpp/Runtime/Project/EffectsContainer.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/EffectsContainer.h" diff --git a/GDCpp/GDCpp/Runtime/Project/ExternalLayout.cpp b/GDCpp/GDCpp/Runtime/Project/ExternalLayout.cpp deleted file mode 100644 index 1432c00a0..000000000 --- a/GDCpp/GDCpp/Runtime/Project/ExternalLayout.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/ExternalLayout.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/ExternalLayout.h b/GDCpp/GDCpp/Runtime/Project/ExternalLayout.h deleted file mode 100644 index dcd53ec50..000000000 --- a/GDCpp/GDCpp/Runtime/Project/ExternalLayout.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/ExternalLayout.h" diff --git a/GDCpp/GDCpp/Runtime/Project/InitialInstance.cpp b/GDCpp/GDCpp/Runtime/Project/InitialInstance.cpp deleted file mode 100644 index a3673a3fd..000000000 --- a/GDCpp/GDCpp/Runtime/Project/InitialInstance.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/InitialInstance.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/InitialInstance.h b/GDCpp/GDCpp/Runtime/Project/InitialInstance.h deleted file mode 100644 index 8ea637e3a..000000000 --- a/GDCpp/GDCpp/Runtime/Project/InitialInstance.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/InitialInstance.h" diff --git a/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.cpp b/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.cpp deleted file mode 100644 index e80f70e63..000000000 --- a/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/InitialInstancesContainer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.h b/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.h deleted file mode 100644 index 7b4f7c80c..000000000 --- a/GDCpp/GDCpp/Runtime/Project/InitialInstancesContainer.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/InitialInstancesContainer.h" diff --git a/GDCpp/GDCpp/Runtime/Project/Layer.cpp b/GDCpp/GDCpp/Runtime/Project/Layer.cpp deleted file mode 100644 index 1905946db..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Layer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Layer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Layer.h b/GDCpp/GDCpp/Runtime/Project/Layer.h deleted file mode 100644 index 96fe23059..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Layer.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/Layer.h" diff --git a/GDCpp/GDCpp/Runtime/Project/Layout.cpp b/GDCpp/GDCpp/Runtime/Project/Layout.cpp deleted file mode 100644 index 4278fc1b0..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Layout.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Layout.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Layout.h b/GDCpp/GDCpp/Runtime/Project/Layout.h deleted file mode 100644 index ea9759377..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Layout.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/Layout.h" diff --git a/GDCpp/GDCpp/Runtime/Project/Object.cpp b/GDCpp/GDCpp/Runtime/Project/Object.cpp deleted file mode 100644 index 7ec528050..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Object.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Object.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Object.h b/GDCpp/GDCpp/Runtime/Project/Object.h deleted file mode 100644 index 0c179cb05..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Object.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/Object.h" diff --git a/GDCpp/GDCpp/Runtime/Project/ObjectsContainer.cpp b/GDCpp/GDCpp/Runtime/Project/ObjectsContainer.cpp deleted file mode 100644 index a436af2e1..000000000 --- a/GDCpp/GDCpp/Runtime/Project/ObjectsContainer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/ObjectsContainer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Project.cpp b/GDCpp/GDCpp/Runtime/Project/Project.cpp deleted file mode 100644 index 2b9fbaffb..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Project.cpp +++ /dev/null @@ -1,12 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -// clang-format off -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCore/Project/Project.cpp" -// clang-format on -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Project.h b/GDCpp/GDCpp/Runtime/Project/Project.h deleted file mode 100644 index 6ef287181..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Project.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef GAME_H -#define GAME_H - -#include "GDCore/Project/Project.h" -typedef gd::Project Game; - -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.cpp b/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.cpp deleted file mode 100644 index 1fc822fb4..000000000 --- a/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/PropertyDescriptor.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.h b/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.h deleted file mode 100644 index 6437d8779..000000000 --- a/GDCpp/GDCpp/Runtime/Project/PropertyDescriptor.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/PropertyDescriptor.h" diff --git a/GDCpp/GDCpp/Runtime/Project/ResourcesManager.cpp b/GDCpp/GDCpp/Runtime/Project/ResourcesManager.cpp deleted file mode 100644 index c12855755..000000000 --- a/GDCpp/GDCpp/Runtime/Project/ResourcesManager.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/ResourcesManager.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/ResourcesManager.h b/GDCpp/GDCpp/Runtime/Project/ResourcesManager.h deleted file mode 100644 index dd07527b9..000000000 --- a/GDCpp/GDCpp/Runtime/Project/ResourcesManager.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/ResourcesManager.h" diff --git a/GDCpp/GDCpp/Runtime/Project/Variable.cpp b/GDCpp/GDCpp/Runtime/Project/Variable.cpp deleted file mode 100644 index 3e9354e34..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Variable.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/Variable.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/Variable.h b/GDCpp/GDCpp/Runtime/Project/Variable.h deleted file mode 100644 index e082b86f6..000000000 --- a/GDCpp/GDCpp/Runtime/Project/Variable.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef VARIABLE_H -#define VARIABLE_H - -#include "GDCore/Project/Variable.h" - -#endif // VARIABLE_H diff --git a/GDCpp/GDCpp/Runtime/Project/VariablesContainer.cpp b/GDCpp/GDCpp/Runtime/Project/VariablesContainer.cpp deleted file mode 100644 index f5ee5fae1..000000000 --- a/GDCpp/GDCpp/Runtime/Project/VariablesContainer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Project/VariablesContainer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Project/VariablesContainer.h b/GDCpp/GDCpp/Runtime/Project/VariablesContainer.h deleted file mode 100644 index 4110eff9a..000000000 --- a/GDCpp/GDCpp/Runtime/Project/VariablesContainer.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Project/VariablesContainer.h" diff --git a/GDCpp/GDCpp/Runtime/ResourcesLoader.cpp b/GDCpp/GDCpp/Runtime/ResourcesLoader.cpp deleted file mode 100644 index 561846b10..000000000 --- a/GDCpp/GDCpp/Runtime/ResourcesLoader.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#if !defined(GD_IDE_ONLY) -#include "GDCpp/Runtime/ResourcesLoader.h" -#include -#include -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/Music.h" -#undef LoadImage // Undef a macro from windows.h -#if defined(ANDROID) -#include -#endif - -using namespace std; - -namespace gd { - -ResourcesLoader* ResourcesLoader::_singleton = NULL; - -bool ResourcesLoader::SetResourceFile(const gd::String& filename) { - if (resFile.Read(filename)) { - std::cout << "Resource file set to " << filename << std::endl; - return true; - } - - return false; -} - -void ResourcesLoader::LoadSFMLImage(const gd::String& filename, - sf::Image& image) { - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - if (buffer == NULL) - cout << "Failed to get the file of a SFML image from resource file: " - << filename << endl; - - if (!image.loadFromMemory(buffer, resFile.GetFileSize(filename))) - cout << "Failed to load a SFML image from resource file: " << filename - << endl; - } else { - gd::SFMLFileStream stream; - if (!stream.open(filename) || !image.loadFromStream(stream)) - cout << "Failed to load a SFML image: " << filename << endl; - } -} - -sf::Texture ResourcesLoader::LoadSFMLTexture(const gd::String& filename) { - sf::Texture texture; - - LoadSFMLTexture(filename, texture); - - return texture; -} - -void ResourcesLoader::LoadSFMLTexture(const gd::String& filename, - sf::Texture& texture) { - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - if (buffer == NULL) - cout << "Failed to get the file of a SFML texture from resource file: " - << filename << endl; - - if (!texture.loadFromMemory(buffer, resFile.GetFileSize(filename))) - cout << "Failed to load a SFML texture from resource file: " << filename - << endl; - } else { - gd::SFMLFileStream stream; - if (!stream.open(filename) || !texture.loadFromStream(stream)) - cout << "Failed to load a SFML texture: " << filename << endl; - } -} - -std::pair ResourcesLoader::LoadFont( - const gd::String& filename) { - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - size_t bufferSize = resFile.GetFileSize(filename); - if (buffer == nullptr) { - cout << "Failed to get the file of a font from resource file:" << filename - << endl; - return std::make_pair((sf::Font*)nullptr, (StreamHolder*)nullptr); - } - - sf::Font* font = new sf::Font(); - char* fontBuffer = new char[bufferSize]; - memcpy(fontBuffer, buffer, bufferSize); - - if (!font->loadFromMemory(fontBuffer, bufferSize)) { - cout << "Failed to load a font from resource file: " << filename << endl; - delete font; - delete fontBuffer; - return std::make_pair((sf::Font*)nullptr, (StreamHolder*)nullptr); - } - - StreamHolder* streamHolder = new StreamHolder(); - streamHolder->buffer = fontBuffer; - return std::make_pair(font, streamHolder); - } else { - sf::Font* font = new sf::Font(); - StreamHolder* streamHolder = new StreamHolder(); - - if (!streamHolder->stream.open(filename) || - !font->loadFromStream(streamHolder->stream)) { - cout << "Failed to load a font from a file: " << filename << endl; - delete font; - delete streamHolder; - return std::make_pair((sf::Font*)nullptr, (StreamHolder*)nullptr); - } - - return std::make_pair(font, streamHolder); - } -} - -sf::SoundBuffer ResourcesLoader::LoadSoundBuffer(const gd::String& filename) { - sf::SoundBuffer sbuffer; - - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - if (buffer == NULL) - cout << "Failed to get the file of a sound buffer from resource file: " - << filename << endl; - - if (!sbuffer.loadFromMemory(buffer, resFile.GetFileSize(filename))) - cout << "Failed to load a sound buffer from resource file: " << filename - << endl; - } else { - gd::SFMLFileStream stream; - if (!stream.open(filename) || !sbuffer.loadFromStream(stream)) - cout << "Failed to load a sound buffer: " << filename << endl; - } - - return sbuffer; -} - -gd::String ResourcesLoader::LoadPlainText(const gd::String& filename) { - gd::String text; - - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - if (!buffer) { - cout << "Failed to read a file from resource file: " << filename << endl; - } else { - text = gd::String::FromUTF8(std::string(buffer)); - } - } else { - char* buffer = LoadBinaryFile(filename); - if (!buffer) - cout << "Failed to read plain text from a file: " << filename << endl; - else { - text = gd::String::FromUTF8(std::string(buffer)); - delete[] buffer; - } - } - - return text; -} - -/** - * Load a binary text file - */ -char* ResourcesLoader::LoadBinaryFile(const gd::String& filename) { - if (resFile.ContainsFile(filename)) { - char* buffer = resFile.GetFile(filename); - if (buffer == NULL) - cout << "Failed to read a binary file from resource file: " << filename - << endl; - - return buffer; - } else { -#if defined(ANDROID) - sf::FileInputStream file; - if (file.open(filename.ToLocale())) { - sf::Int64 size = file.getSize(); - char* memblock = new char[size]; - - file.read(memblock, size); - return memblock; - } -#else // TODO: Also use the SFML implementation? - gd::FileStream file(filename, ios::in | ios::binary | ios::ate); - if (file.is_open()) { - ifstream::pos_type size = file.tellg(); - char* memblock = new char[size]; - file.seekg(0, ios::beg); - file.read(memblock, size); - file.close(); - - return memblock; - } -#endif - } - - cout << "Binary file " << filename << " can't be loaded into memory " << endl; - return NULL; -} - -long int ResourcesLoader::GetBinaryFileSize(const gd::String& filename) { - if (resFile.ContainsFile(filename)) - return resFile.GetFileSize(filename); - else { -#if defined(ANDROID) - sf::FileInputStream file; - if (file.open(filename.ToLocale())) return file.getSize(); -#else // TODO: Also use the SFML implementation? - gd::FileStream file(filename, ios::in | ios::binary | ios::ate); - if (file.is_open()) { - return file.tellg(); - } -#endif - } - - std::cout << "Binary file " << filename << " cannot be read. " << std::endl; - return 0; -} - -bool ResourcesLoader::HasFile(const gd::String& filename) { - return resFile.ContainsFile(filename); -} - -} // namespace gd -#endif diff --git a/GDCpp/GDCpp/Runtime/ResourcesLoader.h b/GDCpp/GDCpp/Runtime/ResourcesLoader.h deleted file mode 100644 index 8438a348f..000000000 --- a/GDCpp/GDCpp/Runtime/ResourcesLoader.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if defined(GD_IDE_ONLY) -#include "GDCore/Project/ResourcesLoader.h" -#else -// Use a custom implementation at Runtime. - -#ifndef RESSOURCESLOADER_H -#define RESSOURCESLOADER_H - -#include "GDCpp/Runtime/DatFile.h" -class Music; -#include -#include -#include -#include "GDCpp/Runtime/String.h" -#include "GDCpp/Runtime/Tools/FileStream.h" -#undef LoadImage // Undef macro from windows.h - -namespace gd { - -/** - * \brief A class holding a buffer and/or a file stream (useful for SFML classes - * that needs their buffer/stream continuously opened) - */ -struct StreamHolder { - StreamHolder() : buffer(nullptr), stream() {} - ~StreamHolder() { - if (buffer) delete buffer; - } - - char *buffer; - gd::SFMLFileStream stream; -}; - -/** - * \brief Class used by games to load resources from files or from a DatFile. - * \note See GDCore documentation for the documentation of most functions. - * - * \ingroup ResourcesManagement - */ -class GD_API ResourcesLoader { - public: - /** - * \brief Set the name of the resource file to be open. - * \return true if file was successfully opened. - */ - bool SetResourceFile(const gd::String &filename); - - void LoadSFMLImage(const gd::String &filename, sf::Image &image); - - sf::Texture LoadSFMLTexture(const gd::String &filename); - void LoadSFMLTexture(const gd::String &filename, sf::Texture &texture); - - std::pair LoadFont(const gd::String &filename); - - sf::SoundBuffer LoadSoundBuffer(const gd::String &filename); - - gd::String LoadPlainText(const gd::String &filename); - - char *LoadBinaryFile(const gd::String &filename); - - long int GetBinaryFileSize(const gd::String &filename); - - bool HasFile(const gd::String &filename); - - static ResourcesLoader *Get() { - if (NULL == _singleton) { - _singleton = new ResourcesLoader; - } - - return (static_cast(_singleton)); - } - - static void DestroySingleton() { - if (NULL != _singleton) { - delete _singleton; - _singleton = NULL; - } - } - - private: - ResourcesLoader(){}; - virtual ~ResourcesLoader(){}; - - DatFile resFile; ///< Used to load data from a single resource file. - - static ResourcesLoader *_singleton; -}; - -} // namespace gd - -#endif // RESSOURCESLOADER_H - -#endif diff --git a/GDCpp/GDCpp/Runtime/RuntimeBehavior.cpp b/GDCpp/GDCpp/Runtime/RuntimeBehavior.cpp deleted file mode 100644 index 1f9a898f0..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeBehavior.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "RuntimeBehavior.h" - -RuntimeBehavior::~RuntimeBehavior(){}; \ No newline at end of file diff --git a/GDCpp/GDCpp/Runtime/RuntimeBehavior.h b/GDCpp/GDCpp/Runtime/RuntimeBehavior.h deleted file mode 100644 index f047632a5..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeBehavior.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * GDevelop Core - * Copyright 2008-present Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RUNTIMEBEHAVIOR_H -#define RUNTIMEBEHAVIOR_H -#include -#include "GDCore/String.h" -namespace gd { -class SerializerElement; -} // namespace gd -class RuntimeObject; -class RuntimeScene; - -/** - * \brief Base class used to represents a behavior that can be applied to an - * object during runtime. - * - * \ingroup PlatformDefinition - */ -class GD_CORE_API RuntimeBehavior { - public: - RuntimeBehavior(const gd::SerializerElement& behaviorContent) - : activated(true){ - }; - virtual ~RuntimeBehavior(); - virtual RuntimeBehavior* Clone() const { return new RuntimeBehavior(*this); } - - /** - * \brief Change the name identifying the behavior. - */ - virtual void SetName(const gd::String& name_) { name = name_; }; - - /** - * \brief Return the name identifying the behavior - */ - virtual const gd::String& GetName() const { return name; } - - /** - * Set the object owning this behavior - */ - void SetOwner(RuntimeObject* owner_) { - object = owner_; - OnOwnerChanged(); - }; - - /** - * Called at each frame before events. Call DoStepPreEvents. - */ - inline void StepPreEvents(RuntimeScene& scene) { - if (activated) DoStepPreEvents(scene); - }; - - /** - * Called at each frame after events. Call DoStepPostEvents. - */ - inline void StepPostEvents(RuntimeScene& scene) { - if (activated) DoStepPostEvents(scene); - }; - - /** - * De/Activate the behavior - */ - inline void Activate(bool enable = true) { - if (!activated && enable) { - activated = true; - OnActivate(); - } else if (activated && !enable) { - activated = false; - OnDeActivate(); - } - }; - - /** - * Return true if the behavior is activated - */ - inline bool Activated() const { return activated; }; - - /** - * Reimplement this method to do extra work when the behavior is activated - */ - virtual void OnActivate(){}; - /** - * Reimplement this method to do extra work when the behavior is deactivated - */ - virtual void OnDeActivate(){}; - - protected: - /** - * Called at each frame before events - */ - virtual void DoStepPreEvents(RuntimeScene& scene){}; - - /** - * Called at each frame after events - */ - virtual void DoStepPostEvents(RuntimeScene& scene){}; - - /** - * Redefine this method so as to do special works when owner is set. - */ - virtual void OnOwnerChanged(){}; - - gd::String name; ///< Name of the behavior - RuntimeObject* object; ///< Object owning the behavior - bool activated; ///< True if behavior is running -}; - -#endif // RUNTIMEBEHAVIOR_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeContext.cpp b/GDCpp/GDCpp/Runtime/RuntimeContext.cpp deleted file mode 100644 index 3787fbe26..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeContext.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "RuntimeContext.h" -#include -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/profile.h" - -bool RuntimeContext::TriggerOnce(std::size_t conditionId) { - onceConditionsTriggered[conditionId] = - true; // Remember that we triggered this condition. - - // Return true only if the condition was not triggered the last frame. - std::map::iterator lastFrame = - onceConditionsTriggeredLastFrame.find(conditionId); - return lastFrame == onceConditionsTriggeredLastFrame.end() || - lastFrame->second == false; -} - -void RuntimeContext::StartNewFrame() { - onceConditionsTriggeredLastFrame = onceConditionsTriggered; - onceConditionsTriggered.clear(); -} - -std::vector RuntimeContext::GetObjectsRawPointers( - const gd::String &name) { - return scene->objectsInstances.GetObjectsRawPointers(name); -} - -RuntimeVariablesContainer &RuntimeContext::GetSceneVariables() { - return scene->GetVariables(); -} - -RuntimeVariablesContainer &RuntimeContext::GetGameVariables() { - return scene->game->GetVariables(); -} - -RuntimeContext &RuntimeContext::ClearObjectListsMap() { - temporaryMap.clear(); - - return *this; -} - -RuntimeContext &RuntimeContext::AddObjectListToMap( - const gd::String &objectName, std::vector &list) { - temporaryMap[objectName] = &list; - - return *this; -} - -std::map *> -RuntimeContext::ReturnObjectListsMap() { - return temporaryMap; -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeContext.h b/GDCpp/GDCpp/Runtime/RuntimeContext.h deleted file mode 100644 index 5505391f8..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeContext.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef RUNTIMECONTEXT_H -#define RUNTIMECONTEXT_H - -#include -#include -#include -#include "GDCpp/Runtime/String.h" -class RuntimeObject; -class RuntimeScene; -class RuntimeVariablesContainer; - -/** - * \brief Helper class used by events generated code to get access to - * various things without including "heavy" classes such as RuntimeScene. - */ -class GD_API RuntimeContext { - public: - /** - * \brief Construct the context for a scene. - * \param scene The scene associated to the context. - */ - RuntimeContext(RuntimeScene *scene_) : scene(scene_){}; - virtual ~RuntimeContext(){}; - - /** - * \brief Shortcut to get a "raw pointers" list to objects with a specific - * name. Equivalent to : \code - * scene->objectsInstances.GetObjectsRawPointers(name) - * \endcode - */ - std::vector GetObjectsRawPointers(const gd::String &name); - - /** - * \brief Shortcut for scene->GetVariables(); - */ - RuntimeVariablesContainer &GetSceneVariables(); - - /** - * \brief Shortcut for scene.game->GetVariables(); - */ - RuntimeVariablesContainer &GetGameVariables(); - - /** - * \brief Used by "Trigger once" conditions: Return true only if - * this method was not called with the same identifier during the last frame. - */ - bool TriggerOnce(std::size_t conditionId); - - /** - * \brief To be called when events begin so that "Trigger once" conditions - * are properly handled. - */ - void StartNewFrame(); - - RuntimeContext &ClearObjectListsMap(); - RuntimeContext &AddObjectListToMap(const gd::String &objectName, - std::vector &list); - std::map *> ReturnObjectListsMap(); - - RuntimeScene *scene; ///< The associated scene. - - private: - std::map *> temporaryMap; - std::map onceConditionsTriggered; - std::map onceConditionsTriggeredLastFrame; -}; - -#endif // RUNTIMECONTEXT_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeGame.cpp b/GDCpp/GDCpp/Runtime/RuntimeGame.cpp deleted file mode 100644 index 65593511e..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeGame.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/RuntimeGame.h" -#include -#include -#include -#include -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeVariablesContainer.h" - -RuntimeGame::RuntimeGame() { - soundManager.SetResourcesManager(&GetResourcesManager()); -} - -void RuntimeGame::LoadFromProject(const gd::Project& project) { - // Copy inherited project - gd::Project::operator=(project); - - variables.Merge(project.GetVariables()); - soundManager.SetResourcesManager(&GetResourcesManager()); -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeGame.h b/GDCpp/GDCpp/Runtime/RuntimeGame.h deleted file mode 100644 index 6d2dacbff..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeGame.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RUNTIMEGAME_H -#define RUNTIMEGAME_H - -#include -#include -#include -#include -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeVariablesContainer.h" -#include "GDCpp/Runtime/SoundManager.h" -class SoundManager; - -/** - * \brief Represents a game being played. - * - * It contains everything a project provides, but also specific - * functions and members for runtime (variables...) - * - * \ingroup GameEngine - */ -class GD_API RuntimeGame : public gd::Project { - public: - RuntimeGame(); - virtual ~RuntimeGame(){}; - - /** - * \brief Set up the RuntimeGame using a gd::Project. - */ - void LoadFromProject(const gd::Project& project); - - /** - * Return the sound manager of the game. - */ - SoundManager& GetSoundManager() { return soundManager; }; - - /** - * Return the sound manager of the game. - */ - const SoundManager& GetSoundManager() const { return soundManager; }; - - /** - * \brief Provide access to the global variables container - */ - inline const RuntimeVariablesContainer& GetVariables() const { - return variables; - } - - /** - * \brief Provide access to the global variables container - */ - inline RuntimeVariablesContainer& GetVariables() { return variables; } - - /** - * \brief Get the width of the window at the startup of the game. - * \note This won't changed after the game startup, even if the window - * is resized. - */ - unsigned int getWindowOriginalWidth() const { return windowOriginalWidth; } - - /** - * \brief Get the height of the window at the startup of the game. - * \note This won't changed after the game startup, even if the window - * is resized. - */ - unsigned int getWindowOriginalHeight() const { return windowOriginalHeight; } - - private: - RuntimeVariablesContainer variables; ///< List of the global variables - SoundManager soundManager; - - unsigned int - windowOriginalWidth; ///< Game window width at the start of the game - unsigned int - windowOriginalHeight; ///< Game window height at the start of the game -}; - -#endif // RUNTIMEGAME_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeLayer.cpp b/GDCpp/GDCpp/Runtime/RuntimeLayer.cpp deleted file mode 100644 index 0812623d4..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeLayer.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "RuntimeLayer.h" -#include -#include "GDCpp/Runtime/Project/Layer.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -RuntimeLayer::RuntimeLayer(gd::Layer& layer, const sf::View& defaultView) - : name(layer.GetName()), isVisible(layer.GetVisibility()), timeScale(1) { - for (std::size_t i = 0; i < layer.GetCameraCount(); ++i) - cameras.push_back(RuntimeCamera(layer.GetCamera(i), defaultView)); -} - -signed long long RuntimeLayer::GetElapsedTime(const RuntimeScene& scene) const { - return scene.GetTimeManager().GetElapsedTime() * timeScale; -} - -RuntimeCamera::RuntimeCamera(sf::View& view) - : originalWidth(view.getSize().x), - originalHeight(view.getSize().y), - angle(0), - zoomFactor(1) { - sfmlView = view; -} - -RuntimeCamera::RuntimeCamera(gd::Camera& camera, const sf::View& defaultView) - : originalWidth(defaultView.getSize().x), - originalHeight(defaultView.getSize().y), - angle(0), - zoomFactor(1) { - sfmlView = defaultView; - if (!camera.UseDefaultViewport()) { - sfmlView.setViewport( - sf::FloatRect(camera.GetViewportX1(), - camera.GetViewportY1(), - camera.GetViewportX2() - camera.GetViewportX1(), - camera.GetViewportY2() - camera.GetViewportY1())); - } - - if (!camera.UseDefaultSize()) { - originalWidth = camera.GetWidth(); - originalHeight = camera.GetHeight(); - sfmlView.setSize(sf::Vector2f(originalWidth, originalHeight)); - } -} - -void RuntimeCamera::SetZoom(float newZoom) { - if (newZoom == 0) return; - - zoomFactor = newZoom; - sfmlView.setSize( - sf::Vector2f(originalWidth / zoomFactor, originalHeight / zoomFactor)); -} - -void RuntimeCamera::SetRotation(float newAngle) { - angle = newAngle; - sfmlView.setRotation(angle); -} - -void RuntimeCamera::SetViewCenter(const sf::Vector2f& newCenter) { - sfmlView.setCenter(newCenter); -} - -void RuntimeCamera::SetSize(float width_, float height_) { - originalWidth = width_; - originalHeight = height_; - sfmlView.setSize(originalWidth, originalHeight); - zoomFactor = 1; -} - -void RuntimeCamera::SetViewport(float x1, float y1, float x2, float y2) { - sfmlView.setViewport(sf::FloatRect(x1, y1, x2 - x1, y2 - y1)); -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeLayer.h b/GDCpp/GDCpp/Runtime/RuntimeLayer.h deleted file mode 100644 index b3d3d4bc3..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeLayer.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RUNTIMELAYER_H -#define RUNTIMELAYER_H -#include -#include "GDCpp/Runtime/String.h" -namespace gd { -class Camera; -} -namespace gd { -class Layer; -} -class RuntimeScene; - -/** - * \brief A camera which is displayed on a part of a window ( see Viewport - * related methods ) rendering an area of the scene. - * - * \ingroup GameEngine - */ -class GD_API RuntimeCamera { - public: - /** - * Construct a runtime camera from a nothing. - * - * \warning This constructor should not be used: See the two other - * alternatives. - */ - RuntimeCamera() - : originalWidth(0), originalHeight(0), angle(0), zoomFactor(1){}; - - /** - * Construct a runtime camera from a sf::View ( The SFML equivalent of a - * camera ). - */ - RuntimeCamera(sf::View& view); - - /** - * Construct a runtime camera from a Camera and a default view. - */ - RuntimeCamera(gd::Camera& camera, const sf::View& defaultView); - - /** - * Provide a read only access to the sf::View associated with the camera. - */ - const sf::View& GetSFMLView() const { return sfmlView; }; - - /** - * Change the zoom of the camera. - */ - void SetZoom(float newZoom); - - /** - * Get the zoom of the camera - */ - float GetZoom() const { return zoomFactor; }; - - /** - * Set the rotation of the camera. - * \param newAngle the new angle of the camera, in radians. - */ - void SetRotation(float newAngle); - - /** - * Get the rotation of the camera - */ - float GetRotation() const { return angle; }; - - /** - * Change the position of the view on the scene. - */ - void SetViewCenter(const sf::Vector2f& newCenter); - - /** - * Get the position of the view on the scene. - */ - const sf::Vector2f& GetViewCenter() const { return sfmlView.getCenter(); }; - - /** - * Change the size of the rendered area of the scene. - * Zoom is reset to 1. - */ - void SetSize(float width, float height); - - /** - * Get the width of the rendered area - */ - float GetWidth() const { - return zoomFactor != 0 ? originalWidth * 1.0 / zoomFactor : 0; - }; - - /** - * Get the height of the rendered area - */ - float GetHeight() const { - return zoomFactor != 0 ? originalHeight * 1.0 / zoomFactor : 0; - }; - - /** - * Change the position of the view on the scene. - */ - void SetViewport(float x1, float y1, float x2, float y2); - - private: - float originalWidth; - float originalHeight; - float angle; ///< Angle of the camera - float zoomFactor; ///< Zoom factor of the camera - - sf::View - sfmlView; ///< The sf::View which is the SFML equivalent of a camera. -}; - -/** - * \brief A layer of a layout, used to display objects using RuntimeCamera. - * - * \ingroup GameEngine - */ -class GD_API RuntimeLayer { - public: - RuntimeLayer() : isVisible(true), timeScale(1){}; - RuntimeLayer(gd::Layer& layer, const sf::View& defaultView); - virtual ~RuntimeLayer(){}; - - /** - * Change layer name - */ - virtual void SetName(const gd::String& name_) { name = name_; } - - /** - * Get layer name - */ - virtual const gd::String& GetName() const { return name; } - - /** - * Change if layer is displayed or not - */ - virtual void SetVisibility(bool isVisible_) { isVisible = isVisible_; } - - /** - * True if layer will be displayed. - */ - virtual bool GetVisibility() const { return isVisible; } - - /** - * Get cameras count. - */ - inline std::size_t GetCameraCount() const { return cameras.size(); }; - - /** - * Return a reference to a camera - */ - inline const RuntimeCamera& GetCamera(std::size_t n) const { - return cameras[n]; - } - - /** - * Return a reference to a camera - */ - inline RuntimeCamera& GetCamera(std::size_t n) { return cameras[n]; } - - /** - * Delete a specific camera. - */ - inline void DeleteCamera(std::size_t n) { - if (n < cameras.size()) cameras.erase(cameras.begin() + n); - } - - /** - * Add an already existing camera. - */ - inline void AddCamera(const RuntimeCamera& camera) { - cameras.push_back(camera); - }; - - /** - * \brief Get the time scale of the layer - */ - double GetTimeScale() { return timeScale; } - - /** - * \brief Change the time scale applied on the (objects of the) layer. - */ - void SetTimeScale(double timeScale_) { - if (timeScale_ >= 0) timeScale = timeScale_; - } - - /** - * \brief Return the time elapsed since the last frame, in microseconds, for - * the layer. This can be different than the time elapsed on the scene - */ - signed long long GetElapsedTime(const RuntimeScene& scene) const; - - private: - gd::String name; ///< The name of the layer - bool isVisible; ///< True if the layer is visible - std::vector cameras; ///< The camera displayed by the layer - double - timeScale; ///< Time scale that is applied on the (objects of the) layer. -}; - -#endif // RUNTIMELAYER_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeObject.cpp b/GDCpp/GDCpp/Runtime/RuntimeObject.cpp deleted file mode 100644 index f8ac37912..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeObject.cpp +++ /dev/null @@ -1,775 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/RuntimeObject.h" - -#include -#include -#include -#include - -#include "GDCore/CommonTools.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Extensions/Builtin/MathematicalTools.h" -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/Polygon2d.h" -#include "GDCpp/Runtime/PolygonCollision.h" -#include "GDCpp/Runtime/Project/Behavior.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeScene.h" - -using namespace std; - -RuntimeObject::RuntimeObject(RuntimeScene &scene, const gd::Object &object) - : name(object.GetName()), - type(object.GetType()), - X(0), - Y(0), - zOrder(0), - hidden(false), - objectVariables(object.GetVariables()) { - ClearForce(); - - // Create the behaviors - behaviors.clear(); - for (auto &it : object.GetAllBehaviorContents()) { - std::unique_ptr behavior = - CppPlatform::Get().CreateRuntimeBehavior(it.second->GetTypeName(), - it.second->GetContent()); - if (behavior) { - AddBehavior(it.first, std::move(behavior)); - } - } -} - -RuntimeObject::~RuntimeObject() {} - -void RuntimeObject::Init(const RuntimeObject &object) { - name = object.name; - type = object.type; - objectVariables = object.objectVariables; - - X = object.X; - Y = object.Y; - zOrder = object.zOrder; - hidden = object.hidden; - layer = object.layer; - force5 = object.force5; - forces = object.forces; - - // Clone behaviors - behaviors.clear(); - for (auto it = object.behaviors.cbegin(); it != object.behaviors.cend(); - ++it) { - behaviors[it->first] = - gd::make_unique(*it->second->Clone()); - behaviors[it->first]->SetOwner(this); - } -} - -/** - * \brief Add the specified behavior to the object - */ -void RuntimeObject::AddBehavior(const gd::String &name, - std::unique_ptr behavior) { - behaviors[name] = std::move(behavior); - behaviors[name]->SetOwner(this); -}; - -#if defined(GD_IDE_ONLY) -void RuntimeObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String &name, - gd::String &value) const { - if (propertyNb == 0) { - name = _("Position"); - value = gd::String::From(GetX()) + ";" + gd::String::From(GetY()); - } else if (propertyNb == 1) { - name = _("Angle"); - value = gd::String::From(GetAngle()) + u8"°"; - } else if (propertyNb == 2) { - name = _("Size"); - value = gd::String::From(GetWidth()) + ";" + gd::String::From(GetHeight()); - } else if (propertyNb == 3) { - name = _("Visibility"); - value = hidden ? _("Hidden") : _("Displayed"); - } else if (propertyNb == 4) { - name = _("Layer"); - value = layer; - } else if (propertyNb == 5) { - name = _("Z order"); - value = gd::String::From(zOrder); - } else if (propertyNb == 6) { - name = _("Speed"); - value = gd::String::From(TotalForceLength()); - } else if (propertyNb == 7) { - name = _("Angle of moving"); - value = gd::String::From(TotalForceAngle()); - } else if (propertyNb == 8) { - name = _("X coordinate of moving"); - value = gd::String::From(TotalForceX()); - } else if (propertyNb == 9) { - name = _("Y coordinate of moving"); - value = gd::String::From(TotalForceY()); - } -} - -bool RuntimeObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - size_t separationPos = newValue.find(";"); - - if (separationPos > newValue.length()) return false; - - gd::String xValue = newValue.substr(0, separationPos); - gd::String yValue = newValue.substr(separationPos + 1, newValue.length()); - - SetX(xValue.To()); - SetY(yValue.To()); - } else if (propertyNb == 1) { - return SetAngle(newValue.To()); - } else if (propertyNb == 2) { - return false; - } else if (propertyNb == 3) { - if (newValue == _("Hidden")) { - SetHidden(); - } else - SetHidden(false); - } else if (propertyNb == 4) { - layer = newValue; - } else if (propertyNb == 5) { - SetZOrder(newValue.To()); - } else if (propertyNb == 6) { - return false; - } else if (propertyNb == 7) { - return false; - } else if (propertyNb == 8) { - return false; - } else if (propertyNb == 9) { - return false; - } - - return true; -} - -std::size_t RuntimeObject::GetNumberOfProperties() const { - // Be careful, properties start at 0. - return 10; -} -#endif - -signed long long RuntimeObject::GetElapsedTime( - const RuntimeScene &scene) const { - const RuntimeLayer &theLayer = scene.GetRuntimeLayer(layer); - return theLayer.GetElapsedTime(scene); -} - -void RuntimeObject::DeleteFromScene(RuntimeScene &scene) { - name = ""; - - // Notify scene that object's name has changed. - scene.objectsInstances.ObjectNameHasChanged(this); -} - -void RuntimeObject::PutAroundAPosition(float positionX, - float positionY, - float distance, - float angleInDegrees) { - double angle = angleInDegrees / 180.0f * 3.14159; - - // Offset the position by the center, as PutAround* methods should position - // the center of the object (just like GetSqDistanceTo, RaycastTest uses - // center too). - SetX(positionX + cos(angle) * distance + GetX() - - (GetDrawableX() + GetCenterX())); - SetY(positionY + sin(angle) * distance + GetY() - - (GetDrawableY() + GetCenterY())); -} - -void RuntimeObject::AddForce(float x, float y, float clearing) { - forces.push_back(Force(x, y, clearing)); -} - -void RuntimeObject::AddForceUsingPolarCoordinates(float angle, - float length, - float clearing) { - angle *= 3.14159 / 180.0; - forces.push_back(Force(cos(angle) * length, sin(angle) * length, clearing)); -} -/** - * Add a force toward a position - */ -void RuntimeObject::AddForceTowardPosition(float positionX, - float positionY, - float length, - float clearing) { - // Workaround Visual C++ internal error (!) by using temporary doubles. - double y = positionY - (GetDrawableY() + GetCenterY()); - double x = positionX - (GetDrawableX() + GetCenterX()); - float angle = atan2(y, x); - - forces.push_back(Force(cos(angle) * length, sin(angle) * length, clearing)); -} - -void RuntimeObject::AddForceToMoveAround(float positionX, - float positionY, - float angularVelocity, - float distance, - float clearing) { - // Angle en degré entre les deux objets - - // Workaround Visual C++ internal error (!) by using temporary doubles. - double y = (GetDrawableY() + GetCenterY()) - positionY; - double x = (GetDrawableX() + GetCenterX()) - positionX; - float angle = atan2(y, x) * 180 / 3.14159f; - float newangle = angle + angularVelocity; - - // position actuelle de l'objet 1 par rapport à l'objet centre - int oldX = (GetDrawableX() + GetCenterX()) - positionX; - int oldY = (GetDrawableY() + GetCenterY()) - positionY; - - // nouvelle position à atteindre - int newX = cos(newangle / 180.f * 3.14159f) * distance; - int newY = sin(newangle / 180.f * 3.14159f) * distance; - - forces.push_back(Force(newX - oldX, newY - oldY, clearing)); -} - -void RuntimeObject::Duplicate( - RuntimeScene &scene, - std::map *> pickedObjectLists) { - RuntimeObject *newObject = - scene.objectsInstances.AddObject(std::unique_ptr(Clone())); - - if (pickedObjectLists[name] != NULL && - find(pickedObjectLists[name]->begin(), - pickedObjectLists[name]->end(), - newObject) == pickedObjectLists[name]->end()) - pickedObjectLists[name]->push_back(newObject); -} - -bool RuntimeObject::IsStopped() { return TotalForceLength() == 0; } - -bool RuntimeObject::TestAngleOfDisplacement(float angle, float tolerance) { - if (TotalForceLength() == 0) return false; - - float objectAngle = TotalForceAngle(); - - // Compute difference between two angles - float diff = objectAngle - angle; - while (diff > 180) diff -= 360; - while (diff < -180) diff += 360; - - if (fabs(diff) <= tolerance / 2) return true; - - return false; -} - -void RuntimeObject::ActivateBehavior(const gd::String &behaviorName, - bool activate) { - if (GetBehaviorRawPointer(behaviorName)) - GetBehaviorRawPointer(behaviorName)->Activate(activate); -} - -bool RuntimeObject::BehaviorActivated(const gd::String &behaviorName) { - if (GetBehaviorRawPointer(behaviorName)) - return GetBehaviorRawPointer(behaviorName)->Activated(); - else - return false; -} - -double RuntimeObject::GetSqDistanceTo(double pointX, double pointY) { - double x = GetDrawableX() + GetCenterX() - pointX; - double y = GetDrawableY() + GetCenterY() - pointY; - - return x * x + y * y; -} - -double RuntimeObject::GetSqDistanceWithObject(RuntimeObject *object) { - if (object == NULL) return 0; - - return GetSqDistanceTo(object->GetDrawableX() + object->GetCenterX(), - object->GetDrawableY() + object->GetCenterY()); -} - -double RuntimeObject::GetDistanceWithObject(RuntimeObject *object) { - return sqrt(GetSqDistanceWithObject(object)); -} - -bool RuntimeObject::SeparateFromObjects( - std::map *> pickedObjectLists, - bool ignoreTouchingEdges) { - vector objects; - for (std::map *>::const_iterator it = - pickedObjectLists.begin(); - it != pickedObjectLists.end(); - ++it) { - if (it->second != NULL) { - objects.reserve(objects.size() + it->second->size()); - std::copy( - it->second->begin(), it->second->end(), std::back_inserter(objects)); - } - } - - return SeparateFromObjects(objects, ignoreTouchingEdges); -} - -bool RuntimeObject::SeparateFromObjects( - const std::vector &objects, bool ignoreTouchingEdges) { - bool moved = false; - sf::Vector2f moveVector; - for (std::size_t j = 0; j < objects.size(); ++j) { - if (objects[j] != this) { - std::vector hitBoxes = GetHitBoxes(objects[j]->GetAABB()); - vector otherHitBoxes = objects[j]->GetHitBoxes(GetAABB()); - for (std::size_t k = 0; k < hitBoxes.size(); ++k) { - for (std::size_t l = 0; l < otherHitBoxes.size(); ++l) { - CollisionResult result = PolygonCollisionTest( - hitBoxes[k], otherHitBoxes[l], ignoreTouchingEdges); - if (result.collision) { - moveVector += result.move_axis; - moved = true; - } - } - } - } - } - SetX(GetX() + moveVector.x); - SetY(GetY() + moveVector.y); - return moved; -} - -void RuntimeObject::RotateTowardPosition(float Xposition, - float Yposition, - float speed, - RuntimeScene &scene) { - // Work around for a Visual C++ internal compiler error (!) - double y = Yposition - (GetDrawableY() + GetCenterY()); - double x = Xposition - (GetDrawableX() + GetCenterX()); - float angle = atan2(y, x) * 180.0 / gd::Pi(); - - RotateTowardAngle(angle, speed, scene); -} - -void RuntimeObject::RotateTowardAngle(float angleInDegrees, - float speed, - RuntimeScene &scene) { - if (speed == 0) { - SetAngle(angleInDegrees); - return; - } - - float timeDelta = static_cast(GetElapsedTime(scene)) / 1000000.0; - float angularDiff = - GDpriv::MathematicalTools::angleDifference(GetAngle(), angleInDegrees); - bool diffWasPositive = angularDiff >= 0; - - float newAngle = - GetAngle() + (diffWasPositive ? -1.0 : 1.0) * speed * timeDelta; - if ((GDpriv::MathematicalTools::angleDifference(newAngle, angleInDegrees) > - 0) ^ - diffWasPositive) - newAngle = angleInDegrees; - SetAngle(newAngle); - - if (GetAngle() != newAngle) // Objects like sprite in 8 directions does not - // handle small increments... - SetAngle( - angleInDegrees); //...so force them to be in the path angle anyway. -} - -void RuntimeObject::Rotate(float speed, RuntimeScene &scene) { - float timeDelta = static_cast(GetElapsedTime(scene)) / 1000000.0; - SetAngle(GetAngle() + speed * timeDelta); -} - -bool RuntimeObject::IsCollidingWith(RuntimeObject *obj2, - bool ignoreTouchingEdges) { - // First check if bounding circle are too far. - RuntimeObject *obj1 = this; - float o1w = obj1->GetWidth(); - float o1h = obj1->GetHeight(); - float o2w = obj2->GetWidth(); - float o2h = obj2->GetHeight(); - - float x = obj1->GetDrawableX() + obj1->GetCenterX() - - (obj2->GetDrawableX() + obj2->GetCenterX()); - float y = obj1->GetDrawableY() + obj1->GetCenterY() - - (obj2->GetDrawableY() + obj2->GetCenterY()); - float obj1BoundingRadius = sqrt(o1w * o1w + o1h * o1h) / 2.0; - float obj2BoundingRadius = sqrt(o2w * o2w + o2h * o2h) / 2.0; - - if (sqrt(x * x + y * y) > obj1BoundingRadius + obj2BoundingRadius) - return false; - - // Do a real check if necessary. - - // Get the bounding rect of the two objects to use them - // as a hint to get the other's hitboxes - sf::FloatRect objRect = obj1->GetAABB(); - sf::FloatRect obj2Rect = obj2->GetAABB(); - - vector objHitboxes = obj1->GetHitBoxes(obj2Rect); - vector obj2Hitboxes = obj2->GetHitBoxes(objRect); - for (std::size_t k = 0; k < objHitboxes.size(); ++k) { - for (std::size_t l = 0; l < obj2Hitboxes.size(); ++l) { - if (PolygonCollisionTest( - objHitboxes[k], obj2Hitboxes[l], ignoreTouchingEdges) - .collision) - return true; - } - } - - return false; -} - -bool RuntimeObject::IsCollidingWithPoint(float pointX, float pointY) { - vector hitBoxes = GetHitBoxes(); - for (std::size_t i = 0; i < hitBoxes.size(); ++i) { - if (IsPointInsidePolygon(hitBoxes[i], pointX, pointY)) return true; - } - - return false; -} - -RaycastResult RuntimeObject::RaycastTest( - float x, float y, float endX, float endY, bool closest) { - float objW = GetWidth(); - float objH = GetHeight(); - float diffX = GetDrawableX() + GetCenterX() - x; - float diffY = GetDrawableY() + GetCenterY() - y; - float sqBoundingR = (objW * objW + objH * objH) / 4.0; - float sqDist = (endX - x) * (endX - x) + (endY - y) * (endY - y); - - RaycastResult result; - result.collision = false; - - if (diffX * diffX + diffY * diffY > - sqBoundingR + sqDist + 2 * sqrt(sqDist * sqBoundingR)) - return result; - - float testSqDist = closest ? sqDist : 0.0f; - - vector hitboxes = GetHitBoxes(); - for (std::size_t i = 0; i < hitboxes.size(); ++i) { - RaycastResult res = PolygonRaycastTest(hitboxes[i], x, y, endX, endY); - - if (res.collision) { - if (closest && (res.closeSqDist < testSqDist)) { - testSqDist = res.closeSqDist; - result = res; - } else if (!closest && (res.farSqDist > testSqDist) && - (res.farSqDist <= sqDist)) { - testSqDist = res.farSqDist; - result = res; - } - } - } - - return result; -} - -void RuntimeObject::SeparateObjectsWithoutForces( - std::map *> pickedObjectLists) { - vector objects2; - for (std::map *>::const_iterator it = - pickedObjectLists.begin(); - it != pickedObjectLists.end(); - ++it) { - if (it->second != NULL) { - objects2.reserve(objects2.size() + it->second->size()); - std::copy( - it->second->begin(), it->second->end(), std::back_inserter(objects2)); - } - } - - for (std::size_t j = 0; j < objects2.size(); ++j) { - if (objects2[j] != this) { - float Left1 = GetDrawableX(); - float Left2 = objects2[j]->GetDrawableX(); - float Right1 = GetDrawableX() + GetWidth(); - float Right2 = objects2[j]->GetDrawableX() + objects2[j]->GetWidth(); - float Top1 = GetDrawableY(); - float Top2 = objects2[j]->GetDrawableY(); - float Bottom1 = GetDrawableY() + GetHeight(); - float Bottom2 = objects2[j]->GetDrawableY() + objects2[j]->GetHeight(); - - if (Left1 < Left2) { - SetX(Left2 - GetWidth()); - } else if (Right1 > Right2) { - SetX(Right2); - } - - if (Top1 < Top2) { - SetY(Top2 - GetHeight()); - } else if (Bottom1 > Bottom2) { - SetY(Bottom2); - } - } - } -} - -void RuntimeObject::SeparateObjectsWithForces( - std::map *> pickedObjectLists) { - vector objects2; - for (std::map *>::const_iterator it = - pickedObjectLists.begin(); - it != pickedObjectLists.end(); - ++it) { - if (it->second != NULL) { - objects2.reserve(objects2.size() + it->second->size()); - std::copy( - it->second->begin(), it->second->end(), std::back_inserter(objects2)); - } - } - - for (std::size_t j = 0; j < objects2.size(); ++j) { - if (objects2[j] != this) { - float Xobj1 = GetDrawableX() + (GetCenterX()); - float Yobj1 = GetDrawableY() + (GetCenterY()); - float Xobj2 = objects2[j]->GetDrawableX() + (objects2[j]->GetCenterX()); - float Yobj2 = objects2[j]->GetDrawableY() + (objects2[j]->GetCenterY()); - - if (Xobj1 < Xobj2) { - if (force5.GetX() == 0) force5.SetX(-(TotalForceX()) - 10); - } else { - if (force5.GetX() == 0) force5.SetX(-(TotalForceX()) + 10); - } - - if (Yobj1 < Yobj2) { - if (force5.GetY() == 0) force5.SetY(-(TotalForceY()) - 10); - } else { - if (force5.GetY() == 0) force5.SetY(-(TotalForceY()) + 10); - } - } - } -} - -void RuntimeObject::AddForceTowardObject(RuntimeObject *object, - float length, - float clearing) { - if (object == NULL) return; - - AddForceTowardPosition(object->GetDrawableX() + object->GetCenterX(), - object->GetDrawableY() + object->GetCenterY(), - length, - clearing); -} - -void RuntimeObject::AddForceToMoveAroundObject(RuntimeObject *object, - float velocity, - float length, - float clearing) { - if (object == NULL) return; - - AddForceToMoveAround(object->GetDrawableX() + object->GetCenterX(), - object->GetDrawableY() + object->GetCenterY(), - velocity, - length, - clearing); -} - -void RuntimeObject::PutAroundObject(RuntimeObject *object, - float length, - float angleInDegrees) { - if (object == NULL) return; - - PutAroundAPosition(object->GetDrawableX() + object->GetCenterX(), - object->GetDrawableY() + object->GetCenterY(), - length, - angleInDegrees); -} - -void RuntimeObject::SetXY(const char *xOperator, - float xValue, - const char *yOperator, - float yValue) { - if (strcmp(xOperator, "") == 0 || strcmp(xOperator, "=") == 0) - SetX(xValue); - else if (strcmp(xOperator, "+") == 0) - SetX(GetX() + xValue); - else if (strcmp(xOperator, "-") == 0) - SetX(GetX() - xValue); - else if (strcmp(xOperator, "*") == 0) - SetX(GetX() * xValue); - else if (strcmp(xOperator, "/") == 0) - SetX(GetX() / xValue); - - if (strcmp(yOperator, "") == 0 || strcmp(yOperator, "=") == 0) - SetY(yValue); - else if (strcmp(yOperator, "+") == 0) - SetY(GetY() + yValue); - else if (strcmp(yOperator, "-") == 0) - SetY(GetY() - yValue); - else if (strcmp(yOperator, "*") == 0) - SetY(GetY() * yValue); - else if (strcmp(yOperator, "/") == 0) - SetY(GetY() / yValue); -} - -sf::FloatRect RuntimeObject::GetAABB() const { - sf::FloatRect notTransformedAABB( - -GetCenterX(), -GetCenterY(), GetWidth(), GetHeight()); - - sf::Transform rotationTransform; - rotationTransform.rotate(GetAngle()); - - sf::Vector2f translationVec = sf::Vector2f(GetDrawableX() + GetCenterX(), - GetDrawableY() + GetCenterY()); - sf::Transform translationTransform; - translationTransform.translate(translationVec.x, translationVec.y); - - sf::Transform resultTransform; - resultTransform = translationTransform * rotationTransform; - - return resultTransform.transformRect(notTransformedAABB); -} - -std::vector RuntimeObject::GetHitBoxes() const { - std::vector mask; - Polygon2d rectangle = Polygon2d::CreateRectangle(GetWidth(), GetHeight()); - rectangle.Rotate(GetAngle() / 180 * 3.14159); - rectangle.Move(GetX() + GetCenterX(), GetY() + GetCenterY()); - - mask.push_back(rectangle); - return mask; -} - -std::vector RuntimeObject::GetHitBoxes(sf::FloatRect hint) const { - return GetHitBoxes(); -} - -bool RuntimeObject::CursorOnObject(RuntimeScene &scene, bool) { - RuntimeLayer &theLayer = scene.GetRuntimeLayer(layer); - auto insideObject = [this](const sf::Vector2f &pos) { - return GetDrawableX() <= pos.x && GetDrawableX() + GetWidth() >= pos.x && - GetDrawableY() <= pos.y && GetDrawableY() + GetHeight() >= pos.y; - }; - - for (std::size_t cameraIndex = 0; cameraIndex < theLayer.GetCameraCount(); - ++cameraIndex) { - const auto &view = theLayer.GetCamera(cameraIndex).GetSFMLView(); - - sf::Vector2f mousePos = scene.renderWindow->mapPixelToCoords( - scene.GetInputManager().GetMousePosition(), view); - - if (insideObject(mousePos)) return true; - - auto &touches = scene.GetInputManager().GetAllTouches(); - for (auto &it : touches) { - sf::Vector2f touchPos = - scene.renderWindow->mapPixelToCoords(it.second, view); - if (insideObject(touchPos)) return true; - } - } - - return false; -} - -RuntimeBehavior *RuntimeObject::GetBehaviorRawPointer(const gd::String &name) { - return behaviors.find(name)->second.get(); -} - -RuntimeBehavior *RuntimeObject::GetBehaviorRawPointer( - const gd::String &name) const { - return behaviors.find(name)->second.get(); -} - -bool RuntimeObject::ClearForce() { - force5.SetLength(0); // Clear the deprecated force - force5.SetClearing(0); - - forces.clear(); - - return true; -} - -bool RuntimeObject::UpdateForce(float elapsedTime) { - force5.SetLength(force5.GetLength() - force5.GetLength() * - (1 - force5.GetClearing()) * - elapsedTime); - if (force5.GetClearing() == 0) force5.SetLength(0); - - for (std::size_t i = 0; i < forces.size();) { - if (forces[i].GetClearing() == 0 || forces[i].GetLength() <= 0.001) - forces.erase(forces.begin() + i); - else { - forces[i].SetLength(forces[i].GetLength() - - forces[i].GetLength() * - (1 - forces[i].GetClearing()) * elapsedTime); - ++i; - } - } - - return true; -} - -float RuntimeObject::TotalForceX() const { - float ForceXsimple = 0; - for (std::size_t i = 0; i < forces.size(); i++) - ForceXsimple += forces[i].GetX(); - - return ForceXsimple + force5.GetX(); -} - -float RuntimeObject::TotalForceY() const { - float ForceYsimple = 0; - for (std::size_t i = 0; i < forces.size(); i++) - ForceYsimple += forces[i].GetY(); - - return ForceYsimple + force5.GetY(); -} - -float RuntimeObject::TotalForceAngle() const { - Force ForceMoyenne; - ForceMoyenne.SetX(TotalForceX()); - ForceMoyenne.SetY(TotalForceY()); - - return ForceMoyenne.GetAngle(); -} - -float RuntimeObject::TotalForceLength() const { - Force ForceMoyenne; - ForceMoyenne.SetX(TotalForceX()); - ForceMoyenne.SetY(TotalForceY()); - - return ForceMoyenne.GetLength(); -} - -void RuntimeObject::DoBehaviorsPreEvents(RuntimeScene &scene) { - for (auto it = behaviors.cbegin(); it != behaviors.cend(); ++it) - it->second->StepPreEvents(scene); -} - -void RuntimeObject::DoBehaviorsPostEvents(RuntimeScene &scene) { - for (auto it = behaviors.cbegin(); it != behaviors.cend(); ++it) - it->second->StepPostEvents(scene); -} - -bool RuntimeObject::VariableExists(const gd::String &variable) { - return objectVariables.Has(variable); -} - -bool RuntimeObject::VariableChildExists(const gd::Variable &variable, - const gd::String &childName) { - return variable.HasChild(childName); -} - -void RuntimeObject::VariableRemoveChild(gd::Variable &variable, - const gd::String &childName) { - variable.RemoveChild(childName); -} - -void RuntimeObject::VariableClearChildren(gd::Variable &variable) { - variable.ClearChildren(); -} - -unsigned int RuntimeObject::GetVariableChildCount(gd::Variable &variable) { - if (variable.GetType() != gd::Variable::Type::Structure && - variable.GetType() != gd::Variable::Type::Array) - return 0; - return variable.GetChildrenCount(); -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeObject.h b/GDCpp/GDCpp/Runtime/RuntimeObject.h deleted file mode 100644 index c3b6cfaf5..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeObject.h +++ /dev/null @@ -1,630 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RUNTIMEOBJECT_H -#define RUNTIMEOBJECT_H - -#include -#include -#include -#include -#include -#include "GDCore/Tools/MakeUnique.h" -#include "GDCpp/Runtime/Force.h" -#include "GDCpp/Runtime/RuntimeBehavior.h" -#include "GDCpp/Runtime/RuntimeVariablesContainer.h" -#include "GDCpp/Runtime/String.h" -namespace gd { -class InitialInstance; -class Object; -} -namespace sf { -class RenderTarget; -} -class Polygon2d; -class RaycastResult; -class RuntimeScene; - -/** - * \brief A RuntimeObject is something displayed on the scene. - * - * Games don't directly use this class: Extensions can provide object by - * deriving from this class, and redefining functions: - * - The constructor must have this signature : MyRuntimeObject(RuntimeScene & - * scene, const MyObject & object) with MyObject the class inheriting from - * gd::Object. - * - An important function is RuntimeObject::Draw. It is called to render the - * object on the scene. This function take in parameter a reference to the - * target where render the object. - * - RuntimeObject must be able to return their size, by redefining - * RuntimeObject::GetWidth and RuntimeObject::GetHeight - * - RuntimeObject must be able to return the position where they have precisely - * drawn ( for example, Sprite can draw its image not exactly at the position of - * the object, if the origin point was moved ). It must also be able to return - * the position of their center. See RuntimeObject::GetDrawableX, - * RuntimeObject::GetDrawableY and RuntimeObject::GetCenterX, - * RuntimeObject::GetCenterY. - * - If objects need to load resources ( for example textures at the loading ), - * it must be done inside the constructor creating the object from a gd::Object. - * - When objects are placed at the start of the scene, scenes call - * RuntimeObject::ExtraInitializationFromInitialInstance, passing a - * gd::InitialInstance object in parameter ( containing information like the - * position where place the object ). Note that common information were already - * changed ( Position, angle, layer... ). You just need to setup the object with - * the information related to your object. - * - Finally, objects can expose debugging features: - * RuntimeObject::GetPropertyForDebugger, RuntimeObject::ChangeProperty and - * RuntimeObject::GetNumberOfProperties - * - * See also gd::Object which is used to store the initial objects before they - * are put on the scene. - * - * \see gd::Object - * - * \ingroup GameEngine - */ -class GD_API RuntimeObject { - public: - using Ref = RuntimeObject*; - using OwningPtr = RuntimeObject*; - - /** - * \brief Construct a RuntimeObject from an object. - * - * The default implementation already takes care of setting common properties - * ( name, type, behaviors... ). Be sure to call the original constructor if - * you redefine it: \code MyRuntimeObject(RuntimeScene & scene, const MyObject - * & object) : RuntimeObject(scene, object) - * { - * //... - * } - * \endcode - * \note The constructor can take a specialized gd::Object as its second - * parameter which is the gd::Object sub-class declared in - * ExtensionBase::AddRuntimeObject (the first template parameter) - */ - RuntimeObject(RuntimeScene& scene, const gd::Object& object); - - /** - * \brief Copy constructor. Calls Init(). - */ - RuntimeObject(const RuntimeObject& object) { Init(object); }; - - /** - * \brief Assignment operator. Calls Init(). - */ - RuntimeObject& operator=(const RuntimeObject& object) { - if ((this) != &object) Init(object); - return *this; - } - - /** \brief Default destructor - */ - virtual ~RuntimeObject(); - - /** - * \brief Must return a pointer to a copy of the object. A such method is - * needed to do polymorphic copies. - * - * Just redefine this method in your derived object class like this: - * \code - * return new MyRuntimeObject(*this); - * \endcode - */ - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - /** - * \brief Called by RuntimeScene when creating the RuntimeObject from an - * initial instance. - * - * \note The RuntimeScene already takes care of setting common properties - * (position, angle... ) according to the InitialInstance. You only need to - * initialize extra properties specific to your object. - */ - virtual bool ExtraInitializationFromInitialInstance( - const gd::InitialInstance& position) { - return true; - } - - /** - * \brief Draw the object. - * \param renderTarget The SFML Rendertarget where object must be drawn. - */ - virtual bool Draw(sf::RenderTarget& renderTarget) { return true; }; - - /** \name Object variables - * Members functions providing access to the object variables. - */ - ///@{ - - /** - * \brief Provide access to variables of the object. - */ - inline const RuntimeVariablesContainer& GetVariables() const { - return objectVariables; - } - - /** - * \brief Provide access to variables of the object. - */ - inline RuntimeVariablesContainer& GetVariables() { return objectVariables; } - - ///@} - - /** \name Behavior related functions - * Functions related to behaviors management. - */ - ///@{ - /** - * \brief Call each behavior so that they do their work before events - */ - void DoBehaviorsPreEvents(RuntimeScene& scene); - - /** - * \brief Call each behavior so that they do their work after the events were - * runn. - */ - void DoBehaviorsPostEvents(RuntimeScene& scene); - - /** - * Only used by GD events generated code - */ - RuntimeBehavior* GetBehaviorRawPointer(const gd::String& name); - - /** - * Only used by GD events generated code - */ - RuntimeBehavior* GetBehaviorRawPointer(const gd::String& name) const; - - /** - * \brief Return true if the object has the behavior with the specified name. - */ - bool HasBehaviorNamed(const gd::String& name) const { - return behaviors.find(name) != behaviors.end(); - }; - - /** - * \brief Add the specified behavior to the object - */ - void AddBehavior(const gd::String& name, std::unique_ptr behavior); - ///@} - - /** - * \brief Get the name of the object - */ - inline const gd::String& GetName() const { return name; }; - - /** - * \brief Get the type of the object - */ - inline const gd::String& GetType() const { return type; }; - - /** - * \brief Query the Z order of the object - */ - inline int GetZOrder() const { return zOrder; } - - /** - * \brief Change the Z order of the object - */ - inline void SetZOrder(int zOrder_) { zOrder = zOrder_; } - - /** - * \brief Return if the object is hidden or not - */ - inline bool IsHidden() const { return hidden; }; - - /** - * \brief Return if the object is visible ( not hidden ) - */ - inline bool IsVisible() const { return !hidden; }; - - /** - * \brief Hide/Show the object - */ - inline void SetHidden(bool hide = true) { hidden = hide; }; - - /** - * \brief Change the layer of the object - */ - inline void SetLayer(const gd::String& layer_) { layer = layer_; } - - /** - * \brief Get the layer of the object - */ - inline const gd::String& GetLayer() const { return layer; } - - /** - * \brief Check if the object is on a layer. - */ - inline bool IsOnLayer(const gd::String& layer_) const { - return layer == layer_; - } - - /** - * \brief Get the object AABB - */ - sf::FloatRect GetAABB() const; - - /** - * \brief Get the object hitbox(es) - * \note Default implementation returns a basic bounding box, according to the - * object width/height and angle. - */ - virtual std::vector GetHitBoxes() const; - - /** - * \brief Get the object hitbox(es) preferably intersecting with hint - * \note The default implementation returns all the hitbox given by - * GetHitBoxes() - */ - virtual std::vector GetHitBoxes(sf::FloatRect hint) const; - - /** - * \brief Check collision between two objects using their hitboxes. - * - * \note If bounding circles of objects are not colliding, hit boxes are not - * tested. - * - * \param other The other object for collision to be tested against. - * - * \param ignoreTouchingEdges If true, then edges that are touching each - * other, without the hitbox polygons actually overlapping, won't be - * considered in collision. - */ - bool IsCollidingWith(RuntimeObject* other, bool ignoreTouchingEdges = false); - - /** - * \brief Check if a point is inside the object collision hitboxes. - * \param pointX The point x coordinate. - * \param pointY The point y coordinate. - * \return true if the point is inside the object collision hitboxes. - */ - bool IsCollidingWithPoint(float pointX, float pointY); - - /** - * \brief Check if a ray intersect any object hitbox. - * \param x The raycast source X - * \param y The raycast source Y - * \param angle The raycast angle - * \param dist The raycast max distance - * \param closest Get the closest or farthest collision mask result? - * \return A raycast result with the contact points and distances - */ - RaycastResult RaycastTest( - float x, float y, float angle, float dist, bool closest); - - /** - * \brief Check collision with each object of the list using their hitboxes, - * and move the object according to the sum of the move vector returned by - * each collision test. - * - * \note Bounding circles of objects are *not* checked. - * - * \param objects The vector of objects to be used. - * \param ignoreTouchingEdges If true, then edges that are touching each - * other, without the hitbox polygons actually overlapping, won't be - * considered in collision. - * - * \return true if the object was moved. - */ - bool SeparateFromObjects(const std::vector& objects, - bool ignoreTouchingEdges = false); - - /** - * \brief Return true if the cursor is on the object - * \param scene The scene the object belongs to. - * \param accurate If true, the test should be precise (depending on the - * object type). Otherwise, a simple bouding box test is made. - * - * \return bool if the cursor is on the object - */ - virtual bool CursorOnObject(RuntimeScene& scene, bool accurate); - - /** - * \brief Called at each frame, before events and rendering. - * \note The default implementation does nothing. - */ - virtual void Update(const RuntimeScene& scene){}; - - /** - * \brief Return the time elapsed since the last frame, in microseconds, for - * the object. - * - * Objects can have different elapsed time if they are on layers with - * different time scales. - */ - signed long long GetElapsedTime(const RuntimeScene& scene) const; - - /** - * \brief Get the width of the object, in pixels. - */ - virtual float GetWidth() const { return 0; }; - - /** - * \brief Get the height of the object, in pixels. - */ - virtual float GetHeight() const { return 0; }; - - /** - * \brief Set the new width of the object. - * - * The width can be not changed if the object doesn't want/is not designed to. - */ - virtual void SetWidth(float){}; - - /** - * \brief Set the new height of the object. - * - * The height can be not changed if the object doesn't want/is not designed - * to. - */ - virtual void SetHeight(float){}; - - /** - * \brief Get the angle of the object, in degrees. - * - * The angle can be not changed if the object doesn't want/is not designed to. - */ - virtual bool SetAngle(float) { return false; }; - - /** - * \brief Get the angle of the object, in degrees. - */ - virtual float GetAngle() const { return 0; }; - - /** - * \brief Get the X coordinate of the object in the layout. - */ - inline float GetX() const { return X; } - - /** - * \brief Get the Y coordinate of the object in the layout. - */ - inline float GetY() const { return Y; } - - /** - * \brief Change X position of the object. - * \note This method cannot be redefined: Redefine OnPositionChanged() to do - * extra work if needed. - */ - void SetX(float x_) { - X = x_; - OnPositionChanged(); - } - - /** - * \brief Change Y position of the object. - * \note This method cannot be redefined: Redefine OnPositionChanged() to do - * extra work if needed. - */ - void SetY(float y_) { - Y = y_; - OnPositionChanged(); - } - - /** - * Object can use this function to do special work - * when position is changed. - */ - virtual void OnPositionChanged(){}; - - /** - * \brief Get the real X position where is renderer the object. - * - * Most of the time, this will return the same value as GetX().
- * However, some objects may allow the origin point to be moved: In this case, - * you need to redefine this method. - */ - virtual float GetDrawableX() const { return GetX(); }; - - /** - * \brief Get the real Y position where is renderer the object. - * - * Most of the time, this will return the same value as GetY().
- * However, some objects may allow the origin point to be moved: In this case, - * you need to redefine this method. - */ - virtual float GetDrawableY() const { return GetY(); }; - - /** - * \brief Get the X position of the center, relative to the position returned - * by GetDrawableX(). - */ - virtual float GetCenterX() const { return GetWidth() / 2; }; - - /** - * \brief Get the Y position of the center, relative to the position returned - * by GetDrawableY(). - */ - virtual float GetCenterY() const { return GetHeight() / 2; }; - - /** - * \brief Get squared distance, in pixel, between the object and the specified - * position. \param x X coordinate of the point \param y Y coordinate of the - * point - */ - double GetSqDistanceTo(double x, double y); - ///@} - - /** \name Forces - * Members functions providing access to built-in force system - * used to move the objects - */ - ///@{ - - Force force5; ///< \deprecated Old custom force used to manage collisions. - - /** - * Automatically called at each frame so as to update forces applied on the - * object. - */ - bool UpdateForce(float ElapsedTime); - - float TotalForceX() const; - float TotalForceY() const; - float TotalForceAngle() const; - float TotalForceLength() const; - ///@} - - /** - * \brief Delete all forces applied to the object - */ - bool ClearForce(); - -#if defined(GD_IDE_ONLY) - /** \name Others IDE related functions - * Members functions used by the IDE - */ - ///@{ - /** - * \brief Called by the debugger so as to get a property value and name. - * \warning value should be set to an UTF8 encoded string. - * Implementation example: - * \code - * if ( propertyNb == 0 ) {name = _("MyObjectProperty"); value = - * gd::String::From(GetSomeProperty());} else if ( propertyNb == 1 ) {name = - * _("AnotherProperty"); value = GetAnotherPropety();} \endcode - */ - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - - /** - * \brief Called by the debugger so as to update a property - * \param propertyNb the property number - * \param newValue the new value as an UTF8 string - * \return true if property was changed, false if it not possible. - * - * Implementation example: - * \code - * if ( propertyNb == 0 ) {return SetSomeProperty(ToFloat(newValue));} - * else if ( propertyNb == 1 ) {return false;} //Changing property is not - * allowed: returning false. \endcode - */ - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - - /** - * \brief Must return the number of available properties for the debugger. - */ - virtual std::size_t GetNumberOfProperties() const; -///@} -#endif - - /** \name Functions meant to be used by events generated code - */ - ///@{ - void DeleteFromScene(RuntimeScene& scene); - void PutAroundAPosition(float positionX, - float positionY, - float distance, - float angleInDegrees); - void AddForce(float x, float y, float clearing); - void AddForceUsingPolarCoordinates(float angle, float length, float clearing); - void AddForceTowardPosition(float positionX, - float positionY, - float length, - float clearing); - void AddForceToMoveAround(float positionX, - float positionY, - float angularVelocity, - float distance, - float clearing); - void AddForceTowardObject(RuntimeObject* object, - float length, - float clearing); - void AddForceToMoveAroundObject(RuntimeObject* object, - float velocity, - float length, - float clearing); - void PutAroundObject(RuntimeObject* object, - float length, - float angleInDegrees); - - void RotateTowardPosition(float Xposition, - float Yposition, - float speed, - RuntimeScene& scene); - void RotateTowardAngle(float angleInDegrees, - float speed, - RuntimeScene& scene); - void Rotate(float speed, RuntimeScene& scene); - - static gd::Variable& ReturnVariable(gd::Variable& variable) { - return variable; - }; - bool VariableExists(const gd::String& variable); - static double GetVariableValue(const gd::Variable& variable) { - return variable.GetValue(); - }; - static const gd::String& GetVariableString(const gd::Variable& variable) { - return variable.GetString(); - }; - static bool VariableChildExists(const gd::Variable& variable, - const gd::String& childName); - static void VariableRemoveChild(gd::Variable& variable, - const gd::String& childName); - static void VariableClearChildren(gd::Variable& variable); - static unsigned int GetVariableChildCount(gd::Variable& variable); - - void SetXY(const char* xOperator, - float xValue, - const char* yOperator, - float yValue); - - void Duplicate( - RuntimeScene& scene, - std::map*> pickedObjectLists); - void ActivateBehavior(const gd::String& behaviorName, bool activate = true); - bool BehaviorActivated(const gd::String& behaviorName); - - bool IsStopped(); - bool TestAngleOfDisplacement(float angle, float tolerance); - - double GetSqDistanceWithObject(RuntimeObject* other); - double GetDistanceWithObject(RuntimeObject* other); - - bool SeparateFromObjects( - std::map*> pickedObjectLists, - bool ignoreTouchingEdges = false); - - /** \deprecated - */ - void SeparateObjectsWithoutForces( - std::map*> pickedObjectLists); - - /** \deprecated - */ - void SeparateObjectsWithForces( - std::map*> pickedObjectLists); - ///@} - - protected: - gd::String name; ///< The full name of the object - gd::String type; ///< Which type is the object. ( To test if we can do - ///< something reserved to some objects with it ) - float X; ///< X position on the scene - float Y; ///< Y position on the scene - int zOrder; ///< Z order on the scene, to choose if an object is displayed - ///< before another object. - bool hidden; ///< True to prevent the object from being rendered. - gd::String layer; ///< Name of the layer on which the object is. - std::map> - behaviors; ///< Contains all behaviors of the object. Behaviors are the - ///< ownership of the object - RuntimeVariablesContainer - objectVariables; ///< List of the variables of the object - std::vector forces; ///< Forces applied to the object - - /** - * \brief Initialize object using another object. Used by copy-ctor and - * assign-op. \warning Don't forget to update me if members were changed! - */ - void Init(const RuntimeObject& object); -}; - -#endif // RUNTIMEOBJECT_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeObjectHelpers.h b/GDCpp/GDCpp/Runtime/RuntimeObjectHelpers.h deleted file mode 100644 index c7924de64..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeObjectHelpers.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -/** - * \file File containing tools to manipulate objects easier. - */ - -#ifndef OBJECTHELPERS_H -#define OBJECTHELPERS_H -#include -#include -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" - -/** - * An object list is a vector containing (smart) pointers to objects. - */ -using RuntimeObjList = std::vector>; - -/** - * Objects are usually managed thanks to (smart) pointers. - */ -using RuntimeObjSPtr = std::unique_ptr; - -/** - * \brief Functor testing object name - * - * \see Object - */ -struct ObjectHasName : public std::binary_function, - gd::String, - bool> { - bool operator()(const std::unique_ptr& object, - const gd::String& name) const { - return object->GetName() == name; - } -}; - -#endif // OBJECTHELPERS_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.cpp b/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.cpp deleted file mode 100644 index a4b7b8f52..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "RuntimeObjectsListsTools.h" -#include -#include -#include -#include "RuntimeObject.h" -#include "RuntimeScene.h" - -void GD_API PickOnly(RuntimeObjectsLists& pickedObjectsLists, - RuntimeObject* thisOne) { - for (auto it = pickedObjectsLists.begin(); it != pickedObjectsLists.end(); - ++it) { - if (it->second != NULL) it->second->clear(); - } - - if (pickedObjectsLists[thisOne->GetName()] != NULL) - pickedObjectsLists[thisOne->GetName()]->push_back(thisOne); -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.h b/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.h deleted file mode 100644 index 6f608b880..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeObjectsListsTools.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef OBJECTSLISTSTOOLS_H -#define OBJECTSLISTSTOOLS_H - -#include -#include -#include -#include "RuntimeObject.h" -#include "RuntimeScene.h" - -typedef std::map *> - RuntimeObjectsLists; - -/** - * \brief Keep only the specified object in the lists of picked objects. - * \param objectsLists The lists of objects to trim - * \param thisOne The object to keep in the lists - * \ingroup GameEngine - */ -void GD_API PickOnly(RuntimeObjectsLists &pickedObjectsLists, - RuntimeObject *thisOne); - -/** - * \brief Filter objects to keep only the one that fullfil the predicate - * - * Objects that do not fullfil the predicate are removed from objects lists. - * - * \param objectsLists The lists of objects to trim - * \param negatePredicate If set to true, the result of the predicate is - * negated. \param predicate The function applied to each object: must return - * true if the object fulfill the predicate. \return true if at least one object - * fulfill the predicate. - * - * \ingroup GameEngine - */ -template -bool PickObjectsIf(const RuntimeObjectsLists &pickedObjectsLists, - bool negatePredicate, - Pred predicate) { - bool isTrue = false; - - // Create a boolean for each object - std::vector > pickedList; - for (RuntimeObjectsLists::const_iterator it = pickedObjectsLists.begin(); - it != pickedObjectsLists.end(); - ++it) { - std::vector arr; - arr.assign(it->second->size(), false); - pickedList.push_back(arr); - } - - // Pick objects which are fulfulling the predicate. - std::size_t i = 0; - for (RuntimeObjectsLists::const_iterator it = pickedObjectsLists.begin(); - it != pickedObjectsLists.end(); - ++it, ++i) { - if (!it->second) continue; - const std::vector &arr1 = *it->second; - - for (std::size_t k = 0; k < arr1.size(); ++k) { - if (negatePredicate ^ predicate(arr1[k])) { - pickedList[i][k] = true; - isTrue = true; - } - } - } - - // Trim not picked objects from lists. - i = 0; - for (RuntimeObjectsLists::const_iterator it = pickedObjectsLists.begin(); - it != pickedObjectsLists.end(); - ++it, ++i) { - size_t finalSize = 0; - if (!it->second) continue; - std::vector &arr = *it->second; - - for (std::size_t k = 0; k < arr.size(); ++k) { - RuntimeObject *obj = arr[k]; - if (pickedList[i][k]) { - arr[finalSize] = obj; - finalSize++; - } - } - arr.resize(finalSize); - } - - return isTrue; -} - -/** - * \brief Picks objects that fullfil the predicate with at least another object. - * - * This function picks from objectsLists1 and objectsLists2 only pairs of - * objects for which the test is true. If inverted == true, only the objects of - * the first table are filtered. - * - * Note that the predicate is not called stricly for each pair: When considering - * a pair of objects, if these objects have already been marked as picked, the - * predicate won't be called again. - * - * objectsLists1 and objectsLists2 may contains one or more identical pointers - * to some lists (See *This is important* comment at the end of the algorithm, - * when trimming the list). - * - * Cost (Worst case, predicate being always false): - * Cost(Creating tables with a total of NbObjList1+NbObjList2 booleans) - * + Cost(predicate)*NbObjList1*NbObjList2 - * + Cost(Testing NbObjList1+NbObjList2 booleans) - * + Cost(Removing NbObjList1+NbObjList2 objects from all the lists) - * - * Cost (Best case, predicate being always true): - * Cost(Creating tables with a total of NbObjList1+NbObjList2 booleans) - * + Cost(predicate)*(NbObjList1+NbObjList2) - * + Cost(Testing NbObjList1+NbObjList2 booleans) - * - * \ingroup GameEngine - */ -template -bool TwoObjectListsTest(RuntimeObjectsLists objectsLists1, - RuntimeObjectsLists objectsLists2, - bool negatePredicate, - Pred predicate) { - bool isTrue = false; - - // Create a boolean for each object - std::vector > pickedList1; - std::vector > pickedList2; - - for (RuntimeObjectsLists::const_iterator it = objectsLists1.begin(); - it != objectsLists1.end(); - ++it) { - std::vector arr; - arr.assign(it->second->size(), false); - pickedList1.push_back(arr); - } - for (RuntimeObjectsLists::const_iterator it = objectsLists2.begin(); - it != objectsLists2.end(); - ++it) { - std::vector arr; - arr.assign(it->second->size(), false); - pickedList2.push_back(arr); - } - - // Launch the function each object of the first list with each object - // of the second list. - std::size_t i = 0; - for (RuntimeObjectsLists::const_iterator it = objectsLists1.begin(); - it != objectsLists1.end(); - ++it, ++i) { - if (!it->second) continue; - const std::vector &arr1 = *it->second; - - for (std::size_t k = 0; k < arr1.size(); ++k) { - bool atLeastOneObject = false; - - std::size_t j = 0; - for (RuntimeObjectsLists::const_iterator it2 = objectsLists2.begin(); - it2 != objectsLists2.end(); - ++it2, ++j) { - if (!it2->second) continue; - const std::vector &arr2 = *it2->second; - - for (std::size_t l = 0; l < arr2.size(); ++l) { - if (pickedList1[i][k] && pickedList2[j][l]) - continue; // Avoid unnecessary costly call to functor. - - if (std::addressof(arr1[k]) != std::addressof(arr2[l]) && - predicate(arr1[k], arr2[l])) { - if (!negatePredicate) { - isTrue = true; - - // Pick the objects - pickedList1[i][k] = true; - pickedList2[j][l] = true; - } - - atLeastOneObject = true; - } - } - } - - if (!atLeastOneObject && - negatePredicate) { // The object is not overlapping any other object. - isTrue = true; - pickedList1[i][k] = true; - } - } - } - - // Trim not picked objects from lists. - i = 0; - for (RuntimeObjectsLists::const_iterator it = objectsLists1.begin(); - it != objectsLists1.end(); - ++it, ++i) { - size_t finalSize = 0; - if (!it->second) continue; - std::vector &arr = *it->second; - - for (std::size_t k = 0; k < arr.size(); ++k) { - RuntimeObject *obj = arr[k]; - if (pickedList1[i][k]) { - arr[finalSize] = obj; - finalSize++; - } - } - arr.resize(finalSize); - } - - if (!negatePredicate) { - std::size_t i = 0; - for (RuntimeObjectsLists::const_iterator it = objectsLists2.begin(); - it != objectsLists2.end(); - ++it, ++i) { - size_t finalSize = 0; - if (!it->second) continue; - std::vector &arr = *it->second; - - //*This is important*! We can have a list that has already been trimmed - // just before - if (arr.size() != - pickedList2[i].size()) // If the size of the objects list != size of - // the boolean "picked" list... - continue; //... then the object list was already trimmed, skip it. - - for (std::size_t k = 0; k < arr.size(); ++k) { - RuntimeObject *obj = arr[k]; - if (pickedList2[i][k]) { - arr[finalSize] = obj; - finalSize++; - } - } - arr.resize(finalSize); - } - } - - return isTrue; -} -#endif diff --git a/GDCpp/GDCpp/Runtime/RuntimeScene.cpp b/GDCpp/GDCpp/Runtime/RuntimeScene.cpp deleted file mode 100644 index b57d12f8e..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeScene.cpp +++ /dev/null @@ -1,476 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/RuntimeScene.h" - -#include -#include -#include -#include -#include - -#include "GDCore/Tools/Localization.h" -#include "GDCore/Tools/Log.h" -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Runtime/BehaviorsRuntimeSharedData.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/ManualTimer.h" -#include "GDCpp/Runtime/Project/BehaviorsSharedData.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Layer.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeContext.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeObjectHelpers.h" -#include "GDCpp/Runtime/SoundManager.h" -#include "GDCpp/Runtime/profile.h" -#if !defined(ANDROID) // TODO: OpenGL -#include "GDCpp/Runtime/Tools/OpenGLTools.h" -#if !defined(MACOS) -#include -#endif -#endif - -#include "GDCpp/Runtime/CodeExecutionEngine.h" -#if defined(GD_IDE_ONLY) -#include "GDCpp/Events/Builtin/ProfileEvent.h" -#include "GDCpp/Extensions/Builtin/ProfileTools.h" -#include "GDCpp/IDE/BaseDebugger.h" -#include "GDCpp/IDE/BaseProfiler.h" -#endif -#include "GDCpp/Extensions/ExtensionBase.h" -#undef GetObject // Disable an annoying macro - -RuntimeLayer RuntimeScene::badRuntimeLayer; - -RuntimeScene::RuntimeScene(sf::RenderWindow* renderWindow_, RuntimeGame* game_) - : renderWindow(renderWindow_), - game(game_), -#if defined(GD_IDE_ONLY) - debugger(NULL), -#endif - isFullScreen(false), - inputManager(renderWindow_), - codeExecutionEngine(new CodeExecutionEngine) { - ChangeRenderWindow(renderWindow); -} - -RuntimeScene::~RuntimeScene() { - for (auto gdExtension : CppPlatform::Get().GetAllPlatformExtensions()) { - std::shared_ptr extension = - std::dynamic_pointer_cast(gdExtension); - if (extension != std::shared_ptr()) - extension->SceneUnloaded(*this); - } - - objectsInstances.Clear(); // Force destroy objects NOW as they can have - // pointers to some RuntimeScene members which so - // need to be destroyed AFTER objects. -} - -std::shared_ptr RuntimeScene::GetImageManager() const { - return game->GetImageManager(); -} - -void RuntimeScene::ChangeRenderWindow(sf::RenderWindow* newWindow) { - renderWindow = newWindow; - inputManager.SetWindow(newWindow); - - if (!renderWindow) return; - - renderWindow->setTitle(GetWindowDefaultTitle()); - - if (game) { - renderWindow->setFramerateLimit(game->GetMaximumFPS()); - renderWindow->setVerticalSyncEnabled( - game->IsVerticalSynchronizationEnabledByDefault()); - } - SetupOpenGLProjection(); -} - -void RuntimeScene::SetupOpenGLProjection() { -#if !defined(ANDROID) // TODO: OpenGL - glEnable(GL_DEPTH_TEST); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthMask(GL_TRUE); - glClearDepth(1.f); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - double windowRatio = static_cast(renderWindow->getSize().x) / - static_cast(renderWindow->getSize().y); - OpenGLTools::PerspectiveGL( - GetOpenGLFOV(), windowRatio, GetOpenGLZNear(), GetOpenGLZFar()); -#endif -} - -void RuntimeScene::RequestChange(SceneChange::Change change, - gd::String sceneName) { - requestedChange.change = change; - requestedChange.requestedScene = sceneName; -} - -bool RuntimeScene::RenderAndStep() { - requestedChange.change = SceneChange::CONTINUE; - ManageRenderTargetEvents(); - timeManager.Update(clock.restart().asMicroseconds(), game->GetMinimumFPS()); - ManageObjectsBeforeEvents(); - if (game) game->GetSoundManager().ManageGarbage(); - -#if defined(GD_IDE_ONLY) - if (GetProfiler()) { - if (timeManager.IsFirstLoop()) GetProfiler()->Reset(); - GetProfiler()->eventsClock.reset(); - } -#endif - - GetCodeExecutionEngine()->Execute(); - -#if defined(GD_IDE_ONLY) - if (GetProfiler() && GetProfiler()->profilingActivated) { - GetProfiler()->lastEventsTime = - GetProfiler()->eventsClock.getTimeMicroseconds(); - GetProfiler()->renderingClock.reset(); - } -#endif - - ManageObjectsAfterEvents(); - -#if defined(GD_IDE_ONLY) - if (debugger) debugger->Update(); -#endif - - // Rendering - Render(); - -#if defined(GD_IDE_ONLY) - if (GetProfiler() && GetProfiler()->profilingActivated) { - GetProfiler()->lastRenderingTime = - GetProfiler()->renderingClock.getTimeMicroseconds(); - GetProfiler()->totalSceneTime += - GetProfiler()->lastRenderingTime + GetProfiler()->lastEventsTime; - GetProfiler()->totalEventsTime += GetProfiler()->lastEventsTime; - GetProfiler()->Update(); - } -#endif - - return requestedChange.change != SceneChange::CONTINUE; -} - -void RuntimeScene::ManageRenderTargetEvents() { - if (!renderWindow) return; - inputManager.NextFrame(); - - sf::Event event; - while (renderWindow->pollEvent(event)) { - if (event.type == sf::Event::Closed) { - // Handle window closing - RequestChange(SceneChange::STOP_GAME); - renderWindow->close(); - } else if (event.type == sf::Event::Resized) { - // Resetup OpenGL when window is resized - SetupOpenGLProjection(); - } else { - // Most events will be input related and should be forwarded - // to the InputManager: - inputManager.HandleEvent(event); - } - } -} - -void RuntimeScene::RenderWithoutStep() { - ManageRenderTargetEvents(); - Render(); - -#if defined(GD_IDE_ONLY) - if (debugger) debugger->Update(); -#endif -} - -void RuntimeScene::Render() { - if (!renderWindow) return; - - renderWindow->clear(sf::Color(GetBackgroundColorRed(), - GetBackgroundColorGreen(), - GetBackgroundColorBlue())); - - // Sort object by order to render them - RuntimeObjNonOwningPtrList allObjects = objectsInstances.GetAllObjects(); - OrderObjectsByZOrder(allObjects); - -#if !defined(ANDROID) // TODO: OpenGL - // To allow using OpenGL to draw: - glClear(GL_DEPTH_BUFFER_BIT); // Clear the depth buffer - renderWindow->pushGLStates(); -#endif - renderWindow->setActive(); - - // Draw layer by layer - for (std::size_t layerIndex = 0; layerIndex < layers.size(); ++layerIndex) { - if (layers[layerIndex].GetVisibility()) { - for (std::size_t cameraIndex = 0; - cameraIndex < layers[layerIndex].GetCameraCount(); - ++cameraIndex) { - RuntimeCamera& camera = layers[layerIndex].GetCamera(cameraIndex); - -// Prepare OpenGL rendering -#if !defined(ANDROID) // TODO: OpenGL - renderWindow->popGLStates(); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - OpenGLTools::PerspectiveGL(GetOpenGLFOV(), - camera.GetWidth() / camera.GetHeight(), - GetOpenGLZNear(), - GetOpenGLZFar()); -#endif - - const sf::FloatRect& viewport = camera.GetSFMLView().getViewport(); - -#if !defined(ANDROID) // TODO: OpenGL - glViewport(viewport.left * renderWindow->getSize().x, - renderWindow->getSize().y - - (viewport.top + viewport.height) * - renderWindow->getSize().y, // Y start from bottom - viewport.width * renderWindow->getSize().x, - viewport.height * renderWindow->getSize().y); - - renderWindow->pushGLStates(); -#endif - - // Prepare SFML rendering - renderWindow->setView(camera.GetSFMLView()); - - // Rendering all objects - for (std::size_t id = 0; id < allObjects.size(); ++id) { - if (allObjects[id]->GetLayer() == layers[layerIndex].GetName()) - allObjects[id]->Draw(*renderWindow); - } - } - } - } - -// Display window contents on screen -// TODO: If nothing is displayed, double check popGLStates. -#if !defined(ANDROID) // TODO: OpenGL - renderWindow->popGLStates(); -#endif - renderWindow->display(); -} - -bool RuntimeScene::OrderObjectsByZOrder(RuntimeObjNonOwningPtrList& objList) { - if (StandardSortMethod()) - std::sort(objList.begin(), - objList.end(), - [](const RuntimeObject* o1, const RuntimeObject* o2) { - return o1->GetZOrder() < o2->GetZOrder(); - }); - else - std::stable_sort(objList.begin(), - objList.end(), - [](const RuntimeObject* o1, const RuntimeObject* o2) { - return o1->GetZOrder() < o2->GetZOrder(); - }); - - return true; -} - -RuntimeLayer& RuntimeScene::GetRuntimeLayer(const gd::String& name) { - for (RuntimeLayer& layer : layers) { - if (layer.GetName() == name) return layer; - } - - return badRuntimeLayer; -} - -const RuntimeLayer& RuntimeScene::GetRuntimeLayer( - const gd::String& name) const { - for (const RuntimeLayer& layer : layers) { - if (layer.GetName() == name) return layer; - } - - return badRuntimeLayer; -} - -void RuntimeScene::ManageObjectsAfterEvents() { - // Delete objects that were removed. - RuntimeObjNonOwningPtrList allObjects = objectsInstances.GetAllObjects(); - for (std::size_t id = 0; id < allObjects.size(); ++id) { - if (allObjects[id]->GetName().empty()) { - for (std::size_t i = 0; i < extensionsToBeNotifiedOnObjectDeletion.size(); - ++i) - extensionsToBeNotifiedOnObjectDeletion[i]->ObjectDeletedFromScene( - *this, allObjects[id]); - - objectsInstances.RemoveObject( - allObjects[id]); // Remove from objects instances, not from the - // temporary list! - } - } - - // Update objects positions, forces and behaviors - allObjects = objectsInstances.GetAllObjects(); - for (RuntimeObject* object : allObjects) { - double elapsedTimeInSeconds = - static_cast(object->GetElapsedTime(*this)) / 1000000.0; - object->SetX(object->GetX() + - (object->TotalForceX() * elapsedTimeInSeconds)); - object->SetY(object->GetY() + - (object->TotalForceY() * elapsedTimeInSeconds)); - object->Update(*this); - object->UpdateForce(elapsedTimeInSeconds); - object->DoBehaviorsPostEvents(*this); - } -} - -void RuntimeScene::ManageObjectsBeforeEvents() { - RuntimeObjNonOwningPtrList allObjects = objectsInstances.GetAllObjects(); - for (std::size_t id = 0; id < allObjects.size(); ++id) - allObjects[id]->DoBehaviorsPreEvents(*this); -} - -/** - * \brief Internal Tool class used by RuntimeScene::CreateObjectsFrom - */ -class ObjectsFromInitialInstanceCreator : public gd::InitialInstanceFunctor { - public: - ObjectsFromInitialInstanceCreator(gd::Project& game_, - RuntimeScene& scene_, - float xOffset_, - float yOffset_) - : game(game_), scene(scene_), xOffset(xOffset_), yOffset(yOffset_){}; - virtual ~ObjectsFromInitialInstanceCreator(){}; - - virtual void operator()(gd::InitialInstance& instance) { - std::vector::const_iterator sceneObject = - std::find_if(scene.GetObjects().begin(), - scene.GetObjects().end(), - std::bind2nd(ObjectHasName(), instance.GetObjectName())); - std::vector::const_iterator globalObject = - std::find_if(game.GetObjects().begin(), - game.GetObjects().end(), - std::bind2nd(ObjectHasName(), instance.GetObjectName())); - - RuntimeObjSPtr newObject; - - if (sceneObject != - scene.GetObjects().end()) // We check first scene's objects' list. - newObject = CppPlatform::Get().CreateRuntimeObject(scene, **sceneObject); - else if (globalObject != - scene.game->GetObjects().end()) // Then the global object list - newObject = CppPlatform::Get().CreateRuntimeObject(scene, **globalObject); - - if (newObject != std::unique_ptr()) { - newObject->SetX(instance.GetX() + xOffset); - newObject->SetY(instance.GetY() + yOffset); - newObject->SetZOrder(instance.GetZOrder()); - newObject->SetLayer(instance.GetLayer()); - newObject->ExtraInitializationFromInitialInstance(instance); - newObject->SetAngle(instance.GetAngle()); - - if (instance.HasCustomSize()) { - newObject->SetWidth(instance.GetCustomWidth()); - newObject->SetHeight(instance.GetCustomHeight()); - } - - // Substitute initial variables specific to that object instance. - newObject->GetVariables().Merge(instance.GetVariables()); - - scene.objectsInstances.AddObject(std::move(newObject)); - } else - std::cout << "Could not find and put object " << instance.GetObjectName() - << std::endl; - } - - private: - gd::Project& game; - RuntimeScene& scene; - float xOffset; - float yOffset; -}; - -void RuntimeScene::CreateObjectsFrom( - const gd::InitialInstancesContainer& container, - float xOffset, - float yOffset) { - ObjectsFromInitialInstanceCreator func(*game, *this, xOffset, yOffset); - const_cast(container).IterateOverInstances( - func); -} - -bool RuntimeScene::LoadFromScene(const gd::Layout& scene) { - return LoadFromSceneAndCustomInstances(scene, scene.GetInitialInstances()); -} - -bool RuntimeScene::LoadFromSceneAndCustomInstances( - const gd::Layout& scene, const gd::InitialInstancesContainer& instances) { - std::cout << "Loading RuntimeScene from a scene."; - if (!game) { - std::cout << "..No valid gd::Project associated to the RuntimeScene. " - "Aborting loading." - << std::endl; - return false; - } - - // Copy inherited scene - Scene::operator=(scene); - - // Clear RuntimeScene datas - objectsInstances.Clear(); - timeManager.Reset(); - - std::cout << "."; - codeExecutionEngine->runtimeContext.scene = this; - inputManager.DisableInputWhenFocusIsLost(IsInputDisabledWhenFocusIsLost()); - - // Initialize variables - variables = scene.GetVariables(); - - // Initialize layers - std::cout << "."; - layers.clear(); - sf::View defaultView(sf::FloatRect(0.0f, - 0.0f, - game->GetGameResolutionWidth(), - game->GetGameResolutionHeight())); - for (std::size_t i = 0; i < GetLayersCount(); ++i) { - layers.push_back(RuntimeLayer(GetLayer(i), defaultView)); - } - - // Create object instances which are originally positioned on scene - std::cout << "."; - CreateObjectsFrom(instances); - - // Behaviors shared data - std::cout << "."; - behaviorsSharedDatas.LoadFrom(scene.GetAllBehaviorSharedData()); - - std::cout << "."; - // Extensions specific initialization - for (auto gdExtension : CppPlatform::Get().GetAllPlatformExtensions()) { - std::shared_ptr extension = - std::dynamic_pointer_cast(gdExtension); - if (extension != std::shared_ptr()) { - extension->SceneLoaded(*this); - if (extension->ToBeNotifiedOnObjectDeletion()) - extensionsToBeNotifiedOnObjectDeletion.push_back(extension.get()); - } - } - - std::cout << "."; - if (StopSoundsOnStartup()) { - game->GetSoundManager().ClearAllSoundsAndMusics(); - } - if (renderWindow) renderWindow->setTitle(GetWindowDefaultTitle()); - - std::cout << " Done." << std::endl; - - return true; -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeScene.h b/GDCpp/GDCpp/Runtime/RuntimeScene.h deleted file mode 100644 index 8172ef081..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeScene.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef RUNTIMESCENE_H -#define RUNTIMESCENE_H - -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/BehaviorsRuntimeSharedDataHolder.h" -#include "GDCpp/Runtime/InputManager.h" -#include "GDCpp/Runtime/ObjInstancesHolder.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeVariablesContainer.h" -#include "GDCpp/Runtime/TimeManager.h" -namespace sf { -class RenderWindow; -class Event; -} -namespace gd { -class Project; -class Object; -class ImageManager; -} -class RuntimeLayer; -class RuntimeGame; -class BehaviorsRuntimeSharedData; -class ExtensionBase; -class CodeExecutionEngine; -#undef GetObject // Disable an annoying macro - -#if defined(GD_IDE_ONLY) -class BaseDebugger; -#endif - -/** - * \brief Represents a scene being played. - * - * Contains game object instances and all runtime objects needed - * to play to a scene rendered in a SFML RenderWindow. - * - * \ingroup GameEngine - */ -class GD_API RuntimeScene : public Scene { - public: - RuntimeScene(sf::RenderWindow* renderWindow_, RuntimeGame* game_); - virtual ~RuntimeScene(); - - sf::RenderWindow* - renderWindow; ///< Pointer to the render window used for display. - RuntimeGame* game; ///< Pointer to the game the scene is linked to. -#if defined(GD_IDE_ONLY) - BaseDebugger* debugger; ///< Pointer to the debugger. Can be NULL. -#endif - ObjInstancesHolder - objectsInstances; ///< Contains all of the objects on the scene - - /** - * \brief Provide access to the variables container - */ - inline const RuntimeVariablesContainer& GetVariables() const { - return variables; - } - - /** - * \brief Provide access to the variables container - */ - inline RuntimeVariablesContainer& GetVariables() { return variables; } - - /** - * \brief Shortcut for game->GetImageManager() - * \return The image manager of the game. - */ - std::shared_ptr GetImageManager() const; - - /** - * \brief Get the input manager used to handle mouse, keyboard and touches - * events. - */ - const InputManager& GetInputManager() const { return inputManager; } - - /** - * \brief Get the input manager used to handle mouse, keyboard and touches - * events. - */ - InputManager& GetInputManager() { return inputManager; } - - /** - * \brief Get the time manager used to handle all time related values and - * timers. - */ - const TimeManager& GetTimeManager() const { return timeManager; } - - /** - * \brief Get the time manager used to handle all time related values and - * timers. - */ - TimeManager& GetTimeManager() { return timeManager; } - - /** - * Get the layer with specified name. - */ - RuntimeLayer& GetRuntimeLayer(const gd::String& name); - - /** - * Get the layer with specified name. - */ - const RuntimeLayer& GetRuntimeLayer(const gd::String& name) const; - - /** - * \brief Return the shared data for a behavior. - * \warning Be careful, no check is made to ensure that the shared data exist. - * \param name The name of the behavior for which shared data must be fetched. - */ - const std::shared_ptr& GetBehaviorSharedData( - const gd::String& behaviorName) const { - return behaviorsSharedDatas.GetBehaviorSharedData(behaviorName); - } - - /** - * \brief Set up the RuntimeScene using a gd::Layout. - * - * Typically called automatically by the IDE or by the game executable. - * - * \note Similar to calling LoadFromSceneAndCustomInstances(scene, - * scene.GetInitialInstances()); \see LoadFromSceneAndCustomInstances - */ - bool LoadFromScene(const gd::Layout& scene); - - /** - * \brief Set up the RuntimeScene using the specified \a instances and \a - * scene. \param scene gd::Layout that should be loaded \param instances - * Initial instances to be put on the scene - */ - bool LoadFromSceneAndCustomInstances( - const gd::Layout& scene, const gd::InitialInstancesContainer& instances); - - /** - * Create the objects from an gd::InitialInstancesContainer object. - * - * \param container The object containing the initial instances to be created - * \param xOffset The offset on x axis to be applied to objects created - * \param yOffset The offset on y axis to be applied to objects created - */ - void CreateObjectsFrom(const gd::InitialInstancesContainer& container, - float xOffset = 0, - float yOffset = 0); - - /** - * \brief Change the window used for rendering the scene - */ - void ChangeRenderWindow(sf::RenderWindow* window); - - /** - * \brief Check if scene is rendered full screen. - */ - bool RenderWindowIsFullScreen() { return isFullScreen; } - - /** - * \brief Change full screen state. - * The render window is itself not changed so as to be displayed fullscreen or - * not. - */ - void SetRenderWindowIsFullScreen(bool yes = true) { isFullScreen = yes; } - - /** - * Render and play one frame. - * \return true if a scene change was request, false otherwise. - */ - bool RenderAndStep(); - - /** - * \brief Just render a frame, without applying logic or events on objects. - */ - void RenderWithoutStep(); - - /** \name Code execution engine - * Functions members giving access to the code execution engine. - */ - ///@{ - /** - * \brief Give access to the execution engine of the scene. - * Each scene has its own unique execution engine. - */ - std::shared_ptr GetCodeExecutionEngine() const { - return codeExecutionEngine; - } - - /** - * \brief Give access to the execution engine of the scene. - * Each scene has its own unique execution engine. - */ - void SetCodeExecutionEngine( - std::shared_ptr codeExecutionEngine_) { - codeExecutionEngine = codeExecutionEngine_; - } - ///@} - - struct SceneChange { - enum Change { - CONTINUE = 0, - PUSH_SCENE, - POP_SCENE, - REPLACE_SCENE, - CLEAR_SCENES, - STOP_GAME - } change; - gd::String requestedScene; - }; - - SceneChange GetRequestedChange() { return requestedChange; } - void RequestChange(SceneChange::Change change, gd::String sceneName = ""); - - protected: - /** - * \brief Handle the events made on the scene's window - */ - void ManageRenderTargetEvents(); - - /** - * \brief Order an object list according to object's Z coordinate. - */ - bool OrderObjectsByZOrder(RuntimeObjNonOwningPtrList& objList); - - /** - * \brief Render a frame in the window - */ - void Render(); - - /** - * \brief To be called once during a step, to launch behaviors pre-events - * steps. - */ - void ManageObjectsBeforeEvents(); - - /** - * \brief To be called once during a step, to remove objects marked as deleted - * in events, and to update objects position, forces and behaviors. - */ - void ManageObjectsAfterEvents(); - - /** - * \brief Set the OpenGL projection according to the window size and OpenGL - * scene options. - */ - void SetupOpenGLProjection(); - - bool isFullScreen; ///< As sf::RenderWindow can't say if it is fullscreen or - ///< not - InputManager inputManager; - TimeManager timeManager; - RuntimeVariablesContainer variables; ///< List of the scene variables - std::vector - extensionsToBeNotifiedOnObjectDeletion; ///< List, built during - ///< LoadFromScene, containing a - ///< list of extensions which - ///< must be notified when an - ///< object is deleted. - BehaviorsRuntimeSharedDataHolder - behaviorsSharedDatas; ///< Contains all behaviors shared datas. - std::vector - layers; ///< The layers used at runtime to display the scene. - std::shared_ptr codeExecutionEngine; - SceneChange - requestedChange; ///< What should be done at the end of the frame. - sf::Clock clock; ///< The clock used to track time. - - static RuntimeLayer - badRuntimeLayer; ///< Null object return by GetLayer when no appropriate - ///< layer could be found. -}; - -#endif // RUNTIMESCENE_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.cpp b/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.cpp deleted file mode 100644 index 2220b0abc..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.cpp +++ /dev/null @@ -1,658 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "RuntimeSpriteObject.h" -#include -#include "GDCore/Extensions/Builtin/SpriteExtension/Animation.h" -#include "GDCore/Extensions/Builtin/SpriteExtension/Direction.h" -#include "GDCore/Extensions/Builtin/SpriteExtension/Sprite.h" -#include "GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.h" -#include "GDCore/Tools/Localization.h" -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/Project/InitialInstance.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/RuntimeLayer.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/TinyXml/tinyxml.h" -#if defined(GD_IDE_ONLY) -#include "GDCore/IDE/Project/ArbitraryResourceWorker.h" -#endif -#if !defined(GD_IDE_ONLY) -#include "GDCore/Extensions/Builtin/SpriteExtension/Animation.cpp" -#include "GDCore/Extensions/Builtin/SpriteExtension/Direction.cpp" -#include "GDCore/Extensions/Builtin/SpriteExtension/Sprite.cpp" -#include "GDCore/Extensions/Builtin/SpriteExtension/SpriteObject.cpp" -#endif - -gd::Animation RuntimeSpriteObject::badAnimation; -gd::Sprite* RuntimeSpriteObject::badSpriteDatas = NULL; - -RuntimeSpriteObject::RuntimeSpriteObject(RuntimeScene& scene, - const gd::SpriteObject& spriteObject) - : RuntimeObject(scene, spriteObject), - currentAnimation(0), - currentDirection(0), - currentAngle(0), - currentSprite(0), - animationStopped(false), - timeElapsedOnCurrentSprite(0.f), - animationSpeedScale(1.f), - ptrToCurrentSprite(NULL), - needUpdateCurrentSprite(true), - opacity(255), - blendMode(0), - isFlippedX(false), - isFlippedY(false), - scaleX(1), - scaleY(1), - colorR(255), - colorV(255), - colorB(255) { - if (!badSpriteDatas) badSpriteDatas = new gd::Sprite(); - - animations.clear(); - for (std::size_t i = 0; i < spriteObject.GetAllAnimations().size(); ++i) - animations.push_back(AnimationProxy(spriteObject.GetAllAnimations()[i])); - - // Load resources - for (std::size_t j = 0; j < animations.size(); j++) { - gd::Animation& anim = animations[j].GetNonConst(); - for (std::size_t k = 0; k < anim.GetDirectionsCount(); k++) { - for (std::size_t l = 0; l < anim.GetDirection(k).GetSpritesCount(); l++) { - gd::Sprite& sprite = anim.GetDirection(k).GetSprite(l); - - sprite.LoadImage( - scene.GetImageManager()->GetSFMLTexture(sprite.GetImageName())); - } - } - } -} - -RuntimeSpriteObject::~RuntimeSpriteObject(){}; - -bool RuntimeSpriteObject::ExtraInitializationFromInitialInstance( - const gd::InitialInstance& position) { - SetCurrentAnimation(position.GetRawDoubleProperty("animation")); - - return true; -} - -bool RuntimeSpriteObject::Draw(sf::RenderTarget& renderTarget) { - // Don't draw anything if hidden - if (hidden) return true; - - renderTarget.draw( - GetCurrentSFMLSprite(), - sf::RenderStates( - blendMode == 0 - ? sf::BlendAlpha - : (blendMode == 1 - ? sf::BlendAdd - : (blendMode == 2 ? sf::BlendMultiply : sf::BlendNone)))); - - return true; -} - -float RuntimeSpriteObject::GetDrawableX() const { - return X - GetCurrentSprite().GetOrigin().GetX() * fabs(scaleX); -} - -float RuntimeSpriteObject::GetDrawableY() const { - return Y - GetCurrentSprite().GetOrigin().GetY() * fabs(scaleY); -} - -float RuntimeSpriteObject::GetWidth() const { - return scaleX > 0 ? GetCurrentSFMLSprite().getLocalBounds().width * scaleX - : -GetCurrentSFMLSprite().getLocalBounds().width * scaleX; -} - -float RuntimeSpriteObject::GetHeight() const { - return scaleY > 0 ? GetCurrentSFMLSprite().getLocalBounds().height * scaleY - : -GetCurrentSFMLSprite().getLocalBounds().height * scaleY; -} - -void RuntimeSpriteObject::SetWidth(float newWidth) { - if (newWidth > 0) { - scaleX = newWidth / GetCurrentSFMLSprite().getLocalBounds().width; - if (isFlippedX) scaleX *= -1; - needUpdateCurrentSprite = true; - } -} - -void RuntimeSpriteObject::SetHeight(float newHeight) { - if (newHeight > 0) { - scaleY = newHeight / GetCurrentSFMLSprite().getLocalBounds().height; - if (isFlippedY) scaleY *= -1; - needUpdateCurrentSprite = true; - } -} - -float RuntimeSpriteObject::GetCenterX() const { - return GetCurrentSprite().GetCenter().GetX() * fabs(scaleX); -} - -float RuntimeSpriteObject::GetCenterY() const { - return GetCurrentSprite().GetCenter().GetY() * fabs(scaleY); -} - -float RuntimeSpriteObject::GetPointX(const gd::String& name) const { - if (!name.empty()) { - const Point& point = GetCurrentSprite().GetPoint(name); - return GetCurrentSFMLSprite() - .getTransform() - .transformPoint(point.GetX(), point.GetY()) - .x; - } - - return GetX(); -} - -float RuntimeSpriteObject::GetPointY(const gd::String& name) const { - if (!name.empty()) { - const Point& point = GetCurrentSprite().GetPoint(name); - return GetCurrentSFMLSprite() - .getTransform() - .transformPoint(point.GetX(), point.GetY()) - .y; - } - - return GetY(); -} - -void RuntimeSpriteObject::SetScale(double newScale) { - SetScaleX(newScale); - SetScaleY(newScale); -} - -double RuntimeSpriteObject::GetScale() const { - return (GetScaleX() + GetScaleY())/2.0; -} - -void RuntimeSpriteObject::SetScaleX(float val) { - if (val == GetScaleX()) return; - if (val < 0) val = 0; - - scaleX = val * (isFlippedX ? -1.0 : 1.0); - needUpdateCurrentSprite = true; -} - -void RuntimeSpriteObject::SetScaleY(float val) { - if (val == GetScaleY()) return; - if (val < 0) val = 0; - - scaleY = val * (isFlippedY ? -1.0 : 1.0); - needUpdateCurrentSprite = true; -} - -float RuntimeSpriteObject::GetScaleX() const { return fabs(scaleX); } - -float RuntimeSpriteObject::GetScaleY() const { return fabs(scaleY); } - -void RuntimeSpriteObject::CopyImageOnImageOfCurrentSprite( - RuntimeScene& scene, - const gd::String& imageName, - float xPosition, - float yPosition, - bool useTransparency) { - if (needUpdateCurrentSprite) UpdateCurrentSprite(); - - ptrToCurrentSprite - ->MakeSpriteOwnsItsImage(); // We want to modify only the image of the - // object, not all objects which have the - // same image. - std::shared_ptr dest = - ptrToCurrentSprite->GetSFMLTexture(); - - // Make sure the coordinates are correct. - if (xPosition < 0 || - static_cast(xPosition) >= dest->texture.getSize().x) - return; - if (yPosition < 0 || - static_cast(yPosition) >= dest->texture.getSize().y) - return; - - // Update texture and pixel perfect collision mask - dest->image.copy(scene.GetImageManager()->GetSFMLTexture(imageName)->image, - xPosition, - yPosition, - sf::IntRect(0, 0, 0, 0), - useTransparency); - dest->texture.loadFromImage(dest->image); -} - -void RuntimeSpriteObject::MakeColorTransparent(const gd::String& colorStr) { - if (needUpdateCurrentSprite) UpdateCurrentSprite(); - - ptrToCurrentSprite - ->MakeSpriteOwnsItsImage(); // We want to modify only the image of the - // object, not all objects which have the - // same image. - std::shared_ptr dest = - ptrToCurrentSprite->GetSFMLTexture(); - - std::vector colors = colorStr.Split(U';'); - - if (colors.size() < 3) return; // La couleur est incorrecte - - // Update texture and pixel perfect collision mask - dest->image.createMaskFromColor( - sf::Color(colors[0].To(), colors[1].To(), colors[2].To())); - dest->texture.loadFromImage(dest->image); -} - -void RuntimeSpriteObject::SetColor(const gd::String& colorStr) { - std::vector colors = colorStr.Split(U';'); - if (colors.size() < 3) return; // Color is not valid - - SetColor(colors[0].To(), colors[1].To(), colors[2].To()); -} - -/** - * Prepare the current sprite - */ -void RuntimeSpriteObject::UpdateCurrentSprite() const { - bool multipleDirections = false; - if (currentAnimation >= animations.size()) - ptrToCurrentSprite = badSpriteDatas; - else { - gd::Animation& animation = animations[currentAnimation].GetNonConst(); - multipleDirections = animation.useMultipleDirections; - - std::size_t directionIndex = multipleDirections ? currentDirection : 0; - if (directionIndex >= animation.GetDirectionsCount()) - ptrToCurrentSprite = badSpriteDatas; - else { - gd::Direction& direction = animation.GetDirection(directionIndex); - if (currentSprite >= direction.GetSpritesCount()) - ptrToCurrentSprite = badSpriteDatas; - else - ptrToCurrentSprite = &direction.GetSprite(currentSprite); - } - } - - ptrToCurrentSprite->GetSFMLSprite().setOrigin( - ptrToCurrentSprite->GetCenter().GetX(), - ptrToCurrentSprite->GetCenter().GetY()); - ; - ptrToCurrentSprite->GetSFMLSprite().setRotation( - multipleDirections ? 0 : currentAngle); - ptrToCurrentSprite->GetSFMLSprite().setPosition( - X + (ptrToCurrentSprite->GetCenter().GetX() - - ptrToCurrentSprite->GetOrigin().GetX()) * - fabs(scaleX), - Y + (ptrToCurrentSprite->GetCenter().GetY() - - ptrToCurrentSprite->GetOrigin().GetY()) * - fabs(scaleY)); - if (isFlippedX) - ptrToCurrentSprite->GetSFMLSprite().move( - (ptrToCurrentSprite->GetSFMLSprite().getLocalBounds().width / 2 - - ptrToCurrentSprite->GetCenter().GetX()) * - fabs(scaleX) * 2, - 0); - if (isFlippedY) - ptrToCurrentSprite->GetSFMLSprite().move( - 0, - (ptrToCurrentSprite->GetSFMLSprite().getLocalBounds().height / 2 - - ptrToCurrentSprite->GetCenter().GetY()) * - fabs(scaleY) * 2); - ptrToCurrentSprite->GetSFMLSprite().setScale(scaleX, scaleY); - ptrToCurrentSprite->GetSFMLSprite().setColor( - sf::Color(colorR, colorV, colorB, opacity)); - - needUpdateCurrentSprite = false; -} - -void RuntimeSpriteObject::Update(const RuntimeScene& scene) { - if (animationStopped || currentAnimation >= GetAnimationsCount()) return; - - double elapsedTimeInSeconds = - static_cast(GetElapsedTime(scene)) / 1000000.0; - timeElapsedOnCurrentSprite += elapsedTimeInSeconds * animationSpeedScale; - - const gd::Direction& direction = - animations[currentAnimation].Get().GetDirection(currentDirection); - - float delay = direction.GetTimeBetweenFrames(); - - if (timeElapsedOnCurrentSprite > delay) { - if (delay != 0) { - std::size_t frameCount = - static_cast(timeElapsedOnCurrentSprite / delay); - currentSprite += frameCount; - } else - currentSprite++; - - timeElapsedOnCurrentSprite = 0; - } - if (currentSprite >= direction.GetSpritesCount()) { - if (direction.IsLooping()) - currentSprite = 0; - else - currentSprite = direction.GetSpritesCount() - 1; - } - - needUpdateCurrentSprite = true; -} - -const sf::Sprite& RuntimeSpriteObject::GetCurrentSFMLSprite() const { - if (needUpdateCurrentSprite) UpdateCurrentSprite(); - - return ptrToCurrentSprite->GetSFMLSprite(); -} - -const gd::Sprite& RuntimeSpriteObject::GetCurrentSprite() const { - if (needUpdateCurrentSprite) UpdateCurrentSprite(); - - return *ptrToCurrentSprite; -} - -std::vector RuntimeSpriteObject::GetHitBoxes() const { - if (currentAnimation >= animations.size()) { - std::vector hitboxes; // Invalid animation, bail out. - return hitboxes; - } - const sf::Sprite& currentSFMLSprite = GetCurrentSFMLSprite(); - - std::vector polygons = GetCurrentSprite().GetCollisionMask(); - for (std::size_t i = 0; i < polygons.size(); ++i) { - for (std::size_t j = 0; j < polygons[i].vertices.size(); ++j) { - sf::Vector2f newVertice = currentSFMLSprite.getTransform().transformPoint( - !isFlippedX - ? polygons[i].vertices[j].x - : GetCurrentSprite().GetSFMLSprite().getLocalBounds().width - - polygons[i].vertices[j].x, - !isFlippedY - ? polygons[i].vertices[j].y - : GetCurrentSprite().GetSFMLSprite().getLocalBounds().height - - polygons[i].vertices[j].y); - polygons[i].vertices[j] = newVertice; - } - } - - return polygons; -} - -bool RuntimeSpriteObject::SetSprite(std::size_t nb) { - if (currentAnimation >= GetAnimationsCount() || - currentDirection >= - animations[currentAnimation].Get().GetDirectionsCount() || - nb >= animations[currentAnimation] - .Get() - .GetDirection(currentDirection) - .GetSpritesCount()) - return false; - - currentSprite = nb; - timeElapsedOnCurrentSprite = 0; - - needUpdateCurrentSprite = true; - return true; -} - -bool RuntimeSpriteObject::SetCurrentAnimation(std::size_t nb) { - if (nb >= GetAnimationsCount()) return false; - if (nb == currentAnimation) return true; - - currentAnimation = nb; - currentSprite = 0; - timeElapsedOnCurrentSprite = 0; - - needUpdateCurrentSprite = true; - return true; -} - -bool RuntimeSpriteObject::SetCurrentAnimation( - const gd::String& newAnimationName) { - for (size_t i = 0; i < animations.size(); ++i) { - const gd::String& name = animations[i].Get().GetName(); - if (!name.empty() && name == newAnimationName) - return SetCurrentAnimation(i); - } - - return false; -} - -const gd::String& RuntimeSpriteObject::GetCurrentAnimationName() const { - if (currentAnimation >= GetAnimationsCount()) return badAnimation.GetName(); - return animations[currentAnimation].Get().GetName(); -} - -bool RuntimeSpriteObject::IsCurrentAnimationName(const gd::String& name) const { - return GetCurrentAnimationName() == name; -} - -bool RuntimeSpriteObject::SetDirection(float nb) { - if (currentAnimation >= GetAnimationsCount()) return false; - - if (!animations[currentAnimation].Get().useMultipleDirections) { - currentAngle = nb; - - needUpdateCurrentSprite = true; - return true; - } else { - if (nb >= animations[currentAnimation].Get().GetDirectionsCount() || - animations[currentAnimation].Get().GetDirection(nb).HasNoSprites()) - return false; - - if (nb == currentDirection) return true; - - currentDirection = nb; - currentSprite = 0; - timeElapsedOnCurrentSprite = 0; - - needUpdateCurrentSprite = true; - return true; - } -} - -bool RuntimeSpriteObject::SetAngle(float newAngle) { - if (currentAnimation >= GetAnimationsCount()) return false; - - if (!animations[currentAnimation].Get().useMultipleDirections) { - currentAngle = newAngle; - - needUpdateCurrentSprite = true; - } else { - newAngle = static_cast(newAngle) % 360; - if (newAngle < 0) newAngle += 360; - - return SetDirection(static_cast(GDRound(newAngle / 45.f)) % 8); - } - - return true; -} - -float RuntimeSpriteObject::GetAngle() const { - if (currentAnimation >= GetAnimationsCount()) return 0; - - if (!animations[currentAnimation].Get().useMultipleDirections) - return currentAngle; - else - return currentDirection * 45; -} - -float RuntimeSpriteObject::GetCurrentDirectionOrAngle() const { - if (currentAnimation >= GetAnimationsCount()) return 0; - - if (animations[currentAnimation].Get().useMultipleDirections) - return GetCurrentDirection(); - else - return GetAngle(); -} - -bool RuntimeSpriteObject::AnimationEnded() const { - if (currentAnimation >= GetAnimationsCount()) return true; - - const gd::Direction& direction = - animations[currentAnimation].Get().GetDirection(currentDirection); - return (!direction.IsLooping() && - currentSprite == direction.GetSpritesCount() - 1); -} - -void RuntimeSpriteObject::SetOpacity(float val) { - if (val > 255) - val = 255; - else if (val < 0) - val = 0; - - opacity = val; - needUpdateCurrentSprite = true; -} - -void RuntimeSpriteObject::SetColor(unsigned int r, - unsigned int v, - unsigned int b) { - colorR = r; - colorV = v; - colorB = b; - needUpdateCurrentSprite = true; -} - -void RuntimeSpriteObject::FlipX(bool flip) { - if (flip != isFlippedX) { - scaleX *= -1.0; - needUpdateCurrentSprite = true; - } - isFlippedX = flip; -} - -void RuntimeSpriteObject::FlipY(bool flip) { - if (flip != isFlippedY) { - scaleY *= -1.0; - needUpdateCurrentSprite = true; - } - isFlippedY = flip; -} - -bool RuntimeSpriteObject::CursorOnObject(RuntimeScene& scene, bool accurate) { -#if defined( \ - ANDROID) // TODO: Accurate test leads to strange result with touches. - accurate = false; -#endif - - RuntimeLayer& theLayer = scene.GetRuntimeLayer(layer); - auto insideObject = [this, accurate](const sf::Vector2f& pos) { - if (GetDrawableX() <= pos.x && GetDrawableX() + GetWidth() >= pos.x && - GetDrawableY() <= pos.y && GetDrawableY() + GetHeight() >= pos.y) { - int localX = static_cast(pos.x - GetDrawableX()); - int localY = static_cast(pos.y - GetDrawableY()); - - return (!accurate || GetCurrentSprite() - .GetSFMLTexture() - ->image.getPixel(localX, localY) - .a != 0); - } - - return false; - }; - - for (std::size_t cameraIndex = 0; cameraIndex < theLayer.GetCameraCount(); - ++cameraIndex) { - const auto& view = theLayer.GetCamera(cameraIndex).GetSFMLView(); - - sf::Vector2f mousePos = scene.renderWindow->mapPixelToCoords( - scene.GetInputManager().GetMousePosition(), view); - - if (insideObject(mousePos)) return true; - - auto& touches = scene.GetInputManager().GetAllTouches(); - for (auto& it : touches) { - sf::Vector2f touchPos = - scene.renderWindow->mapPixelToCoords(it.second, view); - if (insideObject(touchPos)) return true; - } - } - - return false; -} - -void RuntimeSpriteObject::TurnTowardObject(RuntimeObject* object, - RuntimeScene& scene) { - if (object == NULL) return; - - RotateTowardPosition(object->GetDrawableX() + object->GetCenterX(), - object->GetDrawableY() + object->GetCenterY(), - 0, - scene); -} - -#if defined(GD_IDE_ONLY) -void RuntimeSpriteObject::GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const { - if (propertyNb == 0) { - name = _("Animation"); - value = gd::String::From(GetCurrentAnimation()); - } else if (propertyNb == 1) { - name = _("Direction"); - value = gd::String::From(GetCurrentDirection()); - } else if (propertyNb == 2) { - name = _("Image"); - value = gd::String::From(GetSpriteNb()); - } else if (propertyNb == 3) { - name = _("Opacity"); - value = gd::String::From(GetOpacity()); - } else if (propertyNb == 4) { - name = _("Blend mode"); - if (blendMode == 0) - value = "0 (Alpha)"; - else if (blendMode == 1) - value = "1 (Add)"; - else if (blendMode == 2) - value = "2 (Multiply)"; - else if (blendMode == 3) - value = "3 (None)"; - } else if (propertyNb == 5) { - name = _("X Scale"); - value = gd::String::From(GetScaleX()); - } else if (propertyNb == 6) { - name = _("Y Scale"); - value = gd::String::From(GetScaleY()); - } -} - -bool RuntimeSpriteObject::ChangeProperty(std::size_t propertyNb, - gd::String newValue) { - if (propertyNb == 0) { - return SetCurrentAnimation(newValue.To()); - } else if (propertyNb == 1) { - if (currentAnimation >= GetAnimationsCount()) return false; - - return animations[currentAnimation].Get().useMultipleDirections - ? SetDirection(newValue.To()) - : SetAngle(newValue.To()); - } else if (propertyNb == 2) { - return SetSprite(newValue.To()); - } else if (propertyNb == 3) { - SetOpacity(newValue.To()); - } else if (propertyNb == 4) { - SetBlendMode(newValue.To()); - } else if (propertyNb == 5) { - SetScaleX(newValue.To()); - } else if (propertyNb == 6) { - SetScaleY(newValue.To()); - } - - return true; -} - -std::size_t RuntimeSpriteObject::GetNumberOfProperties() const { return 7; } -#endif - -AnimationProxy::AnimationProxy() : animation(new gd::Animation) {} -AnimationProxy::~AnimationProxy() { delete animation; } - -AnimationProxy::AnimationProxy(const gd::Animation& animation_) - : animation(new gd::Animation(animation_)) {} - -AnimationProxy::AnimationProxy(const AnimationProxy& proxy) - : animation(new gd::Animation(proxy.Get())) {} -AnimationProxy& AnimationProxy::operator=(const AnimationProxy& rhs) { - *animation = gd::Animation(rhs.Get()); - - return *this; -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.h b/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.h deleted file mode 100644 index 25062bea2..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeSpriteObject.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef SPRITEOBJECT_H -#define SPRITEOBJECT_H -#include "GDCpp/Runtime/Project/Object.h" -#include "GDCpp/Runtime/RuntimeObject.h" -namespace gd { -class InitialInstance; -class Object; -class Layout; -class Sprite; -class SpriteObject; -class Animation; -class PropertyDescriptor; -} -namespace sf { -class Sprite; -} - -/** - * \brief Wrapper around a pointer to Animation, used to reduce compile time. - * - * This proxy is used to avoid including Animation.h/Direction.h/Sprite.h and - * SFML headers. - */ -class GD_API AnimationProxy { - public: - AnimationProxy(); - AnimationProxy(const gd::Animation& animation); - virtual ~AnimationProxy(); - AnimationProxy(const AnimationProxy& proxy); - AnimationProxy& operator=(const AnimationProxy& rhs); - - gd::Animation& Get() { return *animation; } - const gd::Animation& Get() const { return *animation; } - gd::Animation& GetNonConst() const { return *animation; } - - private: - gd::Animation* animation; -}; - -/** - * \brief The class to represents objects of type Sprite at runtime. - */ -class GD_API RuntimeSpriteObject : public RuntimeObject { - public: - RuntimeSpriteObject(RuntimeScene& scene, - const gd::SpriteObject& spriteObject); - virtual ~RuntimeSpriteObject(); - virtual std::unique_ptr Clone() const { - return gd::make_unique(*this); - } - - virtual bool ExtraInitializationFromInitialInstance( - const gd::InitialInstance& position); - - virtual bool Draw(sf::RenderTarget& renderTarget); - -#if defined(GD_IDE_ONLY) - virtual void GetPropertyForDebugger(std::size_t propertyNb, - gd::String& name, - gd::String& value) const; - virtual bool ChangeProperty(std::size_t propertyNb, gd::String newValue); - virtual std::size_t GetNumberOfProperties() const; -#endif - - virtual void Update(const RuntimeScene& scene); - - virtual void OnPositionChanged() { needUpdateCurrentSprite = true; }; - - virtual float GetWidth() const; - virtual float GetHeight() const; - virtual void SetWidth(float newWidth); - virtual void SetHeight(float newHeight); - - virtual float GetDrawableX() const; - virtual float GetDrawableY() const; - - virtual float GetCenterX() const; - virtual float GetCenterY() const; - - virtual bool SetAngle(float newAngle); - virtual float GetAngle() const; - - virtual std::vector GetHitBoxes() const; - virtual bool CursorOnObject(RuntimeScene& scene, bool accurate); - - /** - * \brief Get the X position of a point of the current sprite, in "world" - * coordinates. - */ - float GetPointX(const gd::String& point) const; - - /** - * \brief Get the Y position of a point of the current sprite, in "world" - * coordinates. - */ - float GetPointY(const gd::String& point) const; - - /** - * \brief Update the SFML sprite according to position, angle and all - * parameters of the object. \note This is automatically called when needed - * when calling GetCurrentSFMLSprite, you should probably not have to call - * this method on your own. - */ - void UpdateCurrentSprite() const; - - /** - * \brief Get the SFML sprite used to display the object on the scene. - */ - const sf::Sprite& GetCurrentSFMLSprite() const; - - /** - * \brief Get the current gd::Sprite being displayed. - */ - const gd::Sprite& GetCurrentSprite() const; - - /** \name Current animation - */ - ///@{ - /** - * \brief Stop the animation being played. - */ - void StopAnimation() { animationStopped = true; }; - - /** - * \brief Play the current animation. - */ - void PlayAnimation() { animationStopped = false; }; - - /** - * \brief Check if the current animation is stopped. - */ - bool IsAnimationStopped() const { return animationStopped; } - - /** - * \brief Get the number of animations inside this object. - */ - std::size_t GetAnimationsCount() const { return animations.size(); }; - - /** - * \brief Get the index of the animation being played. - */ - inline std::size_t GetCurrentAnimation() const { return currentAnimation; } - - /** - * \brief Get the name of the animation being played. - */ - const gd::String& GetCurrentAnimationName() const; - - /** - * \brief Compare the name of the animation being played. - * \return true if the animation being played has the specified name. - */ - bool IsCurrentAnimationName(const gd::String& name) const; - - /** - * \brief Change the object animation. - * \param index The index of the new animation - * \return true if the animation was successfully changed, false otherwise - * (index out of bound). - */ - bool SetCurrentAnimation(std::size_t nb); - - /** - * \brief Change the object animation. - * \param index The name of the new animation - * \return true if the animation was successfully changed, false otherwise - * (animation not found). - */ - bool SetCurrentAnimation(const gd::String& newAnimationName); - - /** - * \brief Check if the current animation has reached its end. - * \note If the animation is looping, this will never be true. - */ - bool AnimationEnded() const; - - float GetAnimationSpeedScale() const { return animationSpeedScale; } - void SetAnimationSpeedScale(float ratio) { animationSpeedScale = ratio; } - - /** - * \brief Change the frame of the animation being displayed. - * \param index Index of the new frame - * \return true if the frame was changed, false otherwise (out of bound - * index). - */ - bool SetSprite(std::size_t nb); - - /** - * \brief Return the index of the frame of the animation being displayed. - */ - inline std::size_t GetSpriteNb() const { return currentSprite; } - ///@} - - bool SetDirection(float nb); - inline std::size_t GetCurrentDirection() const { return currentDirection; } - - /** - * \brief Return the angle or direction, according to the current direction - * type. - */ - float GetCurrentDirectionOrAngle() const; - - /** \name Scaling - */ - ///@{ - /** - * \brief Change the scale factor of the object on X axis. - * \param val The new scale. 1 is the default scale. - */ - void SetScaleX(float val); - - /** - * \brief Get the scale factor of the object on X axis. - * \return The scale factor. 1 is the default scale. - */ - float GetScaleX() const; - - /** - * \brief Change the scale factor of the object on Y axis. - * \param val The new scale. 1 is the default scale. - */ - void SetScaleY(float val); - - /** - * \brief Get the scale factor of the object on Y axis. - * \return The scale factor. 1 is the default scale. - */ - float GetScaleY() const; - - /** - * \brief Change the scale factor of the object on X and Y axis. - * \param val The new scale. 1 is the default scale. - */ - void SetScale(double newValue); - - /** - * \brief Get the scale of the object (or the average of the X and Y scale in case they are different). - * \return The average scale factor on X and Y axes. 1 is the default scale. - */ - double GetScale() const; - ///@} - - /** \name Effects and color - */ - ///@{ - /** - * \brief Set the opacity of the object - * \param val New value, between 0 (transparent) and 255. - */ - void SetOpacity(float val); - - /** - * \biref Get the opacity of the object - * \return Opacity, between 0 (transparent) and 255. - */ - inline float GetOpacity() const { return opacity; }; - - /** - * \brief Change overall color of the sprite. - * \note Default overall color is white. - */ - void SetColor(unsigned int r, unsigned int v, unsigned int b); - - /** - * \brief Get red component of the overall color of the sprite. - */ - unsigned int GetColorR() const; - - /** - * \brief Get green component of the overall color of the sprite. - */ - unsigned int GetColorG() const; - - /** - * \brief Get blue component of the overall color of the sprite. - */ - unsigned int GetColorB() const; - - /** - * Only used internally by GD events generated code: Prefer using original - * SetColor. - */ - void SetColor(const gd::String& colorStr); - - /** - * \brief Change the blend mode used to display the sprite. - */ - inline void SetBlendMode(unsigned int blendMode_) { blendMode = blendMode_; }; - - /** - * \brief Get the identifier of the blend mode used to display the sprite. - */ - inline unsigned int GetBlendMode() const { return blendMode; }; - - void CopyImageOnImageOfCurrentSprite(RuntimeScene& scene, - const gd::String& imageName, - float xPosition, - float yPosition, - bool useTransparency); - void MakeColorTransparent(const gd::String& colorStr); - ///@} - - /** \name Flipping - */ - ///@{ - void FlipX(bool flip = true); - void FlipY(bool flip = true); - bool IsFlippedX() const { return isFlippedX; }; - bool IsFlippedY() const { return isFlippedY; }; - ///@} - - /** - * Deprecated and only used internally by GD events generated code: Prefer - * using RotateTowardPosition. \deprecated See - * RuntimeSpriteObject::RotateTowardPosition instead. - */ - void TurnTowardObject(RuntimeObject* object, RuntimeScene& scene); - - private: - // Animations, direction and current frame: - std::size_t currentAnimation; - std::size_t currentDirection; - float currentAngle; - std::size_t currentSprite; - bool animationStopped; - - float timeElapsedOnCurrentSprite; - float animationSpeedScale; - - mutable gd::Sprite* ptrToCurrentSprite; // Pointer to the current sprite - mutable bool needUpdateCurrentSprite; - - std::vector animations; - - float opacity; - unsigned int blendMode; - bool isFlippedX; - bool isFlippedY; - - float scaleX; - float scaleY; - - // Color filter - unsigned int colorR; - unsigned int colorV; - unsigned int colorB; - - // Null objects if need to return a bad object. - static gd::Sprite* - badSpriteDatas; ///< Used when no valid sprite can be displayed. Created - ///< when the first RuntimeSpriteObject is created - static gd::Animation badAnimation; -}; - -#endif // SPRITEOBJECT_H diff --git a/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.cpp b/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.cpp deleted file mode 100644 index f46cb2244..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/RuntimeVariablesContainer.h" -#include -#include -#include "GDCore/Project/Variable.h" -#include "GDCore/Project/VariablesContainer.h" -#include "GDCore/TinyXml/tinyxml.h" - -BadVariable RuntimeVariablesContainer::badVariable; -BadRuntimeVariablesContainer RuntimeVariablesContainer::badVariablesContainer; - -RuntimeVariablesContainer::RuntimeVariablesContainer( - const gd::VariablesContainer& container) { - Merge(container); -} - -RuntimeVariablesContainer& RuntimeVariablesContainer::operator=( - const gd::VariablesContainer& container) { - Clear(); - Merge(container); - - return *this; -} - -void RuntimeVariablesContainer::Clear() { - variablesArray.clear(); - for (std::map::iterator it = variables.begin(); - it != variables.end(); - ++it) - delete it->second; - variables.clear(); -} - -void RuntimeVariablesContainer::Merge(const gd::VariablesContainer& container) { - for (std::size_t i = 0; i < container.Count(); ++i) { - const gd::String& name = container.GetNameAt(i); - const gd::Variable& variable = container.Get(i); - - if (Has(name)) - Get(name) = variable; - else { - gd::Variable* newVariable = new gd::Variable(variable); - variablesArray.push_back(newVariable); - variables[name] = newVariable; - } - } -} - -gd::Variable& RuntimeVariablesContainer::Get(const gd::String& name) { - std::map::const_iterator var = - variables.find(name); - - if (var != variables.end()) return *(var->second); - - gd::Variable* newVariable = new gd::Variable; - variables[name] = newVariable; - return *newVariable; -} - -const gd::Variable& RuntimeVariablesContainer::Get( - const gd::String& name) const { - std::map::const_iterator var = - variables.find(name); - - if (var != variables.end()) return *(var->second); - - gd::Variable* newVariable = new gd::Variable; - variables[name] = newVariable; - return *newVariable; -} - -gd::Variable& RuntimeVariablesContainer::GetBadVariable() { - return badVariable; -} - -/** - * \brief Return a "bad" variables container that can be used when no other - * valid container can be used. - */ -RuntimeVariablesContainer& -RuntimeVariablesContainer::GetBadVariablesContainer() { - return badVariablesContainer; -} diff --git a/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.h b/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.h deleted file mode 100644 index 240e2192b..000000000 --- a/GDCpp/GDCpp/Runtime/RuntimeVariablesContainer.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef RUNTIMEVARIABLESCONTAINER_H -#define RUNTIMEVARIABLESCONTAINER_H -#include -#include -#include -#include "GDCore/Project/Variable.h" -namespace gd { -class VariablesContainer; -}; -class BadRuntimeVariablesContainer; -class BadVariable; - -/** - * \brief Container for gd::Variable used at by games at runtime - * - * See gd::VariablesContainer for the container used for storage. - * - * \see gd::VariablesContainer - * \see RuntimeScene - * \see RuntimeObject - * - * \ingroup GameEngine - */ -class GD_API RuntimeVariablesContainer { - public: - /** - * \brief Construct a RuntimeVariablesContainer from a gd::VariablesContainer. - * - * Variables contained in the original container will be accessible thanks to - * their index. - */ - RuntimeVariablesContainer(const gd::VariablesContainer& container); - - /** - * \brief Construct an empty container. - */ - RuntimeVariablesContainer(){}; - - /** - * \brief Initialize a RuntimeVariablesContainer from a - * gd::VariablesContainer. - * - * Variables contained in the original container will be accessible thanks to - * their index.
Already existing variables will be erased. - */ - RuntimeVariablesContainer& operator=(const gd::VariablesContainer& container); - - /** - * \brief Destructor: Properly clear the container. - */ - virtual ~RuntimeVariablesContainer() { Clear(); }; - - /** - * \brief Return true if the specified variable is in the container - */ - bool Has(const gd::String& name) const { - return variables.find(name) != variables.end(); - } - -#if defined(GD_IDE_ONLY) - /** - * \brief Return the number of variables in the container. - */ - std::size_t Count() { return variables.size(); } -#endif - - /** - * \brief Return a reference to the variable called \a name. - */ - virtual gd::Variable& Get(const gd::String& name); - - /** - * \brief Return a reference to the variable called \a name. - */ - virtual const gd::Variable& Get(const gd::String& name) const; - - /** - * \brief Return a reference to the variable at the @ index position in the - * list. \warning No bound check is made. Please use other overload of - * gd::VariablesContainer::Get when you do not have any efficiency request. - * \note This specific overload can used by code generated from events when a - * variable index is known at the time of the code generation. - */ - virtual gd::Variable& Get(std::size_t index) { - return *variablesArray[index]; - } - - /** - * \brief Return a reference to the variable at the @ index position in the - * list. \warning No bound check is made. Please use other overload of - * gd::VariablesContainer::GetVariable when you do not have any efficiency - * request. \note This specific overload can used by code generated from - * events when a variable index is known at the time of the code generation. - */ - virtual const gd::Variable& Get(std::size_t index) const { - return *variablesArray[index]; - } - - /** - * \brief Return a "bad" variable that can be used when no other valid - * variable can be used. - */ - static gd::Variable& GetBadVariable(); - - /** - * \brief Return a "bad" variables container that can be used when no other - * valid container can be used. - */ - static RuntimeVariablesContainer& GetBadVariablesContainer(); - - /** - * \brief Merge the variables from the container with the already existing - * variables. - * - * Already existing variables values are replaced. - * Newly added variables are available thanks to their index. Be careful: If - * the container was not empty, the index of the new variables are not the - * same as their index in the original container. - */ - virtual void Merge(const gd::VariablesContainer& container); - - /** - * Get a map containing all variables. - */ - const std::map& DumpAllVariables() { - return variables; - }; - - private: - /** - * \brief Clear the container. - */ - void Clear(); - - std::vector variablesArray; - mutable std::map variables; - static BadVariable badVariable; - static BadRuntimeVariablesContainer badVariablesContainer; -}; - -/** - * \brief "Bad" variable, used by events when no other valid variable can be - * found. - * - * This variable has no state and always return 0 or the empty string. - * \see RuntimeVariablesContainer - * \see BadRuntimeVariablesContainer - */ -class GD_API BadVariable : public gd::Variable { - public: - BadVariable() : gd::Variable(){}; - virtual ~BadVariable(){}; - - virtual void SetString(const gd::String&){}; - virtual void SetValue(double){}; - virtual bool HasChild(const gd::String& name) const { return false; } - virtual Variable& GetChild(const gd::String& name) { - return RuntimeVariablesContainer::GetBadVariable(); - } - virtual const Variable& GetChild(const gd::String& name) const { - return RuntimeVariablesContainer::GetBadVariable(); - } -}; - -/** - * \brief "Bad" variable container, used by events when no other valid container - * can be found. - * - * This container has no state and always returns the bad variable ( see - * RuntimeVariablesContainer::GetBadVariable() ). \see RuntimeVariablesContainer - * \see BadVariable - */ -class GD_API BadRuntimeVariablesContainer : public RuntimeVariablesContainer { - public: - BadRuntimeVariablesContainer() : RuntimeVariablesContainer(){}; - virtual ~BadRuntimeVariablesContainer(){}; - - virtual gd::Variable& Get(const gd::String& name) { - return RuntimeVariablesContainer::GetBadVariable(); - } - virtual const gd::Variable& Get(const gd::String& name) const { - return RuntimeVariablesContainer::GetBadVariable(); - } - virtual gd::Variable& Get(std::size_t index) { - return RuntimeVariablesContainer::GetBadVariable(); - } - virtual const gd::Variable& Get(std::size_t index) const { - return RuntimeVariablesContainer::GetBadVariable(); - } - virtual void Merge(const gd::VariablesContainer& container) {} -}; - -#endif // RUNTIMEVARIABLESCONTAINER_H diff --git a/GDCpp/GDCpp/Runtime/SceneNameMangler.cpp b/GDCpp/GDCpp/Runtime/SceneNameMangler.cpp deleted file mode 100644 index 0721a4b3e..000000000 --- a/GDCpp/GDCpp/Runtime/SceneNameMangler.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/IDE/SceneNameMangler.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/SceneNameMangler.h b/GDCpp/GDCpp/Runtime/SceneNameMangler.h deleted file mode 100644 index 082ff255e..000000000 --- a/GDCpp/GDCpp/Runtime/SceneNameMangler.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/IDE/SceneNameMangler.h" diff --git a/GDCpp/GDCpp/Runtime/SceneStack.cpp b/GDCpp/GDCpp/Runtime/SceneStack.cpp deleted file mode 100644 index 91deabea9..000000000 --- a/GDCpp/GDCpp/Runtime/SceneStack.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "SceneStack.h" -#include "CodeExecutionEngine.h" -#include "RuntimeGame.h" -#include "RuntimeScene.h" -#include "SceneNameMangler.h" - -bool SceneStack::Step() { - if (stack.empty()) return false; - - auto& scene = stack.back(); - if (scene->RenderAndStep()) { - auto request = scene->GetRequestedChange(); - if (request.change == RuntimeScene::SceneChange::STOP_GAME) { - return false; - } else if (request.change == RuntimeScene::SceneChange::POP_SCENE) { - Pop(); - } else if (request.change == RuntimeScene::SceneChange::PUSH_SCENE) { - Push(request.requestedScene); - } else if (request.change == RuntimeScene::SceneChange::REPLACE_SCENE) { - Replace(request.requestedScene); - } else if (request.change == RuntimeScene::SceneChange::CLEAR_SCENES) { - Replace(request.requestedScene, true); - } else { - if (errorCallback) errorCallback("Unrecognized change in scene stack."); - return false; - } - } - - return true; -} - -std::unique_ptr SceneStack::Pop() { - if (stack.size() <= 1) return nullptr; - - std::unique_ptr scene = std::move(stack.back()); - stack.pop_back(); - return scene; -} - -RuntimeScene* SceneStack::Push(gd::String newSceneName) { - if (!game.HasLayoutNamed(newSceneName)) { - if (errorCallback) - errorCallback("Scene \"" + newSceneName + "\" does not exist."); - return nullptr; - } - - std::unique_ptr newScene(new RuntimeScene(window, &game)); - if (!newScene->LoadFromScene(game.GetLayout(newSceneName))) { - if (errorCallback) - errorCallback("Unable to load scene \"" + newSceneName + "\"."); - return nullptr; - } - - if (loadCallback && !loadCallback(*newScene)) { - if (errorCallback) - errorCallback("Unable to setup execution engine for scene \"" + - newScene->GetName() + "\"."); - return nullptr; - } - - newScene->ChangeRenderWindow(window); - stack.push_back(std::move(newScene)); - return stack.back().get(); -} - -RuntimeScene* SceneStack::Replace(gd::String newSceneName, bool clear) { - if (clear) { - while (!stack.empty()) stack.pop_back(); - } else { - if (!stack.empty()) stack.pop_back(); - } - return Push(newSceneName); -} diff --git a/GDCpp/GDCpp/Runtime/SceneStack.h b/GDCpp/GDCpp/Runtime/SceneStack.h deleted file mode 100644 index d1371b354..000000000 --- a/GDCpp/GDCpp/Runtime/SceneStack.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include -#include -#include -#include -class RuntimeGame; -class RuntimeScene; -namespace sf { -class RenderWindow; -} - -/** - * A stack of RuntimeScene. - */ -class GD_API SceneStack { - public: - /** - * \brief Construct a new stack - * \param game The RuntimeGame that will be used by scenes. - * \param window The sf::RenderWindow to be used to render the scenes. - * \param codeLibraryName Filename to a shared library containing the code to - * execute for scenes. - */ - SceneStack(RuntimeGame &game_, sf::RenderWindow *window_) - : game(game_), window(window_){}; - - /** - * \brief Execute one step of the game. - * - * RuntimeScene::RenderAndStep is called on the current scene. If a scene - * change was requested, the stack is updated. - * - * This method is typically called in a loop until it returns false. - * \return false if game must be stopped. - */ - bool Step(); - - /** - * \brief Stop and remove the current scene from the stack, unless there is - * only one or zero scene in the stack. - * \return A pointer to the scene removed, or a null pointer if nothing was - * removed. - */ - std::unique_ptr Pop(); - - /** - * \brief Load a new scene on the top of the stack. This scene becomes the - * current scene and is the one played when you call Step. \param newSceneName - * The name of the scene to launch, as found in the RuntimeGame. \return A non - * owning pointer to the RuntimeScene added or nullptr if loading failed. - */ - RuntimeScene *Push(gd::String newSceneName); - - /** - * \brief Replace the current scene by a new one. This new scene becomes the - * current scene and is the one played when you call Step. \param newSceneName - * The name of the scene to launch, as found in the RuntimeGame. \param clear - * If set to true, all other scenes will be removed from stack. \return A non - * owning pointer to the RuntimeScene added or nullptr if loading failed. - */ - RuntimeScene *Replace(gd::String newSceneName, bool clear = false); - - /** - * \brief Set the callback called when an error occurs (loading failed...) - */ - void OnError(std::function cb) { errorCallback = cb; }; - - /** - * \brief Set a custom function to call when a scene is pushed on the stack. - */ - void OnLoadScene(std::function cb) { - loadCallback = cb; - } - - private: - RuntimeGame &game; - sf::RenderWindow *window; - std::vector> stack; - std::function errorCallback; - std::function loadCallback; -}; diff --git a/GDCpp/GDCpp/Runtime/Serialization/Serializer.cpp b/GDCpp/GDCpp/Runtime/Serialization/Serializer.cpp deleted file mode 100644 index daea9e31a..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/Serializer.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Serialization/Serializer.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Serialization/Serializer.h b/GDCpp/GDCpp/Runtime/Serialization/Serializer.h deleted file mode 100644 index 7352584bb..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/Serializer.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Serialization/Serializer.h" diff --git a/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.cpp b/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.cpp deleted file mode 100644 index d3a915076..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Serialization/SerializerElement.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.h b/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.h deleted file mode 100644 index 7c8425a09..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/SerializerElement.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Serialization/SerializerElement.h" diff --git a/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.cpp b/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.cpp deleted file mode 100644 index 560747e93..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Serialization/SerializerValue.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.h b/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.h deleted file mode 100644 index 90ba7e0a4..000000000 --- a/GDCpp/GDCpp/Runtime/Serialization/SerializerValue.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Serialization/SerializerValue.h" diff --git a/GDCpp/GDCpp/Runtime/ShaderManager.cpp b/GDCpp/GDCpp/Runtime/ShaderManager.cpp deleted file mode 100644 index c49ec1259..000000000 --- a/GDCpp/GDCpp/Runtime/ShaderManager.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "ShaderManager.h" -#include -#include -#include "GDCpp/Runtime/ResourcesLoader.h" - -using namespace std; - -ShaderManager::ShaderManager() {} - -std::shared_ptr ShaderManager::GetSFMLShader( - const std::vector& shaders) { - if (alreadyLoadedShader.find(shaders) != alreadyLoadedShader.end()) - return alreadyLoadedShader[shaders].lock(); - - // Loading a new (compilation of) shader(s) - std::vector declarations; - gd::String mainFunctions; - - std::shared_ptr shader(new sf::Shader); - - for (std::size_t i = 0; i < shaders.size(); ++i) { - gd::String file = gd::ResourcesLoader::Get()->LoadPlainText(shaders[i]); - - std::istringstream linesStream(file.ToLocale().c_str()); - - bool isInMainFunction = false; - std::string line; - while (linesStream.good()) { - getline(linesStream, line); - if (line == "void main()") { - if (!isInMainFunction) - isInMainFunction = true; - else - std::cout << "Main function declared more than one time." - << std::endl; - } else if (!isInMainFunction) { - if (std::find(declarations.begin(), - declarations.end(), - gd::String::FromLocale(line) + "\n") == - declarations.end()) - declarations.push_back(gd::String::FromLocale(line) + "\n"); - } else - mainFunctions += gd::String::FromLocale(line) + "\n"; - } - } - - gd::String shaderSource; - for (std::size_t i = 0; i < declarations.size(); ++i) - shaderSource += declarations[i]; - shaderSource += "\nvoid main()\n{" + mainFunctions + "}"; - std::cout << "ShaderSource:" << shaderSource << std::endl; - shader->loadFromMemory(shaderSource.c_str(), sf::Shader::Fragment); - - alreadyLoadedShader[shaders] = shader; - - return shader; -} diff --git a/GDCpp/GDCpp/Runtime/ShaderManager.h b/GDCpp/GDCpp/Runtime/ShaderManager.h deleted file mode 100644 index 24f155b99..000000000 --- a/GDCpp/GDCpp/Runtime/ShaderManager.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef SHADERMANAGER_H -#define SHADERMANAGER_H -#include -#include -#include - -#include -#include "GDCpp/Runtime/String.h" - -namespace gd { -class Project; -} - -/** - * \brief Still work in progress class to manage shaders - * - * \todo Unfinished class. - * - * \ingroup GameEngine - */ -class ShaderManager { - public: - ShaderManager(); - virtual ~ShaderManager(){}; - - std::shared_ptr GetSFMLShader( - const std::vector& shaders); - - private: - mutable std::map, std::weak_ptr > - alreadyLoadedShader; -}; - -#endif // SHADERMANAGER_H diff --git a/GDCpp/GDCpp/Runtime/Sound.cpp b/GDCpp/GDCpp/Runtime/Sound.cpp deleted file mode 100644 index 9876fb235..000000000 --- a/GDCpp/GDCpp/Runtime/Sound.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/Sound.h" -#include -#include -#include -#include -#include "GDCpp/Runtime/ResourcesLoader.h" -#include "GDCpp/Runtime/SoundManager.h" - -using namespace std; - -Sound::Sound(gd::String pFile) : file(pFile), volume(100) { - buffer = gd::ResourcesLoader::Get()->LoadSoundBuffer(file); - sound.setBuffer(buffer); -} - -Sound::Sound() : volume(100) { sound.setBuffer(buffer); } - -Sound::Sound(const Sound& copy) : file(copy.file) { - buffer = gd::ResourcesLoader::Get()->LoadSoundBuffer(file); - sound.setBuffer(buffer); -} - -void Sound::SetVolume(float volume_, float globalVolume) { - volume = volume_; - if (volume < 0) volume = 0; - if (volume > 100) volume = 100; - - UpdateVolume(globalVolume); -} - -void Sound::UpdateVolume(float globalVolume) { - sound.setVolume(volume * globalVolume / 100.f); -} diff --git a/GDCpp/GDCpp/Runtime/Sound.h b/GDCpp/GDCpp/Runtime/Sound.h deleted file mode 100644 index 5b2f0e57f..000000000 --- a/GDCpp/GDCpp/Runtime/Sound.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef SOUND_H -#define SOUND_H -#include -#include "GDCpp/Runtime/String.h" - -/** - * \brief Represents a sound to be played - * - * \see SoundManager - * \ingroup SoundEngine - */ -class GD_API Sound : sf::NonCopyable { - public: - Sound(); - Sound(gd::String file); - Sound(const Sound& copy); - virtual ~Sound(){}; - - /** - * \brief Get the sound status - * \return sf::Music::Paused, sf::Music::Playing or sf::Music::Stopped. - */ - inline sf::Sound::Status GetStatus() const { return sound.getStatus(); } - - /** - * \brief Change the music volume. - * \param volume The new volume, between 0 and 100. - */ - void SetVolume(float volume_, float globalVolume); - - /** - * \brief Get the sound volume. - */ - inline float GetVolume() const { return volume; } - - /** - * Change the pitch of the sound. - */ - void SetPitch(float newPitch) { sound.setPitch(newPitch); }; - - /** - * Get the pitch of the sound. - */ - float GetPitch() const { return sound.getPitch(); }; - - /** - * Change the current playing position of the sound. - * \param timeOffset The new playing position, in seconds. - */ - void SetPlayingOffset(double timeOffset) { - sound.setPlayingOffset(sf::seconds(timeOffset)); - }; - - /** - * Return the current playing position of the music, in seconds. - */ - double GetPlayingOffset() const { - return sound.getPlayingOffset().asSeconds(); - }; - - // Order is important : - sf::SoundBuffer buffer; - sf::Sound sound; - - gd::String file; - - /** - * \brief Internal member functions to update music volume according to global - * volume. - * - * Called by the sound manager when the global volume is updated. - */ - void UpdateVolume(float globalVolume); - - private: - float volume; ///< Volume is not directly stored in the sf::Sound as GD - ///< allows to change global volume. -}; - -#endif // SOUND_H diff --git a/GDCpp/GDCpp/Runtime/SoundManager.cpp b/GDCpp/GDCpp/Runtime/SoundManager.cpp deleted file mode 100644 index 26f507377..000000000 --- a/GDCpp/GDCpp/Runtime/SoundManager.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "GDCpp/Runtime/SoundManager.h" -#include -#include -#include -#include "GDCpp/Runtime/Music.h" -#include "GDCpp/Runtime/Project/ResourcesManager.h" -#include "GDCpp/Runtime/ResourcesLoader.h" -#include "GDCpp/Runtime/Sound.h" -#include "GDCpp/Runtime/String.h" - -SoundManager::SoundManager() : globalVolume(100), resourcesManager(nullptr) {} - -const gd::String& SoundManager::GetFileFromSoundName( - const gd::String& name) const { - if (!resourcesManager || !resourcesManager->HasResource(name)) return name; - - return resourcesManager->GetResource(name).GetFile(); -} - -void SoundManager::PlaySoundOnChannel(const gd::String& name, - unsigned int channel, - bool repeat, - float volume, - float pitch) { - std::shared_ptr sound = - std::make_shared(GetFileFromSoundName(name)); - sound->sound.play(); - sound->sound.setRelativeToListener(true); - - SetSoundOnChannel(channel, sound); - GetSoundOnChannel(channel)->sound.setLoop(repeat); - GetSoundOnChannel(channel)->SetVolume(volume, globalVolume); - GetSoundOnChannel(channel)->SetPitch(pitch); -} - -void SoundManager::PlaySound(const gd::String& name, - bool repeat, - float volume, - float pitch) { - sounds.push_back( - std::shared_ptr(new Sound(GetFileFromSoundName(name)))); - sounds.back()->sound.play(); - sounds.back()->sound.setRelativeToListener(true); - - sounds.back()->sound.setLoop(repeat); - sounds.back()->SetVolume(volume, globalVolume); - sounds.back()->SetPitch(pitch); -} - -void SoundManager::PlayMusic(const gd::String& name, - bool repeat, - float volume, - float pitch) { - const gd::String& file = GetFileFromSoundName(name); - std::shared_ptr music(new Music); -#if !defined(GD_IDE_ONLY) - gd::ResourcesLoader* ressourcesLoader = gd::ResourcesLoader::Get(); - if (ressourcesLoader->HasFile(file)) { - std::size_t size = ressourcesLoader->GetBinaryFileSize(file); - music->SetBuffer(ressourcesLoader->LoadBinaryFile(file), size); - music->OpenFromMemory(size); - } else -#endif - { - music->OpenFromFile(file); - } - - musics.push_back(music); - musics.back()->music.setRelativeToListener(true); - musics.back()->Play(); - - music->SetLoop(repeat); - music->SetVolume(volume, globalVolume); - music->SetPitch(pitch); -} - -void SoundManager::PlayMusicOnChannel(const gd::String& name, - unsigned int channel, - bool repeat, - float volume, - float pitch) { - const gd::String& file = GetFileFromSoundName(name); - std::shared_ptr music(new Music); -#if !defined(GD_IDE_ONLY) - gd::ResourcesLoader* ressourcesLoader = gd::ResourcesLoader::Get(); - if (ressourcesLoader->HasFile(file)) { - std::size_t size = ressourcesLoader->GetBinaryFileSize(file); - music->SetBuffer(ressourcesLoader->LoadBinaryFile(file), size); - music->OpenFromMemory(size); - } else -#endif - { - music->OpenFromFile(file); - } - - SetMusicOnChannel(channel, music); - music->music.setRelativeToListener(true); - music->Play(); - - music->SetLoop(repeat); - music->SetVolume(volume, globalVolume); - music->SetPitch(pitch); -} - -void SoundManager::ManageGarbage() { - for (std::size_t i = 0; i < sounds.size(); i++) { - if (sounds[i]->sound.getStatus() == sf::Sound::Stopped) - sounds.erase(sounds.begin() + i); - } - - for (std::size_t i = 0; i < musics.size(); i++) { - if (musics[i]->GetStatus() == sf::Music::Stopped) - musics.erase(musics.begin() + i); - } -} - -std::shared_ptr& SoundManager::GetMusicOnChannel(int channel) { - return musicsChannel[channel]; -} - -void SoundManager::SetMusicOnChannel(int channel, - std::shared_ptr music) { - musicsChannel[channel] = music; -} - -void SoundManager::SetSoundOnChannel(int channel, - std::shared_ptr sound) { - soundsChannel[channel] = sound; -} - -std::shared_ptr& SoundManager::GetSoundOnChannel(int channel) { - return soundsChannel[channel]; -} - -void SoundManager::SetGlobalVolume(float volume) { - globalVolume = volume; - - if (globalVolume < 0.0) globalVolume = 0.0; - - if (globalVolume > 100.0) globalVolume = 100.0; - - for (std::map >::iterator it = - soundsChannel.begin(); - it != soundsChannel.end(); - ++it) { - if (it->second != std::shared_ptr()) - (it->second)->UpdateVolume(globalVolume); - } - for (std::map >::iterator it = - musicsChannel.begin(); - it != musicsChannel.end(); - ++it) { - if (it->second != std::shared_ptr()) - it->second->UpdateVolume(globalVolume); - } - for (std::size_t i = 0; i < sounds.size(); ++i) { - if (sounds[i] != std::shared_ptr()) - sounds[i]->UpdateVolume(globalVolume); - } - for (std::size_t i = 0; i < musics.size(); ++i) { - if (musics[i] != std::shared_ptr()) - musics[i]->UpdateVolume(globalVolume); - } -} diff --git a/GDCpp/GDCpp/Runtime/SoundManager.h b/GDCpp/GDCpp/Runtime/SoundManager.h deleted file mode 100644 index c7f9d69e8..000000000 --- a/GDCpp/GDCpp/Runtime/SoundManager.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef SOUNDMANAGER_H -#define SOUNDMANAGER_H - -#include -#include -#include -#include -#include -#include "GDCpp/Runtime/Music.h" -#include "GDCpp/Runtime/Sound.h" -namespace gd { -class ResourcesManager; -} -#undef PlaySound // Avoid a nasty macro from polluting everything - -using namespace std; - -/** - * \brief Manage sounds and musics played by games. - * - * \see Sound - * \see Music - * - * \ingroup SoundEngine - */ -class GD_API SoundManager { - public: - SoundManager(); - ~SoundManager(){}; - - /** - * \brief Set the gd::ResourcesManager used by the SoundManager. - */ - void SetResourcesManager(gd::ResourcesManager* resourcesManager_) { - resourcesManager = resourcesManager_; - } - - vector > musics; - vector > sounds; - - /** - * \brief Play a sound (wav files). - * \param file The resource name, or filename to load. - * \param repeat true to loop the sound - * \param volume The volume, between 0 and 100. - * \param pitch The pithc, 1 by default - */ - void PlaySound(const gd::String& name, - bool repeat, - float volume, - float pitch); - - /** - * \brief Play a music (ogg files). - * \param file The resource name, or filename to load. - * \param repeat true to loop the music - * \param volume The volume, between 0 and 100. - * \param pitch The pithc, 1 by default - */ - void PlayMusic(const gd::String& name, - bool repeat, - float volume, - float pitch); - - /** - * \brief Play a sound (wav files) on a channel. - * \param file The resource name, or filename to load. - * \param channel The channel to use. The previous sound, if any, will be - * stopped. \param repeat true to loop the sound \param volume The volume, - * between 0 and 100. \param pitch The pithc, 1 by default - */ - void PlaySoundOnChannel(const gd::String& name, - unsigned int channel, - bool repeat, - float volume, - float pitch); - - /** - * \brief Play a music (wav files) on a channel. - * \param file The resource name, or filename to load. - * \param channel The channel to use. The previous music, if any, will be - * stopped. \param repeat true to loop the music \param volume The volume, - * between 0 and 100. \param pitch The pithc, 1 by default - */ - void PlayMusicOnChannel(const gd::String& name, - unsigned int channel, - bool repeat, - float volume, - float pitch); - - /** - * Return pointer to a music on a channel - */ - std::shared_ptr& GetMusicOnChannel(int channel); - - /** - * Change music on a channel. Automatically destroy the old music. - */ - void SetMusicOnChannel(int channel, std::shared_ptr music); - - /** - * Return pointer to a sound on a channel - */ - std::shared_ptr& GetSoundOnChannel(int channel); - - /** - * Change sound on a channel. Automatically destroy the old sound. - */ - void SetSoundOnChannel(int channel, std::shared_ptr sound); - - /** - * Get global game sound volume. - * Example : - * \code - * float currentVolume = game.GetSoundManager().GetGlobalVolume(); - * \endcode - */ - inline float GetGlobalVolume() const { return globalVolume; } - - /** - * Change global game sound volume. - */ - void SetGlobalVolume(float volume); - - /** - * Destroy all sounds and musics - */ - void ClearAllSoundsAndMusics() { - musicsChannel.clear(); - soundsChannel.clear(); - sounds.clear(); - musics.clear(); - } - - /** - * Ensure sounds and musics without channels and stopped are destroyed. - */ - void ManageGarbage(); - - private: - const gd::String& GetFileFromSoundName(const gd::String& name) const; - - std::map > soundsChannel; - std::map > musicsChannel; - - float globalVolume; - gd::ResourcesManager* resourcesManager; -}; - -#endif // SOUNDMANAGER_H diff --git a/GDCpp/GDCpp/Runtime/SourceFileCommonTools.h b/GDCpp/GDCpp/Runtime/SourceFileCommonTools.h deleted file mode 100644 index 95eb6a973..000000000 --- a/GDCpp/GDCpp/Runtime/SourceFileCommonTools.h +++ /dev/null @@ -1,33 +0,0 @@ -/** \file This file contains some common tools which can be used in source file - * and in C++ Code events of GDevelop projects. - * - * This file is automatically included by GDevelop. See - * GDCpp/Runtime/EventsPrecompiledHeader.h for a full list of automatically - * included files. - */ -// Extensions writers: Please do not use these functions: There are meant to be -// used for ease the writing of C++ code inside GDevelop! - -#include -#include "GDCpp/Runtime/RuntimeObject.h" - -/** - * Returns a vector containing only the objects of type T. - * - * \param objectsList A vector containing pointers to objects. - * \return A vector containing only the objects of type T. - */ -template -std::vector GetSpecificObjects( - const std::vector& objectsList) { - std::vector specializedObjects; - specializedObjects.reserve(objectsList.size()); - - for (std::size_t i = 0; i < objectsList.size(); ++i) { - T* specializedObject = dynamic_cast(objectsList[i]); - if (specializedObject != NULL) - specializedObjects.push_back(specializedObject); - } - - return specializedObjects; -} diff --git a/GDCpp/GDCpp/Runtime/String.cpp b/GDCpp/GDCpp/Runtime/String.cpp deleted file mode 100644 index 2cf498c0f..000000000 --- a/GDCpp/GDCpp/Runtime/String.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2015-2016 Victor Levasseur (victorlevasseur52@gmail.com). - * This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/String.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/String.h b/GDCpp/GDCpp/Runtime/String.h deleted file mode 100644 index 26c261114..000000000 --- a/GDCpp/GDCpp/Runtime/String.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2015 Victor Levasseur (victorlevasseur52@gmail.com). - * This project is released under the MIT License. - */ - -#include "GDCore/String.h" diff --git a/GDCpp/GDCpp/Runtime/TimeManager.cpp b/GDCpp/GDCpp/Runtime/TimeManager.cpp deleted file mode 100644 index ad5aac5a7..000000000 --- a/GDCpp/GDCpp/Runtime/TimeManager.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#include "TimeManager.h" - -void TimeManager::Reset() { - firstLoop = true; - firstUpdateDone = false; - elapsedTime = 0; - timeScale = 1; - timeFromStart = 0; - pauseTime = 0; - - timers.clear(); -} - -bool TimeManager::Update(signed int realElapsedTime, double minimumFPS) { - if (firstUpdateDone) firstLoop = false; - firstUpdateDone = true; - - // Update time elapsed since last frame - realElapsedTime -= pauseTime; - if (realElapsedTime < 0) realElapsedTime = 0; - - // Make sure that the elapsed time is not beyond the limit (slow down the game - // if necessary) - if (minimumFPS != 0 && realElapsedTime > 1000000.0 / minimumFPS) - realElapsedTime = 1000000.0 / minimumFPS; - - // Apply time scale - elapsedTime = realElapsedTime * timeScale; - - // Update timers - timeFromStart += elapsedTime; - pauseTime = 0; - - for (auto it = timers.begin(); it != timers.end(); ++it) - it->second.UpdateTime(elapsedTime); - - return true; -} - -void TimeManager::AddTimer(gd::String name) { - ManualTimer newTimer; - timers[name] = newTimer; -} - -bool TimeManager::HasTimer(gd::String name) const { - return timers.find(name) != timers.end(); -} - -ManualTimer& TimeManager::GetTimer(gd::String name) { - if (!HasTimer(name)) return nullTimer; - - return timers[name]; -} - -void TimeManager::RemoveTimer(gd::String name) { - if (!HasTimer(name)) return; - - timers.erase(name); -} diff --git a/GDCpp/GDCpp/Runtime/TimeManager.h b/GDCpp/GDCpp/Runtime/TimeManager.h deleted file mode 100644 index ea8a0ac28..000000000 --- a/GDCpp/GDCpp/Runtime/TimeManager.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ -#ifndef TIMEMANAGER_H -#define TIMEMANAGER_H -#include -#include "GDCpp/Runtime/ManualTimer.h" -#include "GDCpp/Runtime/String.h" - -/** - * \brief Manage the timers and times elapsed during last - * frame, since the beginning of the scene and other time related values. - * - * In particular, each RuntimeScene owns a TimeManager. - * - * \see RuntimeScene - * \ingroup GameEngine - */ -class GD_API TimeManager { - public: - /** - * @brief Default constructor. - */ - TimeManager() { Reset(); } - - void Reset(); - - bool Update(signed int realElapsedTime, double minimumFPS); - - /** - * \brief Change time scale. - * - * Time will be slower if time scale is < 1, - * faster if > 1. - * \param timeScale The new time scale (must be positive). - */ - void SetTimeScale(double timeScale_) { timeScale = timeScale_; }; - - /** - * \brief Get the time scale. - */ - double GetTimeScale() const { return timeScale; }; - - /** - * \brief Get elapsed time since last frame, in microseconds. - */ - signed long long GetElapsedTime() const { return elapsedTime; }; - - /** - * \brief Get time elapsed since beginning, in microseconds. - */ - signed long long GetTimeFromStart() const { return timeFromStart; }; - - /** - * \brief Return true if Update was called only once (i.e: if the scene - * is rendering its first frame). - */ - bool IsFirstLoop() const { return firstLoop; }; - - /** - * \brief Notify that something (like a file dialog) stopped the scene - * for a certain amount of time. - * \param pauseTime_ Pause duration, in microseconds. - */ - void NotifyPauseWasMade(signed long long pauseTime_) { - pauseTime += pauseTime_; - } - - /** \name Timers - * Functions to manipulate timers - */ - ///@{ - void AddTimer(gd::String name); - bool HasTimer(gd::String name) const; - ManualTimer& GetTimer(gd::String name); - void RemoveTimer(gd::String name); - - /** - * \brief Provide a direct access to all the timers. - * - * Useful to build a custom interface (i.e: debugger) displaying the timers. - */ - std::map& GetTimers() { return timers; } - ///@} - - private: - bool firstLoop; - bool firstUpdateDone; - signed int elapsedTime; ///< Elapsed time since last frame, in microseconds ( - ///< elapsedTime = realElapsedTime*timeScale ). - double timeScale; ///< Time scale - signed long long - timeFromStart; ///< Time, in microseconds, elapsed since the beginning. - signed long long pauseTime; ///< Time to be subtracted to realElapsedTime for - ///< the current frame. - - std::map timers; ///< Timers of the scene. - ManualTimer nullTimer; ///< Timer with a time which is always 0. -}; - -#endif diff --git a/GDCpp/GDCpp/Runtime/TinyXml/tinystr.cpp b/GDCpp/GDCpp/Runtime/TinyXml/tinystr.cpp deleted file mode 100644 index ad2f09e18..000000000 --- a/GDCpp/GDCpp/Runtime/TinyXml/tinystr.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -/* - * THIS FILE WAS ALTERED BY Tyge L�vset, 7. April 2005. - */ - -/** - * Changes by Florian Rival : - * Added GD_IDE_ONLY guard (see below) to prevent this file from being compiled when we're compiling the library for the IDE - * (as in this case, GDevelop Core provides TinyXml). - */ - -#if !defined(GD_IDE_ONLY) - -#ifndef TIXML_USE_STL - -#include "GDCpp/Runtime/TinyXml/tinystr.h" - -// Error value for find primitive -const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); - - -// Null rep. -TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; - - -void TiXmlString::reserve (size_type cap) -{ - if (cap > capacity()) - { - TiXmlString tmp; - tmp.init(length(), cap); - memcpy(tmp.start(), data(), length()); - swap(tmp); - } -} - - -TiXmlString& TiXmlString::assign(const char* str, size_type len) -{ - size_type cap = capacity(); - if (len > cap || cap > 3*(len + 8)) - { - TiXmlString tmp; - tmp.init(len); - memcpy(tmp.start(), str, len); - swap(tmp); - } - else - { - memmove(start(), str, len); - set_size(len); - } - return *this; -} - - -TiXmlString& TiXmlString::append(const char* str, size_type len) -{ - size_type newsize = length() + len; - if (newsize > capacity()) - { - reserve (newsize + capacity()); - } - memmove(finish(), str, len); - set_size(newsize); - return *this; -} - - -TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) -{ - TiXmlString tmp; - tmp.reserve(a.length() + b.length()); - tmp += a; - tmp += b; - return tmp; -} - -TiXmlString operator + (const TiXmlString & a, const char* b) -{ - TiXmlString tmp; - TiXmlString::size_type b_len = static_cast( strlen(b) ); - tmp.reserve(a.length() + b_len); - tmp += a; - tmp.append(b, b_len); - return tmp; -} - -TiXmlString operator + (const char* a, const TiXmlString & b) -{ - TiXmlString tmp; - TiXmlString::size_type a_len = static_cast( strlen(a) ); - tmp.reserve(a_len + b.length()); - tmp.append(a, a_len); - tmp += b; - return tmp; -} - - -#endif // TIXML_USE_STL - -#endif diff --git a/GDCpp/GDCpp/Runtime/TinyXml/tinystr.h b/GDCpp/GDCpp/Runtime/TinyXml/tinystr.h deleted file mode 100644 index d384aa618..000000000 --- a/GDCpp/GDCpp/Runtime/TinyXml/tinystr.h +++ /dev/null @@ -1,333 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -/* - * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. - * - * - completely rewritten. compact, clean, and fast implementation. - * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems) - * - fixed reserve() to work as per specification. - * - fixed buggy compares operator==(), operator<(), and operator>() - * - fixed operator+=() to take a const ref argument, following spec. - * - added "copy" constructor with length, and most compare operators. - * - added swap(), clear(), size(), capacity(), operator+(). - */ - -/** - * Changes by Florian Rival : - * Added GD_API to integrate TinyXml to GDevelop Library. - * - * Added GD_IDE_ONLY guard ( see below ) to prevent this file from being used when we're compiling the library for the IDE - * ( as in this case, GDevelop Core provides TinyXml ). - */ - -#if defined(GD_IDE_ONLY) -#include "GDCore/TinyXml/tinystr.h" -#else - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#include -#include - -/* The support for explicit isn't that universal, and it isn't really - required - it is used to check that the TiXmlString class isn't incorrectly - used. Be nice to old compilers and macro it here: -*/ -#if defined(_MSC_VER) && (_MSC_VER >= 1200 ) - // Microsoft visual studio, version 6 and higher. - #define TIXML_EXPLICIT explicit -#elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - #define TIXML_EXPLICIT explicit -#else - #define TIXML_EXPLICIT -#endif - - -/* - TiXmlString is an emulation of a subset of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class GD_API TiXmlString -{ - public : - // The size type used - typedef size_t size_type; - - // Error value for find primitive - static const size_type npos; // = -1; - - - // TiXmlString empty constructor - TiXmlString () : rep_(&nullrep_) - { - } - - // TiXmlString copy constructor - TiXmlString ( const TiXmlString & copy) : rep_(0) - { - init(copy.length()); - memcpy(start(), copy.data(), length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) - { - init( static_cast( strlen(copy) )); - memcpy(start(), copy, length()); - } - - // TiXmlString constructor, based on a string - TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) - { - init(len); - memcpy(start(), str, len); - } - - // TiXmlString destructor - ~TiXmlString () - { - quit(); - } - - // = operator - TiXmlString& operator = (const char * copy) - { - return assign( copy, (size_type)strlen(copy)); - } - - // = operator - TiXmlString& operator = (const TiXmlString & copy) - { - return assign(copy.start(), copy.length()); - } - - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - return append(suffix, static_cast( strlen(suffix) )); - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - return append(&single, 1); - } - - // += operator. Maps to append - TiXmlString& operator += (const TiXmlString & suffix) - { - return append(suffix.data(), suffix.length()); - } - - - // Convert a TiXmlString into a null-terminated char * - const char * c_str () const { return rep_->str; } - - // Convert a TiXmlString into a char * (need not be null terminated). - const char * data () const { return rep_->str; } - - // Return the length of a TiXmlString - size_type length () const { return rep_->size; } - - // Alias for length() - size_type size () const { return rep_->size; } - - // Checks if a TiXmlString is empty - bool empty () const { return rep_->size == 0; } - - // Return capacity of string - size_type capacity () const { return rep_->capacity; } - - - // single char extraction - const char& at (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // [] operator - char& operator [] (size_type index) const - { - assert( index < length() ); - return rep_->str[ index ]; - } - - // find a char in a string. Return TiXmlString::npos if not found - size_type find (char lookup) const - { - return find(lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::npos if not found - size_type find (char tofind, size_type offset) const - { - if (offset >= length()) return npos; - - for (const char* p = c_str() + offset; *p != '\0'; ++p) - { - if (*p == tofind) return static_cast< size_type >( p - c_str() ); - } - return npos; - } - - void clear () - { - //Lee: - //The original was just too strange, though correct: - // TiXmlString().swap(*this); - //Instead use the quit & re-init: - quit(); - init(0,0); - } - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function DOES NOT clear the content of the TiXmlString if any exists. - */ - void reserve (size_type cap); - - TiXmlString& assign (const char* str, size_type len); - - TiXmlString& append (const char* str, size_type len); - - void swap (TiXmlString& other) - { - Rep* r = rep_; - rep_ = other.rep_; - other.rep_ = r; - } - - private: - - void init(size_type sz) { init(sz, sz); } - void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } - char* start() const { return rep_->str; } - char* finish() const { return rep_->str + rep_->size; } - - struct Rep - { - size_type size, capacity; - char str[1]; - }; - - void init(size_type sz, size_type cap) - { - if (cap) - { - // Lee: the original form: - // rep_ = static_cast(operator new(sizeof(Rep) + cap)); - // doesn't work in some cases of new being overloaded. Switching - // to the normal allocation, although use an 'int' for systems - // that are overly picky about structure alignment. - const size_type bytesNeeded = sizeof(Rep) + cap; - const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); - rep_ = reinterpret_cast( new int[ intsNeeded ] ); - - rep_->str[ rep_->size = sz ] = '\0'; - rep_->capacity = cap; - } - else - { - rep_ = &nullrep_; - } - } - - void quit() - { - if (rep_ != &nullrep_) - { - // The rep_ is really an array of ints. (see the allocator, above). - // Cast it back before delete, so the compiler won't incorrectly call destructors. - delete [] ( reinterpret_cast( rep_ ) ); - } - } - - Rep * rep_; - static Rep nullrep_; - -} ; - - -inline bool operator == (const TiXmlString & a, const TiXmlString & b) -{ - return ( a.length() == b.length() ) // optimization on some platforms - && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare -} -inline bool operator < (const TiXmlString & a, const TiXmlString & b) -{ - return strcmp(a.c_str(), b.c_str()) < 0; -} - -inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } -inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } -inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } -inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } - -inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } -inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } -inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } -inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } - -TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); -TiXmlString operator + (const TiXmlString & a, const char* b); -TiXmlString operator + (const char* a, const TiXmlString & b); - - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class GD_API TiXmlOutStream : public TiXmlString -{ -public : - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const TiXmlString & in) - { - *this += in; - return *this; - } - - // TiXmlOutStream << operator. - TiXmlOutStream & operator << (const char * in) - { - *this += in; - return *this; - } - -} ; - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL - -#endif diff --git a/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.cpp b/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.cpp deleted file mode 100644 index 6fad90331..000000000 --- a/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.cpp +++ /dev/null @@ -1,1897 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -/** - * Changes by Florian Rival : - * Added GD_IDE_ONLY guard ( see below ) to prevent this file from being compiled when we're compiling the library for the IDE - * ( as in this case, GDevelop Core provides TinyXml ). - */ - -#if !defined(GD_IDE_ONLY) - -#include - -#ifdef TIXML_USE_STL -#include -#include -#endif - -#include "GDCpp/Runtime/TinyXml/tinyxml.h" - - -bool TiXmlBase::condenseWhiteSpace = true; - -// Microsoft compiler security -FILE* TiXmlFOpen( const char* filename, const char* mode ) -{ - #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) - FILE* fp = 0; - errno_t err = fopen_s( &fp, filename, mode ); - if ( !err && fp ) - return fp; - return 0; - #else - return fopen( filename, mode ); - #endif -} - -void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) -{ - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); - #else - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - #endif - - //*ME: warning C4267: convert 'size_t' to 'int' - //*ME: Int-Cast to make compiler happy ... - outString->append( buf, (int)strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } -} - - -TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() -{ - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; -} - - -TiXmlNode::~TiXmlNode() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } -} - - -void TiXmlNode::CopyTo( TiXmlNode* target ) const -{ - target->SetValue (value.c_str() ); - target->userData = userData; -} - - -void TiXmlNode::Clear() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } - - firstChild = 0; - lastChild = 0; -} - - -TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) -{ - assert( node->parent == 0 || node->parent == this ); - assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); - - if ( node->Type() == TiXmlNode::DOCUMENT ) - { - delete node; - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - node->parent = this; - - node->prev = lastChild; - node->next = 0; - - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. - - lastChild = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) -{ - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - - return LinkEndChild( node ); -} - - -TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) { - return 0; - } - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) -{ - if ( !afterThis || afterThis->parent != this ) { - return 0; - } - if ( addThis.Type() == TiXmlNode::DOCUMENT ) - { - if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; -} - - -TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) -{ - if ( replaceThis->parent != this ) - return 0; - - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; - - node->next = replaceThis->next; - node->prev = replaceThis->prev; - - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; - - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; - - delete replaceThis; - node->parent = this; - return node; -} - - -bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) -{ - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } - - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; - - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; - - delete removeThis; - return true; -} - -const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - - -const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - - -const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( strcmp( node->Value(), _value ) == 0 ) - return node; - } - return 0; -} - - -void TiXmlElement::RemoveAttribute( const char * name ) -{ - #ifdef TIXML_USE_STL - TIXML_STRING str( name ); - TiXmlAttribute* node = attributeSet.Find( str ); - #else - TiXmlAttribute* node = attributeSet.Find( name ); - #endif - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } -} - -const TiXmlElement* TiXmlNode::FirstChildElement() const -{ - const TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::NextSiblingElement() const -{ - const TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlDocument* TiXmlNode::GetDocument() const -{ - const TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - - -TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} - - -#ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} -#endif - - -TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - copy.CopyTo( this ); -} - - -void TiXmlElement::operator=( const TiXmlElement& base ) -{ - ClearThis(); - base.CopyTo( this ); -} - - -TiXmlElement::~TiXmlElement() -{ - ClearThis(); -} - - -void TiXmlElement::ClearThis() -{ - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } -} - - -const char* TiXmlElement::Attribute( const char* name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - return node->Value(); - return 0; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - return &node->ValueStr(); - return 0; -} -#endif - - -const char* TiXmlElement::Attribute( const char* name, int* i ) const -{ - const char* s = Attribute( name ); - if ( i ) - { - if ( s ) { - *i = atoi( s ); - } - else { - *i = 0; - } - } - return s; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const -{ - const std::string* s = Attribute( name ); - if ( i ) - { - if ( s ) { - *i = atoi( s->c_str() ); - } - else { - *i = 0; - } - } - return s; -} -#endif - - -const char* TiXmlElement::Attribute( const char* name, double* d ) const -{ - const char* s = Attribute( name ); - if ( d ) - { - if ( s ) { - *d = atof( s ); - } - else { - *d = 0; - } - } - return s; -} - - -#ifdef TIXML_USE_STL -const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const -{ - const std::string* s = Attribute( name ); - if ( d ) - { - if ( s ) { - *d = atof( s->c_str() ); - } - else { - *d = 0; - } - } - return s; -} -#endif - - -int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryIntValue( ival ); -} - - -#ifdef TIXML_USE_STL -int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryIntValue( ival ); -} -#endif - - -int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryDoubleValue( dval ); -} - - -#ifdef TIXML_USE_STL -int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - return node->QueryDoubleValue( dval ); -} -#endif - - -void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%d", val ); - #else - sprintf( buf, "%d", val ); - #endif - SetAttribute( name, buf ); -} - - -#ifdef TIXML_USE_STL -void TiXmlElement::SetAttribute( const std::string& name, int val ) -{ - std::ostringstream oss; - oss << val; - SetAttribute( name, oss.str() ); -} -#endif - - -void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[256]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%f", val ); - #else - sprintf( buf, "%f", val ); - #endif - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) -{ - #ifdef TIXML_USE_STL - TIXML_STRING _name( cname ); - TIXML_STRING _value( cvalue ); - #else - const char* _name = cname; - const char* _value = cvalue; - #endif - - TiXmlAttribute* node = attributeSet.Find( _name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( cname, cvalue ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} - - -#ifdef TIXML_USE_STL -void TiXmlElement::SetAttribute( const std::string& name, const std::string& _value ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} -#endif - - -void TiXmlElement::Print( FILE* cfile, int depth ) const -{ - int i; - assert( cfile ); - for ( i=0; iNext() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a node - // 2) An element with only a text child is printed as text - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i", value.c_str() ); - } -} - - -void TiXmlElement::CopyTo( TiXmlElement* target ) const -{ - // superclass: - TiXmlNode::CopyTo( target ); - - // Element class: - // Clone the attributes, then clone the children. - const TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - -bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const -{ - if ( visitor->VisitEnter( *this, attributeSet.First() ) ) - { - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - if ( !node->Accept( visitor ) ) - break; - } - } - return visitor->VisitExit( *this ); -} - - -TiXmlNode* TiXmlElement::Clone() const -{ - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -const char* TiXmlElement::GetText() const -{ - const TiXmlNode* child = this->FirstChild(); - if ( child ) { - const TiXmlText* childText = child->ToText(); - if ( childText ) { - return childText->Value(); - } - } - return 0; -} - - -TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - ClearError(); -} - -TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - value = documentName; - ClearError(); -} - - -#ifdef TIXML_USE_STL -TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - useMicrosoftBOM = false; - value = documentName; - ClearError(); -} -#endif - - -TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDocument::operator=( const TiXmlDocument& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) -{ - // See STL_STRING_BUG below. - //StringToBuffer buf( value ); - - return LoadFile( Value(), encoding ); -} - - -bool TiXmlDocument::SaveFile() const -{ - // See STL_STRING_BUG below. -// StringToBuffer buf( value ); -// -// if ( buf.buffer && SaveFile( buf.buffer ) ) -// return true; -// -// return false; - return SaveFile( Value() ); -} - -bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) -{ - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // Add an extra string to avoid the crash. - TIXML_STRING filename( _filename ); - value = filename; - - // reading in binary mode so that tinyxml can normalize the EOL - FILE* file = TiXmlFOpen( value.c_str (), "rb" ); - - if ( file ) - { - bool result = LoadFile( file, encoding ); - fclose( file ); - return result; - } - else - { - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } -} - -bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) -{ - if ( !file ) - { - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - // Delete the existing data: - Clear(); - location.Clear(); - - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length <= 0 ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - // Subtle bug here. TinyXml did use fgets. But from the XML spec: - // 2.11 End-of-Line Handling - // - // - // ...the XML processor MUST behave as if it normalized all line breaks in external - // parsed entities (including the document entity) on input, before parsing, by translating - // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to - // a single #xA character. - // - // - // It is not clear fgets does that, and certainly isn't clear it works cross platform. - // Generally, you expect fgets to translate from the convention of the OS to the c/unix - // convention, and not work generally. - - /* - while( fgets( buf, sizeof(buf), file ) ) - { - data += buf; - } - */ - - char* buf = new char[ length+1 ]; - buf[0] = 0; - - if ( fread( buf, length, 1, file ) != 1 ) { - delete [] buf; - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; - } - - const char* lastPos = buf; - const char* p = buf; - - buf[length] = 0; - while( *p ) { - assert( p < (buf+length) ); - if ( *p == 0xa ) { - // Newline character. No special rules for this. Append all the characters - // since the last string, and include the newline. - data.append( lastPos, (p-lastPos+1) ); // append, include the newline - ++p; // move past the newline - lastPos = p; // and point to the new buffer (may be 0) - assert( p <= (buf+length) ); - } - else if ( *p == 0xd ) { - // Carriage return. Append what we have so far, then - // handle moving forward in the buffer. - if ( (p-lastPos) > 0 ) { - data.append( lastPos, p-lastPos ); // do not add the CR - } - data += (char)0xa; // a proper newline - - if ( *(p+1) == 0xa ) { - // Carriage return - new line sequence - p += 2; - lastPos = p; - assert( p <= (buf+length) ); - } - else { - // it was followed by something else...that is presumably characters again. - ++p; - lastPos = p; - assert( p <= (buf+length) ); - } - } - else { - ++p; - } - } - // Handle any left over characters. - if ( p-lastPos ) { - data.append( lastPos, p-lastPos ); - } - delete [] buf; - buf = 0; - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; -} - - -bool TiXmlDocument::SaveFile( const char * filename ) const -{ - // The old c stuff lives on... - FILE* fp = TiXmlFOpen( filename, "w" ); - if ( fp ) - { - bool result = SaveFile( fp ); - fclose( fp ); - return result; - } - return false; -} - - -bool TiXmlDocument::SaveFile( FILE* fp ) const -{ - if ( useMicrosoftBOM ) - { - const unsigned char TIXML_UTF_LEAD_0 = 0xefU; - const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; - const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - - fputc( TIXML_UTF_LEAD_0, fp ); - fputc( TIXML_UTF_LEAD_1, fp ); - fputc( TIXML_UTF_LEAD_2, fp ); - } - Print( fp, 0 ); - return (ferror(fp) == 0); -} - - -void TiXmlDocument::CopyTo( TiXmlDocument* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->error = error; - target->errorId = errorId; - target->errorDesc = errorDesc; - target->tabsize = tabsize; - target->errorLocation = errorLocation; - target->useMicrosoftBOM = useMicrosoftBOM; - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlDocument::Clone() const -{ - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlDocument::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } -} - - -bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const -{ - if ( visitor->VisitEnter( *this ) ) - { - for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) - { - if ( !node->Accept( visitor ) ) - break; - } - } - return visitor->VisitExit( *this ); -} - - -const TiXmlAttribute* TiXmlAttribute::Next() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -/* -TiXmlAttribute* TiXmlAttribute::Next() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} -*/ - -const TiXmlAttribute* TiXmlAttribute::Previous() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -/* -TiXmlAttribute* TiXmlAttribute::Previous() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} -*/ - -void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const -{ - TIXML_STRING n, v; - - EncodeString( name, &n ); - EncodeString( value, &v ); - - if (value.find ('\"') == TIXML_STRING::npos) { - if ( cfile ) { - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - } - if ( str ) { - (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; - } - } - else { - if ( cfile ) { - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); - } - if ( str ) { - (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; - } - } -} - - -int TiXmlAttribute::QueryIntValue( int* ival ) const -{ - if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -int TiXmlAttribute::QueryDoubleValue( double* dval ) const -{ - if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -void TiXmlAttribute::SetIntValue( int _value ) -{ - char buf [64]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); - #else - sprintf (buf, "%d", _value); - #endif - SetValue (buf); -} - -void TiXmlAttribute::SetDoubleValue( double _value ) -{ - char buf [256]; - #if defined(TIXML_SNPRINTF) - TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); - #else - sprintf (buf, "%lf", _value); - #endif - SetValue (buf); -} - -int TiXmlAttribute::IntValue() const -{ - return atoi (value.c_str ()); -} - -double TiXmlAttribute::DoubleValue() const -{ - return atof (value.c_str ()); -} - - -TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlComment::operator=( const TiXmlComment& base ) -{ - Clear(); - base.CopyTo( this ); -} - - -void TiXmlComment::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlComment::CopyTo( TiXmlComment* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlComment::Clone() const -{ - TiXmlComment* clone = new TiXmlComment(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlText::Print( FILE* cfile, int depth ) const -{ - assert( cfile ); - if ( cdata ) - { - int i; - fprintf( cfile, "\n" ); - for ( i=0; i\n", value.c_str() ); // unformatted output - } - else - { - TIXML_STRING buffer; - EncodeString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); - } -} - - -void TiXmlText::CopyTo( TiXmlText* target ) const -{ - TiXmlNode::CopyTo( target ); - target->cdata = cdata; -} - - -bool TiXmlText::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} - - -#ifdef TIXML_USE_STL -TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} -#endif - - -TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const -{ - if ( cfile ) fprintf( cfile, "" ); - if ( str ) (*str) += "?>"; -} - - -void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->version = version; - target->encoding = encoding; - target->standalone = standalone; -} - - -bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlUnknown::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const -{ - return visitor->Visit( *this ); -} - - -TiXmlNode* TiXmlUnknown::Clone() const -{ - TiXmlUnknown* clone = new TiXmlUnknown(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlAttributeSet::TiXmlAttributeSet() -{ - sentinel.next = &sentinel; - sentinel.prev = &sentinel; -} - - -TiXmlAttributeSet::~TiXmlAttributeSet() -{ - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); -} - - -void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) -{ - #ifdef TIXML_USE_STL - assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. - #else - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - #endif - - addMe->next = &sentinel; - addMe->prev = sentinel.prev; - - sentinel.prev->next = addMe; - sentinel.prev = addMe; -} - -void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. -} - - -#ifdef TIXML_USE_STL -const TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const -{ - for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -/* -TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) -{ - for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} -*/ -#endif - - -const TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const -{ - for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( strcmp( node->name.c_str(), name ) == 0 ) - return node; - } - return 0; -} - -/* -TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) -{ - for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( strcmp( node->name.c_str(), name ) == 0 ) - return node; - } - return 0; -} -*/ - -#ifdef TIXML_USE_STL -std::istream& operator>> (std::istream & in, TiXmlNode & base) -{ - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); - - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; -} -#endif - - -#ifdef TIXML_USE_STL -std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) -{ - TiXmlPrinter printer; - printer.SetStreamPrinting(); - base.Accept( &printer ); - out << printer.Str(); - - return out; -} - - -std::string& operator<< (std::string& out, const TiXmlNode& base ) -{ - TiXmlPrinter printer; - printer.SetStreamPrinting(); - base.Accept( &printer ); - out.append( printer.Str() ); - - return out; -} -#endif - - -TiXmlHandle TiXmlHandle::FirstChild() const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement() const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && iNextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && iNextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && iNextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && iNextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) -{ - return true; -} - -bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) -{ - return true; -} - -bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) -{ - DoIndent(); - buffer += "<"; - buffer += element.Value(); - - for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) - { - buffer += " "; - attrib->Print( 0, 0, &buffer ); - } - - if ( !element.FirstChild() ) - { - buffer += " />"; - DoLineBreak(); - } - else - { - buffer += ">"; - if ( element.FirstChild()->ToText() - && element.LastChild() == element.FirstChild() - && element.FirstChild()->ToText()->CDATA() == false ) - { - simpleTextPrint = true; - // no DoLineBreak()! - } - else - { - DoLineBreak(); - } - } - ++depth; - return true; -} - - -bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) -{ - --depth; - if ( !element.FirstChild() ) - { - // nothing. - } - else - { - if ( simpleTextPrint ) - { - simpleTextPrint = false; - } - else - { - DoIndent(); - } - buffer += ""; - DoLineBreak(); - } - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlText& text ) -{ - if ( text.CDATA() ) - { - DoIndent(); - buffer += ""; - DoLineBreak(); - } - else if ( simpleTextPrint ) - { - TIXML_STRING str; - TiXmlBase::EncodeString( text.ValueTStr(), &str ); - buffer += str; - } - else - { - DoIndent(); - TIXML_STRING str; - TiXmlBase::EncodeString( text.ValueTStr(), &str ); - buffer += str; - DoLineBreak(); - } - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) -{ - DoIndent(); - declaration.Print( 0, 0, &buffer ); - DoLineBreak(); - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlComment& comment ) -{ - DoIndent(); - buffer += ""; - DoLineBreak(); - return true; -} - - -bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) -{ - DoIndent(); - buffer += "<"; - buffer += unknown.Value(); - buffer += ">"; - DoLineBreak(); - return true; -} - -#endif diff --git a/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.h b/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.h deleted file mode 100644 index 88e182a70..000000000 --- a/GDCpp/GDCpp/Runtime/TinyXml/tinyxml.h +++ /dev/null @@ -1,1813 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -/** - * Changes by Florian Rival : - * Added GD_IDE_ONLY guard ( see below ) to prevent this file from being compiled when we're compiling the library for the IDE - * ( as in this case, GDevelop Core provides TinyXml ). - */ - -#if defined(GD_IDE_ONLY) -#include "GDCore/TinyXml/tinyxml.h" -#else - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#ifdef _MSC_VER -#pragma warning( push ) -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#ifdef TIXML_USE_STL - #include - #include - #include - #define TIXML_STRING std::string -#else - #include "GDCpp/Runtime/TinyXml/tinystr.h" - #define TIXML_STRING TiXmlString -#endif - -// Deprecated library function hell. Compilers want to use the -// new safe versions. This probably doesn't fully address the problem, -// but it gets closer. There are too many compilers for me to fully -// test. If you get compilation troubles, undefine TIXML_SAFE -#define TIXML_SAFE - -#ifdef TIXML_SAFE - #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) - // Microsoft visual studio, version 2005 and higher. - #define TIXML_SNPRINTF _snprintf_s - #define TIXML_SNSCANF _snscanf_s - #define TIXML_SSCANF sscanf_s - #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) - // Microsoft visual studio, version 6 and higher. - //#pragma message( "Using _sn* functions." ) - #define TIXML_SNPRINTF _snprintf - #define TIXML_SNSCANF _snscanf - #define TIXML_SSCANF sscanf - #elif defined(__GNUC__) && (__GNUC__ >= 3 ) - // GCC version 3 and higher.s - //#warning( "Using sn* functions." ) - #define TIXML_SNPRINTF snprintf - #define TIXML_SNSCANF snscanf - #define TIXML_SSCANF sscanf - #else - #define TIXML_SSCANF sscanf - #endif -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 5; -const int TIXML_PATCH_VERSION = 3; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct GD_API TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -/** - If you call the Accept() method, it requires being passed a TiXmlVisitor - class to handle callbacks. For nodes that contain other nodes (Document, Element) - you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves - are simple called with Visit(). - - If you return 'true' from a Visit method, recursive parsing will continue. If you return - false, no children of this node or its sibilings will be Visited. - - All flavors of Visit methods have a default implementation that returns 'true' (continue - visiting). You need to only override methods that are interesting to you. - - Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. - - You should never change the document from a callback. - - @sa TiXmlNode::Accept() -*/ -class GD_API TiXmlVisitor -{ -public: - virtual ~TiXmlVisitor() {} - - /// Visit a document. - virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } - /// Visit a document. - virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } - - /// Visit an element. - virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } - /// Visit an element. - virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } - - /// Visit a declaration - virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } - /// Visit a text node - virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } - /// Visit a comment node - virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } - /// Visit an unknow node - virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } -}; - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class GD_API TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream - or the string class (TiXmlString in non-STL mode, std::string - in STL mode.) Either or both cfile and str can be null. - - This is a formatted print, and will insert - tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - value is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. - void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. - const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, - or they will be transformed into entities! - */ - static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - TIXML_ERROR_PARSING_CDATA, - TIXML_ERROR_DOCUMENT_TOP_ONLY, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - inline static bool IsWhiteSpace( int c ) - { - if ( c < 256 ) - return IsWhiteSpace( (char) c ); - return false; // Again, only truly correct for English/Latin...but usually works. - } - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); - static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((const unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), - // and the null terminator isn't needed - for( int i=0; p[i] && i<*length; ++i ) { - _value[i] = p[i]; - } - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to English words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class GD_API TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char *Value() const { return value.c_str (); } - - #ifdef TIXML_USE_STL - /** Return Value() as a std::string. If you only use STL, - this is more efficient than calling Value(). - Only available in STL mode. - */ - const std::string& ValueStr() const { return value; } - #endif - - const TIXML_STRING& ValueTStr() const { return value; } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - /// The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * _value ) { - // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) - // call the method, cast the return back to non-const. - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); - } - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * _value ) { - return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); - } - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char *_prev ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char* _next ) { - return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); - } - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char *_next ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement() { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); - } - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * _value ) const; - TiXmlElement* FirstChildElement( const char * _value ) { - return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); - } - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument() { - return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); - } - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - - /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the - XML tree will be conditionally visited and the host will be called back - via the TiXmlVisitor interface. - - This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse - the XML for the callbacks, so the performance of TinyXML is unchanged by using this - interface versus any other.) - - The interface has been based on ideas from: - - - http://www.saxproject.org/ - - http://c2.com/cgi/wiki?HierarchicalVisitorPattern - - Which are both good references for "visiting". - - An example of using Accept(): - @verbatim - TiXmlPrinter printer; - tinyxmlDoc.Accept( &printer ); - const char* xmlcstr = printer.CStr(); - @endverbatim - */ - virtual bool Accept( TiXmlVisitor* visitor ) const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class GD_API TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. - #ifdef TIXML_USE_STL - const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. - #endif - int IntValue() const; ///< Return the value of this attribute, converted to an integer. - double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - // Get the tinyxml string representation - const TIXML_STRING& NameTStr() const { return name; } - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* _value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* _value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int _value ); ///< Set the value from an integer. - void SetDoubleValue( double _value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) { name = _name; } - /// STL std::string form. - void SetValue( const std::string& _value ) { value = _value; } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); - } - - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous() { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); - } - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class GD_API TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - const TiXmlAttribute* Find( const char* _name ) const; - TiXmlAttribute* Find( const char* _name ) { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); - } - #ifdef TIXML_USE_STL - const TiXmlAttribute* Find( const std::string& _name ) const; - TiXmlAttribute* Find( const std::string& _name ) { - return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); - } - - #endif - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class GD_API TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - int QueryIntAttribute( const char* name, int* _value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* _value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryFloatAttribute( const char* name, float* _value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - if ( result == TIXML_SUCCESS ) { - *_value = (float)d; - } - return result; - } - - #ifdef TIXML_USE_STL - /** Template form of the attribute query which will try to read the - attribute into the specified type. Very easy, very powerful, but - be careful to make sure to call this with the correct type. - - NOTE: This method doesn't work correctly for 'string' types. - - @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE - */ - template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - std::stringstream sstream( node->ValueStr() ); - sstream >> *outValue; - if ( !sstream.fail() ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; - } - /* - This is - in theory - a bug fix for "QueryValueAtribute returns truncated std::string" - but template specialization is hard to get working cross-compiler. Leaving the bug for now. - - // The above will fail for std::string because the space character is used as a seperator. - // Specialize for strings. Bug [ 1695429 ] QueryValueAtribute returns truncated std::string - template<> int QueryValueAttribute( const std::string& name, std::string* outValue ) const - { - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - *outValue = node->ValueStr(); - return TIXML_SUCCESS; - } - */ - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * _value ); - - #ifdef TIXML_USE_STL - const std::string* Attribute( const std::string& name ) const; - const std::string* Attribute( const std::string& name, int* i ) const; - const std::string* Attribute( const std::string& name, double* d ) const; - int QueryIntAttribute( const std::string& name, int* _value ) const; - int QueryDoubleAttribute( const std::string& name, double* _value ) const; - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ); - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ); - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /** Convenience function for easy access to the text inside an element. Although easy - and concise, GetText() is limited compared to getting the TiXmlText child - and accessing it directly. - - If the first child of 'this' is a TiXmlText, the GetText() - returns the character string of the Text node, else null is returned. - - This is a convenient method for getting the text of simple contained text: - @verbatim - This is text - const char* str = fooElement->GetText(); - @endverbatim - - 'str' will be a pointer to "This is text". - - Note that this function can be misleading. If the element foo was created from - this XML: - @verbatim - This is text - @endverbatim - - then the value of str would be null. The first child node isn't a text node, it is - another element. From this XML: - @verbatim - This is text - @endverbatim - GetText() will return "This is ". - - WARNING: GetText() accesses a child node - don't become confused with the - similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are - safe type casts on the referenced node. - */ - const char* GetText() const; - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class GD_API TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} - /// Construct a comment from text. - TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) { - SetValue( _value ); - } - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - // Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif -// virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. A text node can have 2 ways to output the next. "normal" output - and CDATA. It will default to the mode it was parsed from the XML file and - you generally want to leave it alone, but you can change the output mode with - SetCDATA() and query it with CDATA(). -*/ -class GD_API TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /** Constructor for text element. By default, it is treated as - normal, encoded text. If you want it be output as a CDATA text - element, set the parameter _cdata to 'true' - */ - TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - cdata = false; - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - cdata = false; - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - - // Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /// Queries whether this represents text using a CDATA section. - bool CDATA() const { return cdata; } - /// Turns on or off a CDATA representation of text. - void SetCDATA( bool _cdata ) { cdata = _cdata; } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - bool cdata; // true if this should be input and output as a CDATA style text element -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class GD_API TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - // Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; - virtual void Print( FILE* cfile, int depth ) const { - Print( cfile, depth, 0 ); - } - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* visitor ) const; - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class GD_API TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - // Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class GD_API TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - /** Load a file using the given FILE*. Returns true if successful. Note that this method - doesn't stream - the entire object pointed at by the FILE* - will be interpreted as an XML file. TinyXML doesn't stream in XML from the current - file location. Streaming may be added in the future. - */ - bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given FILE*. Returns true if successful. - bool SaveFile( FILE* ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { -// StringToBuffer f( filename ); -// return ( f.buffer && LoadFile( f.buffer, encoding )); - return LoadFile( filename.c_str(), encoding ); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { -// StringToBuffer f( filename ); -// return ( f.buffer && SaveFile( f.buffer )); - return SaveFile( filename.c_str() ); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() const { return errorLocation.row+1; } - int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) - to report the correct values for row and column. It does not change the output - or input in any way. - - By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Write the document to standard out using formatted printing ("pretty print"). */ - void Print() const { Print( stdout, 0 ); } - - /* Write the document to a string using formatted printing ("pretty print"). This - will allocate a character array (new char[]) and return it as a pointer. The - calling code pust call delete[] on the return char* to avoid a memory leak. - */ - //char* PrintToMemory() const; - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - - virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Walk the XML tree visiting this node and all of its children. - */ - virtual bool Accept( TiXmlVisitor* content ) const; - -protected : - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; - bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class GD_API TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /** Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* ToNode() const { return node; } - /** Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /** Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /** Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - - /** @deprecated use ToNode. - Return the handle as a TiXmlNode. This may return null. - */ - TiXmlNode* Node() const { return ToNode(); } - /** @deprecated use ToElement. - Return the handle as a TiXmlElement. This may return null. - */ - TiXmlElement* Element() const { return ToElement(); } - /** @deprecated use ToText() - Return the handle as a TiXmlText. This may return null. - */ - TiXmlText* Text() const { return ToText(); } - /** @deprecated use ToUnknown() - Return the handle as a TiXmlUnknown. This may return null. - */ - TiXmlUnknown* Unknown() const { return ToUnknown(); } - -private: - TiXmlNode* node; -}; - - -/** Print to memory functionality. The TiXmlPrinter is useful when you need to: - - -# Print to memory (especially in non-STL mode) - -# Control formatting (line endings, etc.) - - When constructed, the TiXmlPrinter is in its default "pretty printing" mode. - Before calling Accept() you can call methods to control the printing - of the XML document. After TiXmlNode::Accept() is called, the printed document can - be accessed via the CStr(), Str(), and Size() methods. - - TiXmlPrinter uses the Visitor API. - @verbatim - TiXmlPrinter printer; - printer.SetIndent( "\t" ); - - doc.Accept( &printer ); - fprintf( stdout, "%s", printer.CStr() ); - @endverbatim -*/ -class GD_API TiXmlPrinter : public TiXmlVisitor -{ -public: - TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), - buffer(), indent( " " ), lineBreak( "\n" ) {} - - virtual bool VisitEnter( const TiXmlDocument& doc ); - virtual bool VisitExit( const TiXmlDocument& doc ); - - virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); - virtual bool VisitExit( const TiXmlElement& element ); - - virtual bool Visit( const TiXmlDeclaration& declaration ); - virtual bool Visit( const TiXmlText& text ); - virtual bool Visit( const TiXmlComment& comment ); - virtual bool Visit( const TiXmlUnknown& unknown ); - - /** Set the indent characters for printing. By default 4 spaces - but tab (\t) is also useful, or null/empty string for no indentation. - */ - void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } - /// Query the indention string. - const char* Indent() { return indent.c_str(); } - /** Set the line breaking string. By default set to newline (\n). - Some operating systems prefer other characters, or can be - set to the null/empty string for no indenation. - */ - void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } - /// Query the current line breaking string. - const char* LineBreak() { return lineBreak.c_str(); } - - /** Switch over to "stream printing" which is the most dense formatting without - linebreaks. Common when the XML is needed for network transmission. - */ - void SetStreamPrinting() { indent = ""; - lineBreak = ""; - } - /// Return the result. - const char* CStr() { return buffer.c_str(); } - /// Return the length of the result string. - size_t Size() { return buffer.size(); } - - #ifdef TIXML_USE_STL - /// Return the result. - const std::string& Str() { return buffer; } - #endif - -private: - void DoIndent() { - for( int i=0; i -#include - -#include "GDCpp/Runtime/TinyXml/tinyxml.h" - -//#define DEBUG_PARSER -#if defined( DEBUG_PARSER ) -# if defined( DEBUG ) && defined( _MSC_VER ) -# include -# define TIXML_LOG OutputDebugString -# else -# define TIXML_LOG printf -# endif -#endif - -// Note tha "PutString" hardcodes the same list. This -// is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = -{ - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } -}; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// Including the basic of this table, which determines the #bytes in the -// sequence from the lead byte. 1 placed for invalid sequences -- -// although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: -// ef bb bf (Microsoft "lead bytes") -// ef bf be -// ef bf bf - -const unsigned char TIXML_UTF_LEAD_0 = 0xefU; -const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; -const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - -const int TiXmlBase::utf8ByteTable[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid -}; - - -void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { *length = 0; return; } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } -} - - -/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalpha( anyByte ); -// } -} - - -/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalnum( anyByte ); -// } -} - - -class TiXmlParsingData -{ - friend class TiXmlDocument; - public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() { return cursor; } - - private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; -}; - - -void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) -{ - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Treat p as unsigned, so we have a happy compiler. - const unsigned char* pU = (const unsigned char*)p; - - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*pU) { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case TIXML_UTF_LEAD_0: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) - p += 3; - else - { p +=3; ++col; } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); -} - - -const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) -{ - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - const unsigned char* pU = (const unsigned char*)p; - - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==TIXML_UTF_LEAD_1 - && *(pU+2)==TIXML_UTF_LEAD_2 ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbeU ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbfU ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; -} - -#ifdef TIXML_USE_STL -/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) -{ - for( ;; ) - { - if ( !in->good() ) return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get(); - } -} - -/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) -{ - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get(); - *tag += (char) c; - } - return false; -} -#endif - -// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The -// "assign" optimization removes over 10% of the execution time. -// -const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) -{ - // Oddly, not supported on some comilers, - //name->clear(); - // So use this: - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - const char* start = p; - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - //(*name) += *p; // expensive - ++p; - } - if ( p-start > 0 ) { - name->assign( start, p-start ); - } - return p; - } - return 0; -} - -const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) -{ - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - ptrdiff_t delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; iappend( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - if ( p ) - p += strlen( endTag ); - return p; -} - -#ifdef TIXML_USE_STL - -void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get(); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); -} - -#endif - -const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) -{ - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - const unsigned char* pU = (const unsigned char*)p; - if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 - && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 - && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) - { - encoding = TIXML_ENCODING_UTF8; - useMicrosoftBOM = true; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } - - p = SkipWhiteSpace( p, encoding ); - } - - // Was this empty? - if ( !firstChild ) { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); - return 0; - } - - // All is well. - return p; -} - -void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } -} - - -TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) -{ - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: "; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - - // [ 1475201 ] TinyXML parses entities in comments - // Oops - ReadText doesn't work, because we don't want to parse the entities. - // p = ReadText( p, &value, false, endTag, false, encoding ); - // - // from the XML spec: - /* - [Definition: Comments may appear anywhere in a document outside other markup; in addition, - they may appear within the document type declaration at places allowed by the grammar. - They are not part of the document's character data; an XML processor MAY, but need not, - make it possible for an application to retrieve the text of comments. For compatibility, - the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity - references MUST NOT be recognized within comments. - - An example of a comment: - - - */ - - value = ""; - // Keep all the white space. - while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) - { - value.append( p, 1 ); - ++p; - } - if ( p ) - p += strlen( endTag ); - - return p; -} - - -const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) return 0; - -// int tabsize = 4; -// if ( document ) -// tabsize = document->TabSize(); - - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - const char SINGLE_QUOTE = '\''; - const char DOUBLE_QUOTE = '\"'; - - if ( *p == SINGLE_QUOTE ) - { - ++p; - end = "\'"; // single quote in string - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == DOUBLE_QUOTE ) - { - ++p; - end = "\""; // double quote in string - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { - // [ 1451649 ] Attribute values with trailing quotes not handled correctly - // We did not have an opening quote but seem to have a - // closing one. Give up and throw an error. - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - value += *p; - ++p; - } - } - return p; -} - -#ifdef TIXML_USE_STL -void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->peek(); - if ( !cdata && (c == '<' ) ) - { - return; - } - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get(); // "commits" the peek made above - - if ( cdata && c == '>' && tag->size() >= 3 ) { - size_t len = tag->size(); - if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { - // terminator of cdata. - return; - } - } - } -} -#endif - -const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - value = ""; - TiXmlDocument* document = GetDocument(); - - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - - const char* const startTag = ""; - - if ( cdata || StringEqual( p, startTag, false, encoding ) ) - { - cdata = true; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - - // Keep all the white space, ignore the encoding, etc. - while ( p && *p - && !StringEqual( p, endTag, false, encoding ) - ) - { - value += *p; - ++p; - } - - TIXML_STRING dummy; - p = ReadText( p, &dummy, false, endTag, false, encoding ); - return p; - } - else - { - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; - } -} - -#ifdef TIXML_USE_STL -void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->get(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } -} -#endif - -const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) -{ - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; -} - -bool TiXmlText::Blank() const -{ - for ( unsigned i=0; i - * @author Antoon Bosselaers - * @author Paulo Barreto - * - * This code is hereby placed in the public domain. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "AES.h" -#include - -#define MAXKC (256 / 32) -#define MAXKB (256 / 8) -#define MAXNR 14 - -/* This controls loop-unrolling in aes_core.c */ -#undef FULL_UNROLL -#define GETU32(pt) \ - (((uint32_t)(pt)[0] << 24) ^ ((uint32_t)(pt)[1] << 16) ^ \ - ((uint32_t)(pt)[2] << 8) ^ ((uint32_t)(pt)[3])) - -#define PUTU32(ct, st) \ - { \ - (ct)[0] = (uint8_t)((st) >> 24); \ - (ct)[1] = (uint8_t)((st) >> 16); \ - (ct)[2] = (uint8_t)((st) >> 8); \ - (ct)[3] = (uint8_t)(st); \ - } - -/* - Te0[x] = S [x].[02, 01, 01, 03]; - Te1[x] = S [x].[03, 02, 01, 01]; - Te2[x] = S [x].[01, 03, 02, 01]; - Te3[x] = S [x].[01, 01, 03, 02]; - Te4[x] = S [x].[01, 01, 01, 01]; - - Td0[x] = Si[x].[0e, 09, 0d, 0b]; - Td1[x] = Si[x].[0b, 0e, 09, 0d]; - Td2[x] = Si[x].[0d, 0b, 0e, 09]; - Td3[x] = Si[x].[09, 0d, 0b, 0e]; - Td4[x] = Si[x].[01, 01, 01, 01]; -*/ - -static const uint32_t Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU, - 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U, - 0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, - 0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU, - 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U, - 0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, - 0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U, - 0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U, - 0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU, - 0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU, - 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U, - 0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, - 0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U, - 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U, - 0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, - 0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU, - 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U, - 0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, - 0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U, - 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U, - 0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, - 0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U, - 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU, - 0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, - 0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU, - 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU, - 0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U, - 0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U, - 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU, - 0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, - 0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU, - 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U, - 0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U, - 0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U, - 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U, - 0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, - 0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU, - 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U, - 0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, - 0x2c16163aU, -}; - -static const uint32_t Te1[256] = { - 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U, - 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U, - 0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, - 0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, - 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU, - 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U, - 0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, - 0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, - 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U, - 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U, - 0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U, - 0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, - 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U, - 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU, - 0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, - 0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, - 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U, - 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU, - 0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, - 0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, - 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U, - 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU, - 0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, - 0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, - 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U, - 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU, - 0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, - 0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, - 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U, - 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU, - 0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, - 0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, - 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U, - 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U, - 0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, - 0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, - 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU, - 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU, - 0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, - 0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, - 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU, - 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU, - 0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U, - 0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, - 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U, - 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U, - 0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, - 0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, - 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU, - 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U, - 0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, - 0x3a2c1616U, -}; - -static const uint32_t Te2[256] = { - 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U, - 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U, - 0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, - 0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, - 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU, - 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U, - 0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, - 0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, - 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U, - 0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U, - 0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U, - 0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, - 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U, - 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU, - 0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, - 0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, - 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U, - 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU, - 0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, - 0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, - 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U, - 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU, - 0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, - 0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, - 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U, - 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU, - 0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, - 0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, - 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U, - 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU, - 0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, - 0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, - 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U, - 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U, - 0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U, - 0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, - 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU, - 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU, - 0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, - 0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, - 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU, - 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU, - 0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U, - 0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, - 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U, - 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U, - 0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, - 0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, - 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU, - 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U, - 0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, - 0x163a2c16U, -}; - -static const uint32_t Te3[256] = { - 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU, - 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U, - 0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, - 0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, - 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U, - 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U, - 0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, - 0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, - 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U, - 0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U, - 0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU, - 0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, - 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U, - 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU, - 0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, - 0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, - 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U, - 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU, - 0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, - 0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, - 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU, - 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U, - 0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, - 0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, - 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U, - 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U, - 0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, - 0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, - 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U, - 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U, - 0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, - 0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, - 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U, - 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU, - 0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U, - 0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, - 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U, - 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U, - 0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU, - 0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, - 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U, - 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU, - 0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U, - 0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, - 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U, - 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U, - 0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, - 0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, - 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U, - 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U, - 0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, - 0x16163a2cU, -}; - -static const uint32_t Te4[256] = { - 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, 0xf2f2f2f2U, - 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, 0x30303030U, 0x01010101U, - 0x67676767U, 0x2b2b2b2bU, 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, - 0x76767676U, 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, - 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, 0xadadadadU, - 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, 0x9c9c9c9cU, 0xa4a4a4a4U, - 0x72727272U, 0xc0c0c0c0U, 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, - 0x26262626U, 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, - 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, 0x71717171U, - 0xd8d8d8d8U, 0x31313131U, 0x15151515U, 0x04040404U, 0xc7c7c7c7U, - 0x23232323U, 0xc3c3c3c3U, 0x18181818U, 0x96969696U, 0x05050505U, - 0x9a9a9a9aU, 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, - 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, 0x09090909U, - 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, 0x1b1b1b1bU, 0x6e6e6e6eU, - 0x5a5a5a5aU, 0xa0a0a0a0U, 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, - 0xb3b3b3b3U, 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, - 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, 0x20202020U, - 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, 0x6a6a6a6aU, 0xcbcbcbcbU, - 0xbebebebeU, 0x39393939U, 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, - 0xcfcfcfcfU, 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, - 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, 0x45454545U, - 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, 0x50505050U, 0x3c3c3c3cU, - 0x9f9f9f9fU, 0xa8a8a8a8U, 0x51515151U, 0xa3a3a3a3U, 0x40404040U, - 0x8f8f8f8fU, 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, - 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, 0x10101010U, - 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, 0xcdcdcdcdU, 0x0c0c0c0cU, - 0x13131313U, 0xececececU, 0x5f5f5f5fU, 0x97979797U, 0x44444444U, - 0x17171717U, 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, - 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, 0x60606060U, - 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, 0x22222222U, 0x2a2a2a2aU, - 0x90909090U, 0x88888888U, 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, - 0x14141414U, 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, - 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, 0x49494949U, - 0x06060606U, 0x24242424U, 0x5c5c5c5cU, 0xc2c2c2c2U, 0xd3d3d3d3U, - 0xacacacacU, 0x62626262U, 0x91919191U, 0x95959595U, 0xe4e4e4e4U, - 0x79797979U, 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, - 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, 0x6c6c6c6cU, - 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, 0x65656565U, 0x7a7a7a7aU, - 0xaeaeaeaeU, 0x08080808U, 0xbabababaU, 0x78787878U, 0x25252525U, - 0x2e2e2e2eU, 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, - 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, 0x4b4b4b4bU, - 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, 0x70707070U, 0x3e3e3e3eU, - 0xb5b5b5b5U, 0x66666666U, 0x48484848U, 0x03030303U, 0xf6f6f6f6U, - 0x0e0e0e0eU, 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, - 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, 0xe1e1e1e1U, - 0xf8f8f8f8U, 0x98989898U, 0x11111111U, 0x69696969U, 0xd9d9d9d9U, - 0x8e8e8e8eU, 0x94949494U, 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, - 0xe9e9e9e9U, 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, - 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, 0xbfbfbfbfU, - 0xe6e6e6e6U, 0x42424242U, 0x68686868U, 0x41414141U, 0x99999999U, - 0x2d2d2d2dU, 0x0f0f0f0fU, 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, - 0x16161616U, -}; - -static const uint32_t Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 0x3bab6bcbU, - 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 0x2030fa55U, 0xad766df6U, - 0x88cc7691U, 0xf5024c25U, 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, - 0xb562a38fU, 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 0x038f5fe7U, - 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 0xd4be832dU, 0x587421d3U, - 0x49e06929U, 0x8ec9c844U, 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, - 0x27b971ddU, 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 0xb16477e0U, - 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 0x70486858U, 0x8f45fd19U, - 0x94de6c87U, 0x527bf8b7U, 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, - 0x6655ab2aU, 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 0x8acf1c2bU, - 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 0x65daf4cdU, 0x0605bed5U, - 0xd134621fU, 0xc4a6fe8aU, 0x342e539dU, 0xa2f355a0U, 0x058ae132U, - 0xa4f6eb75U, 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 0x91548db5U, - 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 0x1998fb24U, 0xd6bde997U, - 0x894043ccU, 0x67d99e77U, 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, - 0x79c8eedbU, 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 0xfd0efffbU, - 0x0f853856U, 0x3daed51eU, 0x362d3927U, 0x0a0fd964U, 0x685ca621U, - 0x9b5b54d1U, 0x24362e3aU, 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, - 0x1b9b919eU, 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 0x0e090d0bU, - 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 0x57f11985U, 0xaf75074cU, - 0xee99ddbbU, 0xa37f60fdU, 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, - 0x5bfb7e34U, 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 0x854a247dU, - 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 0x1d9e2f4bU, 0xdcb230f3U, - 0x0d8652ecU, 0x77c1e3d0U, 0x2bb3166cU, 0xa970b999U, 0x119448faU, - 0x47e96422U, 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 0xa6f581cfU, - 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 0x2c3a9de4U, 0x5078920dU, - 0x6a5fcc9bU, 0x547e4662U, 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, - 0x82c3aff5U, 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 0xcd267809U, - 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 0xe6956e65U, 0xaaffe67eU, - 0x21bccf08U, 0xef15e8e6U, 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, - 0x29b07cd6U, 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 0xf104984aU, - 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 0x764dd68dU, 0x43efb04dU, - 0xccaa4d54U, 0xe49604dfU, 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, - 0x4665517fU, 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 0x9ad7618cU, - 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 0xcea927eeU, 0xb761c935U, - 0xe11ce5edU, 0x7a47b13cU, 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, - 0x73c737bfU, 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 0x161dc372U, - 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 0x39a80171U, 0x080cb3deU, - 0xd8b4e49cU, 0x6456c190U, 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, - 0xd0b85742U, -}; - -static const uint32_t Td1[256] = { - 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 0xcb3bab6bU, - 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 0x552030faU, 0xf6ad766dU, - 0x9188cc76U, 0x25f5024cU, 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, - 0x8fb562a3U, 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, - 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 0xe7038f5fU, - 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 0x2dd4be83U, 0xd3587421U, - 0x2949e069U, 0x448ec9c8U, 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, - 0xdd27b971U, 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, - 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 0xe0b16477U, - 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 0x58704868U, 0x198f45fdU, - 0x8794de6cU, 0xb7527bf8U, 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, - 0x2a6655abU, 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, - 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 0x2b8acf1cU, - 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 0xcd65daf4U, 0xd50605beU, - 0x1fd13462U, 0x8ac4a6feU, 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, - 0x75a4f6ebU, 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, - 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 0xb591548dU, - 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 0x241998fbU, 0x97d6bde9U, - 0xcc894043U, 0x7767d99eU, 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, - 0xdb79c8eeU, 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, - 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 0xfbfd0effU, - 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 0x640a0fd9U, 0x21685ca6U, - 0xd19b5b54U, 0x3a24362eU, 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, - 0x9e1b9b91U, 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, - 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 0x0b0e090dU, - 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 0x8557f119U, 0x4caf7507U, - 0xbbee99ddU, 0xfda37f60U, 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, - 0x345bfb7eU, 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, - 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 0x7d854a24U, - 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 0x4b1d9e2fU, 0xf3dcb230U, - 0xec0d8652U, 0xd077c1e3U, 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, - 0x2247e964U, 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, - 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 0xcfa6f581U, - 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 0xe42c3a9dU, 0x0d507892U, - 0x9b6a5fccU, 0x62547e46U, 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, - 0xf582c3afU, 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, - 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 0x09cd2678U, - 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 0x65e6956eU, 0x7eaaffe6U, - 0x0821bccfU, 0xe6ef15e8U, 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, - 0xd629b07cU, 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, - 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 0x4af10498U, - 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 0x8d764dd6U, 0x4d43efb0U, - 0x54ccaa4dU, 0xdfe49604U, 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, - 0x7f466551U, 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, - 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 0x8c9ad761U, - 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 0xeecea927U, 0x35b761c9U, - 0xede11ce5U, 0x3c7a47b1U, 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, - 0xbf73c737U, 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, - 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 0x72161dc3U, - 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 0x7139a801U, 0xde080cb3U, - 0x9cd8b4e4U, 0x906456c1U, 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, - 0x42d0b857U, -}; - -static const uint32_t Td2[256] = { - 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 0x6bcb3babU, - 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 0xfa552030U, 0x6df6ad76U, - 0x769188ccU, 0x4c25f502U, 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, - 0xa38fb562U, 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, - 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 0x5fe7038fU, - 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 0x832dd4beU, 0x21d35874U, - 0x692949e0U, 0xc8448ec9U, 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, - 0x71dd27b9U, 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, - 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 0x77e0b164U, - 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 0x68587048U, 0xfd198f45U, - 0x6c8794deU, 0xf8b7527bU, 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, - 0xab2a6655U, 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, - 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 0x1c2b8acfU, - 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 0xf4cd65daU, 0xbed50605U, - 0x621fd134U, 0xfe8ac4a6U, 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, - 0xeb75a4f6U, 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, - 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 0x8db59154U, - 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 0xfb241998U, 0xe997d6bdU, - 0x43cc8940U, 0x9e7767d9U, 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, - 0xeedb79c8U, 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, - 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 0xfffbfd0eU, - 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 0xd9640a0fU, 0xa621685cU, - 0x54d19b5bU, 0x2e3a2436U, 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, - 0x919e1b9bU, 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, - 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 0x0d0b0e09U, - 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 0x198557f1U, 0x074caf75U, - 0xddbbee99U, 0x60fda37fU, 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, - 0x7e345bfbU, 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, - 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 0x247d854aU, - 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 0x2f4b1d9eU, 0x30f3dcb2U, - 0x52ec0d86U, 0xe3d077c1U, 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, - 0x642247e9U, 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, - 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 0x81cfa6f5U, - 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 0x9de42c3aU, 0x920d5078U, - 0xcc9b6a5fU, 0x4662547eU, 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, - 0xaff582c3U, 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, - 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 0x7809cd26U, - 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 0x6e65e695U, 0xe67eaaffU, - 0xcf0821bcU, 0xe8e6ef15U, 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, - 0x7cd629b0U, 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, - 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 0x984af104U, - 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 0xd68d764dU, 0xb04d43efU, - 0x4d54ccaaU, 0x04dfe496U, 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, - 0x517f4665U, 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, - 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 0x618c9ad7U, - 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 0x27eecea9U, 0xc935b761U, - 0xe5ede11cU, 0xb13c7a47U, 0xdf599cd2U, 0x733f55f2U, 0xce791814U, - 0x37bf73c7U, 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, - 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 0xc372161dU, - 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 0x017139a8U, 0xb3de080cU, - 0xe49cd8b4U, 0xc1906456U, 0x84617bcbU, 0xb670d532U, 0x5c74486cU, - 0x5742d0b8U, -}; - -static const uint32_t Td3[256] = { - 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 0xab6bcb3bU, - 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 0x30fa5520U, 0x766df6adU, - 0xcc769188U, 0x024c25f5U, 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, - 0x62a38fb5U, 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, - 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 0x8f5fe703U, - 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 0xbe832dd4U, 0x7421d358U, - 0xe0692949U, 0xc9c8448eU, 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, - 0xb971dd27U, 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, - 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 0x6477e0b1U, - 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 0x48685870U, 0x45fd198fU, - 0xde6c8794U, 0x7bf8b752U, 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, - 0x55ab2a66U, 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, - 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 0xcf1c2b8aU, - 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 0xdaf4cd65U, 0x05bed506U, - 0x34621fd1U, 0xa6fe8ac4U, 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, - 0xf6eb75a4U, 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, - 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 0x548db591U, - 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 0x98fb2419U, 0xbde997d6U, - 0x4043cc89U, 0xd99e7767U, 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, - 0xc8eedb79U, 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, - 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 0x0efffbfdU, - 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 0x0fd9640aU, 0x5ca62168U, - 0x5b54d19bU, 0x362e3a24U, 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, - 0x9b919e1bU, 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, - 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 0x090d0b0eU, - 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 0xf1198557U, 0x75074cafU, - 0x99ddbbeeU, 0x7f60fda3U, 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, - 0xfb7e345bU, 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, - 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 0x4a247d85U, - 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 0x9e2f4b1dU, 0xb230f3dcU, - 0x8652ec0dU, 0xc1e3d077U, 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, - 0xe9642247U, 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, - 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 0xf581cfa6U, - 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 0x3a9de42cU, 0x78920d50U, - 0x5fcc9b6aU, 0x7e466254U, 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, - 0xc3aff582U, 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, - 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 0x267809cdU, - 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 0x956e65e6U, 0xffe67eaaU, - 0xbccf0821U, 0x15e8e6efU, 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, - 0xb07cd629U, 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, - 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 0x04984af1U, - 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 0x4dd68d76U, 0xefb04d43U, - 0xaa4d54ccU, 0x9604dfe4U, 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, - 0x65517f46U, 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, - 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 0xd7618c9aU, - 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 0xa927eeceU, 0x61c935b7U, - 0x1ce5ede1U, 0x47b13c7aU, 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, - 0xc737bf73U, 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, - 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 0x1dc37216U, - 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 0xa8017139U, 0x0cb3de08U, - 0xb4e49cd8U, 0x56c19064U, 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, - 0xb85742d0U, -}; - -static const uint32_t Td4[256] = { - 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, 0x30303030U, - 0x36363636U, 0xa5a5a5a5U, 0x38383838U, 0xbfbfbfbfU, 0x40404040U, - 0xa3a3a3a3U, 0x9e9e9e9eU, 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, - 0xfbfbfbfbU, 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, - 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, 0x34343434U, - 0x8e8e8e8eU, 0x43434343U, 0x44444444U, 0xc4c4c4c4U, 0xdedededeU, - 0xe9e9e9e9U, 0xcbcbcbcbU, 0x54545454U, 0x7b7b7b7bU, 0x94949494U, - 0x32323232U, 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, - 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, 0x42424242U, - 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, 0x08080808U, 0x2e2e2e2eU, - 0xa1a1a1a1U, 0x66666666U, 0x28282828U, 0xd9d9d9d9U, 0x24242424U, - 0xb2b2b2b2U, 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, - 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, 0x72727272U, - 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, 0x86868686U, 0x68686868U, - 0x98989898U, 0x16161616U, 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, - 0xccccccccU, 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, - 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, 0xfdfdfdfdU, - 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, 0x5e5e5e5eU, 0x15151515U, - 0x46464646U, 0x57575757U, 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, - 0x84848484U, 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, - 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, 0xf7f7f7f7U, - 0xe4e4e4e4U, 0x58585858U, 0x05050505U, 0xb8b8b8b8U, 0xb3b3b3b3U, - 0x45454545U, 0x06060606U, 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, - 0x8f8f8f8fU, 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, - 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, 0x01010101U, - 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, 0x3a3a3a3aU, 0x91919191U, - 0x11111111U, 0x41414141U, 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, - 0xeaeaeaeaU, 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, - 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, 0x96969696U, - 0xacacacacU, 0x74747474U, 0x22222222U, 0xe7e7e7e7U, 0xadadadadU, - 0x35353535U, 0x85858585U, 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, - 0xe8e8e8e8U, 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, - 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, 0x1d1d1d1dU, - 0x29292929U, 0xc5c5c5c5U, 0x89898989U, 0x6f6f6f6fU, 0xb7b7b7b7U, - 0x62626262U, 0x0e0e0e0eU, 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, - 0x1b1b1b1bU, 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, - 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, 0x9a9a9a9aU, - 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, 0x78787878U, 0xcdcdcdcdU, - 0x5a5a5a5aU, 0xf4f4f4f4U, 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, - 0x33333333U, 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, - 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, 0x27272727U, - 0x80808080U, 0xececececU, 0x5f5f5f5fU, 0x60606060U, 0x51515151U, - 0x7f7f7f7fU, 0xa9a9a9a9U, 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, - 0x0d0d0d0dU, 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, - 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, 0xa0a0a0a0U, - 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, 0xaeaeaeaeU, 0x2a2a2a2aU, - 0xf5f5f5f5U, 0xb0b0b0b0U, 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, - 0x3c3c3c3cU, 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, - 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, 0xbabababaU, - 0x77777777U, 0xd6d6d6d6U, 0x26262626U, 0xe1e1e1e1U, 0x69696969U, - 0x14141414U, 0x63636363U, 0x55555555U, 0x21212121U, 0x0c0c0c0cU, - 0x7d7d7d7dU, -}; - -static const uint32_t rcon[] = { - /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ - 0x01000000, - 0x02000000, - 0x04000000, - 0x08000000, - 0x10000000, - 0x20000000, - 0x40000000, - 0x80000000, - 0x1B000000, - 0x36000000, -}; - -int GD_API aes_setks_encrypt(const uint8_t *keybuf, int kbits, aes_ks_t *ks) { - uint32_t *rk; - int i = 0; - uint32_t temp; - - if (!keybuf || !ks) return -1; - if (kbits != 128 && kbits != 192 && kbits != 256) return -2; - - rk = ks->rd_key; - - if (kbits == 128) - ks->rounds = 10; - else if (kbits == 192) - ks->rounds = 12; - else - ks->rounds = 14; - - rk[0] = GETU32(keybuf); - rk[1] = GETU32(keybuf + 4); - rk[2] = GETU32(keybuf + 8); - rk[3] = GETU32(keybuf + 12); - if (kbits == 128) { - while (1) { - temp = rk[3]; - rk[4] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp)&0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - if (++i == 10) { - return 0; - } - rk += 4; - } - } - rk[4] = GETU32(keybuf + 16); - rk[5] = GETU32(keybuf + 20); - if (kbits == 192) { - while (1) { - temp = rk[5]; - rk[6] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp)&0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; - rk[7] = rk[1] ^ rk[6]; - rk[8] = rk[2] ^ rk[7]; - rk[9] = rk[3] ^ rk[8]; - if (++i == 8) { - return 0; - } - rk[10] = rk[4] ^ rk[9]; - rk[11] = rk[5] ^ rk[10]; - rk += 6; - } - } - rk[6] = GETU32(keybuf + 24); - rk[7] = GETU32(keybuf + 28); - if (kbits == 256) { - while (1) { - temp = rk[7]; - rk[8] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ - (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ - (Te4[(temp)&0xff] & 0x0000ff00) ^ - (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i]; - rk[9] = rk[1] ^ rk[8]; - rk[10] = rk[2] ^ rk[9]; - rk[11] = rk[3] ^ rk[10]; - if (++i == 7) { - return 0; - } - temp = rk[11]; - rk[12] = rk[4] ^ (Te4[(temp >> 24)] & 0xff000000) ^ - (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ - (Te4[(temp)&0xff] & 0x000000ff); - rk[13] = rk[5] ^ rk[12]; - rk[14] = rk[6] ^ rk[13]; - rk[15] = rk[7] ^ rk[14]; - - rk += 8; - } - } - return 0; -} - -int GD_API aes_setks_decrypt(const uint8_t *keybuf, int kbits, aes_ks_t *ks) { - uint32_t *rk; - int i, j, status; - uint32_t temp; - - /* first, start with an encryption schedule */ - status = aes_setks_encrypt(keybuf, kbits, ks); - if (status < 0) return status; - - rk = ks->rd_key; - - /* invert the order of the round keys: */ - for (i = 0, j = 4 * (ks->rounds); i < j; i += 4, j -= 4) { - temp = rk[i]; - rk[i] = rk[j]; - rk[j] = temp; - temp = rk[i + 1]; - rk[i + 1] = rk[j + 1]; - rk[j + 1] = temp; - temp = rk[i + 2]; - rk[i + 2] = rk[j + 2]; - rk[j + 2] = temp; - temp = rk[i + 3]; - rk[i + 3] = rk[j + 3]; - rk[j + 3] = temp; - } - /* apply the inverse MixColumn transform to all round keys but the first and - * the last: */ - for (i = 1; i < (ks->rounds); i++) { - rk += 4; - rk[0] = - Td0[Te4[(rk[0] >> 24)] & 0xff] ^ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[0]) & 0xff] & 0xff]; - rk[1] = - Td0[Te4[(rk[1] >> 24)] & 0xff] ^ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[1]) & 0xff] & 0xff]; - rk[2] = - Td0[Te4[(rk[2] >> 24)] & 0xff] ^ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[2]) & 0xff] & 0xff]; - rk[3] = - Td0[Te4[(rk[3] >> 24)] & 0xff] ^ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ - Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ Td3[Te4[(rk[3]) & 0xff] & 0xff]; - } - return 0; -} - -void GD_API aes_ecb_encrypt(const uint8_t *in, - uint8_t *out, - const aes_ks_t *ks) { - const uint32_t *rk; - uint32_t s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - rk = ks->rd_key; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(in) ^ rk[0]; - s1 = GETU32(in + 4) ^ rk[1]; - s2 = GETU32(in + 8) ^ rk[2]; - s3 = GETU32(in + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[4]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[5]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[6]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[7]; - /* round 2: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[8]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[9]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[10]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[12]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[13]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[14]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[16]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[17]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[18]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[20]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[21]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[22]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[24]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[25]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[26]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[28]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[29]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[30]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[32]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[33]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[34]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[36]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[37]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[38]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[39]; - if (ks->rounds > 10) { - /* round 10: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[40]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[41]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[42]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[44]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[45]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[46]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[47]; - if (ks->rounds > 12) { - /* round 12: */ - s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[t3 & 0xff] ^ rk[48]; - s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[t0 & 0xff] ^ rk[49]; - s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[t1 & 0xff] ^ rk[50]; - s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[t2 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[s3 & 0xff] ^ rk[52]; - t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[s0 & 0xff] ^ rk[53]; - t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[s1 & 0xff] ^ rk[54]; - t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[s2 & 0xff] ^ rk[55]; - } - } - rk += ks->rounds << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = ks->rounds >> 1; - for (;;) { - t0 = Te0[(s0 >> 24)] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ - Te3[(s3)&0xff] ^ rk[4]; - t1 = Te0[(s1 >> 24)] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ - Te3[(s0)&0xff] ^ rk[5]; - t2 = Te0[(s2 >> 24)] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ - Te3[(s1)&0xff] ^ rk[6]; - t3 = Te0[(s3 >> 24)] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ - Te3[(s2)&0xff] ^ rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = Te0[(t0 >> 24)] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ - Te3[(t3)&0xff] ^ rk[0]; - s1 = Te0[(t1 >> 24)] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ - Te3[(t0)&0xff] ^ rk[1]; - s2 = Te0[(t2 >> 24)] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ - Te3[(t1)&0xff] ^ rk[2]; - s3 = Te0[(t3 >> 24)] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ - Te3[(t2)&0xff] ^ rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = (Te4[(t0 >> 24)] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3)&0xff] & 0x000000ff) ^ - rk[0]; - PUTU32(out, s0); - s1 = (Te4[(t1 >> 24)] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0)&0xff] & 0x000000ff) ^ - rk[1]; - PUTU32(out + 4, s1); - s2 = (Te4[(t2 >> 24)] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1)&0xff] & 0x000000ff) ^ - rk[2]; - PUTU32(out + 8, s2); - s3 = (Te4[(t3 >> 24)] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2)&0xff] & 0x000000ff) ^ - rk[3]; - PUTU32(out + 12, s3); -} - -void GD_API aes_ecb_decrypt(const uint8_t *in, - uint8_t *out, - const aes_ks_t *ks) { - const uint32_t *rk; - uint32_t s0, s1, s2, s3, t0, t1, t2, t3; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - rk = ks->rd_key; - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(in) ^ rk[0]; - s1 = GETU32(in + 4) ^ rk[1]; - s2 = GETU32(in + 8) ^ rk[2]; - s3 = GETU32(in + 12) ^ rk[3]; -#ifdef FULL_UNROLL - /* round 1: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[4]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[5]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[6]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[7]; - /* round 2: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[8]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[9]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[10]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[11]; - /* round 3: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[12]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[13]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[14]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[15]; - /* round 4: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[16]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[17]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[18]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[19]; - /* round 5: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[20]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[21]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[22]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[23]; - /* round 6: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[24]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[25]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[26]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[27]; - /* round 7: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[28]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[29]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[30]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[31]; - /* round 8: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[32]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[33]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[34]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[35]; - /* round 9: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[36]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[37]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[38]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[39]; - if (ks->rounds > 10) { - /* round 10: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[40]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[41]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[42]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[43]; - /* round 11: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[44]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[45]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[46]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[47]; - if (ks->rounds > 12) { - /* round 12: */ - s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[t1 & 0xff] ^ rk[48]; - s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[t2 & 0xff] ^ rk[49]; - s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[t3 & 0xff] ^ rk[50]; - s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[t0 & 0xff] ^ rk[51]; - /* round 13: */ - t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[s1 & 0xff] ^ rk[52]; - t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[s2 & 0xff] ^ rk[53]; - t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[s3 & 0xff] ^ rk[54]; - t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[s0 & 0xff] ^ rk[55]; - } - } - rk += ks->rounds << 2; -#else /* !FULL_UNROLL */ - /* - * Nr - 1 full rounds: - */ - r = ks->rounds >> 1; - for (;;) { - t0 = Td0[(s0 >> 24)] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ - Td3[(s1)&0xff] ^ rk[4]; - t1 = Td0[(s1 >> 24)] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ - Td3[(s2)&0xff] ^ rk[5]; - t2 = Td0[(s2 >> 24)] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ - Td3[(s3)&0xff] ^ rk[6]; - t3 = Td0[(s3 >> 24)] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ - Td3[(s0)&0xff] ^ rk[7]; - - rk += 8; - if (--r == 0) { - break; - } - - s0 = Td0[(t0 >> 24)] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ - Td3[(t1)&0xff] ^ rk[0]; - s1 = Td0[(t1 >> 24)] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ - Td3[(t2)&0xff] ^ rk[1]; - s2 = Td0[(t2 >> 24)] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ - Td3[(t3)&0xff] ^ rk[2]; - s3 = Td0[(t3 >> 24)] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ - Td3[(t0)&0xff] ^ rk[3]; - } -#endif /* ?FULL_UNROLL */ - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = (Td4[(t0 >> 24)] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1)&0xff] & 0x000000ff) ^ - rk[0]; - PUTU32(out, s0); - s1 = (Td4[(t1 >> 24)] & 0xff000000) ^ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t2)&0xff] & 0x000000ff) ^ - rk[1]; - PUTU32(out + 4, s1); - s2 = (Td4[(t2 >> 24)] & 0xff000000) ^ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t3)&0xff] & 0x000000ff) ^ - rk[2]; - PUTU32(out + 8, s2); - s3 = (Td4[(t3 >> 24)] & 0xff000000) ^ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ - (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t0)&0xff] & 0x000000ff) ^ - rk[3]; - PUTU32(out + 12, s3); -} - -#define AES_BLOCK_OP64(dst, src, op) \ - do { \ - uint64_t *_dst = (uint64_t *)(dst); \ - uint64_t *_src = (uint64_t *)(src); \ - *_dst++ op *_src++; \ - *_dst op *_src; \ - } while (0) - -#define AES_BLOCK_OP32(dst, src, op) \ - do { \ - uint32_t *_dst = (uint32_t *)(dst); \ - uint32_t *_src = (uint32_t *)(src); \ - *_dst++ op *_src++; \ - *_dst++ op *_src++; \ - *_dst++ op *_src++; \ - *_dst op *_src; \ - } while (0) - -#if __WORDSIZE == 64 -#define AES_BLOCK_OP(dst, src, op) AES_BLOCK_OP64(dst, src, op) -#else -#define AES_BLOCK_OP(dst, src, op) AES_BLOCK_OP32(dst, src, op) -#endif - -void GD_API aes_cbc_encrypt(const uint8_t *in, - uint8_t *out, - uint8_t *iv, - size_t blks, - const aes_ks_t *ks) { - const uint8_t *vec = iv; - - while (blks--) { - AES_BLOCK_OP(out, in, =); - AES_BLOCK_OP(out, vec, ^=); - aes_ecb_encrypt(out, out, ks); - vec = out; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - - memcpy(iv, vec, AES_BLOCK_SIZE); -} - -void GD_API aes_cbc_decrypt(const uint8_t *in, - uint8_t *out, - uint8_t *iv, - size_t blks, - const aes_ks_t *ks) { - const uint8_t *vec = iv; - - while (blks--) { - AES_BLOCK_OP(out, in, =); - aes_ecb_decrypt(out, out, ks); - AES_BLOCK_OP(out, vec, ^=); - vec = in; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - - memcpy(iv, vec, AES_BLOCK_SIZE); -} \ No newline at end of file diff --git a/GDCpp/GDCpp/Runtime/Tools/AES.h b/GDCpp/GDCpp/Runtime/Tools/AES.h deleted file mode 100644 index c244a81e6..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/AES.h +++ /dev/null @@ -1,103 +0,0 @@ -/* The MIT License - - Copyright (C) 2011, 2012 Zilong Tan (eric.zltan@gmail.com) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -/* - * aes.h - * - * @version 3.0 (December 2000) - * - * Optimised ANSI C code for the Rijndael cipher (now AES) - * - * @author Vincent Rijmen - * @author Antoon Bosselaers - * @author Paulo Barreto - * - * This code is hereby placed in the public domain. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _ULIB_CRYPT_AES_H -#define _ULIB_CRYPT_AES_H - -#include -#include - -#define AES_MAXNR 14 -#define AES_BLOCK_SIZE 16 - -typedef struct { - uint32_t rd_key[4 * (AES_MAXNR + 1)]; - int rounds; -} aes_ks_t; - -#ifdef __cplusplus -extern "C" { -#endif - -/* AES key schedule functions. Inputs user key buffer and generates - * key schedule for encryption/decryption. Valid kbits are 128, 192, - * and 256. */ -int GD_API aes_setks_encrypt(const uint8_t *keybuf, int kbits, aes_ks_t *ks); -int GD_API aes_setks_decrypt(const uint8_t *keybuf, int kbits, aes_ks_t *ks); - -/* Core AES functions. - * in and out are input and output buffers, which can be the same - * (except for the aes_cbc_decrypt). - * Use aes_setks_* to generate ks. - */ -void GD_API aes_ecb_encrypt(const uint8_t *in, - uint8_t *out, - const aes_ks_t *ks); -void GD_API aes_ecb_decrypt(const uint8_t *in, - uint8_t *out, - const aes_ks_t *ks); -void GD_API aes_cbc_encrypt(const uint8_t *in, - uint8_t *out, - uint8_t *iv, - size_t blks, - const aes_ks_t *ks); -/* in and out can NOT be the same */ -void GD_API aes_cbc_decrypt(const uint8_t *in, - uint8_t *out, - uint8_t *iv, - size_t blks, - const aes_ks_t *ks); - -#ifdef __cplusplus -} -#endif - -#endif /* _ULIB_CRYPT_AES_H */ \ No newline at end of file diff --git a/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.cpp b/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.cpp deleted file mode 100644 index d2433caa6..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/DynamicLibrariesTools.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.h b/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.h deleted file mode 100644 index f925d3c20..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/DynamicLibrariesTools.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "GDCore/Tools/DynamicLibrariesTools.h" diff --git a/GDCpp/GDCpp/Runtime/Tools/FileStream.cpp b/GDCpp/GDCpp/Runtime/Tools/FileStream.cpp deleted file mode 100644 index bc3a05fce..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/FileStream.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/FileStream.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Tools/FileStream.h b/GDCpp/GDCpp/Runtime/Tools/FileStream.h deleted file mode 100644 index 88ecc8fab..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/FileStream.h +++ /dev/null @@ -1 +0,0 @@ -#include "GDCore/Tools/FileStream.h" diff --git a/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.cpp b/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.cpp deleted file mode 100644 index 3509eb53b..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/OpenGLTools.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.h b/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.h deleted file mode 100644 index 8e21c661c..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/OpenGLTools.h +++ /dev/null @@ -1 +0,0 @@ -#include "GDCore/Tools/OpenGLTools.h" diff --git a/GDCpp/GDCpp/Runtime/Tools/XmlLoader.cpp b/GDCpp/GDCpp/Runtime/Tools/XmlLoader.cpp deleted file mode 100644 index 9f192db4b..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/XmlLoader.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/XmlLoader.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Tools/XmlLoader.h b/GDCpp/GDCpp/Runtime/Tools/XmlLoader.h deleted file mode 100644 index 0e58269f1..000000000 --- a/GDCpp/GDCpp/Runtime/Tools/XmlLoader.h +++ /dev/null @@ -1 +0,0 @@ -#include "GDCore/Tools/XmlLoader.h" diff --git a/GDCpp/GDCpp/Runtime/Utf8/utf8proc.c b/GDCpp/GDCpp/Runtime/Utf8/utf8proc.c deleted file mode 100644 index db3fd8bb1..000000000 --- a/GDCpp/GDCpp/Runtime/Utf8/utf8proc.c +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2015 Victor Levasseur (victorlevasseur52@gmail.com). - * This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Utf8/utf8proc.c" -#endif diff --git a/GDCpp/GDCpp/Runtime/Utf8/utf8proc.h b/GDCpp/GDCpp/Runtime/Utf8/utf8proc.h deleted file mode 100644 index d92332728..000000000 --- a/GDCpp/GDCpp/Runtime/Utf8/utf8proc.h +++ /dev/null @@ -1 +0,0 @@ -#include "GDCore/Utf8/utf8proc.h" diff --git a/GDCpp/GDCpp/Runtime/Utf8/utf8proc_data.inl b/GDCpp/GDCpp/Runtime/Utf8/utf8proc_data.inl deleted file mode 100644 index bdb8a1578..000000000 --- a/GDCpp/GDCpp/Runtime/Utf8/utf8proc_data.inl +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2015 Victor Levasseur (victorlevasseur52@gmail.com). - * This project is released under the MIT License. - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Utf8/utf8proc_data.inl" -#endif diff --git a/GDCpp/GDCpp/Runtime/Version.cpp b/GDCpp/GDCpp/Runtime/Version.cpp deleted file mode 100644 index 6966d4130..000000000 --- a/GDCpp/GDCpp/Runtime/Version.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/** \file - * GDevelop - * 2008-2016 Florian Rival (Florian.Rival@gmail.com) - */ - -#if !defined(GD_IDE_ONLY) -#include "GDCore/Tools/VersionWrapper.cpp" -#endif diff --git a/GDCpp/GDCpp/Runtime/Version.h b/GDCpp/GDCpp/Runtime/Version.h deleted file mode 100644 index 09fb43702..000000000 --- a/GDCpp/GDCpp/Runtime/Version.h +++ /dev/null @@ -1,6 +0,0 @@ -/** \file - * GDevelop - * 2008-2016 Florian Rival (Florian.Rival@gmail.com) - */ - -#include "GDCore/Tools/VersionWrapper.h" diff --git a/GDCpp/GDCpp/Runtime/XmlFilesHelper.cpp b/GDCpp/GDCpp/Runtime/XmlFilesHelper.cpp deleted file mode 100644 index 309c23156..000000000 --- a/GDCpp/GDCpp/Runtime/XmlFilesHelper.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#include "XmlFilesHelper.h" - -std::map > XmlFilesManager::openedFiles; diff --git a/GDCpp/GDCpp/Runtime/XmlFilesHelper.h b/GDCpp/GDCpp/Runtime/XmlFilesHelper.h deleted file mode 100644 index 9e0f62401..000000000 --- a/GDCpp/GDCpp/Runtime/XmlFilesHelper.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights - * reserved. This project is released under the MIT License. - */ - -#ifndef XMLFILESHELPER_H -#define XMLFILESHELPER_H - -#include -#include -#include -#include "GDCpp/Runtime/String.h" -#include "GDCpp/Runtime/TinyXml/tinyxml.h" -#include "GDCpp/Runtime/Tools/XmlLoader.h" - -/** - * \brief Helper class wrapping a tinyxml document in RAII fashion - * - * \ingroup FileExtension - */ -class XmlFile { - public: - /** - * Open file - */ - XmlFile(gd::String filename) : doc(), filename(filename), modified(false) { - gd::LoadXmlFromFile(doc, filename); - }; - - /** - * Save file is the document was marked as modified. - */ - ~XmlFile() { - if (modified) gd::SaveXmlToFile(doc, filename); - } - - /** - * Set the file to be saved when the object is destroyed. - */ - void MarkAsModified() { modified = true; } - - /** - * Access to the tinyxml representation of the file - */ - TiXmlDocument& GetTinyXmlDocument() { return doc; }; - - /** - * Access to the tinyxml representation of the file - */ - const TiXmlDocument& GetTinyXmlDocument() const { return doc; }; - - private: - TiXmlDocument doc; - gd::String filename; - bool modified; -}; - -/** - * \brief Helper class for opening XML files. - * - * \ingroup FileExtension - */ -class XmlFilesManager { - static std::map > openedFiles; - - public: - /** - * Load a file and keep it in memory - */ - static void LoadFile(gd::String filename) { - if (openedFiles.find(filename) == openedFiles.end()) - openedFiles[filename] = std::make_shared(filename); - } - - /** - * Unload a file kept in memory - */ - static void UnloadFile(gd::String filename) { - if (openedFiles.find(filename) != openedFiles.end()) - openedFiles.erase(filename); - } - - /** - * Get access to a file. If the file has not been loaded with LoadFile, - * it will be loaded now, and unload as soon as it is not used anymore. - */ - static std::shared_ptr GetFile(gd::String filename, - bool isGoingToModifyFile = true) { - std::shared_ptr file = - openedFiles.find(filename) != openedFiles.end() - ? openedFiles[filename] - : std::make_shared(filename); - if (isGoingToModifyFile) file->MarkAsModified(); - - return file; - } - - static std::map > GetOpenedFilesList() { - return openedFiles; - } -}; - -#endif // XMLFILESHELPER_H diff --git a/GDCpp/GDCpp/Runtime/btAlignedAllocator.h b/GDCpp/GDCpp/Runtime/btAlignedAllocator.h deleted file mode 100644 index 563d20015..000000000 --- a/GDCpp/GDCpp/Runtime/btAlignedAllocator.h +++ /dev/null @@ -1,118 +0,0 @@ -#if defined(GD_IDE_ONLY) || defined(DEBUG) || defined(DEV) -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use -of this software. Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim -that you wrote the original software. If you use this software in a product, an -acknowledgment in the product documentation would be appreciated but is not -required. -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef BT_ALIGNED_ALLOCATOR -#define BT_ALIGNED_ALLOCATOR - -/// we probably replace this with our own aligned memory allocator -/// so we replace _aligned_malloc and _aligned_free with our own -/// that is better portable and more predictable - -#include "GDCpp/Runtime/btScalar.h" -//#define BT_DEBUG_MEMORY_ALLOCATIONS 1 -#ifdef BT_DEBUG_MEMORY_ALLOCATIONS - -#define btAlignedAlloc(a, b) btAlignedAllocInternal(a, b, __LINE__, __FILE__) - -#define btAlignedFree(ptr) btAlignedFreeInternal(ptr, __LINE__, __FILE__) - -void* btAlignedAllocInternal(size_t size, - int alignment, - int line, - char* filename); - -void btAlignedFreeInternal(void* ptr, int line, char* filename); - -#else -void* btAlignedAllocInternal(size_t size, int alignment); -void btAlignedFreeInternal(void* ptr); - -#define btAlignedAlloc(size, alignment) btAlignedAllocInternal(size, alignment) -#define btAlignedFree(ptr) btAlignedFreeInternal(ptr) - -#endif -typedef int size_type; - -typedef void*(btAlignedAllocFunc)(size_t size, int alignment); -typedef void(btAlignedFreeFunc)(void* memblock); -typedef void*(btAllocFunc)(size_t size); -typedef void(btFreeFunc)(void* memblock); - -/// The developer can let all Bullet memory allocations go through a custom -/// memory allocator, using btAlignedAllocSetCustom -void btAlignedAllocSetCustom(btAllocFunc* allocFunc, btFreeFunc* freeFunc); -/// If the developer has already an custom aligned allocator, then -/// btAlignedAllocSetCustomAligned can be used. The default aligned allocator -/// pre-allocates extra memory using the non-aligned allocator, and instruments -/// it. -void btAlignedAllocSetCustomAligned(btAlignedAllocFunc* allocFunc, - btAlignedFreeFunc* freeFunc); - -/// The btAlignedAllocator is a portable class for aligned memory allocations. -/// Default implementations for unaligned and aligned allocations can be -/// overridden by a custom allocator using btAlignedAllocSetCustom and -/// btAlignedAllocSetCustomAligned. -template -class btAlignedAllocator { - typedef btAlignedAllocator self_type; - - public: - // just going down a list: - btAlignedAllocator() {} - /* - btAlignedAllocator( const self_type & ) {} - */ - - template - btAlignedAllocator(const btAlignedAllocator&) {} - - typedef const T* const_pointer; - typedef const T& const_reference; - typedef T* pointer; - typedef T& reference; - typedef T value_type; - - pointer address(reference ref) const { return &ref; } - const_pointer address(const_reference ref) const { return &ref; } - pointer allocate(size_type n, const_pointer* hint = 0) { - (void)hint; - return reinterpret_cast( - btAlignedAlloc(sizeof(value_type) * n, Alignment)); - } - void construct(pointer ptr, const value_type& value) { - new (ptr) value_type(value); - } - void deallocate(pointer ptr) { btAlignedFree(reinterpret_cast(ptr)); } - void destroy(pointer ptr) { ptr->~value_type(); } - - template - struct rebind { - typedef btAlignedAllocator other; - }; - template - self_type& operator=(const btAlignedAllocator&) { - return *this; - } - - friend bool operator==(const self_type&, const self_type&) { return true; } -}; -#endif // BT_ALIGNED_ALLOCATOR - -#endif diff --git a/GDCpp/GDCpp/Runtime/btScalar.h b/GDCpp/GDCpp/Runtime/btScalar.h deleted file mode 100644 index f88e7c42b..000000000 --- a/GDCpp/GDCpp/Runtime/btScalar.h +++ /dev/null @@ -1,454 +0,0 @@ -#if defined(GD_IDE_ONLY) || defined(DEBUG) || defined(DEV) -/* -Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans -http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use -of this software. Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim -that you wrote the original software. If you use this software in a product, an -acknowledgment in the product documentation would be appreciated but is not -required. -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SIMD___SCALAR_H -#define SIMD___SCALAR_H - -#include - -#include //size_t for MSVC 6.0 - -#include -#include -#include - -#define BT_BULLET_VERSION 274 - -inline int btGetVersion() { return BT_BULLET_VERSION; } - -#if defined(DEBUG) || defined(_DEBUG) -#define BT_DEBUG -#endif - -#ifdef WIN32 - -#if defined(__MINGW32__) || defined(__CYGWIN__) || \ - (defined(_MSC_VER) && _MSC_VER < 1300) - -#define SIMD_FORCE_INLINE inline -#define ATTRIBUTE_ALIGNED16(a) a -#define ATTRIBUTE_ALIGNED128(a) a -#else -//#define BT_HAS_ALIGNED_ALLOCATOR -#pragma warning(disable : 4324) // disable padding warning -// #pragma warning(disable:4530) // Disable the exception -// disable but used in MSCV Stl warning. #pragma -// warning(disable:4996) //Turn off warnings about deprecated C routines -// #pragma warning(disable:4786) // Disable the "debug name too long" warning - -#define SIMD_FORCE_INLINE __forceinline -#define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a -#define ATTRIBUTE_ALIGNED128(a) __declspec(align(128)) a -#ifdef _XBOX -#define BT_USE_VMX128 - -#include -#define BT_HAVE_NATIVE_FSEL -#define btFsel(a, b, c) __fsel((a), (b), (c)) -#else - -#if (defined(WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && \ - (!defined(BT_USE_DOUBLE_PRECISION)) -#define BT_USE_SSE -#include -#endif - -#endif //_XBOX - -#endif //__MINGW32__ - -#include -#ifdef BT_DEBUG -#define btAssert assert -#else -#define btAssert(x) -#endif -// btFullAssert is optional, slows down a lot -#define btFullAssert(x) - -#define btLikely(_c) _c -#define btUnlikely(_c) _c - -#else - -#if defined(__CELLOS_LV2__) -#define SIMD_FORCE_INLINE inline -#define ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#ifndef assert -#include -#endif -#ifdef BT_DEBUG -#define btAssert assert -#else -#define btAssert(x) -#endif -// btFullAssert is optional, slows down a lot -#define btFullAssert(x) - -#define btLikely(_c) _c -#define btUnlikely(_c) _c - -#else - -#ifdef USE_LIBSPE2 - -#define SIMD_FORCE_INLINE __inline -#define ATTRIBUTE_ALIGNED16(a) a __attribute__((aligned(16))) -#define ATTRIBUTE_ALIGNED128(a) a __attribute__((aligned(128))) -#ifndef assert -#include -#endif -#ifdef BT_DEBUG -#define btAssert assert -#else -#define btAssert(x) -#endif -// btFullAssert is optional, slows down a lot -#define btFullAssert(x) - -#define btLikely(_c) __builtin_expect((_c), 1) -#define btUnlikely(_c) __builtin_expect((_c), 0) - -#else -// non-windows systems - -#define SIMD_FORCE_INLINE inline -///@todo: check out alignment methods for other platforms/compilers -///#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16))) -///#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128))) -#define ATTRIBUTE_ALIGNED16(a) a -#define ATTRIBUTE_ALIGNED128(a) a -#ifndef assert -#include -#endif - -#if defined(DEBUG) || defined(_DEBUG) -#define btAssert assert -#else -#define btAssert(x) -#endif - -// btFullAssert is optional, slows down a lot -#define btFullAssert(x) -#define btLikely(_c) _c -#define btUnlikely(_c) _c - -#endif // LIBSPE2 - -#endif //__CELLOS_LV2__ -#endif - -/// older compilers (gcc 3.x) and Sun needs double version of sqrt etc. -/// exclude Apple Intel (i's assumed to be a Macbook or new Intel Dual Core -/// Processor) -#if defined(__sun) || defined(__sun__) || defined(__sparc) || \ - (defined(__APPLE__) && !defined(__i386__)) -// use slow double float precision operation on those platforms -#ifndef BT_USE_DOUBLE_PRECISION -#define BT_FORCE_DOUBLE_FUNCTIONS -#endif -#endif - -/// The btScalar type abstracts floating point numbers, to easily switch between -/// double and single floating point precision. -#if defined(BT_USE_DOUBLE_PRECISION) -typedef double btScalar; -// this number could be bigger in double precision -#define BT_LARGE_FLOAT 1e30 -#else -typedef float btScalar; -// keep BT_LARGE_FLOAT*BT_LARGE_FLOAT < FLT_MAX -#define BT_LARGE_FLOAT 1e18f -#endif - -#define BT_DECLARE_ALIGNED_ALLOCATOR() \ - SIMD_FORCE_INLINE void *operator new(size_t sizeInBytes) { \ - return btAlignedAlloc(sizeInBytes, 16); \ - } \ - SIMD_FORCE_INLINE void operator delete(void *ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void *operator new(size_t, void *ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete(void *, void *) {} \ - SIMD_FORCE_INLINE void *operator new[](size_t sizeInBytes) { \ - return btAlignedAlloc(sizeInBytes, 16); \ - } \ - SIMD_FORCE_INLINE void operator delete[](void *ptr) { btAlignedFree(ptr); } \ - SIMD_FORCE_INLINE void *operator new[](size_t, void *ptr) { return ptr; } \ - SIMD_FORCE_INLINE void operator delete[](void *, void *) {} - -#if defined(BT_USE_DOUBLE_PRECISION) || defined(BT_FORCE_DOUBLE_FUNCTIONS) - -SIMD_FORCE_INLINE btScalar btSqrt(btScalar x) { return sqrt(x); } -SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabs(x); } -SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cos(x); } -SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sin(x); } -SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tan(x); } -SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { return acos(x); } -SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { return asin(x); } -SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atan(x); } -SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { - return atan2(x, y); -} -SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return exp(x); } -SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return log(x); } -SIMD_FORCE_INLINE btScalar btPow(btScalar x, btScalar y) { return pow(x, y); } - -#else - -SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) { -#ifdef USE_APPROXIMATION - double x, z, tempf; - unsigned long *tfptr = ((unsigned long *)&tempf) + 1; - - tempf = y; - *tfptr = (0xbfcdd90a - *tfptr) >> 1; /* estimate of 1/sqrt(y) */ - x = tempf; - z = y * btScalar(0.5); /* hoist out the “/2” */ - x = (btScalar(1.5) * x) - (x * x) * (x * z); /* iteration formula */ - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - x = (btScalar(1.5) * x) - (x * x) * (x * z); - return x * y; -#else - return sqrtf(y); -#endif -} -SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabsf(x); } -SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cosf(x); } -SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sinf(x); } -SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tanf(x); } -SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { - btAssert(x <= btScalar(1.)); - return acosf(x); -} -SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { return asinf(x); } -SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atanf(x); } -SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { - return atan2f(x, y); -} -SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return expf(x); } -SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return logf(x); } -SIMD_FORCE_INLINE btScalar btPow(btScalar x, btScalar y) { return powf(x, y); } - -#endif - -#define SIMD_2_PI btScalar(6.283185307179586232) -#define SIMD_PI (SIMD_2_PI * btScalar(0.5)) -#define SIMD_HALF_PI (SIMD_2_PI * btScalar(0.25)) -#define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0)) -#define SIMD_DEGS_PER_RAD (btScalar(360.0) / SIMD_2_PI) - -#ifdef BT_USE_DOUBLE_PRECISION -#define SIMD_EPSILON DBL_EPSILON -#define SIMD_INFINITY DBL_MAX -#else -#define SIMD_EPSILON FLT_EPSILON -#define SIMD_INFINITY FLT_MAX -#endif - -SIMD_FORCE_INLINE btScalar btAtan2Fast(btScalar y, btScalar x) { - btScalar coeff_1 = SIMD_PI / 4.0f; - btScalar coeff_2 = 3.0f * coeff_1; - btScalar abs_y = btFabs(y); - btScalar angle; - if (x >= 0.0f) { - btScalar r = (x - abs_y) / (x + abs_y); - angle = coeff_1 - coeff_1 * r; - } else { - btScalar r = (x + abs_y) / (abs_y - x); - angle = coeff_2 - coeff_1 * r; - } - return (y < 0.0f) ? -angle : angle; -} - -SIMD_FORCE_INLINE bool btFuzzyZero(btScalar x) { - return btFabs(x) < SIMD_EPSILON; -} - -SIMD_FORCE_INLINE bool btEqual(btScalar a, btScalar eps) { - return (((a) <= eps) && !((a) < -eps)); -} -SIMD_FORCE_INLINE bool btGreaterEqual(btScalar a, btScalar eps) { - return (!((a) <= eps)); -} - -SIMD_FORCE_INLINE int btIsNegative(btScalar x) { - return x < btScalar(0.0) ? 1 : 0; -} - -SIMD_FORCE_INLINE btScalar btRadians(btScalar x) { - return x * SIMD_RADS_PER_DEG; -} -SIMD_FORCE_INLINE btScalar btDegrees(btScalar x) { - return x * SIMD_DEGS_PER_RAD; -} - -#define BT_DECLARE_HANDLE(name) \ - typedef struct name##__ { \ - int unused; \ - } * name - -#ifndef btFsel -SIMD_FORCE_INLINE btScalar btFsel(btScalar a, btScalar b, btScalar c) { - return a >= 0 ? b : c; -} -#endif -#define btFsels(a, b, c) (btScalar) btFsel(a, b, c) - -SIMD_FORCE_INLINE bool btMachineIsLittleEndian() { - long int i = 1; - const char *p = (const char *)&i; - if (p[0] == 1) // Lowest address contains the least significant byte - return true; - else - return false; -} - -/// btSelect avoids branches, which makes performance much better for consoles -/// like Playstation 3 and XBox 360 Thanks Phil Knight. See also -/// http://www.cellperformance.com/articles/2006/04/more_techniques_for_eliminatin_1.html -SIMD_FORCE_INLINE unsigned btSelect(unsigned condition, - unsigned valueIfConditionNonZero, - unsigned valueIfConditionZero) { - // Set testNz to 0xFFFFFFFF if condition is nonzero, 0x00000000 if condition - // is zero Rely on positive value or'ed with its negative having sign bit on - // and zero value or'ed with its negative (which is still zero) having sign - // bit off Use arithmetic shift right, shifting the sign bit through all 32 - // bits - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return ((valueIfConditionNonZero & testNz) | - (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE int btSelect(unsigned condition, - int valueIfConditionNonZero, - int valueIfConditionZero) { - unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31); - unsigned testEqz = ~testNz; - return static_cast((valueIfConditionNonZero & testNz) | - (valueIfConditionZero & testEqz)); -} -SIMD_FORCE_INLINE float btSelect(unsigned condition, - float valueIfConditionNonZero, - float valueIfConditionZero) { -#ifdef BT_HAVE_NATIVE_FSEL - return (float)btFsel((btScalar)condition - btScalar(1.0f), - valueIfConditionNonZero, - valueIfConditionZero); -#else - return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero; -#endif -} - -template -SIMD_FORCE_INLINE void btSwap(T &a, T &b) { - T tmp = a; - a = b; - b = tmp; -} - -// PCK: endian swapping functions -SIMD_FORCE_INLINE unsigned btSwapEndian(unsigned val) { - return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | - ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(unsigned short val) { - return static_cast(((val & 0xff00) >> 8) | - ((val & 0x00ff) << 8)); -} - -SIMD_FORCE_INLINE unsigned btSwapEndian(int val) { - return btSwapEndian((unsigned)val); -} - -SIMD_FORCE_INLINE unsigned short btSwapEndian(short val) { - return btSwapEndian((unsigned short)val); -} - -/// btSwapFloat uses using char pointers to swap the endianness -////btSwapFloat/btSwapDouble will NOT return a float, because the machine might -///'correct' invalid floating point values Not all values of -/// sign/exponent/mantissa are valid floating point numbers according to IEEE -/// 754. When a floating point unit is faced with an invalid value, it may -/// actually change the value, or worse, throw an exception. In most systems, -/// running user mode code, you wouldn't get an exception, but instead the -/// hardware/os/runtime will 'fix' the number for you. so instead of returning a -/// float/double, we return integer/long long integer -SIMD_FORCE_INLINE unsigned int btSwapEndianFloat(float d) { - unsigned int a = 0; - unsigned char *dst = (unsigned char *)&a; - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - return a; -} - -// unswap using char pointers -SIMD_FORCE_INLINE float btUnswapEndianFloat(unsigned int a) { - float d = 0.0f; - unsigned char *src = (unsigned char *)&a; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[3]; - dst[1] = src[2]; - dst[2] = src[1]; - dst[3] = src[0]; - - return d; -} - -// swap using char pointers -SIMD_FORCE_INLINE void btSwapEndianDouble(double d, unsigned char *dst) { - unsigned char *src = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; -} - -// unswap using char pointers -SIMD_FORCE_INLINE double btUnswapEndianDouble(const unsigned char *src) { - double d = 0.0; - unsigned char *dst = (unsigned char *)&d; - - dst[0] = src[7]; - dst[1] = src[6]; - dst[2] = src[5]; - dst[3] = src[4]; - dst[4] = src[3]; - dst[5] = src[2]; - dst[6] = src[1]; - dst[7] = src[0]; - - return d; -} - -#endif // SIMD___SCALAR_H -#endif diff --git a/GDCpp/GDCpp/Runtime/profile.cpp b/GDCpp/GDCpp/Runtime/profile.cpp deleted file mode 100644 index afde22959..000000000 --- a/GDCpp/GDCpp/Runtime/profile.cpp +++ /dev/null @@ -1,302 +0,0 @@ -#if defined(GD_IDE_ONLY) || defined(DEBUG) || defined(DEV) -/* - -**************************************************************************************************** -** -** profile.cpp -** -** Real-Time Hierarchical Profiling for Game Programming Gems 3 -** -** by Greg Hjelstrom & Byon Garrabrant -** -***************************************************************************************************/ - -// Credits: The Clock class was inspired by the Timer classes in -// Ogre (www.ogre3d.org). - -#include "GDCpp/Runtime/profile.h" - -static btClock gProfileClock; - -inline void Profile_Get_Ticks(unsigned long int* ticks) { - *ticks = gProfileClock.getTimeMicroseconds(); -} - -inline float Profile_Get_Tick_Rate(void) { - // return 1000000.f; - return 1000.f; -} -/*************************************************************************************************** -** -** CProfileNode -** -***************************************************************************************************/ - -/*********************************************************************************************** - * INPUT: * name - pointer to a static string which is the name of this profile - *node * parent - parent pointer * - * * - * WARNINGS: * The name is assumed to be a static pointer, only the pointer is - *stored and compared for * efficiency reasons. * - *=============================================================================================*/ -CProfileNode::CProfileNode(const char* name, CProfileNode* parent) - : Name(name), - TotalCalls(0), - TotalTime(0), - StartTime(0), - RecursionCounter(0), - Parent(parent), - Child(NULL), - Sibling(NULL) { - Reset(); -} - -void CProfileNode::CleanupMemory() { - delete (Child); - Child = NULL; - delete (Sibling); - Sibling = NULL; -} - -CProfileNode::~CProfileNode(void) { - delete (Child); - delete (Sibling); -} - -/*********************************************************************************************** - * INPUT: * name - static string pointer to the name of the node we are - *searching for * - * * - * WARNINGS: * All profile names are assumed to be static strings so this - *function uses pointer compares * to find the named node. * - *=============================================================================================*/ -CProfileNode* CProfileNode::Get_Sub_Node(const char* name) { - // Try to find this sub node - CProfileNode* child = Child; - while (child) { - if (child->Name == name) { - return child; - } - child = child->Sibling; - } - - // We didn't find it, so add it - - CProfileNode* node = new CProfileNode(name, this); - node->Sibling = Child; - Child = node; - return node; -} - -void CProfileNode::Reset(void) { - TotalCalls = 0; - TotalTime = 0.0f; - - if (Child) { - Child->Reset(); - } - if (Sibling) { - Sibling->Reset(); - } -} - -void CProfileNode::Call(void) { - TotalCalls++; - if (RecursionCounter++ == 0) { - Profile_Get_Ticks(&StartTime); - } -} - -bool CProfileNode::Return(void) { - if (--RecursionCounter == 0 && TotalCalls != 0) { - unsigned long int time; - Profile_Get_Ticks(&time); - time -= StartTime; - TotalTime += (float)time / Profile_Get_Tick_Rate(); - } - return (RecursionCounter == 0); -} - -/*************************************************************************************************** -** -** CProfileIterator -** -***************************************************************************************************/ -CProfileIterator::CProfileIterator(CProfileNode* start) { - CurrentParent = start; - CurrentChild = CurrentParent->Get_Child(); -} - -void CProfileIterator::First(void) { - CurrentChild = CurrentParent->Get_Child(); -} - -void CProfileIterator::Next(void) { - CurrentChild = CurrentChild->Get_Sibling(); -} - -bool CProfileIterator::Is_Done(void) { return CurrentChild == NULL; } - -void CProfileIterator::Enter_Child(int index) { - CurrentChild = CurrentParent->Get_Child(); - while ((CurrentChild != NULL) && (index != 0)) { - index--; - CurrentChild = CurrentChild->Get_Sibling(); - } - - if (CurrentChild != NULL) { - CurrentParent = CurrentChild; - CurrentChild = CurrentParent->Get_Child(); - } -} - -void CProfileIterator::Enter_Parent(void) { - if (CurrentParent->Get_Parent() != NULL) { - CurrentParent = CurrentParent->Get_Parent(); - } - CurrentChild = CurrentParent->Get_Child(); -} - -/*************************************************************************************************** -** -** CProfileManager -** -***************************************************************************************************/ - -CProfileNode CProfileManager::Root("Root", NULL); -CProfileNode* CProfileManager::CurrentNode = &CProfileManager::Root; -int CProfileManager::FrameCounter = 0; -unsigned long int CProfileManager::ResetTime = 0; - -/*********************************************************************************************** - * CProfileManager::Start_Profile -- Begin a named profile * - * * - * Steps one level deeper into the tree, if a child already exists with the - *specified name * then it accumulates the profiling; otherwise a new child - *node is added to the profile tree. * - * * - * INPUT: * name - name of this profiling record * - * * - * WARNINGS: * The string used is assumed to be a static string; pointer - *compares are used throughout * the profiling code for efficiency. * - *=============================================================================================*/ -void CProfileManager::Start_Profile(const char* name) { - if (name != CurrentNode->Get_Name()) { - CurrentNode = CurrentNode->Get_Sub_Node(name); - } - - CurrentNode->Call(); -} - -/*********************************************************************************************** - * CProfileManager::Stop_Profile -- Stop timing and record the results. * - *=============================================================================================*/ -void CProfileManager::Stop_Profile(void) { - // Return will indicate whether we should back up to our parent (we may - // be profiling a recursive function) - if (CurrentNode->Return()) { - CurrentNode = CurrentNode->Get_Parent(); - } -} - -/*********************************************************************************************** - * CProfileManager::Reset -- Reset the contents of the profiling system * - * * - * This resets everything except for the tree structure. All of the timing - *data is reset. * - *=============================================================================================*/ -void CProfileManager::Reset(void) { - gProfileClock.reset(); - Root.Reset(); - Root.Call(); - FrameCounter = 0; - Profile_Get_Ticks(&ResetTime); -} - -/*********************************************************************************************** - * CProfileManager::Increment_Frame_Counter -- Increment the frame counter * - *=============================================================================================*/ -void CProfileManager::Increment_Frame_Counter(void) { FrameCounter++; } - -/*********************************************************************************************** - * CProfileManager::Get_Time_Since_Reset -- returns the elapsed time since last - *reset * - *=============================================================================================*/ -float CProfileManager::Get_Time_Since_Reset(void) { - unsigned long int time; - Profile_Get_Ticks(&time); - time -= ResetTime; - return (float)time / Profile_Get_Tick_Rate(); -} - -#include - -void CProfileManager::dumpRecursive(CProfileIterator* profileIterator, - int spacing) { - profileIterator->First(); - if (profileIterator->Is_Done()) return; - - float accumulated_time = 0, - parent_time = profileIterator->Is_Root() - ? CProfileManager::Get_Time_Since_Reset() - : profileIterator->Get_Current_Parent_Total_Time(); - int i; - int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); - for (i = 0; i < spacing; i++) printf("."); - printf("----------------------------------\n"); - for (i = 0; i < spacing; i++) printf("."); - printf("Profiling: %s (total running time: %.3f ms) ---\n", - profileIterator->Get_Current_Parent_Name(), - parent_time); - float totalTime = 0.f; - - int numChildren = 0; - - for (i = 0; !profileIterator->Is_Done(); i++, profileIterator->Next()) { - numChildren++; - float current_total_time = profileIterator->Get_Current_Total_Time(); - accumulated_time += current_total_time; - float fraction = parent_time > SIMD_EPSILON - ? (current_total_time / parent_time) * 100 - : 0.f; - { - int i; - for (i = 0; i < spacing; i++) printf("."); - } - printf("%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)\n", - i, - profileIterator->Get_Current_Name(), - fraction, - (current_total_time / (double)frames_since_reset), - profileIterator->Get_Current_Total_Calls()); - totalTime += current_total_time; - // recurse into children - } - - if (parent_time < accumulated_time) { - printf("what's wrong\n"); - } - for (i = 0; i < spacing; i++) printf("."); - printf("%s (%.3f %%) :: %.3f ms\n", - "Unaccounted:", - parent_time > SIMD_EPSILON - ? ((parent_time - accumulated_time) / parent_time) * 100 - : 0.f, - parent_time - accumulated_time); - - for (i = 0; i < numChildren; i++) { - profileIterator->Enter_Child(i); - dumpRecursive(profileIterator, spacing + 3); - profileIterator->Enter_Parent(); - } -} -void CProfileManager::dumpAll() { - CProfileIterator* profileIterator = 0; - profileIterator = CProfileManager::Get_Iterator(); - - dumpRecursive(profileIterator, 0); - - CProfileManager::Release_Iterator(profileIterator); -} - -#endif diff --git a/GDCpp/GDCpp/Runtime/profile.h b/GDCpp/GDCpp/Runtime/profile.h deleted file mode 100644 index dcadad26e..000000000 --- a/GDCpp/GDCpp/Runtime/profile.h +++ /dev/null @@ -1,348 +0,0 @@ -#if defined(GD_IDE_ONLY) || defined(DEBUG) || defined(DEV) - -/*************************************************************************************************** -** -** Real-Time Hierarchical Profiling for Game Programming Gems 3 -** -** by Greg Hjelstrom & Byon Garrabrant -** -***************************************************************************************************/ - -// Credits: The Clock class was inspired by the Timer classes in -// Ogre (www.ogre3d.org). -#ifndef QUICK_PROF_H -#define QUICK_PROF_H - -// To disable built-in profiling, please comment out next line -//#define BT_NO_PROFILE 1 -#ifndef BT_NO_PROFILE - -#include -#include "GDCpp/Runtime/btAlignedAllocator.h" -#include "GDCpp/Runtime/btScalar.h" - -// if you don't need btClock, you can comment next line -#define USE_BT_CLOCK 1 - -#ifdef USE_BT_CLOCK -#ifdef __CELLOS_LV2__ -#include -#include -#include -#endif - -#if defined(SUNOS) || defined(__SUNOS__) -#include -#endif - -#if defined(WIN32) || defined(_WIN32) - -#define USE_WINDOWS_TIMERS -#define WIN32_LEAN_AND_MEAN -#define NOWINRES -#define NOMCX -#define NOIME -#ifdef _XBOX -#include -#else - -#include - -#if defined(GD_IDE_ONLY) - -#ifdef ___WXMSW___ -#include -#endif - -#endif - -#endif -#include - -#else -#include -#endif - -#define mymin(a, b) (a > b ? a : b) - -/// The btClock is a portable basic clock that measures accurate time in -/// seconds, use for profiling. -class btClock { - public: - btClock() { -#ifdef USE_WINDOWS_TIMERS - QueryPerformanceFrequency(&mClockFrequency); -#endif - reset(); - } - - ~btClock() {} - - /// Resets the initial reference time. - void reset() { -#ifdef USE_WINDOWS_TIMERS - QueryPerformanceCounter(&mStartTime); - mStartTick = GetTickCount(); - mPrevElapsedTime = 0; -#else -#ifdef __CELLOS_LV2__ - - typedef uint64_t ClockSize; - ClockSize newTime; - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - SYS_TIMEBASE_GET(newTime); - mStartTime = newTime; -#else - gettimeofday(&mStartTime, 0); -#endif - -#endif - } - - /// Returns the time in ms since the last call to reset or since - /// the btClock was created. - unsigned long int getTimeMilliseconds() { -#ifdef USE_WINDOWS_TIMERS - LARGE_INTEGER currentTime; - QueryPerformanceCounter(¤tTime); - LONGLONG elapsedTime = currentTime.QuadPart - mStartTime.QuadPart; - - // Compute the number of millisecond ticks elapsed. - unsigned long msecTicks = - (unsigned long)(1000 * elapsedTime / mClockFrequency.QuadPart); - - // Check for unexpected leaps in the Win32 performance counter. - // (This is caused by unexpected data across the PCI to ISA - // bridge, aka south bridge. See Microsoft KB274323.) - unsigned long elapsedTicks = GetTickCount() - mStartTick; - signed long msecOff = (signed long)(msecTicks - elapsedTicks); - if (msecOff < -100 || msecOff > 100) { - // Adjust the starting time forwards. - LONGLONG msecAdjustment = mymin(msecOff * mClockFrequency.QuadPart / 1000, - elapsedTime - mPrevElapsedTime); - mStartTime.QuadPart += msecAdjustment; - elapsedTime -= msecAdjustment; - - // Recompute the number of millisecond ticks elapsed. - msecTicks = - (unsigned long)(1000 * elapsedTime / mClockFrequency.QuadPart); - } - - // Store the current elapsed time for adjustments next time. - mPrevElapsedTime = elapsedTime; - - return msecTicks; -#else - -#ifdef __CELLOS_LV2__ - uint64_t freq = sys_time_get_timebase_frequency(); - double dFreq = ((double)freq) / 1000.0; - typedef uint64_t ClockSize; - ClockSize newTime; - SYS_TIMEBASE_GET(newTime); - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - - return (unsigned long int)((double(newTime - mStartTime)) / dFreq); -#else - - struct timeval currentTime; - gettimeofday(¤tTime, 0); - return (currentTime.tv_sec - mStartTime.tv_sec) * 1000 + - (currentTime.tv_usec - mStartTime.tv_usec) / 1000; -#endif //__CELLOS_LV2__ -#endif - } - - /// Returns the time in us since the last call to reset or since - /// the Clock was created. - unsigned long int getTimeMicroseconds() { -#ifdef USE_WINDOWS_TIMERS - LARGE_INTEGER currentTime; - QueryPerformanceCounter(¤tTime); - LONGLONG elapsedTime = currentTime.QuadPart - mStartTime.QuadPart; - - // Compute the number of millisecond ticks elapsed. - unsigned long msecTicks = - (unsigned long)(1000 * elapsedTime / mClockFrequency.QuadPart); - - // Check for unexpected leaps in the Win32 performance counter. - // (This is caused by unexpected data across the PCI to ISA - // bridge, aka south bridge. See Microsoft KB274323.) - unsigned long elapsedTicks = GetTickCount() - mStartTick; - signed long msecOff = (signed long)(msecTicks - elapsedTicks); - if (msecOff < -100 || msecOff > 100) { - // Adjust the starting time forwards. - LONGLONG msecAdjustment = mymin(msecOff * mClockFrequency.QuadPart / 1000, - elapsedTime - mPrevElapsedTime); - mStartTime.QuadPart += msecAdjustment; - elapsedTime -= msecAdjustment; - } - - // Store the current elapsed time for adjustments next time. - mPrevElapsedTime = elapsedTime; - - // Convert to microseconds. - unsigned long usecTicks = - (unsigned long)(1000000 * elapsedTime / mClockFrequency.QuadPart); - - return usecTicks; -#else - -#ifdef __CELLOS_LV2__ - uint64_t freq = sys_time_get_timebase_frequency(); - double dFreq = ((double)freq) / 1000000.0; - typedef uint64_t ClockSize; - ClockSize newTime; - //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory"); - SYS_TIMEBASE_GET(newTime); - - return (unsigned long int)((double(newTime - mStartTime)) / dFreq); -#else - - struct timeval currentTime; - gettimeofday(¤tTime, 0); - return (currentTime.tv_sec - mStartTime.tv_sec) * 1000000 + - (currentTime.tv_usec - mStartTime.tv_usec); -#endif //__CELLOS_LV2__ -#endif - } - - private: -#ifdef USE_WINDOWS_TIMERS - LARGE_INTEGER mClockFrequency; - DWORD mStartTick; - LONGLONG mPrevElapsedTime; - LARGE_INTEGER mStartTime; -#else -#ifdef __CELLOS_LV2__ - uint64_t mStartTime; -#else - struct timeval mStartTime; -#endif -#endif //__CELLOS_LV2__ -}; - -#endif // USE_BT_CLOCK - -/// A node in the Profile Hierarchy Tree -class CProfileNode { - public: - CProfileNode(const char* name, CProfileNode* parent); - ~CProfileNode(void); - - CProfileNode* Get_Sub_Node(const char* name); - - CProfileNode* Get_Parent(void) { return Parent; } - CProfileNode* Get_Sibling(void) { return Sibling; } - CProfileNode* Get_Child(void) { return Child; } - - void CleanupMemory(); - void Reset(void); - void Call(void); - bool Return(void); - - const char* Get_Name(void) { return Name; } - int Get_Total_Calls(void) { return TotalCalls; } - float Get_Total_Time(void) { return TotalTime; } - - protected: - const char* Name; - int TotalCalls; - float TotalTime; - unsigned long int StartTime; - int RecursionCounter; - - CProfileNode* Parent; - CProfileNode* Child; - CProfileNode* Sibling; -}; - -/// An iterator to navigate through the tree -class CProfileIterator { - public: - // Access all the children of the current parent - void First(void); - void Next(void); - bool Is_Done(void); - bool Is_Root(void) { return (CurrentParent->Get_Parent() == 0); } - - void Enter_Child(int index); // Make the given child the new parent - void Enter_Largest_Child(void); // Make the largest child the new parent - void Enter_Parent(void); // Make the current parent's parent the new parent - - // Access the current child - const char* Get_Current_Name(void) { return CurrentChild->Get_Name(); } - int Get_Current_Total_Calls(void) { return CurrentChild->Get_Total_Calls(); } - float Get_Current_Total_Time(void) { return CurrentChild->Get_Total_Time(); } - - // Access the current parent - const char* Get_Current_Parent_Name(void) { - return CurrentParent->Get_Name(); - } - int Get_Current_Parent_Total_Calls(void) { - return CurrentParent->Get_Total_Calls(); - } - float Get_Current_Parent_Total_Time(void) { - return CurrentParent->Get_Total_Time(); - } - - protected: - CProfileNode* CurrentParent; - CProfileNode* CurrentChild; - - CProfileIterator(CProfileNode* start); - friend class CProfileManager; -}; - -/// The Manager for the Profile system -class GD_API CProfileManager { - public: - static void Start_Profile(const char* name); - static void Stop_Profile(void); - - static void CleanupMemory(void) { Root.CleanupMemory(); } - - static void Reset(void); - static void Increment_Frame_Counter(void); - static int Get_Frame_Count_Since_Reset(void) { return FrameCounter; } - static float Get_Time_Since_Reset(void); - - static CProfileIterator* Get_Iterator(void) { - return new CProfileIterator(&Root); - } - static void Release_Iterator(CProfileIterator* iterator) { - delete (iterator); - } - - static void dumpRecursive(CProfileIterator* profileIterator, int spacing); - - static void dumpAll(); - - private: - static CProfileNode Root; - static CProfileNode* CurrentNode; - static int FrameCounter; - static unsigned long int ResetTime; -}; - -/// ProfileSampleClass is a simple way to profile a function's scope -/// Use the BT_PROFILE macro at the start of scope to time -class CProfileSample { - public: - CProfileSample(const char* name) { CProfileManager::Start_Profile(name); } - - ~CProfileSample(void) { CProfileManager::Stop_Profile(); } -}; - -#define BT_PROFILE(name) CProfileSample __profile(name) - -#else - -#define BT_PROFILE(name) - -#endif //#ifndef BT_NO_PROFILE -#endif // QUICK_PROF_H - -#undef LoadImage - -#endif diff --git a/GDCpp/README.md b/GDCpp/README.md deleted file mode 100644 index 898e0dbe7..000000000 --- a/GDCpp/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# GDevelop C++ Platform (Native game engine) - -GDevelop C++ Platform (GDcpp) is a platform for developing _native games_ with GDevelop. - -## Getting started - -First, take a look at the _Readme.md_ at the root of the repository and the [developer documentation](https://docs.gdevelop-app.com/). - -This platform uses the same files for exposing its functionalities to the IDE and for the game engine. When compiled the game engine only, a define is set (_GD_IDE_ONLY_). Look at the code using this define to check if the code will be included or not into the game engine: - - #if defined(GD_IDE_ONLY) - //Code that will be only exposed to the IDE, and not compiled for games. - #endif - //Code that will be available for compiled games as well as when compiled for the IDE. - -The documentation of this specific platform and the game engine is available [here](https://docs.gdevelop-app.com/GDCpp%20Documentation). - -## Contributing - -Any contribution is welcome! Whether you want to submit a bug report, a feature request -or any pull request so as to add a nice feature, do not hesitate to get in touch. - -## License - -GDevelop C++ Platform is distributed under the MIT license: See license.txt for -more information. diff --git a/GDCpp/Runtime/Android/AndroidManifest.xml b/GDCpp/Runtime/Android/AndroidManifest.xml deleted file mode 100644 index 986650566..000000000 --- a/GDCpp/Runtime/Android/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/GDCpp/Runtime/Android/build.xml b/GDCpp/Runtime/Android/build.xml deleted file mode 100644 index a3c089bca..000000000 --- a/GDCpp/Runtime/Android/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GDCpp/Runtime/Android/jni/Android.mk b/GDCpp/Runtime/Android/jni/Android.mk deleted file mode 100644 index a52102427..000000000 --- a/GDCpp/Runtime/Android/jni/Android.mk +++ /dev/null @@ -1,54 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := sfml-example - -LOCAL_CFLAGS := -fexceptions -frtti - -#GDCpp game engine -LOCAL_CFLAGS += -I$(LOCAL_PATH)/GDCpp -I$(LOCAL_PATH)/Core -DGD_CORE_API="" -DGD_API="" -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/Serialization/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/Utf8/*.c)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/Tools/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/TinyXml/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Runtime/Project/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Extensions/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/GDCpp/GDCpp/Extensions/Builtin/*.cpp)) - -#Game sources -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.cpp)) - -#Extensions TODO -LOCAL_CFLAGS += -I$(LOCAL_PATH)/Extensions -DGD_EXTENSION_API="" -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/TextObject/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/TiledSpriteObject/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/TileMapObject/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PlatformBehavior/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/DestroyOutsideBehavior/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/TopDownMovementBehavior/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PanelSpriteObject/*.cpp)) - -LOCAL_CFLAGS += -I$(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Triangulation/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Collision/Shapes/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Common/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Contacts/*.cpp)) -LOCAL_SRC_FILES += $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/Extensions/PhysicsBehavior/Box2D/Box2D/Box2D/Dynamics/Joints/*.cpp)) - -#SFML -LOCAL_SHARED_LIBRARIES := sfml-system -LOCAL_SHARED_LIBRARIES += sfml-window -LOCAL_SHARED_LIBRARIES += sfml-graphics -LOCAL_SHARED_LIBRARIES += sfml-audio -LOCAL_SHARED_LIBRARIES += sfml-network -LOCAL_WHOLE_STATIC_LIBRARIES := sfml-main - -include $(BUILD_SHARED_LIBRARY) - -$(call import-module,sfml) diff --git a/GDCpp/Runtime/Android/jni/Application.mk b/GDCpp/Runtime/Android/jni/Application.mk deleted file mode 100644 index 5b27ebd8b..000000000 --- a/GDCpp/Runtime/Android/jni/Application.mk +++ /dev/null @@ -1,5 +0,0 @@ -NDK_TOOLCHAIN_VERSION := 4.9 -APP_PLATFORM := android-9 -APP_STL := c++_shared -APP_ABI := armeabi armeabi-v7a x86 -APP_MODULES := sfml-activity sfml-example diff --git a/GDCpp/Runtime/Android/jni/main.cpp b/GDCpp/Runtime/Android/jni/main.cpp deleted file mode 100644 index 8212e2e62..000000000 --- a/GDCpp/Runtime/Android/jni/main.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include -#include -#include -#include - -#include "GDCpp/Runtime/Force.h" -#include "GDCpp/Runtime/Log.h" -#include "GDCpp/Runtime/Project/Layout.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/CodeExecutionEngine.h" -#include "GDCpp/Runtime/Serialization/Serializer.h" -#include "GDCpp/Runtime/SceneStack.h" -#include "GDCpp/Runtime/ResourcesLoader.h" - -using namespace gd; - -class RuntimeContext; -/* GDCPP_EVENTS_DECLARATIONS */ - -//TODO: extension -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Extensions/ExtensionBase.h" -extern "C" ExtensionBase * CreateGDCppTextObjectExtension(); -extern "C" ExtensionBase * CreateGDCppTopDownMovementBehaviorExtension(); -extern "C" ExtensionBase * CreateGDCppDestroyOutsideBehaviorExtension(); -extern "C" ExtensionBase * CreateGDCppPhysicsBehaviorExtension(); -extern "C" ExtensionBase * CreateGDCppTileMapObjectExtension(); -extern "C" ExtensionBase * CreateGDCppTiledSpriteObjectExtension(); -extern "C" ExtensionBase * CreateGDCppPlatformBehaviorExtension(); -extern "C" ExtensionBase * CreateGDCppPanelSpriteObjectExtension(); - -//TODO: move me to an android specific -#include -#include -class androidbuf : public std::streambuf { -public: - enum { bufsize = 128 }; // ... or some other suitable buffer size - androidbuf() { this->setp(buffer, buffer + bufsize - 1); } - -private: - int overflow(int c) - { - if (c == traits_type::eof()) { - *this->pptr() = traits_type::to_char_type(c); - this->sbumpc(); - } - return this->sync()? traits_type::eof(): traits_type::not_eof(c); - } - - int sync() - { - int rc = 0; - if (this->pbase() != this->pptr()) { - char writebuf[bufsize+1]; - memcpy(writebuf, this->pbase(), this->pptr() - this->pbase()); - writebuf[this->pptr() - this->pbase()] = '\0'; - - rc = __android_log_write(ANDROID_LOG_INFO, "std", writebuf) > 0; - this->setp(buffer, buffer + bufsize - 1); - } - return rc; - } - - char buffer[bufsize]; -}; - - -int main(int argc, char *argv[]) -{ - __android_log_write(ANDROID_LOG_ERROR, "GD", "Started game"); - std::cout.rdbuf(new androidbuf); - - sf::RenderWindow window(sf::VideoMode::getDesktopMode(), ""); - - //TODO: extension - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppTextObjectExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppTopDownMovementBehaviorExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppDestroyOutsideBehaviorExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppPhysicsBehaviorExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppTileMapObjectExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppTiledSpriteObjectExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppPlatformBehaviorExtension())); std::cout.flush(); - CppPlatform::Get().AddExtension(std::shared_ptr(CreateGDCppPanelSpriteObjectExtension())); std::cout.flush(); - - GDLogBanner(); - - gd::Project game; - gd::String json = gd::ResourcesLoader::Get()->LoadPlainText("gd-project.json"); - - SerializerElement rootElement = Serializer::FromJSON(json); - game.UnserializeFrom(rootElement); - - RuntimeGame runtimeGame; - runtimeGame.LoadFromProject(game); - - bool abort = false; - SceneStack sceneStack(runtimeGame, &window); - sceneStack.OnError([&abort](gd::String error) { - std::cout << error << std::endl; - abort = true; - }); - sceneStack.OnLoadScene([](RuntimeScene & scene) { - int (*function)(RuntimeContext*) = nullptr; - /* GDCPP_EVENTS_ASSIGNMENTS */ - - if (function) - { - scene->GetCodeExecutionEngine()->LoadFunction(function); - return true; - } - - return false; - }); - - sceneStack.Push(game.GetLayout(0).GetName()); - while (sceneStack.Step() && !abort) - ; - - std::cout << "Exiting game" << std::endl; -} diff --git a/GDCpp/Runtime/Android/proguard-project.txt b/GDCpp/Runtime/Android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/GDCpp/Runtime/Android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/GDCpp/Runtime/Android/res/drawable-hdpi/sfml_logo.png b/GDCpp/Runtime/Android/res/drawable-hdpi/sfml_logo.png deleted file mode 100644 index 7bae3335f..000000000 Binary files a/GDCpp/Runtime/Android/res/drawable-hdpi/sfml_logo.png and /dev/null differ diff --git a/GDCpp/Runtime/Android/res/drawable-ldpi/sfml_logo.png b/GDCpp/Runtime/Android/res/drawable-ldpi/sfml_logo.png deleted file mode 100644 index 6552c56b4..000000000 Binary files a/GDCpp/Runtime/Android/res/drawable-ldpi/sfml_logo.png and /dev/null differ diff --git a/GDCpp/Runtime/Android/res/drawable-mdpi/sfml_logo.png b/GDCpp/Runtime/Android/res/drawable-mdpi/sfml_logo.png deleted file mode 100644 index 87786889e..000000000 Binary files a/GDCpp/Runtime/Android/res/drawable-mdpi/sfml_logo.png and /dev/null differ diff --git a/GDCpp/Runtime/Android/res/drawable-xhdpi/sfml_logo.png b/GDCpp/Runtime/Android/res/drawable-xhdpi/sfml_logo.png deleted file mode 100644 index ff0d3aa06..000000000 Binary files a/GDCpp/Runtime/Android/res/drawable-xhdpi/sfml_logo.png and /dev/null differ diff --git a/GDCpp/Runtime/Android/res/drawable-xxhdpi/sfml_logo.png b/GDCpp/Runtime/Android/res/drawable-xxhdpi/sfml_logo.png deleted file mode 100644 index 8a66e84cd..000000000 Binary files a/GDCpp/Runtime/Android/res/drawable-xxhdpi/sfml_logo.png and /dev/null differ diff --git a/GDCpp/Runtime/Android/res/values/strings.xml b/GDCpp/Runtime/Android/res/values/strings.xml deleted file mode 100644 index acedde694..000000000 --- a/GDCpp/Runtime/Android/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - SFML - diff --git a/GDCpp/Runtime/CompilationChecker.cpp b/GDCpp/Runtime/CompilationChecker.cpp deleted file mode 100644 index 468428c22..000000000 --- a/GDCpp/Runtime/CompilationChecker.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "CompilationChecker.h" -#include "GDCore/Tools/VersionPriv.h" -#include "GDCore/Tools/VersionWrapper.h" -#include "GDCpp/Runtime/String.h" -#include - -using namespace std; - -bool CompilationChecker::EnsureCorrectGDVersion() -{ - gd::String versionString = gd::String::From(gd::VersionWrapper::Major()) + "." + gd::String::From(gd::VersionWrapper::Minor()) + "." + - gd::String::From(gd::VersionWrapper::Build()) + "-" + gd::String::From(gd::VersionWrapper::Revision()); - - if (versionString != gd::String(GD_VERSION_STRING).substr(0, versionString.size())) - { - char beep = 7; - std::cout << std::endl; - std::cout << "-- WARNING ! --" << beep << std::endl; - std::cout << "Compiled with a different version of GDCpp." << std::endl; - std::cout << "GDCpp DLL Version :" << versionString << std::endl; - std::cout << "Compiled with version :" << GD_VERSION_STRING << std::endl; - std::cout << "---------------" << std::endl; - - return false; - } - - if ( gd::VersionWrapper::CompiledForEdittime() ) - { - char beep = 7; - std::cout << std::endl; - std::cout << "-- ERROR ! --" << beep << std::endl; - std::cout << "GDCpp build mismatch:" << std::endl; - std::cout << "Executable is using an edittime version of GDCpp!" << std::endl; - std::cout << "---------------" << std::endl; - - return false; - } - - return true; -} diff --git a/GDCpp/Runtime/CompilationChecker.h b/GDCpp/Runtime/CompilationChecker.h deleted file mode 100644 index 10306bfea..000000000 --- a/GDCpp/Runtime/CompilationChecker.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef COMPILATIONCHECKER_H -#define COMPILATIONCHECKER_H - -/** - * Class used to ensure that the main executable is using a correct version of GDCpp.[dll/so]. - */ -class CompilationChecker -{ - public: - static bool EnsureCorrectGDVersion(); -}; - -#endif // COMPILATIONCHECKER_H diff --git a/GDCpp/Runtime/main.cpp b/GDCpp/Runtime/main.cpp deleted file mode 100644 index f0a151a25..000000000 --- a/GDCpp/Runtime/main.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - * GDevelop C++ Platform - * Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved. - * This project is released under the MIT License. - */ - -#include -#include -#include -#include -#include -#include -#if defined(__GNUC__) -#include -#endif - -#include "GDCpp/Runtime/CommonTools.h" -#include "GDCpp/Runtime/RuntimeScene.h" -#include "GDCpp/Runtime/ResourcesLoader.h" -#include "GDCpp/Runtime/FontManager.h" -#include "GDCpp/Runtime/SoundManager.h" -#include "GDCpp/Runtime/SceneNameMangler.h" -#include "GDCpp/Runtime/Project/Project.h" -#include "GDCpp/Runtime/ImageManager.h" -#include "GDCpp/Runtime/CodeExecutionEngine.h" -#include "GDCpp/Extensions/CppPlatform.h" -#include "GDCpp/Runtime/ExtensionsLoader.h" -#include "GDCpp/Runtime/Log.h" -#include "GDCpp/Runtime/SceneStack.h" -#include "GDCpp/Runtime/Tools/AES.h" -#include "GDCpp/Runtime/Serialization/Serializer.h" -#include "GDCpp/Runtime/Serialization/SerializerElement.h" -#include "GDCpp/Runtime/TinyXml/tinyxml.h" -#include "GDCpp/Runtime/RuntimeGame.h" -#include "CompilationChecker.h" - -#include -#include - -using namespace std; - -gd::String GetCurrentWorkingDirectory(); -int DisplayMessage(const gd::String & message); - -#if defined(WINDOWS) -#include -//On Windows computers, tells the Nvidia/AMD driver that GDevelop works better -//with the more powerful discrete GPU (e.g. use the Nvidia card on an Optimus computer) -extern "C" -{ - __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; - __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; -} -#endif - -int main( int argc, char *p_argv[] ) -{ - GDLogBanner(); - - //Get executable location - gd::String fullExecutablePath; - if ( *p_argv[0] != '/' ) - { - fullExecutablePath += GetCurrentWorkingDirectory(); - fullExecutablePath += "/"; - } - #ifndef WINDOWS - fullExecutablePath += p_argv[0]; - #endif - gd::String executablePath = fullExecutablePath.substr( 0, fullExecutablePath.find_last_of( "/" ) ); - gd::String executableFilename = fullExecutablePath.find_last_of( "/" ) < fullExecutablePath.length() ? fullExecutablePath.substr( fullExecutablePath.find_last_of( "/" ), fullExecutablePath.length() ) : ""; - gd::String executableNameOnly = executableFilename.substr(0, executableFilename.length()-4); - - #ifdef WINDOWS - gd::String codeFileExtension = "dll"; - #elif defined(LINUX) - gd::String codeFileExtension = "so"; - chdir( executablePath.c_str() ); //For linux, make the executable dir the current working directory - #elif defined(MACOS) - gd::String codeFileExtension = "dylib"; - #else - #error Please update this part to support your target system. - #endif - - //Check GDCpp version - CompilationChecker::EnsureCorrectGDVersion(); - - //Load extensions - gd::ExtensionsLoader::LoadAllExtensions(".", CppPlatform::Get()); - gd::ExtensionsLoader::ExtensionsLoadingDone("."); - - //Load resource file - gd::ResourcesLoader * resLoader = gd::ResourcesLoader::Get(); - if (!resLoader->SetResourceFile( executablePath+"/"+executableNameOnly+".egd" ) - && !resLoader->SetResourceFile( executableNameOnly+".egd" ) - && !resLoader->SetResourceFile( executablePath+"/gam.egd" ) - && !resLoader->SetResourceFile( "gam.egd" ) ) - { - return DisplayMessage("Unable to load resources. Aborting."); - } - - gd::Project game; - - //Load game data - { - cout << "Getting src file size..." << endl; - int fsize = resLoader->GetBinaryFileSize( "src" ); - - // round up (ignore pad for here) - int size = (fsize+15)&(~15); - - cout << "Getting src raw data..." << endl; - char * ibuffer = resLoader->LoadBinaryFile( "src" ); - char * obuffer = new char[size]; - - unsigned char key[] = "-P:j$4t&OHIUVM/Z+u4DeDP."; - const unsigned char iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; - - aes_ks_t keySetting; - aes_setks_decrypt(key, 192, &keySetting); - aes_cbc_decrypt(reinterpret_cast(ibuffer), reinterpret_cast(obuffer), - (uint8_t*)iv, size/AES_BLOCK_SIZE, &keySetting); - - std::string uncryptedSrc = std::string(obuffer, size); - delete [] obuffer; - - cout << "Loading game data..." << endl; - TiXmlDocument doc; - if ( !doc.Parse(uncryptedSrc.c_str()) ) - { - return DisplayMessage("Unable to parse game data. Aborting."); - } - - TiXmlHandle hdl(&doc); - gd::SerializerElement rootElement; - gd::Serializer::FromXML(rootElement, hdl.FirstChildElement().Element()); - game.UnserializeFrom(rootElement); - } - - if ( game.GetLayoutsCount() == 0 ) - return DisplayMessage("No scene to be loaded. Aborting."); - - //Loading the code - Handle codeLibrary = NULL; - gd::String codeLibraryName; - auto loadLibrary = [&codeLibraryName, &codeLibrary](gd::String path) { - codeLibraryName = path; - codeLibrary = gd::OpenLibrary(codeLibraryName.ToLocale().c_str()); - - return codeLibrary != NULL; - }; - - if (!loadLibrary(executablePath+"/"+executableNameOnly+"."+codeFileExtension) && - !loadLibrary(executableNameOnly+"."+codeFileExtension) && - !loadLibrary(executablePath+"/Code."+codeFileExtension) && - !loadLibrary("Code."+codeFileExtension)) - { - return DisplayMessage("Unable to load the execution engine for game. Aborting."); - } - - #if defined(WINDOWS) - //Handle special argument to change working directory - if ( argc >= 2 && gd::String(p_argv[1]).size() > 5 && gd::String(p_argv[1]).substr(0, 5) == "-cwd=" ) - { - gd::String newWorkingDir = gd::String(p_argv[1]).substr(5, gd::String::npos); - cout << "Changing working directory to " << newWorkingDir << endl; - chdir(newWorkingDir.ToLocale().c_str()); - } - #endif - - //Initialize image manager and load always loaded images - game.GetImageManager()->LoadPermanentImages(); - - //Create main window - sf::RenderWindow window; - - RuntimeGame runtimeGame; - runtimeGame.LoadFromProject(game); - - window.create(sf::VideoMode(game.GetGameResolutionWidth(), game.GetGameResolutionHeight(), 32), - "", sf::Style::Close, sf::ContextSettings(24, 8)); - window.setActive(true); - - //Game main loop - bool abort = false; - SceneStack sceneStack(runtimeGame, &window); - sceneStack.OnError([&abort](gd::String error) { - DisplayMessage(error); - abort = true; - }); - sceneStack.OnLoadScene([&codeLibraryName](RuntimeScene & scene) { - if (!codeLibraryName.empty() && - !scene.GetCodeExecutionEngine()->LoadFromDynamicLibrary(codeLibraryName, - "GDSceneEvents"+gd::SceneNameMangler::Get()->GetMangledSceneName(scene.GetName()))) - { - return false; - } - - return true; - }); - - - sceneStack.Push(game.GetLayout(0).GetName()); - while (sceneStack.Step() && !abort) - ; - - runtimeGame.GetSoundManager().ClearAllSoundsAndMusics(); - FontManager::Get()->DestroySingleton(); - - gd::CloseLibrary(codeLibrary); - - return EXIT_SUCCESS; -} - -/** - * Retrieve current working directory - */ -gd::String GetCurrentWorkingDirectory() -{ - #if defined(WINDOWS) - //getcwd on Windows do not work properly with accented characters (non ASCII) characters. - char buffer[MAX_PATH]; - GetModuleFileName( NULL, buffer, MAX_PATH ); - std::string::size_type pos = std::string( buffer ).find_last_of( "\\/" ); - return gd::String::FromLocale(std::string( buffer ).substr( 0, pos)); - #else - const auto MAX_LENGTH = 32767; - char path[MAX_LENGTH]; - getcwd(path, MAX_LENGTH); - - return path; - #endif -} - -#if defined(WINDOWS) -#include -#include -#endif -int DisplayMessage(const gd::String & message) -{ - std::cout << message; - #if defined(WINDOWS) - MessageBoxW(NULL, message.ToWide().c_str(), L"Fatal error", MB_ICONERROR); - #endif - return EXIT_FAILURE; -} diff --git a/GDCpp/docs/DoxygenLayout.xml b/GDCpp/docs/DoxygenLayout.xml deleted file mode 100644 index b26d4ba1c..000000000 --- a/GDCpp/docs/DoxygenLayout.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GDCpp/docs/DoxygenStyle.css b/GDCpp/docs/DoxygenStyle.css deleted file mode 100644 index ea0c9e4a6..000000000 --- a/GDCpp/docs/DoxygenStyle.css +++ /dev/null @@ -1,38 +0,0 @@ -body { - background-color: #E5E5E5; - color: black; - margin: 0; -} - -div.contents { - margin-bottom: 10px; - padding: 12px; - margin-left: auto; - margin-right: auto; - width: 1100px; - background-color: white; - border-radius: 8px; -} - -#projectbrief -{ - font: 90% Tahoma, Arial,sans-serif; -} - -#titlearea { - background-color: #331045; - color: white; -} - -#projectname { - font: 200% Tahoma,Arial,sans-serif; -} - -hr.footer { - display: none; -} - -.footer { - background-color: #331045; - color: white; -} \ No newline at end of file diff --git a/GDCpp/docs/doxyfile b/GDCpp/docs/doxyfile deleted file mode 100644 index 91714a75d..000000000 --- a/GDCpp/docs/doxyfile +++ /dev/null @@ -1,2366 +0,0 @@ -# Doxyfile 1.8.8 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "GDevelop C++ Platform" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "Platform for developing native games based on OpenGL and SFML with GDevelop" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. - -PROJECT_LOGO = images/glogo.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = "../../docs/GDCpp Documentation" - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = YES - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = NO - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = NO - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = YES - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. -# Note: If this tag is empty the current directory is searched. - -INPUT = "../GDCpp" - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = TiXml* - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# compiled with the --with-libclang option. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = . - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra stylesheet files is of importance (e.g. the last -# stylesheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = DoxygenStyle.css - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = images/compilerInstall1.png \ - images/compilerInstall2.png \ - images/compilerInstall3.png \ - images/createnew1.png \ - images/createnew2.png \ - images/createnew3.png \ - images/createnew4.png \ - images/createnew5.png \ - images/createnew6.png \ - images/createnew7.png \ - images/extensiondir.png \ - images/gdlogo.png \ - images/glogo.png \ - images/usecmake1.png \ - images/usecmake2.png \ - images/usecmake3.png - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 236 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 50 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 70 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = ../GDCpp.chm - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = "C:\Program Files (x86)\HTML Help Workshop\hhc.exe" - -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /